Compare commits
456 Commits
MiRCART-nw
...
master
Author | SHA1 | Date | |
---|---|---|---|
![]() |
22db646b91 | ||
![]() |
b77db5eb4b | ||
![]() |
8fabe15792 | ||
![]() |
d545a7447e | ||
![]() |
c8a048403a | ||
![]() |
0c66f94797 | ||
![]() |
90840bd0a0 | ||
![]() |
bc969295dd | ||
![]() |
e1bf3a3ad4 | ||
![]() |
1fd0768912 | ||
![]() |
19957a2006 | ||
![]() |
451a708d7a | ||
![]() |
de96a7cdaa | ||
![]() |
4b98d1cdf1 | ||
![]() |
2592fa9ad8 | ||
![]() |
fe6b79a2ab | ||
![]() |
50edb55e0b | ||
![]() |
76e57bd081 | ||
![]() |
86e2c9e904 | ||
![]() |
0750bc2261 | ||
![]() |
c45a616442 | ||
![]() |
e2183acf46 | ||
![]() |
279cca3313 | ||
![]() |
286df901a7 | ||
![]() |
50c9d69309 | ||
![]() |
fdcf242884 | ||
![]() |
b479e7ddbb | ||
![]() |
9eec4f58ab | ||
![]() |
a3d1ed3d96 | ||
![]() |
84d20a4398 | ||
![]() |
6ab7c443eb | ||
![]() |
c083800b3b | ||
![]() |
35f6910427 | ||
![]() |
c7dd80327d | ||
![]() |
a2295d1cfc | ||
![]() |
e68cae09b5 | ||
![]() |
3eb4eaeea5 | ||
![]() |
dc8b96146e | ||
![]() |
e0a9c97343 | ||
![]() |
c355e848b2 | ||
![]() |
cefb982c1d | ||
![]() |
1d650bd64b | ||
![]() |
600cecfad1 | ||
![]() |
b1de2eda79 | ||
![]() |
9c03910420 | ||
![]() |
e6e0951029 | ||
![]() |
a48d7f3d32 | ||
![]() |
bff70b409b | ||
![]() |
0843b7d330 | ||
![]() |
724b460be1 | ||
![]() |
6fcac2b3b9 | ||
![]() |
f504fa2b76 | ||
![]() |
eb3795a98e | ||
![]() |
62e7edc852 | ||
![]() |
5320e45651 | ||
![]() |
74a0ef6df8 | ||
![]() |
25c42023f2 | ||
![]() |
1a0e1bf2de | ||
![]() |
93c05d6b09 | ||
![]() |
d01cf7d167 | ||
![]() |
1c82e723c1 | ||
![]() |
3dae6dadde | ||
![]() |
187dfa6355 | ||
![]() |
deba33deba | ||
![]() |
366a958fdb | ||
![]() |
632e3a8ac1 | ||
![]() |
c93c8dd8b0 | ||
![]() |
5ad678bf4c | ||
![]() |
9752a8e6ce | ||
![]() |
99369626c4 | ||
![]() |
299a045aa9 | ||
![]() |
72b96b7c77 | ||
![]() |
70d7995b20 | ||
![]() |
3c0606a390 | ||
![]() |
aef7f629d0 | ||
![]() |
df8ee6fedf | ||
![]() |
aed3f7157c | ||
![]() |
af5363cf04 | ||
![]() |
e71f11ddad | ||
![]() |
78b567d42b | ||
![]() |
9f72bd5a4c | ||
![]() |
1487f2eb9a | ||
![]() |
d7ebed77f7 | ||
![]() |
a40017b607 | ||
![]() |
1c7524ba6f | ||
![]() |
866ef19966 | ||
![]() |
245925406e | ||
![]() |
7226639977 | ||
![]() |
e2f413e4ba | ||
![]() |
d67dd317a1 | ||
![]() |
9cc6364a08 | ||
![]() |
ddec3cefeb | ||
![]() |
25c9e88484 | ||
![]() |
0e4915351e | ||
![]() |
bdc8bcd494 | ||
![]() |
075bff0644 | ||
![]() |
c049181ceb | ||
![]() |
67f2d11240 | ||
![]() |
9e2d9d1419 | ||
![]() |
6d12c04349 | ||
![]() |
cab0478c39 | ||
![]() |
b1cc38a8e7 | ||
![]() |
5123a016e8 | ||
![]() |
243311c091 | ||
![]() |
f65fe72cea | ||
![]() |
74e2bf7f49 | ||
![]() |
2fa06043c6 | ||
![]() |
2c8fa89eda | ||
![]() |
6e470c93d0 | ||
![]() |
a4a9c9a2d5 | ||
![]() |
ec515d4ed4 | ||
![]() |
3e4644122b | ||
![]() |
31b45d1076 | ||
![]() |
6e05238efa | ||
![]() |
b6c063c5d3 | ||
![]() |
99e746f090 | ||
![]() |
6dad3c7798 | ||
![]() |
3f992ec44f | ||
![]() |
9de3372a80 | ||
![]() |
8485ab568d | ||
![]() |
7a4e1b23e9 | ||
![]() |
0f88a78639 | ||
![]() |
418d16a81a | ||
![]() |
3be34bc657 | ||
![]() |
e30628f28d | ||
![]() |
6109e9b38c | ||
![]() |
968e7d45c5 | ||
![]() |
af1ef072ab | ||
![]() |
5f7f2b0f9c | ||
![]() |
1156f8b5c3 | ||
![]() |
bb23efac56 | ||
![]() |
309e8cf089 | ||
![]() |
fb274c0d66 | ||
![]() |
f23101f511 | ||
![]() |
01ca10be21 | ||
![]() |
8fd0294ef8 | ||
![]() |
116e5915dc | ||
![]() |
c1ce141700 | ||
![]() |
5f00b60cdd | ||
![]() |
649f118b20 | ||
![]() |
b50879db5f | ||
![]() |
a4ee9e9083 | ||
![]() |
bfd8e17b2b | ||
![]() |
c2f8fb272e | ||
![]() |
0fe6899d05 | ||
![]() |
b3f587fc73 | ||
![]() |
1fe5db9fa6 | ||
![]() |
c2657eeefd | ||
![]() |
04430e7c0c | ||
![]() |
56a3b748cc | ||
![]() |
88d69cb31e | ||
![]() |
e54429e29e | ||
![]() |
52672796c6 | ||
![]() |
ff05b829b8 | ||
![]() |
629e03928e | ||
![]() |
fcd5173329 | ||
![]() |
b83684073e | ||
![]() |
f6e2dbd64b | ||
![]() |
c77813380a | ||
![]() |
6da84c05c5 | ||
![]() |
d410ef9321 | ||
![]() |
a628ed6471 | ||
![]() |
8367c166f3 | ||
![]() |
f3140d4b3d | ||
![]() |
c28c2f87ab | ||
![]() |
34d9df756b | ||
![]() |
bb4ba3ae46 | ||
![]() |
045b7a24ed | ||
![]() |
da8384f3bb | ||
![]() |
752af56774 | ||
![]() |
bd83513689 | ||
![]() |
b9f271297c | ||
![]() |
e3d23200b3 | ||
![]() |
e407ab2d81 | ||
![]() |
84126f5d4e | ||
![]() |
e03cf65028 | ||
![]() |
74da2e43c9 | ||
![]() |
f0cc23fcaa | ||
![]() |
9c528e8a6f | ||
![]() |
71fd619709 | ||
![]() |
cf2c5a7042 | ||
![]() |
08b453b33f | ||
![]() |
9420392b83 | ||
![]() |
01394e6137 | ||
![]() |
6453c1ff03 | ||
![]() |
6e371adbbe | ||
![]() |
035ab03e3c | ||
![]() |
80df97f972 | ||
![]() |
c15a5b7a21 | ||
![]() |
0d4a6432b2 | ||
![]() |
6639336a25 | ||
![]() |
2578c80819 | ||
![]() |
66fb77b9b5 | ||
![]() |
50b7e9c279 | ||
![]() |
6200254152 | ||
![]() |
ecaaf75b6b | ||
![]() |
b4e2286ecc | ||
![]() |
fd71785b3b | ||
![]() |
7d80e5331f | ||
![]() |
375324be9b | ||
![]() |
a4fa91f894 | ||
![]() |
efd8b20671 | ||
![]() |
61f7f75755 | ||
![]() |
c4e58ee096 | ||
![]() |
8f65e1723e | ||
![]() |
c53d1172a2 | ||
![]() |
1218de3bdf | ||
![]() |
3b981c3a34 | ||
![]() |
2d4d14266e | ||
![]() |
bffd7711a1 | ||
![]() |
35f3323be1 | ||
![]() |
a39c103065 | ||
![]() |
47604d6bde | ||
![]() |
8ef33b1683 | ||
![]() |
b031c994b5 | ||
![]() |
61c40b59c3 | ||
![]() |
b6e0a93029 | ||
![]() |
f35850051c | ||
![]() |
bd46fb99c5 | ||
![]() |
fad1dab3c6 | ||
![]() |
ad87bc8b2f | ||
![]() |
0ad72d7fb0 | ||
![]() |
3903f61815 | ||
![]() |
6cae432f46 | ||
![]() |
f012c628f2 | ||
![]() |
6d4db48ef0 | ||
![]() |
1d224b2bb4 | ||
![]() |
f9100dacb0 | ||
![]() |
8ec55357e6 | ||
![]() |
85cad2879a | ||
![]() |
a02ebdd039 | ||
![]() |
cc7d8b1b17 | ||
![]() |
2e682e0af1 | ||
![]() |
baacc19a67 | ||
![]() |
06fa555306 | ||
![]() |
0f2a234ec4 | ||
![]() |
301a003549 | ||
![]() |
48ce316417 | ||
![]() |
114ec3fb19 | ||
![]() |
048b3677ba | ||
![]() |
74952c6367 | ||
![]() |
18342308b2 | ||
![]() |
e1d338d6c3 | ||
![]() |
dc45d81361 | ||
![]() |
4b8c0f3469 | ||
![]() |
f273a3c6b1 | ||
![]() |
7afc5ea271 | ||
![]() |
401b7a408c | ||
![]() |
2287a8368b | ||
![]() |
0f5c8eae4a | ||
![]() |
9bacadcb70 | ||
![]() |
8bb9982b3b | ||
![]() |
d7e7519592 | ||
![]() |
233abaedef | ||
![]() |
9d4f1bf30a | ||
![]() |
07e693cc85 | ||
![]() |
eb0bbac893 | ||
![]() |
80cacedd89 | ||
![]() |
b853878b4b | ||
![]() |
9f0357605b | ||
![]() |
b51f315bb7 | ||
![]() |
5424b2ba1e | ||
![]() |
b0f140d657 | ||
![]() |
19200b8249 | ||
![]() |
d597715422 | ||
![]() |
f68fd2bcb9 | ||
![]() |
0f727db699 | ||
![]() |
1aeca12d04 | ||
![]() |
2da7965c99 | ||
![]() |
0f8b211517 | ||
![]() |
90192929f6 | ||
![]() |
948147124f | ||
![]() |
3607fd59e8 | ||
![]() |
6a347c4786 | ||
![]() |
fcea7308f2 | ||
![]() |
e5e254fb9b | ||
![]() |
5d045d4de5 | ||
![]() |
ac8fb74dc4 | ||
![]() |
fea5e2a4c9 | ||
![]() |
60cb67e7a6 | ||
![]() |
042cb2a57b | ||
![]() |
6180783d2d | ||
![]() |
8e34feff55 | ||
![]() |
4c629197a7 | ||
![]() |
3c79ca0675 | ||
![]() |
72aa916dc8 | ||
![]() |
88f8efe56c | ||
![]() |
735c016f94 | ||
![]() |
6be9cbd9b0 | ||
![]() |
b10c6fb6f7 | ||
![]() |
9fbfe7c26f | ||
![]() |
af683e4f26 | ||
![]() |
6b5fc121c8 | ||
![]() |
f7db3b30f4 | ||
![]() |
f1fd806573 | ||
![]() |
fc652958e8 | ||
![]() |
63531adce7 | ||
![]() |
44e4b02068 | ||
![]() |
21526e2421 | ||
![]() |
4a132b50df | ||
![]() |
86e849b122 | ||
![]() |
7e264f8a8b | ||
![]() |
2106b77586 | ||
![]() |
0eb96f9266 | ||
![]() |
08e5856db9 | ||
![]() |
54522ac329 | ||
![]() |
455a3fdcba | ||
![]() |
3c7560f6d7 | ||
![]() |
624ab9ca71 | ||
![]() |
05d3d28f1d | ||
![]() |
7a1ec135b2 | ||
![]() |
8b483e262e | ||
![]() |
8d6f6ef56e | ||
![]() |
9a9d5d858d | ||
![]() |
95f7dd113c | ||
![]() |
99c0c14993 | ||
![]() |
3b70d42784 | ||
![]() |
8e91d1269e | ||
![]() |
6d5e081dfb | ||
![]() |
1a503979d1 | ||
![]() |
c6ab27c08c | ||
![]() |
579dd858ba | ||
![]() |
92124dc34f | ||
![]() |
f77e6d5bf8 | ||
![]() |
b385909b45 | ||
![]() |
0cf1040614 | ||
![]() |
802de6fa6e | ||
![]() |
4f4ecb4331 | ||
![]() |
1511002798 | ||
![]() |
d79ea00164 | ||
![]() |
9eee59b501 | ||
![]() |
5380e899e4 | ||
![]() |
4e19f91eb0 | ||
![]() |
a33ff6b5df | ||
![]() |
46258cde32 | ||
![]() |
508a3cd489 | ||
![]() |
44490912b2 | ||
![]() |
2f85fa8cd1 | ||
![]() |
bb243c7556 | ||
![]() |
d1936486ff | ||
![]() |
cf04a12690 | ||
![]() |
02d3c7f6f4 | ||
![]() |
ebdf7f410b | ||
![]() |
4bc9b61f2c | ||
![]() |
f65603dd0c | ||
![]() |
d26a322612 | ||
![]() |
499296ba1d | ||
![]() |
e53e8bf8e7 | ||
![]() |
33df272b39 | ||
![]() |
8c0de9fbd3 | ||
![]() |
ad761d658e | ||
![]() |
c9d6b90e68 | ||
![]() |
49ef54ef76 | ||
![]() |
2254a0638b | ||
![]() |
402e542137 | ||
![]() |
a320c904fe | ||
![]() |
3fa377791a | ||
![]() |
e157f479ce | ||
![]() |
12027bc6b5 | ||
![]() |
f9f910160f | ||
![]() |
3e03126006 | ||
![]() |
398ee3af3d | ||
![]() |
cd5ea1fab5 | ||
![]() |
ed8ccab26f | ||
![]() |
2e014cd7ec | ||
![]() |
dbf6c76930 | ||
![]() |
363a86fe81 | ||
![]() |
dec1e4c0d4 | ||
![]() |
38e90f96ca | ||
![]() |
2a7f281d29 | ||
![]() |
f431adb381 | ||
![]() |
195ddd9af8 | ||
![]() |
9b5c9be88b | ||
![]() |
1099341b5d | ||
![]() |
e7b7e05234 | ||
![]() |
30f3688a2c | ||
![]() |
da82a543b5 | ||
![]() |
54adf3a95c | ||
![]() |
6a4356568b | ||
![]() |
39babc71a4 | ||
![]() |
84ab4eee5a | ||
![]() |
f6911293c3 | ||
![]() |
1c5f869c40 | ||
![]() |
3c28fa0071 | ||
![]() |
115991736a | ||
![]() |
0259662a4e | ||
![]() |
d93e1fecda | ||
![]() |
fcc4215b68 | ||
![]() |
968d07050e | ||
![]() |
16065401e8 | ||
![]() |
44e593714d | ||
![]() |
845185f9c3 | ||
![]() |
5350ebd881 | ||
![]() |
61d53c818c | ||
![]() |
703aa2c388 | ||
![]() |
55381cf57b | ||
![]() |
28ae8f04f8 | ||
![]() |
813d49a3f2 | ||
![]() |
c7fbe5b20c | ||
![]() |
8215229f84 | ||
![]() |
133c4dc240 | ||
![]() |
bcf52d8dc5 | ||
![]() |
31d644515a | ||
![]() |
ba99dc1280 | ||
![]() |
496e4c7a4b | ||
![]() |
8b6d7ab445 | ||
![]() |
423f923b4e | ||
![]() |
7a891d9863 | ||
![]() |
68ba42f244 | ||
![]() |
e0300331fd | ||
![]() |
325a454db7 | ||
![]() |
91e33f8a4a | ||
![]() |
dcb4ca83bb | ||
![]() |
42e18ec252 | ||
![]() |
427290e783 | ||
![]() |
1a2dd5f692 | ||
![]() |
49705ad4bc | ||
![]() |
b71ca6af89 | ||
![]() |
9c34fe3220 | ||
![]() |
97d8caaf1e | ||
![]() |
f2affda37e | ||
![]() |
95b706b4bd | ||
![]() |
6fcf0e0a4f | ||
![]() |
523d91ff89 | ||
![]() |
e182f0ffa9 | ||
![]() |
9896108028 | ||
![]() |
c32d749675 | ||
![]() |
98eae4257c | ||
![]() |
3a207fc53c | ||
![]() |
09a7995a50 | ||
![]() |
532806176c | ||
![]() |
ebd2ce9393 | ||
![]() |
a0db56a530 | ||
![]() |
936bfb6c86 | ||
![]() |
c6aa3f9ad9 | ||
![]() |
90d9d146f1 | ||
![]() |
95c950d2ee | ||
![]() |
8f29ba4e16 | ||
![]() |
f4218e8ae1 | ||
![]() |
28e5b9b958 | ||
![]() |
993e986ec0 | ||
![]() |
75e8e5fdf0 | ||
![]() |
4556f8b238 | ||
![]() |
3b29343e15 | ||
![]() |
4f56b9c783 | ||
![]() |
4c5755d2fc | ||
![]() |
e091920bda | ||
![]() |
b94d3afdb5 | ||
![]() |
5f4aa470b9 | ||
![]() |
93946c3bc9 | ||
![]() |
89e244890c | ||
![]() |
1c664f26e0 | ||
![]() |
2d397ad4cf | ||
![]() |
734cc19333 | ||
![]() |
abaa92b53d | ||
![]() |
2ea89a0559 |
1
.env
Normal file
@ -0,0 +1 @@
|
||||
PYTHONPATH="E:\Documents - Repositories\roar\libcanvas;E:\Documents - Repositories\roar\libgui;E:\Documents - Repositories\roar\liboperators;E:\Documents - Repositories\roar\libroar;E:\Documents - Repositories\roar\librtl;E:\Documents - Repositories\roar\libtools"
|
9
.gitignore
vendored
Normal file
@ -0,0 +1,9 @@
|
||||
*.sw[op]
|
||||
__pycache__/
|
||||
build/
|
||||
libgui/GuiCanvasWxBackendFast.exp
|
||||
libgui/GuiCanvasWxBackendFast.lib
|
||||
libgui/GuiCanvasWxBackendFast.obj
|
||||
libgui/GuiCanvasWxBackendFast.pyd
|
||||
librtl/ImgurApiKey.py
|
||||
releases/
|
23
.vscode/c_cpp_properties.json
vendored
Executable file
@ -0,0 +1,23 @@
|
||||
{
|
||||
"configurations": [
|
||||
{
|
||||
"name": "Win32",
|
||||
"includePath": [
|
||||
"${workspaceFolder}/**",
|
||||
"C:/Python37/include/**"
|
||||
],
|
||||
"defines": [
|
||||
"_DEBUG",
|
||||
"UNICODE",
|
||||
"_UNICODE"
|
||||
],
|
||||
"windowsSdkVersion": "10.0.18362.0",
|
||||
"compilerPath": "C:/Program Files (x86)/Microsoft Visual Studio/2019/BuildTools/VC/Tools/MSVC/14.23.28105/bin/Hostx64/x64/cl.exe",
|
||||
"cStandard": "c11",
|
||||
"cppStandard": "c++17",
|
||||
"intelliSenseMode": "msvc-x64",
|
||||
"compilerArgs": []
|
||||
}
|
||||
],
|
||||
"version": 4
|
||||
}
|
70
.vscode/launch.json
vendored
Executable file
@ -0,0 +1,70 @@
|
||||
{
|
||||
// Use IntelliSense to learn about possible attributes.
|
||||
// Hover to view descriptions of existing attributes.
|
||||
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
|
||||
"version": "0.2.0",
|
||||
"configurations": [
|
||||
{
|
||||
"name": "Python: Current File (Integrated Terminal)",
|
||||
"type": "python",
|
||||
"request": "launch",
|
||||
"program": "${file}",
|
||||
"console": "integratedTerminal"
|
||||
},
|
||||
{
|
||||
"name": "Python: Remote Attach",
|
||||
"type": "python",
|
||||
"request": "attach",
|
||||
"port": 5678,
|
||||
"host": "localhost",
|
||||
"pathMappings": [
|
||||
{
|
||||
"localRoot": "${workspaceFolder}",
|
||||
"remoteRoot": "."
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "Python: Module",
|
||||
"type": "python",
|
||||
"request": "launch",
|
||||
"module": "enter-your-module-name-here",
|
||||
"console": "integratedTerminal"
|
||||
},
|
||||
{
|
||||
"name": "Python: Django",
|
||||
"type": "python",
|
||||
"request": "launch",
|
||||
"program": "${workspaceFolder}/manage.py",
|
||||
"console": "integratedTerminal",
|
||||
"args": [
|
||||
"runserver",
|
||||
"--noreload",
|
||||
"--nothreading"
|
||||
],
|
||||
"django": true
|
||||
},
|
||||
{
|
||||
"name": "Python: Flask",
|
||||
"type": "python",
|
||||
"request": "launch",
|
||||
"module": "flask",
|
||||
"env": {
|
||||
"FLASK_APP": "app.py"
|
||||
},
|
||||
"args": [
|
||||
"run",
|
||||
"--no-debugger",
|
||||
"--no-reload"
|
||||
],
|
||||
"jinja": true
|
||||
},
|
||||
{
|
||||
"name": "Python: Current File (External Terminal)",
|
||||
"type": "python",
|
||||
"request": "launch",
|
||||
"program": "${file}",
|
||||
"console": "externalTerminal"
|
||||
}
|
||||
]
|
||||
}
|
8
.vscode/roar.code-workspace
vendored
Executable file
@ -0,0 +1,8 @@
|
||||
{
|
||||
"folders": [
|
||||
{
|
||||
"path": "E:\\Documents - Repositories\\roar"
|
||||
}
|
||||
],
|
||||
"settings": {}
|
||||
}
|
5
.vscode/settings.json
vendored
Executable file
@ -0,0 +1,5 @@
|
||||
{
|
||||
"python.analysis.disabled": ["unresolved-import"],
|
||||
"python.pythonPath": "C:\\Python37\\python.exe",
|
||||
"python.linting.enabled": false
|
||||
}
|
15
.vscode/tasks.json
vendored
Executable file
@ -0,0 +1,15 @@
|
||||
{
|
||||
// See https://go.microsoft.com/fwlink/?LinkId=733558
|
||||
// for the documentation about the tasks.json format
|
||||
"version": "2.0.0",
|
||||
"tasks": [
|
||||
{
|
||||
"label": "Build libgui/GuiCanvasWxBackendFast.pyd",
|
||||
"type": "shell",
|
||||
"command": "cd \"${workspaceFolder}/libgui\" && cmd /c cl /EHsc /LD /Ox /Wall /WX /IC:/Python37/include GuiCanvasWxBackendFast.cpp C:/Python37/libs/python37.lib /FeGuiCanvasWxBackendFast.pyd",
|
||||
"problemMatcher": [
|
||||
"$msCompile"
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
2
ENNTool/.gitignore
vendored
@ -1,2 +0,0 @@
|
||||
__pycache__/
|
||||
*.sw[op]
|
@ -1,180 +0,0 @@
|
||||
#!/usr/bin/env python3
|
||||
#
|
||||
# ENNTool -- mIRC art animation tool (for EFnet #MiRCART) (WIP)
|
||||
# Copyright (c) 2018 Lucio Andrés Illanes Albornoz <lucio@lucioillanes.de>
|
||||
# This project is licensed under the terms of the MIT license.
|
||||
#
|
||||
# TODO:
|
||||
# 1) -A, -S: replace w/ -s, implement animation script: render frame #1, render frame #2, ...; scrolling script; effects: rotate, smash into bricks, swirl, wave, ...
|
||||
# 2) Feature: include ETA(s) @ progress bar(s)
|
||||
# 3) Feature: autodetect video width from widest mircart
|
||||
# 4) Feature: render mircart as 3D blocks vs flat surface
|
||||
|
||||
#
|
||||
# 1) Optimisation: speed up ENNToolMiRCARTImporter
|
||||
# 2) Cleanup: use names @ optdict + set from optdefaults
|
||||
# 3) Feature: scrolling speed as <how many Y units>x<count of frame(s)>
|
||||
# 4) Cleanup: use VAOs + glVertexAttribFormat + glVertexAttribBinding
|
||||
# 5) Optimisation: split mIRC art into separate VBOs & implement rudimentary culling
|
||||
# 6) Optimisation: only call glReadPixels() when changes were made relative to the last call
|
||||
# 7) Split video output into separate module, switch to GUI
|
||||
# 8) FBOs http://www.songho.ca/opengl/gl_fbo.html
|
||||
#
|
||||
|
||||
from getopt import getopt, GetoptError
|
||||
from glob import glob
|
||||
from OpenGL.GL import *
|
||||
import os, sys, time
|
||||
import wx
|
||||
|
||||
from ENNToolGLCanvasPanel import ENNToolGLCanvas, ENNToolGLPanel
|
||||
from ENNToolGLTTFTexture import ENNToolGLTTFTexture
|
||||
from ENNToolGLVideoWriter import ENNToolGLVideoWriter
|
||||
from ENNToolMiRCARTImporter import ENNToolMiRCARTImporter
|
||||
|
||||
class ENNToolApp(object):
|
||||
"""XXX"""
|
||||
|
||||
# {{{ parseArgv(self, argv): XXX
|
||||
def parseArgv(self, argv):
|
||||
def usage(argv0):
|
||||
print("usage: {}".format(os.path.basename(argv0)), file=sys.stderr)
|
||||
print(" [-A] [-f fps] [-h] [-o fname]".format(os.path.basename(argv0)), file=sys.stderr)
|
||||
print(" [-p] [-r WxH] [-R WxH] [-s fname]", file=sys.stderr)
|
||||
print(" [-S] [-v] [--] fname..", file=sys.stderr)
|
||||
print("", file=sys.stderr)
|
||||
print(" -a........: select animation mode (UNIMPLEMENTED)", file=sys.stderr)
|
||||
print(" -f fps....: set video FPS; defaults to 25", file=sys.stderr)
|
||||
print(" -h........: show this screen", file=sys.stderr)
|
||||
print(" -o fname..: output video filename; extension determines video type", file=sys.stderr)
|
||||
print(" -p........: play video after rendering", file=sys.stderr)
|
||||
print(" -r WxH....: set video resolution; defaults to 1152x864", file=sys.stderr)
|
||||
print(" -R WxH....: set MiRCART cube resolution; defaults to 0.1x0.2", file=sys.stderr)
|
||||
print(" -s fname..: input script filename", file=sys.stderr)
|
||||
print(" -S........: select scrolling mode", file=sys.stderr)
|
||||
print(" -v........: be verbose", file=sys.stderr)
|
||||
try:
|
||||
optlist, argv = getopt(argv[1:], "Af:ho:pr:R:s:Sv")
|
||||
optdict = dict(optlist)
|
||||
|
||||
if "-h" in optdict:
|
||||
usage(sys.argv[0]); exit(0);
|
||||
elif not len(argv):
|
||||
raise GetoptError("at least one MiRCART input fname must be specified")
|
||||
|
||||
if not "-f" in optdict:
|
||||
optdict["-f"] = "25"
|
||||
if not "-r" in optdict:
|
||||
optdict["-r"] = "1152x864"
|
||||
if not "-R" in optdict:
|
||||
optdict["-R"] = "0.1x0.2"
|
||||
|
||||
if "-r" in optdict:
|
||||
optdict["-r"] = [int(r) for r in optdict["-r"].split("x")][0:2]
|
||||
if "-R" in optdict:
|
||||
optdict["-R"] = [float(r) for r in optdict["-R"].split("x")][0:2]
|
||||
except GetoptError as e:
|
||||
print(e.msg); usage(sys.argv[0]); exit(1);
|
||||
return argv, optdict
|
||||
# }}}
|
||||
# {{{ printProgress(self, progressCur, progressMax): XXX
|
||||
def printProgress(self, progressCur, progressMax):
|
||||
progressDiv = float(progressCur / progressMax)
|
||||
if progressDiv >= 1:
|
||||
progressDiv = 1; endChar = "\n";
|
||||
else:
|
||||
endChar = ""
|
||||
print("\r[{:<50}] {}%".format(
|
||||
("=" * int(progressDiv * 50)), int(progressDiv * 100)), end=endChar)
|
||||
# }}}
|
||||
# {{{ modeScroll(self, argv, optdict, GLVideoWriter, GLpanel, GLpanel, fps=25, scrollRate=0.1): XXX
|
||||
def modeScroll(self, argv, optdict, GLVideoWriter, GLcanvas, GLpanel, fps=25, scrollRate=0.1):
|
||||
MiRCART = []
|
||||
if "-v" in optdict:
|
||||
time0 = time.time()
|
||||
for inFileArg in argv:
|
||||
for inFile in sorted(glob(inFileArg)):
|
||||
MiRCART += ENNToolMiRCARTImporter(inFile).outMap
|
||||
if "-v" in optdict:
|
||||
print("mIRC art import delta {:.3f}ms".format((time.time() - time0) * 1000))
|
||||
|
||||
if "-v" in optdict:
|
||||
time0 = time.time()
|
||||
artTextureId, artInfo = ENNToolGLTTFTexture(MiRCART, optdict["-R"], optdict["-r"]).getParams()
|
||||
if "-v" in optdict:
|
||||
print("TTF texture generation delta {:.3f}ms".format((time.time() - time0) * 1000))
|
||||
artVbo, artVboLen, lastY, numVertices = GLcanvas.renderMiRCART(artInfo, MiRCART, cubeSize=optdict["-R"])
|
||||
if "-v" in optdict:
|
||||
print("{} vertices".format(numVertices))
|
||||
def scrollFrameFun():
|
||||
curY, rotateX, rotateY, translateY = 0, 0, 0, scrollRate
|
||||
w, h = GLcanvas.GetClientSize(); w, h = max(w, 1.0), max(h, 1.0);
|
||||
def scrollFrame():
|
||||
nonlocal curY
|
||||
self.printProgress(curY, lastY)
|
||||
GLcanvas.renderFrame(artTextureId, artVbo, artVboLen)
|
||||
if translateY:
|
||||
glTranslatef(0, translateY, 0); curY += translateY
|
||||
if rotateX:
|
||||
glRotatef(rotateX * (180.0/w), 0.0, 1.0, 0.0)
|
||||
if rotateY:
|
||||
glRotatef(rotateY * (180.0/h), 1.0, 0.0, 0.0)
|
||||
if "-o" in optdict:
|
||||
GLVideoWriter.saveFrame()
|
||||
else:
|
||||
GLcanvas.SwapBuffers()
|
||||
if curY >= lastY:
|
||||
self.printProgress(curY, lastY)
|
||||
if "-o" in optdict:
|
||||
GLVideoWriter.saveVideo()
|
||||
return False
|
||||
return True
|
||||
return scrollFrame
|
||||
if "-o" in optdict:
|
||||
frameFun = scrollFrameFun()
|
||||
while True:
|
||||
if not frameFun():
|
||||
break
|
||||
else:
|
||||
GLpanel.frameFun = scrollFrameFun()
|
||||
self.wxApp.MainLoop()
|
||||
# }}}
|
||||
# {{{ __init__(self, argv): XXX
|
||||
def __init__(self, argv):
|
||||
argv, optdict = self.parseArgv(argv)
|
||||
self.wxApp = wx.App(False)
|
||||
appFrameSize = [c + 128 for c in optdict["-r"]]
|
||||
self.appFrame = wx.Frame(None, size=appFrameSize)
|
||||
appPanelSkin = wx.Panel(self.appFrame, wx.ID_ANY)
|
||||
|
||||
videoFps, videoPath = int(optdict["-f"]), optdict["-o"] if "-o" in optdict else None
|
||||
GLpanel = ENNToolGLPanel(appPanelSkin, size=optdict["-r"], parentFrame=self.appFrame)
|
||||
GLcanvas = ENNToolGLCanvas(GLpanel, optdict["-r"])
|
||||
GLcanvas.initOpenGL()
|
||||
GLcanvas.initShaders()
|
||||
GLVideoWriter = ENNToolGLVideoWriter(videoPath, GLpanel.GetClientSize(), videoFps=videoFps)
|
||||
|
||||
if "-o" in optdict:
|
||||
self.appFrame.Hide()
|
||||
else:
|
||||
self.appFrame.Show(); self.appFrame.SetFocus();
|
||||
|
||||
if "-v" in optdict:
|
||||
time0 = time.time()
|
||||
self.modeScroll(argv, optdict, GLVideoWriter, GLcanvas, GLpanel, fps=videoFps)
|
||||
if "-v" in optdict:
|
||||
print("delta {}s".format(time.time() - time0))
|
||||
if "-o" in optdict \
|
||||
and "-p" in optdict:
|
||||
os.startfile(videoPath)
|
||||
# }}}
|
||||
|
||||
#
|
||||
# Entry point
|
||||
def main(*argv):
|
||||
ENNToolApp(argv)
|
||||
|
||||
if __name__ == "__main__":
|
||||
main(*sys.argv)
|
||||
|
||||
# vim:expandtab foldmethod=marker sw=4 ts=4 tw=120
|
@ -1,204 +0,0 @@
|
||||
#!/usr/bin/env python3
|
||||
#
|
||||
# ENNTool -- mIRC art animation tool (for EFnet #MiRCART) (WIP)
|
||||
# Copyright (c) 2018 Lucio Andrés Illanes Albornoz <lucio@lucioillanes.de>
|
||||
# This project is licensed under the terms of the MIT license.
|
||||
#
|
||||
# References:
|
||||
# Wed, 27 Jun 2018 16:02:10 +0200 [1] <https://www.opengl.org/discussion_boards/showthread.php/125843-default-camera?p=954801&viewfull=1#post954801>
|
||||
# Wed, 27 Jun 2018 16:02:11 +0200 [2] <https://www.opengl.org/discussion_boards/showthread.php/167808-2D-texture-problem-lines-between-textures>
|
||||
# Wed, 27 Jun 2018 16:02:12 +0200 [3] <https://www.khronos.org/opengl/wiki/How_lighting_works#Good_Settings.>
|
||||
# Wed, 27 Jun 2018 16:02:13 +0200 [4] <https://www.khronos.org/opengl/wiki/Common_Mistakes>
|
||||
# Wed, 27 Jun 2018 16:02:14 +0200 [5] <https://www.khronos.org/opengl/wiki/Pixel_Transfer#Pixel_layout>
|
||||
# Thu, 28 Jun 2018 18:32:50 +0200 [6] <https://stackoverflow.com/questions/18935203/shader-position-vec4-or-vec3>
|
||||
# Tue, 03 Jul 2018 14:34:57 +0200 [7] <https://gamedev.stackexchange.com/questions/107793/binding-and-unbinding-what-would-you-do>
|
||||
#
|
||||
|
||||
from ENNToolMiRCARTColours import ENNToolMiRCARTColoursFloat
|
||||
from OpenGL.GL import *
|
||||
from OpenGL.GL import shaders
|
||||
import ctypes, wx, wx.glcanvas
|
||||
|
||||
class ENNToolGLCanvas(wx.glcanvas.GLCanvas):
|
||||
# {{{ initOpenGL(self): XXX
|
||||
def initOpenGL(self):
|
||||
self.glContext = wx.glcanvas.GLContext(self)
|
||||
self.SetCurrent(self.glContext)
|
||||
|
||||
# [1]
|
||||
glViewport(0, 0, *self.curSize)
|
||||
glMatrixMode(GL_PROJECTION)
|
||||
glLoadIdentity(); glFrustum(-1, 1, -1, 1, 1, 100);
|
||||
glMatrixMode(GL_MODELVIEW)
|
||||
glEnable(GL_DEPTH_TEST)
|
||||
glTranslatef(-5.0, 3.0, -5)
|
||||
# }}}
|
||||
# {{{ initShaders(self): XXX
|
||||
def initShaders(self):
|
||||
# Fragment shader
|
||||
fs = shaders.compileShader("""
|
||||
#version 330 core
|
||||
|
||||
in vec2 frgTexCoord;
|
||||
in vec3 frgFgColour;
|
||||
in vec3 frgBgColour;
|
||||
uniform sampler2D texture;
|
||||
|
||||
layout(location = 0) out vec4 fragColour;
|
||||
|
||||
void main() {
|
||||
vec4 texel = texture2D(texture, frgTexCoord);
|
||||
if (texel.r == 0.0 && texel.g == 0.0 && texel.b == 0.0 && texel.a == 0.0) {
|
||||
fragColour = vec4(frgBgColour.r, frgBgColour.g, frgBgColour.b, 1.0);
|
||||
} else {
|
||||
fragColour = vec4(frgFgColour.r, frgFgColour.g, frgFgColour.b, 1.0);
|
||||
}
|
||||
}
|
||||
""", GL_FRAGMENT_SHADER)
|
||||
|
||||
# Vertex shader
|
||||
vs = shaders.compileShader("""
|
||||
#version 330 core
|
||||
|
||||
layout(location = 0) in vec4 vertex;
|
||||
layout(location = 1) in vec2 texcoord;
|
||||
layout(location = 2) in vec3 vexFgColour;
|
||||
layout(location = 3) in vec3 vexBgColour;
|
||||
|
||||
out vec2 frgTexCoord;
|
||||
out vec3 frgFgColour;
|
||||
out vec3 frgBgColour;
|
||||
|
||||
uniform mat4 modelview;
|
||||
uniform mat4 projection;
|
||||
|
||||
void main() {
|
||||
gl_Position = projection * modelview * vertex;
|
||||
frgTexCoord = texcoord;
|
||||
frgFgColour = vexFgColour;
|
||||
frgBgColour = vexBgColour;
|
||||
}
|
||||
""", GL_VERTEX_SHADER)
|
||||
self.shader = shaders.compileProgram(vs, fs)
|
||||
# }}}
|
||||
# {{{ renderFrame(self, artTextureId, artVbo, artVboLen): XXX
|
||||
def renderFrame(self, artTextureId, artVbo, artVboLen):
|
||||
# Bind VBO and named texture & install shader program object
|
||||
glBindBuffer(GL_ARRAY_BUFFER, artVbo)
|
||||
glBindTexture(GL_TEXTURE_2D, artTextureId)
|
||||
glUseProgram(self.shader)
|
||||
|
||||
# Specify modelview and projection matrix & texture unit uniforms for shader programs
|
||||
modelview, projection = (GLfloat * 16)(), (GLfloat * 16)()
|
||||
glGetFloatv(GL_MODELVIEW_MATRIX, modelview)
|
||||
glGetFloatv(GL_PROJECTION_MATRIX, projection)
|
||||
glUniformMatrix4fv(glGetUniformLocation(self.shader, "modelview"), 1, GL_FALSE, modelview)
|
||||
glUniformMatrix4fv(glGetUniformLocation(self.shader, "projection"), 1, GL_FALSE, projection)
|
||||
glUniform1i(glGetUniformLocation(self.shader, "texture"), 0)
|
||||
|
||||
# VBO vertices location
|
||||
glEnableVertexAttribArray(0)
|
||||
glVertexAttribPointer(0, 3, GL_FLOAT, False, 44, ctypes.c_void_p(0))
|
||||
glVertexPointer(3, GL_FLOAT, 44, ctypes.c_void_p(0))
|
||||
|
||||
# VBO texture coordinates
|
||||
glEnableVertexAttribArray(1)
|
||||
glVertexAttribPointer(1, 2, GL_FLOAT, False, 44, ctypes.c_void_p(12))
|
||||
glTexCoordPointer(2, GL_FLOAT, 44, ctypes.c_void_p(12))
|
||||
|
||||
# VBO foreground colours
|
||||
glEnableVertexAttribArray(2)
|
||||
glVertexAttribPointer(2, 3, GL_FLOAT, False, 44, ctypes.c_void_p(20))
|
||||
glTexCoordPointer(3, GL_FLOAT, 44, ctypes.c_void_p(20))
|
||||
|
||||
# VBO background colours
|
||||
glEnableVertexAttribArray(3)
|
||||
glVertexAttribPointer(3, 3, GL_FLOAT, False, 44, ctypes.c_void_p(32))
|
||||
glTexCoordPointer(3, GL_FLOAT, 44, ctypes.c_void_p(32))
|
||||
|
||||
# Clear colour and depth buffer, draw quads from VBO & clear state
|
||||
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
|
||||
glDrawArrays(GL_QUADS, 0, artVboLen)
|
||||
glDisableVertexAttribArray(0)
|
||||
glBindTexture(GL_TEXTURE_2D, 0)
|
||||
# }}}
|
||||
# {{{ renderMiRCART(self, artInfo, artMap, centre=True, canvasCols=100, cubeSize=(0.1, 0.2)): XXX
|
||||
def renderMiRCART(self, artInfo, artMap, centre=True, canvasCols=100, cubeSize=(0.1, 0.2)):
|
||||
curPos, vertices, numVertices = [0, 0, 0], [], 0
|
||||
for numRow in range(len(artMap)):
|
||||
if centre and (len(artMap[numRow]) < canvasCols):
|
||||
curPos[0] += (((canvasCols - len(artMap[numRow])) * cubeSize[0]) / 2)
|
||||
for numCol in range(len(artMap[numRow])):
|
||||
cubeFg = artMap[numRow][numCol][0]
|
||||
cubeBg = artMap[numRow][numCol][1]
|
||||
cubeAttrs = artMap[numRow][numCol][2]
|
||||
cubeChar = artMap[numRow][numCol][3]
|
||||
artCell = artInfo[cubeAttrs][cubeChar]
|
||||
|
||||
# Top Right, Top Left
|
||||
vertices += curPos
|
||||
vertices += artCell[0:2]
|
||||
vertices += [*ENNToolMiRCARTColoursFloat[cubeFg]]
|
||||
vertices += [*ENNToolMiRCARTColoursFloat[cubeBg]]
|
||||
vertices += [curPos[0] - cubeSize[0], curPos[1], curPos[2]]
|
||||
vertices += artCell[2:4]
|
||||
vertices += ENNToolMiRCARTColoursFloat[cubeFg]
|
||||
vertices += ENNToolMiRCARTColoursFloat[cubeBg]
|
||||
|
||||
# Bottom Left, Bottom Right
|
||||
vertices += [curPos[0] - cubeSize[0], curPos[1] - cubeSize[1], curPos[2]]
|
||||
vertices += artCell[4:6]
|
||||
vertices += [*ENNToolMiRCARTColoursFloat[cubeFg]]
|
||||
vertices += [*ENNToolMiRCARTColoursFloat[cubeBg]]
|
||||
vertices += [curPos[0], curPos[1] - cubeSize[1], curPos[2]]
|
||||
vertices += artCell[6:8]
|
||||
vertices += ENNToolMiRCARTColoursFloat[cubeFg]
|
||||
vertices += ENNToolMiRCARTColoursFloat[cubeBg]
|
||||
|
||||
curPos[0], numVertices = curPos[0] + cubeSize[0], numVertices + 4
|
||||
curPos[0], curPos[1] = 0, curPos[1] - cubeSize[1]
|
||||
|
||||
artVbo = glGenBuffers(1)
|
||||
glBindBuffer(GL_ARRAY_BUFFER, artVbo)
|
||||
glBufferData(GL_ARRAY_BUFFER,
|
||||
(ctypes.c_float*len(vertices))(*vertices),
|
||||
GL_STATIC_DRAW)
|
||||
return artVbo, len(vertices), -curPos[1], numVertices
|
||||
# }}}
|
||||
# {{{ __init__(self, parentCanvas, size): initialisation method
|
||||
def __init__(self, parentCanvas, size):
|
||||
super().__init__(parentCanvas, size=size)
|
||||
self.curSize = list(size)
|
||||
self.parentCanvas = parentCanvas
|
||||
# }}}
|
||||
|
||||
class ENNToolGLPanel(wx.Panel):
|
||||
"""XXX"""
|
||||
|
||||
# {{{ onPaint(self, event): XXX
|
||||
def onPaint(self, event):
|
||||
eventDc = wx.PaintDC(self)
|
||||
eventUpdates = wx.RegionIterator(self.GetUpdateRegion())
|
||||
paintFlag = True if eventUpdates.HaveRects() else False
|
||||
if self.frameFun != None:
|
||||
self.frameFun()
|
||||
# }}}
|
||||
# {{{ onTimer(self, event): XXX
|
||||
def onTimer(self, event):
|
||||
if self.frameFun != None:
|
||||
if not self.frameFun():
|
||||
event.GetTimer().Stop()
|
||||
event.GetTimer().Destroy()
|
||||
# }}}
|
||||
# {{{ __init__(self, parent, size, defaultPos=(24,24), parentFrame=None): initialisation method
|
||||
def __init__(self, parent, size, defaultPos=(24,24), parentFrame=None):
|
||||
super().__init__(parent, pos=defaultPos, size=size)
|
||||
self.curPos = list(defaultPos); self.curSize = list(size);
|
||||
self.Bind(wx.EVT_PAINT, self.onPaint)
|
||||
self.frameFun = None
|
||||
self.timerTimer = wx.Timer(self, 1)
|
||||
self.timerTimer.Start(40)
|
||||
self.Bind(wx.EVT_TIMER, self.onTimer, self.timerTimer)
|
||||
# }}}
|
||||
|
||||
# vim:expandtab foldmethod=marker sw=4 ts=4 tw=120
|
@ -1,152 +0,0 @@
|
||||
#!/usr/bin/env python3
|
||||
#
|
||||
# ENNTool -- mIRC art animation tool (for EFnet #MiRCART) (WIP)
|
||||
# Copyright (c) 2018 Lucio Andrés Illanes Albornoz <lucio@lucioillanes.de>
|
||||
# This project is licensed under the terms of the MIT license.
|
||||
#
|
||||
# References:
|
||||
# Thu, 28 Jun 2018 17:03:16 +0200 [1] <https://stackoverflow.com/questions/384759/how-to-convert-a-pil-image-into-a-numpy-array>
|
||||
# Thu, 28 Jun 2018 17:04:59 +0200 [2] <https://www.khronos.org/opengl/wiki/Common_Mistakes#y-axis>
|
||||
# Wed, 27 Jun 2018 16:02:12 +0200 [3] <https://www.khronos.org/opengl/wiki/How_lighting_works#Good_Settings.>
|
||||
# Wed, 27 Jun 2018 16:02:13 +0200 [4] <https://www.khronos.org/opengl/wiki/Common_Mistakes>
|
||||
# Wed, 27 Jun 2018 16:02:14 +0200 [5] <https://www.khronos.org/opengl/wiki/Pixel_Transfer#Pixel_layout>
|
||||
# Wed, 04 Jul 2018 10:57:09 +0200 [6] <https://stackoverflow.com/questions/466204/rounding-up-to-next-power-of-2>
|
||||
#
|
||||
|
||||
from collections import defaultdict
|
||||
from OpenGL.GL import *
|
||||
from PIL import Image, ImageDraw, ImageFont
|
||||
import numpy
|
||||
import os, string, sys
|
||||
from ENNToolMiRCARTColours import ENNToolMiRCARTColours
|
||||
from ENNToolMiRCARTImporter import ENNToolMiRCARTImporter
|
||||
|
||||
class ENNToolGLTTFTexture(object):
|
||||
"""XXX"""
|
||||
|
||||
# {{{ _defaultDict(*args): XXX
|
||||
@staticmethod
|
||||
def _defaultDict(*args):
|
||||
return defaultdict(*args)
|
||||
# }}}
|
||||
# {{{ _nestedDict(): XXX
|
||||
@staticmethod
|
||||
def _nestedDict():
|
||||
return defaultdict(ENNToolGLTTFTexture._nestedDict)
|
||||
# }}}
|
||||
# {{{ _drawCharList(self, artInfo, charList, pilFontBold, pilFontNormal, pilImageDraw, pilImageSize): XXX
|
||||
def _drawCharList(self, artInfo, charList, pilFontBold, pilFontNormal, pilImageDraw, pilImageSize):
|
||||
curPos = [0, 0]
|
||||
for newChar in charList:
|
||||
if newChar[2] & ENNToolMiRCARTImporter._CellState.CS_BOLD:
|
||||
pilFont, pilFontSize = pilFontBold, [pilFontBold.getsize(newChar[3])[0], pilFontBold.getsize(newChar[3])[1]]
|
||||
else:
|
||||
pilFont, pilFontSize = pilFontNormal, [pilFontNormal.getsize(newChar[3])[0], pilFontNormal.getsize(newChar[3])[1]]
|
||||
if newChar[2] & ENNToolMiRCARTImporter._CellState.CS_UNDERLINE:
|
||||
underLine = True
|
||||
else:
|
||||
underLine = False
|
||||
if newChar[3] != " ":
|
||||
pilImageDraw.text(curPos, newChar[3], (255, 255, 255, 255), pilFont)
|
||||
elif newChar[0] == newChar[1]:
|
||||
pilImageDraw.rectangle((*curPos, curPos[0] + pilFontSize[0], curPos[1] + pilFontSize[1] - 1),
|
||||
fill=(255, 255, 255, 255))
|
||||
if underLine and False:
|
||||
pilImageDraw.line(
|
||||
xy=(curPos[0], curPos[1] + (pilFontSize[1] - 2),
|
||||
curPos[0] + pilFontSize[0], curPos[1] + pilFontSize[1]),
|
||||
fill=(*ENNToolMiRCARTColours[newChar[0]], 255))
|
||||
|
||||
artInfo[newChar[2]][newChar[3]] = []
|
||||
# Top Right
|
||||
artInfo[newChar[2]][newChar[3]] += [float(curPos[0] + pilFontSize[0]) / pilImageSize[0], 0.0]
|
||||
# Top Left
|
||||
artInfo[newChar[2]][newChar[3]] += [float(curPos[0]) / pilImageSize[0], 0.0]
|
||||
# Bottom Left
|
||||
artInfo[newChar[2]][newChar[3]] += [float(curPos[0]) / pilImageSize[0], float(pilFontSize[1]) / pilImageSize[1]]
|
||||
# Bottom Right
|
||||
artInfo[newChar[2]][newChar[3]] += [float(curPos[0] + pilFontSize[0]) / pilImageSize[0], float(pilFontSize[1]) / pilImageSize[1]]
|
||||
|
||||
curPos[0] += pilFontSize[0]
|
||||
return artInfo
|
||||
# }}}
|
||||
# {{{ _initArtInfoCharList(self): XXX
|
||||
def _initArtInfoCharList(self, artMap):
|
||||
artInfo, charList = ENNToolGLTTFTexture._nestedDict(), []
|
||||
for numRow in range(len(artMap)):
|
||||
for numCol in range(len(artMap[numRow])):
|
||||
artFg = artMap[numRow][numCol][0]
|
||||
artBg = artMap[numRow][numCol][1]
|
||||
artAttrs = artMap[numRow][numCol][2]
|
||||
artChar = artMap[numRow][numCol][3]
|
||||
if artInfo[artAttrs][artChar] == {}:
|
||||
artInfo[artAttrs][artChar] = None
|
||||
charList += [[artFg, artBg, artAttrs, artChar]]
|
||||
return artInfo, charList
|
||||
# }}}
|
||||
# {{{ _initFonts(self, charMap): XXX
|
||||
def _initFonts(self, charMap):
|
||||
fontBoldPathName = os.path.join("assets", "DejaVuSansMono-Bold.ttf")
|
||||
fontNormalPathName = os.path.join("assets", "DejaVuSansMono.ttf")
|
||||
fontSize = int("26")
|
||||
pilFontBold = ImageFont.truetype(fontBoldPathName, fontSize)
|
||||
pilFontMaxSize = [16, 32] # TODO
|
||||
pilFontNormal = ImageFont.truetype(fontNormalPathName, fontSize)
|
||||
return pilFontBold, pilFontMaxSize, pilFontNormal
|
||||
# }}}
|
||||
# {{{ _initImage(self, charList, pilFontMaxSize): XXX
|
||||
def _initImage(self, charList, pilFontMaxSize):
|
||||
pilImageSize = [pilFontMaxSize[0] * len(charList), pilFontMaxSize[1]]
|
||||
for numDim in range(len(pilImageSize)):
|
||||
if (pilImageSize[numDim] & (pilImageSize[numDim] - 1)) != 0:
|
||||
pilImageSize[numDim] -= 1
|
||||
pilImageSize[numDim] |= pilImageSize[numDim] >> 1
|
||||
pilImageSize[numDim] |= pilImageSize[numDim] >> 2
|
||||
pilImageSize[numDim] |= pilImageSize[numDim] >> 4
|
||||
pilImageSize[numDim] |= pilImageSize[numDim] >> 8
|
||||
pilImageSize[numDim] |= pilImageSize[numDim] >> 16
|
||||
pilImageSize[numDim] += 1
|
||||
pilImage = Image.new("RGBA", pilImageSize, (0, 0, 0, 0))
|
||||
pilImageDraw = ImageDraw.Draw(pilImage)
|
||||
return pilImage, pilImageDraw, pilImageSize
|
||||
# }}}
|
||||
# {{{ _initTexture(self, pilImage): XXX
|
||||
def _initTexture(self, pilImage):
|
||||
# [1], [2]
|
||||
artTextureId = glGenTextures(1)
|
||||
artTextureImage = pilImage
|
||||
artTextureImageData = numpy.array(artTextureImage)
|
||||
|
||||
glBindTexture(GL_TEXTURE_2D, artTextureId)
|
||||
glPixelStorei(GL_UNPACK_ALIGNMENT, 1)
|
||||
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP)
|
||||
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP)
|
||||
|
||||
# [3]
|
||||
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST)
|
||||
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST)
|
||||
|
||||
# [4][5]
|
||||
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA,
|
||||
artTextureImage.size[0], artTextureImage.size[1],
|
||||
0, GL_RGBA, GL_UNSIGNED_BYTE, artTextureImageData)
|
||||
|
||||
glBindTexture(GL_TEXTURE_2D, 0)
|
||||
return artTextureId
|
||||
# }}}
|
||||
# {{{ getParams(self): XXX
|
||||
def getParams(self):
|
||||
return self.artTextureId, self.artInfo
|
||||
# }}}
|
||||
# {{{ __init__(self): initialisation method
|
||||
def __init__(self, artMap, cubeSize, videoSize):
|
||||
artInfo, charList = self._initArtInfoCharList(artMap)
|
||||
pilFontBold, pilFontMaxSize, pilFontNormal = self._initFonts(charList)
|
||||
pilImage, pilImageDraw, pilImageSize = self._initImage(charList, pilFontMaxSize)
|
||||
artInfo = self._drawCharList(artInfo, charList, pilFontBold, pilFontNormal, pilImageDraw, pilImageSize)
|
||||
artTextureId = self._initTexture(pilImage)
|
||||
self.artTextureId = artTextureId
|
||||
self.artInfo = artInfo
|
||||
# }}}
|
||||
|
||||
# vim:expandtab foldmethod=marker sw=4 ts=4 tw=120
|
@ -1,68 +0,0 @@
|
||||
#!/usr/bin/env python3
|
||||
#
|
||||
# ENNTool -- mIRC art animation tool (for EFnet #MiRCART) (WIP)
|
||||
# Copyright (c) 2018 Lucio Andrés Illanes Albornoz <lucio@lucioillanes.de>
|
||||
# This project is licensed under the terms of the MIT license.
|
||||
#
|
||||
# References:
|
||||
# Tue, 03 Jul 2018 20:35:52 +0200 [1] <https://stackoverflow.com/questions/23930671/how-to-create-n-dim-numpy-array-from-a-pointer>
|
||||
# Wed, 04 Jul 2018 10:02:22 +0200 [2] <http://www.songho.ca/opengl/gl_pbo.html>
|
||||
#
|
||||
|
||||
from OpenGL.GL import *
|
||||
import ctypes, cv2, numpy
|
||||
|
||||
class ENNToolGLVideoWriter(object):
|
||||
"""XXX"""
|
||||
|
||||
# {{{ _copyFrames(self): XXX
|
||||
def _copyFrames(self):
|
||||
for numPbo in range(self.pboCount):
|
||||
glBindBuffer(GL_PIXEL_PACK_BUFFER, self.pboList[numPbo])
|
||||
frameBufferPtr = glMapBuffer(GL_PIXEL_PACK_BUFFER, GL_READ_ONLY)
|
||||
frameBufferPtr = ctypes.cast(frameBufferPtr, ctypes.POINTER(ctypes.c_ubyte))
|
||||
frameBuffer = numpy.ctypeslib.as_array(frameBufferPtr, shape=(self.videoSize[1], self.videoSize[0], 3))
|
||||
frameBuffer = numpy.flipud(frameBuffer)
|
||||
self.videoWriter.write(frameBuffer)
|
||||
glUnmapBuffer(GL_PIXEL_PACK_BUFFER)
|
||||
# }}}
|
||||
# {{{ _initCv2(self, videoFps, videoPath, videoSize): XXX
|
||||
def _initCv2(self, videoFps, videoPath, videoSize):
|
||||
fourcc = cv2.VideoWriter_fourcc(*"avc1")
|
||||
videoWriter = cv2.VideoWriter(videoPath, fourcc, videoFps, tuple(videoSize), True)
|
||||
return videoWriter
|
||||
# }}}
|
||||
# {{{ _initPbos(self, pboCount, videoSize): XXX
|
||||
def _initPbos(self, pboCount, videoSize):
|
||||
pboBufs, pboCur, pboList = [None] * pboCount, 0, [None] * pboCount
|
||||
for numPbo in range(pboCount):
|
||||
pboList[numPbo] = glGenBuffers(1)
|
||||
glBindBuffer(GL_PIXEL_PACK_BUFFER, pboList[numPbo])
|
||||
glBufferData(GL_PIXEL_PACK_BUFFER,
|
||||
videoSize[0] * videoSize[1] * 3, None, GL_STREAM_READ)
|
||||
glBindBuffer(GL_PIXEL_PACK_BUFFER, 0)
|
||||
return pboBufs, pboCount, pboCur, pboList
|
||||
# }}}
|
||||
# {{{ saveFrame(self): XXX
|
||||
def saveFrame(self):
|
||||
glBindBuffer(GL_PIXEL_PACK_BUFFER, self.pboList[self.pboCur])
|
||||
glReadPixels(0, 0, self.videoSize[0], self.videoSize[1], GL_BGR, GL_UNSIGNED_BYTE, ctypes.c_void_p(0))
|
||||
self.pboCur += 1
|
||||
if self.pboCur >= self.pboCount:
|
||||
self._copyFrames(); self.pboCur = 0;
|
||||
glBindBuffer(GL_PIXEL_PACK_BUFFER, 0)
|
||||
# }}}
|
||||
# {{{ saveVideo(self): XXX
|
||||
def saveVideo(self):
|
||||
return
|
||||
# }}}
|
||||
# {{{ __init__(self, videoPath, videoSize, videoFps=25): XXX
|
||||
def __init__(self, videoPath, videoSize, videoFps=25):
|
||||
videoWriter = self._initCv2(videoFps, videoPath, videoSize)
|
||||
self.pboBufs, self.pboCount, \
|
||||
self.pboCur, self.pboList = self._initPbos(videoFps, videoSize)
|
||||
self.videoFps, self.videoPath, \
|
||||
self.videoSize, self.videoWriter = videoFps, videoPath, videoSize, videoWriter
|
||||
# }}}
|
||||
|
||||
# vim:expandtab foldmethod=marker sw=4 ts=4 tw=120
|
@ -1,52 +0,0 @@
|
||||
#!/usr/bin/env python3
|
||||
#
|
||||
# ENNTool -- mIRC art animation tool (for EFnet #MiRCART) (WIP)
|
||||
# Copyright (c) 2018 Lucio Andrés Illanes Albornoz <lucio@lucioillanes.de>
|
||||
# This project is licensed under the terms of the MIT license.
|
||||
#
|
||||
|
||||
#
|
||||
# MiRCARTColours: mIRC colour number to RGBA map given none of ^[BFV_] (bold, italic, reverse, underline],
|
||||
#
|
||||
ENNToolMiRCARTColours = [
|
||||
[255, 255, 255], # White
|
||||
[0, 0, 0], # Black
|
||||
[0, 0, 187], # Blue
|
||||
[0, 187, 0], # Green
|
||||
[255, 85, 85], # Light Red
|
||||
[187, 0, 0], # Red
|
||||
[187, 0, 187], # Purple
|
||||
[187, 187, 0], # Yellow
|
||||
[255, 255, 85], # Light Yellow
|
||||
[85, 255, 85], # Light Green
|
||||
[0, 187, 187], # Cyan
|
||||
[85, 255, 255], # Light Cyan
|
||||
[85, 85, 255], # Light Blue
|
||||
[255, 85, 255], # Pink
|
||||
[85, 85, 85], # Grey
|
||||
[187, 187, 187], # Light Grey
|
||||
]
|
||||
|
||||
#
|
||||
# MiRCARTColours: mIRC colour number to RGBA float map given none of ^[BFV_] (bold, italic, reverse, underline],
|
||||
#
|
||||
ENNToolMiRCARTColoursFloat = [
|
||||
[1.00, 1.00, 1.00], # White
|
||||
[0.00, 0.00, 0.00], # Black
|
||||
[0.00, 0.00, 0.73], # Blue
|
||||
[0.00, 0.73, 0.00], # Green
|
||||
[1.00, 0.33, 0.33], # Light Red
|
||||
[0.73, 0.00, 0.00], # Red
|
||||
[0.73, 0.00, 0.73], # Purple
|
||||
[0.73, 0.73, 0.00], # Yellow
|
||||
[1.00, 1.00, 0.33], # Light Yellow
|
||||
[0.33, 1.00, 0.33], # Light Green
|
||||
[0.00, 0.73, 0.73], # Cyan
|
||||
[0.33, 1.00, 1.00], # Light Cyan
|
||||
[0.33, 0.33, 1.00], # Light Blue
|
||||
[1.00, 0.33, 1.00], # Pink
|
||||
[0.33, 0.33, 0.33], # Grey
|
||||
[0.73, 0.73, 0.73], # Light Grey
|
||||
]
|
||||
|
||||
# vim:expandtab foldmethod=marker sw=4 ts=4 tw=120
|
@ -1,134 +0,0 @@
|
||||
#!/usr/bin/env python3
|
||||
#
|
||||
# ENNTool -- mIRC art animation tool (for EFnet #MiRCART) (WIP)
|
||||
# Copyright (c) 2018 Lucio Andrés Illanes Albornoz <lucio@lucioillanes.de>
|
||||
# This project is licensed under the terms of the MIT license.
|
||||
#
|
||||
# TODO:
|
||||
# 1) un-Quick'n'Dirty-ify
|
||||
#
|
||||
|
||||
import chardet
|
||||
|
||||
class ENNToolMiRCARTImporter(object):
|
||||
"""XXX"""
|
||||
|
||||
# {{{ _CellState(): Cell state
|
||||
class _CellState():
|
||||
CS_NONE = 0x00
|
||||
CS_BOLD = 0x01
|
||||
CS_ITALIC = 0x02
|
||||
CS_UNDERLINE = 0x04
|
||||
# }}}
|
||||
# {{{ _ParseState(): Parsing loop state
|
||||
class _ParseState():
|
||||
PS_CHAR = 1
|
||||
PS_COLOUR_DIGIT0 = 2
|
||||
PS_COLOUR_DIGIT1 = 3
|
||||
# }}}
|
||||
# {{{ _flipCellStateBit(self, cellState, bit): XXX
|
||||
def _flipCellStateBit(self, cellState, bit):
|
||||
if cellState & bit:
|
||||
return cellState & ~bit
|
||||
else:
|
||||
return cellState | bit
|
||||
# }}}
|
||||
# {{{ _parseCharAsColourSpec(self, colourSpec, curColours): XXX
|
||||
def _parseCharAsColourSpec(self, colourSpec, curColours):
|
||||
if len(colourSpec) > 0:
|
||||
colourSpec = colourSpec.split(",")
|
||||
if len(colourSpec) == 2 \
|
||||
and len(colourSpec[1]) > 0:
|
||||
return [int(colourSpec[0] or curColours[0]), \
|
||||
int(colourSpec[1])]
|
||||
elif len(colourSpec) == 1 \
|
||||
or len(colourSpec[1]) == 0:
|
||||
return [int(colourSpec[0]), curColours[1]]
|
||||
else:
|
||||
return [15, 1]
|
||||
# }}}
|
||||
# {{{ fromTextFile(self, pathName): XXX
|
||||
def fromTextFile(self, pathName):
|
||||
with open(pathName, "rb") as fileObject:
|
||||
inFileEncoding = chardet.detect(fileObject.read())["encoding"]
|
||||
self.inFile = open(pathName, "r", encoding=inFileEncoding)
|
||||
self.inSize = self.outMap = None;
|
||||
inCurColourSpec = ""; inCurRow = -1;
|
||||
inLine = self.inFile.readline()
|
||||
inSize = [0, 0]; outMap = []; inMaxCols = 0;
|
||||
while inLine:
|
||||
inCellState = self._CellState.CS_NONE
|
||||
inParseState = self._ParseState.PS_CHAR
|
||||
inCurCol = 0; inMaxCol = len(inLine);
|
||||
inCurColourDigits = 0; inCurColours = [15, 1]; inCurColourSpec = "";
|
||||
inCurRow += 1; outMap.append([]); inRowCols = 0; inSize[1] += 1;
|
||||
while inCurCol < inMaxCol:
|
||||
inChar = inLine[inCurCol]
|
||||
if inChar in set("\r\n"): \
|
||||
inCurCol += 1
|
||||
elif inParseState == self._ParseState.PS_CHAR:
|
||||
inCurCol += 1
|
||||
if inChar == "":
|
||||
inCellState = self._flipCellStateBit( \
|
||||
inCellState, self._CellState.CS_BOLD)
|
||||
elif inChar == "":
|
||||
inParseState = self._ParseState.PS_COLOUR_DIGIT0
|
||||
elif inChar == "":
|
||||
inCellState = self._flipCellStateBit( \
|
||||
inCellState, self._CellState.CS_ITALIC)
|
||||
elif inChar == "":
|
||||
inCellState |= self._CellState.CS_NONE
|
||||
inCurColours = [15, 1]
|
||||
elif inChar == "":
|
||||
inCurColours = [inCurColours[1], inCurColours[0]]
|
||||
elif inChar == "":
|
||||
inCellState = self._flipCellStateBit( \
|
||||
inCellState, self._CellState.CS_UNDERLINE)
|
||||
else:
|
||||
inRowCols += 1
|
||||
outMap[inCurRow].append([*inCurColours, inCellState, inChar])
|
||||
elif inParseState == self._ParseState.PS_COLOUR_DIGIT0 \
|
||||
or inParseState == self._ParseState.PS_COLOUR_DIGIT1:
|
||||
if inChar == "," \
|
||||
and inParseState == self._ParseState.PS_COLOUR_DIGIT0:
|
||||
if (inCurCol + 1) < inMaxCol \
|
||||
and not inLine[inCurCol + 1] in set("0123456789"):
|
||||
inCurColours = self._parseCharAsColourSpec( \
|
||||
inCurColourSpec, inCurColours)
|
||||
inCurColourDigits = 0; inCurColourSpec = "";
|
||||
inParseState = self._ParseState.PS_CHAR
|
||||
else:
|
||||
inCurCol += 1
|
||||
inCurColourDigits = 0; inCurColourSpec += inChar;
|
||||
inParseState = self._ParseState.PS_COLOUR_DIGIT1
|
||||
elif inChar in set("0123456789") \
|
||||
and inCurColourDigits == 0:
|
||||
inCurCol += 1
|
||||
inCurColourDigits += 1; inCurColourSpec += inChar;
|
||||
elif inChar in set("0123456789") \
|
||||
and inCurColourDigits == 1 \
|
||||
and inCurColourSpec[-1] == "0":
|
||||
inCurCol += 1
|
||||
inCurColourDigits += 1; inCurColourSpec += inChar;
|
||||
elif inChar in set("012345") \
|
||||
and inCurColourDigits == 1 \
|
||||
and inCurColourSpec[-1] == "1":
|
||||
inCurCol += 1
|
||||
inCurColourDigits += 1; inCurColourSpec += inChar;
|
||||
else:
|
||||
inCurColours = self._parseCharAsColourSpec( \
|
||||
inCurColourSpec, inCurColours)
|
||||
inCurColourDigits = 0; inCurColourSpec = "";
|
||||
inParseState = self._ParseState.PS_CHAR
|
||||
inMaxCols = max(inMaxCols, inRowCols)
|
||||
inLine = self.inFile.readline()
|
||||
inSize[0] = inMaxCols; self.inSize = inSize; self.outMap = outMap;
|
||||
self.inFile.close()
|
||||
# }}}
|
||||
# {{{ __init__(self, inFile): initialisation method
|
||||
def __init__(self, inFile):
|
||||
self.inFile = inFile; self.inSize = self.outMap = None;
|
||||
self.fromTextFile(inFile)
|
||||
# }}}
|
||||
|
||||
# vim:expandtab foldmethod=marker sw=4 ts=4 tw=120
|
@ -1,35 +0,0 @@
|
||||
# ENNTool -- mIRC art animation tool (for EFnet #MiRCART) (WIP)
|
||||
Copyright (c) 2018 Lucio Andrés Illanes Albornoz <<lucio@lucioillanes.de>>
|
||||
This project is licensed under the terms of the MIT licence.
|
||||
|
||||
## Installation instructions on Windows
|
||||
1. Install Python v>=3.5.x[[4](#r4)]
|
||||
2. Install script dependencies w/ the following elevated command prompt command line:
|
||||
`pip install chardet numpy Pillow PyOpenGL wxPython`
|
||||
3. Download OpenCV wheel[[1](#r1)] and install w/ the following elevated command prompt command line:
|
||||
`pip install <path to OpenCV wheel>`
|
||||
|
||||
## How to run
|
||||
```
|
||||
usage: ENNTool.py
|
||||
[-A] [-f fps] [-h] [-o fname]
|
||||
[-p] [-r WxH] [-R WxH] [-s fname]
|
||||
[-S] [-v] [--] fname..
|
||||
|
||||
-a........: select animation mode (UNIMPLEMENTED)
|
||||
-f fps....: set video FPS; defaults to 25
|
||||
-h........: show this screen
|
||||
-o fname..: output video filename; extension determines video type
|
||||
-p........: play video after rendering
|
||||
-r WxH....: set video resolution; defaults to 1152x864
|
||||
-R WxH....: set MiRCART cube resolution; defaults to 0.1x0.2
|
||||
-s fname..: input script filename
|
||||
-S........: select scrolling mode
|
||||
-v........: be verbose
|
||||
```
|
||||
|
||||
## References
|
||||
``Wed, 04 Jul 2018 09:33:53 +0200 [1]`` <a href="https://www.lfd.uci.edu/~gohlke/pythonlibs/#opencv" id="r1">Python Extension Packages for Windows - Christoph Gohlke</a>
|
||||
``Wed, 04 Jul 2018 09:38:28 +0200 [2]`` <a href="https://github.com/cisco/openh264/releases" id="r2">Releases · cisco/openh264 · GitHub</a>
|
||||
``Wed, 04 Jul 2018 09:49:38 +0200 [3]`` <a href="https://github.com/opencv/opencv/issues/6080" id="r3">opencv_ffmpeg and OpenH264-x.y.z · Issue #6080 · opencv/opencv · GitHub</a>
|
||||
``Wed, 04 Jul 2018 10:24:12 +0200 [4]`` <a href="https://www.python.org/downloads/windows" id="r4">Python Releases for Windows | Python.org</a>
|
Before Width: | Height: | Size: 1.5 MiB |
@ -1,36 +0,0 @@
|
||||
0,1 3,3 0,1 9,9 0,1 9,9 0,1 9,9 0,1 9,9 0,1 9,9 0,1 9,9 0,1 9,9 0,1 3,3 0,1 0,0 1,1 0,1 0,0 0,1 9,9 0,1 9,9 0,1 9,9 0,1 9,9 0,1 9,9 0,1 9,9 0,1 9,9 0,1 9,9 0,1 9,9 0,1 9,9 1,1 9,9 1,1 9,9 1,1 0,1 9,9 0,1 9,9 0,1 9,9 0,1 9,9 0,1 9,9 0,1
|
||||
3,3 0,1 3,3 0,1 9,9 0,1 9,9 1,1 9,9 0,1 9,9 0,1 9,9 0,1 9,9 0,1 9,9 0,1 9,9 0,1 0,0 0,1 0,0 0,1 0,0 0,1 9,9 0,1 9,9 0,1 9,9 0,1 9,9 0,1 9,9 0,1 9,9 0,1 1,1 9,9 0,1 9,9 1,1 0,1 9,9 0,1 9,9 0,1 9,9 0,1 9,9 0,1
|
||||
0,1 3,3 0,1 9,9 0,1 11,11 10,10 11,11 0,1 9,9 0,1 9,9 0,1 3,3 0,1 3,3 0,1 0,0 0,1 0,0 0,1 0,0 0,1 9,9 0,1 9,9 0,1 9,9 0,1 1,1 9,9 0,1 1,1 0,1 9,9 0,1 9,9 0,1
|
||||
0,1 3,3 0,1 3,3 0,1 10,10 11,11 10,10 11,11 10,10 0,1 3,3 0,1 3,3 0,1 0,0 0,1 3,3 0,1 3,3 0,1 1,1 3,3 1,1 3,3 1,1 9,9 1,1 9,9 1,1 3,3 1,1 3,3 1,1 0,1 3,3 0,1 3,3 0,1
|
||||
9,9 1,1 3,3 1,1 10,10 11,11 10,10 11,11 10,10 1,1 0,0 1,1 11,11 1,10 1,1 11,11 1,1 3,3 1,1 9,9 1,1 3,3 1,1 11,11 1,1 1,10 11,11 0,1 9,9
|
||||
9,9 1,1 10,10 11,11 10,10 11,11 10,10 11,11 1,1 3,3 1,1 11,11 1,10 1,1 11,11 1,1 3,3 1,1 3,3 1,1 11,11 1,1 1,10 11,11 0,1 9,9
|
||||
9,9 1,1 10,10 11,11 10,10 11,11 10,10 1,1 8,8 1,1 11,11 1,10 1,1 11,11 1,1 3,3 1,1 11,11 1,1 1,10 11,11 1,1 0,1 9,9
|
||||
9,9 1,1 11,11 10,10 11,11 10,10 11,11 10,10 11,11 10,10 1,1 8,8 1,1 8,8 1,1 11,11 1,10 1,1 11,11 1,1 1,10 11,11 1,1 0,1 9,9
|
||||
9,9 1,1 11,11 10,10 11,11 10,10 11,10 10,10 11,11 10,10 1,1 8,8 1,1 8,8 1,1 11,11 1,10 1,1 1,10 11,11 1,1 0,1 9,9
|
||||
9,9 1,1 11,11 10,10 11,11 10,10 11,11 10,10 1,1 8,8 1,1 8,8 1,1 8,8 1,1 0,0 1,1 8,8 1,1 8,8 1,1 8,8 1,1 11,11 1,10 11,11 1,10 11,11 1,1 0,1 9,9
|
||||
1,3 9,9 1,1 11,11 10,10 11,11 10,10 11,11 1,1 8,8 1,1 8,8 1,1 8,8 1,1 0,0 1,1 0,0 1,1 8,8 1,1 8,8 1,1 8,8 1,1 11,11 10,10 11,11 1,1 0,1 9,9 1,3
|
||||
3,3 9,9 1,1 3,3 1,1 3,3 1,1 11,11 10,10 1,1 8,8 1,1 8,8 1,1 8,8 1,1 0,0 1,1 8,8 1,1 8,8 1,1 8,8 1,1 3,3 9,9 3,3 1,1 0,1 9,9 1,3
|
||||
3,3 9,9 1,1 3,3 1,1 3,3 1,1 3,3 1,1 3,3 1,1 8,8 1,1 8,8 1,1 8,8 1,1 0,0 1,1 8,8 1,1 8,8 1,1 0,0 1,1 8,8 1,1 8,8 1,1 8,8 1,1 3,3 9,9 1,1 0,1 9,9 1,3
|
||||
3,3 9,9 1,1 3,3 1,1 3,3 1,1 3,3 1,1 3,3 1,1 8,8 1,1 8,8 1,1 8,8 1,1 0,0 1,1 0,0 1,1 8,8 1,1 8,8 1,1 0,0 1,1 0,0 1,1 8,8 1,1 8,8 1,1 8,8 1,1 3,3 9,9 3,3 1,1 0,1 9,9 1,3
|
||||
3,3 9,9 1,1 9,9 1,1 9,9 1,1 9,9 1,1 7,7 8,8 1,1 8,8 1,1 8,8 1,1 0,0 1,1 8,8 1,1 0,0 1,1 8,8 1,1 8,8 1,1 8,8 1,1 9,9 3,3 1,1 0,1 9,9 1,3
|
||||
1,3 3,3 9,9 1,1 9,9 1,1 9,9 1,1 9,9 1,1 9,9 1,1 9,9 1,1 9,9 1,1 7,7 8,8 1,1 8,8 1,1 8,8 1,1 3,3 9,9 3,3 1,1 0,1 9,9 1,3
|
||||
11,11 3,3 9,9 1,1 7,7 8,8 1,1 8,8 1,1 8,8 1,1 8,8 1,1 3,3 9,9 1,1 0,1 9,9 1,3 11,11
|
||||
11,11 3,3 9,9 1,1 3,3 1,1 3,3 1,1 3,3 1,1 3,3 1,1 3,3 1,1 3,3 1,1 7,7 8,8 1,1 0,0 1,1 8,8 1,1 3,3 9,9 3,3 1,1 0,1 9,9 1,3 11,11
|
||||
11,11 1,3 3,3 9,9 1,1 9,9 1,1 9,9 1,1 9,9 1,1 9,9 1,1 9,9 1,1 7,7 8,8 1,1 8,8 1,1 9,9 3,3 1,1 0,1 9,9 1,3 11,11
|
||||
10,10 3,11 1,3 3,3 9,9 1,1 3,3 1,1 3,3 1,1 7,7 8,8 1,1 0,0 1,1 0,0 1,1 0,0 1,1 8,8 1,1 3,3 1,1 9,9 1,3 3,11 10,10
|
||||
10,10 3,11 1,3 3,3 9,9 1,1 3,3 1,1 3,3 1,1 3,3 1,1 3,3 1,1 3,3 1,1 7,7 8,8 8,1 1,1 8,1 8,8 1,1 9,9 3,3 1,1 9,9 1,3 3,11 10,10
|
||||
10,10 3,11 1,3 3,3 9,9 1,1 9,9 1,1 9,9 1,1 9,9 1,1 9,9 1,1 7,7 8,8 8,1 0,0 1,1 0,0 1,1 0,0 8,1 8,8 1,1 3,3 9,9 1,3 3,11 10,10
|
||||
10,10 3,11 3,3 9,9 7,7 8,8 8,1 1,1 8,1 8,8 7,7 9,9 3,3 1,3 3,11 10,10
|
||||
10,10 11,11 3,3 7,7 8,8 8,1 0,0 8,1 8,8 7,7 3,3 11,11 10,10
|
||||
10,10 11,11 3,3 9,9 7,7 8,8 8,1 8,8 7,7 9,9 3,3 11,11 10,10
|
||||
10,10 11,11 3,3 9,9 3,3 7,7 3,3 9,9 3,3 11,11 10,10
|
||||
10,10 11,11 3,3 9,9 3,3 11,11 3,3 9,9 3,3 11,11 10,10
|
||||
11,11 3,3 9,9 3,3 11,11 10,10 11,11 3,3 9,9 3,3 11,11
|
||||
11,11 3,3 9,9 3,3 11,11 10,10 11,11 10,10 11,11 3,3 9,9 3,3 11,11
|
||||
11,11 3,3 9,9 3,3 11,11 10,10 11,11 10,10 11,11 10,10 11,11 3,3 9,9 3,3 11,11
|
||||
11,11 3,3 9,9 3,3 11,11 10,10 11,11 10,10 11,11 3,3 9,9 3,3 11,11
|
||||
10,10 11,11 3,3 9,9 3,3 11,11 10,10 11,11 3,3 9,9 3,3 11,11 10,10
|
||||
10,10 11,11 3,3 9,9 3,3 11,11 3,3 9,9 3,3 11,11 10,10
|
||||
10,10 11,11 3,3 9,9 3,3 9,9 3,3 11,11 10,10
|
||||
10,10 11,11 3,3 9,9 3,3 11,11 10,10
|
||||
10,10 11,11 3,3 11,11 10,10
|
@ -1,59 +0,0 @@
|
||||
-------------------------------------------------------
|
||||
About The Cisco-Provided Binary of OpenH264 Video Codec
|
||||
-------------------------------------------------------
|
||||
|
||||
Cisco provides this program under the terms of the BSD license.
|
||||
|
||||
Additionally, this binary is licensed under Cisco’s AVC/H.264 Patent Portfolio License from MPEG LA, at no cost to you, provided that the requirements and conditions shown below in the AVC/H.264 Patent Portfolio sections are met.
|
||||
|
||||
As with all AVC/H.264 codecs, you may also obtain your own patent license from MPEG LA or from the individual patent owners, or proceed at your own risk. Your rights from Cisco under the BSD license are not affected by this choice.
|
||||
|
||||
For more information on the OpenH264 binary licensing, please see the OpenH264 FAQ found at http://www.openh264.org/faq.html#binary
|
||||
|
||||
A corresponding source code to this binary program is available under the same BSD terms, which can be found at http://www.openh264.org
|
||||
|
||||
-----------
|
||||
BSD License
|
||||
-----------
|
||||
|
||||
Copyright © 2014 Cisco Systems, Inc.
|
||||
|
||||
All rights reserved.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
|
||||
|
||||
1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
|
||||
|
||||
2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS” AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
-----------------------------------------
|
||||
AVC/H.264 Patent Portfolio License Notice
|
||||
-----------------------------------------
|
||||
|
||||
The binary form of this Software is distributed by Cisco under the AVC/H.264 Patent Portfolio License from MPEG LA, and is subject to the following requirements, which may or may not be applicable to your use of this software:
|
||||
|
||||
THIS PRODUCT IS LICENSED UNDER THE AVC PATENT PORTFOLIO LICENSE FOR THE PERSONAL USE OF A CONSUMER OR OTHER USES IN WHICH IT DOES NOT RECEIVE REMUNERATION TO (i) ENCODE VIDEO IN COMPLIANCE WITH THE AVC STANDARD (“AVC VIDEO”) AND/OR (ii) DECODE AVC VIDEO THAT WAS ENCODED BY A CONSUMER ENGAGED IN A PERSONAL ACTIVITY AND/OR WAS OBTAINED FROM A VIDEO PROVIDER LICENSED TO PROVIDE AVC VIDEO. NO LICENSE IS GRANTED OR SHALL BE IMPLIED FOR ANY OTHER USE. ADDITIONAL INFORMATION MAY BE OBTAINED FROM MPEG LA, L.L.C. SEE HTTP://WWW.MPEGLA.COM
|
||||
|
||||
Accordingly, please be advised that content providers and broadcasters using AVC/H.264 in their service may be required to obtain a separate use license from MPEG LA, referred to as "(b) sublicenses" in the SUMMARY OF AVC/H.264 LICENSE TERMS from MPEG LA found at http://www.openh264.org/mpegla
|
||||
|
||||
---------------------------------------------
|
||||
AVC/H.264 Patent Portfolio License Conditions
|
||||
---------------------------------------------
|
||||
|
||||
In addition, the Cisco-provided binary of this Software is licensed under Cisco's license from MPEG LA only if the following conditions are met:
|
||||
|
||||
1. The Cisco-provided binary is separately downloaded to an end user’s device, and not integrated into or combined with third party software prior to being downloaded to the end user’s device;
|
||||
|
||||
2. The end user must have the ability to control (e.g., to enable, disable, or re-enable) the use of the Cisco-provided binary;
|
||||
|
||||
3. Third party software, in the location where end users can control the use of the Cisco-provided binary, must display the following text:
|
||||
|
||||
"OpenH264 Video Codec provided by Cisco Systems, Inc."
|
||||
|
||||
4. Any third-party software that makes use of the Cisco-provided binary must reproduce all of the above text, as well as this last condition, in the EULA and/or in another location where licensing information is to be presented to the end user.
|
||||
|
||||
|
||||
|
||||
v1.0
|
BIN
assets/audio/roararab1.wav
Normal file
BIN
assets/audio/roararab2.wav
Normal file
BIN
assets/audio/roararab3.wav
Normal file
BIN
assets/audio/roararab4.wav
Normal file
BIN
assets/audio/roararab5.wav
Normal file
BIN
assets/audio/roararab6.wav
Normal file
BIN
assets/audio/roararab7.wav
Normal file
BIN
assets/audio/roararab8.wav
Normal file
BIN
assets/audio/roardaemon1.wav
Normal file
BIN
assets/audio/roarspoke1.wav
Normal file
BIN
assets/audio/roarspoke10.wav
Normal file
BIN
assets/audio/roarspoke11.wav
Normal file
BIN
assets/audio/roarspoke12.wav
Normal file
BIN
assets/audio/roarspoke13.wav
Normal file
BIN
assets/audio/roarspoke14.wav
Normal file
BIN
assets/audio/roarspoke15.wav
Normal file
BIN
assets/audio/roarspoke2.wav
Normal file
BIN
assets/audio/roarspoke3.wav
Normal file
BIN
assets/audio/roarspoke4.wav
Normal file
BIN
assets/audio/roarspoke5.wav
Normal file
BIN
assets/audio/roarspoke6.wav
Normal file
BIN
assets/audio/roarspoke7.wav
Normal file
BIN
assets/audio/roarspoke8.wav
Normal file
BIN
assets/audio/roarspoke9.wav
Normal file
BIN
assets/audio/roarvap0r1.wav
Normal file
BIN
assets/audio/roarvap0r2.wav
Normal file
BIN
assets/audio/roarvap0r3.wav
Normal file
BIN
assets/audio/roarvap0r4.wav
Normal file
BIN
assets/audio/roarvap0r5.wav
Normal file
BIN
assets/audio/roarvap0r6.wav
Normal file
BIN
assets/audio/roarvap0r7.wav
Normal file
BIN
assets/audio/roarvap0r8.wav
Normal file
BIN
assets/audio/roarviking1.wav
Normal file
BIN
assets/audio/roarviking2.wav
Normal file
BIN
assets/audio/roarviking3.wav
Normal file
BIN
assets/audio/roarviking4.wav
Normal file
BIN
assets/audio/roarviking5.wav
Normal file
BIN
assets/images/logo1.bmp
Normal file
After Width: | Height: | Size: 64 KiB |
BIN
assets/images/logo2.bmp
Normal file
After Width: | Height: | Size: 47 KiB |
BIN
assets/images/logo3.bmp
Normal file
After Width: | Height: | Size: 9.2 KiB |
BIN
assets/images/logo4.bmp
Normal file
After Width: | Height: | Size: 9.2 KiB |
BIN
assets/images/logo5.bmp
Normal file
After Width: | Height: | Size: 21 KiB |
BIN
assets/images/logo6.bmp
Normal file
After Width: | Height: | Size: 19 KiB |
BIN
assets/images/logo7.bmp
Normal file
After Width: | Height: | Size: 18 KiB |
BIN
assets/images/logo8.bmp
Normal file
After Width: | Height: | Size: 15 KiB |
BIN
assets/images/logo9.bmp
Normal file
After Width: | Height: | Size: 14 KiB |
BIN
assets/images/roar.png
Normal file
After Width: | Height: | Size: 45 KiB |
BIN
assets/images/toolCircle.png
Normal file
After Width: | Height: | Size: 360 B |
BIN
assets/images/toolClone.png
Normal file
After Width: | Height: | Size: 227 B |
BIN
assets/images/toolColoursFlip.png
Normal file
After Width: | Height: | Size: 221 B |
BIN
assets/images/toolCursor.png
Normal file
After Width: | Height: | Size: 203 B |
BIN
assets/images/toolDecrBrushH.png
Normal file
After Width: | Height: | Size: 271 B |
BIN
assets/images/toolDecrBrushHW.png
Normal file
After Width: | Height: | Size: 277 B |
BIN
assets/images/toolDecrBrushW.png
Normal file
After Width: | Height: | Size: 250 B |
BIN
assets/images/toolDecrCanvasH.png
Normal file
After Width: | Height: | Size: 265 B |
BIN
assets/images/toolDecrCanvasHW.png
Normal file
After Width: | Height: | Size: 289 B |
BIN
assets/images/toolDecrCanvasW.png
Normal file
After Width: | Height: | Size: 249 B |
BIN
assets/images/toolErase.png
Normal file
After Width: | Height: | Size: 253 B |
BIN
assets/images/toolFill.png
Normal file
After Width: | Height: | Size: 527 B |
BIN
assets/images/toolHideAssetsWindow.png
Normal file
After Width: | Height: | Size: 274 B |
BIN
assets/images/toolIncrBrushH.png
Normal file
After Width: | Height: | Size: 236 B |
BIN
assets/images/toolIncrBrushHW.png
Normal file
After Width: | Height: | Size: 290 B |
BIN
assets/images/toolIncrBrushW.png
Normal file
After Width: | Height: | Size: 232 B |
BIN
assets/images/toolIncrCanvasH.png
Normal file
After Width: | Height: | Size: 246 B |
BIN
assets/images/toolIncrCanvasHW.png
Normal file
After Width: | Height: | Size: 282 B |
BIN
assets/images/toolIncrCanvasW.png
Normal file
After Width: | Height: | Size: 236 B |
BIN
assets/images/toolLine.png
Normal file
After Width: | Height: | Size: 371 B |
BIN
assets/images/toolMove.png
Normal file
After Width: | Height: | Size: 213 B |
BIN
assets/images/toolObject.png
Normal file
After Width: | Height: | Size: 206 B |
BIN
assets/images/toolPickColour.png
Normal file
After Width: | Height: | Size: 279 B |
BIN
assets/images/toolRect.png
Normal file
After Width: | Height: | Size: 220 B |
BIN
assets/images/toolShowAssetsWindow.png
Normal file
After Width: | Height: | Size: 268 B |
BIN
assets/images/toolText.png
Normal file
After Width: | Height: | Size: 306 B |
11
assets/text/ImgurApiKey.py.template
Normal file
@ -0,0 +1,11 @@
|
||||
#!/usr/bin/env python3
|
||||
#
|
||||
# ImgurApiKey.py
|
||||
# Copyright (c) 2018, 2019 Lucio Andrés Illanes Albornoz <lucio@lucioillanes.de>
|
||||
# This project is licensed under the terms of the MIT licence.
|
||||
#
|
||||
|
||||
class ImgurApiKey(object):
|
||||
imgurApiKey = None
|
||||
|
||||
# vim:expandtab foldmethod=marker sw=4 ts=4 tw=120
|
@ -17,3 +17,5 @@ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
||||
|
||||
vim:ff=dos
|
11
assets/text/README.md
Normal file
@ -0,0 +1,11 @@
|
||||
# roar.py -- mIRC art editor for Windows & Linux (unmaintained reference implementation, do not use)
|
||||
* Prerequisites on Windows: install Python v3.7.x[1] and script dependencies w/ the following elevated command prompt command line:
|
||||
`pip install requests urllib3 wxPython`
|
||||
* Prerequisites on Linux: python3 (v3.7.x) && python-wx{gtk2.8,tools} on Debian-family Linux distributions
|
||||
* Screenshot:
|
||||

|
||||
|
||||
References:
|
||||
Fri, 05 Jan 2018 17:01:47 +0100 [1] Python Releases for Windows | Python.org <https://www.python.org/downloads/windows/>
|
||||
|
||||
vim:ff=dos tw=0
|