From cca0a881c14d556711518f7b5fb58e5925798049 Mon Sep 17 00:00:00 2001 From: Axle1975 Date: Thu, 26 Feb 2026 09:13:11 +1100 Subject: [PATCH] v2026.2.17 --- .gitattributes | 4 + Icon/AIRCONS.PCX | Bin 0 -> 981 bytes Icon/AIRCRAFTCOMBAT.PCX | Bin 0 -> 981 bytes Icon/ARM.pcx | Bin 0 -> 1095 bytes Icon/BUILDING.PCX | Bin 0 -> 977 bytes Icon/CONS.PCX | Bin 0 -> 977 bytes Icon/CORE.pcx | Bin 0 -> 1135 bytes Icon/FACTORY.PCX | Bin 0 -> 1049 bytes Icon/GOK.pcx | Bin 0 -> 1129 bytes Icon/MOBILECOMBAT.PCX | Bin 0 -> 977 bytes Icon/NONE.PCX | Bin 0 -> 977 bytes Icon/NUKEICON.pcx | Bin 0 -> 1031 bytes Icon/UNKNOWN.PCX | Bin 0 -> 977 bytes Icon/iconcfg.ini | 23 + Icon/smallcircle.pcx | Bin 0 -> 1541 bytes LICENSE | 79 ++ .../crt/crt-lottes-fast-no-warp-bilinear.glsl | 701 ++++++++++++++ Shaders/interpolation/bilinear.glsl | 73 ++ .../interpolation/catmull-rom-bilinear.glsl | 137 +++ Shaders/interpolation/jinc2-dedither.glsl | 202 ++++ Shaders/interpolation/lanczos2-sharp.glsl | 205 ++++ Shaders/nearest-neighbor.glsl | 73 ++ Shaders/readme.txt | 10 + Shaders/scanlines/scanline.glsl | 106 ++ Shaders/sharpen/fast-sharpen.glsl | 148 +++ Shaders/xbr/xbr-lv2-noblend.glsl | 300 ++++++ Shaders/xbrz/xbrz-freescale.glsl | 375 ++++++++ TADEMO.UFO | 3 - TADemo/SERVER_OTA.EXE | 3 + TADemo/unitid.txt | 99 ++ TotalA.exe | 2 +- audiere.dll | 3 + bass.dll | 3 + basscd.dll | 3 + bassflac.dll | 3 + bassmix.dll | 3 + basswasapi.dll | 3 + cnc-ddraw config.exe | 3 + ddraw.dll | 3 + ddraw.ini | 906 ++++++++++++++++++ dplayx.dll | 3 + tdraw.dll | 3 + tdraw.txt | 326 +++++++ tmusi.dll | 3 + totala.ini | 223 +++++ tplayx.dll | 3 + wgmus readme.MD | 30 + wgmus.dll | 3 + wgmus.ini | 38 + win32.dll | 3 + 50 files changed, 4104 insertions(+), 4 deletions(-) create mode 100644 Icon/AIRCONS.PCX create mode 100644 Icon/AIRCRAFTCOMBAT.PCX create mode 100644 Icon/ARM.pcx create mode 100644 Icon/BUILDING.PCX create mode 100644 Icon/CONS.PCX create mode 100644 Icon/CORE.pcx create mode 100644 Icon/FACTORY.PCX create mode 100644 Icon/GOK.pcx create mode 100644 Icon/MOBILECOMBAT.PCX create mode 100644 Icon/NONE.PCX create mode 100644 Icon/NUKEICON.pcx create mode 100644 Icon/UNKNOWN.PCX create mode 100644 Icon/iconcfg.ini create mode 100644 Icon/smallcircle.pcx create mode 100644 LICENSE create mode 100644 Shaders/crt/crt-lottes-fast-no-warp-bilinear.glsl create mode 100644 Shaders/interpolation/bilinear.glsl create mode 100644 Shaders/interpolation/catmull-rom-bilinear.glsl create mode 100644 Shaders/interpolation/jinc2-dedither.glsl create mode 100644 Shaders/interpolation/lanczos2-sharp.glsl create mode 100644 Shaders/nearest-neighbor.glsl create mode 100644 Shaders/readme.txt create mode 100644 Shaders/scanlines/scanline.glsl create mode 100644 Shaders/sharpen/fast-sharpen.glsl create mode 100644 Shaders/xbr/xbr-lv2-noblend.glsl create mode 100644 Shaders/xbrz/xbrz-freescale.glsl delete mode 100644 TADEMO.UFO create mode 100644 TADemo/SERVER_OTA.EXE create mode 100644 TADemo/unitid.txt create mode 100644 audiere.dll create mode 100644 bass.dll create mode 100644 basscd.dll create mode 100644 bassflac.dll create mode 100644 bassmix.dll create mode 100644 basswasapi.dll create mode 100644 cnc-ddraw config.exe create mode 100644 ddraw.dll create mode 100644 ddraw.ini create mode 100644 dplayx.dll create mode 100644 tdraw.dll create mode 100644 tdraw.txt create mode 100644 tmusi.dll create mode 100644 totala.ini create mode 100644 tplayx.dll create mode 100644 wgmus readme.MD create mode 100644 wgmus.dll create mode 100644 wgmus.ini create mode 100644 win32.dll diff --git a/.gitattributes b/.gitattributes index fd77e6f..596aceb 100644 --- a/.gitattributes +++ b/.gitattributes @@ -4,3 +4,7 @@ TA_Ais_2013.ccx filter=lfs diff=lfs merge=lfs -text TotalA.exe filter=lfs diff=lfs merge=lfs -text rev31.gp3 filter=lfs diff=lfs merge=lfs -text TADEMO.UFO filter=lfs diff=lfs merge=lfs -text +*.exe filter=lfs diff=lfs merge=lfs -text +*.dll filter=lfs diff=lfs merge=lfs -text +*.gp3 filter=lfs diff=lfs merge=lfs -text +*.ccx filter=lfs diff=lfs merge=lfs -text diff --git a/Icon/AIRCONS.PCX b/Icon/AIRCONS.PCX new file mode 100644 index 0000000000000000000000000000000000000000..92a13816f41cb46dbfd5c3c33431ceb37ed99cb4 GIT binary patch literal 981 zcma)5A*ka@6unP;X1nuY#E20iA|fIpA|fgxA|kR75s`&ZA}S&(A}XGUh)5x#qN1Xr zq9P0ZP!Um4QBl!-?c=`>5fv2`{SZ-6QPB^N<%xcnpZ7j%-omoyGMszvow+kG_kR5C z?gP|l)b^>iA0cl4eEIT6uh$cGPJno$nrp8H+5cYYA9KfkqJ_kZWVYW07$-|O3ZZ>#r4y;{}p@Aba^{q^(bf9uRU zh|BZkX@8h5w*B$En@)moV7rN7cXcCFbzfE;t{6@5^zTsKAZK#GWYbuu| z$|%7Y-EN1fT5h+KqR2+0ZXEkzXnCG)S+cG(Stgt##t@}I2w)7i+wF3>9FNDcELW>l zQ52KOWH1;cNfJd-5Co3n7>1#$sw7E-kjt|uPh!3kAswMi?KP$w5%&f0rPC)7}(O0p`xY?TK!!VBmx}QojtuhXD_GD^WMF#^y`dYhV-0} z%0&km))LG(j2I*oLJDqOzaEA)hzx`cdld=>DFPp$D#a?VCh5fv2`{SZ-6QPB^N<%xcnpZ7j%-omoyGMszvow+kG_kR5C z?gP|l)b^>iA0cl4eEIT6uh$cGPJno$nrp8H+5cYYA9KfkqJ_kZWVYW07$-|O3ZZ>#r4y;{}p@Aba^{q^(bf9uRU zh|BZkX@8h5w*B$En@)moV7rN7cXcCFbzfE;t{6@5^zTsKAZK#GWYbuu| z$|%7Y-EN1fT5h+KqR2+0ZXEkzXnCG)S+cG(Stgt##t@}I2w)7i+wF3>9FNDcELW>l zQ52KOWH1;cNfJd-5Co3n7>1#$sw7E-kjt|uPh!3kAswMi?KP$w5%&f0rPC)7}(O0p`xY?TK!!VBmx}QojtuhXD_GD^WMF#^y`dYhV-0} z%0&km))LG(j2I*oLJDqOzaEA)hzx`cdld=>DFPp$D#a?VChN1NEU%$69fW*V3Qki1)Izcytm2wNj7^XU(WgFoH^&rOs7Bn z@bDu@`9+T3p@F3Cb-ekm%mTee%+7uMGi zU#y?D+O4`|i+}rgxp_YKxKw7vrSyO5{%5)0`W^MVs!JwMtX}`{=ZAOi{+6C^ zM4Vnv%gweonm0PbO0644O)sC=Ud6H_!zyTo&vl!rCSe*T4B{c*Tnwa5Khmd1^8sS=bTFD%%BYk9U|TbgNb zO{I(yjM4SF-S5Zqd3P{K+wDrVT8JVy2rSptEQ@Ix;T$oBCcO0^$KS4{u_+J7&{$+8@WQUQlg1rAN~*=}tk*WT@I$$o2;}|+ z5CL(>4$H^YFc@{5Zfd3#Ee=`W5#PqHg=_=mG%)3LQBVnREZHt>1`C4!EzkdV&02Jb^ ABLDyZ literal 0 HcmV?d00001 diff --git a/Icon/BUILDING.PCX b/Icon/BUILDING.PCX new file mode 100644 index 0000000000000000000000000000000000000000..55436c9d8684686ac400b1133f0de012fc39f8fc GIT binary patch literal 977 zcma)5A&lEf5S;^G`|oe11q&7|FfcG!U|F2na}}Q*|I;+V8uP>Q1Wu8|}QEnVs2{cIK}? zZvKP@xRLjbyoJ1e|Mcl|uh)}JOoDu&hMQdjxOoRRZ>;lsa8 zVKi{O)O5Or83`j$h08UQDLP>)CJf;_SqG=Jy)E=*t`r?Q@JM3exP{s}@&z~=SSlDC zGzOdi#m9?$s8924HCoQHB9Hr>cGqu5P8gWJZ8)Yd4OJIhRVbqbV|2al>w3A_Ov*AJ zjk-w^M3L?LhHa~c!BmxSju=Cf0wI7gT(8&j`FuDWs;XM8R%KaECX>Nnkfv!I$6*+{ zu4|g65JFKDLdf}1R!2GC%JD*`W7)~1A78BSXt;aTte8G0+88M*Vi6Druzq}!>%*y7 zZ}ZtQ9!~vaV72dbx2;)$+VT|L;hM#i7Uepj8YasAB3H-Dq^k4fHlA+$;lfI%dOTLc zK6evpb+8d2%>mv5ssZNmBu@|LUAbS4HnVgwjEck^MrP)TuB}8Z76{@f$fO`JCv>m=L*_fg zHL-0VQ=pa#dh=Zr6apMKT|K=%=1<4YZ40tx~O0tyBM1f)_xK|w)5 zK|xmPNd*A~1qB7&*^X{NKtVx4PYNg~DCkL})qt+#&CKYe)2?*7@5%3bKYq`a?Dyf9 zyI-M3qn6)m`5E%|_oq*P^!t5T=OoBCs=2mmz}*M9`?=_UM;_&u#-n_A)$K2hhuUhi zAHTNWtoEN@+pm62jd%SZ-(&yY^-tw{r{C(6`){lNM*Z5W@80i!{_FF{kKgLd50IDV z%hUcaTW$xFMK7HO;n49C)9D#zs2MFqbGd3Vp%bQH!VtcfRqMR5ce%dGMBb%CkHi*^ zny8~AUjs)4O96v}%77D~_;i&|)p@Zi$E$goXVIYB>G_?|30kIa8;+@&hN5d+5tLDa zF}mFjRkhk~r$v#C$Gtdig`w^HhHWc`!4!pXju=Cf0wI7g+-|qa<#Ie8%d%Xr*F{lG zr_2BWVi>#ESbI_>I8`d zu@Hy@SUNx4p_iitQ}<@$7;mQ}Xe zMYF9xT3X3Wk0wem;BHK5|fIQ`=r~7i@ zFDKSC)3cru1Hm-Ai8PRh>Di0kL z*a(<&7&AyHgcQ8Ge?15rkQqn^_8JrnQUoo4s+8-zn#P;7m3Ph5RXPT>I1>A#9ON%{ o@5-Dr*4BuP0EGa}M8@rM{c6TkiS`SYL6W|Ipa2c8Qd#Y_-9{0%Y%ZSnm2NH!UTRD7?@2fJ}S3mcL%J_d*hpD*+`!^SIS@mCYB@ z-MqNF?g&}bA}{g|QD9`t$-DwHtADQ{t;%_=MZU(nP4to1&H4~|U!^?$-sNv%Uz#~L zbI}x<*x6?D%a1RgKK(5`?}(pY&oA5EV6trW#qXc7gyX_8#>2ld0jgoG+Red^ zNi7r=!<99gDFrGUgld>5y9=KkFa7l)nQo%N((g>{cwj_5HE79Ro!V7wmXPLxTmY&8 zmidXFUe4RmZq{86<4Gq>>s}|c8b!V4C}Dw>bmA(=qM&0?5YQbTj!una8&v1EH`1M+ zUTA4XUDm5q4Tw_2vV)ijB*O+ofFIN2%j0_NPkMGgF_M}Z17ierH%e*MYIthJq_&Kd?Vh*NH>Y-C?g{HN#5#aNfI`gc{-J2jbvdPS T1G5UEHelu5*P5yS{k!-Fc7VZ6 literal 0 HcmV?d00001 diff --git a/Icon/FACTORY.PCX b/Icon/FACTORY.PCX new file mode 100644 index 0000000000000000000000000000000000000000..6df3876d950aab70c3b59b570980bc9e15e7585c GIT binary patch literal 1049 zcma)5EsWzv6n+b;x$T@ZCk+@dz`(%3z`!8Dz`($j3<7*o6d42<1Q-M?Ffec=gMfg5 zfPes>lu7{x0RaI4xx1{om0UF-ARs3h1Ox=6(rUFJm8P?MJ!!Rfs`{SZd*7Qk@6GS~ z`KPNlAc;u+Me_F~E`NRa@N2i*6*4A3JR4~xk_1=p;OhIN|2=Xme!spIpTwWdPf|Dk zcz9v2o3{_QQkvIKsQKCd7k_?OOGnCcMC#xCAL5s@Ugm$R`g*;uyZE}JxAFwtXX!qh zuJq&`bh{tFe0=}@Zy9+-;&gwy+wLawb#FB5q~jp$yY<9!JEj%tW<%9Iu31bm2vad( z2;YdRaa=i@+*o8v-lqLJiESL!P|HBR4z32a3ML1Q0VhE5;VkZ|<7`t77t=J)qF%ez z@mrxAG%VjST}!u2)zG=BP(}&H=yKUr)ndIK7ezK4cH+1ZhK}!>j-#3;Q&qw_Vhm9V zgaF2Hxm-@C(|*4%%W}C~7DX{0kNf?8k|a?S1wr6>o@H6Ot}BW{2sz!0@*rj#F`A2H zB-*L)qq7|xOmC-JB{OD38zCh@ECk{LHV%(swLj*oO*UObgNYya?beOqwKTh-*6NDk za?NH+jdFuf4HIQ|7R$qVTvpj)6HV6sU~VT9BO0kek9#q-+t_R%%>`ZqssZNWD2{ih zZLwPp*VAM^2=mw*gjQPDJB||8SVJeSf-DL;1_c4#iD_|6vu)5`*QJ;)F#F`@~arXi}9oI%ePOT{%ABBT&!{6xe-=)Lg4NPY$WE$F5Nv&ch5 z_|?1Nr+@wB>-<_LuOI>*1$=z3{O8q*r+QPr|#s;RmrJ zjeIt8(-27PX`}J^ug@Pp{w-F%6MlL*J#V)C@uJxs)#|+SjsRJ*HW* zVh~xyL`L|Y?@Py-v(Ai3s$^B#Dw5d7Q2|v9ARMV7I zl`w{68Bq#^0LE~+Tu!IcZns;lR@3QpI2`tRy;iH0BuNxSK@fPJXIYl6>x!ZfLQXGy zb>O2l?~ZxW<<&a(qq7|xOmC}NE7=$kt&5Zd$srIIuyJ_fv)wV9t<%9IYWMxPWmoPE zucFx{wNO+Hmua@F6eu$Y)i6=EXFffgd#imqSx5ba-yYjZ--xdf|r zy3^GQP0fgzUZrY4lpt9~dw?p-1Q#?=2^MIY&^q7!+5p7kNDKKErks+ZFQYec0;)2eAr@&p< z=rEL_j-UjvU-4I!VttC_HlProknq^w7tNW@ WGRo>$t{`dyR=)dMukgQr6#oE~EwZ40tx~O0tyBM1f)_xK|w)5 zK|xmPNd*A~1qB7&*^X{NKtVx4PYNg~DCkL})qt+#&CKYe)2?*7@5%3bKYq`a?Dyf9 zyI-M3qn6)m`5E%|_oq*P^!t5T=OoBCs=2mmz}*M9`?=_UM;_&u#-n_A)$K2hhuUhi zAHTNWtoEN@+pm62jd%SZ-(&yY^-tw{r{C(6`){lNM*Z5W@80i!{_FF{kKgLd50IDV z%hUcaTW$xFMK7HO;n49C)9D#zs2MFqbGd3Vp%bQH!VtcfRqMR5ce%dGMBb%CkHi*^ zny8~AUjs)4O96v}%77D~_;i&|)p@Zi$E$goXVIYB>G_?|30kIa8;+@&hN5d+5tLDa zF}mFjRkhk~r$v#C$Gtdig`w^HhHWc`!4!pXju=Cf0wI7g+-|qa<#Ie8%d%Xr*F{lG zr_2BWVi>#ESbI_>I8`d zu@Hy@SUNx4p_iitQ}<@$7;mQ}Xe zMYF9xT3X3Wk0wem;BHK5|fIQ`=r~7i@ zFDKSC)3cru1Hm-Ai8PRh>Di0kL z*a(<&7&AyHgcQ8Ge?15rkQqn^_8JrnQUoo4s+8-zn#P;7m3Ph5RXPT>I1>A#9ON%{ o@5-Dr*4BuP0EGa}M8Z40tx~O0tyBM1f)_xK|w)5 zK|xmPNd*A~1qB7&*^X{NKtVx4PYNg~DCkL})qt+#&CKYe)2?*7@5%3bKYq`a?Dyf9 zyI-M3qn6)m`5E%|_oq*P^!t5T=OoBCs=2mmz}*M9`?=_UM;_&u#-n_A)$K2hhuUhi zAHTNWtoEN@+pm62jd%SZ-(&yY^-tw{r{C(6`){lNM*Z5W@80i!{_FF{kKgLd50IDV z%hUcaTW$xFMK7HO;n49C)9D#zs2MFqbGd3Vp%bQH!VtcfRqMR5ce%dGMBb%CkHi*^ zny8~AUjs)4O96v}%77D~_;i&|)p@Zi$E$goXVIYB>G_?|30kIa8;+@&hN5d+5tLDa zF}mFjRkhk~r$v#C$Gtdig`w^HhHWc`!4!pXju=Cf0wI7g+-|qa<#Ie8%d%Xr*F{lG zr_2BWVi>#ESbI_>I8`d zu@Hy@SUNx4p_iitQ}<@$7;mQ}Xe zMYF9xT3X3Wk0wem;BHK5|fIQ`=r~7i@ zFDKSC)3cru1Hm-Ai8PRh>Di0kL z*a(<&7&AyHgcQ8Ge?15rkQqn^_8JrnQUoo4s+8-zn#P;7m3Ph5RXPT>I1>A#9ON%{ o@5-Dr*4BuP0EGa}M8KtF*yQEry=1fJWX_p$zVkDane)p} z4?jaizgGNv#Xpj`e*N_6k8ZasDolX5t4de9is0clc=$2te|u_A%}uqQYR#wD=JQ?F zn(No*`Yvn#%A4bjj>b%|i>fTki zvZ@<*yPyC1{PE-874jX4^UHa&+fU}}-e}fI#(vPZ8?j+`bR$r8PgWhS7);U#lQCfk zKZ?>jt*mXPEmA3K(|&_QCJyVUr6E@ZTLDuBorA)F6QKBb5u5Tf+ZMycG|AGi*KT#( zR$%*{;aa+FsD>_UDwie7D8U$AulurGtk>f_Plv-!6nQ~lxvp+mvaT~(CY&S25T!r} zU<}vm^?W`b4u_&Bmdj^i* literal 0 HcmV?d00001 diff --git a/Icon/UNKNOWN.PCX b/Icon/UNKNOWN.PCX new file mode 100644 index 0000000000000000000000000000000000000000..ddef9394f0165b3dfcfa858595fcb03e165897ad GIT binary patch literal 977 zcma)5EsWzh6n+CvzOGL)FfcGM2nYxW2q*{$2*^nR0a>Z40tx~O0tyBM1f)_xK|w)5 zK|xmPNd*A~1qB7&*^X{NKtVx4PYNg~DCkL})qt+#&CKYe)2?*7@5%3bKYq`a?Dyf9 zyI-M3qn6)m`5E%|_oq*P^!t5T=OoBCs=2mmz}*M9`?=_UM;_&u#-n_A)$K2hhuUhi zAHTNWtoEN@+pm62jd%SZ-(&yY^-tw{r{C(6`){lNM*Z5W@80i!{_FF{kKgLd50IDV z%hUcaTW$xFMK7HO;n49C)9D#zs2MFqbGd3Vp%bQH!VtcfRqMR5ce%dGMBb%CkHi*^ zny8~AUjs)4O96v}%77D~_;i&|)p@Zi$E$goXVIYB>G_?|30kIa8;+@&hN5d+5tLDa zF}mFjRkhk~r$v#C$Gtdig`w^HhHWc`!4!pXju=Cf0wI7g+-|qa<#Ie8%d%Xr*F{lG zr_2BWVi>#ESbI_>I8`d zu@Hy@SUNx4p_iitQ}<@$7;mQ}Xe zMYF9xT3X3Wk0wem;BHK5|fIQ`=r~7i@ zFDKSC)3cru1Hm-Ai8PRh>Di0kL z*a(<&7&AyHgcQ8Ge?15rkQqn^_8JrnQUoo4s+8-zn#P;7m3Ph5RXPT>I1>A#9ON%{ o@5-Dr*4BuP0EGa}M8+bI7m!sSDK_-eFg@z9fwG|wY$juJ!WI!s)z zhs>4X>jS2*6GNt8d>iGTMYxRW`>39d`16RH!_YA?VN*_+*DyU{!8n_4!X}$AJ>##g z*-VE#tFa!YW<8``xC(x~&rhAH(loVT#bzW34FL9Vh+!oC0 z_xtU3yId}((`mooZ@1g^dc9mO2SMQbekzr+ZClrMMNvdi#29by=yXjxGg|A?phmL= z>iRn)wbtx~q)&OZgXJ0$1H^lPE#TDkJsm7Jjlrzc>iLzXn=c!gGu6(>MpBA9qG}1U z!HaPssF=tc78g6(U+?PERjD`gn`5`qHG-z<*QC_BVCRXE<+LP{EfC^BWZ(q4p_`lS zyuIjG$E~1S@fvx%;^_rP$(f=T=aUMyM5Gf?I1mw#1#PuAh0;8g9T;|7F>6ZvTvqdf zk|k0Kiw-B4h}Qsz-heRBbz^;VHto3Gno%#QrJUrac-O+V&Y2q06%?01W!FVO#2|1$ zX>)&9x?gAS=FYCK?OMXNLN)Q=kK&C7>3}6=?HNK#&Aj zO=-Wes^A=LqOtuNzWViW^Tt@8&2sXz5>VthzB(9t{iQk2n`|>I6i}j e0i5{gwTATPH@7cdd{- +//============================================================== +//////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////// + +#pragma parameter MASK "Mask Type" 1.0 0.0 3.0 1.0 +#pragma parameter MASK_INTENSITY "Mask Intensity" 0.5 0.0 1.0 0.05 +#pragma parameter SCANLINE_THINNESS "Scanline Intensity" 0.5 0.0 1.0 0.1 +#pragma parameter SCAN_BLUR "Sharpness" 2.5 1.0 3.0 0.1 +#pragma parameter CURVATURE "Curvature" 0.02 0.0 0.25 0.01 +#pragma parameter TRINITRON_CURVE "Trinitron-style Curve" 0.0 0.0 1.0 1.0 +#pragma parameter CORNER "Corner Round" 3.0 0.0 11.0 1.0 +#pragma parameter CRT_GAMMA "CRT Gamma" 2.4 0.0 51.0 0.1 + +#if defined(VERTEX) + +#if __VERSION__ >= 130 +#define COMPAT_VARYING out +#define COMPAT_ATTRIBUTE in +#define COMPAT_TEXTURE texture +#else +#define COMPAT_VARYING varying +#define COMPAT_ATTRIBUTE attribute +#define COMPAT_TEXTURE texture2D +#endif + +#ifdef GL_ES +#define COMPAT_PRECISION mediump +#else +#define COMPAT_PRECISION +#endif + +COMPAT_ATTRIBUTE vec4 VertexCoord; +COMPAT_ATTRIBUTE vec4 COLOR; +COMPAT_ATTRIBUTE vec4 TexCoord; +COMPAT_VARYING vec4 COL0; +COMPAT_VARYING vec4 TEX0; + +vec4 _oPosition1; +uniform mat4 MVPMatrix; +uniform COMPAT_PRECISION int FrameDirection; +uniform COMPAT_PRECISION int FrameCount; +uniform COMPAT_PRECISION vec2 OutputSize; +uniform COMPAT_PRECISION vec2 TextureSize; +uniform COMPAT_PRECISION vec2 InputSize; + +// compatibility #defines +#define vTexCoord TEX0.xy +#define SourceSize vec4(TextureSize, 1.0 / TextureSize) //either TextureSize or InputSize +#define OutSize vec4(OutputSize, 1.0 / OutputSize) + +void main() +{ + gl_Position = MVPMatrix * VertexCoord; + TEX0.xy = TexCoord.xy; +} + +#elif defined(FRAGMENT) + +#ifdef GL_ES +#ifdef GL_FRAGMENT_PRECISION_HIGH +precision highp float; +#else +precision mediump float; +#endif +#define COMPAT_PRECISION mediump +#else +#define COMPAT_PRECISION +#endif + +#if __VERSION__ >= 130 +#define COMPAT_VARYING in +#define COMPAT_TEXTURE texture +out COMPAT_PRECISION vec4 FragColor; +#else +#define COMPAT_VARYING varying +#define FragColor gl_FragColor +#define COMPAT_TEXTURE texture2D +#endif + +uniform COMPAT_PRECISION int FrameDirection; +uniform COMPAT_PRECISION int FrameCount; +uniform COMPAT_PRECISION vec2 OutputSize; +uniform COMPAT_PRECISION vec2 TextureSize; +uniform COMPAT_PRECISION vec2 InputSize; +uniform sampler2D Texture; +COMPAT_VARYING vec4 TEX0; + +// compatibility #defines +#define Source Texture +#define vTexCoord TEX0.xy + +#define SourceSize vec4(TextureSize, 1.0 / TextureSize) //either TextureSize or InputSize +#define OutSize vec4(OutputSize, 1.0 / OutputSize) + +#ifdef PARAMETER_UNIFORM +uniform COMPAT_PRECISION float CRT_GAMMA; +uniform COMPAT_PRECISION float SCANLINE_THINNESS; +uniform COMPAT_PRECISION float SCAN_BLUR; +uniform COMPAT_PRECISION float MASK_INTENSITY; +uniform COMPAT_PRECISION float CURVATURE; +uniform COMPAT_PRECISION float CORNER; +uniform COMPAT_PRECISION float MASK; +uniform COMPAT_PRECISION float TRINITRON_CURVE; +#else +#define CRT_GAMMA 2.4 +#define SCANLINE_THINNESS 0.5 +#define SCAN_BLUR 2.5 +#define MASK_INTENSITY 0.54 +#define CURVATURE 0.00 +#define CORNER 3.0 +#define MASK 1.0 +#define TRINITRON_CURVE 0.0 +#endif + +//_____________________________/\_______________________________ +//============================================================== +// +// GAMMA FUNCTIONS +// +//-------------------------------------------------------------- +//-------------------------------------------------------------- +// Since shadertoy doesn't have sRGB textures +// And we need linear input into shader +// Don't do this in your code + float FromSrgb1(float c){ + return (c<=0.04045)?c*(1.0/12.92): + pow(c*(1.0/1.055)+(0.055/1.055),CRT_GAMMA);} +//-------------------------------------------------------------- +vec3 FromSrgb(vec3 c){return vec3( + FromSrgb1(c.r),FromSrgb1(c.g),FromSrgb1(c.b));} + +// Convert from linear to sRGB +// Since shader toy output is not linear +float ToSrgb1(float c){ + return(c<0.0031308?c*12.92:1.055*pow(c,0.41666)-0.055);} +//-------------------------------------------------------------- +vec3 ToSrgb(vec3 c){return vec3( + ToSrgb1(c.r),ToSrgb1(c.g),ToSrgb1(c.b));} +//-------------------------------------------------------------- + +//_____________________________/\_______________________________ +//============================================================== +// +// DEFINES +// +//-------------------------------------------------------------- +// CRTS_CPU - CPU code +// CRTS_GPU - GPU code +//-------------------------------------------------------------- +// CRTS_GLSL - GLSL +// CRTS_HLSL - HLSL (not tested yet) +//-------------------------------------------------------------- +// CRTS_DEBUG - Define to see on/off split screen +//-------------------------------------------------------------- +// CRTS_WARP - Apply screen warp +//-------------------------------------------------------------- +// CRTS_2_TAP - Faster very pixely 2-tap filter (off is 8) +//-------------------------------------------------------------- +// CRTS_MASK_GRILLE - Aperture grille (aka Trinitron) +// CRTS_MASK_GRILLE_LITE - Brighter (subtractive channels) +// CRTS_MASK_NONE - No mask +// CRTS_MASK_SHADOW - Horizontally stretched shadow mask +//-------------------------------------------------------------- +// CRTS_TONE - Normalize mid-level and process color +// CRTS_CONTRAST - Process color - enable contrast control +// CRTS_SATURATION - Process color - enable saturation control +//-------------------------------------------------------------- +#define CRTS_STATIC +#define CrtsPow +#define CRTS_RESTRICT +//============================================================== +//////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////// + +//============================================================== +// SETUP FOR CRTS +//-------------------------------------------------------------- +//============================================================== +//#define CRTS_DEBUG 1 +#define CRTS_GPU 1 +#define CRTS_GLSL 1 +//-------------------------------------------------------------- +//#define CRTS_2_TAP 1 +//-------------------------------------------------------------- +#define CRTS_TONE 1 +#define CRTS_CONTRAST 0 +#define CRTS_SATURATION 0 +//-------------------------------------------------------------- +#define CRTS_WARP 1 +//-------------------------------------------------------------- +// Try different masks -> moved to runtime parameters +//#define CRTS_MASK_GRILLE 1 +//#define CRTS_MASK_GRILLE_LITE 1 +//#define CRTS_MASK_NONE 1 +//#define CRTS_MASK_SHADOW 1 +//-------------------------------------------------------------- +// Scanline thinness +// 0.50 = fused scanlines +// 0.70 = recommended default +// 1.00 = thinner scanlines (too thin) +#define INPUT_THIN 0.5 + (0.5 * SCANLINE_THINNESS) +//-------------------------------------------------------------- +// Horizonal scan blur +// -3.0 = pixely +// -2.5 = default +// -2.0 = smooth +// -1.0 = too blurry +#define INPUT_BLUR -1.0 * SCAN_BLUR +//-------------------------------------------------------------- +// Shadow mask effect, ranges from, +// 0.25 = large amount of mask (not recommended, too dark) +// 0.50 = recommended default +// 1.00 = no shadow mask +#define INPUT_MASK 1.0 - MASK_INTENSITY +//-------------------------------------------------------------- +#define INPUT_X InputSize.x +#define INPUT_Y InputSize.y +//-------------------------------------------------------------- +// Setup the function which returns input image color +vec3 CrtsFetch(vec2 uv){ + // For shadertoy, scale to get native texels in the image + uv*=vec2(INPUT_X,INPUT_Y)/TextureSize.xy; + // Move towards intersting parts +// uv+=vec2(0.5,0.5); + // Non-shadertoy case would not have the color conversion + return FromSrgb(COMPAT_TEXTURE(Texture,uv.xy,-16.0).rgb);} +#endif + +//////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////// +//_____________________________/\_______________________________ +//============================================================== +// +// GPU CODE +// +//============================================================== +#ifdef CRTS_GPU +//_____________________________/\_______________________________ +//============================================================== +// PORTABILITY +//============================================================== + #ifdef CRTS_GLSL + #define CrtsF1 float + #define CrtsF2 vec2 + #define CrtsF3 vec3 + #define CrtsF4 vec4 + #define CrtsFractF1 fract + #define CrtsRcpF1(x) (1.0/(x)) + #define CrtsSatF1(x) clamp((x),0.0,1.0) +//-------------------------------------------------------------- + CrtsF1 CrtsMax3F1(CrtsF1 a,CrtsF1 b,CrtsF1 c){ + return max(a,max(b,c));} + #endif +//============================================================== + #ifdef CRTS_HLSL + #define CrtsF1 float + #define CrtsF2 float2 + #define CrtsF3 float3 + #define CrtsF4 float4 + #define CrtsFractF1 frac + #define CrtsRcpF1(x) (1.0/(x)) + #define CrtsSatF1(x) saturate(x) +//-------------------------------------------------------------- + CrtsF1 CrtsMax3F1(CrtsF1 a,CrtsF1 b,CrtsF1 c){ + return max(a,max(b,c));} + #endif +//_____________________________/\_______________________________ +//============================================================== +// TONAL CONTROL CONSTANT GENERATION +//-------------------------------------------------------------- +// This is in here for rapid prototyping +// Please use the CPU code and pass in as constants +//============================================================== + CrtsF4 CrtsTone( + CrtsF1 contrast, + CrtsF1 saturation, + CrtsF1 thin, + CrtsF1 mask){ +//-------------------------------------------------------------- + if(MASK == 0.0) mask=1.0; +//-------------------------------------------------------------- + if(MASK == 1.0){ + // Normal R mask is {1.0,mask,mask} + // LITE R mask is {mask,1.0,1.0} + mask=0.5+mask*0.5; + } +//-------------------------------------------------------------- + CrtsF4 ret; + CrtsF1 midOut=0.18/((1.5-thin)*(0.5*mask+0.5)); + CrtsF1 pMidIn=pow(0.18,contrast); + ret.x=contrast; + ret.y=((-pMidIn)+midOut)/((1.0-pMidIn)*midOut); + ret.z=((-pMidIn)*midOut+pMidIn)/(midOut*(-pMidIn)+midOut); + ret.w=contrast+saturation; + return ret;} +//_____________________________/\_______________________________ +//============================================================== +// MASK +//-------------------------------------------------------------- +// Letting LCD/OLED pixel elements function like CRT phosphors +// So "phosphor" resolution scales with display resolution +//-------------------------------------------------------------- +// Not applying any warp to the mask (want high frequency) +// Real aperture grille has a mask which gets wider on ends +// Not attempting to be "real" but instead look the best +//-------------------------------------------------------------- +// Shadow mask is stretched horizontally +// RRGGBB +// GBBRRG +// RRGGBB +// This tends to look better on LCDs than vertical +// Also 2 pixel width is required to get triad centered +//-------------------------------------------------------------- +// The LITE version of the Aperture Grille is brighter +// Uses {dark,1.0,1.0} for R channel +// Non LITE version uses {1.0,dark,dark} +//-------------------------------------------------------------- +// 'pos' - This is 'fragCoord.xy' +// Pixel {0,0} should be {0.5,0.5} +// Pixel {1,1} should be {1.5,1.5} +//-------------------------------------------------------------- +// 'dark' - Exposure of of masked channel +// 0.0=fully off, 1.0=no effect +//============================================================== + CrtsF3 CrtsMask(CrtsF2 pos,CrtsF1 dark){ + if(MASK == 2.0){ + CrtsF3 m=CrtsF3(dark,dark,dark); + CrtsF1 x=CrtsFractF1(pos.x*(1.0/3.0)); + if(x<(1.0/3.0))m.r=1.0; + else if(x<(2.0/3.0))m.g=1.0; + else m.b=1.0; + return m; + } +//-------------------------------------------------------------- + if(MASK == 1.0){ + CrtsF3 m=CrtsF3(1.0,1.0,1.0); + CrtsF1 x=CrtsFractF1(pos.x*(1.0/3.0)); + if(x<(1.0/3.0))m.r=dark; + else if(x<(2.0/3.0))m.g=dark; + else m.b=dark; + return m; + } +//-------------------------------------------------------------- + if(MASK == 0.0){ + return CrtsF3(1.0,1.0,1.0); + } +//-------------------------------------------------------------- + if(MASK == 3.0){ + pos.x+=pos.y*2.9999; + CrtsF3 m=CrtsF3(dark,dark,dark); + CrtsF1 x=CrtsFractF1(pos.x*(1.0/6.0)); + if(x<(1.0/3.0))m.r=1.0; + else if(x<(2.0/3.0))m.g=1.0; + else m.b=1.0; + return m; + } + } +//_____________________________/\_______________________________ +//============================================================== +// FILTER ENTRY +//-------------------------------------------------------------- +// Input must be linear +// Output color is linear +//-------------------------------------------------------------- +// Must have fetch function setup: CrtsF3 CrtsFetch(CrtsF2 uv) +// - The 'uv' range is {0.0 to 1.0} for input texture +// - Output of this must be linear color +//-------------------------------------------------------------- +// SCANLINE MATH & AUTO-EXPOSURE NOTES +// =================================== +// Each output line has contribution from at most 2 scanlines +// Scanlines are shaped by a windowed cosine function +// This shape blends together well with only 2 lines of overlap +//-------------------------------------------------------------- +// Base scanline intensity is as follows +// which leaves output intensity range from {0 to 1.0} +// -------- +// thin := range {thick 0.5 to thin 1.0} +// off := range {0.0 to <1.0}, +// sub-pixel offset between two scanlines +// -------- +// a0=cos(min(0.5, off *thin)*2pi)*0.5+0.5; +// a1=cos(min(0.5,(1.0-off)*thin)*2pi)*0.5+0.5; +//-------------------------------------------------------------- +// This leads to a image darkening factor of roughly: +// {(1.5-thin)/1.0} +// This is further reduced by the mask: +// {1.0/2.0+mask*1.0/2.0} +// Reciprocal of combined effect is used for auto-exposure +// to scale up the mid-level in the tonemapper +//============================================================== + CrtsF3 CrtsFilter( +//-------------------------------------------------------------- + // SV_POSITION, fragCoord.xy + CrtsF2 ipos, +//-------------------------------------------------------------- + // inputSize / outputSize (in pixels) + CrtsF2 inputSizeDivOutputSize, +//-------------------------------------------------------------- + // 0.5 * inputSize (in pixels) + CrtsF2 halfInputSize, +//-------------------------------------------------------------- + // 1.0 / inputSize (in pixels) + CrtsF2 rcpInputSize, +//-------------------------------------------------------------- + // 1.0 / outputSize (in pixels) + CrtsF2 rcpOutputSize, +//-------------------------------------------------------------- + // 2.0 / outputSize (in pixels) + CrtsF2 twoDivOutputSize, +//-------------------------------------------------------------- + // inputSize.y + CrtsF1 inputHeight, +//-------------------------------------------------------------- + // Warp scanlines but not phosphor mask + // 0.0 = no warp + // 1.0/64.0 = light warping + // 1.0/32.0 = more warping + // Want x and y warping to be different (based on aspect) + CrtsF2 warp, +//-------------------------------------------------------------- + // Scanline thinness + // 0.50 = fused scanlines + // 0.70 = recommended default + // 1.00 = thinner scanlines (too thin) + // Shared with CrtsTone() function + CrtsF1 thin, +//-------------------------------------------------------------- + // Horizonal scan blur + // -3.0 = pixely + // -2.5 = default + // -2.0 = smooth + // -1.0 = too blurry + CrtsF1 blur, +//-------------------------------------------------------------- + // Shadow mask effect, ranges from, + // 0.25 = large amount of mask (not recommended, too dark) + // 0.50 = recommended default + // 1.00 = no shadow mask + // Shared with CrtsTone() function + CrtsF1 mask, +//-------------------------------------------------------------- + // Tonal curve parameters generated by CrtsTone() + CrtsF4 tone +//-------------------------------------------------------------- + ){ +//-------------------------------------------------------------- + #ifdef CRTS_DEBUG + CrtsF2 uv=ipos*rcpOutputSize; + // Show second half processed, and first half un-processed + if(uv.x<0.5){ + // Force nearest to get squares + uv*=1.0/rcpInputSize; + uv=floor(uv)+CrtsF2(0.5,0.5); + uv*=rcpInputSize; + CrtsF3 color=CrtsFetch(uv); + return color;} + #endif +//-------------------------------------------------------------- + // Optional apply warp + CrtsF2 pos; + #ifdef CRTS_WARP + // Convert to {-1 to 1} range + pos=ipos*twoDivOutputSize-CrtsF2(1.0,1.0); + // Distort pushes image outside {-1 to 1} range + pos*=CrtsF2( + 1.0+(pos.y*pos.y)*warp.x, + 1.0+(pos.x*pos.x)*warp.y); + // TODO: Vignette needs optimization + CrtsF1 vin=(1.0-( + (1.0-CrtsSatF1(pos.x*pos.x))*(1.0-CrtsSatF1(pos.y*pos.y)))) * (0.998 + (0.001 * CORNER)); + vin=CrtsSatF1((-vin)*inputHeight+inputHeight); + // Leave in {0 to inputSize} + pos=pos*halfInputSize+halfInputSize; + #else + pos=ipos*inputSizeDivOutputSize; + #endif +//-------------------------------------------------------------- + // Snap to center of first scanline + CrtsF1 y0=floor(pos.y-0.5)+0.5; + #ifdef CRTS_2_TAP + // Using Inigo's "Improved Texture Interpolation" + // http://iquilezles.org/www/articles/texture/texture.htm + pos.x+=0.5; + CrtsF1 xi=floor(pos.x); + CrtsF1 xf=pos.x-xi; + xf=xf*xf*xf*(xf*(xf*6.0-15.0)+10.0); + CrtsF1 x0=xi+xf-0.5; + CrtsF2 p=CrtsF2(x0*rcpInputSize.x,y0*rcpInputSize.y); + // Coordinate adjusted bilinear fetch from 2 nearest scanlines + CrtsF3 colA=CrtsFetch(p); + p.y+=rcpInputSize.y; + CrtsF3 colB=CrtsFetch(p); + #else + // Snap to center of one of four pixels + CrtsF1 x0=floor(pos.x-1.5)+0.5; + // Inital UV position + CrtsF2 p=CrtsF2(x0*rcpInputSize.x,y0*rcpInputSize.y); + // Fetch 4 nearest texels from 2 nearest scanlines + CrtsF3 colA0=CrtsFetch(p); + p.x+=rcpInputSize.x; + CrtsF3 colA1=CrtsFetch(p); + p.x+=rcpInputSize.x; + CrtsF3 colA2=CrtsFetch(p); + p.x+=rcpInputSize.x; + CrtsF3 colA3=CrtsFetch(p); + p.y+=rcpInputSize.y; + CrtsF3 colB3=CrtsFetch(p); + p.x-=rcpInputSize.x; + CrtsF3 colB2=CrtsFetch(p); + p.x-=rcpInputSize.x; + CrtsF3 colB1=CrtsFetch(p); + p.x-=rcpInputSize.x; + CrtsF3 colB0=CrtsFetch(p); + #endif +//-------------------------------------------------------------- + // Vertical filter + // Scanline intensity is using sine wave + // Easy filter window and integral used later in exposure + CrtsF1 off=pos.y-y0; + CrtsF1 pi2=6.28318530717958; + CrtsF1 hlf=0.5; + CrtsF1 scanA=cos(min(0.5, off *thin )*pi2)*hlf+hlf; + CrtsF1 scanB=cos(min(0.5,(-off)*thin+thin)*pi2)*hlf+hlf; +//-------------------------------------------------------------- + #ifdef CRTS_2_TAP + #ifdef CRTS_WARP + // Get rid of wrong pixels on edge + scanA*=vin; + scanB*=vin; + #endif + // Apply vertical filter + CrtsF3 color=(colA*scanA)+(colB*scanB); + #else + // Horizontal kernel is simple gaussian filter + CrtsF1 off0=pos.x-x0; + CrtsF1 off1=off0-1.0; + CrtsF1 off2=off0-2.0; + CrtsF1 off3=off0-3.0; + CrtsF1 pix0=exp2(blur*off0*off0); + CrtsF1 pix1=exp2(blur*off1*off1); + CrtsF1 pix2=exp2(blur*off2*off2); + CrtsF1 pix3=exp2(blur*off3*off3); + CrtsF1 pixT=CrtsRcpF1(pix0+pix1+pix2+pix3); + #ifdef CRTS_WARP + // Get rid of wrong pixels on edge + pixT*=vin; + #endif + scanA*=pixT; + scanB*=pixT; + // Apply horizontal and vertical filters + CrtsF3 color= + (colA0*pix0+colA1*pix1+colA2*pix2+colA3*pix3)*scanA + + (colB0*pix0+colB1*pix1+colB2*pix2+colB3*pix3)*scanB; + #endif +//-------------------------------------------------------------- + // Apply phosphor mask + color*=CrtsMask(ipos,mask); +//-------------------------------------------------------------- + // Optional color processing + #ifdef CRTS_TONE + // Tonal control, start by protecting from /0 + CrtsF1 peak=max(1.0/(256.0*65536.0), + CrtsMax3F1(color.r,color.g,color.b)); + // Compute the ratios of {R,G,B} + CrtsF3 ratio=color*CrtsRcpF1(peak); + // Apply tonal curve to peak value + #ifdef CRTS_CONTRAST + peak=pow(peak,tone.x); + #endif + peak=peak*CrtsRcpF1(peak*tone.y+tone.z); + // Apply saturation + #ifdef CRTS_SATURATION + ratio=pow(ratio,CrtsF3(tone.w,tone.w,tone.w)); + #endif + // Reconstruct color + return ratio*peak; + #else + return color; + #endif +//-------------------------------------------------------------- + } + + +void main() +{ + vec2 warp_factor; + warp_factor.x = CURVATURE; + warp_factor.y = (3.0 / 4.0) * warp_factor.x; // assume 4:3 aspect + warp_factor.x *= (1.0 - TRINITRON_CURVE); + FragColor.rgb = CrtsFilter(vTexCoord.xy * OutputSize.xy*(TextureSize.xy / InputSize.xy), + InputSize.xy / OutputSize.xy, + InputSize.xy * vec2(0.5,0.5), + 1.0/InputSize.xy, + 1.0/OutputSize.xy, + 2.0/OutputSize.xy, + InputSize.y, + warp_factor, + INPUT_THIN, + INPUT_BLUR, + INPUT_MASK, + CrtsTone(1.0,0.0,INPUT_THIN,INPUT_MASK)); + + // Shadertoy outputs non-linear color + FragColor.rgb=ToSrgb(FragColor.rgb); +} +#endif diff --git a/Shaders/interpolation/bilinear.glsl b/Shaders/interpolation/bilinear.glsl new file mode 100644 index 0000000..aa7bee6 --- /dev/null +++ b/Shaders/interpolation/bilinear.glsl @@ -0,0 +1,73 @@ +#if defined(VERTEX) + +#if __VERSION__ >= 130 +#define COMPAT_VARYING out +#define COMPAT_ATTRIBUTE in +#define COMPAT_TEXTURE texture +#else +#define COMPAT_VARYING varying +#define COMPAT_ATTRIBUTE attribute +#define COMPAT_TEXTURE texture2D +#endif + +#ifdef GL_ES +#define COMPAT_PRECISION mediump +#else +#define COMPAT_PRECISION +#endif + +COMPAT_ATTRIBUTE vec4 VertexCoord; +COMPAT_ATTRIBUTE vec4 COLOR; +COMPAT_ATTRIBUTE vec4 TexCoord; +COMPAT_VARYING vec4 COL0; +COMPAT_VARYING vec4 TEX0; + +uniform mat4 MVPMatrix; +uniform COMPAT_PRECISION int FrameDirection; +uniform COMPAT_PRECISION int FrameCount; +uniform COMPAT_PRECISION vec2 OutputSize; +uniform COMPAT_PRECISION vec2 TextureSize; +uniform COMPAT_PRECISION vec2 InputSize; + +void main() +{ + gl_Position = VertexCoord.x * MVPMatrix[0] + VertexCoord.y * MVPMatrix[1] + VertexCoord.z * MVPMatrix[2] + VertexCoord.w * MVPMatrix[3]; + TEX0.xy = TexCoord.xy; +} + +#elif defined(FRAGMENT) + +#if __VERSION__ >= 130 +#define COMPAT_VARYING in +#define COMPAT_TEXTURE texture +out vec4 FragColor; +#else +#define COMPAT_VARYING varying +#define FragColor gl_FragColor +#define COMPAT_TEXTURE texture2D +#endif + +#ifdef GL_ES +#ifdef GL_FRAGMENT_PRECISION_HIGH +precision highp float; +#else +precision mediump float; +#endif +#define COMPAT_PRECISION mediump +#else +#define COMPAT_PRECISION +#endif + +uniform COMPAT_PRECISION int FrameDirection; +uniform COMPAT_PRECISION int FrameCount; +uniform COMPAT_PRECISION vec2 OutputSize; +uniform COMPAT_PRECISION vec2 TextureSize; +uniform COMPAT_PRECISION vec2 InputSize; +uniform sampler2D Texture; +COMPAT_VARYING vec4 TEX0; + +void main() +{ + FragColor = COMPAT_TEXTURE(Texture, TEX0.xy); +} +#endif \ No newline at end of file diff --git a/Shaders/interpolation/catmull-rom-bilinear.glsl b/Shaders/interpolation/catmull-rom-bilinear.glsl new file mode 100644 index 0000000..03d5b77 --- /dev/null +++ b/Shaders/interpolation/catmull-rom-bilinear.glsl @@ -0,0 +1,137 @@ +/* + The following code is licensed under the MIT license: https://gist.github.com/TheRealMJP/bc503b0b87b643d3505d41eab8b332ae + Ported from code: https://gist.github.com/TheRealMJP/c83b8c0f46b63f3a88a5986f4fa982b1 + Samples a texture with Catmull-Rom filtering, using 9 texture fetches instead of 16. + See http://vec3.ca/bicubic-filtering-in-fewer-taps/ for more details + ATENTION: This code only work using LINEAR filter sampling set on Retroarch! + Modified to use 5 texture fetches +*/ + +#if defined(VERTEX) + +#if __VERSION__ >= 130 +#define COMPAT_VARYING out +#define COMPAT_ATTRIBUTE in +#define COMPAT_TEXTURE texture +#else +#define COMPAT_VARYING varying +#define COMPAT_ATTRIBUTE attribute +#define COMPAT_TEXTURE texture2D +#endif + +#ifdef GL_ES +#define COMPAT_PRECISION mediump +precision COMPAT_PRECISION float; +#else +#define COMPAT_PRECISION +#endif + +COMPAT_ATTRIBUTE vec4 VertexCoord; +COMPAT_ATTRIBUTE vec4 COLOR; +COMPAT_ATTRIBUTE vec4 TexCoord; +COMPAT_VARYING vec4 COL0; +COMPAT_VARYING vec4 TEX0; + +uniform mat4 MVPMatrix; +uniform COMPAT_PRECISION int FrameDirection; +uniform COMPAT_PRECISION int FrameCount; +uniform COMPAT_PRECISION vec2 OutputSize; +uniform COMPAT_PRECISION vec2 TextureSize; +uniform COMPAT_PRECISION vec2 InputSize; + +void main() +{ + gl_Position = MVPMatrix * VertexCoord; + COL0 = COLOR; + TEX0.xy = TexCoord.xy; +} + +#elif defined(FRAGMENT) + +#if __VERSION__ >= 130 +#define COMPAT_VARYING in +#define COMPAT_TEXTURE texture +out mediump vec4 FragColor; +#else +#define COMPAT_VARYING varying +#define FragColor gl_FragColor +#define COMPAT_TEXTURE texture2D +#endif + +#ifdef GL_ES +#ifdef GL_FRAGMENT_PRECISION_HIGH +precision highp float; +#else +precision mediump float; +#endif +#define COMPAT_PRECISION mediump +#else +#define COMPAT_PRECISION +#endif + +uniform COMPAT_PRECISION int FrameDirection; +uniform COMPAT_PRECISION int FrameCount; +uniform COMPAT_PRECISION vec2 OutputSize; +uniform COMPAT_PRECISION vec2 TextureSize; +uniform COMPAT_PRECISION vec2 InputSize; +uniform sampler2D Texture; +COMPAT_VARYING vec4 TEX0; + +// compatibility #defines +#define Source Texture +#define vTexCoord TEX0.xy + +#define SourceSize vec4(TextureSize, 1.0 / TextureSize) //either TextureSize or InputSize +#define outsize vec4(OutputSize, 1.0 / OutputSize) + +void main() +{ + // We're going to sample a a 4x4 grid of texels surrounding the target UV coordinate. We'll do this by rounding + // down the sample location to get the exact center of our "starting" texel. The starting texel will be at + // location [1, 1] in the grid, where [0, 0] is the top left corner. + vec2 samplePos = vTexCoord * SourceSize.xy; + vec2 texPos1 = floor(samplePos - 0.5) + 0.5; + + // Compute the fractional offset from our starting texel to our original sample location, which we'll + // feed into the Catmull-Rom spline function to get our filter weights. + vec2 f = samplePos - texPos1; + + // Compute the Catmull-Rom weights using the fractional offset that we calculated earlier. + // These equations are pre-expanded based on our knowledge of where the texels will be located, + // which lets us avoid having to evaluate a piece-wise function. + vec2 w0 = f * (-0.5 + f * (1.0 - 0.5 * f)); + vec2 w1 = 1.0 + f * f * (-2.5 + 1.5 * f); + vec2 w2 = f * (0.5 + f * (2.0 - 1.5 * f)); + vec2 w3 = f * f * (-0.5 + 0.5 * f); + + // Work out weighting factors and sampling offsets that will let us use bilinear filtering to + // simultaneously evaluate the middle 2 samples from the 4x4 grid. + vec2 w12 = w1 + w2; + vec2 offset12 = w2 / (w1 + w2); + + // Compute the final UV coordinates we'll use for sampling the texture + vec2 texPos0 = texPos1 - 1.; + vec2 texPos3 = texPos1 + 2.; + vec2 texPos12 = texPos1 + offset12; + + texPos0 *= SourceSize.zw; + texPos3 *= SourceSize.zw; + texPos12 *= SourceSize.zw; + + float wtm = w12.x * w0.y; + float wml = w0.x * w12.y; + float wmm = w12.x * w12.y; + float wmr = w3.x * w12.y; + float wbm = w12.x * w3.y; + + vec3 result = vec3(0.0f); + + result += COMPAT_TEXTURE(Source, vec2(texPos12.x, texPos0.y)).rgb * wtm; + result += COMPAT_TEXTURE(Source, vec2(texPos0.x, texPos12.y)).rgb * wml; + result += COMPAT_TEXTURE(Source, vec2(texPos12.x, texPos12.y)).rgb * wmm; + result += COMPAT_TEXTURE(Source, vec2(texPos3.x, texPos12.y)).rgb * wmr; + result += COMPAT_TEXTURE(Source, vec2(texPos12.x, texPos3.y)).rgb * wbm; + + FragColor = vec4(result * (1./(wtm+wml+wmm+wmr+wbm)), 1.0); +} +#endif diff --git a/Shaders/interpolation/jinc2-dedither.glsl b/Shaders/interpolation/jinc2-dedither.glsl new file mode 100644 index 0000000..32235e0 --- /dev/null +++ b/Shaders/interpolation/jinc2-dedither.glsl @@ -0,0 +1,202 @@ +/* + Hyllian's jinc windowed-jinc 2-lobe sharper with anti-ringing Shader + + Copyright (C) 2011-2016 Hyllian/Jararaca - sergiogdb@gmail.com + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + 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. + +*/ + +#define JINC2_WINDOW_SINC 0.405 +#define JINC2_SINC 0.79 +#define JINC2_AR_STRENGTH 0.8 + +#define texCoord TEX0 + +#if defined(VERTEX) + +#if __VERSION__ >= 130 +#define OUT out +#define IN in +#define tex2D texture +#else +#define OUT varying +#define IN attribute +#define tex2D texture2D +#endif + +#ifdef GL_ES +#define COMPAT_PRECISION mediump +#else +#define COMPAT_PRECISION +#endif + + +IN vec4 VertexCoord; +IN vec4 Color; +IN vec2 TexCoord; +OUT vec4 color; +OUT vec2 texCoord; + +uniform mat4 MVPMatrix; +uniform COMPAT_PRECISION int FrameDirection; +uniform COMPAT_PRECISION int FrameCount; +uniform COMPAT_PRECISION vec2 OutputSize; +uniform COMPAT_PRECISION vec2 TextureSize; +uniform COMPAT_PRECISION vec2 InputSize; + +void main() +{ + gl_Position = MVPMatrix * VertexCoord; + color = Color; + texCoord = TexCoord * 1.0001; +} + +#elif defined(FRAGMENT) + +#if __VERSION__ >= 130 +#define IN in +#define tex2D texture +out vec4 FragColor; +#else +#define IN varying +#define FragColor gl_FragColor +#define tex2D texture2D +#endif + +#ifdef GL_ES +#ifdef GL_FRAGMENT_PRECISION_HIGH +precision highp float; +#else +precision mediump float; +#endif +#define COMPAT_PRECISION mediump +#else +#define COMPAT_PRECISION +#endif + +uniform COMPAT_PRECISION int FrameDirection; +uniform COMPAT_PRECISION int FrameCount; +uniform COMPAT_PRECISION vec2 OutputSize; +uniform COMPAT_PRECISION vec2 TextureSize; +uniform COMPAT_PRECISION vec2 InputSize; +uniform sampler2D s_p; +IN vec2 texCoord; + +const float halfpi = 1.5707963267948966192313216916398; +const float pi = 3.1415926535897932384626433832795; +const float wa = JINC2_WINDOW_SINC*pi; +const float wb = JINC2_SINC*pi; + +// Calculates the distance between two points +float d(vec2 pt1, vec2 pt2) +{ + vec2 v = pt2 - pt1; + return sqrt(dot(v,v)); +} + +vec3 min4(vec3 a, vec3 b, vec3 c, vec3 d) +{ + return min(a, min(b, min(c, d))); +} + +vec3 max4(vec3 a, vec3 b, vec3 c, vec3 d) +{ + return max(a, max(b, max(c, d))); +} + +vec4 resampler(vec4 x) +{ + vec4 res; + + res = (x==vec4(0.0, 0.0, 0.0, 0.0)) ? vec4(wa*wb) : sin(x*wa)*sin(x*wb)/(x*x); + + return res; +} + +void main() +{ + + vec3 color; + vec4 weights[4]; + + vec2 dx = vec2(1.0, 0.0); + vec2 dy = vec2(0.0, 1.0); + + vec2 pc = texCoord*TextureSize; + + vec2 tc = (floor(pc-vec2(0.5,0.5))+vec2(0.5,0.5)); + + weights[0] = resampler(vec4(d(pc, tc -dx -dy), d(pc, tc -dy), d(pc, tc +dx -dy), d(pc, tc+2.0*dx -dy))); + weights[1] = resampler(vec4(d(pc, tc -dx ), d(pc, tc ), d(pc, tc +dx ), d(pc, tc+2.0*dx ))); + weights[2] = resampler(vec4(d(pc, tc -dx +dy), d(pc, tc +dy), d(pc, tc +dx +dy), d(pc, tc+2.0*dx +dy))); + weights[3] = resampler(vec4(d(pc, tc -dx+2.0*dy), d(pc, tc +2.0*dy), d(pc, tc +dx+2.0*dy), d(pc, tc+2.0*dx+2.0*dy))); + + dx = dx/TextureSize; + dy = dy/TextureSize; + tc = tc/TextureSize; + + vec3 c00 = tex2D(s_p, tc -dx -dy).xyz; + vec3 c10 = tex2D(s_p, tc -dy).xyz; + vec3 c20 = tex2D(s_p, tc +dx -dy).xyz; + vec3 c30 = tex2D(s_p, tc+2.0*dx -dy).xyz; + vec3 c01 = tex2D(s_p, tc -dx ).xyz; + vec3 c11 = tex2D(s_p, tc ).xyz; + vec3 c21 = tex2D(s_p, tc +dx ).xyz; + vec3 c31 = tex2D(s_p, tc+2.0*dx ).xyz; + vec3 c02 = tex2D(s_p, tc -dx +dy).xyz; + vec3 c12 = tex2D(s_p, tc +dy).xyz; + vec3 c22 = tex2D(s_p, tc +dx +dy).xyz; + vec3 c32 = tex2D(s_p, tc+2.0*dx +dy).xyz; + vec3 c03 = tex2D(s_p, tc -dx+2.0*dy).xyz; + vec3 c13 = tex2D(s_p, tc +2.0*dy).xyz; + vec3 c23 = tex2D(s_p, tc +dx+2.0*dy).xyz; + vec3 c33 = tex2D(s_p, tc+2.0*dx+2.0*dy).xyz; + + color = tex2D(s_p, texCoord).xyz; + + // Get min/max samples + vec3 min_sample = min4(c11, c21, c12, c22); + vec3 max_sample = max4(c11, c21, c12, c22); +/* + color = mat4x3(c00, c10, c20, c30) * weights[0]; + color+= mat4x3(c01, c11, c21, c31) * weights[1]; + color+= mat4x3(c02, c12, c22, c32) * weights[2]; + color+= mat4x3(c03, c13, c23, c33) * weights[3]; + mat4 wgts = mat4(weights[0], weights[1], weights[2], weights[3]); + vec4 wsum = wgts * vec4(1.0,1.0,1.0,1.0); + color = color/(dot(wsum, vec4(1.0,1.0,1.0,1.0))); +*/ + + + color = vec3(dot(weights[0], vec4(c00.x, c10.x, c20.x, c30.x)), dot(weights[0], vec4(c00.y, c10.y, c20.y, c30.y)), dot(weights[0], vec4(c00.z, c10.z, c20.z, c30.z))); + color+= vec3(dot(weights[1], vec4(c01.x, c11.x, c21.x, c31.x)), dot(weights[1], vec4(c01.y, c11.y, c21.y, c31.y)), dot(weights[1], vec4(c01.z, c11.z, c21.z, c31.z))); + color+= vec3(dot(weights[2], vec4(c02.x, c12.x, c22.x, c32.x)), dot(weights[2], vec4(c02.y, c12.y, c22.y, c32.y)), dot(weights[2], vec4(c02.z, c12.z, c22.z, c32.z))); + color+= vec3(dot(weights[3], vec4(c03.x, c13.x, c23.x, c33.x)), dot(weights[3], vec4(c03.y, c13.y, c23.y, c33.y)), dot(weights[3], vec4(c03.z, c13.z, c23.z, c33.z))); + color = color/(dot(weights[0], vec4(1,1,1,1)) + dot(weights[1], vec4(1,1,1,1)) + dot(weights[2], vec4(1,1,1,1)) + dot(weights[3], vec4(1,1,1,1))); + + // Anti-ringing + vec3 aux = color; + color = clamp(color, min_sample, max_sample); + color = mix(aux, color, JINC2_AR_STRENGTH); + + // final sum and weight normalization + FragColor.xyz = color; +} +#endif diff --git a/Shaders/interpolation/lanczos2-sharp.glsl b/Shaders/interpolation/lanczos2-sharp.glsl new file mode 100644 index 0000000..5f83af3 --- /dev/null +++ b/Shaders/interpolation/lanczos2-sharp.glsl @@ -0,0 +1,205 @@ +/* + Hyllian's jinc windowed-jinc 2-lobe sharper with anti-ringing Shader + + Copyright (C) 2011-2016 Hyllian/Jararaca - sergiogdb@gmail.com + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + 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. + +*/ + +#define JINC2_WINDOW_SINC 0.5 +#define JINC2_SINC 1.0 +#define JINC2_AR_STRENGTH 0.8 + +#define texCoord TEX0 + +#if defined(VERTEX) + +#if __VERSION__ >= 130 +#define OUT out +#define IN in +#define tex2D texture +#else +#define OUT varying +#define IN attribute +#define tex2D texture2D +#endif + +#ifdef GL_ES +#define COMPAT_PRECISION mediump +#else +#define COMPAT_PRECISION +#endif + + +IN vec4 VertexCoord; +IN vec4 Color; +IN vec2 TexCoord; +OUT vec4 color; +OUT vec2 texCoord; + +uniform mat4 MVPMatrix; +uniform COMPAT_PRECISION int FrameDirection; +uniform COMPAT_PRECISION int FrameCount; +uniform COMPAT_PRECISION vec2 OutputSize; +uniform COMPAT_PRECISION vec2 TextureSize; +uniform COMPAT_PRECISION vec2 InputSize; + +void main() +{ + gl_Position = MVPMatrix * VertexCoord; + color = Color; + texCoord = TexCoord; +} + +#elif defined(FRAGMENT) + +#if __VERSION__ >= 130 +#define IN in +#define tex2D texture +out vec4 FragColor; +#else +#define IN varying +#define FragColor gl_FragColor +#define tex2D texture2D +#endif + +#ifdef GL_ES +#ifdef GL_FRAGMENT_PRECISION_HIGH +precision highp float; +#else +precision mediump float; +#endif +#define COMPAT_PRECISION mediump +#else +#define COMPAT_PRECISION +#endif + +uniform COMPAT_PRECISION int FrameDirection; +uniform COMPAT_PRECISION int FrameCount; +uniform COMPAT_PRECISION vec2 OutputSize; +uniform COMPAT_PRECISION vec2 TextureSize; +uniform COMPAT_PRECISION vec2 InputSize; +uniform sampler2D s_p; +IN vec2 texCoord; + +const float halfpi = 1.5707963267948966192313216916398; +const float pi = 3.1415926535897932384626433832795; +const float wa = JINC2_WINDOW_SINC*pi; +const float wb = JINC2_SINC*pi; + +// Calculates the distance between two points +float d(vec2 pt1, vec2 pt2) +{ + vec2 v = pt2 - pt1; + return sqrt(dot(v,v)); +} + +vec3 min4(vec3 a, vec3 b, vec3 c, vec3 d) +{ + return min(a, min(b, min(c, d))); +} + +vec3 max4(vec3 a, vec3 b, vec3 c, vec3 d) +{ + return max(a, max(b, max(c, d))); +} + +vec4 resampler(vec4 x) +{ + vec4 res; + + res.x = (x.x==0.0) ? wa*wb : sin(x.x*wa)*sin(x.x*wb)/(x.x*x.x); + res.y = (x.y==0.0) ? wa*wb : sin(x.y*wa)*sin(x.y*wb)/(x.y*x.y); + res.z = (x.z==0.0) ? wa*wb : sin(x.z*wa)*sin(x.z*wb)/(x.z*x.z); + res.w = (x.w==0.0) ? wa*wb : sin(x.w*wa)*sin(x.w*wb)/(x.w*x.w); + + return res; +} + +void main() +{ + + vec3 color; + vec4 weights[4]; + + vec2 dx = vec2(1.0, 0.0); + vec2 dy = vec2(0.0, 1.0); + + vec2 pc = texCoord*TextureSize; + + vec2 tc = (floor(pc-vec2(0.5,0.5))+vec2(0.5,0.5)); + + weights[0] = resampler(vec4(d(pc, tc -dx -dy), d(pc, tc -dy), d(pc, tc +dx -dy), d(pc, tc+2.0*dx -dy))); + weights[1] = resampler(vec4(d(pc, tc -dx ), d(pc, tc ), d(pc, tc +dx ), d(pc, tc+2.0*dx ))); + weights[2] = resampler(vec4(d(pc, tc -dx +dy), d(pc, tc +dy), d(pc, tc +dx +dy), d(pc, tc+2.0*dx +dy))); + weights[3] = resampler(vec4(d(pc, tc -dx+2.0*dy), d(pc, tc +2.0*dy), d(pc, tc +dx+2.0*dy), d(pc, tc+2.0*dx+2.0*dy))); + + dx = dx/TextureSize; + dy = dy/TextureSize; + tc = tc/TextureSize; + + vec3 c00 = tex2D(s_p, tc -dx -dy).xyz; + vec3 c10 = tex2D(s_p, tc -dy).xyz; + vec3 c20 = tex2D(s_p, tc +dx -dy).xyz; + vec3 c30 = tex2D(s_p, tc+2.0*dx -dy).xyz; + vec3 c01 = tex2D(s_p, tc -dx ).xyz; + vec3 c11 = tex2D(s_p, tc ).xyz; + vec3 c21 = tex2D(s_p, tc +dx ).xyz; + vec3 c31 = tex2D(s_p, tc+2.0*dx ).xyz; + vec3 c02 = tex2D(s_p, tc -dx +dy).xyz; + vec3 c12 = tex2D(s_p, tc +dy).xyz; + vec3 c22 = tex2D(s_p, tc +dx +dy).xyz; + vec3 c32 = tex2D(s_p, tc+2.0*dx +dy).xyz; + vec3 c03 = tex2D(s_p, tc -dx+2.0*dy).xyz; + vec3 c13 = tex2D(s_p, tc +2.0*dy).xyz; + vec3 c23 = tex2D(s_p, tc +dx+2.0*dy).xyz; + vec3 c33 = tex2D(s_p, tc+2.0*dx+2.0*dy).xyz; + + color = tex2D(s_p, texCoord).xyz; + + // Get min/max samples + vec3 min_sample = min4(c11, c21, c12, c22); + vec3 max_sample = max4(c11, c21, c12, c22); +/* + color = mat4x3(c00, c10, c20, c30) * weights[0]; + color+= mat4x3(c01, c11, c21, c31) * weights[1]; + color+= mat4x3(c02, c12, c22, c32) * weights[2]; + color+= mat4x3(c03, c13, c23, c33) * weights[3]; + mat4 wgts = mat4(weights[0], weights[1], weights[2], weights[3]); + vec4 wsum = wgts * vec4(1.0,1.0,1.0,1.0); + color = color/(dot(wsum, vec4(1.0,1.0,1.0,1.0))); +*/ + + + color = vec3(dot(weights[0], vec4(c00.x, c10.x, c20.x, c30.x)), dot(weights[0], vec4(c00.y, c10.y, c20.y, c30.y)), dot(weights[0], vec4(c00.z, c10.z, c20.z, c30.z))); + color+= vec3(dot(weights[1], vec4(c01.x, c11.x, c21.x, c31.x)), dot(weights[1], vec4(c01.y, c11.y, c21.y, c31.y)), dot(weights[1], vec4(c01.z, c11.z, c21.z, c31.z))); + color+= vec3(dot(weights[2], vec4(c02.x, c12.x, c22.x, c32.x)), dot(weights[2], vec4(c02.y, c12.y, c22.y, c32.y)), dot(weights[2], vec4(c02.z, c12.z, c22.z, c32.z))); + color+= vec3(dot(weights[3], vec4(c03.x, c13.x, c23.x, c33.x)), dot(weights[3], vec4(c03.y, c13.y, c23.y, c33.y)), dot(weights[3], vec4(c03.z, c13.z, c23.z, c33.z))); + color = color/(dot(weights[0], vec4(1,1,1,1)) + dot(weights[1], vec4(1,1,1,1)) + dot(weights[2], vec4(1,1,1,1)) + dot(weights[3], vec4(1,1,1,1))); + + // Anti-ringing + vec3 aux = color; + color = clamp(color, min_sample, max_sample); + color = mix(aux, color, JINC2_AR_STRENGTH); + + // final sum and weight normalization + FragColor.xyz = color; +} +#endif diff --git a/Shaders/nearest-neighbor.glsl b/Shaders/nearest-neighbor.glsl new file mode 100644 index 0000000..aa7bee6 --- /dev/null +++ b/Shaders/nearest-neighbor.glsl @@ -0,0 +1,73 @@ +#if defined(VERTEX) + +#if __VERSION__ >= 130 +#define COMPAT_VARYING out +#define COMPAT_ATTRIBUTE in +#define COMPAT_TEXTURE texture +#else +#define COMPAT_VARYING varying +#define COMPAT_ATTRIBUTE attribute +#define COMPAT_TEXTURE texture2D +#endif + +#ifdef GL_ES +#define COMPAT_PRECISION mediump +#else +#define COMPAT_PRECISION +#endif + +COMPAT_ATTRIBUTE vec4 VertexCoord; +COMPAT_ATTRIBUTE vec4 COLOR; +COMPAT_ATTRIBUTE vec4 TexCoord; +COMPAT_VARYING vec4 COL0; +COMPAT_VARYING vec4 TEX0; + +uniform mat4 MVPMatrix; +uniform COMPAT_PRECISION int FrameDirection; +uniform COMPAT_PRECISION int FrameCount; +uniform COMPAT_PRECISION vec2 OutputSize; +uniform COMPAT_PRECISION vec2 TextureSize; +uniform COMPAT_PRECISION vec2 InputSize; + +void main() +{ + gl_Position = VertexCoord.x * MVPMatrix[0] + VertexCoord.y * MVPMatrix[1] + VertexCoord.z * MVPMatrix[2] + VertexCoord.w * MVPMatrix[3]; + TEX0.xy = TexCoord.xy; +} + +#elif defined(FRAGMENT) + +#if __VERSION__ >= 130 +#define COMPAT_VARYING in +#define COMPAT_TEXTURE texture +out vec4 FragColor; +#else +#define COMPAT_VARYING varying +#define FragColor gl_FragColor +#define COMPAT_TEXTURE texture2D +#endif + +#ifdef GL_ES +#ifdef GL_FRAGMENT_PRECISION_HIGH +precision highp float; +#else +precision mediump float; +#endif +#define COMPAT_PRECISION mediump +#else +#define COMPAT_PRECISION +#endif + +uniform COMPAT_PRECISION int FrameDirection; +uniform COMPAT_PRECISION int FrameCount; +uniform COMPAT_PRECISION vec2 OutputSize; +uniform COMPAT_PRECISION vec2 TextureSize; +uniform COMPAT_PRECISION vec2 InputSize; +uniform sampler2D Texture; +COMPAT_VARYING vec4 TEX0; + +void main() +{ + FragColor = COMPAT_TEXTURE(Texture, TEX0.xy); +} +#endif \ No newline at end of file diff --git a/Shaders/readme.txt b/Shaders/readme.txt new file mode 100644 index 0000000..abd02a0 --- /dev/null +++ b/Shaders/readme.txt @@ -0,0 +1,10 @@ +This is a package of pixel shaders intended for old school emulators. +Copyrights are held by the respective authors. + +https://github.com/libretro/glsl-shaders + + +Note: Filename must end with "bilinear.glsl" to enable bilinear hardware filtering (GL_LINEAR) + + +Extract shader-package.zip to unlock 100+ additional shaders diff --git a/Shaders/scanlines/scanline.glsl b/Shaders/scanlines/scanline.glsl new file mode 100644 index 0000000..7c8423b --- /dev/null +++ b/Shaders/scanlines/scanline.glsl @@ -0,0 +1,106 @@ +// Parameter lines go here: +#pragma parameter SCANLINE_BASE_BRIGHTNESS "Scanline Base Brightness" 0.95 0.0 1.0 0.01 +#pragma parameter SCANLINE_SINE_COMP_A "Scanline Sine Comp A" 0.0 0.0 0.10 0.01 +#pragma parameter SCANLINE_SINE_COMP_B "Scanline Sine Comp B" 0.15 0.0 1.0 0.05 + +#define pi 3.141592654 + +#if defined(VERTEX) + +#if __VERSION__ >= 130 +#define COMPAT_VARYING out +#define COMPAT_ATTRIBUTE in +#define COMPAT_TEXTURE texture +#else +#define COMPAT_VARYING varying +#define COMPAT_ATTRIBUTE attribute +#define COMPAT_TEXTURE texture2D +#endif + +#ifdef GL_ES +#define COMPAT_PRECISION mediump +#else +#define COMPAT_PRECISION +#endif + +COMPAT_ATTRIBUTE vec4 VertexCoord; +COMPAT_ATTRIBUTE vec4 COLOR; +COMPAT_ATTRIBUTE vec4 TexCoord; +COMPAT_VARYING vec4 COL0; +COMPAT_VARYING vec4 TEX0; +COMPAT_VARYING vec2 omega; + +vec4 _oPosition1; +uniform mat4 MVPMatrix; +uniform COMPAT_PRECISION int FrameDirection; +uniform COMPAT_PRECISION int FrameCount; +uniform COMPAT_PRECISION vec2 OutputSize; +uniform COMPAT_PRECISION vec2 TextureSize; +uniform COMPAT_PRECISION vec2 InputSize; + +void main() +{ + gl_Position = MVPMatrix * VertexCoord; + COL0 = COLOR; + TEX0.xy = TexCoord.xy; + omega = vec2(pi * OutputSize.x, 2.0 * pi * TextureSize.y); +} + +#elif defined(FRAGMENT) + +#if __VERSION__ >= 130 +#define COMPAT_VARYING in +#define COMPAT_TEXTURE texture +out vec4 FragColor; +#else +#define COMPAT_VARYING varying +#define FragColor gl_FragColor +#define COMPAT_TEXTURE texture2D +#endif + +#ifdef GL_ES +#ifdef GL_FRAGMENT_PRECISION_HIGH +precision highp float; +#else +precision mediump float; +#endif +#define COMPAT_PRECISION mediump +#else +#define COMPAT_PRECISION +#endif + +uniform COMPAT_PRECISION int FrameDirection; +uniform COMPAT_PRECISION int FrameCount; +uniform COMPAT_PRECISION vec2 OutputSize; +uniform COMPAT_PRECISION vec2 TextureSize; +uniform COMPAT_PRECISION vec2 InputSize; +uniform sampler2D Texture; +COMPAT_VARYING vec4 TEX0; +COMPAT_VARYING vec2 omega; + +// compatibility #defines +#define Source Texture +#define vTexCoord TEX0.xy + +#define SourceSize vec4(TextureSize, 1.0 / TextureSize) //either TextureSize or InputSize +#define OutputSize vec4(OutputSize, 1.0 / OutputSize) + +#ifdef PARAMETER_UNIFORM +// All parameter floats need to have COMPAT_PRECISION in front of them +uniform COMPAT_PRECISION float SCANLINE_BASE_BRIGHTNESS; +uniform COMPAT_PRECISION float SCANLINE_SINE_COMP_A; +uniform COMPAT_PRECISION float SCANLINE_SINE_COMP_B; +#else +#define SCANLINE_BASE_BRIGHTNESS 0.95 +#define SCANLINE_SINE_COMP_A 0.0 +#define SCANLINE_SINE_COMP_B 0.15 +#endif + +void main() +{ + vec2 sine_comp = vec2(SCANLINE_SINE_COMP_A, SCANLINE_SINE_COMP_B); + vec3 res = COMPAT_TEXTURE(Source, vTexCoord).xyz; + vec3 scanline = res * (SCANLINE_BASE_BRIGHTNESS + dot(sine_comp * sin(vTexCoord * omega), vec2(1.0, 1.0))); + FragColor = vec4(scanline.x, scanline.y, scanline.z, 1.0); +} +#endif diff --git a/Shaders/sharpen/fast-sharpen.glsl b/Shaders/sharpen/fast-sharpen.glsl new file mode 100644 index 0000000..623fd6d --- /dev/null +++ b/Shaders/sharpen/fast-sharpen.glsl @@ -0,0 +1,148 @@ +/* + Fast Sharpen Shader + + Copyright (C) 2005 - 2019 guest(r) - guest.r@gmail.com + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License + as published by the Free Software Foundation; either version 2 + of the License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +*/ + +#pragma parameter SHARPEN "Sharpen strength" 1.00 0.0 2.00 0.05 +#pragma parameter CONTR "Ammount of sharpening" 0.07 0.0 0.25 0.01 +#pragma parameter DETAILS "Details sharpened " 1.00 0.0 1.00 0.05 + +#if defined(VERTEX) + +#if __VERSION__ >= 130 +#define COMPAT_VARYING out +#define COMPAT_ATTRIBUTE in +#define COMPAT_TEXTURE texture +#else +#define COMPAT_VARYING varying +#define COMPAT_ATTRIBUTE attribute +#define COMPAT_TEXTURE texture2D +#endif + +#ifdef GL_ES +#define COMPAT_PRECISION mediump +#else +#define COMPAT_PRECISION +#endif + +COMPAT_ATTRIBUTE vec4 VertexCoord; +COMPAT_ATTRIBUTE vec4 TexCoord; +COMPAT_VARYING vec4 TEX0; + +vec4 _oPosition1; +uniform mat4 MVPMatrix; +uniform COMPAT_PRECISION int FrameDirection; +uniform COMPAT_PRECISION int FrameCount; +uniform COMPAT_PRECISION vec2 OutputSize; +uniform COMPAT_PRECISION vec2 TextureSize; +uniform COMPAT_PRECISION vec2 InputSize; +COMPAT_VARYING vec2 g10; +COMPAT_VARYING vec2 g01; +COMPAT_VARYING vec2 g12; +COMPAT_VARYING vec2 g21; + +// compatibility #defines +#define vTexCoord TEX0.xy +#define SourceSize vec4(TextureSize, 1.0 / TextureSize) //either TextureSize or InputSize +#define OutSize vec4(OutputSize, 1.0 / OutputSize) + +void main() +{ + gl_Position = MVPMatrix * VertexCoord; + TEX0.xy = TexCoord.xy * 1.00001; + g10 = vec2( 0.3333,-1.0)*SourceSize.zw; + g01 = vec2(-1.0,-0.3333)*SourceSize.zw; + g12 = vec2(-0.3333, 1.0)*SourceSize.zw; + g21 = vec2( 1.0, 0.3333)*SourceSize.zw; +} + +#elif defined(FRAGMENT) + +#ifdef GL_ES +#ifdef GL_FRAGMENT_PRECISION_HIGH +precision highp float; +#else +precision mediump float; +#endif +#define COMPAT_PRECISION mediump +#else +#define COMPAT_PRECISION +#endif + +#if __VERSION__ >= 130 +#define COMPAT_VARYING in +#define COMPAT_TEXTURE texture +out COMPAT_PRECISION vec4 FragColor; +#else +#define COMPAT_VARYING varying +#define FragColor gl_FragColor +#define COMPAT_TEXTURE texture2D +#endif + +uniform COMPAT_PRECISION int FrameDirection; +uniform COMPAT_PRECISION int FrameCount; +uniform COMPAT_PRECISION vec2 OutputSize; +uniform COMPAT_PRECISION vec2 TextureSize; +uniform COMPAT_PRECISION vec2 InputSize; +uniform sampler2D Texture; +COMPAT_VARYING vec4 TEX0; +COMPAT_VARYING vec2 g10; +COMPAT_VARYING vec2 g01; +COMPAT_VARYING vec2 g12; +COMPAT_VARYING vec2 g21; + +// compatibility #defines +#define Source Texture +#define vTexCoord TEX0.xy + +#define SourceSize vec4(TextureSize, 1.0 / TextureSize) //either TextureSize or InputSize +#define OutSize vec4(OutputSize, 1.0 / OutputSize) + +#ifdef PARAMETER_UNIFORM +uniform COMPAT_PRECISION float SHARPEN; +uniform COMPAT_PRECISION float CONTR; +uniform COMPAT_PRECISION float DETAILS; +#else +#define SHARPEN 1.2 +#define CONTR 0.08 +#define DETAILS 1.0 +#endif + +void main() +{ + vec3 c10 = COMPAT_TEXTURE(Source, vTexCoord + g10).rgb; + vec3 c01 = COMPAT_TEXTURE(Source, vTexCoord + g01).rgb; + vec3 c21 = COMPAT_TEXTURE(Source, vTexCoord + g21).rgb; + vec3 c12 = COMPAT_TEXTURE(Source, vTexCoord + g12).rgb; + vec3 c11 = COMPAT_TEXTURE(Source, vTexCoord ).rgb; + vec3 b11 = (c10+c01+c12+c21)*0.25; + + float contrast = max(max(c11.r,c11.g),c11.b); + contrast = mix(2.0*CONTR, CONTR, contrast); + + vec3 mn1 = min(min(c10,c01),min(c12,c21)); mn1 = min(mn1,c11*(1.0-contrast)); + vec3 mx1 = max(max(c10,c01),max(c12,c21)); mx1 = max(mx1,c11*(1.0+contrast)); + + vec3 dif = pow(mx1-mn1+0.0001, vec3(0.75,0.75,0.75)); + vec3 sharpen = mix(vec3(SHARPEN*DETAILS), vec3(SHARPEN), dif); + + c11 = clamp(mix(c11,b11,-sharpen), mn1,mx1); + + FragColor = vec4(c11,1.0); +} +#endif diff --git a/Shaders/xbr/xbr-lv2-noblend.glsl b/Shaders/xbr/xbr-lv2-noblend.glsl new file mode 100644 index 0000000..bbc2aae --- /dev/null +++ b/Shaders/xbr/xbr-lv2-noblend.glsl @@ -0,0 +1,300 @@ +#version 130 + +/* + Hyllian's xBR-lv2-noblend Shader + + Copyright (C) 2011-2016 Hyllian - sergiogdb@gmail.com + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + 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. + + Incorporates some of the ideas from SABR shader. Thanks to Joshua Street. +*/ + +#pragma parameter XBR_EQ_THRESHOLD "Eq Threshold" 0.6 0.0 2.0 0.1 +#pragma parameter XBR_LV2_COEFFICIENT "Lv2 Coefficient" 2.0 1.0 3.0 0.1 + +#define mul(a,b) (b*a) + +// Uncomment just one of the three params below to choose the corner detection +#define CORNER_A +//#define CORNER_B +//#define CORNER_C +//#define CORNER_D + +#define lv2_cf XBR_LV2_COEFFICIENT + +#define texCoord TEX0 +#define t1 TEX1 +#define t2 TEX2 +#define t3 TEX3 +#define t4 TEX4 +#define t5 TEX5 +#define t6 TEX6 +#define t7 TEX7 + +#if defined(VERTEX) + +#if __VERSION__ >= 130 +#define OUT out +#define IN in +#define tex2D texture +#else +#define OUT varying +#define IN attribute +#define tex2D texture2D +#endif + +#ifdef GL_ES +#define PRECISION mediump +#else +#define PRECISION +#endif + + +IN vec4 VertexCoord; +IN vec4 Color; +IN vec2 TexCoord; + +OUT vec4 color; +OUT vec2 texCoord; +OUT vec4 t1; +OUT vec4 t2; +OUT vec4 t3; +OUT vec4 t4; +OUT vec4 t5; +OUT vec4 t6; +OUT vec4 t7; + +uniform mat4 MVPMatrix; +uniform PRECISION int FrameDirection; +uniform PRECISION int FrameCount; +uniform PRECISION vec2 OutputSize; +uniform PRECISION vec2 TextureSize; +uniform PRECISION vec2 InputSize; + +void main() +{ + gl_Position = MVPMatrix * VertexCoord; + color = Color; + + float dx = (1.0/TextureSize.x); + float dy = (1.0/TextureSize.y); + + texCoord = TexCoord; + texCoord.x *= 1.00000001; + t1 = TexCoord.xxxy + vec4( -dx, 0, dx,-2.0*dy); // A1 B1 C1 + t2 = TexCoord.xxxy + vec4( -dx, 0, dx, -dy); // A B C + t3 = TexCoord.xxxy + vec4( -dx, 0, dx, 0); // D E F + t4 = TexCoord.xxxy + vec4( -dx, 0, dx, dy); // G H I + t5 = TexCoord.xxxy + vec4( -dx, 0, dx, 2.0*dy); // G5 H5 I5 + t6 = TexCoord.xyyy + vec4(-2.0*dx,-dy, 0, dy); // A0 D0 G0 + t7 = TexCoord.xyyy + vec4( 2.0*dx,-dy, 0, dy); // C4 F4 I4 +} + + +#elif defined(FRAGMENT) + +#if __VERSION__ >= 130 +#define IN in +#define tex2D texture +out vec4 FragColor; +#else +#define IN varying +#define FragColor gl_FragColor +#define tex2D texture2D +#endif + +#ifdef GL_ES +#ifdef GL_FRAGMENT_PRECISION_HIGH +precision highp float; +#else +precision mediump float; +#endif +#define PRECISION mediump +#else +#define PRECISION +#endif + +uniform PRECISION int FrameDirection; +uniform PRECISION int FrameCount; +uniform PRECISION vec2 OutputSize; +uniform PRECISION vec2 TextureSize; +uniform PRECISION vec2 InputSize; +uniform sampler2D decal; +IN vec2 texCoord; +IN vec4 t1; +IN vec4 t2; +IN vec4 t3; +IN vec4 t4; +IN vec4 t5; +IN vec4 t6; +IN vec4 t7; + +#ifdef PARAMETER_UNIFORM +uniform PRECISION float XBR_EQ_THRESHOLD; +uniform PRECISION float XBR_LV2_COEFFICIENT; +#else +#define XBR_EQ_THRESHOLD 0.6 +#define XBR_LV2_COEFFICIENT 2.0 +#endif +// END PARAMETERS // + +const vec3 Y = vec3(0.2126, 0.7152, 0.0722); + +// Difference between vector components. +vec4 df(vec4 A, vec4 B) +{ + return vec4(abs(A-B)); +} + +// Compare two vectors and return their components are different. +vec4 diff(vec4 A, vec4 B) +{ + return vec4(notEqual(A, B)); +} + +// Determine if two vector components are equal based on a threshold. +vec4 eq(vec4 A, vec4 B) +{ + return (step(df(A, B), vec4(XBR_EQ_THRESHOLD))); +} + +// Determine if two vector components are NOT equal based on a threshold. +vec4 neq(vec4 A, vec4 B) +{ + return (vec4(1.0, 1.0, 1.0, 1.0) - eq(A, B)); +} + +// Weighted distance. +vec4 wd(vec4 a, vec4 b, vec4 c, vec4 d, vec4 e, vec4 f, vec4 g, vec4 h) +{ + return (df(a,b) + df(a,c) + df(d,e) + df(d,f) + 4.0*df(g,h)); +} + +vec4 weighted_distance(vec4 a, vec4 b, vec4 c, vec4 d, vec4 e, vec4 f, vec4 g, vec4 h, vec4 i, vec4 j, vec4 k, vec4 l) +{ + return (df(a,b) + df(a,c) + df(d,e) + df(d,f) + df(i,j) + df(k,l) + 2.0*df(g,h)); +} + +float c_df(vec3 c1, vec3 c2) +{ + vec3 df = abs(c1 - c2); + return df.r + df.g + df.b; +} + +void main() +{ + vec4 edri, edr, edr_l, edr_u; // px = pixel, edr = edge detection rule + vec4 irlv1, irlv2l, irlv2u, block_3d; + bvec4 nc, px; + vec4 fx, fx_l, fx_u; // inequations of straight lines. + + vec2 fp = fract(texCoord*TextureSize); + + vec3 A1 = tex2D(decal, t1.xw ).xyz; + vec3 B1 = tex2D(decal, t1.yw ).xyz; + vec3 C1 = tex2D(decal, t1.zw ).xyz; + vec3 A = tex2D(decal, t2.xw ).xyz; + vec3 B = tex2D(decal, t2.yw ).xyz; + vec3 C = tex2D(decal, t2.zw ).xyz; + vec3 D = tex2D(decal, t3.xw ).xyz; + vec3 E = tex2D(decal, t3.yw ).xyz; + vec3 F = tex2D(decal, t3.zw ).xyz; + vec3 G = tex2D(decal, t4.xw ).xyz; + vec3 H = tex2D(decal, t4.yw ).xyz; + vec3 I = tex2D(decal, t4.zw ).xyz; + vec3 G5 = tex2D(decal, t5.xw ).xyz; + vec3 H5 = tex2D(decal, t5.yw ).xyz; + vec3 I5 = tex2D(decal, t5.zw ).xyz; + vec3 A0 = tex2D(decal, t6.xy ).xyz; + vec3 D0 = tex2D(decal, t6.xz ).xyz; + vec3 G0 = tex2D(decal, t6.xw ).xyz; + vec3 C4 = tex2D(decal, t7.xy ).xyz; + vec3 F4 = tex2D(decal, t7.xz ).xyz; + vec3 I4 = tex2D(decal, t7.xw ).xyz; + + vec4 b = mul( mat4x3(B, D, H, F), Y ); + vec4 c = mul( mat4x3(C, A, G, I), Y ); + vec4 e = mul( mat4x3(E, E, E, E), Y ); + vec4 d = b.yzwx; + vec4 f = b.wxyz; + vec4 g = c.zwxy; + vec4 h = b.zwxy; + vec4 i = c.wxyz; + + vec4 i4 = mul( mat4x3(I4, C1, A0, G5), Y ); + vec4 i5 = mul( mat4x3(I5, C4, A1, G0), Y ); + vec4 h5 = mul( mat4x3(H5, F4, B1, D0), Y ); + vec4 f4 = h5.yzwx; + + vec4 Ao = vec4( 1.0, -1.0, -1.0, 1.0 ); + vec4 Bo = vec4( 1.0, 1.0, -1.0,-1.0 ); + vec4 Co = vec4( 1.5, 0.5, -0.5, 0.5 ); + vec4 Ax = vec4( 1.0, -1.0, -1.0, 1.0 ); + vec4 Bx = vec4( 0.5, 2.0, -0.5,-2.0 ); + vec4 Cx = vec4( 1.0, 1.0, -0.5, 0.0 ); + vec4 Ay = vec4( 1.0, -1.0, -1.0, 1.0 ); + vec4 By = vec4( 2.0, 0.5, -2.0,-0.5 ); + vec4 Cy = vec4( 2.0, 0.0, -1.0, 0.5 ); + + // These inequations define the line below which interpolation occurs. + fx = vec4(greaterThan(Ao*fp.y+Bo*fp.x, Co)); + fx_l = vec4(greaterThan(Ax*fp.y+Bx*fp.x, Cx)); + fx_u = vec4(greaterThan(Ay*fp.y+By*fp.x, Cy)); + +#ifdef CORNER_A + irlv1 = diff(e,f) * diff(e,h); +#endif +#ifdef CORNER_B + irlv1 = (neq(f,b) * neq(h,d) + eq(e,i) * neq(f,i4) * neq(h,i5) + eq(e,g) + eq(e,c)); +#endif +#ifdef CORNER_D + vec4 c1 = i4.yzwx; + vec4 g0 = i5.wxyz; + irlv1 = (neq(f,b) * neq(h,d) + eq(e,i) * neq(f,i4) * neq(h,i5) + eq(e,g) + eq(e,c) ) * (diff(f,f4) * diff(f,i) + diff(h,h5) * diff(h,i) + diff(h,g) + diff(f,c) + eq(b,c1) * eq(d,g0)); +#endif +#ifdef CORNER_C + irlv1 = (neq(f,b) * neq(f,c) + neq(h,d) * neq(h,g) + eq(e,i) * (neq(f,f4) * neq(f,i4) + neq(h,h5) * neq(h,i5)) + eq(e,g) + eq(e,c)); +#endif + + irlv2l = diff(e,g) * diff(d,g); + irlv2u = diff(e,c) * diff(b,c); + + vec4 wd1 = wd( e, c, g, i, h5, f4, h, f); + vec4 wd2 = wd( h, d, i5, f, i4, b, e, i); + + edri = step(wd1, wd2) * irlv1; + edr = step(wd1 + vec4(0.1, 0.1, 0.1, 0.1), wd2) * step(vec4(0.5, 0.5, 0.5, 0.5), irlv1); + edr_l = step( lv2_cf*df(f,g), df(h,c) ) * irlv2l * edr; + edr_u = step( lv2_cf*df(h,c), df(f,g) ) * irlv2u * edr; + + nc = bvec4( edr * ( fx + edr_l * (fx_l)) + edr_u * fx_u); + + px = lessThanEqual(df(e, f), df(e, h)); + + vec3 res1 = nc.x ? px.x ? F : H : nc.y ? px.y ? B : F : nc.z ? px.z ? D : B : E; + vec3 res2 = nc.w ? px.w ? H : D : nc.z ? px.z ? D : B : nc.y ? px.y ? B : F : E; + + vec2 df12 = abs( mul( mat2x3(res1, res2), Y ) - e.xy); + + vec3 res = mix(res1, res2, step(df12.x, df12.y)); + + FragColor.xyz = res; +} +#endif diff --git a/Shaders/xbrz/xbrz-freescale.glsl b/Shaders/xbrz/xbrz-freescale.glsl new file mode 100644 index 0000000..3cc9edd --- /dev/null +++ b/Shaders/xbrz/xbrz-freescale.glsl @@ -0,0 +1,375 @@ +/* + Hyllian's xBR-vertex code and texel mapping + + Copyright (C) 2011/2016 Hyllian - sergiogdb@gmail.com + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + 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. + +*/ + +// This shader also uses code and/or concepts from xBRZ as it appears +// in the Desmume source code. The license for which is as follows: + +// **************************************************************************** +// * This file is part of the HqMAME project. It is distributed under * +// * GNU General Public License: http://www.gnu.org/licenses/gpl-3.0 * +// * Copyright (C) Zenju (zenju AT gmx DOT de) - All Rights Reserved * +// * * +// * Additionally and as a special exception, the author gives permission * +// * to link the code of this program with the MAME library (or with modified * +// * versions of MAME that use the same license as MAME), and distribute * +// * linked combinations including the two. You must obey the GNU General * +// * Public License in all respects for all of the code used other than MAME. * +// * If you modify this file, you may extend this exception to your version * +// * of the file, but you are not obligated to do so. If you do not wish to * +// * do so, delete this exception statement from your version. * +// **************************************************************************** + +#if defined(VERTEX) + +#if __VERSION__ >= 130 +#define COMPAT_VARYING out +#define COMPAT_ATTRIBUTE in +#define COMPAT_TEXTURE texture +#else +#define COMPAT_VARYING varying +#define COMPAT_ATTRIBUTE attribute +#define COMPAT_TEXTURE texture2D +#endif + +#ifdef GL_ES +#define COMPAT_PRECISION mediump +#else +#define COMPAT_PRECISION +#endif + +COMPAT_ATTRIBUTE vec4 VertexCoord; +COMPAT_ATTRIBUTE vec4 COLOR; +COMPAT_ATTRIBUTE vec4 TexCoord; +COMPAT_VARYING vec4 COL0; +COMPAT_VARYING vec4 TEX0; + +vec4 _oPosition1; +uniform mat4 MVPMatrix; +uniform COMPAT_PRECISION int FrameDirection; +uniform COMPAT_PRECISION int FrameCount; +uniform COMPAT_PRECISION vec2 OutputSize; +uniform COMPAT_PRECISION vec2 TextureSize; +uniform COMPAT_PRECISION vec2 InputSize; + +// compatibility #defines +#define vTexCoord TEX0.xy +#define SourceSize vec4(TextureSize, 1.0 / TextureSize) //either TextureSize or InputSize +#define OutSize vec4(OutputSize, 1.0 / OutputSize) + +#ifdef PARAMETER_UNIFORM +uniform COMPAT_PRECISION float WHATEVER; +#else +#define WHATEVER 0.0 +#endif + +void main() +{ + gl_Position = MVPMatrix * VertexCoord; + TEX0.xy = TexCoord.xy * 1.0001; +} + +#elif defined(FRAGMENT) + +#ifdef GL_ES +#ifdef GL_FRAGMENT_PRECISION_HIGH +precision highp float; +#else +precision mediump float; +#endif +#define COMPAT_PRECISION mediump +#else +#define COMPAT_PRECISION +#endif + +#if __VERSION__ >= 130 +#define COMPAT_VARYING in +#define COMPAT_TEXTURE texture +out COMPAT_PRECISION vec4 FragColor; +#else +#define COMPAT_VARYING varying +#define FragColor gl_FragColor +#define COMPAT_TEXTURE texture2D +#endif + +uniform COMPAT_PRECISION int FrameDirection; +uniform COMPAT_PRECISION int FrameCount; +uniform COMPAT_PRECISION vec2 OutputSize; +uniform COMPAT_PRECISION vec2 TextureSize; +uniform COMPAT_PRECISION vec2 InputSize; +uniform sampler2D Texture; +COMPAT_VARYING vec4 TEX0; + +// compatibility #defines +#define Source Texture +#define vTexCoord TEX0.xy + +#define SourceSize vec4(TextureSize, 1.0 / TextureSize) //either TextureSize or InputSize +#define OutSize vec4(OutputSize, 1.0 / OutputSize) + +#define BLEND_NONE 0 +#define BLEND_NORMAL 1 +#define BLEND_DOMINANT 2 +#define LUMINANCE_WEIGHT 1.0 +#define EQUAL_COLOR_TOLERANCE 30.0/255.0 +#define STEEP_DIRECTION_THRESHOLD 2.2 +#define DOMINANT_DIRECTION_THRESHOLD 3.6 + +float DistYCbCr(vec3 pixA, vec3 pixB) +{ + const vec3 w = vec3(0.2627, 0.6780, 0.0593); + const float scaleB = 0.5 / (1.0 - w.b); + const float scaleR = 0.5 / (1.0 - w.r); + vec3 diff = pixA - pixB; + float Y = dot(diff.rgb, w); + float Cb = scaleB * (diff.b - Y); + float Cr = scaleR * (diff.r - Y); + + return sqrt(((LUMINANCE_WEIGHT * Y) * (LUMINANCE_WEIGHT * Y)) + (Cb * Cb) + (Cr * Cr)); +} + +bool IsPixEqual(const vec3 pixA, const vec3 pixB) +{ + return (DistYCbCr(pixA, pixB) < EQUAL_COLOR_TOLERANCE); +} + +float get_left_ratio(vec2 center, vec2 origin, vec2 direction, vec2 scale) +{ + vec2 P0 = center - origin; + vec2 proj = direction * (dot(P0, direction) / dot(direction, direction)); + vec2 distv = P0 - proj; + vec2 orth = vec2(-direction.y, direction.x); + float side = sign(dot(P0, orth)); + float v = side * length(distv * scale); + +// return step(0, v); + return smoothstep(-sqrt(2.0)/2.0, sqrt(2.0)/2.0, v); +} + +#define eq(a,b) (a == b) +#define neq(a,b) (a != b) + +#define P(x,y) COMPAT_TEXTURE(Source, coord + SourceSize.zw * vec2(x, y)).rgb + +void main() +{ + //--------------------------------------- + // Input Pixel Mapping: -|x|x|x|- + // x|A|B|C|x + // x|D|E|F|x + // x|G|H|I|x + // -|x|x|x|- + + vec2 scale = OutputSize.xy * SourceSize.zw; + vec2 pos = fract(vTexCoord * SourceSize.xy) - vec2(0.5, 0.5); + vec2 coord = vTexCoord - pos * SourceSize.zw; + + vec3 A = P(-1.,-1.); + vec3 B = P( 0.,-1.); + vec3 C = P( 1.,-1.); + vec3 D = P(-1., 0.); + vec3 E = P( 0., 0.); + vec3 F = P( 1., 0.); + vec3 G = P(-1., 1.); + vec3 H = P( 0., 1.); + vec3 I = P( 1., 1.); + + // blendResult Mapping: x|y| + // w|z| + ivec4 blendResult = ivec4(BLEND_NONE,BLEND_NONE,BLEND_NONE,BLEND_NONE); + + // Preprocess corners + // Pixel Tap Mapping: -|-|-|-|- + // -|-|B|C|- + // -|D|E|F|x + // -|G|H|I|x + // -|-|x|x|- + if (!((eq(E,F) && eq(H,I)) || (eq(E,H) && eq(F,I)))) + { + float dist_H_F = DistYCbCr(G, E) + DistYCbCr(E, C) + DistYCbCr(P(0,2), I) + DistYCbCr(I, P(2.,0.)) + (4.0 * DistYCbCr(H, F)); + float dist_E_I = DistYCbCr(D, H) + DistYCbCr(H, P(1,2)) + DistYCbCr(B, F) + DistYCbCr(F, P(2.,1.)) + (4.0 * DistYCbCr(E, I)); + bool dominantGradient = (DOMINANT_DIRECTION_THRESHOLD * dist_H_F) < dist_E_I; + blendResult.z = ((dist_H_F < dist_E_I) && neq(E,F) && neq(E,H)) ? ((dominantGradient) ? BLEND_DOMINANT : BLEND_NORMAL) : BLEND_NONE; + } + + + // Pixel Tap Mapping: -|-|-|-|- + // -|A|B|-|- + // x|D|E|F|- + // x|G|H|I|- + // -|x|x|-|- + if (!((eq(D,E) && eq(G,H)) || (eq(D,G) && eq(E,H)))) + { + float dist_G_E = DistYCbCr(P(-2.,1.) , D) + DistYCbCr(D, B) + DistYCbCr(P(-1.,2.), H) + DistYCbCr(H, F) + (4.0 * DistYCbCr(G, E)); + float dist_D_H = DistYCbCr(P(-2.,0.) , G) + DistYCbCr(G, P(0.,2.)) + DistYCbCr(A, E) + DistYCbCr(E, I) + (4.0 * DistYCbCr(D, H)); + bool dominantGradient = (DOMINANT_DIRECTION_THRESHOLD * dist_D_H) < dist_G_E; + blendResult.w = ((dist_G_E > dist_D_H) && neq(E,D) && neq(E,H)) ? ((dominantGradient) ? BLEND_DOMINANT : BLEND_NORMAL) : BLEND_NONE; + } + + // Pixel Tap Mapping: -|-|x|x|- + // -|A|B|C|x + // -|D|E|F|x + // -|-|H|I|- + // -|-|-|-|- + if (!((eq(B,C) && eq(E,F)) || (eq(B,E) && eq(C,F)))) + { + float dist_E_C = DistYCbCr(D, B) + DistYCbCr(B, P(1.,-2.)) + DistYCbCr(H, F) + DistYCbCr(F, P(2.,-1.)) + (4.0 * DistYCbCr(E, C)); + float dist_B_F = DistYCbCr(A, E) + DistYCbCr(E, I) + DistYCbCr(P(0.,-2.), C) + DistYCbCr(C, P(2.,0.)) + (4.0 * DistYCbCr(B, F)); + bool dominantGradient = (DOMINANT_DIRECTION_THRESHOLD * dist_B_F) < dist_E_C; + blendResult.y = ((dist_E_C > dist_B_F) && neq(E,B) && neq(E,F)) ? ((dominantGradient) ? BLEND_DOMINANT : BLEND_NORMAL) : BLEND_NONE; + } + + // Pixel Tap Mapping: -|x|x|-|- + // x|A|B|C|- + // x|D|E|F|- + // -|G|H|-|- + // -|-|-|-|- + if (!((eq(A,B) && eq(D,E)) || (eq(A,D) && eq(B,E)))) + { + float dist_D_B = DistYCbCr(P(-2.,0.), A) + DistYCbCr(A, P(0.,-2.)) + DistYCbCr(G, E) + DistYCbCr(E, C) + (4.0 * DistYCbCr(D, B)); + float dist_A_E = DistYCbCr(P(-2.,-1.), D) + DistYCbCr(D, H) + DistYCbCr(P(-1.,-2.), B) + DistYCbCr(B, F) + (4.0 * DistYCbCr(A, E)); + bool dominantGradient = (DOMINANT_DIRECTION_THRESHOLD * dist_D_B) < dist_A_E; + blendResult.x = ((dist_D_B < dist_A_E) && neq(E,D) && neq(E,B)) ? ((dominantGradient) ? BLEND_DOMINANT : BLEND_NORMAL) : BLEND_NONE; + } + + vec3 res = E; + + // Pixel Tap Mapping: -|-|-|-|- + // -|-|B|C|- + // -|D|E|F|x + // -|G|H|I|x + // -|-|x|x|- + if(blendResult.z != BLEND_NONE) + { + float dist_F_G = DistYCbCr(F, G); + float dist_H_C = DistYCbCr(H, C); + bool doLineBlend = (blendResult.z == BLEND_DOMINANT || + !((blendResult.y != BLEND_NONE && !IsPixEqual(E, G)) || (blendResult.w != BLEND_NONE && !IsPixEqual(E, C)) || + (IsPixEqual(G, H) && IsPixEqual(H, I) && IsPixEqual(I, F) && IsPixEqual(F, C) && !IsPixEqual(E, I)))); + + vec2 origin = vec2(0.0, 1.0 / sqrt(2.0)); + vec2 direction = vec2(1.0, -1.0); + if(doLineBlend) + { + bool haveShallowLine = (STEEP_DIRECTION_THRESHOLD * dist_F_G <= dist_H_C) && neq(E,G) && neq(D,G); + bool haveSteepLine = (STEEP_DIRECTION_THRESHOLD * dist_H_C <= dist_F_G) && neq(E,C) && neq(B,C); + origin = haveShallowLine? vec2(0.0, 0.25) : vec2(0.0, 0.5); + direction.x += haveShallowLine? 1.0: 0.0; + direction.y -= haveSteepLine? 1.0: 0.0; + } + + vec3 blendPix = mix(H,F, step(DistYCbCr(E, F), DistYCbCr(E, H))); + res = mix(res, blendPix, get_left_ratio(pos, origin, direction, scale)); + } + + // Pixel Tap Mapping: -|-|-|-|- + // -|A|B|-|- + // x|D|E|F|- + // x|G|H|I|- + // -|x|x|-|- + if(blendResult.w != BLEND_NONE) + { + float dist_H_A = DistYCbCr(H, A); + float dist_D_I = DistYCbCr(D, I); + bool doLineBlend = (blendResult.w == BLEND_DOMINANT || + !((blendResult.z != BLEND_NONE && !IsPixEqual(E, A)) || (blendResult.x != BLEND_NONE && !IsPixEqual(E, I)) || + (IsPixEqual(A, D) && IsPixEqual(D, G) && IsPixEqual(G, H) && IsPixEqual(H, I) && !IsPixEqual(E, G)))); + + vec2 origin = vec2(-1.0 / sqrt(2.0), 0.0); + vec2 direction = vec2(1.0, 1.0); + if(doLineBlend) + { + bool haveShallowLine = (STEEP_DIRECTION_THRESHOLD * dist_H_A <= dist_D_I) && neq(E,A) && neq(B,A); + bool haveSteepLine = (STEEP_DIRECTION_THRESHOLD * dist_D_I <= dist_H_A) && neq(E,I) && neq(F,I); + origin = haveShallowLine? vec2(-0.25, 0.0) : vec2(-0.5, 0.0); + direction.y += haveShallowLine? 1.0: 0.0; + direction.x += haveSteepLine? 1.0: 0.0; + } + origin = origin; + direction = direction; + + vec3 blendPix = mix(H,D, step(DistYCbCr(E, D), DistYCbCr(E, H))); + res = mix(res, blendPix, get_left_ratio(pos, origin, direction, scale)); + } + + // Pixel Tap Mapping: -|-|x|x|- + // -|A|B|C|x + // -|D|E|F|x + // -|-|H|I|- + // -|-|-|-|- + if(blendResult.y != BLEND_NONE) + { + float dist_B_I = DistYCbCr(B, I); + float dist_F_A = DistYCbCr(F, A); + bool doLineBlend = (blendResult.y == BLEND_DOMINANT || + !((blendResult.x != BLEND_NONE && !IsPixEqual(E, I)) || (blendResult.z != BLEND_NONE && !IsPixEqual(E, A)) || + (IsPixEqual(I, F) && IsPixEqual(F, C) && IsPixEqual(C, B) && IsPixEqual(B, A) && !IsPixEqual(E, C)))); + + vec2 origin = vec2(1.0 / sqrt(2.0), 0.0); + vec2 direction = vec2(-1.0, -1.0); + + if(doLineBlend) + { + bool haveShallowLine = (STEEP_DIRECTION_THRESHOLD * dist_B_I <= dist_F_A) && neq(E,I) && neq(H,I); + bool haveSteepLine = (STEEP_DIRECTION_THRESHOLD * dist_F_A <= dist_B_I) && neq(E,A) && neq(D,A); + origin = haveShallowLine? vec2(0.25, 0.0) : vec2(0.5, 0.0); + direction.y -= haveShallowLine? 1.0: 0.0; + direction.x -= haveSteepLine? 1.0: 0.0; + } + + vec3 blendPix = mix(F,B, step(DistYCbCr(E, B), DistYCbCr(E, F))); + res = mix(res, blendPix, get_left_ratio(pos, origin, direction, scale)); + } + + // Pixel Tap Mapping: -|x|x|-|- + // x|A|B|C|- + // x|D|E|F|- + // -|G|H|-|- + // -|-|-|-|- + if(blendResult.x != BLEND_NONE) + { + float dist_D_C = DistYCbCr(D, C); + float dist_B_G = DistYCbCr(B, G); + bool doLineBlend = (blendResult.x == BLEND_DOMINANT || + !((blendResult.w != BLEND_NONE && !IsPixEqual(E, C)) || (blendResult.y != BLEND_NONE && !IsPixEqual(E, G)) || + (IsPixEqual(C, B) && IsPixEqual(B, A) && IsPixEqual(A, D) && IsPixEqual(D, G) && !IsPixEqual(E, A)))); + + vec2 origin = vec2(0.0, -1.0 / sqrt(2.0)); + vec2 direction = vec2(-1.0, 1.0); + if(doLineBlend) + { + bool haveShallowLine = (STEEP_DIRECTION_THRESHOLD * dist_D_C <= dist_B_G) && neq(E,C) && neq(F,C); + bool haveSteepLine = (STEEP_DIRECTION_THRESHOLD * dist_B_G <= dist_D_C) && neq(E,G) && neq(H,G); + origin = haveShallowLine? vec2(0.0, -0.25) : vec2(0.0, -0.5); + direction.x -= haveShallowLine? 1.0: 0.0; + direction.y += haveSteepLine? 1.0: 0.0; + } + + vec3 blendPix = mix(D,B, step(DistYCbCr(E, B), DistYCbCr(E, D))); + res = mix(res, blendPix, get_left_ratio(pos, origin, direction, scale)); + } + + FragColor = vec4(res, 1.0); +} +#endif diff --git a/TADEMO.UFO b/TADEMO.UFO deleted file mode 100644 index 50df617..0000000 --- a/TADEMO.UFO +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:dece463378c754c039a3f28061dc975b6af70e00a2fc8a2d8506cf1848fb3203 -size 143151 diff --git a/TADemo/SERVER_OTA.EXE b/TADemo/SERVER_OTA.EXE new file mode 100644 index 0000000..c29b158 --- /dev/null +++ b/TADemo/SERVER_OTA.EXE @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3c1e2c44d02e60844ffa134a9e9ea07970622dc56f537c14c53dfda64d940823 +size 574976 diff --git a/TADemo/unitid.txt b/TADemo/unitid.txt new file mode 100644 index 0000000..392f7ae --- /dev/null +++ b/TADemo/unitid.txt @@ -0,0 +1,99 @@ +; +; TA Demo Recoder 0.90ß. +; +; This file describes different groups of units. +; You can therefore add 3rd party units etc to this list if you feel like. +; +; The hex-number is the same number that is saved in a unit restrictions file. Don't know +; how that is related to the unit, or if it can be found in the unit's file somewhere. So if +; you know, feel free to enlighten me. +; +; If you add stuff to the file, you could always send it to me so that future releases of TA Demo can +; recognize what 3rd-party units was used. (If there should happen to be a nice easy way to get the unit +; names from those id numbers, this file might become obsolete) +; +; Edited by Fnordia 990220 +; 991027 +; 000219 +; 010318 +; +; +; Syntax: (very simple) +; +; = +; +; +; <...> +; +; = +; +; etc.. +; +; update: only units in one of the +-groups will show. with the group furthest down takes presedence. +; however, the units before the first +-group will be tested for all groups + +; I just added one unit to CC cuz I'm lazy. Btw, it's inclusive, so if any unit in the groups list were +; enabled in the game, this group's name will be listed under used units. + +=BAI +6da73737 + +=Queller +; albatross +62cc5579 + +=Counterstrike +; fluxor +9a34465c + ++regular ta +=Core Contingency + +; it's the nixter btw. :) +848ebee6 + +=ARM Flea +371d264a + +=ARM Scarab +6b81b8be + +=CORE Hedgehog +763476f4 + +=CORE Immolator +3fcf5935 + +=ARM Fast Attack-Repair Kbot +d6d867f3 + +=CORE Necro +f4c81832 + ++uberhack 1.0 +=UberHack 1.0 TAEC +; The anemone +b9f36d39 + ++uberhack 1.1 +=Uberhack 1.1 +; the gimp +16b40f07 + +=TAEC units +; the thumper hehe +a89cec32 + ++uberhack 3.0 +=Uberhack 3.0 +;centurion +3b978743 + ++xta 0.8 +=XTA 0.8 +f804eafe + ++xta betas +=XTA pre1.0 +; fortwall +6d197dcf \ No newline at end of file diff --git a/TotalA.exe b/TotalA.exe index 66aece6..af953b9 100755 --- a/TotalA.exe +++ b/TotalA.exe @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:dbf8c705abc4a90cbdfb0b6c7098e3882e1543fd854404a8bea0f340715b27b1 +oid sha256:3b9c0fadabf3dc67ed5f05a70f1e1505a0c65deadd1a3c930adfe30e2a84995e size 1178624 diff --git a/audiere.dll b/audiere.dll new file mode 100644 index 0000000..c72ed77 --- /dev/null +++ b/audiere.dll @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:90e59c4f60941a2838d46e20fb78ba0cf71e9cfd0782e291ca876645e3794a66 +size 512000 diff --git a/bass.dll b/bass.dll new file mode 100644 index 0000000..cb33ffa --- /dev/null +++ b/bass.dll @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6e1bf8ea63f9923687709f4e2f0dac7ff558b2ab923e8c8aa147384746e05b1d +size 139128 diff --git a/basscd.dll b/basscd.dll new file mode 100644 index 0000000..6b5c44e --- /dev/null +++ b/basscd.dll @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:be21262fa29851b8406520dc2a3ec4b6fd55d278087c1a237c0a8c8397e002c7 +size 26776 diff --git a/bassflac.dll b/bassflac.dll new file mode 100644 index 0000000..52002f7 --- /dev/null +++ b/bassflac.dll @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4f794959bab15dac55e389de358a3f2abfcc5a3556740a5af9dc4c771281e40c +size 39232 diff --git a/bassmix.dll b/bassmix.dll new file mode 100644 index 0000000..df14384 --- /dev/null +++ b/bassmix.dll @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:cff3edc109bc0d186ba8ddf60bc99e48ff3467771e741c7168adbdbe03379506 +size 32080 diff --git a/basswasapi.dll b/basswasapi.dll new file mode 100644 index 0000000..1e31fd4 --- /dev/null +++ b/basswasapi.dll @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:79dcfad6dec9ac93faac81aacdcb7167dad38a55388bc58b2c48982545f0cca4 +size 22000 diff --git a/cnc-ddraw config.exe b/cnc-ddraw config.exe new file mode 100644 index 0000000..29401b1 --- /dev/null +++ b/cnc-ddraw config.exe @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ac706afd1807feafca1ae2ceca718013db5148e66e0c2328879aa6ec3b0b9fc2 +size 4622336 diff --git a/ddraw.dll b/ddraw.dll new file mode 100644 index 0000000..d674d53 --- /dev/null +++ b/ddraw.dll @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f71bf13e02503f08b1604cfe8b906656417435586188c9b5f1865f55749dd639 +size 361984 diff --git a/ddraw.ini b/ddraw.ini new file mode 100644 index 0000000..ba108c2 --- /dev/null +++ b/ddraw.ini @@ -0,0 +1,906 @@ +; cnc-ddraw - https://github.com/FunkyFr3sh/cnc-ddraw + +[ddraw] +; ### Optional settings ### +; Use the following settings to adjust the look and feel to your liking + + +; Stretch to custom resolution, 0 = defaults to the size game requests +width=0 +height=0 + +; Override the width/height settings shown above and always stretch to fullscreen +; Note: Can be combined with 'windowed=true' to get windowed-fullscreen aka borderless mode +fullscreen=true + +; Run in windowed mode rather than going fullscreen +windowed=true + +; Maintain aspect ratio +maintas=false + +; Windowboxing / Integer Scaling +boxing=false + +; Real rendering rate, -1 = screen rate, 0 = unlimited, n = cap +; Note: Does not have an impact on the game speed, to limit your game speed use 'maxgameticks=' +maxfps=-1 + +; Vertical synchronization, enable if you get tearing - (Requires 'renderer=auto/opengl*/direct3d9*') +; Note: vsync=true can fix tearing but it will cause input lag +vsync=false + +; Automatic mouse sensitivity scaling +; Note: Only works if stretching is enabled. Sensitivity will be adjusted according to the size of the window +adjmouse=false + +; Preliminary libretro shader support - (Requires 'renderer=opengl*') https://github.com/libretro/glsl-shaders +; 2x scaling example: https://imgur.com/a/kxsM1oY - 4x scaling example: https://imgur.com/a/wjrhpFV +; You can specify a full path to a .glsl shader file here or use one of the values listed below +; Possible values: Nearest neighbor, Bilinear, Bicubic, Lanczos, xBR-lv2 +shader=Shaders\interpolation\catmull-rom-bilinear.glsl + +; Window position, -32000 = center to screen +posX=-32000 +posY=-32000 + +; Renderer, possible values: auto, opengl, openglcore, gdi, direct3d9, direct3d9on12 (auto = try direct3d9/opengl, fallback = gdi) +renderer=opengl + +; Developer mode (don't lock the cursor) +devmode=false + +; Show window borders in windowed mode +border=true + +; Save window position/size/state on game exit and restore it automatically on next game start +; Possible values: 0 = disabled, 1 = save to global 'ddraw' section, 2 = save to game specific section +savesettings=1 + +; Should the window be resizable by the user in windowed mode? +resizable=true + +; Upscaling filter for the direct3d9* renderers +; Possible values: 0 = nearest-neighbor, 1 = bilinear, 2 = bicubic, 3 = lanczos (bicubic/lanczos only support 16/32bit color depth games) +d3d9_filter=2 + +; Enable upscale hack for high resolution patches (Supports C&C1, Red Alert 1 and KKND Xtreme) +vhack=false + +; Where should screenshots be saved +screenshotdir=.\Screenshots\ + +; Switch between windowed/borderless modes with alt+enter rather than windowed/fullscreen modes +toggle_borderless=true + +; Switch between windowed/fullscreen upscaled modes with alt+enter rather than windowed/fullscreen modes +toggle_upscaled=false + + + +; ### Compatibility settings ### +; Use the following settings in case there are any issues with the game + + +; Hide WM_ACTIVATEAPP and WM_NCACTIVATE messages to prevent problems on alt+tab +noactivateapp=false + +; Max game ticks per second, possible values: -1 = disabled, -2 = refresh rate, 0 = emulate 60hz vblank, 1-1000 = custom game speed +; Note: Can be used to slow down a too fast running game, fix flickering or too fast animations +; Note: Usually one of the following values will work: 60 / 30 / 25 / 20 / 15 (lower value = slower game speed) +maxgameticks=-1 + +; Force minimum FPS, possible values: 0 = disabled, -1 = use 'maxfps=' value, -2 = same as -1 but force full redraw, 1-1000 = custom FPS +; Note: Set this to a low value such as 5 or 10 if some parts of the game are not being displayed (e.g. menus or loading screens) +minfps=0 + +; Disable fullscreen-exclusive mode for the direct3d9*/opengl* renderers +; Note: Can be used in case some GUI elements like buttons/textboxes/videos/etc.. are invisible +nonexclusive=false + +; Force CPU0 affinity, avoids crashes/freezing, *might* have a performance impact +; Note: Disable this if the game is not running smooth or there are sound issues +singlecpu=false + +; Available resolutions, possible values: 0 = Small list, 1 = Very small list, 2 = Full list +; Note: Set this to 2 if your chosen resolution is not working or does not show up in the list +; Note: Set this to 1 if the game is crashing on startup +resolutions=0 + +; Child window handling, possible values: 0 = Disabled, 1 = Display top left, 2 = Display top left + repaint, 3 = Hide +; Note: Disables upscaling if a child window was detected (to ensure the game is fully playable, may look weird though) +fixchilds=2 + +; Enable one of the following settings if your cursor doesn't work properly when upscaling is enabled +hook_peekmessage=false +hook_getmessage=false + + +; Undocumented settings - You may or may not change these (You should rather focus on the settings above) +releasealt=false +game_handles_close=true +fixnotresponding=false +hook=4 +guard_lines=200 +max_resolutions=32 +limit_bltfast=false +lock_surfaces=false +allow_wmactivate=false +flipclear=false +fixmousehook=false +rgb555=false +no_dinput_hook=false +refresh_rate=0 +anti_aliased_fonts_min_size=13 +custom_width=0 +custom_height=0 +min_font_size=0 +direct3d_passthrough=false + + + +; ### Hotkeys ### +; Use the following settings to configure your hotkeys, 0x00 = disabled +; Virtual-Key Codes: https://docs.microsoft.com/en-us/windows/win32/inputdev/virtual-key-codes + + +; Switch between windowed and fullscreen mode = [Alt] + ??? +keytogglefullscreen=0x0D + +; Maximize window = [Alt] + ??? +keytogglemaximize=0x22 + +; Unlock cursor 1 = [Ctrl] + ??? +keyunlockcursor1=0x09 + +; Unlock cursor 2 = [Right Alt] + ??? +keyunlockcursor2=0xA3 + +; Screenshot +keyscreenshot=0x2C + + + +; ### Config program settings ### +; The following settings are for cnc-ddraw config.exe + + +; cnc-ddraw config program language, possible values: auto, english, chinese, german, spanish, russian, hungarian, french, italian +configlang=auto + +; cnc-ddraw config program theme, possible values: Windows10, Cobalt XEMedia +configtheme=Cobalt XEMedia + +; Hide the 'Compatibility Settings' tab in cnc-ddraw config +hide_compat_tab=false + +; Allow the users to 'Restore default settings' via cnc-ddraw config +allow_reset=false + + + +; ### Game specific settings ### +; The following settings override all settings shown above, section name = executable name + + +; Atrox +[Atrox] +fixchilds=0 +allow_wmactivate=true + +; Atomic Bomberman +[BM] +maxgameticks=60 + +; Age of Empires +[empires] +nonexclusive=true +adjmouse=true +resolutions=2 + +; Age of Empires: The Rise of Rome +[empiresx] +nonexclusive=true +adjmouse=true +resolutions=2 + +; Age of Empires II +[EMPIRES2] +nonexclusive=true +adjmouse=true + +; Age of Empires II: The Conquerors +[age2_x1] +nonexclusive=true +adjmouse=true + +; American Conquest / Cossacks +[DMCR] +resolutions=2 +guard_lines=300 +minfps=-2 + +; Age of Wonders 2 +[AoW2] +resolutions=2 +renderer=opengl +singlecpu=false + +; Age of Wonders 2 +[AoW2Compat] +resolutions=2 +renderer=opengl +singlecpu=false + +; Age of Wonders 2 Config Tool +[aow2Setup] +resolutions=2 + +; Age of Wonders: Shadow Magic +[AoWSM] +resolutions=2 +renderer=opengl +singlecpu=false + +; Age of Wonders: Shadow Magic +[AoWSMCompat] +resolutions=2 +renderer=opengl +singlecpu=false + +; Age of Wonders: Shadow Magic Config Tool +[AoWSMSetup] +resolutions=2 + +; Anstoss 3 +[anstoss3] +renderer=gdi +adjmouse=true + +; Anno 1602 +[1602] +adjmouse=true + +; Alien Nations +[AN] +adjmouse=true + +; Atlantis +[ATLANTIS] +renderer=opengl +maxgameticks=60 + +; Airline Tycoon Deluxe +[AT] +fixchilds=0 + +; Baldur's Gate II +; Note: 'Use 3D Acceleration' must be disabled and 'Full Screen' must be enabled in BGConfig.exe +[BGMain] +resolutions=2 + +; BALDR FORCE EXE +[BaldrForce] +noactivateapp=true + +; Blade & Sword +[comeon] +maxgameticks=60 +fixchilds=3 + +; Blood II - The Chosen / Shogo - Mobile Armor Division +[Client] +checkfile=.\SOUND.REZ +noactivateapp=true + +; Carmageddon +[CARMA95] +noactivateapp=true +flipclear=true + +; Carmageddon +[CARM95] +noactivateapp=true +flipclear=true + +; Carmageddon 2 +[Carma2_SW] +noactivateapp=true + +; Captain Claw +[claw] +adjmouse=true +noactivateapp=true +nonexclusive=true + +; Command & Conquer: Sole Survivor +[SOLE] +maxgameticks=120 +maxfps=60 +minfps=-1 + +; Command & Conquer Gold - CnCNet +[cnc95] +maxfps=125 + +; Command & Conquer Gold +[C&C95] +maxgameticks=120 +maxfps=60 +minfps=-1 + +; Command & Conquer: Red Alert - CnCNet +[ra95-spawn] +maxfps=125 + +; Command & Conquer: Red Alert +[ra95] +maxgameticks=120 +maxfps=60 +minfps=-1 + +; Command & Conquer: Red Alert +[ra95_Mod-Launcher] +maxgameticks=120 +maxfps=60 +minfps=-1 + +; Command & Conquer: Red Alert +[ra95p] +maxfps=60 +minfps=-1 + +; Command & Conquer: Tiberian Sun / Command & Conquer: Red Alert 2 +[game] +checkfile=.\blowfish.dll +tshack=true +noactivateapp=true +adjmouse=true +maxfps=60 +minfps=-1 +maintas=false +boxing=false + +; Command & Conquer: Tiberian Sun Demo +[SUN] +noactivateapp=true +tshack=true +adjmouse=true +maxfps=60 +minfps=-1 +maintas=false +boxing=false + +; Command & Conquer: Tiberian Sun - CnCNet +[ts-spawn] +noactivateapp=true +tshack=true +adjmouse=true +maxfps=60 +minfps=-1 +maintas=false +boxing=false + +; Command & Conquer: Red Alert 2 - XWIS +[ra2] +noactivateapp=true +tshack=true +maxfps=60 +minfps=-1 +maintas=false +boxing=false + +; Command & Conquer: Red Alert 2 - XWIS +[Red Alert 2] +noactivateapp=true +tshack=true +maxfps=60 +minfps=-1 +maintas=false +boxing=false + +; Command & Conquer: Red Alert 2: Yuri's Revenge +[gamemd] +noactivateapp=true +tshack=true +maxfps=60 +minfps=-1 +maintas=false +boxing=false + +; Command & Conquer: Red Alert 2: Yuri's Revenge - ?ModExe? +[ra2md] +noactivateapp=true +tshack=true +maxfps=60 +minfps=-1 +maintas=false +boxing=false + +; Command & Conquer: Red Alert 2: Yuri's Revenge - CnCNet +[gamemd-spawn] +noactivateapp=true +tshack=true +maxfps=60 +minfps=-1 +maintas=false +boxing=false + +; Command & Conquer: Red Alert 2: Yuri's Revenge - XWIS +[Yuri's Revenge] +noactivateapp=true +tshack=true +maxfps=60 +minfps=-1 +maintas=false +boxing=false + +; Commandos +[comandos] +maxgameticks=-1 + +; Commandos +[comandos_w10] +maxgameticks=-1 + +; Caesar III +[c3] +nonexclusive=true +adjmouse=true + +; Chris Sawyer's Locomotion +[LOCO] +adjmouse=true + +; Cultures 2 +[Cultures2] +adjmouse=true + +; Cultures 2 MP +[Cultures2MP] +adjmouse=true + +; Close Combat 2: A Bridge Too Far +[cc2] +adjmouse=true +nonexclusive=true + +; Close Combat 3: The Russian Front +[cc3] +adjmouse=true +nonexclusive=true + +; Close Combat 4: The Battle of the Bulge +[cc4] +adjmouse=true +nonexclusive=true + +; Close Combat 5: Invasion: Normandy +[cc5] +adjmouse=true +nonexclusive=true + +; Call To Power 2 +[ctp2] +maintas=false +boxing=false + +; Corsairs Gold +[corsairs] +adjmouse=true + +; Divine Divinity +[div] +resolutions=2 +singlecpu=false + +; Dragon Throne: Battle of Red Cliffs +[AdSanguo] +maxgameticks=60 +noactivateapp=true +limit_bltfast=true + +; Dark Reign: The Future of War +[DKReign] +maxgameticks=60 + +; Dungeon Keeper 2 +[DKII] +maxgameticks=60 +noactivateapp=true + +; Deadlock 2 +[DEADLOCK] +fixchilds=0 +adjmouse=false +maintas=false +boxing=false + +; Diablo +[Diablo] +devmode=true + +; Diablo: Hellfire +[hellfire] +devmode=true + +; Escape Velocity Nova +[EV Nova] +nonexclusive=true +hook_peekmessage=true +rgb555=true +keytogglefullscreen=0x46 +adjmouse=true + +; Economic War +[EcoW] +maxgameticks=60 +fixnotresponding=true + +; Enemy Infestation +[EI] +hook_getmessage=true + +; Fairy Tale About Father Frost, Ivan and Nastya +[mrazik] +guard_lines=0 + +; Future Cop - L.A.P.D. +[FCopLAPD] +nonexclusive=true +adjmouse=true + +; G-Police +[GPOLICE] +maxgameticks=60 + +; Gangsters: Organized Crime +[gangsters] +adjmouse=true +nonexclusive=true + +; Grand Theft Auto +[Grand Theft Auto] +singlecpu=false + +; Grand Theft Auto: London 1969 +[gta_uk] +singlecpu=false + +; Grand Theft Auto: London 1961 +[Gta_61] +singlecpu=false + +; Gruntz +[GRUNTZ] +adjmouse=true +noactivateapp=true +nonexclusive=true + +; Heroes of Might and Magic II: The Succession Wars +[HEROES2W] +adjmouse=true + +; Heroes of Might and Magic III +[Heroes3] +game_handles_close=true + +; Heroes of Might and Magic III HD Mod +[Heroes3 HD] +game_handles_close=true + +; Hard Truck: Road to Victory +[htruck] +maxgameticks=25 +renderer=opengl +noactivateapp=true + +; Icewind Dale 2 +; Note: 'Full Screen' must be enabled in Config.exe +; Note: 1070x602 is the lowest possible 16:9 resolution for the Widescreen patch (600/601 height will crash) +[iwd2] +resolutions=2 +custom_width=1070 +custom_height=602 + +; Invictus +[Invictus] +adjmouse=true +renderer=opengl + +; Interstate 76 +[i76] +adjmouse=true + +; Infantry Online +[infantry] +devmode=true +resolutions=2 +infantryhack=true +max_resolutions=90 + +; Jagged Alliance 2 +[ja2] +singlecpu=false +fixmousehook=true +noactivateapp=true +releasealt=true + +; Jagged Alliance 2: Unfinished Business +[JA2UB] +singlecpu=false +fixmousehook=true +noactivateapp=true +releasealt=true + +; Jagged Alliance 2: Wildfire +[WF6] +singlecpu=false +fixmousehook=true +noactivateapp=true +releasealt=true + +; Jagged Alliance 2 - UC mod +[JA2_UC] +singlecpu=false +fixmousehook=true +noactivateapp=true +releasealt=true + +; Jagged Alliance 2 - Vengeance Reloaded mod +[JA2_Vengeance] +singlecpu=false +fixmousehook=true +noactivateapp=true +releasealt=true + +; Jedi Knight Dark Forces 2 +[JK] +direct3d_passthrough=true + +; Kings Quest 8 +[Mask] +renderer=opengl + +; Konung +[konung] +fixchilds=0 + +; Konung 2 +[Konung2] +fixchilds=0 + +; KKND Xtreme (With high resolution patch) +[KKNDgame] +vhack=true + +; KKND2: Krossfire +[KKND2] +noactivateapp=true + +; Lionheart +[Lionheart] +hook_peekmessage=true + +; Majesty Gold +[Majesty] +minfps=-2 + +; Majesty Gold HD +[MajestyHD] +adjmouse=true + +; Majesty Gold HD +[MajestyHD - Old] +adjmouse=true + +; Mech Warrior 3 +[Mech3] +nonexclusive=true + +; Moorhuhn 2 +[Moorhuhn2] +releasealt=true + +; New Robinson +[ROBY] +adjmouse=true +hook_peekmessage=true + +; Nox +[NOX] +checkfile=.\NOX.ICD +renderer=direct3d9 +nonexclusive=false +windowed=false +maxgameticks=125 + +; Nox Reloaded +[NoxReloaded] +maxgameticks=125 + +; Nox GOG +[Game/2] +checkfile=.\nox.cfg +maxgameticks=125 + +; Outlaws +[olwin] +noactivateapp=true +maxgameticks=60 +adjmouse=true +renderer=gdi + +; Pharaoh +[Pharaoh] +adjmouse=true + +; Pax Imperia +[Pax Imperia] +nonexclusive=true + +; Railroad Tycoon II +[RT2] +adjmouse=true + +; ROAD RASH +[RoadRash] +adjmouse=true +fixchilds=1 + +; Sim Copter +[SimCopter] +nonexclusive=true + +; Settlers 3 +[s3] +nonexclusive=true + +; Star Trek - Armada +[Armada] +armadahack=true +nonexclusive=true +adjmouse=true +maintas=false +boxing=false + +; Star Wars: Galactic Battlegrounds +[battlegrounds] +nonexclusive=true +adjmouse=true + +; Star Wars: Galactic Battlegrounds: Clone Campaigns +[battlegrounds_x1] +nonexclusive=true +adjmouse=true + +; Starcraft +[StarCraft] +game_handles_close=true + +; Space Rangers +[Rangers] +hook_peekmessage=true + +; Stronghold Crusader HD +[Stronghold Crusader] +resolutions=2 +stronghold_hack=true +adjmouse=true + +; Stronghold Crusader Extreme HD +[Stronghold_Crusader_Extreme] +resolutions=2 +stronghold_hack=true +adjmouse=true + +; Stronghold HD +[Stronghold] +resolutions=2 +stronghold_hack=true +adjmouse=true + +; Sim City 3000 +[SC3] +minfps=-2 + +; Shadow Watch +[sw] +adjmouse=true + +; Shadow Flare +[ShadowFlare] +nonexclusive=true +adjmouse=true +maintas=false +boxing=false + +; Total Annihilation (Unofficial Beta Patch v3.9.02) +[TotalA] +max_resolutions=32 +lock_surfaces=true +singlecpu=false + +; Total Annihilation Replay Viewer (Unofficial Beta Patch v3.9.02) +[Viewer] +max_resolutions=32 +lock_surfaces=true +singlecpu=false + +; Total Annihilation: Kingdoms +[Kingdoms] +game_handles_close=true +max_resolutions=32 + +; Three Kingdoms: Fate of the Dragon +[sanguo] +maxgameticks=60 +noactivateapp=true +limit_bltfast=true + +; RollerCoaster Tycoon +[rct] +no_dinput_hook=true +singlecpu=false +maxfps=0 +adjmouse=true + +; Twisted Metal +[TWISTED] +nonexclusive=true +maxgameticks=25 +minfps=5 + +; Twisted Metal 2 +[Tm2] +nonexclusive=true +maxgameticks=60 +adjmouse=true +fixchilds=1 +maintas=false +boxing=false + +; Tzar: The Burden of the Crown +; Note: Must set 'DIRECTXDEVICE=0' in 'Tzar.ini' +[Tzar] +adjmouse=true + +; Uprising +[uprising] +adjmouse=true + +; Uprising 2 +[Uprising 2] +renderer=opengl +adjmouse=true + +; Vermeer +[vermeer] +adjmouse=true +vermeer_hack=true + +; Wizardry 8 +[Wiz8] +fixmousehook=true +noactivateapp=true +releasealt=true + +; Worms 2 +[worms2] +game_handles_close=true + +; Worms Armageddon +[WA] +adjmouse=true +width=0 +height=0 +resizable=false + +; War Wind +[WW] +minfps=-1 + +; Zeus and Poseidon +[Zeus] +adjmouse=true + diff --git a/dplayx.dll b/dplayx.dll new file mode 100644 index 0000000..adb74d9 --- /dev/null +++ b/dplayx.dll @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:dbb798ca31e87c54ae1dc053812842ea111fa2a383c5eb2db9196443b662ab55 +size 143360 diff --git a/tdraw.dll b/tdraw.dll new file mode 100644 index 0000000..a729e7d --- /dev/null +++ b/tdraw.dll @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:af7c191e684cc313813bc9b559027d514c7db82c11c95c514e9cd9896f154c47 +size 721408 diff --git a/tdraw.txt b/tdraw.txt new file mode 100644 index 0000000..7c5dbd7 --- /dev/null +++ b/tdraw.txt @@ -0,0 +1,326 @@ +WHAT IS THIS + +tdraw.dll is an upgrade for Total Annihilation. It patches the game to fix many bugs and add many features. +It is an integral component of the TA Community Patch, the other parts being tplayx.dll (the recorder) and server.exe (the replayer). + +tdraw.dll has a long provenance dating back to the work of SY_Yeha, who introduced whiteboard markers and the TA Hook and new hotkeys to TA. +Later work by Xpoy extended hotkey support, added new shortcut commands, uni-code font support, megamap, weapon-id crack (not present in current release) and porting music patch from GOG version, +and later support was provided by Rime. + +The present release includes contributions from Axle and FunkyFresh, and owes a debt to TAG_Venom for extensive testing and critical feeback, and to Gamma and Wotan for further testing and feature suggestions. + + +CONFIGURATIONS + +The release .zip files are annotated with a build configuration tag: "tdraw-.zip". The various configurations are: + * tdraw-full.zip: all features enabled + * tdraw-escalation.zip: built for TA:Escalation. disables the following features + - mex snap + - that is all + * tdraw-minimal.zip: disables the following features + - mex/wreck snap + - options for construction units to stay put when guarding + - options for construction units to only reclaim or onlt assist while patrolling + - auto kickout construction units that are blocking another builder + - weather report at top of screen + - sync wind speed between players + - map DT's always visible. + + +INSTALLATION + +Drop tdraw.dll into your TA directory. +Ensure the following files are also present in your TA directory: +- ddraw.dll (available from https://github.com/FunkyFr3sh/cnc-ddraw) +- totala.ini + +You may need to rename totala.ini and tdraw.dll to whatever your mod is using. See below for reference. For other mods, please consult with the mod maintainers. + + ini file dll file +Beta patch 3.9.02 TA.ini tdraw.dll +Escalation 9.9.6 TAESC.ini taesc.dll +Mayhem 10.9.2 Settings.ini mdraw.dll +ProTA 4.6 ProTA.ini tdraw.dll +Zero Alpha5-060322 tazero.ini zdraw.dll + + +NEW FEATURES IN BRIEF: + +*2026.02.17 - Fix false trigger on version check +*2026.02.10 - Minor adjustment to diagnostic crash detection ("ERROR: dstRect out of bounds", allow CopyScreenContext all the way to the edge of destination context) +*2026.02.07 - Disable AUTOTEAM, RANDOMTEAM and CRCREPORT buttons for non-host players +*2026.02.05 - Add support for AUTOTEAM, RANDOMTEAM and CRCREPORT buttons in battleroom (guis/lounge2.gui) +*2026.02.02 - Custom ctrl-f2 menu skin for escalation +*2026.01.29 - Create seperate builds for full-featured (tdraw-full.zip), escalation (tdraw-escalation.zip), and minimal (tdraw-minimal.zip) feature sets. +*2025.12.13 - Add diagnostics for crash at 004cbed5 +*2025.12.6 - Fix crash when game installed in a long path (eg C:\Program Files (x86)\Steam\steamapps\common\Total Annihilation\PROTA) +*2025.11.26 - New keys for unit definitions (units/*.fbi) to customise per-unit veterancy +*2025.08.29 - Bugfix for multithreaded version/cheat check +*2025.08.19 - Auto kickout of units under build order is now strictly only for own units (previously allowed kickout anyone's units if cheats enabled) +*2025.08.01 - Set build square preview to yellow if user can build there but it contains a unit that will be kicked out + +*2025.07.12 +- Allow user to queue build orders underneath their own mobile units; and auto kickout of units that are under a build order +- Mod developers can opt-in to "Improved behaviour of con units". + Modifies what construction units that are guarding factories do after completing each unit: either stay put; cavedog; or scatter. + Set byte at TotalA.exe:0x101f1f to 0x00 to disable the feature (default) or 0x01 to enable the feature. + Note that if one player's 0x101f1f setting doesn't match that of other players, an in-game cheat warning will be triggered. + Once enabled, see ctrl-f2 menu for related user configurable options. +- Fix bug with erroneous game results reported to TAF when using in-game +autoteam +- With fixed position, start positions are assigned in order given by TAF auto balance + so that players are positioned opposite an opponent of similar skill +- Fixed bugs with player placement in 2v2+ games on maps with neutral units +- Push anticheat hashing functions into background threads so as to reduce in-game slowdown experienced by some users + +*v2025.05.18 +- Improved behaviour of con units when guarding a factory - they stay put after finishing a build + +*v2025.04.24 +- Fix crash on parsing spawned unit initial commands - its now possible to copy-paste mission scripts from campaign +- Log cheat warnings to tdrawlog.txt for offline analysis +- Fix for non functional perm-los sonar patch (which otherwise requires watcher's com to be in top-left of map to work) + +*v2024.12.05 +- Fix crash on print-screen (and presumably many other related crashes) + +*v2024.12.03 +- Fix crash on +logo +- Fix rare intermitent crash on adding / moving / deleting whiteboard markers + +*v2024.10.27 +- Ability to create multiplayer/skirmish maps with neutral units and/or additional per-player spawn units +- Add a controls to hide/minimise the allies resource bar +- Make the allies resource bar actually work with ctrl-f2 setting "background=None" +- Fix incorrect player logo colour for "new marker added" messages +- Player the "Mission Complete" sound upon winning a multiplayer/skirmish game +- Fix bug causing "unit limit reached" in between single player missions +- Remove shared metal/energy from player "totals" +- Get TAHook to use the click-snapped start position +- Increase size capacity of whiteboard marker messages +- Fix for 10 player (and other) VerCheck false positives +- Support for watching all 10 players in 10 player replays (pending a corresponding TAF update to activate it) + + +*v2024.3.31 and prior +- Set start positions based on battleroom teams (or alliances) +- Repair battleroom teams icons so they can be used to create teams before to launching +- Add +autoteam battleroom and in-game commands to automatically assign teams +- Add +randomteam battleroom command to automatically assign random teams +- Add .exereport battleroom command to report CRC32 of each player's totala.exe +- Add .tdreport battleroom command to report CRC32 of each player's tdraw.dll (may be a different filename depending on mod) +- Add .tpreport battleroom command to report CRC32 of each player's tplayx.dll (may be a different filename depending on mod) +- Add .gp3report battleroom command to report CRC32 of each player's rev31.gp3 (may be a different filename depending on mod) +- Add .crcreport battleroom command to report fingerprints of each player's totala.exe, tdraw.dll, tplayx.dll and rev31.gp3 file all at once +- ClickSnap to snap to nearest mex, geo or reclaimable feature +- Add ability to drag queued orders around the map +- Con units patrol behaviour - hold position: reclaim only +- Fix the "ghost com" bug (remote commanders appear in top left of map during first 50sec of game) +- Fix the "units exploding in factories" bug by holding back recycling of deceased units' IDs for 5 seconds +- Option to render DTs and fortwalls that belong to the map (not built by a player) +- Supress "qqqqqq" whiteboard marker lables when "q" is used as the whiteboard key +- Show clock and weather report (wind and tidal strength) on top resource panel +- Sync wind speed across all players +- Set default resolution on new installs to 1024x768 (.ini setting "DisplayModeMinHeight768 = TRUE/FALSE") +- Disable relay of F11 chatmacro text to other players +- Enable start button in multiplayer lobby if only one player + AI are present +- Add +noshake and .ready buttons to sharing menu +- Add .autopause button to battleroom screen +- Change whiteboard, mappos and resource indicator colours in response to +logo commands +- Prevent +logo commands from affecting other players +- Ctrl-B doesn't select aircraft carriers +- Ctrl-F centres view on selected factory +- Ctrl-S works correctly with mobile-units-can-build-mobile-units hack +- Set +lostype as a cheatcode (not available unless cheats enabled) +- Look for ddraw.dll in current working directory as backend, or failing that use system ddraw.dll +- Use the same .ini file as TotalA.exe +- Use the same registry path as TotalA.exe +- Add FPS counter to megamap, increase megamap FPS +- Fix blue background on scoreboard +- Grey background on mega map to distinguish from unmapped area +- Prevent Ctrl-F2 dialog and allies resource bar from moving off screen +- Improve responsiveness of whiteboard marker movements sent to remote players +- Render cursor while in megamap +- Fix crash when removing markers +- Fix crash on simultaneous whiteboard marker move and delete +- Fix rare crash on TA Hook line drawing +- Radar and sonar jammers no longer jam your own radar and sonar in >3 player multiplayer +- Use CTRL_F and CTRL_B unit category tags for ctrl+f and ctrl+b hotkeys in preference to heuristics +- Change ctrl+s to use CTRL_W and NOTAIR/NAIR categories so as not to select jammers etc + +NEW FEATURES IN DETAIL: + +- Start positions + + Start positions are now assigned based on battleroom teams/alliances. + With fixed positions, host and their team are assigned the odd positions in the order that they joined the lobby. + With random positions, host and their team are randomly assigned the even or odd positions, and they are assigned in random order. + + The Teams icons now function correctly, so they can be used to arrange teams in the battleroom if desired. + This is optional, it is perfectly fine to arrange teams by creating alliances too. + +- Autoteam + + In the battleroom, host can type "+autoteam" to have teams assigned automatically. + These teams will then determine the start positions as described above. + + If launched from TAF, the battleroom +autoteam will assign autobalanced teams based on the player rating. + Otherwise teams are assigned randomly. + The +randomteam command is available to use should you prefer random teams over autobalanced teams. + + Alternatively, if host types "+autoteam" in-game, alliances are created based on actual start positions. + + For more than 2 teams, host can type eg "+autoteam 3" to create the desired number of teams. + +- MexSnap and WreckSnap + + This patch includes ability to snap mexes and geos to the nearest metal or geo patch (MexSnap), + and to snap reclaim commands to the nearest reclaim (WreckSnap). + + While holding down shift, press q and e alternately to switch between building mexes and reclaiming features. + + If Mex/WreckSnap is temporarily interfering with your wishes, + you can hold down alt to override it. + The override key can be configured in the ctrl-f2 options menu. + + The Mex/WreckSnap radii can also be configured independently via the ctrl-f2 options menu. + Press ctrl-f2, click on the "MexSnap" or "WreckSnap" field and press a number 0 to 9. + 0 disables the Mex/WreckSnap and a larger radius results in snapping to features further away. + + Note that Mex/WreckSnap is disabled by default. + It needs to be enabled by the mod maintainer. + If your Mex/WreckSnap radius shows as "NA" in the ctrl-f2 menu, + it is likely that Mex/WreckSnap hasn't been enabled by your mod maintainer. + +- Move Queued Orders + + After queueing a build order or a move order, + you can later move them around by selecting the unit + and left mouse dragging the order to a new position. + +- Construction Units Patrol Behaviour + + Patrol behaviour of contructions units is modified depending on their movement orders: + + Hold Position: your construction units will only look for reclaim + Maneuvre/roam: your construction units will both look for reclaim and for units that need repair or assist + + Mash the 'v' key to get the desired movement order and then set a patrol route. + +- Neutral unit and/or per-player additional unit spawn + + To enable this feature add a "[units]" section under the "[Schema 0]" section of your map's .ota file. eg + + [Schema 0] + { + .... + [units] + { + [unit0] + { + Unitname=ARMHLT; + Ident=; + XPos=3164; + YPos=0; + ZPos=2250; + Player=11; + HealthPercentage=100; + } + [unit0] + { + Unitname=ARMPEEP; + Ident=; + XPos=268; + YPos=0; + ZPos=384; + Player=1; + HealthPercentage=100; + CreationCountdown=30; + InitialMission=p 1750 1828; + } + } + + These additional units will spawn in for skirmish/multiplayer. + + The "Player" key in the .ota file refers to the map position 1..10. + Whichever player is spawned into these positions will receive ownership of the respective units. + + You can set Player=11. If any Player=11 units are defined, then the last player (eg the 6th in a 3v3) + receives ownership of the Player=11 units as long as they are an AI. He does not receive ownership of any other units. + + If a player receives any units by this mechanism, they won't receive a commander. + If you want the player to have a commander, + then either don't define any units for that position, + or include a commander unit in the list of units. + + The required fields for each unit are UnitName, XPos, ZPos and Player. + YPos and HealthPercentage are ignored. + Optional CreationCountdown is in seconds and InitialMission works. + Optional Ident makes it possible to refer to the unit in InitialMission of another unit. + You'll have to look at eg totala4.hpi/maps/*.OTA for examples of InitialMission scripts to copy. + +- Per-Unit Veterancy Customization + + This patch introduces new optional keys for unit definition files (units/*.fbi) + that allow you to customize veterancy behavior for individual units. + + Example + + [UNITINFO] + { + UnitName=ARMMART; + ... + VeterancyThresholds=6 12 18 24 30; // OTA default: 5 10 15 20 25 + VeterancyAccuracyBuffRate=3; // OTA default: 12 + } + + New Keys + + - VeterancyThresholds: + Sets the number of kills required to reach each veterancy level (VetLevel). + Example: "6 12 18 24 30" means: + - 6 kills for VetLevel 1 + - 12 kills for VetLevel 2 + - 18 kills for VetLevel 3 + - etc. + OTA's default thresholds are "5 10 15 20 25". + + - VeterancyAccuracyBuffRate: + Controls how quickly a unit’s weapon accuracy improves with kills, independently of veterancy levels. + - Accuracy starts at a factor of 1 with 0 kills. + - This factor increases by +1 every VeterancyAccuracyBuffRate kills. + - Formula: accuracyFactor = 1 + floor(kills / VeterancyAccuracyBuffRate) + - OTA’s default rate is 12. + - Set to zero to disable accuracy buff altogether + + Veterancy Effects (Unchanged) + + This patch does NOT change what veterancy levels do, only how they are earned. + For reference, each VetLevel in OTA gives: + + - Capture cost: +10% worker time needed to capture the unit + - Damage taken: -4% damage received + - Damage dealt: +6% damage dealt + - Target tracking: improved weapon target tracking (effect uncertain) + - Reload time: -6% weapon reload time + - Accuracy buff: improved firing accuracy (randomness reduced by an increasing factor) + + Note: Reload time also appears to be affected by the unit’s health. + + Veterancy Limits + + OTA limits: + - Capture cost: no limit + - Damage taken: up to 5 levels + - Damage dealt: up to 5 levels + - Target tracking: up to 1 level + - Reload time: up to 5 levels + - Accuracy buff: no limit + + With this patch: + - Capture cost: no limit + Beyond the last specified threshold, kill requirements are extrapolated linearly from the last two thresholds. + - Damage taken: up to 25 levels or the number of VeterancyThresholds, whichever is lower + - Damage dealt: up to the number of VeterancyThresholds + - Target tracking: up to 1 level + - Reload time: up to 16 levels or the number of VeterancyThresholds, whichever is lower + - Accuracy buff: no limit diff --git a/tmusi.dll b/tmusi.dll new file mode 100644 index 0000000..b602423 --- /dev/null +++ b/tmusi.dll @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:bfd96f5385984e8082db694f4d0192d65b660c1479df70f1a243a9e959beb202 +size 31744 diff --git a/totala.ini b/totala.ini new file mode 100644 index 0000000..46a8985 --- /dev/null +++ b/totala.ini @@ -0,0 +1,223 @@ +; Total Annihilation v2026.2.17 advanced settings + +; Original windowed mode will disable many TA v2026.2.17 features (including some of these) and is not recommended +; You can use cnc-ddraw for windowed mode instead: https://github.com/FunkyFr3sh/cnc-ddraw/releases + +[Preferences] +; custom settings, if any entry is disabled the "TA v2026.2.17 default" values will be used + +; Create DirectDraw surfaces in video memory rather than system memory +; Change the following setting if your game is not running smoothly +; This setting is ignored if you are using cnc-ddraw +; TA v2026.2.17 default is TRUE +UseVideoMemory = TRUE; + +; Override your "DisplayModeHeight" registry setting if lower than 768 +; If "DisplayModeWidth" is below 1024 it will override it as well +; Resolutions shown in the in-game list (EnumDisplayModes) are only filtered by height (768 minimum), any width is allowed still if supported by your hardware +; TA v2026.2.17 default is FALSE +DisplayModeMinHeight768 = TRUE; + +; Megamap FPS Limit +; Supports the following values: 0-1000 +; 0 = no limit +; TA v2026.2.17 default is 60 +MegamapFPSLimit = 60; + +; Unit limit per player +; Set from 20 - 1500 +; TA v3.1 default is 250 +; TA v2026.2.17 default is 1500 +UnitLimit = 1500; + +; Pathfinding cycles +; Setting too low (such as TA v3.1 default) ruins pathfinding but setting extremely high lowers fps +; TA v3.1 default is 1333 +; TA v2026.2.17 default is 66650 +AISearchMapEntries = 66650; + +; Special effects limit (smoke, etc.) +; Setting too low (such as TA v3.1 default) will degrade visual quality +; This setting is still experimental, if you experience visual issues set to 400 +; TA v3.1 default is 400 +; TA v2026.2.17 default is 20480 +SfxLimit = 20480; + +; Unit model size limit +; Set max width and height for unit model drawing buffer +; TA v3.1 default is 600x600 +; TA v2026.2.17 default is 1280x1280 +X_CompositeBuf = 1280; +Y_CompositeBuf = 1280; + +; Unit ID limit +; Set the maximum number of unique unit IDs +; TA v3.1 default is 512 +; TA v2026.2.17 default is 16000 +UnitType = 16000; + +; Weapon ID limit +; Set the maximum number of unique weapon IDs +; TA v3.1 default is 256 +; TA v2026.2.17 default is 16000 +WeaponType = 16000; + +; Weapon ID multiplayer patch +; Set to TRUE to enable increased Weapon ID limit in multiplayer +; Set to FALSE to allow increased Weapon ID limit only in single player +; TA v3.1 default is FALSE +; TA v2026.2.17 default is FALSE (Weapon ID limit increase not yet compatible with Replayer) +MultiGameWeapon = FALSE; + +; Double-click selection +; Enable or disable the new "double-click to select all units of the same type on screen" feature +; TA v3.1 default is FALSE +; TA v2026.2.17 default is TRUE +DoubleClick = TRUE; + +; Expanded Multiplayer Sharing Menu +; Enable or disable the new expanded multiplayer sharing menu +; TA v3.1 default is FALSE +; TA v2026.2.17 default is TRUE +ShareDialogExpand = TRUE; + +; Main menu resolution adjuster +; Set to FALSE to keep main menu resolution at the default 640x480 +; Set to TRUE to match main menu resolution to the in-game resolution set via options menu +; If TRUE, the main menu will not be upscaled to fit increased output resolution +; If resolution is not valid, the game will not start (use resolution overrider below to fix) +; Note: This setting is ignored if you are using cnc-ddraw +; TA v3.1 default is FALSE +; TA v2026.2.17 default is FALSE +MenuResolution = FALSE; + +; Megamap +; Enable or disable the new megamap +; TA v3.1 default is FALSE +; TA v2026.2.17 default is TRUE +FullScreenMinimap = TRUE; + +; Megamap Icon Configuration File +; Set the location of the megamap's icon configuration file +; TA v2026.2.17 default is .\Icon\iconcfg.ini +MegaMapConfig = .\Icon\iconcfg.ini; + +; Megamap Configuration Settings +; Use the fields below to customize the megamap + +; Megamap Mouse Wheel Zooming +; Enable or disable ability to zoom in and out of the megamap with the mouse wheel +; TA v2026.2.17 default is TRUE +WheelZoom = TRUE; + +; Megamap Mouse Wheel Zoom In Mode +; Set to TRUE to zoom to the cursor location when rolling the wheel up from the megamap +; Set to FALSE to zoom to the previous camera location when rolling the wheel up from the megamap +; TA v2026.2.17 default is TRUE +WheelMoveMegaMap = TRUE; + +; Megamap Double-Click to Zoom Option +; Enable or disable the option to zoom to the cursor location... +; ...when double-clicking terrain on the megamap +; TA v2026.2.17 default is FALSE +DoubleClickMoveMegamap = FALSE; + +; Megamap Unit Icon Flashing When Under Attack +; Enable or disable megamap unit icon flashing when under attack +UnderAttackFlash=TRUE; + +; Megamap Minimum Sensor Range Ring Distances +; Set the minimum sensor values required to display range rings on the megamap +; These settings could be helpful if you want to eliminate clutter from short-ranged rings +; TA v2026.2.17 default is 0 for all sensors +MegamapRadarMinimum = 0; +MegamapSonarMinimum = 0; +MegamapSonarJamMinimum = 0; +MegamapRadarJamMinimum = 0; +MegamapAntiNukeMinimum = 0; + +; Player Icon and Line Marker Colors +; Customize the colors of the player minimap/megamap icons and line markers +; Set from 0 to 255 to select colors from the TA indexed color palette +; These settings are disabled by default (remove the semicolons to enable) +Player1DotColors=227; ;Default is 227 +Player2DotColors=212; ;Default is 212 +Player3DotColors=80; ;Default is 80 +Player4DotColors=235; ;Default is 235 +Player5DotColors=108; ;Default is 108 +Player6DotColors=219; ;Default is 219 +Player7DotColors=208; ;Default is 208 +Player8DotColors=93 ;Default is 93 +Player9DotColors=130; ;Default is 130 +Player10DotColors=67; ;Default is 67 + +; Player Dot Marker Colors +; Customize the colors of player dot markers by setting a custom icon file +; Edit the example smallcircle.pcx file or create a new icon file +; The icon file must contain all 10 player markers from left to right +; The icon width and height settings must match the dimensions of your icons +; These settings are disabled by default (remove the semicolons to enable) +PerPlayerMarkerWidth=10; +PerPlayerMarkerHeight=10; +PlayerMarkerPcx=Icon\smallcircle.pcx; + +[REG] ; registry override settings, if any entry is disabled the last value used will be remembered + +; Sound mode +; Set to 0 for no sound, 1 for mono sound, and 2 for 3D positional sound +; When set to 3D, the speaker layout is read from the Windows control panel +; All speaker layouts are supported by the 3D sound engine (stereo, 5.1, 7.1, etc.) +; TA v3.1 default is Mono (dword:1) +; TA v2026.2.17 default is 3D (dword:2) +"Sound Mode" = dword:2 + +; Max number of simultaneous sounds before sounds are cut off +; Set from 2 - 32 for specific limits or 33 or higher for unlimited +; TA v3.1 default is 8 (dword:8) +; TA v2026.2.17 default is 128 / unlimited (dword:128) +"MixingBuffers" = dword:128 + +; Default game speed +; Set from 0 - 20 (corresponding to game speed -10 to +10) +; Use plus and minus keys to adjust while playing +; TA and TA v2026.2.17 default is 10 which is equivalent to Normal game speed (dword:10) +"GameSpeed" = dword:10 + +; Group selection hotkey modifier +; Set to 1 to select unit groups with number key and build menus with ALT + number key +; Set to 0 to select build menus with number key and unit groups with ALT + number key +; TA v3.1 default is 0 (dword:0) +; TA v2026.2.17 default is 1 (dword:1) +"SwitchAlt" = dword:1 + +; Max number of players in skirmish mode +; Set from 2 - 10 +; TA v3.1 default is 4 (dword:4) +; TA v2026.2.17 default is 10 (dword:10) +"NumSkirmishPlayers" = dword:10 + +; Default setting for display of chat messages from other players +; Set to 1 to enable and 0 to disable +; Use "+screenchat" command in-game to toggle setting for the current game +; TA and TA v2026.2.17 default is 1 +"ScreenChat" = dword:1 + +; Music playback mode +; Set to 1 for Play All, 2 for Random, 3 for Repeat, and 4 for Custom. +; When set to Custom, the game will attempt to use the dynamic build/battle system... +; ...however this mode is buggy and almost never works correctly on modern systems... +; ...resulting in only a single track being played, either stopping thereafter (CD version)... +; ...or looping forever (MP3 version), therefore Random is best for most people +; TA v3.1 default is Custom (dword:4) +; TA v2026.2.17 default is Random (dword:2) +"CDMode" = dword:2 + +; Resolution overrider (disabled by default) +; Use this to override the resolution set in the options menu (remove semicolons to enable) +; All resolutions and aspect ratios supported by your setup are supported by the game... +; ...as long as they are available in 8-bit color depth (if not, create a custom resolution) +; If you set a resolution not supported by your setup (driver or display) the game will crash +; The override is set at game launch, using options menu will defeat override until next launch +; Example: dword:1920 x dword:1080 (1920x1080) +;"DisplayModeWidth" = dword:1920 +;"DisplayModeHeight" = dword:1080 diff --git a/tplayx.dll b/tplayx.dll new file mode 100644 index 0000000..e7a2c62 --- /dev/null +++ b/tplayx.dll @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b641a7c97389088f93e7270425a24a1b6d0c442a112cd6be47a46c2773efdacf +size 298496 diff --git a/wgmus readme.MD b/wgmus readme.MD new file mode 100644 index 0000000..3021a29 --- /dev/null +++ b/wgmus readme.MD @@ -0,0 +1,30 @@ + /***************************************************************************/ + + WGMUS.DLL (WARGAME MUSIC DLL) IS DESIGNED FOR USE WITH TOTAL ANNIHILATION TO ENABLE MUSIC PLAYBACK FROM FILES ON HARD DRIVE, OR FROM CD AS OF NOW, PLAYBACK IS SUPPORTED VIA BASS ( https://www.un4seen.com/ ) AND ADDON BASS CD PLANS FOR SUPPORTING AUDIERE, OPENAL, WINMM, AND DIRECTSHOW. PARTIALLY BASED ON OGG-WINMM https://github.com/hifi-unmaintained/ogg-winmm + + PLACE INTO TOTAL ANNIHILATION DIRECTORY, AND REGEDIT TOTALA.EXE REPLACE MENTION OF WINMM.DLL, or WIN32.DLL DEPENDING ON RELEASE WITH WGMUS.DLL + + DEFAULT MUSIC FOLDER NAME IS tamus IT IS ADVISED TO NAME TRACKS IN A MANNER THAT IS CONSISTENT FOR EXAMPLE, 00.mp3, 01.mp3, AND SO FORTH NOT 1.mp3 to 9.mp3, THEN 10 to 16 MP3 AS THEY WILL BE LOADED IN THE "WRONG" ORDER. + + SETTINGS ARE CONTROLLED VIA wgmus.ini + + SPECIAL THANKS: + FunkyFr3sh, + Kevin Hake, + Armoured Fish. + + COPYRIGHT MENTIONS: + ogg-winmm + Copyright (c) 2012 Toni Spets + BASS 2.4 + Copyright (c) 1999-2022 Un4seen Developments Ltd. All rights reserved. + BASSCD 2.4 + Copyright (c) 2003-2022 Un4seen Developments Ltd. All rights reserved. + BASSFLAC 2.4 + Copyright (c) 2004-2023 Un4seen Developments Ltd. All rights reserved. + BASSmix 2.4 + Copyright (c) 2005-2022 Un4seen Developments Ltd. All rights reserved. + BASSWASAPI 2.4 + Copyright (c) 2009-2020 Un4seen Developments Ltd. All rights reserved. + + /***************************************************************************/ \ No newline at end of file diff --git a/wgmus.dll b/wgmus.dll new file mode 100644 index 0000000..f649da2 --- /dev/null +++ b/wgmus.dll @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2da8dd67b6e1de03ba192c9af7d68934e5dee7ec568c9c82447d6ae6d425b73c +size 46592 diff --git a/wgmus.ini b/wgmus.ini new file mode 100644 index 0000000..2bdaf2c --- /dev/null +++ b/wgmus.ini @@ -0,0 +1,38 @@ +[Settings] +; ------------------------------ +; Music playback configuration +; ------------------------------ + +; Playback mode: +; 0 = CD (use audio tracks directly from CD) +; 1 = Music files (use files from MusicFolder) +PlaybackMode=1 + +; Path to folder containing your music files +; (relative to game folder or absolute path) +MusicFolder=music + +; File format index (used if Extensions= is not set): +; 0 = wav +; 1 = mp3 +; 2 = ogg +; 3 = flac +; 4 = aiff +FileFormat=1 + +; Extensions override: +; Optional — if you set this, it overrides FileFormat and allows multiple types. +; List extensions separated by commas (case-insensitive, dot optional). +; Example: Extensions=mp3,ogg,flac +Extensions=mp3,ogg + +; ------------------------------ +; Logging configuration +; ------------------------------ + +; LogLevel controls how much detail is written to wgmus.log +; 0 = DEBUG (everything, very verbose — use only for troubleshooting) +; 1 = INFO (default — logs playback state, warnings, and errors) +; 2 = WARN (only warnings and errors) +; 3 = ERROR (only critical errors) +LogLevel=0 \ No newline at end of file diff --git a/win32.dll b/win32.dll new file mode 100644 index 0000000..f649da2 --- /dev/null +++ b/win32.dll @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2da8dd67b6e1de03ba192c9af7d68934e5dee7ec568c9c82447d6ae6d425b73c +size 46592