From a9ac67e6d69b5697bafc314772fec6ba34afd533 Mon Sep 17 00:00:00 2001 From: cecilkorik Date: Mon, 8 May 2017 13:10:48 -0700 Subject: [PATCH] General modernizations and porting to Python3 Included some missing files --- .hgignore | 5 + __init__.py | 18 +- asset.py | 2 +- camera.py | 2 +- config.py | 90 +++--- data/font/coure10.png | Bin 0 -> 1962 bytes data/font/coure10.tfd | 102 ++++++ data/font/micross20.png | Bin 0 -> 14615 bytes data/font/micross20.tfd | 102 ++++++ data/font/micross42.png | Bin 0 -> 35285 bytes data/font/micross42.tfd | 102 ++++++ data/font/monopro6.png | Bin 0 -> 1557 bytes data/font/monopro6.tfd | 102 ++++++ data/font/proggysquaresz12.png | Bin 0 -> 1717 bytes data/font/proggysquaresz12.tfd | 102 ++++++ data/font/proggytinysz12.png | Bin 0 -> 1578 bytes data/font/proggytinysz12.tfd | 102 ++++++ data/font/vgafix12.png | Bin 0 -> 1857 bytes data/font/vgafix12.tfd | 102 ++++++ data/tex/black.png | Bin 2795 -> 281 bytes data/tex/dralthi.png | Bin 0 -> 3653 bytes data/tex/nm_flat.png | Bin 2805 -> 298 bytes data/tex/plasma1.png | Bin 14532 -> 9919 bytes data/tex/plasma2.png | Bin 19707 -> 17537 bytes data/tex/star_sprite_main.png | Bin 0 -> 283 bytes data/tex/test1.png | Bin 19078 -> 17420 bytes data/tex/white.png | Bin 2805 -> 283 bytes data/tex/whitelight_static.png | Bin 0 -> 5487 bytes fonts.py | 422 ++++++++++++------------- gamedata.py | 552 ++++++++++++++++----------------- gametimer.py | 4 +- lesson6.py | 2 +- models.py | 6 +- physics.py | 4 +- platform.py | 18 +- platform_darwin.py | 32 +- refuge.py | 2 +- roc.py => roc_core.py | 0 roc_test.py | 31 +- shader.py | 439 +++++++++++++------------- tools/fontmaker.py | 186 +++++------ video.py | 5 +- 42 files changed, 1637 insertions(+), 897 deletions(-) create mode 100644 data/font/coure10.png create mode 100644 data/font/coure10.tfd create mode 100644 data/font/micross20.png create mode 100644 data/font/micross20.tfd create mode 100644 data/font/micross42.png create mode 100644 data/font/micross42.tfd create mode 100644 data/font/monopro6.png create mode 100644 data/font/monopro6.tfd create mode 100644 data/font/proggysquaresz12.png create mode 100644 data/font/proggysquaresz12.tfd create mode 100644 data/font/proggytinysz12.png create mode 100644 data/font/proggytinysz12.tfd create mode 100644 data/font/vgafix12.png create mode 100644 data/font/vgafix12.tfd mode change 100755 => 100644 data/tex/black.png create mode 100644 data/tex/dralthi.png mode change 100755 => 100644 data/tex/nm_flat.png mode change 100755 => 100644 data/tex/plasma1.png mode change 100755 => 100644 data/tex/plasma2.png create mode 100644 data/tex/star_sprite_main.png mode change 100755 => 100644 data/tex/test1.png mode change 100755 => 100644 data/tex/white.png create mode 100644 data/tex/whitelight_static.png rename roc.py => roc_core.py (100%) diff --git a/.hgignore b/.hgignore index 8cf0eac..280123e 100644 --- a/.hgignore +++ b/.hgignore @@ -1,3 +1,8 @@ syntax: glob *.pyc settings.cfg +lib +bin +include +pip-selfcheck.json +__pycache__ diff --git a/__init__.py b/__init__.py index 212c3b0..0f2d8f8 100755 --- a/__init__.py +++ b/__init__.py @@ -1,4 +1,4 @@ -import roc +from roc_core import * import universe import pipeline import inputs @@ -9,4 +9,18 @@ import enums import files import gametimer import shader -import video \ No newline at end of file +import video + +#from .universe import * +#from .pipeline import * +#from .inputs import * +#from .physics import * +#from .models import * +#from .gamedata import * +#from .enums import * +#from .files import * +#from .gametimer import * +#from .shader import * +#from .video import * +# + diff --git a/asset.py b/asset.py index b1c8071..a39a35c 100755 --- a/asset.py +++ b/asset.py @@ -1,5 +1,5 @@ -from gameobj import gameobj +from .gameobj import gameobj class asset_manager(object): def __init__(self): diff --git a/camera.py b/camera.py index 184c183..5e84c93 100755 --- a/camera.py +++ b/camera.py @@ -1,4 +1,4 @@ -from gameobj import game_object +from .gameobj import game_object import math from quat import * from py3dutil import vect diff --git a/config.py b/config.py index 77f5420..1e85d31 100644 --- a/config.py +++ b/config.py @@ -1,45 +1,45 @@ -import os -import files - -class configmanager(object): - def __init__(self): - self.filepath = None - self.data = {} - - def load(self): - self.filepath = os.path.join(files.get_basedir(), 'settings.cfg') - if not os.path.exists(self.filepath): - return - fd = open(self.filepath, 'r') - for x in fd: - x = x.strip() - if not '=' in x: - continue - x = x.split('=') - k = x[0].strip() - v = '='.join(x[1:]).strip() - self.data[k] = v - fd.close() - - - def save(self): - fd = open(self.filepath, 'w') - for k, v in self.data.items(): - fd.write("%s = %s\n" % (k, v)) - fd.close() - - def read_key(self, key): - if key in self.data: - return self.data[key] - else: - return None - - def write_key(self, key, value): - self.data[key] = value - -def init(): - global mgr - mgr = configmanager() - mgr.load() - -mgr = None +import os +import files + +class configmanager(object): + def __init__(self): + self.filepath = None + self.data = {} + + def load(self): + self.filepath = os.path.join(files.get_basedir(), 'settings.cfg') + if not os.path.exists(self.filepath): + return + fd = open(self.filepath, 'r') + for x in fd: + x = x.strip() + if not '=' in x: + continue + x = x.split('=') + k = x[0].strip() + v = '='.join(x[1:]).strip() + self.data[k] = v + fd.close() + + + def save(self): + fd = open(self.filepath, 'w') + for k, v in list(self.data.items()): + fd.write("%s = %s\n" % (k, v)) + fd.close() + + def read_key(self, key): + if key in self.data: + return self.data[key] + else: + return None + + def write_key(self, key, value): + self.data[key] = value + +def init(): + global mgr + mgr = configmanager() + mgr.load() + +mgr = None diff --git a/data/font/coure10.png b/data/font/coure10.png new file mode 100644 index 0000000000000000000000000000000000000000..45440c9c727eaa7a9a0189eb90179fc1a4182b5c GIT binary patch literal 1962 zcmV;b2UYlqP) z+mhtC3Pt4;^Z&n`^Kv|+X1Ht+y4Yq#R8*ynL6)$Dz}bEMe!r%1T~{laXUTZ@pG&%U z9Z?6+-SFS@8FJBcR1T5#=o{5>1gFmcnuGjWYZr5l`+WWXC#y}GF0M_-vdaPbCsG>Z ze&D!Hz1n{V!y23up!dFYHksuB7x`_SN1jmbJTmy6C(>#I>R_79`}!aGyoJAZ8aJSw zsCAS!FegpN(o)viCPz5g0b0YJaBJ`{^(=Unib1KmpV5Bj9@TLuhwFF23pcM=34iYcn?=8&A17x8Elk^xj!1u9V`_n<9 z?MDO3m5w$v7CUBu{(3Z`_UhG+ZGY+tY^97PV4WyHiAka!)W#5;` ziX|W#6-Nt15t%H!gTI~G4sb%|4P{4LxA)J?C1CZP+>&_$Vsdl|}jVInf&!M*5+zyaASSJoXswZ3L@npvUCk{UHWN;xkf;T%S$$2YysH~N&@f5)>hYZBi9UxLQla6VrRqln;h<#3v^dhU~ z7>EqSiek{r>pivoUqX9OTRq6u5=~ZR$ov840B9W^kNoRbU(FAx=x$=Z>FY%Xa4&DSsgm^npNKpTJhs#weuFzJzM>NI`F!1u8%9Kc-$aH+u^k}QwAck1k8@K zi=tRXRRdorwRhrz$u@#{(Cz3ZbybAoD$C*#q9u@fyfLz?VIrgbM_<4MMRHuO$z-I;HhLuRWsT+ zZXa${=Qvx9`OMj|^jMWX&p=pJysYYEV?Ixd0YB9l;bf>RC6c_7K(=!pTSGHRp9qo+>_W>mcy#oP=$Tcq8|~w? z8Q_UzI7!6TYnb5xo>7kA9k4tSr+QYSpf+T`y z8>Kd{lDR)i{Rb2IUchRkY^3IVyU|jzQoB9S*(rR_PmclUlRvwpE!7Ej*&1%glO2GY z>ZKx*cAfXU#%;g<&FR;cEEKI+1w(^Cts*8h76}%$shb0-ym{JV1-JD4J)1~2qfZ@L zd9-Xvm034^IhY#fKyTcVv!eMdJ04jn)`;qf2Al|K%TM+a5b?}3Z+;Qd3{(`kJhB>C zW(B!aYhL$R3MFNInOnqo3L z93U$hQY65AH!y2J>gj#}+!sT#GEkMtdH_$Z1{MjF1ALrvfRDrN0!D+k%)qZ=h@vQp wq9}@@D2k#eilQirq9}@@D2k#eilXrFH+y+*1@LO8o&W#<07*qoM6N<$f($0P#sB~S literal 0 HcmV?d00001 diff --git a/data/font/coure10.tfd b/data/font/coure10.tfd new file mode 100644 index 0000000..e14fb48 --- /dev/null +++ b/data/font/coure10.tfd @@ -0,0 +1,102 @@ +fontheader +32,128 +9,14 +13,8 +128,128 +charsizes +8,13 +8,13 +8,13 +8,13 +8,13 +8,13 +8,13 +8,13 +8,13 +8,13 +8,13 +8,13 +8,13 +8,13 +8,13 +8,13 +8,13 +8,13 +8,13 +8,13 +8,13 +8,13 +8,13 +8,13 +8,13 +8,13 +8,13 +8,13 +8,13 +8,13 +8,13 +8,13 +8,13 +8,13 +8,13 +8,13 +8,13 +8,13 +8,13 +8,13 +8,13 +8,13 +8,13 +8,13 +8,13 +8,13 +8,13 +8,13 +8,13 +8,13 +8,13 +8,13 +8,13 +8,13 +8,13 +8,13 +8,13 +8,13 +8,13 +8,13 +8,13 +8,13 +8,13 +8,13 +8,13 +8,13 +8,13 +8,13 +8,13 +8,13 +8,13 +8,13 +8,13 +8,13 +8,13 +8,13 +8,13 +8,13 +8,13 +8,13 +8,13 +8,13 +8,13 +8,13 +8,13 +8,13 +8,13 +8,13 +8,13 +8,13 +8,13 +8,13 +8,13 +8,13 +8,13 +8,13 diff --git a/data/font/micross20.png b/data/font/micross20.png new file mode 100644 index 0000000000000000000000000000000000000000..fac17ec45c68e19daacd46103697c1674e42f30b GIT binary patch literal 14615 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 literal 0 HcmV?d00001 diff --git a/data/font/micross20.tfd b/data/font/micross20.tfd new file mode 100644 index 0000000..2d133bf --- /dev/null +++ b/data/font/micross20.tfd @@ -0,0 +1,102 @@ +fontheader +32,128 +21,25 +11,9 +256,256 +charsizes +5,24 +6,24 +7,24 +13,24 +11,24 +17,24 +13,24 +4,24 +7,24 +7,24 +8,24 +11,24 +6,24 +7,24 +6,24 +6,24 +11,24 +12,24 +12,24 +11,24 +12,24 +11,24 +11,24 +11,24 +11,24 +11,24 +6,24 +6,24 +12,24 +11,24 +12,24 +12,24 +20,24 +15,24 +14,24 +14,24 +15,24 +14,24 +12,24 +15,24 +15,24 +6,24 +10,24 +14,24 +12,24 +17,24 +15,24 +16,24 +14,24 +16,24 +14,24 +13,24 +13,24 +15,24 +14,24 +19,24 +14,24 +14,24 +13,24 +6,24 +6,24 +6,24 +9,24 +11,24 +7,24 +11,24 +11,24 +10,24 +11,24 +11,24 +7,24 +11,24 +11,24 +4,24 +5,24 +10,24 +4,24 +16,24 +11,24 +12,24 +11,24 +11,24 +7,24 +11,24 +7,24 +11,24 +10,24 +15,24 +10,24 +10,24 +11,24 +7,24 +6,24 +8,24 +12,24 +6,24 diff --git a/data/font/micross42.png b/data/font/micross42.png new file mode 100644 index 0000000000000000000000000000000000000000..c4169e9354d89c17eb00a4f6ab03458e4872a0e9 GIT binary patch literal 35285 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%0AS2*tDXLu#P*EI| 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 literal 0 HcmV?d00001 diff --git a/data/font/micross42.tfd b/data/font/micross42.tfd new file mode 100644 index 0000000..f12cb08 --- /dev/null +++ b/data/font/micross42.tfd @@ -0,0 +1,102 @@ +fontheader +32,128 +43,49 +11,10 +512,512 +charsizes +11,48 +12,48 +15,48 +25,48 +23,48 +38,48 +28,48 +8,48 +15,48 +15,48 +16,48 +24,48 +12,48 +13,48 +12,48 +12,48 +24,48 +24,48 +23,48 +24,48 +24,48 +24,48 +24,48 +23,48 +24,48 +24,48 +12,48 +12,48 +24,48 +24,48 +24,48 +24,48 +42,48 +30,48 +27,48 +30,48 +30,48 +28,48 +26,48 +33,48 +30,48 +12,48 +21,48 +28,48 +23,48 +34,48 +30,48 +33,48 +28,48 +33,48 +30,48 +28,48 +26,48 +30,48 +28,48 +40,48 +28,48 +28,48 +26,48 +12,48 +12,48 +12,48 +20,48 +24,48 +14,48 +24,48 +23,48 +21,48 +23,48 +23,48 +13,48 +23,48 +24,48 +10,48 +12,48 +22,48 +10,48 +36,48 +24,48 +22,48 +23,48 +23,48 +15,48 +21,48 +12,48 +24,48 +21,48 +31,48 +21,48 +21,48 +21,48 +14,48 +11,48 +13,48 +25,48 +12,48 diff --git a/data/font/monopro6.png b/data/font/monopro6.png new file mode 100644 index 0000000000000000000000000000000000000000..64be62469388faa870b88bbbdfd2811c8ab4629a GIT binary patch literal 1557 zcmb7^`CHNl0LH(HVl%a-QF*Xzl?#(OQ&dbyOF=ZnSsvsOd4Q;SCV3`M)66+MDbKZ% z$Pf=y)Yf57D@6m#v_w$ppv=T0DDPbDKiK;`@B8`b{pJ1P&G+@e>g$^50sx?o^KkR~ zO4>JX0DsK~=#%{bpe@6>xgJZaR@Nv>>MZqglVWDpSz|kb#r*eKAd~8adMAVwv)Nm3 z?$82Ktco-1NwOPxJ8Jn+;mo|p&FR^*;!z_*a+2U&Xf^8D=NEE)n#6;iB6x1_HZ7ra zx;8es=`a5YkM44E6cFSSuT;IS920^Bn6Ns`fl=zo+;G zksrYcIy<i zB7xA!zR#XMKV+BqPyT_Tih3aNAa+l^S}C}gg>NXR+IPZD3(BkZ=L{P(HrO4`FY9k> z)v^U$$xC67Ev}TeP7O_c0v812RyC5Ogj~Wo7o`QyL6{=rr;nP8L}?!&e4j1AxTLpn(-6BcOaJc_ws86ZXZNpDoCtW>t_%E zP__K#3I!J%${4NhqI3dFyh}2$eUwq5XK0jDAdvXVGi78sx^44j7vY#Gs<^-$Ox+Og9OYCVtUzlHe_LmP? z__cs_)B{-4lqTj85VHCA1{pySh?Wg{b?m#0*w{Rn&V1)g$tv>Z5nv;+1p4LL-l1-*8#xCTzev#+dHi7vGU6KPn0QUG9KC_lCt6s;2#RE zh9DbJbV+)0qV_}GFuL&pF!BGh;1~LIAG>_gDQAsNW<|d`Qc$` z`aaST0wvfvHM75P64G%PM9ZXA5a;%0bNwRhHjuQ!BOxtY@Yx4C+i$@#%Xl;Im&3ZF zP2P+H_?i%l%kUP`?CeZ3lZdpzVC;eXF4 zsGQ(4Iw%3M0N5fX*u8&a{c)Hypu1UH(=PnFzJ?{`=iV)^1xBOXJjBAfBg9kb&#=Se}qe(O_VkETrYn{+rQcQ0L{*K-doS1EW1(Df= zazK^ERictn6i>@xVfN>d$%&^t<8M{@3hhAM~nQWi1!BSm6Z41Hq0}5e~3UL#Y##w!;&5Uw(Gd z%EgG>8NqfpAU`!@f1nGO>q7%?r{KbL6Pe^JS|D^7D;=hHxUU;RUv{63axRG|K zVNgRbvPlP>v%{Q^HCTBc1}vn^hshVW(FkAv`hN?u2wKa4IJ?g7zx=I>bN6v;JVa#t E3va#RrT_o{ literal 0 HcmV?d00001 diff --git a/data/font/monopro6.tfd b/data/font/monopro6.tfd new file mode 100644 index 0000000..5e7e64a --- /dev/null +++ b/data/font/monopro6.tfd @@ -0,0 +1,102 @@ +fontheader +32,128 +7,11 +13,8 +128,128 +charsizes +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 diff --git a/data/font/proggysquaresz12.png b/data/font/proggysquaresz12.png new file mode 100644 index 0000000000000000000000000000000000000000..50c2d01fdd0d5f4215d2e138f8c5851f970bb6d4 GIT binary patch literal 1717 zcmV;m21@yfP) z?UEcJ2u1Bw-v5;+KT>WP0s@MPJ@-^?ZD#yzMMSVS&*$?g63_FLFHHZGQXVG#=ljU^ zPxC9Vt`GS=lBZYJ(!N&Sk}l24V<>+eUIAD+0IhJ)cDQywDG5G_VzDtv6FZC(AV>bI1StnUh18(`KjnJs^E z@*na;`x9Zbr4*=LHh@LNT8~lEKHjq%W^9U@zt=x4JuQ&}F#FIegDfKxe!34^s9V5l z^_24A0r+}O#R8CC^2GvP>F8*feLjz`eUQpWmi%)K!$Uy=BMYNPMcmGZCyP#?dZgx9={>1TYz<7M$Yn< zNwW^9CI~aCSbP2}R6fPy2#R)%(t2k!0L?ct_^psz_V`y2?F!aHvDQdk`kGFWIcM$*X!VWM-7D|y|1rLC3jhFA5DVCs{+|tSQ!Iey@%Z_*JeJ$M zJy)vbl4mbns>55p*MI5rajdZbi!a-o-%>7`RrOm0J|%B30=Z+CccN(>ZTXShyC zB9ZBt&Ah<|s8}zIXcm22mz66gzZBnJ37gp>X8r7Ged!IBYjNqY#sX*_8q?R#yVil2 z@%Q)gjP%dr&!4>uag5Pd!_qv!MPST8K58t0HDWBj>|kH{(@CGLKV|x9Jg0!C=xS`n z$uo0lB-*(&(~pzRE;sb;;L{>`y8Rh4jGvpxzYnn56E}M;T|0_ut2X-DdkSHpp1{mf zyeb+g<=4`={L(Q`tN$2L8i0$QMGMmDLDTLnWL`WXQ~EFls^zKqytim-y<8g>KYQ=_ zyydy}rM_9(KZf_OglQ_;dR`wnN7J(0MNX*=OKiYfp3>`EHowXbyKe=j9f$xVVXUOI zZ+8Cg;VB1T6Rl=wKObkO2B}$B4WTQc3%;006?b#RC4Z!X4#V>-|l!fKuLXoma!t;>o1E_5|~$ z*Tca8Q~;zmTV_5>tEQJ{zRlMY@8e70eBOZy-kp@6@1cQNYx2?*_J? zrL+;A=66pZI3dv5|B&Bpd!U2I2%NbNrupi297ejy0t4?mbM{i00000 z000000000000000000000000000000000000000000000U@w0F|9<+G8G49L00000 LNkvXXu0mjfaPKv~ literal 0 HcmV?d00001 diff --git a/data/font/proggysquaresz12.tfd b/data/font/proggysquaresz12.tfd new file mode 100644 index 0000000..76db60f --- /dev/null +++ b/data/font/proggysquaresz12.tfd @@ -0,0 +1,102 @@ +fontheader +32,128 +8,12 +12,8 +128,128 +charsizes +7,11 +7,11 +7,11 +7,11 +7,11 +7,11 +7,11 +7,11 +7,11 +7,11 +7,11 +7,11 +7,11 +7,11 +7,11 +7,11 +7,11 +7,11 +7,11 +7,11 +7,11 +7,11 +7,11 +7,11 +7,11 +7,11 +7,11 +7,11 +7,11 +7,11 +7,11 +7,11 +7,11 +7,11 +7,11 +7,11 +7,11 +7,11 +7,11 +7,11 +7,11 +7,11 +7,11 +7,11 +7,11 +7,11 +7,11 +7,11 +7,11 +7,11 +7,11 +7,11 +7,11 +7,11 +7,11 +7,11 +7,11 +7,11 +7,11 +7,11 +7,11 +7,11 +7,11 +7,11 +7,11 +7,11 +7,11 +7,11 +7,11 +7,11 +7,11 +7,11 +7,11 +7,11 +7,11 +7,11 +7,11 +7,11 +7,11 +7,11 +7,11 +7,11 +7,11 +7,11 +7,11 +7,11 +7,11 +7,11 +7,11 +7,11 +7,11 +7,11 +7,11 +7,11 +7,11 +7,11 diff --git a/data/font/proggytinysz12.png b/data/font/proggytinysz12.png new file mode 100644 index 0000000000000000000000000000000000000000..d62117e7ee56a4ac4365693227f19156c3215c82 GIT binary patch literal 1578 zcmV+_2G#kAP) z>yG0f428*P-v5=eKXx->J-!2pNzW%$RpS^aI9v{N<~Yx@aU93d9JaHyc69Gvzg4!M zatMB0IsfxnS05Y89U9wTT^!aMQOoK^{f1#zR z<+Xj_j0V6#-Y;n5pTySt9gK}OdbB(w9I^$z`ff;RqjEgBSAv_L$Y z-ivL+${|3b4-6{^F1R6JWyRB;s?Y0aaxbFjEK_#)_Wgu6fEZ zPt5_I!V`3>@&TY8$3)5V{A+qt3NCG{h<6TH z9^H%P{bU1_A3D5~z|6L+r`z>R-Dzw>BmPd%Nn0&8jd@g+|rB zyKSWy83MNXk^lgKnNl!pkbEX$~$cX%krlRChPE_>B55J|J* zFeGyQE+AXzeoT(clKbmX-)yfD_0QJJmP0^BVvYED)0pAMrI9IT#BVf69|KY_0H4g8 zq~KrU?mrtl3wQWUFK0!*ntpzdew(LlQaLYND!1}^tXZ8hLn`R>-s6!GkNvtMt!u;uVCdLi$0s& z&|24ekax}xOk&2Li;p%+wrd@2{4K`hyRi<1R+BZo5;Jh(ITk)Dmu6(sh@9KQZD-Ro zti1;hlFxPlS@GAwSt6S}8NX2<0P0~$!Iq3F`O(YgUsLGczjY?lZ&o>}?N_>tgnTeI zHqDAu+zq@c{ccrqR43SyiUF{S>}2-USicL1*r;85qNFtGso!i_B%9R8mi@XXx)Lcb zTyZCYyayb$FQ+ZFI2#p)JSw2KoPD|ymVHF(E*%714{!%NDRQM7a1`m6L95xRLd!qJ zBX~{)OJghN=h65zKaD4~{MQCS^i*)fzS^cu`m$28<`b2ywO!3J>?Q@z-k7Si(FMT$ zyy;YMd0RzxQv!EdK5oHo0RSe${ns$B#2WGI?esigL|*Rgn)0V9mUq}FHT(Z&OTk(B z)e@Jadp&FI6_v^5o0W65`YOj$Lx2=SS7l$XS$XxFOj%7oO8Lfbt>zq{KMSyW(q}#8 zbhz@eMdPr0wuN=Ec!Ijvy(E<2@O2I$l9CJ$dC(50tW`Ae4p;Y>I=s%5$w!)Kp^k4!Nmx16$ z5C9*}6#yf`g)|IMH4j5YLHfObnUW{BIf7YUL00Ji)>%4G1k3?GoIU_vz3BmXXb%w8 z+0pm_000000000000000000000000000000000000000000000000000000000000 c007M358kosfzABya{vGU07*qoM6N<$f(yIv2><{9 literal 0 HcmV?d00001 diff --git a/data/font/proggytinysz12.tfd b/data/font/proggytinysz12.tfd new file mode 100644 index 0000000..5e7e64a --- /dev/null +++ b/data/font/proggytinysz12.tfd @@ -0,0 +1,102 @@ +fontheader +32,128 +7,11 +13,8 +128,128 +charsizes +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 diff --git a/data/font/vgafix12.png b/data/font/vgafix12.png new file mode 100644 index 0000000000000000000000000000000000000000..bc5b810b8a0b78c1cc2e2b512d508911ad3b919e GIT binary patch literal 1857 zcmV-H2fp};P) z>#`gx2uAHx-v5>7{5hQ%w!+87+sLX)WoI{y-HM39OrFo@Q#hXIDJk=PGB3Ya$@P5x z|C0>j_v#05P#eb6l}cDF9)O#b^jc50{yitt`nmr1)4ASiOY$VBx6!=+_Gk@&8Oh~XMN~V}SP=vCjEL*B+7L?l+0l=1|4ty@Pr4RHv;njRiq4kSK=yt{ zjG`X=UR%=4?LBJ^qNCNObbV?3q74GM&W`47>m#(qJK)B zk`ZV+hjz#cqi7AX$7>;Nu~?P>$yG{dV*q4kAd!A=xtUFLVCo`z8;F3!0B9SnC299y zu%1BNWI`qyy2b6X>q%fem{NeJ(c>`^^xoa#4i-xc5b zJ%E;aOE|inQuw`lEjJo>dnfDyc0=+;Gug3!l9PCL%TuS!9GRDIi2)KLX#khw2?CKb z_`=9U=+MYW&p?sdqt{VAQSTMP2oHef@}(jUNr$y&pvOc0NV1muSG*UC)dQgWPwl{u z#B%VfZ(>RX=$*edBplAM)45DW=t)!JVA-2UH-eLfn4v47K(X8Q7SxWAB`jxe$ zsO$cSFeLXx8MzCHaP`_s9!oJrYwaGjOtqe;7w~Oa5;pU!8=3iN2T|FX1Ka~OYE+*I zx&%bIQ}6vzhSuAHS+=FKL7ru55QugTP0u3tNNu+CM74wLxue=b^-S9-Q3Hswd{mDV zY(=%h$w#&|Q%0k!Yfu^wu!CDn^st_L_j-WDPfpyVPu2rmD)W-*;LAw^xSU=PXgv_I zW(lpib*ask9!vh+lEZJwM%4_^ckcCp_}ncI;5iLL&eElPH@%LW^-FC=<=>I_L+S!J znaFwo@i>_pKxBq$^l8@A!ikERZ4IYh0wPPN>LX8jz2y?o^X?h!wr?K#Jg)(uX;TfH z5uk0>G9E*SOmaoEHKK;W#A^W3U~!GD&a5GwfE02>5qZ`x8H#&3s+R!C2sE7*pys}a(B2__5j*EepEexM-R>ab2S4~uo^(biQk9(&B>g| z^1($|=>gs&Pc&z+J3AMObf3xkWznU~vF@l&tS@ZJd=NB(>z20set@6s z6mTZVSh61AQkj=qmVn6Ig;&p3+z~?!(>j$1>9~}!&q$q-k>p}T%02fFZph=9^g`$m)r(k&PoH&Y?)3t2s#q( zKaMO#9|X-j21eSN@%eE84p9kkoPR!2&?YHc-;R*uSBy%t5Pbh6~} zt$KRT!&PTN?P+2FO|pZ_L8Hl%*+~^z2-E94PafZ@hojd9)zj2RYXa%dr>vQ`rl8&V z5n2-V{(KUrK6eCCUPep?eZx6G26}zO618tIfKt*3%xM4j@Q6bhF6fCy+g4QFf~3!z z>qmfg9GdS3pfX4UEuGQjV&1lp`_OucsIv{r7S!}C-?9WGMl?%+)e(jnvUUzjiaP-H$kOGNWXg+;4ja`?3dR9jnCZ{LT_>W3V?P>s}{5u$@4F1b8 zMzFI1^x_h$9w~tnIatfrc9duXKwNh%(~CVc^>rNRKtvkBF@s;q&vY=C&qnjqvjR$M z{+*M%4w?0ew00000NkvXXu0mjf`;wC> literal 0 HcmV?d00001 diff --git a/data/font/vgafix12.tfd b/data/font/vgafix12.tfd new file mode 100644 index 0000000..a66ef11 --- /dev/null +++ b/data/font/vgafix12.tfd @@ -0,0 +1,102 @@ +fontheader +32,128 +9,16 +14,8 +128,128 +charsizes +8,15 +8,15 +8,15 +8,15 +8,15 +8,15 +8,15 +8,15 +8,15 +8,15 +8,15 +8,15 +8,15 +8,15 +8,15 +8,15 +8,15 +8,15 +8,15 +8,15 +8,15 +8,15 +8,15 +8,15 +8,15 +8,15 +8,15 +8,15 +8,15 +8,15 +8,15 +8,15 +8,15 +8,15 +8,15 +8,15 +8,15 +8,15 +8,15 +8,15 +8,15 +8,15 +8,15 +8,15 +8,15 +8,15 +8,15 +8,15 +8,15 +8,15 +8,15 +8,15 +8,15 +8,15 +8,15 +8,15 +8,15 +8,15 +8,15 +8,15 +8,15 +8,15 +8,15 +8,15 +8,15 +8,15 +8,15 +8,15 +8,15 +8,15 +8,15 +8,15 +8,15 +8,15 +8,15 +8,15 +8,15 +8,15 +8,15 +8,15 +8,15 +8,15 +8,15 +8,15 +8,15 +8,15 +8,15 +8,15 +8,15 +8,15 +8,15 +8,15 +8,15 +8,15 +8,15 +8,15 diff --git a/data/tex/black.png b/data/tex/black.png old mode 100755 new mode 100644 index 31d8067b01c0aca9cffa6bc4fb048085e1fb9d92..1090894c046636ad8e9ddc3ffb8220faa1485a74 GIT binary patch delta 204 zcmaDYI+JOFgd`&a5SVuyIs>Fw(j9#r85lP9bN@+Xojj3CpPMPk+uenM@oty!l8K7q z^$hGKp1!W^4_VoT&D0pX?z{(T;_-BG4B@z*oS?u9Za1rd PIv6}%{an^LB{Ts5+r~Bu delta 2756 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 KMNUMnLSTYo=qj85 diff --git a/data/tex/dralthi.png b/data/tex/dralthi.png new file mode 100644 index 0000000000000000000000000000000000000000..408167e4f0c29a2c80ca049e6d4b564878573aa5 GIT binary patch literal 3653 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 literal 0 HcmV?d00001 diff --git a/data/tex/nm_flat.png b/data/tex/nm_flat.png old mode 100755 new mode 100644 index 1b82345b4845f31a57bfe6b0aaf7422b3ae348ac..22f4692eb2d2c17cca1f272372e875ae36acb3fb GIT binary patch delta 221 zcmew=x{7Ingd`&~0|SGqZLSiKVo7)Ob!1@J*w6hZk#+J!E`1rc0G|-ohKBz@aHY#O z4XB1O$=lt9@jsL9y@`tA^$hGKp1!W^4_VoT&D0pX?z{)8;PG^E4B@z*oS?u9Za1rdIv6}%{an^LB{Ts5Dz!ZV delta 2766 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 UA7mG{=l}o!07*qoM6N<$f|~U(GXMYp diff --git a/data/tex/plasma1.png b/data/tex/plasma1.png old mode 100755 new mode 100644 index 70c2ad08b3b6e23a3548830cea2f81c4a486d974..46d9a19118797b0fed0471d723be2a9758d56242 GIT binary patch literal 9919 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 literal 14532 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 diff --git a/data/tex/star_sprite_main.png b/data/tex/star_sprite_main.png new file mode 100644 index 0000000000000000000000000000000000000000..1dc8b779b93fd10f979a15675d513c3fca2ea543 GIT binary patch literal 283 zcmeAS@N?(olHy`uVBq!ia0vp^0wBx?BpA#)4xIr~Ea{HEjtmSN`?>!lvI6-E$sR$z z3=CDO3=9p;3=BX21L>Cx45bDP46hOx7_4S6Fo@?*ia+WGRLhj)?e4{b%hmv8R7+eVN>UO_QmvAUQh^kMk%6JPu7RnpfklX+ft87+l_`*GZe?KLYODzI f6+%O9eoAIqC2kESc{8^GH86O(`njxgN@xNAmP|%D literal 0 HcmV?d00001 diff --git a/data/tex/test1.png b/data/tex/test1.png old mode 100755 new mode 100644 index 6cdfb488726e6b334ef1851fadeda8b9511ac567..0ce9fa3795cf635753f7d5ef15b5dbdbf1475dce GIT binary patch literal 17420 zcmV*2KzF~1P)004R=004l4008;_004mL004C`008P>0026e000+nl3&F}00006 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 M>FVdQ&MBb@0CU7LZU6uP literal 19078 zcmV)MK)An&P)KLZ*U+IBfRsybQWXdwQbLP>6pAqfylh#{fb6;Z(vMMVS~$e@S=j*ftg6;Uhf59&ghTmgWD0l;*T zI709Y^p6lP1rIRMx#05C~cW=H_Aw*bJ-5DT&Z2n+x)QHX^p z00esgV8|mQcmRZ%02D^@S3L16t`O%c004NIvOKvYIYoh62rY33S640`D9%Y2D-rV&neh&#Q1i z007~1e$oCcFS8neI|hJl{-P!B1ZZ9hpmq0)X0i`JwE&>$+E?>%_LC6RbVIkUx0b+_+BaR3cnT7Zv!AJxW zizFb)h!jyGOOZ85F;a?DAXP{m@;!0_IfqH8(HlgRxt7s3}k3K`kFu>>-2Q$QMFfPW!La{h336o>X zu_CMttHv6zR;&ZNiS=X8v3CR#fknUxHUxJ0uoBa_M6WNWeqIg~6QE69c9o#eyhGvpiOA@W-aonk<7r1(?fC{oI5N*U!4 zfg=2N-7=cNnjjOr{yriy6mMFgG#l znCF=fnQv8CDz++o6_Lscl}eQ+l^ZHARH>?_s@|##Rr6KLRFA1%Q+=*RRWnoLsR`7U zt5vFIcfW3@?wFpwUVxrVZ>QdQz32KIeJ}k~{cZZE^+ya? z2D1z#2HOnI7(B%_ac?{wFUQ;QQA1tBKtrWrm0_3Rgps+?Jfqb{jYbcQX~taRB;#$y zZN{S}1|}gUOHJxc?wV3fxuz+mJ4`!F$IZ;mqRrNsHJd##*D~ju=bP7?-?v~|cv>vB zsJ6IeNwVZxrdjT`yl#bBIa#GxRa#xMMy;K#CDyyGyQdMSxlWT#tDe?p!?5wT$+oGt z8L;Kp2HUQ-ZMJ=3XJQv;x5ci*?vuTfeY$;({XGW_huIFR9a(?@3)XSs8O^N5RyOM=TTmp(3=8^+zpz2r)C z^>JO{deZfso3oq3?Wo(Y?l$ge?uXo;%ru`Vo>?<<(8I_>;8Eq#KMS9gFl*neeosSB zfoHYnBQIkwkyowPu(zdms`p{<7e4kra-ZWq<2*OsGTvEV%s0Td$hXT+!*8Bnh2KMe zBmZRodjHV?r+_5^X9J0WL4jKW`}lf%A-|44I@@LTvf1rHjG(ze6+w@Jt%Bvjts!X0 z?2xS?_ve_-kiKB_KiJlZ$9G`c^=E@oNG)mWWaNo-3TIW8)$Hg0Ub-~8?KhvJ>$ z3*&nim@mj(aCxE5!t{lw7O5^0EIO7zOo&c6l<+|iDySBWCGrz@C5{St!X3hAA}`T4 z(TLbXTq+(;@<=L8dXnssyft|w#WSTW<++3>sgS%(4NTpeI-VAqb|7ssJvzNHgOZVu zaYCvgO_R1~>SyL=cFU|~g|hy|Zi}}s9+d~lYqOB71z9Z$wnC=pR9Yz4DhIM>Wmjgu z&56o6maCpC&F##y%G;1PobR9i?GnNg;gYtchD%p19a!eQtZF&3JaKv33gZ<8D~47E ztUS1iwkmDaPpj=$m#%)jCVEY4fnLGNg2A-`YwHVD3gv};>)hAvT~AmqS>Lr``i7kw zJ{5_It`yrBmlc25DBO7E8;5VoznR>Ww5hAaxn$2~(q`%A-YuS64wkBy=9dm`4cXeX z4c}I@?e+FW+b@^RDBHV(wnMq2zdX3SWv9u`%{xC-q*U}&`cyXV(%rRT*Z6MH?i+i& z_B8C(+grT%{XWUQ+f@NoP1R=AW&26{v-dx)iK^-Nmiuj8txj!m?Z*Ss1N{dh4z}01 z)YTo*JycSU)+_5r4#yw9{+;i4Ee$peRgIj+;v;ZGdF1K$3E%e~4LaI(jC-u%2h$&R z9cLXcYC@Xwnns&bn)_Q~Te?roKGD|d-g^8;+aC{{G(1^(O7m37Y1-+6)01cN&y1aw zoqc{T`P^XJqPBbIW6s}d4{z_f5Om?vMgNQEJG?v2T=KYd^0M3I6IZxbny)%vZR&LD zJpPl@Psh8QyPB@KTx+@RdcC!KX7}kEo;S|j^u2lU7XQ}Oo;f|;z4Ll+_r>@1-xl3| zawq-H%e&ckC+@AhPrP6BKT#_XdT7&;F71j}Joy zkC~6lh7E@6o;W@^IpRNZ{ptLtL(gQ-CY~4mqW;US7Zxvm_|@yz&e53Bp_lTPlfP|z zrTyx_>lv@x#=^!PzR7qqF<$gm`|ZJZ+;<)Cqu&ot2z=0000WV@Og>004R=004l4008;_004mL004C`008P>0026e000+nl3&F} z002L+Nkl(8lhv z+uirEUn?K`an@S%vDU6`OZm9frRut;&SO93nscr(#~jl*=ZpaW=kWOJ@z-noT5QPx zj}7Ya*X#dPJiY{vzrGM();T;5g^#~p_fTlVM~yKCFvb8dMF9h2jG6vm42&tv@Hmc>D2ifwn__%ud~#6~FlPSS^1tz~ zMKM3SC=84#i*kOa@q^0w31)n3`fqwk@SdgrUgQ5z6s7T>SuO{&e7Gr!a=ZjZQ5J_| z8$S-?QPcTke-R{44k)493&&{#h9R zx#NuwZux8rnN8144|tXb2WMam3}6m_H1kj60B3;dLyVgZc6zn(o;v;C z83(xKq3P8C;KtX@N92~zGu}Z>OT;@=;|^~Qm@$ns^CtslJgUV*Pp>8C>&%pZI(Ime z@x8s5n)#>y-Z0L&`LxGpx_K$P@f4>Q88aW__$u$X=g)&1k9E12IQ(NdWoHftF~7Hi z_uhvCbpHJ`&cOlBIpaLTa4`NW54X{~^y6WT&oVCh94^N?Ts3FBcNs5=apN1hz~bh6 zGuntVn0E!!8@Ty0y7}ascL~h+Y&TuR!zG+9==k=N#f=9tSzB<8f@61{9Zr{de8?;x zFj{R+24LKB2=ls_SD$gyJHmLkbbNE?-N^Y|j5}Dqn@)Ezau?o!Wr>ZqdA73oRE!w| zO1K*5!*i1cajEXT;FbT z(U);!uNuR%)ko};Tjpu!GBw~Ts>nZ!=2r%nUBet z!|F5$OnvbyCOo$>$2Mj*UvJ$W;+8wCF7GJawD9B4;S9?y9|~t+T;R@)o0i<@xZuwy2On6a@^N(+GR-^BqUu>LP7D2p?GTyD5jem4{(~Vjj zkbmml`WO$+EO&HX{BF7EOLSjWAn_Vg=IzI5&ywc5=2VYm7Pmj%V$TJdDaIM!cf|K` zxwLLco7~~`fh#Z|{%g9*5bu5lOA5w!5zhN?cQDi0yv*X$%;9FbL!vq^`opJ~(DAt_`JF#&^mcB! z=7-Sh4weVHHr?`k&(D}3pCzv;xP-zx7jua9Zc2dN!K9-c$4s}_%cxvrw2OT@E;Smj zlyQMW@GRBOn&GBv>=};>vJ~h2&zQNuU_2*gu*91sF%4s?|Bl{T_fy<4M=((sH;2P_ z2D5{iSH~f5Jft0d&~t}V3M21wQpUesfvq@%0o@pXx8U5eD>CyI3kT01Spk+j#T;^1 zbNECzhZ+;-sv1BV>;VpuHop7__iQfo8eTkKk`ZT&Sv-|lPH}Ncp?e!|_d);v9|h#?P#<#A)_g9X@2q1Kr|o5M;p9M;qs*MUjCYHZD<$ zjwQD=CQ8)~m)%8C=#cBVgB=GS>m@{H$z`Vt3HF>_WDX&Y}1a1H~=f|(lPrC*@0XzY0#qtpaB}-5%36j zIDbEwzaIkkyHm2%_VT#&9PWKV*c1 zlCB{=wp(L=Mm1XpvUQ8Dm6NPQ{dl8XWW%i` zM^+vCE>6EsZq2fc&eG*A7B$C`mPb~RJHjubqf&04vV_d4kIg&(jKgQG%0u_~Tby%z zE_@%Rq(O?2+LANjlO6js4k}63wtRBJ>Y7!_De{a?};tY=k+1ISd zDjc~9^er6sO#i|;E==%C!Kn$IOD%uiR~Qn^jj&(INq`-9haKd!o&8Amv`mICUXkE9 z?vX2nLYL>g47aF^@>+d6V1x@H1w@y*fSjDFo76thNlwe9HZ=Z%+G{fVPeA~o0MbIBtx=BDNH*#Ep_s`Ok5gd-pZW4nv(-uCa%K9Q=>#& zBV=bz$jB4fxyyJ2*~@2T@}9Y~bb@(B&e*wd!I_NAmfDa>!BV;2-3hneCF6ONZfBlH zer{r@@hT{iA=?L&k-{>|#;6cX&hBabu2BEL+{Dl10ZE3W5&EsuKHIF!8w|;H>DDq4 zi(KC4v5B~&@q%64I>6}Ed|!0uPL7~SAAKbpE5}x)tzP^%-L@!@PI6OhBp5J)@+4T# z=v5|+aF)`p8BE)`Hsj$bu$AabeI;W%$+^z756t_BE#_1XYZC)kk7 z0HK0+Fd0~(%g7a62Kd2WtYknng3mN82w=FQcB&^#22i8>4yW#4*}V#HIVQt@n-omy z(%6mev0O$DtN;y$G@kH@vg169S+i5oFaf7J1f^)AMFkc^cd1>!;i7s_r!;bmlRnJl zp&-r=AIL5i=*fzl=bFc&AdkOZ$FIef9uxf@e|t>kkX$Wsy7ygXwDYB1l zX24RbqNdh)&t!j&AKDVj9*Au@z!l!IUB0XEGW%DW8i#K*o0Od`?@*JwXT6UuiTTKe zwULu?WqVqNCPi0}73_(cPAxxPafU@!P+(hyo2|;fRf- z87(e~I;Wa5rdo~%)MJ&ohILJKPEy;eC8?Ekq8qYsHnM-(aMvkXO3||QeHHu&xVQw? zSNR^L<>Fu~e=CtuvZsz5#uD|G<8&b5&%ewi34d%lrDs%Z1oT~$5)zg?Hrud#98F@$ zIuZ&ad!{Gqhy6NiMXBUaSaCs+y5=~q8pzV8LD0`~A|q(RUzFUOeP+w$YPw1J?rH*z zd`DG;=gRu3n#-Dn>xJ(AmIvwM)JxUGOD(5c zELPQfsk#&a=>|~AuB1I6>)3qL^ml))Y*Neyu;9X<<@QCjya$vL_Kob}DzfQ{KK-!O zUJ(j!s^wY9;39Wf%Z62R9*d2AY*tyS(LS)M-h&ke0aIXOU*v(LsHf!Votjidsnrsu z$Jjk>01Gbs(QKV=xNT@OoB1ZN&S?{F{c6snEN4W(); zYQ<*pH2AZjJ^(nJ2P^a;Smh^JlCM&{l%8WrIawd>{yI7QE#C)Nq2SUf{~FYx$EpNy zp;nh_#bp^bL>AZxI2zV;QL_x|NiMZY*0n1c0@WQ=CFE89@0RndqSI@zft zp{eKzio2p-swGHO7oux09IOyQpp~3%D7lpGx-8iMO1^5bc;mbSuku4-4)rneSnMfQ zDQHSc)%7iJWL2@R>Pc!9-CYWScB%bcE1;u#9PCM6bbmXkgUp&fH}TO3V&?0sMNhs#qIuRURC(MYPDfWbsK$GNRhaD4Ypo!)dU**s&F}* zfdK1l5zw!kw5p@()I_QwTfd&XRT5SRtjchyIz`nhE^^f*?`De>8`%*3*OpucTZF3^ z3*_uy@^yxVH5Nu!3R?=S1)xFS@``?$t<~sBRTmmWzDY@s&{}dwcAx{Xs(y|oajIU1 zU={UMvM+=vCu zrG%a4=`^nz!UD4hRuw`K(2^UUQvsBU%1L0|H|0Wy6$W9$jn@%wka8?`(-*;{?3zl# z3N`|(`aHf~l(y>_RU>5R9had?30BX2GaMKj;tP~SAZ-9?&QuGj`i78aEO(77vULbH zfPIR_mRl<{sge%;+6XCm6be}mOwA#5)GrqfrWZUi>#JB6Xe(f$`UbG&?5SH*R~Er4 zOUQZ@|EyF$R0|n;t=9f%`kJsR1suc`N;*bvWO2k}>1aZdTTE9_0Ic_N_SkdIBTCy@ z$J21^JZfQmDyh=z%KgGtC{i4lnhSyoQl-!qtdO`?Qc27^yckxXCe^JCh1ahn;kO~M zf|ciL9y<$W;;t#igSRuN`KMORR-vOwwbX$4Gy5<&F>PN%Z=dVvGe zk*vfSm9M9?n^-x<#othXa&(v?<1y&!$$3^(aV38uzbp;wT1?l zPViDogrb!eCDL^=Yfqx=4Fm%1h+7T7Di&C;QY=swSeLS^io?33%WR3SDliA_p5q)* zlUiq3n>>D>A%<0{Z8ntvR{2!OApAwJ!oYEur0R03ZtL`|pH%IkE~-;^e}Ppgb!E%7 zEl5Z~lDZyU=8{X*OO6FPS=B&J!uM6tWoTC=?==U9BBcef$*a}SBA`@PE(XE@@6-gc zQ)yMwF0T>(+7TA0?+$6hR!8c}Ov6?(sj|Wvtc9L|N_c+7xkJlkc!dvv_916M!EpL; zxn&sE0Bhv_e|fx<#AQfsd`q(BjbR1pL|ejBXoc|CaQLV0x;pOtS!6#-)%zr@phKY2 z){iaG(DbX~R;~nA#T=NZLZ&3K5$c>_SnbNKAVJ0c4ZU91Xc|hOSt1WY`vGwW*AnJmr`+tCDm|P zDs{<5d$xS=)3|quOXqoN|1RFZ(Rbsvlp8f_Pehkdx>0=91Kf2uDsVesR?!OJ)GoZo z{pY99^UQOoj^oxiOQ>iY!I)~b2_m^ET1q!?WDnS-$ZT!6klS33^+@RaVo}j2nO&j8 z=b$yurMc8nwt~NK-jC-$h@EuwC)jRryGu39_@>4_q2~-s2df_9w7}NlcEGIiE4bq= z9M@5|$4jTvK|g(h>R9wrN@cZ@^D3RcZ9TR^0<7v&txWV{XB$?2caG<=Hu8B}kD_5Y zY`su=0F#JT_(-Bl?!m!>%|nQfQtI*;}6idsmuoKH$9iUwBs%V)IX z55xU8?EWThji2`qasD1`zZ1r#(xyhhAR4((wUhfG4u!uZG4R=N1!-1Z&i?uqZ+3BC zja6k7YE@l8YJ`tq!Kf2ZLD5*2Xs2+yA2k3M|jss91k8| z;(uKP*7N7Lc=Zw=xtRWWa)LJ=am=cypwI5MJK3mmlpvMYr`A_5QI_`Ms#>E5XnHT79 zP48vTVYdueRRJFfU-(VuczSy%A&)&`xH)&upKYV9(V6!58x?mZ(zIB$r|im z!Mz9AbwGvZ1{@E7!?DHLFe!H21NH!5j#1s78cjFHjISEMpFKmf$0zR{F8PMUzOQ}` z@7m)06qkE^@GeT=eP@%i`MFbkYL8#Ii?2ArpV>}t{;%%hlY0R8<}JQuI|br@dKbUH z2Y_$e;@h`)$FU4nbs6|z$B~R$(g`3yRKB?FzcIP21_ylaVY~R>$rdGI=O4BugI7NA z>mhA;#&kpStJvL{ea4UC{424I&hIC2>vymN@GQ39hjSlm_!sl3d?n7_jyvO@{_FhU z7vby(cNT+w6}wN*A9Nk(2HPQ&f`PdOw*!E3i<{?xfMF>Vm0#ZBL$f3K_H(>_%X1b^ z=S%*+GknjT>95~AKlp=Z_^WrOcYg2u;E$Z)hweLE zcc;sNIs6zaZp(NqDGth@!-flg743JFV1-`Rtn&XEd8~+)uxz~k2p2z(TW*or;9Ok? zdFNU!wo|glJ}f=a?VdaA zZ7=^oz*K$1x`yq;>D~4%_BV0qrhVvc=kDw4O#Nw za;3dEM9SjH{%}ReLNAhK7}l#-+!eCi;zK8(L*cmHNK3Z4tZL)(i=Vtx@N@B4Z^ibz zaNfv7zvbdRf$cltK7+e2;q+5;__Nqv!#UruHOBLv7#7QciN2$&#fo-B9;+r6xloOK z!&-p#coF4mS@?v7Mj(qcLf^@n`9^?(Z&;Fc6Agu|$Ff9CG1frS6;isC z^iGqllhWpTEDEw4F8n!B(XWhjU?N(Tl0CMva#eH&J=bgM8wwR} z^tkA8tHhbZowy6W|&a@|=(3?sxzjoLs}Un?S6)!=y-eQexXr zT2E&K_C4+m*f{{jb108vW|cocrUoAF@aSSX`!Bo0G#}Soj>Ym}BEzzr$6}3p0;_zF z)e1$xP7ocJWbKoF>kFG>QC}4kl{y)(YE>dA&9PWYOysfrxBVC4#f$|geNzER9)Tp%qoB3 z52Vi7azAwyRmqr|s~A=eltnyNPy|fYIa`7EDzVi6F>bwjD5T&&;dFze@14P_@tN<% z*_Y$;gSd5xi(esd!!?||8D~qCrUj00-r(X@oIb+6X7o=Jl5hzC<~GXbU{4qUmN%Ti zT;dbA@bCg3yM<;C0Pi@%GbfB_tOeeG3(eu+@gGm|%SZU(bA|{)Jr)}ZOW@z1<2Nqw zqo?@i_wa#pa!*)~)nzpE(mHCB8p@HKyc>C5s=#jWQ}t3Jj}1bJx0Q*-%Y*+rgb)4@ z7a-?%6DOO=pIv^2zzqeCMz^#aK!L59Zo+;-(t{TqquTPCRrUlG@Cl&5#LM#sJ#&J$ zY*hsp3*{8VVPr`PO#&(|(Wro}+!}dWMv**UBRkIA8U;G*8FMrf`1PPmqftt_k9V0#0O0jsP$3}X5DCtcR;sT%mZP9%j! z9GG8q49xt8j!_3Ifm>U+Fn2Xid4{!?1JkJ)m1KffDncs>yNTa~hZTAu&Uf6x=~BJO zdM|vJ%`Ik|OC1$0mYN_cdH0u3SFeRe9YqS;m#zB1`4sAppT+T)5^=qOWU##qrsqr9 zvoBxiu@t#?;m@<$~I&XjvK&R-!WbLvme8qzePBay@1&%5}9839CEu# zUN)0ImNQ#Rk{0UM3V|ZzgO|d{8tSepuKgjYfu_uxO3L;x9GJ5o$9|7{KZV@~mTrCk zIDQ*$e?LyXN|Cu2?1qOay&@KU=maU491?YM{GWb)>?8QeE(Mw!A_mOYB(^{V)(Nf!G53~-ynf6%Cm2h`SwXw@X7W6Z2WNbKJUytrp!8UC9nN7`2$g_EpjecJ| zn^)-)7K{$es@YRr#w@cgPj_6BM`_pTV>R-AP>F^EH?x%GWOV9ytxg!MMY)WPKpNmtX~5VOH1jtpqNORY!T+NM6>dou%xIg#39fO+qz6zM*H+2H%jlrRS{-CoMvy*;b~sw6F4~bf!$nCwq?|c_md-{7 z+T}KTrKsG?tDwo&8=_f5Pb|3Sz$#v}nAO*-1dSm@lD}3lg(@`+mz@t3`zl>qp<5%o znsdFQ(toRtwC>i-(s@E|QI&IerMo7%6_JK`v)SX4JFs1c5tD*xf+z)GorbDfH7o@P zWp%J4;YLfl0=%)MW)Sv({mKnstK#fR2Ft=YRDFEakfv+g937gphkr^g934_u0Ie>h z`1dNTFmU>M@zk19&{nAAZirfSSFGjfZ2<(@=LxJ!dWM;`npS0#C_~Ly7$?WD zu4klFB%N=`(6&xCsho3d)t#;)+dr`5;8_ApDctxvrLU*d1S@U;IE$*=5StC;WtA$1 z)K6Jsm8YN& zo6D(5^d4c^OAUClErz3Z8Swc3<2S1XJ3 zUu_mrmb@$#Eta$ute_gsx~QbSUX_vt^T7pX7SbS0a?xR`PTmNug+SSID?2G6->`0G z%nu-7yq=`@8RV)?V1ZH&3^lBQ1*;;$i8NnC8i`vAoyyXvEw%(ya@e|0rZ9s#x%6rq zK>AOmVxx%9_43@sLu@EzGa-hRowG|GtH~4ZZ)FXNOkWk<6GsPk7er5~k{jW3kOh4b zgymEl{ni?vO)p9|4ss8m(psZasgks+9O-d?Qi3xW3fk6x6~ls-yz6L5&iI<-!s!J3 zb14F9bK5dy`&m&?g;lIXz)~mz25bdKa^WtcR-+7v&1CK6Pm1Lyni;qv?67>zhQ$TS zWMg)69K5crK)qBH=VM=03hF{t_69Jy4Wt|xzY~y`T=l`Kfz$Hs)mcd08X|XcMfYkR z+jFS%1h5rh9sf!>mLWuUZeu8+a*YbLcPZI^b^|ERLW%^|*{L;|;ZM)8Xo6p=~zQdpKsggs0`)}i^qeHwK zmZlnD04_g^dp|{VuuBeArzE>1o?gql#R_+x#ihf&&*s&YOMe6C!jRsrnLU-96(kWT z6=b33+|@v;`3Gc>)#OqQ>q)^~LGW91DAW@yR>!21he7yzz`yhyzI7`e{qC1=?`MS3 zZB)2fssLtA*s24gJbOEKpU1sdWzGJQf>lW+LuD3H4r#bir@gQZP02#W#Al1BA&YHg zBk!**d2cdU#mQMnUG`*(KvR#l0hT1WR@hX@PMi5{&%PWdH;G`C1gw_``JY3oK~6HP zM&PsM?75o^OraA9A_L|PV8JOht}!el2t^8re3PPscHHpNJ{$5;$L zgoffz8{T+7m%nbp5kY>q^ks~ce!vo>Ej(gYwSpX@a{U_am+|*UB++dIp~p_xEVWUy zoFP_4`503{*hA;RtN=sZoQAG)tvt`A5=Ya|*PviV6;`cnMasJHw%tzRHWy8wKgU0P{bF!c&VB&LZ^50vf{Pch+fRmdy2J4saQo}AeHN(k{Kv6>h&x}0<0k=N z_ZjRivF|2p+YdN>amrwCKaFDx0Q(;Inu+K7EFF z9OH>Qcy^070=S3Y-s5v;_{L*Ac?a*kzzaM4?s%o|;G2(e1Yn2X+To*10(Xoz-Ntup z@gAUk9>285$5kmO7FHM}(VddhE6L`(8?HnsTNT!iZtF8xi36)HM0Lr$@8`Y?+dmBe z`#;3pe;wpTXFq`BH{tC2aQchby)b3#cYh7rcjETfWBWF2--e6NWB(bPy?1sJm$>`M zLw3I(aCe5Rwl`i#}jj44CxAp3@cb@_wWZmcZPQy(nhfXQiq3I`@0++A`WD}q4hV>@{_&VOPN=L}z11WEnHOStumcAa*-Nm#8sc4aC8&f zuai&LGptKs_bHsb6#!1=Z0WL_@+xuU6g4bn7Lwr_Tf}btB?fuVrj0(*#ivwn?P_9koBqhPC@J zZv6ueCRoH2BANA)ATScQn0hSB>A;LKluXp?Wwuc(4BzMs{vMZQEP49Byo;YF9NwG_ zpkD!WRLx%Da}JEbjgJBBda1UUD*Mk^H(|WA+WM zB&(dn})6Uhs*O#xSlpn6D7@8kf4VZ^3~ygr7?d*&fSB z$!XL}8dfIfsN<#?O%SL*d02uKEH^wiI~1Z3a&@-E^8`!ulNyL5U*(rN17=l0SSXQU zMc*bgEYFPY{J9y%d&hW$IA1-jQ z$8Qr>@h}GlS8#2Yg)q}oYHP|;^fUMb$K~T?8yvoL{N;NL4}sDkPq%?ivZ|2Xd;YUH zdKxERJ$>}W|H0)exb=5}Q#^SWj-JB#-^S&AT)g064F=n{1{cRD&hVxaT-)L0(YNjJ(giNh@XixFy~B$a_{=FjG~-f#>I84x;%)P;@TEOI zbBgz0;P<#t*l+Q*CwRvh{`y?KnYe04cGd6mh$d-59>Ltix+@D27sgM*uFD9 z$jcVHPY21?_6_sizQyk0WXikQ9UPZ9E^#!@=n2(@E~b+xk6^a5BfY?*9qum+XOD+_ zbeA{+u*Fj|nEA&${Lv-e24IUn;g6F#!5bE<0&t9Hj`7S9YObQu0qqXI3OodGjJF=+ zt)psZ3_HJ>Woyi4iY9$QuhT zX{4m}I)k*Xw3tfTvXTx=ECf1`#+8oKUTssVjrnc7EcTqlKRddLOAe_jWu!{-Rm&y( zC)plL$*Xwi-Iws!wH11H7%nS?U6P@#y1=^Sn4c2wik;b9XRX{5uCy#mM9{dDZ@5%lsw-D&TT^r)^9>6rskJyzw(^LP zUTOm@ga{}t94P|U+2d=f48;ys2JN8Oq0GtCiN*SW$tERB(8-fx`xIE!`)c-*?v9o7 z4kdl4*BI6VP82IKOCTxR&x2Kz=|k1YR*AsaP+&;u0c0Z}OIMG_!7C=!rv}&P{PZSc z98xEITrba_8cdi@6&(I4Nkv;(N2gv_D~zW?XF*w#4mRtq7?UdH3a4&Zx>S{7Tau%) zk+_~Cz`8Vcqn8=iNkyE3=ZzHLN8?59WtLW$Gm_7}9Zr zYkH2a2bPvmsSz+a4Uo2#ZsatdorT1v>al1so2|F0$)1foTC#i1E#kc@x-%4lmTyS} zD=T?Rql*euYdn^exw8uJvCg~LK%{6ZlrpAZ<))fCWoK5N2`J@NrLQhT3A;I3pt??U z!;OP)^MpW?YW6|7MhXn290codFJ5zLEp=L%hV_bCe&z$BG76BHTC+-9q0ZO|DoTwt zXHUx9wm@BoosvGt8^A7vij$K!k~4Fa@>t7>b{r_T(e|U{`b)};0gP5w*119`d`&v< zg9KJBr&xJR7^P}pvlWZ$)CRET_5_h)M*u6(R6Rl#T4Bm^ml~6xOW8}J9lfdr8g;=B z(JZrq1AUW&T@>?*9$6a-jXYqL!Lj(R>H{gFJYuSI3ztZAwiZrqE@`S@i54u#jstr8DLkp6BEHYO4jpzRZ?MAncG%zOk!53m>socRo&vnqzcECYuIg9D@QdMJ|NSz0S)^ZjQ2^iV%m(?5?b{0~bQnSyTaNT7HtoKUK z7Ry%9wO4HhupR--R)$7b8P-FALCSJU1COQ6Lb7B7D3xni@lRG0+j2g-BC3s+s{m$k zVA?e^JzD|!)H8aiKfL7#6uBH2E7M@CaM|=(unH+;RS{a*1M=lU-m0uzI z?|2DUq53K-3xQUtJe~ck74j-+7CbL6+jG;~6b_6s3_`c0MrMK1*w@Z|f=YjQ(6FT^ zRXV52%KN@LW0>_SxZ%-N#(zm1m?U9AmjIPUx>Xr0(2`TbW`^NP0_$DqpZdHFV5>^+ zNPK0fwA>K^a%aMFjS~LY?i#5|lf)D((cHX(VL7fphh_f-GH4nfQ6C0Tr<_(TjFzMk zuq5N)3u;yD7>Hh_6zdy6nyTw#aN7(aP{vo4T+gND=-kq{AU0>poVZwVZ=P>hjS4QX zWoZsrm%_W=1i?C|4HpC{WjW$BmsGUaFVsjgCL`3UQHQf+HbJy2XC&|%VddP+R<0So zk)$Bm)WBh#aJ0&>QX`;gB{9brv!}Ajc3qa6FJcA#PfJHE_v#+76XuJwLXXYbdDi)` zg3l2-=)xykYf5!etj%C6NR0u~)~MuEFGRyK=#uRdOb%}eVpOl^7AsCmZ>^~~b#)O| z7`#2#K$5C9qg$&ZlOS?xg;%UALzQe)njmZjd?1lRt?aHS>YQa*RW?<|MK9C&demdB z;=t50S+61&yP#GzsHl3U4oYW>#L4!DWW!cZ$W`JjB&j=2Nve`PTYC7bNp5U8aBziT z)$4YHVU9(YOic(dR)wjO_Ed2}kevjX*eB{dn`(HuqJfCm;yIaxuo zs^r3-8P+CW3514130SY?2{yIR16Xq}tO)p7Nv$;q^Yln* zy$uH~vnYTb;8uC8KE>CgLn{Kp5j)StW^iDVE~=J^a1nE>6p)-;!+JvI#~3yU`udBO zOBZ#9u`+F|%8T=5*wz%o3X;1@&O&PQx=b?%*RbPjB#kgvcoC3g9@&iWr(^4NDkM~b zVNse_uE$~vgo(k>b*fyWl#^?jqCxShGW1w92x_yCB8e^*PuFdWs`x5-m7+eL=Dx&Az@(_g@2S!FRldtCuJOV?I6r+0$`OGKwjrTZ*^W1M6H%< zXkB>}1?2~K=Zu3_>dHCgWOhJT&+Y!CM)<39U}|*`vCSYE)dEhzuHsN8Y>p5n&toNr z*fU=hR|}y1@AVpa1xmRn+;P*Y$FyNlqiz%u!Q{N z-Q<~9oMT;K3Vf}Gzltmw9#&9f(0W-@j}3^Cl5v-kF3wT(?F4z*o|T;|h5mOdbe}}m zZuE1M{)|f^X~Et>xRll7U71Cj4vpSH*^D|ttWWPuP;U#Z`(WnG*zApjz@(QEEkjk3%-=E8MI#tQBAW$!)?sy&`i>R|$buY|`ks z4WKd(UPskCIWed6hkK&Y&~o!?6m5kS4O>-)ZZV5p)hXFDtF~RT;V;N$dv4T*Vpun2 zz#R&^p;~E4wS2B6$*T%#RlV9=nk4IWL|8UcTcIOX*mHcnPMrqm%CtyymKJETRZH0k zR$OVh;=*6BN9s5j=L(_FUHi?l)b2{ zY>--O3bOrWZ-24@kaliW+5O>`t4nI!+vRj~4C~1}5Gyvg%^EcrEA#-C+`MkfZUCiy zp9Fq(d0orN9zcZ%s!!gS=<1TZtWC8nXBGjg6j%X23c&ShIaHmMvxt?#2AOh;H8_?s zzgP2EIa1hc`5@APiM16#)FFC-ei@lppCN_K)&X;bKwDCO?3C7;OnKQ-#uRFmS*2_M zZJwO3rF{alpSSbch}vw!y3XnLIr%}}u#&nREIGqUtH#OAr4m?`j% zxJ7`pA}TnwtOG-vOPSW1RgLgU1yIp}$?2<6r0i+J?j%^DRA(Vcc$L(yO9@9-5FJm} zYJx`bUQqO9Yxj6vi_k{j73y__oVv0Z1kI`;<*1Z~t(C|Yb) z2-K=Yy;`8+TA{5}(z0Ojs%b4dL2sbvieZ_Cbxn}7P1Jcd9Fd{Q0INiGp~$K_L1M4v z$W=+@swO47kQ7$vQmr*Zk=I(2-v+36#Oq*HC2(M(Z8rlebn4)#c8y^fZj`FasTEe7 z6r7Z;v%cz}E+jRVc5;8|T1-I~waSsg_MPb9iS7(KtWe6`TFDGuuiIFT%v%bjd>bZz zf&Sc(8oS}M|1&x7tKAhs#%q<)vt>OFOx&>5bG}LftNJiQ?^7lfU6Ph0^<9Q$Kb_k) z;3baDcJr&qZ9pV6_R5~)Umv*Bf~|8 zj9ExsN(@a2e_aY>?}h5J*aldtUGOE>r(orhM6GIp)^g2`>?lEPtUBX(;qS!5DwCZ|Rb8%y9`Y(B1w$*Y6&WF3Bpbyg2@87hnl&EFIz`T%FdPiQv8+5|q)g62Vh7iB zLS0#Dgik8>Oa81Qr1j_k1}|0bXlsoX=*7utd6{j1RmR*!B{szRa}rXeG{rTXZDpy= zv};-^He^?*@bXKpu55->s-CRXtP(@(vdcAWQ%xV5RGa1-HeY8qgrvR{&^)iPPB zCOqaSRgZ+=nT$jCRSl_ut@2oSNH7K?tFJ|dW#u-&EP2^MRV-emgw|vL4b)wAT*FpE zURIfCRtc>&IXW;Bze;E7u}DtAX0sGl=rekknsA-2@K}#Blt2~>dopB@QV6spYA{7o z2c{Qj<89vVugxz1B{?wKKu^QXNGJs1#vFC^oSssJ$tFS03Is9oA)mYjF(jLGr*;-SQrW&@cOgRfxhH_PvvD>al zv$7Q`fPqydMVuP4la36lS+grVsBt4>=(wM3(Kyd?i<#D%K^`!fYy(WrgUB3NlPoH) z(5$k8Vd-7)io3EhWMw(oSFK@73V*#E02(e7HY?$V*syf{hDdlVIbuX?tziduEAk4B zFb+O{fLnhhEzn5^rW6?K?5I3e1C2E-yB-3yvbqp6fXzZ?wMj} zELWW^Ef3rtaFW6<$xP2odD$wZ8fMj|IHfig)iNUHQ4A|c&EXOt7-duozHs$W$cn7# z7MA9~BwK4DNwkjB-Op(&ZB^y|jvHCiD#=1%iRB5{`bXcL|*a|%t1K3$DN@~?yp``OlQWlc)SU!W=u*@p9Yq?cbK-qsb z+$_l^qpsX>YA|A+owrhx9gw>Q&w^0Vyur2WXpk;-wuJkKQlmwd>{&EOMRtSQHVpSa(In|N= zw@yygB}cW|V=3b(Af)h`ylfKdRp8L8wUu^)XnV(v4&Y}Y8C6}q%$mxaGJGT^HMFrNi z)*8i_@;Na2lo5(ANL=nxnZX#*L|V>QMT^wG(vQLirG&k`+OAMf*d1qBnhwmsDcrRr zThE!@olK|b{8EVw6Gv)8Du5*iq*SVxvMFCBAq$iRS_*Z*l5$}D-O<1eo|2Yc6Yd0? z)RvGPO1#2jNr;0~(h&!D>wCZ?2PV>{(t)e|xoxz$lo2gvYc)Eps!D0BOJb`Lxhk{s z@{r9c+~Ph1|726BMtG10jCD8`OK_0XLegMWm+Dte_G~p7fv=Ul6t(ifx2h$t(xtGI ztYXWJqO#m1YrPY&^Y|!d6f=fK4_BrV+3! zDFSwDWQ=fMouuO=@dnxjPeXkpv-a{EmmBVa(V3;K3RA^Gpi*aPsj^?HRBBb{xhrMH zBsHlxRnOr>N=%qX0xqTO1X()wI>Rz@5M(xny{xU!Wejc08H3xXfPz9PX19Uy;BKh} zzFgA;kt4CE>%dq6UJsfeoKWXv_b_ZHV4DGlCWGKQ!+OXyr@CZ&VV6;>=`#v^4QEdh zBRO(}J=e3vP8o5F3KWY}m87lI<~2Upj0f3{lS-J_R#0`Jqzsx)RbbO|$zyfowQMtQ zZZm}^?YDmOx69m za?jD#bU>k#H-K~}NC$eZ=+ZGVr%z1h^$G%uFEkm=rA^*2T()P6kynW5>WW^YB-<~I zqDl^M)4R14$;Ohl)+kF@62WA1rbhUsl_~ESdYJ6_Z;j04FHyU6y;8@ziFw(j9#r85lP9bN@+Xojj3CpPMPk+uenM@oty!l8K7q z^$hGKp1!W^4_VoT&D0pX?z{(T;`4NI4B@z*{Nw-pMiCZf59&ghTmgWD0l;*TI7}*0BAb^tj|`8 zMF3bZ02F3R#5n-iEdVe{S7t~6u(trf&JYW-00;~KFj0twDF6g}0AR=?BX|IWnE(_< z@>e|ZE3OddDgXd@nX){&BsoQaTL>+22Uk}v9w^R97k?`hHemu`nm{hXd6^k9fiw@` z^UMGMppg|3;Dhu1c+L*4&dxTDwhmt{>c0m6B4T3W{^ifBa6kY6;dFk{{wy!E8h|?n zfNlPwCGG@hUJIag_lst-4?wj5py}FI^KkfnJUm6Akh$5}<>chpO2k52Vaiv1{%68p zz*qfj`G0;q{P*?XzTzZ-GF^d31o+^>%=Ap99M6&ogks$0k4OBs3;+Bb(;~!4V!2o< z6ys46agIcqjPo+3B8fthDa9qy|77CdEc*jK-!%ZRYCZvbku9iQV*~a}ClFY4z~c7+ z0P?$U!PF=S1Au6Q;m>#f??3%Vpd|o+W=WE90Dk~pL?kX$%CkSm2mk;?pn)o|K^yeJ z7%adB9Ki+L!3+FgHiSYX#KJ-lLJDMn9CBbOtb#%)hRv`YDqt_vKpix|QD}yfa1JiQ zRk#j4a1Z)n2%fLC6RbVIkUx0b+_+BaR3cnT7Zv!AJxWizFb)h!jyGOOZ85 zF@I8uR3KGI9r8VL0y&3VM!JzZ$N(~e{D!NlT@zqLtGcXcuVrX|L#Xx)I%#9!{6g zSJKPrN9dR61N3(c4Tcqi$B1Vr8Jidf7-t!G7_XR2rWwTc& zxiMv2YpRx)mRPGut5K^*>%BIv?Wdily+ylO`+*KY$4Vz$Cr4+G&IO(4Q`uA9rwXSQ zO+7mGt}d!;r5mBUM0dY#r|y`ZzFvTyOmC;&dA;ZQ9DOhSRQ+xGr}ak+SO&8UBnI0I z&KNw!HF0k|9WTe*@liuv!+$_SrD2s}m*IqwxzRkM)kcj*4~%KXT;n9;ZN_cJqb3F> zAtp;r>P_yNQcbz0DW*G2J50yT%*~?B)|oY%Ju%lZ=bPu7*PGwBU|M)uEVih&xMfMQ zM9!g3B(KJ}#RZ#@)!h?<<(8I_>;8Eq#KMS9gFl*neeosSBfoHYn zBQIkwkyowPu(zdms`p{<7e4kra-ZWq<2*OsGTvEV%s0Td$hXT+!*8Bnh2KMeBmZRo zdjHV?r+_5^X9J0WL4jKW`}lf%A-|44I@@LTvf1rHjG(ze6@NjGf~|t(!L1=^$n21< zA@}E)&XLY(4uw#D=+@8&Vdi0r!+s1Wg@=V#hChyQh*%oYF_$%W(cD9G-$eREmPFp0 zXE9GXuPsV7Dn6<%YCPIEx-_~!#x7=A%+*+(SV?S4962s3t~PFLzTf=q^M~S{;tS(@ z7nm=|U2u7!&VR!6g{Ky&E)py{mOxC1PB@hCK@cja7K|nG6L%$!3VFgE!e=5c(KgYD z*h5?@9!~N|DouKl?2)`Rc_hU%r7Y#SgeR$xyi5&D-J3d|7MgY-Z8AMNy)lE5k&tmh zsv%92wrA>R=4N)wtYw9={>5&Kw=W)*2gz%*kgNq+Eq@BOLZ;|cS}4~l2eM~nS7yJ> ziOM;atDY;(?aZ^v+mJV$@1Ote62cPUlD4IWOIIx&SmwQ~YB{nzae3Pc;}r!fhE@iw zJh+OsDs9zItL;~pu715HdQEGAUct(O!LkCy1<%NCg+}G`0PgpNm-?d@-hMgNe z6^V+j6o1Ww5hAaxn$2~(q`%A-YuS64wkBy=9dm`4cXeX z4c}I@?e+FW+b@^RDBHV(wnMq2zdX3SWv9u`%{xC-q*U}&`cyXV(%rRT*Z6MH?i+i& z_B8C(+grT%{XWUQ+f@NoP1R=AW&26{v-dx)iGQl;_?G)^U9C=SaqY(g(gXbmBM!FL zxzyDi(mhmCkJc;eM-ImyzW$x>cP$Mz4ONYt#^NJzM0w=t_X*$k9t}F$c8q(h;Rn+n zb{%IOFKR-X@|s4QQ=0o*Vq3aT%s$c9>fU<%N829{oHRUHc}nwC$!Xf@g42^{^3RN& zm4BUmelGdkVB4a$d*@@$-)awU@466l;nGF_i|0GMJI-A4xODQe+vO8ixL2C5I$v$- zbm~0*lhaSfyPUh4uDM)mx$b(swR>jw=^LIm&fWCAdGQwi*43UlJ>9+YdT;l|_x0Zv z-F|W>{m#p~*>@-It-MdXU-UrjLD@syhkw;STmIbG@7#ZCz;~eY(cDM(28Dyq{*m>M z4?_iynUBkc4TkHUI6gT!;y-fz>HMcd&t%Ugo)`Y2{>!cx7B7DI)$7;J(U{Spm-3gB zzioV_{p!H$8L!*M!p0uH$#^p{Ui4P`?ZJ24cOCDe-w#jZd?0@)|7iKK^;6KN`wo*C zlav1h1DNytV>2z=kufhdAW1|)RCwBA{Qv(y11W%sfkZH>VN}D=(EtDd0RR63099=R U9mr>?CjbBd07*qoM6N<$f=u=@H2?qr diff --git a/data/tex/whitelight_static.png b/data/tex/whitelight_static.png new file mode 100644 index 0000000000000000000000000000000000000000..b15444a878fbc48938e461472e7ca507700597cb GIT binary patch literal 5487 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 literal 0 HcmV?d00001 diff --git a/fonts.py b/fonts.py index 8d3879a..b6ec973 100644 --- a/fonts.py +++ b/fonts.py @@ -1,212 +1,212 @@ -import os -import pygame -from OpenGL.GL import * - -class TextureFile(object): - def __init__(self): - self.id = None - self.filename = None - self.h = None - self.w = None - - def load(self, filename): - self.filename = filename - img = pygame.image.load(filename) - img.convert_alpha() - glActiveTexture(GL_TEXTURE0) - texid = glGenTextures(1) - #print "Generated font texture id %s" % (texid,) - - self.id = texid - - imgdata = pygame.image.tostring(img, "RGBA") - imgr = img.get_rect() - self.h = imgr.h - self.w = imgr.w - - dimension = GL_TEXTURE_2D - glBindTexture(dimension, texid) - glTexImage2D(dimension, 0, GL_RGBA8, imgr.w, imgr.h, 0, GL_RGBA, GL_UNSIGNED_BYTE, imgdata) - glTexParameteri(dimension, GL_TEXTURE_WRAP_S, GL_CLAMP) - glTexParameteri(dimension, GL_TEXTURE_WRAP_T, GL_CLAMP) - glTexParameteri(dimension, GL_TEXTURE_MAG_FILTER, GL_NEAREST) - glTexParameteri(dimension, GL_TEXTURE_MIN_FILTER, GL_NEAREST) - -class TexFont(object): - def __init__(self): - self.image = None - self.start = None - self.end = None - self.rows = None - self.cols = None - self.charheight = None - self.charwidth = None - self.texwidth = None - self.texheight = None - self.gltex = None - self.monospace = False - self.charsizes = [] - self.colors = (1.0, 1.0, 1.0, 1.0) - - @staticmethod - def new(fontdir, fontname): - tf = TexFont() - tf.load_definition(os.path.join(fontdir, "%s.tfd" % (fontname,))) - tf.load_texture(os.path.join(fontdir, "%s.png" % (fontname,))) - return tf - - def render(self, text, color=None): - if color is None: - color = self.colors - #print "Binding texture %s" % (self.gltex.id,) - glActiveTexture(GL_TEXTURE0) - dimension = GL_TEXTURE_2D - glBindTexture(GL_TEXTURE_2D, self.gltex.id) - glTexParameteri(dimension, GL_TEXTURE_WRAP_S, GL_CLAMP) - glTexParameteri(dimension, GL_TEXTURE_WRAP_T, GL_CLAMP) - glTexParameteri(dimension, GL_TEXTURE_MAG_FILTER, GL_NEAREST) - glTexParameteri(dimension, GL_TEXTURE_MIN_FILTER, GL_NEAREST) - - glBegin(GL_TRIANGLES) - glNormal3f(0.0, 0.0, 1.0) - glColor4f(*color) - #print "Rendering font" - offset = 0.0 - for i, letter in enumerate(text): - offset = self.render_letter(letter, offset) - - glEnd() - - - def render_letter(self, letter, offset): - charidx = self.mapchar(letter) - x1, y1, x2, y2 = self.get_coordinates(charidx) - cx, cy = self.charsize(charidx) - - #print "Printing letter %s(%s) from %s, %s to %s, %s using texcoords %s, %s, %s, %s" % (letter, charidx, offset, 0.0, offset + cx, cy, x1*128.0, y1*128.0, x2*128.0, y2*128.0) - glTexCoord2f(x1, y1); glVertex3f( offset + 0.0, 0.0, 0.0) - glTexCoord2f(x1, y2); glVertex3f( offset + 0.0, cy, 0.0) - glTexCoord2f(x2, y1); glVertex3f( offset + cx, 0.0, 0.0) - glTexCoord2f(x2, y1); glVertex3f( offset + cx, 0.0, 0.0) - glTexCoord2f(x1, y2); glVertex3f( offset + 0.0, cy, 0.0) - glTexCoord2f(x2, y2); glVertex3f( offset + cx, cy, 0.0) - glTexCoord2f(0.0, 0.0) - - return offset + cx - - def charsize(self, idx): - if self.monospace: - return (self.charwidth, self.charheight) - else: - return self.charsizes[idx] - - - - def mapchar(self, char): - """ - Maps a char to an index. - - Takes a character either as ascii ordinal number or as a 1-length string. - Returns the index of that character in this texture font. - - If the character is not valid in this texture font, the index number will - instead reference the last character in the font, which is usually a - symbol for unknown characters (either totally blank or a box.) - """ - - if isinstance(char, basestring): - char = ord(char) - - if char >= self.start and char < self.end: - return char - self.start - else: - return self.end - self.start - 1 - - - def get_coordinates(self, idx): - """ - Maps an index to their x, y coordinates in the texture. - - Invalid indexes will be mapped to the last character in the font. - """ - if idx < 0 or idx >= (self.end - self.start): - idx = (self.end - self.start - 1) - - xp1 = (idx % self.cols) * (self.charwidth + 1) - yp1 = (idx // self.cols) * (self.charheight + 1) - - if self.monospace: - xp2 = xp1 + self.charwidth + 1 - yp2 = yp1 + self.charheight + 1 - else: - xp2 = xp1 + self.charsizes[idx][0] + 1 - yp2 = yp1 + self.charsizes[idx][1] + 1 - - xtc1 = (float(xp1) + 0.0) / self.texwidth - ytc1 = (float(yp1) + 0.0) / self.texheight - xtc2 = (float(xp2) - 1.0) / self.texwidth - ytc2 = (float(yp2) - 1.0) / self.texheight - - return (xtc1, ytc1, xtc2, ytc2) - - def load_definition(self, deffile): - """ - Loads a texture font definition (.tfd). - - These simple datafiles are generated by fontmaker.py to provide character - spacing information about the associated texture font. - - This should be called before load_texture. - """ - dd = open(deffile, 'r') - - if dd.readline() != "fontheader\n": - raise ValueError('"%s" is not a font definition file' % (deffile,)) - - def nextline(dd): - return [int(x) for x in dd.readline().rstrip().split(',')] - - self.start, self.end = nextline(dd) - self.charwidth, self.charheight = nextline(dd) - self.cols, self.rows = nextline(dd) - self.texwidth, self.texheight = nextline(dd) - - self.charwidth -= 1 - self.charheight -= 1 - - assert dd.readline() == "charsizes\n" - - self.charsizes = [None] * (self.end - self.start) - monospace = True - monoheight = True - - for i in xrange(0, (self.end - self.start)): - x, y = nextline(dd) - if x != self.charwidth: - monospace = False - if y != self.charheight: - monoheight = False - self.charsizes[i] = (x, y) - - "not yet capable of dealing properly with fonts of variable height" - assert monoheight - self.monospace = monospace - - - def load_texture(self, texfile): - """ - Loads a texture image (.png) - - The PNG image should contain 32-bit color with alpha channel. The image - will be loaded as an OpenGL texture. - - This function must be called after load_definition. - """ - tf = TextureFile() - tf.load(texfile) - self.gltex = tf - assert self.gltex.w == self.texwidth - assert self.gltex.h == self.texheight - - +import os +import pygame +from OpenGL.GL import * + +class TextureFile(object): + def __init__(self): + self.id = None + self.filename = None + self.h = None + self.w = None + + def load(self, filename): + self.filename = filename + img = pygame.image.load(filename) + img.convert_alpha() + glActiveTexture(GL_TEXTURE0) + texid = glGenTextures(1) + #print "Generated font texture id %s" % (texid,) + + self.id = texid + + imgdata = pygame.image.tostring(img, "RGBA") + imgr = img.get_rect() + self.h = imgr.h + self.w = imgr.w + + dimension = GL_TEXTURE_2D + glBindTexture(dimension, texid) + glTexImage2D(dimension, 0, GL_RGBA8, imgr.w, imgr.h, 0, GL_RGBA, GL_UNSIGNED_BYTE, imgdata) + glTexParameteri(dimension, GL_TEXTURE_WRAP_S, GL_CLAMP) + glTexParameteri(dimension, GL_TEXTURE_WRAP_T, GL_CLAMP) + glTexParameteri(dimension, GL_TEXTURE_MAG_FILTER, GL_NEAREST) + glTexParameteri(dimension, GL_TEXTURE_MIN_FILTER, GL_NEAREST) + +class TexFont(object): + def __init__(self): + self.image = None + self.start = None + self.end = None + self.rows = None + self.cols = None + self.charheight = None + self.charwidth = None + self.texwidth = None + self.texheight = None + self.gltex = None + self.monospace = False + self.charsizes = [] + self.colors = (1.0, 1.0, 1.0, 1.0) + + @staticmethod + def new(fontdir, fontname): + tf = TexFont() + tf.load_definition(os.path.join(fontdir, "%s.tfd" % (fontname,))) + tf.load_texture(os.path.join(fontdir, "%s.png" % (fontname,))) + return tf + + def render(self, text, color=None): + if color is None: + color = self.colors + #print "Binding texture %s" % (self.gltex.id,) + glActiveTexture(GL_TEXTURE0) + dimension = GL_TEXTURE_2D + glBindTexture(GL_TEXTURE_2D, self.gltex.id) + glTexParameteri(dimension, GL_TEXTURE_WRAP_S, GL_CLAMP) + glTexParameteri(dimension, GL_TEXTURE_WRAP_T, GL_CLAMP) + glTexParameteri(dimension, GL_TEXTURE_MAG_FILTER, GL_NEAREST) + glTexParameteri(dimension, GL_TEXTURE_MIN_FILTER, GL_NEAREST) + + glBegin(GL_TRIANGLES) + glNormal3f(0.0, 0.0, 1.0) + glColor4f(*color) + #print "Rendering font" + offset = 0.0 + for i, letter in enumerate(text): + offset = self.render_letter(letter, offset) + + glEnd() + + + def render_letter(self, letter, offset): + charidx = self.mapchar(letter) + x1, y1, x2, y2 = self.get_coordinates(charidx) + cx, cy = self.charsize(charidx) + + #print "Printing letter %s(%s) from %s, %s to %s, %s using texcoords %s, %s, %s, %s" % (letter, charidx, offset, 0.0, offset + cx, cy, x1*128.0, y1*128.0, x2*128.0, y2*128.0) + glTexCoord2f(x1, y1); glVertex3f( offset + 0.0, 0.0, 0.0) + glTexCoord2f(x1, y2); glVertex3f( offset + 0.0, cy, 0.0) + glTexCoord2f(x2, y1); glVertex3f( offset + cx, 0.0, 0.0) + glTexCoord2f(x2, y1); glVertex3f( offset + cx, 0.0, 0.0) + glTexCoord2f(x1, y2); glVertex3f( offset + 0.0, cy, 0.0) + glTexCoord2f(x2, y2); glVertex3f( offset + cx, cy, 0.0) + glTexCoord2f(0.0, 0.0) + + return offset + cx + + def charsize(self, idx): + if self.monospace: + return (self.charwidth, self.charheight) + else: + return self.charsizes[idx] + + + + def mapchar(self, char): + """ + Maps a char to an index. + + Takes a character either as ascii ordinal number or as a 1-length string. + Returns the index of that character in this texture font. + + If the character is not valid in this texture font, the index number will + instead reference the last character in the font, which is usually a + symbol for unknown characters (either totally blank or a box.) + """ + + if isinstance(char, str): + char = ord(char) + + if char >= self.start and char < self.end: + return char - self.start + else: + return self.end - self.start - 1 + + + def get_coordinates(self, idx): + """ + Maps an index to their x, y coordinates in the texture. + + Invalid indexes will be mapped to the last character in the font. + """ + if idx < 0 or idx >= (self.end - self.start): + idx = (self.end - self.start - 1) + + xp1 = (idx % self.cols) * (self.charwidth + 1) + yp1 = (idx // self.cols) * (self.charheight + 1) + + if self.monospace: + xp2 = xp1 + self.charwidth + 1 + yp2 = yp1 + self.charheight + 1 + else: + xp2 = xp1 + self.charsizes[idx][0] + 1 + yp2 = yp1 + self.charsizes[idx][1] + 1 + + xtc1 = (float(xp1) + 0.0) / self.texwidth + ytc1 = (float(yp1) + 0.0) / self.texheight + xtc2 = (float(xp2) - 1.0) / self.texwidth + ytc2 = (float(yp2) - 1.0) / self.texheight + + return (xtc1, ytc1, xtc2, ytc2) + + def load_definition(self, deffile): + """ + Loads a texture font definition (.tfd). + + These simple datafiles are generated by fontmaker.py to provide character + spacing information about the associated texture font. + + This should be called before load_texture. + """ + dd = open(deffile, 'r') + + if dd.readline() != "fontheader\n": + raise ValueError('"%s" is not a font definition file' % (deffile,)) + + def nextline(dd): + return [int(x) for x in dd.readline().rstrip().split(',')] + + self.start, self.end = nextline(dd) + self.charwidth, self.charheight = nextline(dd) + self.cols, self.rows = nextline(dd) + self.texwidth, self.texheight = nextline(dd) + + self.charwidth -= 1 + self.charheight -= 1 + + assert dd.readline() == "charsizes\n" + + self.charsizes = [None] * (self.end - self.start) + monospace = True + monoheight = True + + for i in range(0, (self.end - self.start)): + x, y = nextline(dd) + if x != self.charwidth: + monospace = False + if y != self.charheight: + monoheight = False + self.charsizes[i] = (x, y) + + "not yet capable of dealing properly with fonts of variable height" + assert monoheight + self.monospace = monospace + + + def load_texture(self, texfile): + """ + Loads a texture image (.png) + + The PNG image should contain 32-bit color with alpha channel. The image + will be loaded as an OpenGL texture. + + This function must be called after load_definition. + """ + tf = TextureFile() + tf.load(texfile) + self.gltex = tf + assert self.gltex.w == self.texwidth + assert self.gltex.h == self.texheight + + \ No newline at end of file diff --git a/gamedata.py b/gamedata.py index f3f886c..29c9470 100755 --- a/gamedata.py +++ b/gamedata.py @@ -1,276 +1,276 @@ -import glob -import os -try: - from xml.etree.cElementTree import parse -except ImportError: - from elementtree.ElementTree import parse -import files -import shader -from deprecate import deprecated - -class MissingNode(object): - def __init__(self): - self.text = None - def get(self, name): - return None - -class GameDataTagDef(object): - def __init__(self): - self.multi = False - self.opt = False - self.type = None - self.default = None - -class GameDataNode(object): - def __init__(self): - self.dict = {} - self.missing = False - - def __setitem__(self, name, val): - self.dict[name] = val - def __getitem__(self, name): - return self.dict[name]._value - def __getattr__(self, name): - if name == 'dict': - raise AttributeError, name - try: - return self.dict[name] - except KeyError: - if name == '_value': - return None - raise AttributeError, name - def __setattr__(self, name, val): - if name == 'dict': - return object.__setattr__(self, name, val) - try: - self.dict[name] = val - except KeyError: - object.__setattr__(self, name, val) - def add_multi(self, key, value): - if not self.dict.has_key(key): - self.dict[key] = [] - self.dict[key].append(value) - def add_single(self, key, value): - self.dict[key] = value - def __repr__(self): - return """""" % (self.dict['_name'],) - def has_key(self, key): - return self.dict.has_key(key) - -class XMLGameDataReader(object): - def __init__(self, bin, xml): - self._bin = bin - self._xml = xml - self._tree = self.construct() - self._name = xml.tag - - - def value_as_type(self, value, type): - if type == 'string': - return value - elif type == 'bool': - if value and value[0].lower() in ('y', 't', '1'): - return True - else: - return False - elif type == 'int': - return int(value) - elif type == 'float': - return float(value) - elif type == 'csvarray': - # csvarrays are always ints... - return [int(x.strip()) for x in value.split(',')] - else: - raise TypeError, type - - def create_datatag_def(self, tag): - d = GameDataTagDef() - if tag.get('multiple') != None and tag.get('multiple')[0].lower() == 'y': - d.multi = True - if tag.get('optional') != None and tag.get('optional')[0].lower() == 'y': - d.opt = True - if tag.get('data') != None: - d.type = tag.get('data') - if tag.get('default') != None: - d.default = self.value_as_type(tag.get('default'), d.type) - d.opt = True - return d - - def create_attribute_def(self, tag): - return self.create_datatag_def(tag) - - def construct_node(self, bin, xml, allow_missing=False): - node = GameDataNode() - if isinstance(xml, MissingNode): - node.missing = True - value = None - if bin.tag == 'datatag': - df = self.create_datatag_def(bin) - if df.type: - value = xml.text - if df.type == 'bool': - # if tag exists, since it is a bool, that means it's True - value = not node.missing - elif (node.missing or value == None) and df.opt: - value = df.default - elif (node.missing or value == None) and not allow_missing: - raise ValueError, "Missing value for mandatory tag %s" % (bin.get('name'),) - elif (node.missing or value == None): - value = None - else: - value = self.value_as_type(value, df.type) - - node['_value'] = value - elif bin.tag == 'attribute': - df = self.create_attribute_def(bin) - if df.type: - value = xml.get(bin.get('name')) - if value == None and df.opt: - value = df.default - elif not value and not allow_missing: - raise ValueError, "Missing value for mandatory tag %s" % (bin.get('name'),) - elif not value: - value = None - else: - value = self.value_as_type(value, df.type) - - node['_value'] = value - - node['_def'] = df - node['_name'] = bin.get('name') - return node - - - def construct_recurse(self, bin, xml, allow_missing=False): - xmldict = {} - tagdict = {} - attrdict = {} - - if bin.tag == 'xml_binary_packing': - node = GameDataNode() - else: - node = self.construct_node(bin, xml, allow_missing) - - for child in bin.getchildren(): - if child.tag == 'datatag': - tagdict[child.get('name')] = child - elif child.tag == 'attribute': - attrdict[child.get('name')] = child - else: - raise ValueError - - xmlattrdict = {} - xmltagdict = {} - - if not isinstance(xml, MissingNode): - for k, v in xml.items(): - if not k in attrdict: - raise ValueError, "Key %s not a valid attribute: %s" % (k, attrdict.keys()) - continue - binchild = attrdict[k] - xmlchild = xml - xmlattrdict[k] = 0 - subnode = self.construct_node(binchild, xml, allow_missing) - if subnode._def.multi: - node.add_multi(k, subnode) - else: - node.add_single(k, subnode) - - for child in xml.getchildren(): - if not child.tag in tagdict: - raise ValueError - continue - binchild = tagdict[child.tag] - xmlchild = child - xmltagdict[child.tag] = 0 - subnode = self.construct_recurse(binchild, xmlchild, allow_missing) - if subnode._def.multi: - node.add_multi(child.tag, subnode) - else: - node.add_single(child.tag, subnode) - - - missing = MissingNode() - for k in tagdict.keys(): - if not k in xmltagdict: - # Missing datatag - subnode = self.construct_recurse(tagdict[k], missing, isinstance(xml, MissingNode)) - if not subnode._def.multi: - node.add_single(k, subnode) - else: - node.add_single(k, []) - - for k in attrdict.keys(): - if not k in xmlattrdict: - # Missing attribute - subnode = self.construct_node(attrdict[k], missing, isinstance(xml, MissingNode)) - if not subnode._def.multi: - node.add_single(k, subnode) - else: - node.add_single(k, []) - - - - return node - - def construct(self): - rootname = self._bin.get('name') - assert rootname == self._xml.tag - - return self.construct_recurse(self._bin, self._xml) - - def __getattr__(self, name): - if name == 'tree': - raise AttributeError, name - return self._tree.__getattr__(name) - def __getitem__(self, name): - return self._tree.__getitem__(name) - - -def load_xml_files(binfile, xmlfile): - bintree = parse(binfile).getroot() - xmltree = parse(xmlfile).getroot() - - return XMLGameDataReader(bintree, xmltree) - -def get(dataname): - if dataname in get.cache: - return get.cache[dataname] - - bin = files.mgr.path("xml/def", "%s.xml" % (dataname,)) - xml = files.mgr.path("xml", "%s.xml" % (dataname,)) - - if not os.path.exists(bin) or not os.path.exists(xml): - raise OSError("XML data file does not exist") - - dataobj = load_xml_files(bin, xml) - - get.cache[dataname] = dataobj - return dataobj - -get.cache = {} - -@deprecated -def load_gamedata(): - bins = glob.glob(files.mgr.path("xml/def", "*.xml")) - xmls = glob.glob(files.mgr.path("xml", "*.xml")) - - binfns = [os.path.split(x)[1] for x in bins] - xmlfns = [os.path.split(x)[1] for x in xmls] - ffns = [] - for bfn in binfns: - if bfn in xmlfns: - ffns.append(bfn) - - dataobjs = {} - for fn in ffns: - binfile = files.mgr.path("xml/def", fn) - xmlfile = files.mgr.path("xml", fn) - dataobj = load_xml_files(binfile, xmlfile) - dataobjs[dataobj._name] = dataobj - - shader.mgr.load_shaders(dataobjs['shaders']) - return dataobjs - - - +import glob +import os +try: + from xml.etree.cElementTree import parse +except ImportError: + from elementtree.ElementTree import parse +import files +import shader +from deprecate import deprecated + +class MissingNode(object): + def __init__(self): + self.text = None + def get(self, name): + return None + +class GameDataTagDef(object): + def __init__(self): + self.multi = False + self.opt = False + self.type = None + self.default = None + +class GameDataNode(object): + def __init__(self): + self.dict = {} + self.missing = False + + def __setitem__(self, name, val): + self.dict[name] = val + def __getitem__(self, name): + return self.dict[name]._value + def __getattr__(self, name): + if name == 'dict': + raise AttributeError(name) + try: + return self.dict[name] + except KeyError: + if name == '_value': + return None + raise AttributeError(name) + def __setattr__(self, name, val): + if name == 'dict': + return object.__setattr__(self, name, val) + try: + self.dict[name] = val + except KeyError: + object.__setattr__(self, name, val) + def add_multi(self, key, value): + if key not in self.dict: + self.dict[key] = [] + self.dict[key].append(value) + def add_single(self, key, value): + self.dict[key] = value + def __repr__(self): + return """""" % (self.dict['_name'],) + def has_key(self, key): + return key in self.dict + +class XMLGameDataReader(object): + def __init__(self, bin, xml): + self._bin = bin + self._xml = xml + self._tree = self.construct() + self._name = xml.tag + + + def value_as_type(self, value, type): + if type == 'string': + return value + elif type == 'bool': + if value and value[0].lower() in ('y', 't', '1'): + return True + else: + return False + elif type == 'int': + return int(value) + elif type == 'float': + return float(value) + elif type == 'csvarray': + # csvarrays are always ints... + return [int(x.strip()) for x in value.split(',')] + else: + raise TypeError(type) + + def create_datatag_def(self, tag): + d = GameDataTagDef() + if tag.get('multiple') != None and tag.get('multiple')[0].lower() == 'y': + d.multi = True + if tag.get('optional') != None and tag.get('optional')[0].lower() == 'y': + d.opt = True + if tag.get('data') != None: + d.type = tag.get('data') + if tag.get('default') != None: + d.default = self.value_as_type(tag.get('default'), d.type) + d.opt = True + return d + + def create_attribute_def(self, tag): + return self.create_datatag_def(tag) + + def construct_node(self, bin, xml, allow_missing=False): + node = GameDataNode() + if isinstance(xml, MissingNode): + node.missing = True + value = None + if bin.tag == 'datatag': + df = self.create_datatag_def(bin) + if df.type: + value = xml.text + if df.type == 'bool': + # if tag exists, since it is a bool, that means it's True + value = not node.missing + elif (node.missing or value == None) and df.opt: + value = df.default + elif (node.missing or value == None) and not allow_missing: + raise ValueError("Missing value for mandatory tag %s" % (bin.get('name'),)) + elif (node.missing or value == None): + value = None + else: + value = self.value_as_type(value, df.type) + + node['_value'] = value + elif bin.tag == 'attribute': + df = self.create_attribute_def(bin) + if df.type: + value = xml.get(bin.get('name')) + if value == None and df.opt: + value = df.default + elif not value and not allow_missing: + raise ValueError("Missing value for mandatory tag %s" % (bin.get('name'),)) + elif not value: + value = None + else: + value = self.value_as_type(value, df.type) + + node['_value'] = value + + node['_def'] = df + node['_name'] = bin.get('name') + return node + + + def construct_recurse(self, bin, xml, allow_missing=False): + xmldict = {} + tagdict = {} + attrdict = {} + + if bin.tag == 'xml_binary_packing': + node = GameDataNode() + else: + node = self.construct_node(bin, xml, allow_missing) + + for child in bin.getchildren(): + if child.tag == 'datatag': + tagdict[child.get('name')] = child + elif child.tag == 'attribute': + attrdict[child.get('name')] = child + else: + raise ValueError + + xmlattrdict = {} + xmltagdict = {} + + if not isinstance(xml, MissingNode): + for k, v in list(xml.items()): + if not k in attrdict: + raise ValueError("Key %s not a valid attribute: %s" % (k, list(attrdict.keys()))) + continue + binchild = attrdict[k] + xmlchild = xml + xmlattrdict[k] = 0 + subnode = self.construct_node(binchild, xml, allow_missing) + if subnode._def.multi: + node.add_multi(k, subnode) + else: + node.add_single(k, subnode) + + for child in xml.getchildren(): + if not child.tag in tagdict: + raise ValueError + continue + binchild = tagdict[child.tag] + xmlchild = child + xmltagdict[child.tag] = 0 + subnode = self.construct_recurse(binchild, xmlchild, allow_missing) + if subnode._def.multi: + node.add_multi(child.tag, subnode) + else: + node.add_single(child.tag, subnode) + + + missing = MissingNode() + for k in list(tagdict.keys()): + if not k in xmltagdict: + # Missing datatag + subnode = self.construct_recurse(tagdict[k], missing, isinstance(xml, MissingNode)) + if not subnode._def.multi: + node.add_single(k, subnode) + else: + node.add_single(k, []) + + for k in list(attrdict.keys()): + if not k in xmlattrdict: + # Missing attribute + subnode = self.construct_node(attrdict[k], missing, isinstance(xml, MissingNode)) + if not subnode._def.multi: + node.add_single(k, subnode) + else: + node.add_single(k, []) + + + + return node + + def construct(self): + rootname = self._bin.get('name') + assert rootname == self._xml.tag + + return self.construct_recurse(self._bin, self._xml) + + def __getattr__(self, name): + if name == 'tree': + raise AttributeError(name) + return self._tree.__getattr__(name) + def __getitem__(self, name): + return self._tree.__getitem__(name) + + +def load_xml_files(binfile, xmlfile): + bintree = parse(binfile).getroot() + xmltree = parse(xmlfile).getroot() + + return XMLGameDataReader(bintree, xmltree) + +def get(dataname): + if dataname in get.cache: + return get.cache[dataname] + + bin = files.mgr.path("xml/def", "%s.xml" % (dataname,)) + xml = files.mgr.path("xml", "%s.xml" % (dataname,)) + + if not os.path.exists(bin) or not os.path.exists(xml): + raise OSError("XML data file does not exist") + + dataobj = load_xml_files(bin, xml) + + get.cache[dataname] = dataobj + return dataobj + +get.cache = {} + +@deprecated +def load_gamedata(): + bins = glob.glob(files.mgr.path("xml/def", "*.xml")) + xmls = glob.glob(files.mgr.path("xml", "*.xml")) + + binfns = [os.path.split(x)[1] for x in bins] + xmlfns = [os.path.split(x)[1] for x in xmls] + ffns = [] + for bfn in binfns: + if bfn in xmlfns: + ffns.append(bfn) + + dataobjs = {} + for fn in ffns: + binfile = files.mgr.path("xml/def", fn) + xmlfile = files.mgr.path("xml", fn) + dataobj = load_xml_files(binfile, xmlfile) + dataobjs[dataobj._name] = dataobj + + shader.mgr.load_shaders(dataobjs['shaders']) + return dataobjs + + + diff --git a/gametimer.py b/gametimer.py index 27cc631..0a8fcc8 100755 --- a/gametimer.py +++ b/gametimer.py @@ -65,7 +65,7 @@ def num_frames(delay, offset=0): return int((g_timer - offset) / delay) - int((g_timer - g_elapsed - offset) / delay) def loop_frames(delay, offset=0): - return xrange(num_frames(delay, offset)) + return range(num_frames(delay, offset)) def get_timer(): return g_timer @@ -81,7 +81,7 @@ def average(d): # pass v2 = float(d[0]) - for i in xrange(1, len(d)): + for i in range(1, len(d)): v1 = float(d[i]) v2 = (smooth * v2) + ((1.0 - smooth) * v1) diff --git a/lesson6.py b/lesson6.py index 72e97c6..6d5e81b 100755 --- a/lesson6.py +++ b/lesson6.py @@ -221,6 +221,6 @@ def main(): glutMainLoop() # Print message to console, and kick off the main to get it rolling. -print "Hit ESC key to quit." +print("Hit ESC key to quit.") main() diff --git a/models.py b/models.py index 0cd7ca0..60a7c94 100755 --- a/models.py +++ b/models.py @@ -51,7 +51,7 @@ class Model_Manager(object): self.textypes[enums.tt.specular] = TextureType(GL_TEXTURE2, GL_TEXTURE_2D) self.textypes[enums.tt.normal] = TextureType(GL_TEXTURE3, GL_TEXTURE_2D) - for tt in self.textypes.values(): + for tt in list(self.textypes.values()): tt.initialize() @@ -119,7 +119,7 @@ class Model_Manager(object): fontname = os.path.splitext(os.path.split(fontfile)[1])[0] fontobj = fonts.TexFont.new(fontdir, fontname) self.fontlib[fontname] = fontobj - print "Loaded font %s" % (fontname,) + print("Loaded font %s" % (fontname,)) def get_font(self, name): return self.fontlib[name] @@ -214,7 +214,7 @@ class TextureFile(object): self.filename = filename img = files.mgr.png(filename) texid = glGenTextures(1) - print "Generated texture id %s from %s" % (texid, self.filename) + print("Generated texture id %s from %s" % (texid, self.filename)) self.id = texid diff --git a/physics.py b/physics.py index 5a2591f..136cf2b 100755 --- a/physics.py +++ b/physics.py @@ -67,7 +67,7 @@ class physics_manager(object): if not other.massless: moved2 = obj.collide(other) - print "Collision!" + print("Collision!") assert False return moved1 or moved2 @@ -78,7 +78,7 @@ class physics_manager(object): positions_adjusted = False iter += 1 pairmap = {} - for key, cell in self.cells.items(): + for key, cell in list(self.cells.items()): for obj in cell: self._postcollide_single(obj, key, pairmap) diff --git a/platform.py b/platform.py index a19ab0d..08f6a71 100644 --- a/platform.py +++ b/platform.py @@ -1,9 +1,9 @@ -import sys -if sys.platform == 'win32': - from platform_win32 import * -elif sys.platform == 'darwin': - from platform_darwin import * -elif sys.platform == 'posix': - from platform_posix import * -else: - raise NotImplementedError("Not ported to this platform") \ No newline at end of file +import sys +if sys.platform == 'win32': + from platform_win32 import * +elif sys.platform == 'darwin': + from platform_darwin import * +elif sys.platform in ('posix', 'linux'): + from platform_posix import * +else: + raise NotImplementedError("Not ported to this platform") diff --git a/platform_darwin.py b/platform_darwin.py index 82fe4f5..32e6de7 100644 --- a/platform_darwin.py +++ b/platform_darwin.py @@ -1,17 +1,17 @@ - -def enable_vsync(): - try: - import ctypes - import ctypes.util - ogl = ctypes.cdll.LoadLibrary(ctypes.util.find_library("OpenGL")) - v = ctypes.c_int(1) - ogl.CGLSetParameter(ogl.CGLGetCurrentContext(), ctypes.c_int(222), ctypes.pointer(v)) - except: - print "Unable to set vsync mode, using driver defaults" - -def get_window_handle(): - return None - -def get_window_rect(handle=None): - pass + +def enable_vsync(): + try: + import ctypes + import ctypes.util + ogl = ctypes.cdll.LoadLibrary(ctypes.util.find_library("OpenGL")) + v = ctypes.c_int(1) + ogl.CGLSetParameter(ogl.CGLGetCurrentContext(), ctypes.c_int(222), ctypes.pointer(v)) + except: + print("Unable to set vsync mode, using driver defaults") + +def get_window_handle(): + return None + +def get_window_rect(handle=None): + pass \ No newline at end of file diff --git a/refuge.py b/refuge.py index 44ab9e8..a00855e 100755 --- a/refuge.py +++ b/refuge.py @@ -19,7 +19,7 @@ try: from PIL import PngImagePlugin except: import PngImagePlugin -from gameobj import * +from .gameobj import * from player import * from particles import * from ai import * diff --git a/roc.py b/roc_core.py similarity index 100% rename from roc.py rename to roc_core.py diff --git a/roc_test.py b/roc_test.py index 03708b3..c901d54 100755 --- a/roc_test.py +++ b/roc_test.py @@ -1,12 +1,16 @@ +#import roc +import os +import sys +sys.path.append(os.path.abspath('..')) import roc import pygame from OpenGL.GL import * from py3dutil import vect, quat -import models -import fonts -import gametimer -from platform import * -import pipeline +from roc import models +from roc import fonts +from roc import gametimer +from roc.platform import * +from roc import pipeline import time import collections import random @@ -24,8 +28,8 @@ class partycle(object): @classmethod def random(cls): - x, y = [((random.random() * 2.0) - 1.0) * 10.0 for _ in xrange(2)] - xd, yd = [((random.random() * 2.0) - 1.0) * 4.0 for _ in xrange(2)] + x, y = [((random.random() * 2.0) - 1.0) * 10.0 for _ in range(2)] + xd, yd = [((random.random() * 2.0) - 1.0) * 4.0 for _ in range(2)] hue = random.random() m1 = 1.0 h1 = hue * 6.0 @@ -56,7 +60,7 @@ class partycle(object): self.yd *= 0.985 self.rot += self.rotd -class test_universe(roc.base_universe): +class test_universe(roc.universe.base_universe): def __init__(self): self.font = models.mgr.fontlib["micross20"] self.text1 = models.TextModel("micross20", "#$% 0123 ,,,, Hello world!\xa8\xa8\xa8F", (1.0, 1.0, 0.5, 1.0)) @@ -112,7 +116,7 @@ class test_universe(roc.base_universe): self.text1.render() glPopMatrix() - for x in xrange(gametimer.num_frames(10)): + for x in range(gametimer.num_frames(10)): self.move = self.move + self.moveinc if self.move > 300.0: self.moveinc = -1.0 @@ -139,7 +143,7 @@ class test_universe(roc.base_universe): for x in xrange(gametimer.num_frames(1000)): self.string = self.string + str(len(self.string) % 10) """ - for x in xrange(gametimer.num_frames(100)): + for x in range(gametimer.num_frames(100)): self.string = str(round(gametimer.get_fps(), 1)) #print len(gametimer.g_framelist) @@ -148,20 +152,21 @@ class test_universe(roc.base_universe): glPopMatrix() # texture test - mdl2 = models.mgr.create("m_dralthi") + mdl2 = models.mgr.create("m_particle") mdl2.layers[0].color = None #print mdl2.layers[0].mesh for party in self.particles: glPushMatrix() glTranslate(600.0 + party.x, 350.0 + party.y, 6.0) glRotate(party.rot, 0.0, 0.0, 1.0) - #glColor4f(*party.color) + glColor4f(*party.color) mdl2.render() glPopMatrix() - +roc.video.width = 1024 +roc.video.height = 768 roc.init2d() roc.set_universe(test_universe()) roc.main() diff --git a/shader.py b/shader.py index a9f69ba..b2ec4fe 100755 --- a/shader.py +++ b/shader.py @@ -1,219 +1,220 @@ -import ctypes -from OpenGL.GL import * -try: - import OpenGL.raw.GL - raw = OpenGL.raw -except ImportError: - pass -from OpenGL.arrays import GLintArray, GLcharArray, GLsizeiArray, GLcharARBArray -import sys -import gamedata - - -class shader_manager(object): - def __init__(self): - # Fixed Pipeline is always zero - self.shaderlib = {'ffp': 0} - self.shaderprograms = {} - - self.initshadersources = [] - self.initmode = 'auto' - self.initialized = False - - def use_gl2_shaders(self): - self.funcs = { - 'create': glCreateShader, - 'source': glShaderSource, - 'compile': glCompileShader, - 'program': glCreateProgram, - 'attach': glAttachShader, - 'link': glLinkProgram, - 'use': glUseProgram, - 'param': glGetShaderiv, - 'uniform': glUniform4f, - 'arraytype': GLcharArray - } - def use_raw_shaders(self): - self.funcs = { - 'create': raw.GL.glCreateShader, - 'source': raw.GL.glShaderSource, - 'compile': raw.GL.glCompileShader, - 'program': raw.GL.glCreateProgram, - 'attach': raw.GL.glAttachShader, - 'link': raw.GL.glLinkProgram, - 'use': raw.GL.glUseProgram, - 'param': raw.GL.glGetShaderiv - } - - def use_arb_shaders(self): - from OpenGL.GL.ARB import shader_objects - if not shader_objects.glInitShaderObjectsARB(): - raise RuntimeError("ARB Shaders failed to initialize") - - self.funcs = { - 'create': shader_objects.glCreateShaderObjectARB, - 'source': shader_objects.glShaderSourceARB, - 'compile': shader_objects.glCompileShaderARB, - 'program': shader_objects.glCreateProgramObjectARB, - 'attach': shader_objects.glAttachObjectARB, - 'link': shader_objects.glLinkProgramARB, - 'use': shader_objects.glUseProgramObjectARB, - 'uniform': shader_objects.glUniform4fARB, - 'param': shader_objects.glGetObjectParameterivARB - } - def use_arb_new_shaders(self): - from OpenGL.GL.ARB import shader_objects_new - shader_objects = shader_objects_new - if not shader_objects.glInitShaderObjectsARB(): - raise RuntimeError("ARB New Shaders failed to initialize") - - self.funcs = { - 'create': shader_objects.glCreateShaderObjectARB, - 'source': shader_objects.base_glShaderSourceARB, - 'compile': shader_objects.glCompileShaderARB, - 'program': shader_objects.glCreateProgramObjectARB, - 'attach': shader_objects.glAttachObjectARB, - 'link': shader_objects.glLinkProgramARB, - 'use': shader_objects.glUseProgramObjectARB, - 'param': shader_objects.glGetObjectParameterivARB, - 'arraytype': GLcharARBArray - } - - def init_gl(self): - if self.initialized: - return - - self.initialized = True - import files - #print glGetString(GL_EXTENSIONS) - if True: - self.use_gl2_shaders() - else: - self.use_arb_shaders() - #self.use_gl2_shaders() - - for name, vertex, fragment in self.initshadersources: - vf = files.mgr.open('shaders/%s.vert' % (vertex,)) - ff = files.mgr.open('shaders/%s.frag' % (fragment,)) - vs = self.funcs['create'](GL_VERTEX_SHADER) - fs = self.funcs['create'](GL_FRAGMENT_SHADER) - self.funcs['source'](vs, vf.read()) - self.funcs['source'](fs, ff.read()) - rv = self.funcs['compile'](vs) - rv = self.funcs['compile'](fs) - sp = self.funcs['program']() - self.funcs['attach'](sp, vs) - self.funcs['attach'](sp, fs) - rv = self.funcs['link'](sp) - self.shaderlib[name] = sp - self.shaderprograms[name] = (vs, fs) - - def detect(self): - shaderlist = [ - ('GL2', self.use_gl2_shaders), - ('ARB', self.use_arb_shaders), - ('ARBNEW', self.use_arb_new_shaders), - ('RAW', self.use_raw_shaders) - ] - - workable_shaders = [] - - for shadername, shaderinit in shaderlist: - try: - shaderinit() - except: - print "Shader type %s failed to initialize" % (shadername,) - continue - try: - self.select("ffp") - except: - print "Shader type %s failed to access the fixed function pipeline" % (shadername,) - continue - try: - self.select("standard") - except: - print "Shader type %s failed to load the \"standard\" vertex and fragment shaders" % (shadername,) - continue - - workable_shaders.append(shadername) - - return workable_shaders - - def autoinit(self): - shadertypes = self.detect() - - if not shadertypes: - raise ValueError, "No working shaders detected" - - self.init_shadertype(shadertypes[0]) - - def init_shadertype(self, shadertype): - if shadertype == "GL2": - self.use_gl2_shaders() - elif shadertype == "ARB": - self.use_arb_shaders() - elif shadertype == "ARBNEW": - self.use_arb_new_shaders() - elif shadertype == "RAW": - self.use_raw_shaders() - - - - def select(self, shader): - if self.initshadersources: - self.init_gl() - self.initshadersources = [] - if not shader in self.shaderlib: - self.funcs['use'](0) - return True - try: - self.funcs['use'](self.shaderlib[shader]) - except GLError: - p = self.shaderlib[shader] - v, f = self.shaderprograms[shader] - print "Shader failed to execute: %s" % (shader,) - print "Vertex shader log:" - lenarr = GLintArray.zeros(1) - glGetShaderiv(v, GL_INFO_LOG_LENGTH, lenarr) - infoarr = GLcharArray.zeros(lenarr[0]) - outsize = GLsizeiArray.zeros(1) - glGetShaderInfoLog(v, lenarr[0], outsize, infoarr) - print ''.join([chr(x) for x in infoarr[:outsize[0]]]) - print "Fragment shader log:" - lenarr = GLintArray.zeros(1) - glGetShaderiv(f, GL_INFO_LOG_LENGTH, lenarr) - infoarr = GLcharArray.zeros(lenarr[0]) - outsize = GLsizeiArray.zeros(1) - glGetShaderInfoLog(f, lenarr[0], outsize, infoarr) - print ''.join([chr(x) for x in infoarr[:outsize[0]]]) - print "Program info log:" - lenarr = GLintArray.zeros(1) - glGetProgramiv(p, GL_INFO_LOG_LENGTH, lenarr) - infoarr = GLcharArray.zeros(lenarr[0]) - outsize = GLsizeiArray.zeros(1) - glGetProgramInfoLog(p, lenarr[0], outsize, infoarr) - print ''.join([chr(x) for x in infoarr[:outsize[0]]]) - glDeleteShader(v) - glDeleteShader(f) - glDeleteProgram(p) - del self.shaderprograms[shader] - del self.shaderlib[shader] - glUseProgram(0) - - return False - - return True - - def load(self): - shader_data = gamedata.get('shaders') - self.load_shaders(shader_data) - - def load_shaders(self, shaders): - for shader in shaders.shader: - self.initshadersources.append((shader['id'], shader['vertex'], shader['fragment'])) - -def init(): - global mgr - mgr = shader_manager() - -mgr = None +import ctypes +from OpenGL.GL import * +try: + import OpenGL.raw.GL + raw = OpenGL.raw +except ImportError: + pass +from OpenGL.arrays import GLintArray, GLcharArray, GLsizeiArray, GLcharARBArray +import sys +import gamedata + + +class shader_manager(object): + def __init__(self): + # Fixed Pipeline is always zero + self.shaderlib = {'ffp': 0} + self.shaderprograms = {} + + self.initshadersources = [] + self.initmode = 'auto' + self.initialized = False + + def use_gl2_shaders(self): + self.funcs = { + 'create': glCreateShader, + 'source': glShaderSource, + 'compile': glCompileShader, + 'program': glCreateProgram, + 'attach': glAttachShader, + 'link': glLinkProgram, + 'use': glUseProgram, + 'param': glGetShaderiv, + 'uniform': glUniform4f, + 'arraytype': GLcharArray + } + def use_raw_shaders(self): + self.funcs = { + 'create': raw.GL.glCreateShader, + 'source': raw.GL.glShaderSource, + 'compile': raw.GL.glCompileShader, + 'program': raw.GL.glCreateProgram, + 'attach': raw.GL.glAttachShader, + 'link': raw.GL.glLinkProgram, + 'use': raw.GL.glUseProgram, + 'param': raw.GL.glGetShaderiv + } + + def use_arb_shaders(self): + from OpenGL.GL.ARB import shader_objects + if not shader_objects.glInitShaderObjectsARB(): + raise RuntimeError("ARB Shaders failed to initialize") + + self.funcs = { + 'create': shader_objects.glCreateShaderObjectARB, + 'source': shader_objects.glShaderSourceARB, + 'compile': shader_objects.glCompileShaderARB, + 'program': shader_objects.glCreateProgramObjectARB, + 'attach': shader_objects.glAttachObjectARB, + 'link': shader_objects.glLinkProgramARB, + 'use': shader_objects.glUseProgramObjectARB, + 'uniform': shader_objects.glUniform4fARB, + 'param': shader_objects.glGetObjectParameterivARB + } + def use_arb_new_shaders(self): + from OpenGL.GL.ARB import shader_objects_new + shader_objects = shader_objects_new + if not shader_objects.glInitShaderObjectsARB(): + raise RuntimeError("ARB New Shaders failed to initialize") + + self.funcs = { + 'create': shader_objects.glCreateShaderObjectARB, + 'source': shader_objects.base_glShaderSourceARB, + 'compile': shader_objects.glCompileShaderARB, + 'program': shader_objects.glCreateProgramObjectARB, + 'attach': shader_objects.glAttachObjectARB, + 'link': shader_objects.glLinkProgramARB, + 'use': shader_objects.glUseProgramObjectARB, + 'param': shader_objects.glGetObjectParameterivARB, + 'arraytype': GLcharARBArray + } + + def init_gl(self): + if self.initialized: + return + + self.initialized = True + import files + #print glGetString(GL_EXTENSIONS) + if True: + self.use_gl2_shaders() + else: + self.use_arb_shaders() + #self.use_gl2_shaders() + + for name, vertex, fragment in self.initshadersources: + vf = files.mgr.open('shaders/%s.vert' % (vertex,)) + ff = files.mgr.open('shaders/%s.frag' % (fragment,)) + vs = self.funcs['create'](GL_VERTEX_SHADER) + fs = self.funcs['create'](GL_FRAGMENT_SHADER) + self.funcs['source'](vs, vf.read()) + self.funcs['source'](fs, ff.read()) + rv = self.funcs['compile'](vs) + rv = self.funcs['compile'](fs) + sp = self.funcs['program']() + self.funcs['attach'](sp, vs) + self.funcs['attach'](sp, fs) + rv = self.funcs['link'](sp) + self.shaderlib[name] = sp + self.shaderprograms[name] = (vs, fs) + + def detect(self): + shaderlist = [ + ('GL2', self.use_gl2_shaders), + ('ARB', self.use_arb_shaders), + ('ARBNEW', self.use_arb_new_shaders), + ('RAW', self.use_raw_shaders) + ] + + workable_shaders = [] + + for shadername, shaderinit in shaderlist: + try: + shaderinit() + except: + print("Shader type %s failed to initialize" % (shadername,)) + continue + try: + self.select("ffp") + except: + print("Shader type %s failed to access the fixed function pipeline" % (shadername,)) + continue + try: + self.select("standard") + except: + print("Shader type %s failed to load the \"standard\" vertex and fragment shaders" % (shadername,)) + continue + + workable_shaders.append(shadername) + + return workable_shaders + + def autoinit(self): + shadertypes = self.detect() + + if not shadertypes: + raise ValueError("No working shaders detected") + + self.init_shadertype(shadertypes[0]) + + def init_shadertype(self, shadertype): + if shadertype == "GL2": + self.use_gl2_shaders() + elif shadertype == "ARB": + self.use_arb_shaders() + elif shadertype == "ARBNEW": + self.use_arb_new_shaders() + elif shadertype == "RAW": + self.use_raw_shaders() + + + + def select(self, shader): + if self.initshadersources: + self.init_gl() + self.initshadersources = [] + if not shader in self.shaderlib: + self.funcs['use'](0) + return True + try: + self.funcs['use'](self.shaderlib[shader]) + except GLError: + p = self.shaderlib[shader] + v, f = self.shaderprograms[shader] + print("Shader failed to execute: %s" % (shader,)) + print("Vertex shader log:") + lenarr = GLintArray.zeros(1) + glGetShaderiv(v, GL_INFO_LOG_LENGTH, lenarr) + infoarr = GLcharArray.zeros(lenarr[0]) + outsize = GLsizeiArray.zeros(1) + glGetShaderInfoLog(v, lenarr[0], outsize, infoarr) + print(''.join([chr(x) for x in infoarr[:outsize[0]]])) + print("Fragment shader log:") + lenarr = GLintArray.zeros(1) + glGetShaderiv(f, GL_INFO_LOG_LENGTH, lenarr) + infoarr = GLcharArray.zeros(lenarr[0]) + outsize = GLsizeiArray.zeros(1) + glGetShaderInfoLog(f, lenarr[0], outsize, infoarr) + print(''.join([chr(x) for x in infoarr[:outsize[0]]])) + print("Program info log:") + lenarr = GLintArray.zeros(1) + glGetProgramiv(p, GL_INFO_LOG_LENGTH, lenarr) + infoarr = GLcharArray.zeros(lenarr[0]) + outsize = GLsizeiArray.zeros(1) + glGetProgramInfoLog(p, lenarr[0], outsize, infoarr) + print(''.join([chr(x) for x in infoarr[:outsize[0]]])) + glDeleteShader(v) + glDeleteShader(f) + glDeleteProgram(p) + del self.shaderprograms[shader] + del self.shaderlib[shader] + glUseProgram(0) + + return False + + return True + + def load(self): + shader_data = gamedata.get('shaders') + self.load_shaders(shader_data) + + def load_shaders(self, shaders): + for shader in shaders.shader: + self.initshadersources.append((shader['id'], shader['vertex'], shader['fragment'])) + +def init(): + global mgr + mgr = shader_manager() + print("initiated shader mgr: %s" % (mgr,)) + +mgr = None diff --git a/tools/fontmaker.py b/tools/fontmaker.py index c14ffa7..5d81162 100644 --- a/tools/fontmaker.py +++ b/tools/fontmaker.py @@ -1,93 +1,93 @@ -import os -import pygame -import sys -import math - -pygame.init() -pygame.font.init() - -assert pygame.font.get_init() - -fmod = pygame.font -Font = pygame.font.Font - -fontname, fontsize = sys.argv[1:] - -if '/' in fontname: - ffile = fontname - fontname = os.path.splitext(os.path.split(fontname)[1])[0].lower() -else: - ffile = fmod.match_font(fontname) - -if not ffile: - print "Unable to find font... here is a list of fonts:\n" - for x in sorted(fmod.get_fonts()): - print x - sys.exit(0) - -fontsize = int(fontsize) -fontname = "%s%s" % (fontname, fontsize) - -f = Font(ffile, fontsize) - -start = 32 -end = 128 -images = [] -imsizes = [] -maxwidth = 0 -maxheight = 0 -for char in xrange(start, end): - letter = chr(char) - sz = f.size(letter) - maxwidth = max(maxwidth, sz[0]) - maxheight = max(maxheight, sz[1]) - im = f.render(letter, True, (255, 255, 255)) - images.append(im) - imsizes.append(sz) - -print len(images) -maxwidth += 1 -maxheight += 1 - -ratio = float(maxwidth) / float(maxheight) -print "Ratio %s" % (ratio,) -reqwidth = maxwidth * len(images) - -ratioheight = int(math.ceil(math.sqrt(len(images) * ratio))) -ratiowidth = int(math.ceil(len(images) / math.sqrt(len(images) * ratio))) - -print [ratioheight, ratiowidth] - -reqwidth = maxwidth * ratiowidth -reqheight = maxheight * ratioheight - -print [reqheight, reqwidth] - -texsize = 16 - -while texsize < reqheight or texsize < reqwidth: - texsize *= 2 - -print texsize - -tex = pygame.Surface((texsize, texsize), pygame.SRCALPHA, 32) -tex.fill((0, 0, 0, 0)) - -for i, im in enumerate(images): - tex.blit(im, (((i % ratiowidth) * maxwidth), ((i // ratiowidth) * maxheight))) - -pygame.image.save(tex, "%s.png" % (fontname,)) - -datf = open("%s.tfd" % (fontname,), "w") -datf.write("fontheader\n") -datf.write("%s,%s\n" % (start, end)) -datf.write("%s,%s\n" % (maxwidth, maxheight)) -datf.write("%s,%s\n" % (ratiowidth, ratioheight)) -datf.write("%s,%s\n" % (texsize, texsize)) -datf.write("charsizes\n") -for i, sz in enumerate(imsizes): - datf.write("%s,%s\n" % (sz[0], sz[1])) - -datf.close() - - +import os +import pygame +import sys +import math + +pygame.init() +pygame.font.init() + +assert pygame.font.get_init() + +fmod = pygame.font +Font = pygame.font.Font + +fontname, fontsize = sys.argv[1:] + +if '/' in fontname: + ffile = fontname + fontname = os.path.splitext(os.path.split(fontname)[1])[0].lower() +else: + ffile = fmod.match_font(fontname) + +if not ffile: + print("Unable to find font... here is a list of fonts:\n") + for x in sorted(fmod.get_fonts()): + print(x) + sys.exit(0) + +fontsize = int(fontsize) +fontname = "%s%s" % (fontname, fontsize) + +f = Font(ffile, fontsize) + +start = 32 +end = 128 +images = [] +imsizes = [] +maxwidth = 0 +maxheight = 0 +for char in range(start, end): + letter = chr(char) + sz = f.size(letter) + maxwidth = max(maxwidth, sz[0]) + maxheight = max(maxheight, sz[1]) + im = f.render(letter, True, (255, 255, 255)) + images.append(im) + imsizes.append(sz) + +print(len(images)) +maxwidth += 1 +maxheight += 1 + +ratio = float(maxwidth) / float(maxheight) +print("Ratio %s" % (ratio,)) +reqwidth = maxwidth * len(images) + +ratioheight = int(math.ceil(math.sqrt(len(images) * ratio))) +ratiowidth = int(math.ceil(len(images) / math.sqrt(len(images) * ratio))) + +print([ratioheight, ratiowidth]) + +reqwidth = maxwidth * ratiowidth +reqheight = maxheight * ratioheight + +print([reqheight, reqwidth]) + +texsize = 16 + +while texsize < reqheight or texsize < reqwidth: + texsize *= 2 + +print(texsize) + +tex = pygame.Surface((texsize, texsize), pygame.SRCALPHA, 32) +tex.fill((0, 0, 0, 0)) + +for i, im in enumerate(images): + tex.blit(im, (((i % ratiowidth) * maxwidth), ((i // ratiowidth) * maxheight))) + +pygame.image.save(tex, "%s.png" % (fontname,)) + +datf = open("%s.tfd" % (fontname,), "w") +datf.write("fontheader\n") +datf.write("%s,%s\n" % (start, end)) +datf.write("%s,%s\n" % (maxwidth, maxheight)) +datf.write("%s,%s\n" % (ratiowidth, ratioheight)) +datf.write("%s,%s\n" % (texsize, texsize)) +datf.write("charsizes\n") +for i, sz in enumerate(imsizes): + datf.write("%s,%s\n" % (sz[0], sz[1])) + +datf.close() + + diff --git a/video.py b/video.py index eac2962..567e022 100755 --- a/video.py +++ b/video.py @@ -18,7 +18,8 @@ def enable_vsync(): def skipping_next_frame(): return False -def set_res((width_in, height_in)): +def set_res(xxx_todo_changeme): + (width_in, height_in) = xxx_todo_changeme global height, width, hwnd load_window_pos() @@ -85,7 +86,7 @@ def init2d(): glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA) glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST) glLightModelfv(GL_LIGHT_MODEL_AMBIENT, (0.3, 0.3, 0.3, 1.0)) - + shader.mgr.load() shader.mgr.init_gl() shader.mgr.select("ffp")