{"id":5687,"date":"2026-03-03T08:29:56","date_gmt":"2026-03-03T08:29:56","guid":{"rendered":"https:\/\/baselunaire.fr\/?page_id=5687"},"modified":"2026-06-03T23:04:24","modified_gmt":"2026-06-03T23:04:24","slug":"s01e00-that-temple-on-draxacar-2","status":"publish","type":"page","link":"https:\/\/baselunaire.fr\/?page_id=5687","title":{"rendered":"S01E00 : THAT TEMPLE ON DRAXACAR&#8230;"},"content":{"rendered":"<p>Author&rsquo;s note :<\/p>\n<p><em>This Episode Zero was very much NOT planned.<\/em><\/p>\n<p>The original intent was simply to animate an \u00ab\u00a0Opening\u00a0\u00bb of sorts, in the spirit of the <strong>Twilight Zone<\/strong> (&#8230;with a bit more punch, in my own style, also I didn&rsquo;t have the budget to hire <strong>Rod Serling<\/strong>&lsquo;s AI, fml&#8230;) But in the end, I think this first instalment gives a good idea of what the typical episode of <strong>\u00ab\u00a0The Last Temple Of Science-Fiction\u00a0\u00bb<\/strong> will look like : a 2D animation, some music, and an accompanying (hopefully good) short scifi story.<\/p>\n<p>Things might evolve in the future, depending on <strong>YOUR<\/strong> feedback, but we&rsquo;ll start with this basic recipe that seems to have worked a few times before (on Shadertoy, mostly). And afterwards, if you had a good time, leave a (supportive, kind, helpful) comment on this page, or better : <a href=\"https:\/\/ko-fi.com\/thelasttempleofsciencefiction\" target=\"_blank\">buy me a coffee !<\/a> (it may allow me to buy a dedicated website for the Temple and even pay the rent haha, imagine that ! :D).<\/p>\n<p>So WELCOME, dear friend !<\/p>\n<p>Please, lean back in your most comfortable chair, grab a glass of your favorite beverage, maybe some snacks, and let your mind soar ! Let&rsquo;s travel together to another galaxy and a very distant future, where mankind is long forgotten. Well, maybe not <strong>entirely<\/strong><em> forgotten&#8230;<\/em><\/p>\n<p><!-------------------------------------------------------------------------------------------------->\r\n<!------------------------------------------------------------------------BEGIN EPISODE SCRIPT CODE->\r\n<!-------------------------------------------------------------------------------------------------->\r\n  <script type = \"glsl\" id = \"standard-vs\">\r\n\/\/ --------------------------------------\r\n\/\/ Vertex Shader, DO NOT MODIFY----------\r\n\/\/ --------------------------------------\r\nprecision mediump float;\r\nattribute vec4 a_Position;\r\n\/\/attribute vec4 a_Color;\r\nvoid main(){ gl_Position = a_Position;}\r\n<\/script>\r\n<script type = \"glsl\" id = \"standard-frag\">\r\n\/\/ ----------------------------------------\r\n\/\/ Fragment Shader, put your code here-----\r\n\/\/ ----------------------------------------\r\nprecision mediump float;\r\nuniform sampler2D tex00;\r\nuniform sampler2D tex01;\r\nuniform sampler2D tex02;\r\nuniform sampler2D tex03;\r\nuniform float iTime;\r\nuniform vec2 iResolution;\r\n#define PI 3.14159\r\n#define s(a,b,c) smoothstep(a,b,c)\r\n#define EclipseDelay 85.0\r\n\r\nbool LANG = false; \/\/ true = FR, false = ENG\r\nvec4 LIGHTNING_FLAGS = vec4(0.0,0.0,0.0,0.0);\r\nfloat PylonTilt = 0.05;\r\nfloat WidthChar = 0.031;\r\nfloat VScrollerLength=32.599;\r\nfloat TimeVar;\r\n\r\n\/\/ VF\r\nmat4 str0 = mat4( 5580620.0, 4805708.0, 17741.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0);\r\nmat4 str1 = mat4( 5064020.0, 4541520.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0);\r\nmat4 str2 = mat4( 2114884.0, 16716.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0);\r\nmat4 str3 = mat4( 4801363.0, 4410949.0, 4599109.0, 5522249.0, 5132105.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0);\r\nmat4 str4 = mat4( 5590851.0, 4543570.0, 4726867.0, 5526345.0, 5392719.0, 2118469.0, 18003.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0);\r\nmat4 str5 = mat4( 4408644.0, 5657935.0, 5526085.0, 2118469.0, 5395795.0, 5133600.0, 5391904.0, 5064513.0, 5525061.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0);\r\nmat4 str6 = mat4( 5129543.0, 4805189.0, 4543825.0, 2108192.0, 4804677.0, 4476755.0, 3153989.0, 48.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0);\r\n\r\n\/\/ ENG\r\nmat4 str7 = mat4( 4540500.0, 4279328.0, 21587.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0);\r\nmat4 str8 = mat4( 5064020.0, 4541520.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0);\r\nmat4 str9 = mat4( 17999.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0);\r\nmat4 str10 = mat4( 4801363.0, 4410949.0, 4599109.0, 5522249.0, 5132105.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0);\r\nmat4 str11 = mat4( 5195859.0, 2118738.0, 4801363.0, 2115910.0, 5198931.0, 4540754.0, 83.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0);\r\nmat4 str12 = mat4( 4673093.0, 5652818.0, 2114629.0, 2117199.0, 4595777.0, 4669778.0, 5129549.0, 84.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0);\r\nmat4 str13 = mat4( 4542543.0, 5130574.0, 2826311.0, 5260576.0, 5198665.0, 2114884.0, 12336.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0);\r\n\r\n\/\/ ADDITIONAL MESSAGE VF\r\nmat4 str14 = mat4( 4269900.0, 5129558.0, 2118217.0, 4804428.0, 4281422.0, 20041.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0);\r\nmat4 str15 = mat4( 5395795.0, 4541472.0, 5198880.0, 4538957.0, 2118977.0, 5457220.0, 5195808.0, 4541773.0, 83.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0);\r\nmat4 str16 = mat4( 5522755.0, 2114900.0, 4804677.0, 5259604.0, 2114888.0, 5853763.0, 4805712.0, 4543825.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0);\r\nmat4 str17 = mat4( 5587267.0, 2114899.0, 2114884.0, 2113868.0, 5394253.0, 84.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0);\r\nmat4 str18 = mat4( 4543277.0, 4543043.0, 4539476.0, 5129542.0, 2966867.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0);\r\n\r\n\/\/ ADDITIONAL MESSAGE ENG\r\nmat4 str19 = mat4( 4540500.0, 4801568.0, 4281427.0, 2118734.0, 5526854.0, 4543061.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0);\r\nmat4 str20 = mat4( 2117199.0, 5128525.0, 5130571.0, 5449540.0, 5198880.0, 5456461.0, 5132116.0, 69.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0);\r\nmat4 str21 = mat4( 4540500.0, 2114899.0, 5853763.0, 4805712.0, 5709891.0, 4477519.0, 83.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0);\r\nmat4 str22 = mat4( 4999499.0, 4474188.0, 5849632.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0);\r\nmat4 str23 = mat4( 4543021.0, 4407620.0, 4474196.0, 45.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0);\r\n\r\nmat2 r2d(float a){float c=cos(a), s=sin(a); return mat2(c,s,-s,c);}\r\nfloat noise(vec2 st){return fract(sin(dot(st.xy,vec2(12.9898,78.233)))*43758.5453123);}\r\nfloat TriangleWave(float p){ return abs(mod(p,2.0) - 1.0 );}\r\nvec3 pal( in float t, in vec3 a, in vec3 b, in vec3 c, in vec3 d ){return a + b*cos( 0.3*(c*t+d) );}\r\nvec4 GetColorSpot(vec2 c){vec3 color  = pal(0.25*c.x, vec3(1.0,1.0,1.0),vec3(1.0,0.7,0.4),vec3(0.1,0.5,0.9),vec3(0.1,0.1,1.0));return vec4(0.65*color.xyz,1.0);}\r\nvec2 dw0(vec2 p){vec2 dist;float ampli1=0.05;mat2 rm= mat2(100.0);dist = 100.0*texture2D(tex00,0.0002*rm*p + vec2(0.0,0.25)).xy;return p+ampli1*dist;}\r\nvec2 dw1(vec2 p){for( float i = 0.0; i<2.0; i++ )p += 0.5*i*texture2D(tex01,-0.10*r2d(3.0*i)*p + vec2(0.0001*TimeVar,0.0)).xy;return p;}\r\nvec2 dw2(vec2 p){for( float i = 0.0; i<2.0; i++ )p += 0.7*i*texture2D(tex01,-0.25*r2d(2.0*i)*p + vec2(0.0,0.1*TimeVar)).xy;return p;}\r\nvec2 dw3(vec2 p){for( float i = 0.0; i<3.0; i++ )p += exp(vec2((1.0*i)*texture2D(tex01,-0.01*r2d(i)*p + vec2(0.0005*TimeVar)).xy));return p;}\r\n\r\nfloat Smooth1D(in vec2 v_p)\r\n{\r\n      float pvpx = 2.0*v_p.x;\r\n      vec2 V1 = vec2(0.5*floor(pvpx      ));\r\n      vec2 V2 = vec2(0.5*floor(pvpx + 1.0));\r\n      return mix(noise(V1),noise(V2),smoothstep(0.0,1.0,fract(pvpx)));\r\n}\r\n\r\nfloat metaDiamond(vec2 p, vec2 pixel, float r)\r\n{\r\n      vec2 d = abs(p-pixel);\r\n      return r \/ (d.x + d.y);\r\n}\r\n\r\nfloat traceChar( in vec2 v,int charac, vec2 PosTxt)\r\n{\r\n      float colorChar = 0.0;\r\n      float XOffsetTuning = 0.0;\r\n      \/\/ Compensating for some font texture alignment issues\r\n      if(charac==45)XOffsetTuning -= 0.0032; \/\/ \"-\"\r\n      if(charac==73)XOffsetTuning += 0.0025; \/\/ \"I\"\r\n      if( v.x > PosTxt.x && v.x < PosTxt.x + 1.0\/16.0 )\r\n      {\r\n          if( v.y > PosTxt.y && v.y < PosTxt.y + 1.0\/16.0 )\r\n          {\r\n              vec2 Disp = vec2(mod(float(charac),16.0),floor(float(charac) \/ 16.0))\/16.0;\r\n              colorChar = texture2D(tex03,vec2(Disp +vec2(XOffsetTuning,0.0) + (v - PosTxt))).x;\r\n          };\r\n      };\r\n      return colorChar;\r\n}\r\n\r\nvec4 traceStr(vec2 p, int s)\r\n{\r\n     mat4 matxt;\r\n     vec4 ColorCh = vec4(0.0);\r\n     if(s==  0)matxt =  str0;\r\n     if(s==  1)matxt =  str1;\r\n     if(s==  2)matxt =  str2;\r\n     if(s==  3)matxt =  str3;\r\n     if(s==  4)matxt =  str4;\r\n     if(s==  5)matxt =  str5;\r\n     if(s==  6)matxt =  str6;\r\n     if(s==  7)matxt =  str7;\r\n     if(s==  8)matxt =  str8;\r\n     if(s==  9)matxt =  str9;\r\n     if(s== 10)matxt = str10;\r\n     if(s== 11)matxt = str11;\r\n     if(s== 12)matxt = str12;\r\n     if(s== 13)matxt = str13;\r\n     if(s== 14)matxt = str14;\r\n     if(s== 15)matxt = str15;\r\n     if(s== 16)matxt = str16;\r\n     if(s== 17)matxt = str17;\r\n     if(s== 18)matxt = str18;\r\n     if(s== 19)matxt = str19;\r\n     if(s== 20)matxt = str20;\r\n     if(s== 21)matxt = str21;\r\n     if(s== 22)matxt = str22;\r\n     if(s== 23)matxt = str23;\r\n     int char_cursor = 0;\r\n     int nb_char = 0;\r\n     for( int i = 0; i < 4; i++)\r\n     {\r\n          for( int j = 0; j < 4; j++)\r\n          {\r\n               if( matxt[i][j] >   0.0       )nb_char += 1;\r\n               if( matxt[i][j] > 256.0       )nb_char += 1;\r\n               if( matxt[i][j] > 256.0*256.0 )nb_char += 1;\r\n          };\r\n     };\r\n\r\n     p += vec2(WidthChar*(float(nb_char)+1.)\/2.0,0.0);\r\n\r\n\r\n     for( int i = 0; i < 4; i++)\r\n     {\r\n          for(int j = 0; j < 4; j++)\r\n          {\r\n              float car3 = floor(matxt[i][j]\/(256.0*256.0));\r\n              float car2 = floor(fract(matxt[i][j]\/(256.0*256.0))*256.0);\r\n              float car1 = matxt[i][j]-car2*256.0-car3*256.0*256.0;\r\n\r\n              ColorCh = mix(ColorCh,vec4(1.0),traceChar(p,int(car1),vec2(0.0,1.0)));\r\n              char_cursor++;\r\n              if(float(char_cursor)==float(nb_char))break;\r\n              p += vec2(-WidthChar,0.0);\r\n\r\n              ColorCh = mix(ColorCh,vec4(1.0),traceChar(p,int(car2),vec2(0.0,1.0)));\r\n              char_cursor++;\r\n              if(float(char_cursor)==float(nb_char))break;\r\n              p += vec2(-WidthChar,0.0);\r\n\r\n              ColorCh = mix(ColorCh,vec4(1.0),traceChar(p,int(car3),vec2(0.0,1.0)));\r\n              char_cursor++;\r\n              if(float(char_cursor)==float(nb_char))break;\r\n              p += vec2(-WidthChar,0.0);\r\n          };\r\n          if(float(char_cursor)==float(nb_char))break;\r\n     };\r\n     return ColorCh;\r\n}\r\n\r\nvec4 drawLightnings(vec2 p,vec4 col,float pos)\r\n{\r\n\r\n     if( Smooth1D(vec2(floor(0.5*TimeVar + 10.15*pos)))>0.8) \/\/ Statistical Lightning\r\n     {\r\n         if(pos==1.)LIGHTNING_FLAGS.r = 1.0;\r\n         if(pos==2.)LIGHTNING_FLAGS.g = 1.0;\r\n         if(pos==3.)LIGHTNING_FLAGS.b = 1.0;\r\n         if(pos==4.)LIGHTNING_FLAGS.a = 1.0;\r\n         float StrongestAvenger = 0.0;\r\n         StrongestAvenger = abs(p.x-0.4*sin(20.0*p.y + TimeVar)*exp(0.9*p.y - 10.0))-0.05;\r\n\r\n         StrongestAvenger = abs(p.x- (0.5*clamp((p.y-10.0),0.0,1.0)*Smooth1D(vec2(1.00*p.y + 100.0*TimeVar + 115.1*pos)))\r\n                                    +(2.0*clamp((p.y-10.0),0.0,1.0)*Smooth1D(vec2(0.25*p.y +   5.0*TimeVar + 58.1*pos)))\r\n                                -0.05);\r\n\r\n         if(p.y>10.0)col += vec4(0.0,0.0,1.0,1.0)*smoothstep(0.25,0.0,StrongestAvenger);\r\n         if(p.y>10.0)col += vec4(0.7,0.5,1.0,1.0)*smoothstep(0.05,0.0,StrongestAvenger);\r\n         col += vec4(0.2,0.2,1.0,1.0)*metaDiamond(p,vec2(0.0,10.0),0.90)*abs(sin(40.0*TimeVar));\r\n     };\r\n     return col;\r\n}\r\n\r\nvec4 drawPylon(vec2 p,vec4 col,float id, float l_offset)\r\n{\r\n     p+=vec2(l_offset,35.0);\r\n     float Factor03 = 1.0;\r\n     if(TimeVar<VScrollerLength)Factor03 = 0.5;\r\n     float Factor01 = 1.0*Factor03;\r\n     float Factor02 = 2.0*Factor03;\r\n\r\n     if( id < 3.0 )     \/\/ Back Pylons farther, smaller...\r\n     {\r\n         p*=1.3;\r\n         if(id==1.)p*=r2d(-PylonTilt);\r\n         if(id==2.)p*=r2d( PylonTilt);\r\n     }else{\r\n         if(id==3.)p*=r2d(-PylonTilt);\r\n         if(id==4.)p*=r2d( PylonTilt);\r\n         Factor01 = 2.0;\r\n         Factor02 = 0.85;\r\n     };\r\n     if( abs(p.x) < 0.45 )\r\n     {\r\n       if(id==1. || id==3.)p.x-=0.075;\r\n       if(id==2. || id==4.)p.x+=0.075;\r\n       col = mix(col,vec4(Factor01*1.0,Factor01*0.5,Factor01*0.0,1.0)*texture2D(tex00,0.1*abs(p)),smoothstep(0.01,0.0,p.y-clamp(15.0*TriangleWave(1.8*p.x),0.0,10.0)));\r\n       if(id==1. || id==3.)p.x+=0.075;\r\n       if(id==2. || id==4.)p.x-=0.075;\r\n       col = mix(col,vec4(Factor02*1.0,Factor02*0.5,Factor02*0.0,1.0)*texture2D(tex00,0.1*abs(p)),smoothstep(0.01,0.0,p.y-clamp(15.0*TriangleWave(2.0*p.x),0.0,10.0)));\r\n     };\r\n     if( TimeVar > VScrollerLength )col += vec4(vec3(1.0,0.7,0.0)*metaDiamond(p,vec2(0.0,9.6),0.1-0.07*Smooth1D(vec2(3.0*TimeVar + 14.4*id))),1.0);\r\n     if( TimeVar > VScrollerLength )col = drawLightnings(p,col,id);\r\n\r\n     return col;\r\n}\r\n\r\nvec4 drawProbe(vec2 p,vec4 col)\r\n{\r\n     vec2 ProbePos = vec2(20.0*Smooth1D(vec2(0.3*TimeVar))-10.0,31.0+0.15*sin(TimeVar));\r\n\r\n     p+= vec2(0.0,35.0);\r\n     vec2 TopPylon1 = 1.3*p-r2d(-PylonTilt)*vec2(0.0,10.0) + 1.3*vec2( 5.0,0.0);\r\n     vec2 TopPylon2 = 1.3*p-r2d( PylonTilt)*vec2(0.0,10.0) + 1.3*vec2(-5.0,0.0);\r\n     vec2 TopPylon3 =     p-r2d(-PylonTilt)*vec2(0.0,10.0) +     vec2( 7.0,0.0);\r\n     vec2 TopPylon4 =     p-r2d( PylonTilt)*vec2(0.0,10.0) +     vec2(-7.0,0.0);\r\n     p-= vec2(0.0,35.0);\r\n\r\n     p += ProbePos;\r\n\r\n     float angle = atan(ProbePos.x,4.5); \/\/ Angle with Top Flare\r\n     vec4 ProbeColor = vec4(0.1,0.0,0.0,1.0)+vec4(0.7,0.1,0.1,1.0)*smoothstep(0.05,0.0,abs(p.y) - 0.05*Smooth1D(vec2(0.5*p.x + 4.0*TimeVar)));\r\n     ProbeColor += abs(cos(p.x))*vec4(0.9,0.7,0.1,1.0)*smoothstep(0.02,0.0,abs(p.y) - 0.02*Smooth1D(vec2(0.5*p.x + 4.0*TimeVar)));\r\n     ProbeColor += vec4(0.5,0.5,1.0,1.0)*metaDiamond(p,vec2(0.4,-0.15),0.015);\r\n     ProbeColor += vec4(0.5,0.5,1.0,1.0)*metaDiamond(p,vec2(0.7,-0.15),0.015);\r\n     ProbeColor += vec4(0.5,1.0,0.5,1.0)*metaDiamond(p,vec2(-0.7,-0.15),0.015*Smooth1D(vec2(10.0*TimeVar)));\r\n     ProbeColor += vec4(1.0,0.0,0.0,1.0)*metaDiamond(p,vec2(-0.1,-0.15),0.015*clamp(sin(10.0*TimeVar),0.0,1.0));\r\n     ProbeColor += vec4(0.4,0.4,0.4,1.0)*smoothstep(2.0,0.0,abs(length(p - vec2(0.0,0.0))));\r\n\r\n     \/\/ Probe Shine\r\n     p*=r2d(-angle);\r\n     ProbeColor += vec4(0.8,0.4,0.1,1.0)*smoothstep(2.0,0.0,abs(length(p - vec2(0.0,0.0)) - 1.5))*smoothstep(0.0,1.5,p.y);\r\n     ProbeColor += vec4(0.8,0.4,0.1,1.0)*smoothstep(0.2,0.0,abs(length(p - vec2(0.0,0.0)) - 1.5))*smoothstep(0.0,1.5,p.y);\r\n     p*=r2d( angle);\r\n\r\n     \/\/ Ground Reflection\r\n     ProbeColor += 1.0*vec4(0.8,0.4,0.1,1.0)*(0.45+0.65*texture2D(tex00,p\/(16.0*cos(length(0.8*p))) + vec2(-0.125*ProbePos.x,0.0)))\r\n     *smoothstep(0.8,0.0,abs(length(p - vec2(0.0,0.0)) - 1.5))\r\n     *smoothstep(0.0,1.5,-p.y);\r\n     vec4 Flare = vec4(0.0);\r\n\r\n     \/\/ Lightning Flares Reflections\r\n     if( TimeVar > VScrollerLength )\r\n     {\r\n         Flare += vec4(1.0)*metaDiamond(p,r2d(-angle)*vec2(0.0,1.5),0.15);\r\n\r\n         float angle1 = atan(p.x-TopPylon1.x,-TopPylon1.y);\r\n         float angle2 = atan(p.x-TopPylon2.x,-TopPylon2.y);\r\n         float angle3 = atan(p.x-TopPylon3.x,-TopPylon3.y);\r\n         float angle4 = atan(p.x-TopPylon4.x,-TopPylon4.y);\r\n\r\n         vec4 ColorFlare = vec4(1.0,0.5,1.0,1.0)*(0.8+0.2*abs(sin(40.0*TimeVar)));\r\n\r\n         if(LIGHTNING_FLAGS[0] == 1.0)Flare += ColorFlare*metaDiamond(p,r2d(-angle1)*vec2(0.0,1.5),0.17);\r\n         if(LIGHTNING_FLAGS[1] == 1.0)Flare += ColorFlare*metaDiamond(p,r2d(-angle2)*vec2(0.0,1.5),0.17);\r\n         if(LIGHTNING_FLAGS[2] == 1.0)Flare += ColorFlare*metaDiamond(p,r2d(-angle3)*vec2(0.0,1.5),0.17);\r\n         if(LIGHTNING_FLAGS[3] == 1.0)Flare += ColorFlare*metaDiamond(p,r2d(-angle4)*vec2(0.0,1.5),0.17);\r\n         LIGHTNING_FLAGS = vec4(0.0);\r\n     };\r\n     float ProbeMask = smoothstep(0.1,0.0,length(p - vec2(0.0,0.0)) - 1.5);\r\n     return mix(col,ProbeColor,ProbeMask)+Flare;\r\n}\r\n\r\nvec4 Scene01(in vec2 p,vec4 col)\r\n{\r\n     vec4 XColor = vec4((cos(TimeVar) + 1.0)\/2.0,\r\n         (cos(TimeVar +     3.14159\/3.0) + 1.0)\/2.0,\r\n         (cos(TimeVar + 2.0*3.14159\/3.0) + 1.0)\/2.0,1.0);\r\n\r\n     p *= 2.5+0.5*sin(TimeVar);\r\n     p*= r2d(2.0*3.1415*Smooth1D(vec2(0.1*TimeVar)));\r\n     vec2 u = p;\r\n\r\n     col += vec4(XColor.xyz*texture2D(tex02,0.90*vec2(p.x\/p.y,1.0\/p.y+sign(p.y)*TimeVar)).rgb,1.0);\r\n     col += vec4(XColor.xyz*texture2D(tex02,0.05*vec2(p.x\/p.y,0.05\/p.y+sign(p.y)*0.5*TimeVar)).rgb,1.0);\r\n\r\n     col = mix(col,vec4(1.0,0.8,0.5,1.0),smoothstep(1.5,0.0,abs(p.y)));\r\n     col = mix(col,vec4(1.0,1.0,1.0,1.0),smoothstep(0.1,0.0,abs(p.y)-0.05*Smooth1D(vec2(vec2(3.0*p.x)))-0.0125));\r\n     col += vec4(vec3(1.0,0.7,0.5*sin(TimeVar)+0.5)*texture2D(tex02,0.05*vec2(p.x\/p.y,0.05\/p.y+sign(p.y)*0.5*TimeVar)).rgb,1.0);\r\n     return col;\r\n}\r\n\r\nvec4 Scene04(in vec2 p,vec4 col)\r\n{\r\n     vec2 save1=p;\r\n\r\n     if( (TimeVar > 111.0 && TimeVar < 121.905) || (TimeVar > 132.750 && TimeVar < 135.7))p*=0.8;\r\n\r\n     \/\/ Moon\r\n     p*=1.8;\r\n     p+= vec2(-3.5,-2.5);\r\n     col= mix(col,\r\n     texture2D(tex02,p\/(10.0*cos(length(0.75*p))) + vec2(0.005*TimeVar))   \/\/ Rotating Texture\r\n     -vec4(vec3(0.7*smoothstep(0.7,0.0,length(p-vec2(0.7,0.0))-1.8)),1.0), \/\/ Darkside of the Moon !\r\n     0.55*smoothstep(0.005,0.0,length(p)-1.8));                            \/\/ Moon Mask\r\n     p-= vec2(-3.5,-2.5);\r\n     p*=0.5;\r\n\r\n     \/\/ Atmo Gradient\r\n     col += mix(vec4(0.9,0.4,0.5,1.0),vec4(0.9,0.9,0.8,1.0),smoothstep(1.5,0.0,p.y));\r\n\r\n     \/\/ Clouds\r\n     float Sky = texture2D(tex02,vec2(0.25*p.x\/(p.y-0.1),0.25\/(p.y-0.1) + 0.005*TimeVar)).x;\r\n     if(p.y>0.1)col += 0.75*Sky*smoothstep(0.0,0.5,p.y-0.1);\r\n\r\n     \/\/ Secondary Tower\r\n     p+= vec2(0.7,0.85);\r\n     col = mix(col,vec4(vec3(1.0 - 0.15*smoothstep(0.015,0.0,abs(p.x)))*(1.2-0.1*sign(p.x)),1.0) ,smoothstep(0.1,0.0,p.y-0.85\/abs(20.0*p.x)+0.5)*smoothstep(0.001,0.0,p.y-1.7));\r\n     p-= vec2(0.7,0.85);\r\n\r\n     if( abs(p.x) < 1.0 )\r\n     {\r\n         float CityHeight = 0.4;\r\n         float CityDensity = 30.0;\r\n         float CityGreebles = 1.5*CityDensity;\r\n         float CS1;\r\n         vec4  CCS1;\r\n\r\n         CS1 = smoothstep(0.01,0.0,p.y - CityHeight*Smooth1D(vec2(floor(CityDensity*p.x) + 12.7))\r\n                                       - 0.1*Smooth1D(vec2(floor(CityGreebles*p.x)       + 12.7))  - 0.5*cos(p.x) +0.45 );\r\n         CCS1 = vec4( vec3(0.9,0.7,0.7) + 0.7*smoothstep(0.9,0.0,Smooth1D(vec2(45.0*p.x))) - 0.4*texture2D(tex00,vec2(0.05,1.0)*p).xxx ,1.0);\r\n         col = mix(col,CCS1,CS1);\r\n     };\r\n\r\n     \/\/ Tower\r\n     vec3 MTColor = vec3(1.0 - 0.15*smoothstep(0.015,0.0,abs(p.x)))*(0.9-0.1*sign(p.x));          \/\/ Main Tower Basic Shading\r\n     MTColor     -= vec3(0.2,0.3,0.3)*smoothstep(0.01,0.0,abs(p.y-1.0)-0.1);                      \/\/ Main Tower Color Band\r\n     MTColor     -= vec3(0.3,0.3,0.3)*smoothstep(0.1,0.0,abs(p.y-0.45)-0.1);                      \/\/ Main Tower Lower-Levels Shadow\r\n     float MTMask = smoothstep(0.01,0.0,p.y-1.0\/abs(20.0*p.x)+0.5)*smoothstep(0.001,0.0,p.y-1.5); \/\/ Main Tower Mask\r\n     \/\/ Minitower 1\r\n     if(p.y<1.8)col = mix(col,vec4(vec3(1.0)*smoothstep(0.01,0.0,p.x),1.0),smoothstep(0.01,0.0,abs(p.x)));\r\n     \/\/ Minitower 2\r\n     if(p.y<1.7)col = mix(col,vec4(vec3(1.0)*smoothstep(0.01,0.0,p.x+0.025),1.0),smoothstep(0.01,0.0,abs(p.x+0.025)));\r\n     \/\/ Main Tower\r\n     col = mix(col, vec4(MTColor,1.0), MTMask);\r\n\r\n     \/\/ Upper Dish\r\n     vec3 ColorWindows = vec3(0.25,1.0,1.0);\r\n     vec3 UDColor  = vec3(1.0-0.40*smoothstep(0.3,0.0,p.y-p.x-0.45));\r\n     UDColor      -= smoothstep(0.01,0.0,Smooth1D(vec2(40.0*p.x + 11.1))-0.5)*smoothstep(0.005,0.0,abs(p.y - 0.65))*ColorWindows;\r\n     UDColor      -= smoothstep(0.01,0.0,Smooth1D(vec2(40.0*p.x + 22.2))-0.5)*smoothstep(0.005,0.0,abs(p.y - 0.63))*ColorWindows;\r\n     UDColor      -= smoothstep(0.01,0.0,Smooth1D(vec2(40.0*p.x + 33.3))-0.5)*smoothstep(0.005,0.0,abs(p.y - 0.56))*ColorWindows;\r\n     UDColor      -= smoothstep(0.01,0.0,Smooth1D(vec2(40.0*p.x + 44.4))-0.5)*smoothstep(0.005,0.0,abs(p.y - 0.51))*ColorWindows;\r\n     UDColor      -= smoothstep(0.005,0.0,abs(p.y - 0.1*clamp(sin(25.0*p.x - 1.5),0.4,0.6) - 0.55))*ColorWindows;\r\n     float UDMask  = smoothstep(0.01,0.0,length(p-vec2(0.0, -0.1))-0.8)*smoothstep(0.0,0.01,p.y-0.50);\r\n     col = mix(col, vec4(UDColor,1.0), UDMask);\r\n     \/\/ Lower Dish\r\n     vec3 LDColor  = vec3((0.7-0.3*sin(4.0*p.x)));\r\n     LDColor      -= smoothstep(0.005,0.0,abs(p.y + 0.1*clamp(sin((10.0*p.x\/(0.4*cos(3.14159*p.x))-2.5*TimeVar)),0.4,0.6) - 0.52))*ColorWindows;\r\n     float LDMask  = smoothstep(0.01,0.0,length(p-vec2(0.0,  1.2))-0.8)*smoothstep(0.01,0.0,p.y-0.48);\r\n     col = mix(col,vec4(LDColor,1.0),LDMask);\r\n\r\n     \/\/ Upper Dish Lower border\r\n     col += vec4(0.8,0.8,0.8,1.0)*smoothstep(0.005,0.0,abs(p.y-0.51))*smoothstep(0.001,0.0,abs(p.x)-0.52)*vec4(0.5+sin(-3.0*p.x));\r\n     \/\/ Upper Dish Sun Reflection\r\n     col+= vec4(1.0)*metaDiamond(p,vec2(-0.52,0.52),0.005);\r\n     \/\/ Main Tower Top Reflection\r\n     col+= vec4(1.0)*metaDiamond(p,vec2(-0.025,1.5),0.01);\r\n\r\n     \/\/ Shield Rings\r\n     float angle=0.005*sin(3.0*TimeVar); \/\/ Give the rings some weak precession, just because...\r\n     p+=vec2(0.0,-1.5);\r\n     p*=r2d( angle);                     \/\/ The Power is in the precession ! :D\r\n     float Ring1 = abs(length(vec2(0.25,2.0)*p)-0.2)-0.005;\r\n     col += vec4(0.25,0.25,0.25,1.0)*smoothstep(0.01,0.0,Ring1)\r\n     *smoothstep(0.0,0.05,(p.y+0.1));\r\n     col += vec4(0.5,0.5,0.5,1.0)*smoothstep(0.1,0.0,Ring1)\r\n     *smoothstep(0.0,0.2,(p.y+0.125));\r\n     p*=r2d(-angle);                     \/\/ Take The Power BACK ! WE THE PEOPLE !\r\n     p-=vec2(0.0,-1.5);\r\n\r\n     p+=vec2(0.0,-1.5);\r\n     p*=r2d(-angle);                     \/\/ Contra-rotating Precession !\r\n     float Ring2 = abs(length(vec2(0.25,2.0)*p)-0.5)-0.001;\r\n     col += vec4(0.25,0.25,0.25,1.0)*smoothstep(0.01,0.0,Ring2)\r\n     *smoothstep(0.0,0.05,(p.y+0.20));\r\n     col += vec4(0.5,0.5,0.5,1.0)*smoothstep(0.1,0.0,Ring2)\r\n     *smoothstep(0.0,0.2,(p.y+0.25));\r\n     p*=r2d( angle);\r\n     p-=vec2(0.0,-1.5);\r\n\r\n     \/\/ City Defence Drone\r\n     col+= vec4(1.0)*metaDiamond(p,vec2(0.5*Smooth1D(vec2(2.5*TimeVar\/10.0))-0.25,2.5*Smooth1D(vec2(2.0*TimeVar\/10.0))-1.25+1.5),0.005+0.005*Smooth1D(vec2(TimeVar)));\r\n     \/\/ Ring Surfer Drone\r\n     col+= vec4(1.0)*metaDiamond(p,vec2(2.0*cos( 1.0*TimeVar),0.25*sin(1.0*TimeVar) + 1.5),0.01+0.01*sin(TimeVar));\r\n\r\n     \/\/ Arch Tunnel\r\n     col = mix(col,vec4(0.5,0.5,0.5,1.0),smoothstep(0.01,0.0,abs(length(p-vec2(0.0,0.05))-0.145)-0.015));\r\n     col = mix(col,vec4(0.7,0.7,0.7,1.0)*Smooth1D(vec2(3.0*p.x))*smoothstep(0.5,0.0,abs(p.y-0.5*Smooth1D(vec2(7.5*p.x+254.1))))\r\n                  +vec4(vec3(0.7,0.5,0.5)*(0.9-0.2*texture2D(tex00,p).rgb),1.0)\r\n                  +vec4(0.8,0.8,0.8,1.0)*Smooth1D(vec2(5.0*p.x))*smoothstep(0.1,0.0,abs(p.y-0.15*Smooth1D(vec2(2.5*p.x+254.1)) - 0.1)),\r\n                  clamp(smoothstep(0.001,0.0,p.y-0.15*Smooth1D(vec2(2.5*p.x+254.1)) - 0.1)-smoothstep(0.01,0.0,length(p-vec2(0.0,0.05))-0.15),0.0,1.0));\r\n\r\n     \/\/ Main Tower Beacon\r\n     col += vec4(1.0,1.0,0.1,1.0)*metaDiamond(p,vec2(0.0,1.83),0.0080+0.01*clamp(sin(30.0*TimeVar),0.0,1.0));\r\n\r\n     p+=vec2( 1.5,-1.05);\r\n     \/\/ Star\r\n     col += metaDiamond(p,vec2(0.0),0.05);\r\n     col += vec4(1.0)*metaDiamond(r2d(3.14159\/4.0)*p,vec2(0.0),0.0125);\r\n     \/\/ Streak\r\n     col += vec4(0.25,0.25,0.25,1.0)*smoothstep(2.9,0.0,abs(p.x))*smoothstep(0.05,0.0,abs(p.y));\r\n     p-=vec2( 1.5,-1.05);\r\n\r\n     \/\/ Desert Ground\r\n     vec4 TexColor1=texture2D(tex02,0.2*vec2(p.x\/p.y,0.50\/p.y-TimeVar));\r\n     if(p.y<0.0)col = vec4(vec3(1.0,1.0,0.9)*(0.8-.3*TexColor1.rgb),1.0);\r\n\r\n     \/\/ Road\r\n     float Y = p.y;\r\n     float Road  = abs(p.x\/Y - 0.125*Smooth1D(vec2(0.5\/Y - TimeVar))        )-0.900;\r\n     float Line1 = abs(p.x\/Y - 0.125*Smooth1D(vec2(0.5\/Y - TimeVar)) + 0.03 )-0.012;\r\n     float Line2 = abs(p.x\/Y - 0.125*Smooth1D(vec2(0.5\/Y - TimeVar)) - 0.03 )-0.012;\r\n     float LineR = abs(p.x\/Y - 0.125*Smooth1D(vec2(0.5\/Y - TimeVar)) + 0.83 )-0.012;\r\n     float LineL = abs(p.x\/Y - 0.125*Smooth1D(vec2(0.5\/Y - TimeVar)) - 0.83 )-0.012;\r\n     if( p.y < 0.0 )\r\n     {\r\n         vec4 TexR = texture2D(tex00,0.2*vec2(p.x\/p.y,0.50\/p.y-TimeVar)).ggga;\r\n         vec4 RoadYellow = vec4(4.0,4.0,1.0,1.0);\r\n         \/\/ \"le ruban de goudron\" i.e. \"the road\", i.e. \"the black tar strip\".\r\n         col = mix(col,vec4(0.2,0.2,0.2,1.0)*(0.5+0.9*TexR),smoothstep(0.01,0.0,Road));\r\n         \/\/ Central strips\r\n         if( sin(15.0\/p.y - 30.0*TimeVar) > 0.7 )\r\n         col = mix(col,clamp(RoadYellow*TexR,0.0,1.0),smoothstep(0.01,0.0,Line1 ));\r\n         col = mix(col,clamp(RoadYellow*TexR,0.0,1.0),smoothstep(0.01,0.0,Line2 ));\r\n         \/\/ Side Strips\r\n         col = mix(col,clamp(vec4(2.0,2.0,2.0,1.0)*TexR,0.0,1.0),smoothstep(0.01,0.0,LineL ));\r\n         col = mix(col,clamp(vec4(2.0,2.0,2.0,1.0)*TexR,0.0,1.0),smoothstep(0.01,0.0,LineR ));\r\n         col += vec4(0.5)*smoothstep(1.4,0.0,abs(p.y));\r\n     };\r\n     \r\n     \/\/ Horizon dust\r\n     col += vec4(1.0,0.5,0.1,1.0)*smoothstep(0.025,0.0,abs(p.y));\r\n\r\n     p=save1;\r\n\r\n     if( (TimeVar > 111.0 && TimeVar < 121.905) || (TimeVar > 132.750 && TimeVar < 135.7) )\r\n     {\r\n         \/\/ The secure glass canopy...\r\n         col *= vec4(0.4,0.1,0.1,1.0);\r\n         \/\/ Chevron Tech-Glass Lines\r\n         float Chevrons = 0.1*clamp(cos(4.0*p.x + TimeVar),0.0,0.5);\r\n         col += vec4(0.5,0.5,0.5,1.0)*smoothstep(0.005,0.0,abs(p.y - 0.06*p.x*p.x -Chevrons - 2.00) - 0.008);\r\n         Chevrons = 0.1*clamp(cos(4.0*p.x - TimeVar),0.0,0.5);\r\n         col += vec4(0.5,0.5,0.5,1.0)*smoothstep(0.005,0.0,abs(p.y - 0.05*p.x*p.x -Chevrons - 0.05) - 0.008);\r\n         Chevrons = 0.1*clamp(cos(4.0*p.x + TimeVar),0.0,0.5);\r\n         col += vec4(0.5,0.5,0.5,1.0)*smoothstep(0.005,0.0,abs(p.y + 0.06*p.x*p.x -Chevrons + 2.00) - 0.008);\r\n\r\n         \/\/ Alien Head !\r\n         \/\/ Making The Eyes Of Evil !\r\n         p*=(1.0+0.2*Smooth1D(vec2(0.5*TimeVar))); \/\/ head goes back and forth on random, because total psycho\r\n         p += vec2(0.0, 1.0);\r\n         float EyeR = smoothstep(0.1,0.0,length(p-vec2( 0.5,1.5))-0.10) - smoothstep(0.01,0.0,length(p-vec2( 0.5,1.5))-0.11+0.02*Smooth1D(vec2(TimeVar)));\r\n         float EyeL = smoothstep(0.1,0.0,length(p-vec2(-0.5,1.5))-0.10) - smoothstep(0.01,0.0,length(p-vec2(-0.5,1.5))-0.11+0.02*Smooth1D(vec2(TimeVar)));\r\n         float Cranium = 0.15*smoothstep(0.7,0.0,length(p-vec2(0.0,2.5))-0.5); \/\/ Insignificant deformation near your CRANIUM ! If you get this, you're just KEWLER !\r\n         Cranium += 0.2*clamp(smoothstep(0.2,0.0,length(p-vec2(0.0,2.3))-0.9)-smoothstep(0.4,0.0,length(p-vec2(0.0,2.1))-0.85),0.0,1.0);\r\n         col += (1.0-0.5*Smooth1D(vec2(0.5*TimeVar)))*Cranium;\r\n         p -= vec2(0.0, 1.0);\r\n         p\/=(1.0+0.2*Smooth1D(vec2(0.5*TimeVar)));\r\n         \/\/ He Doesn't Blink !\r\n         col += vec4(1.0,0.9,0.0,1.0)*(EyeR + EyeL)*smoothstep(0.01,0.0,p.y - abs((0.5+0.25*Smooth1D(vec2(TimeVar)))*p.x) - 0.2);\r\n\r\n         p*=0.75; \/\/ Zoom a bit\r\n\r\n         \/\/ Improvising creepy alien hands using just maths and imagination... :)\r\n         float Finger;\r\n         float FinShade;\r\n         float FingerRef;\r\n\r\n         p.x = abs(p.x);\r\n         p += vec2(-1.5,2.5);\r\n\r\n         p*=r2d(2.7); \/\/ Arbirary Hands Angle...\r\n         \/\/ Fingers Reflection In The Canopy\r\n         for( float a = 0.0; a < 3.0; a++ ) \/\/ Apparently It's A Surviving Trydactil ! ;)\r\n         {\r\n              p*= r2d(a*0.3);\r\n              p += vec2( -0.075*a-0.02*Smooth1D(vec2(a*0.59+TimeVar)), 1.0 + 0.05*sin(TimeVar));\r\n              p+=vec2( 0.025, 0.025);\r\n              FingerRef= max(smoothstep(0.0,0.01,1.5-p.y)*smoothstep(0.0,0.01,p.y)*smoothstep(0.025,0.0,abs(p.x-0.05*tan(sin(3.0*p.y)))-0.05-0.01*sin(20.0*p.y)),smoothstep(0.025,0.0,length(p)-0.05));\r\n              p-=vec2( 0.025, 0.025);\r\n              col = mix(col,vec4(1.0),0.5*FingerRef);\r\n              p += vec2( 0.075*a+0.02*Smooth1D(vec2(a*0.59+TimeVar)),-1.0 - 0.05*sin(TimeVar));\r\n              p*=r2d(-a*0.3);\r\n         };\r\n\r\n         \/\/ Awful truth that Alan Hynek and Jacques Vall\u00e9e never told you :\r\n         \/\/ You can make perfectly cool alien fingers with just tan(sin(x)) and circles !\r\n         \/\/ Another awful truth : Aliens are probably abysmal piano players eventhough they have super long fingers !\r\n         \/\/ Last question : why are alien fingers so long, when they don't have nostrils to pick ?!\r\n         for( float a = 0.0; a < 3.0; a++ )\r\n         {\r\n              p*= r2d(a*0.3);\r\n              p += vec2(-0.075*a-0.02*Smooth1D(vec2(a*0.59+TimeVar)), 1.0 + 0.05*sin(TimeVar));\r\n              Finger   = max(smoothstep(0.0,0.01,1.5-p.y)*smoothstep(0.0,0.01,p.y)*smoothstep(0.01,0.0,abs(p.x-0.05*tan(sin(3.0*p.y)))-0.05-0.01*sin(20.0*p.y)),smoothstep(0.01,0.0,length(p)-0.05));\r\n              FinShade   = 0.75*max(smoothstep(0.0,0.01,1.5-p.y)\r\n                              *smoothstep(0.0,0.01,p.y)\r\n                              *smoothstep(0.025,0.0,abs(p.x-0.05*tan(sin(3.0*p.y)))-0.02-0.01*sin(20.0*p.y)),\r\n\r\n                               smoothstep(0.025,0.0,length(p)-0.02));\r\n              col = mix(col,vec4(1.0),Finger);\r\n              col = mix(col,vec4(0.5,0.5,0.5,1.0),FinShade);\r\n              p += vec2( 0.075*a+0.02*Smooth1D(vec2(a*0.59+TimeVar)),-1.0 - 0.05*sin(TimeVar));\r\n              p*=r2d(-a*0.3);\r\n         };\r\n     };\r\n     col *= vec4(1.0,0.7,0.5,1.0);\r\n     return col;\r\n}\r\nvec4 Nebula01(in vec2 p,vec4 col)\r\n{\r\n     p*=10.0;\r\n     vec4 BufferNeb = col;\r\n     \/\/ Scroll To The Right.\r\n     float Speed =-0.5*TimeVar;\r\n     \/\/ Rotate Randomly\r\n     float RotationNeb = -PI;\r\n     p*=r2d(RotationNeb);\r\n     \/\/ duplicating p for later use.\r\n     vec2 save01 = p;\r\n     \/\/ Where are we ?!\r\n     vec2 ScrollPos = p + vec2(Speed,0.0);\r\n     \/\/ Domain Warping Mr Sulu !\r\n     p = dw3(ScrollPos);\r\n     \/\/ Pilars of Creation Color Scheme !\r\n     vec4 BGC1 = vec4(0.2,0.2,0.3,1.0);\r\n     vec4 BGC2 = vec4(0.1,0.7,1.0,1.0);\r\n     vec4 MCC1 = vec4(1.0,0.5,0.2,1.0);\r\n     vec4 DDC1 = vec4(0.0,1.0,1.0,1.0);\r\n     vec4 CK01 = vec4(1.0);\r\n     \/\/ BG Nebula\r\n     BufferNeb = mix(BGC1,BGC2,0.5*s(7.0,0.0,abs(p.y + 1.5*Smooth1D(vec2(0.05*ScrollPos))-5.0)-10.0*Smooth1D(vec2(0.05*p.x))));\r\n     \/\/ Get 4 Cloud Types\r\n     float Neb1 = p.y - 2.0*Smooth1D(vec2(0.05*p.x+ 123.1));\r\n     float Neb2 = p.y - 3.0*Smooth1D(vec2(0.10*p.x+ 456.2));\r\n     float Neb3 = p.y - 1.0*Smooth1D(vec2(0.20*p.x+ 789.3) + 0.5);\r\n     float Neb4 = p.y - 1.0*Smooth1D(vec2(0.20*p.x+ 987.4) + 0.5);\r\n     \/\/ Lighter Nebula Ribbon\r\n     BufferNeb+=vec4(0.5*texture2D(tex01,0.005*(p)).rgb,1.0)*s(15.0,0.0,abs(Neb1))*s(0.0,5.0,Neb2);\r\n     \/\/ Main Clouds Thin Highlight...\r\n     BufferNeb+= Smooth1D(vec2(0.01*p.x))*MCC1*vec4(vec3(Smooth1D(vec2(0.1*p.x))),1.0)*s(0.5,0.0,Neb3                              )*s(0.0,0.5,Neb4 + 3.0*Smooth1D(vec2(0.5*p.x)));\r\n     BufferNeb+= Smooth1D(vec2(0.01*p.x))*MCC1*vec4(vec3(Smooth1D(vec2(0.1*p.x))),1.0)*s(0.5,0.0,Neb3 + 2.5*Smooth1D(vec2(0.5*p.x)))*s(0.0,0.5,Neb4 + 3.0*Smooth1D(vec2(0.5*p.x)));\r\n     \/\/ Dark Dust Cloud Ribbon...\r\n     BufferNeb += texture2D(tex00,0.0005*p).xxxx*s(5.0,0.0,abs(Neb1-5.0)-1.0+5.0*Smooth1D(vec2(0.1*p.x)));\r\n\r\n     p = save01;\r\n     p+=vec2(Speed,0.0);\r\n     vec2 fr = fract(0.05*p);\r\n     vec2 fl = floor(0.05*p);\r\n     if( fl.y==-1.0 && Smooth1D(vec2(fl.x*fl.y)) > 0.75 )BufferNeb+=metaDiamond(r2d(RotationNeb)*fr,r2d(RotationNeb)*vec2(0.5,0.5),0.01+0.01*abs(sin(0.5*TimeVar)))*smoothstep(0.2,0.0,length(fr-vec2(0.5))-0.1);\r\n\r\n     p = save01;\r\n     p+=vec2(Speed,0.0);\r\n     vec2 b = fract(3.0*p);\r\n     p = floor(3.0*p);\r\n     if( (Smooth1D(vec2(p.x*p.y)) > 0.95) && s(0.0,1.5,abs(Neb1) - 0.5) > 0.0)\r\n         BufferNeb += clamp(vec4(0.99)*pow((50.0 - 40.0*Smooth1D(vec2(p.x+p.y)))*length(b-vec2(0.8*Smooth1D(vec2(p.x*p.y)),0.80*Smooth1D(vec2(p.x*p.y+258.2)))),-2.5),0.0,1.0);\r\n     \/\/ Color Keying\r\n     BufferNeb *= CK01;\r\n     return vec4(BufferNeb.xyz,1.0);\r\n}\r\n\r\nvec4 Scene02(in vec2 p,vec4 col)\r\n{\r\n     p*=1.5;\r\n     vec4 BufferScene02 = col;\r\n     p.y+=0.75;\r\n     vec2 save01=p;\r\n     p.y = abs(p.y+0.5);\r\n     BufferScene02 = Nebula01(p+vec2(0.0,-0.5),col);\r\n     p.y-=0.08;\r\n     BufferScene02 = mix(BufferScene02,vec4(0.7)*Nebula01(vec2(-p.x,p.y),col) + 0.5*texture2D(tex02,0.4*(p + vec2(0.295*TimeVar,0.0))),s(0.0,0.01,p.y-3.5*clamp(abs(sin(1.03*p.x + 0.3*TimeVar)),0.0,2.5)+0.75));\r\n     p.y-=0.08;\r\n     BufferScene02 = mix(BufferScene02,vec4(0.0,0.025,0.1,1.0)+GetColorSpot(p+vec2(TimeVar + 300.0,0.0))*pow(0.15*length(p - vec2(0.0,5.0)),2.0)*(0.5+0.5*texture2D(tex02,0.4*(p + vec2(0.3*TimeVar,0.0)))),s(0.0,0.01,p.y-3.5*clamp(abs(sin(1.00*p.x + 0.3*TimeVar)),0.0,2.5)+0.75));\r\n     p = save01;\r\n     if(p.y<-0.5)BufferScene02 *= 0.5;\r\n     if(p.y<-0.5)BufferScene02 += 0.5*GetColorSpot(p+vec2(TimeVar + 300.0,0.0))*texture2D(tex02,0.5*vec2(p.x\/p.y - 0.53*TimeVar,1.0\/p.y));\r\n     return BufferScene02;\r\n}\r\n\r\nvec4 Bird(vec2 p, float randSeed)\r\n{\r\n     p*= 0.20;\r\n     p+=vec2(50.0*Smooth1D(vec2(randSeed + 1.234 + 0.125*TimeVar)) - 25.0,10.0*Smooth1D(vec2(randSeed + 456.7 + 0.125*TimeVar))- 5.0);\r\n     p*= 1.0+0.5*Smooth1D(vec2(randSeed + 0.25*TimeVar));\r\n     if( s(0.01,0.0,length(p)-0.5) > 0.0)\r\n     {\r\n         p.x = abs(p.x);\r\n         p*=r2d(0.25*3.14159*Smooth1D(vec2(randSeed))*sin(randSeed + 5.0*TimeVar));\r\n         return 0.25*vec4(1.0)*s(0.001,0.0,abs(p.y-p.x)-0.04)*s(0.01,0.0,abs(p.x)-0.25);\r\n     }else{\r\n         return vec4(0.0);\r\n     };\r\n}\r\n\r\nvec4 Scene03(in vec2 p,vec4 col)\r\n{\r\n     \/\/ Shoryuuuuuuken !\r\n     p.y += 2.0;\r\n\r\n     \/\/ Camera back again !\r\n     p*=7.0;\r\n\r\n     \/\/ Constant shifts in zoom\r\n     p *= 1.0+0.5*Smooth1D(vec2(0.1*TimeVar));\r\n\r\n     vec2 save01 = p;\r\n\r\n     \/\/ Atmo Gradient\r\n     col = mix(vec4(1.0,1.0,0.5,1.0),vec4(0.8,0.1,0.1,1.0),s(0.0,10.0,sqrt(p.y-15.0)));\r\n\r\n     p +=-vec2(0.0,35.0);\r\n     p*=r2d(0.05*TimeVar);\r\n     p += vec2(5.0*Smooth1D(vec2(0.15*p.y)) - 2.5,0.0);\r\n     \/\/ Liotrao's Chromosphere\r\n     col += 0.5*vec4(1.0,0.75,0.4,1.0)*smoothstep(10.0,0.0,length(p)-45.0);\r\n     col += vec4(1.0,0.75,0.4,1.0)*smoothstep(2.0,0.0,length(p)-45.0);\r\n\r\n     p= save01;\r\n\r\n     \/\/ Solar Eruptions\r\n     p.y -=35.0;\r\n     col += 0.05\r\n            *clamp(TimeVar,0.0,EclipseDelay)\r\n            *vec4(vec3(0.35),1.0)\r\n            *texture2D(tex01,5.0*p\/dot(p,p) + 0.001*TimeVar)\r\n            *s(30.0,0.0,abs(length(p)-50.0)-1.0)\r\n            ;\r\n     p.y +=35.0;\r\n\r\n     \/\/ Liotrao's Disk\r\n     col = mix(col,vec4(1.0,0.2,0.1,1.0),smoothstep(1.0,0.0,length(p-vec2(0.0,35.0))-45.0));\r\n\r\n     \/\/ Photosphere Gradient\r\n     col += vec4(0.5*smoothstep(30.0,0.0,length(p-vec2(0.0,35.0))-30.0)*vec3(1.0,1.0,1.0),1.0);\r\n\r\n     \/\/ \"Chromospheric Cloud-Hacking\"...\r\n     \/\/ Moebius-Transform-like Pattern. Warning : Skakespearian-CodeMonkey Mode activated !\r\n     if( TimeVar > EclipseDelay )\r\n     {\r\n         p.y -=35.0;\r\n         p*=r2d(TimeVar + Smooth1D(vec2(TimeVar))*0.07*length(p));\r\n         col += 1.0\r\n               *vec4(1.0,1.0,1.0,1.0)\r\n               *texture2D(tex00,r2d(PI\/2.0)*0.15*p\/dot(p,p) + 0.015*TimeVar)\r\n               *s(10.0,0.0,length(p)-30.0)\r\n               *smoothstep(0.5,0.0,length(p)-45.0)\r\n               ;\r\n         p*=r2d(-TimeVar - Smooth1D(vec2(TimeVar))*0.07*length(p));\r\n         p.y +=35.0;\r\n     };\r\n\r\n     \/\/ Eclipsing Moon. (\"DAMMIT, MOON MOON !\")\r\n     p -= vec2(0.0,35.0);\r\n     p*=r2d(-PI\/4.0);\r\n     p -= vec2(-50.0 + (50.0\/EclipseDelay)*clamp(TimeVar,0.0,EclipseDelay),0.0);\r\n     col = mix(col,vec4(0.2,0.1,0.1,1.0),smoothstep(0.5,0.0,length(p)-15.0));\r\n     p += vec2(-50.0 + (50.0\/EclipseDelay)*clamp(TimeVar,0.0,EclipseDelay),0.0);\r\n     p*=r2d(PI\/4.0);\r\n     p += vec2(0.0,35.0);\r\n\r\n     \/\/ Clouds On Draxacar\r\n     p+=vec2(0.0, 10.0);\r\n     if(p.y > 7.0)col += 0.5*texture2D(tex01,vec2(0.010*p.x\/(p.y - 7.0),1.0\/(p.y - 7.0) + 0.001*TimeVar)).xxxx*s(0.0,10.0,p.y - 7.0);\r\n     p+=vec2(0.0,-10.0);\r\n\r\n     p= save01;\r\n\r\n     \/\/ Mountains\r\n\r\n     \/\/ First Mountain Range \"Ridge 1\" (the farthest)\r\n     float Ridge1 = p.y - 10.0*Smooth1D(vec2(58.1+0.025*p.x + 0.0*TimeVar))\r\n                        -  2.0*Smooth1D(vec2(58.1+0.200*p.x + 0.0*TimeVar))\r\n                        -  0.5*Smooth1D(vec2(58.1+0.900*p.x + 0.0*TimeVar))\r\n                        +0.0005*p.x*p.x - 10.0;\r\n\r\n     \/\/ BaseColor (rc : Ridge Color)\r\n     vec4 rc1 = vec4(0.9,0.5,0.5,1.0)+vec4(vec3(0.5,0.1,0.1)*s(0.5,0.0,abs(Ridge1)-0.7*Smooth1D(vec2(1.0*p.x)))*Smooth1D(vec2(0.25*p.x)),1.0);\r\n     \/\/ Rock Texture\r\n     vec4 rc2 = vec4(2.0*texture2D(tex00,r2d(PI\/6.0)*0.015*p).xyz,1.0);\r\n     \/\/ Colorize Rock Texture\r\n     vec4 rc3 = vec4(0.7,0.25,0.05,1.0);\r\n     \/\/ Ridge Profile\r\n     vec4 rc4 = vec4(1.0)*abs(p.y-10.0*Smooth1D(vec2(58.1+0.025*p.x))- 2.0*Smooth1D(vec2(58.1+0.200*p.x))-11.0);\r\n     \/\/ Radial Mountains Shading (2D fake-perspective trick)\r\n     vec4 rc5 =vec4(1.0)*s(0.0,2.0,fract(-0.025*(abs(0.75*p.x)+3.0)+0.05*Smooth1D(vec2(p.y))-0.0015*abs(0.005*p.x*p.x + 15.0)*p.y));\r\n\r\n     \/\/ Result\r\n     vec4 rcr = rc1+rc2*rc3*s(4.5,0.0,rc4*rc5+2.0);\r\n\r\n     \/\/ Distant Mountains\r\n     col = mix(col,rcr,s(0.01,0.0,Ridge1));\r\n\r\n     float RadialRidges1 = fract(-0.025*(abs(0.75*p.x)+3.0)+0.05*Smooth1D(vec2(p.y))-0.0015*abs(0.005*p.x*p.x + 15.0)*p.y);\r\n\r\n     \/\/ Intensifying The Radial Ridges\r\n     col += vec4(0.25,0.20,0.025,1.0)*s(0.50,0.0,RadialRidges1)*s(0.1,0.0,Ridge1);\r\n     col += vec4(0.50,0.10,0.100,1.0)*s(0.45,0.0,RadialRidges1)*s(0.1,0.0,Ridge1);\r\n\r\n     \/\/ Second Mountain Range (the closest)\r\n     float Ridge2 = p.y - 10.0*Smooth1D(vec2(0.025*p.x))\r\n                        -  2.0*Smooth1D(vec2(0.200*p.x))\r\n                        -  0.5*Smooth1D(vec2(0.900*p.x))\r\n                        +0.0005*p.x*p.x -  2.0;\r\n\r\n     \/\/ BaseColor (rc : Ridge Color)\r\n     rc1 = vec4(0.5,0.25,0.3,1.0)+vec4(0.5,0.1,0.1,1.0)*s(1.5,0.0,abs(Ridge2)-1.7*Smooth1D(vec2(1.0*p.x)))*Smooth1D(vec2(0.25*p.x));\r\n     \/\/ Rock Texture\r\n     rc2 = vec4(2.2*texture2D(tex00,r2d(PI\/6.0)*0.009*p).xyz,1.0);\r\n     \/\/ Colorize Rock Texture\r\n     rc3 = vec4(0.7,0.25,0.05,1.0);\r\n     \/\/ Ridge Profile\r\n     rc4 = vec4(1.0)*abs(p.y-10.0*Smooth1D(vec2(0.025*p.x + 0.0*TimeVar))- 2.0*Smooth1D(vec2(0.200*p.x + 0.0*TimeVar))-2.0);\r\n     \/\/ Radial Mountains Shading (2D fake-perspective trick)\r\n     rc5 = vec4(1.0)*s(0.0,2.0 + Smooth1D(vec2(1.0*TimeVar)),fract(-0.02*(abs(0.75*p.x)+3.0)+0.05*Smooth1D(vec2(p.y))-0.0015*abs(0.005*p.x*p.x)*p.y));\r\n\r\n     \/\/ Result\r\n     rcr = rc1+rc2*rc3*s(5.5,0.0,rc4*rc5+3.0);\r\n\r\n     \/\/ Closest Mountains\r\n     col = mix(col, 0.6*rcr, s(0.01,0.0, Ridge2));\r\n\r\n     float RadialRidges2 = fract(-0.02*(abs(0.75*p.x)+3.0)+0.05*Smooth1D(vec2(p.y))-0.0015*abs(0.005*p.x*p.x)*p.y);\r\n     \/\/ Intensifying The Radial Ridges\r\n     col += 0.7*vec4(0.25,0.2,0.025,1.0)*s(0.50,0.0,RadialRidges2)*s(0.1,0.0,Ridge2);\r\n     col += 0.7*vec4(0.50,0.1,0.100,1.0)*s(0.45,0.0,RadialRidges2)*s(0.1,0.0,Ridge2);\r\n\r\n     p*= 0.75;\r\n\r\n     \/\/ Eclipse Lighting\r\n     col = vec4(mix(col.xyz,0.25*col.xyz*col.xxx,clamp(TimeVar,0.0,EclipseDelay)\/EclipseDelay),1.0);\r\n\r\n     \/\/ Third Tower\r\n     p.x += -50.0;\r\n     vec4 ColorTower3 = vec4(0.5,0.2,0.1,1.0)\r\n                      + abs(3.0*cos(10.0*p.x+ 5.0*p.y))\r\n                       *abs(0.4*cos( 2.0*p.y+ 0.5*p.x))\r\n                       *(1.0-1.5*abs(0.25*p.x));\r\n     col  = mix(col,ColorTower3,s(0.5,0.0,p.y-20.0*exp(-abs(0.5*p.x + 0.080*sin(4.0*p.y+1.5))) + 10.0));\r\n\r\n     \/\/ Top Beacon\r\n     if( TimeVar> EclipseDelay)\r\n     {\r\n         col += vec4(1.0,0.25,0.25,1.0)*metaDiamond(p,vec2(0.0,10.0),0.75+0.25*sin(30.0*TimeVar + 1.1));\r\n     }else{\r\n         col += clamp(0.5-Smooth1D(vec2(2.0*TimeVar)),0.0,1.0)*vec4(1.0,0.5,0.5,1.0)*metaDiamond(p,vec2(0.0,10.0),1.0);\r\n     }\r\n     p.x -= -50.0;\r\n\r\n     \/\/ Left Tower\r\n     p.x -= 5.0;\r\n     vec4 ColorTowerLeft = vec4(0.5,0.2,0.1,1.0)\r\n                         + abs(3.0*cos(10.0*p.x+5.0*p.y))\r\n                          *abs(0.4*cos(2.0*p.y+0.5*p.x))\r\n                          *(1.0-1.5*abs(0.25*p.x));\r\n     col  = mix(col,ColorTowerLeft,s(0.5,0.0,p.y-20.0*exp(-abs(0.5*p.x + 0.080*sin(4.0*p.y+1.5))) + 10.0));\r\n\r\n     if( TimeVar > EclipseDelay)\r\n     {\r\n         col += vec4(1.0,0.25,0.25,1.0)*metaDiamond(p,vec2(0.0,10.0),0.75+0.25*sin(30.0*TimeVar + 1.1));\r\n     }else{\r\n         col += clamp(0.5-Smooth1D(vec2(123.4+2.0*TimeVar)),0.0,1.0)*vec4(1.0,0.5,0.5,1.0)*metaDiamond(p,vec2(0.0,10.0),1.0);\r\n     }\r\n     p.x += 5.0;\r\n\r\n     \/\/ Right Tower\r\n     p.x -= 35.0;\r\n     vec4 ColorTowerRight = vec4(0.5,0.2,0.1,1.0)\r\n                          + abs(3.0*cos(10.0*p.x+5.0*p.y))\r\n                           *abs(0.4*cos(2.0*p.y-0.5*p.x))\r\n                           *(1.0-1.5*abs(0.25*p.x));\r\n     col  = mix(col,ColorTowerRight,s(0.5,0.0,p.y-20.0*exp(-abs(0.5*p.x + 0.080*sin(4.0*p.y+1.5))) + 10.0));\r\n\r\n     if( TimeVar > EclipseDelay)\r\n     {\r\n         col += vec4(1.0,0.25,0.25,1.0)*metaDiamond(p,vec2(0.0,10.0),0.75+0.25*sin(30.0*TimeVar));\r\n     }else{\r\n         col += clamp(0.5-Smooth1D(vec2(432.1+2.0*TimeVar)),0.0,1.0)*vec4(1.0,0.5,0.5,1.0)*metaDiamond(p,vec2(0.0,10.0),1.0);\r\n     }\r\n     p.x += 35.0;\r\n\r\n     \/\/ Dome of Xool (I blame Howard and Conan the Barbarian for this part)\r\n     p.y -= 3.0;\r\n     vec4 ColorDomeOfDoom = vec4(0.5,0.2,0.1,1.0);\r\n     ColorDomeOfDoom += 2.0*abs(1.0*cos(7.5*p.x+3.25*p.y))*abs(0.4*cos(2.0*p.y+1.1*p.x))*(1.0-s(0.,0.80,length(0.2*(p- vec2(20.0,-8.0)))-1.));\r\n     ColorDomeOfDoom += vec4(0.25,0.1,0.1,1.0)*s(0.2,0.0,abs(length(0.2*(p- vec2(20.0,-8.0)))-1.7)-0.5);\r\n     col = mix(col,ColorDomeOfDoom, s(0.01,0.0,length(p - vec2(20.0,-8.0))-8.5));\r\n     \/\/ Dome-Shield Still Holding Strong After Seven Million Years ! Now, THAT'S engineering !\r\n     col += 0.25*vec4(1.0,0.8,0.5,1.0)*s(1.25,0.0,abs(length(p - vec2(20.0,-8.0))-10.0)-0.15*sin(5.0*atan(p.y+8.0,p.x-20.0) + 10.0*TimeVar));\r\n     col += 0.25*vec4(1.0,0.8,0.5,1.0)*s(0.15,0.0,abs(length(p - vec2(20.0,-8.0))-10.0)-0.03*sin(5.0*atan(p.y+8.0,p.x-20.0) - 10.0*TimeVar));\r\n     col += 0.50*abs(sin(TimeVar))*vec4(1.0,0.8,0.5,1.0)*s(0.15,0.0,length(p - vec2(20.0,-8.0))-10.0);\r\n     p.y += 3.0;\r\n\r\n     p*= 1.0\/0.75;\r\n\r\n     \/\/ Birds, 40 of them !\r\n     if( abs(p.y-10.0)<20.0) for(float g=0.0;g<40.0;g++)col += Bird(p,100.5 + 54.321*g);\r\n\r\n     \/\/ Rows Of Trees\r\n     if( p.y < 2.0 )\r\n     {\r\n         for( float i = 0.0; i< 10.0; i ++)\r\n         {\r\n              p = 1.0*save01;\r\n              p = dw0(0.55*(p+vec2((i + 0.5)*1.0*TimeVar + i*54.21,i*5.0)));\r\n              col = mix(col,(1.0-0.25*clamp(TimeVar,0.0,EclipseDelay)\/EclipseDelay)*vec4(0.3,0.675,0.4,1.0)*texture2D(tex00,0.001*p),s(0.5,0.0,p.y - (1.0 - 0.01*i)*Smooth1D(vec2(10.0*p.x + i))));\r\n         };\r\n     };\r\n\r\n     p= save01;\r\n\r\n     \/\/ Haze In The Distance\r\n     col += vec4(0.25,0.25,0.25,1.0)*s(20.0,0.0,abs(p.y));\r\n     return col;\r\n}\r\n\r\nvoid main(void)\r\n{\r\n     vec2 p = vec2( (gl_FragCoord.x - iResolution.x\/2.0)\/iResolution.y,gl_FragCoord.y\/iResolution.y);\r\n\r\n     p *= 2.0;\r\n     vec2 a = p;\r\n     vec2 b = p;\r\n     TimeVar = mod(1.0*iTime + 0.0,165.343);\r\n     vec4 col = vec4(0.0,0.0,0.0,1.0);\r\n\r\n         vec4 ColorTxt = vec4(1.0,0.0,0.0,1.0);\r\n         ColorTxt     += vec4(1.0,0.5,0.1,1.0)*clamp(sin(15.0*(p.x+p.y) - 10.0*TimeVar),0.0,1.0);\r\n         \/\/ Default Strings : FRENCH !\r\n         int Title01=0,Title02=1,Title03=2,Title04=3,Tagline01=4,Tagline02=5,Invitation=6,Epita1=14,Epita2=15,Epita3=16,Epita4=17,Epita5=18;\r\n         \/\/ ...OR IN ENGLISH PLEASE !\r\n         if( !LANG )Title01=7,Title02=8,Title03=9,Title04=10,Tagline01=11,Tagline02=12,Invitation=13,Epita1=19,Epita2=20,Epita3=21,Epita4=22,Epita5=23;\r\n\r\n     if( TimeVar<57.0 || TimeVar>135.70 )\r\n     {\r\n\r\n         \/\/ Vertical Scroller\r\n         float AltitudeHorizon = -3.5;\r\n         p += vec2(0.0,clamp((AltitudeHorizon\/VScrollerLength)*TimeVar,AltitudeHorizon,0.0));\r\n\r\n         \/\/ Starfield\r\n         p*=r2d(5.5);\r\n         b = fract(25.0*p);\r\n         p = floor(25.0*p);\r\n         if( Smooth1D(vec2(p.x*p.y))>0.9)\r\n         {\r\n             float Star = clamp(Smooth1D(vec2(p.x+p.y))*pow(20.0*length(b-vec2(0.5*Smooth1D(vec2(p.x+ p.y))-0.25,0.5*Smooth1D(vec2(p.x+ p.y+258.2))-0.25) - vec2(0.5,0.5)),-2.0),0.0,1.0);\r\n             col = vec4(vec3(Star),1.0);\r\n         };\r\n\r\n         p = a;\r\n         p += vec2(0.0,clamp((AltitudeHorizon\/VScrollerLength)*TimeVar,AltitudeHorizon,0.0));\r\n\r\n         \/\/ BG nebula\r\n         vec2 q = dw1(p);\r\n         col += vec4(vec3(0.45,0.0,0.0)*smoothstep(0.500,0.0,abs(q.y + 0.3*q.x) - 0.1*Smooth1D(vec2(5.0*q.x))),1.0);\r\n         q*=r2d(-PI\/3.);\r\n         col += vec4(0.5,0.0,0.0,1.0)*smoothstep(1.0,0.0,abs(q.y + 0.3*q.x) - 0.25*Smooth1D(vec2(3.0*q.x)) - 0.05);\r\n         col -= vec4(0.5,0.0,0.0,0.0)*smoothstep(0.2,0.0,abs(q.y + 0.3*q.x) - 0.25*Smooth1D(vec2(1.0*q.x)) - 0.01);\r\n         col = mix(col,vec4(0.9,0.7,0.7,1.0),Smooth1D(vec2(5.0*q.y))*smoothstep(0.01,0.0,abs(q.y + 0.3*q.x - 0.25*Smooth1D(vec2(1.0*q.x)) - 0.1)));\r\n         col = mix(col,vec4(0.9,0.7,0.7,1.0),Smooth1D(vec2(5.0*q.y))*smoothstep(0.01,0.0,abs(q.y + 0.3*q.x + 0.25*Smooth1D(vec2(1.0*q.x)) + 0.1)));\r\n         q*=r2d( PI\/3.);\r\n\r\n         \/\/ Atmo\r\n         col = mix(col,vec4(0.90,0.00,0.00,1.0),smoothstep(2.0,0.0,    p.y + 2.8)       );\r\n         col = mix(col,vec4(0.99,0.50,0.00,1.0),smoothstep(3.0,0.0,abs(p.y + 3.9) - 0.5));\r\n         col = mix(col,vec4(1.00,0.70,0.40,1.0),smoothstep(0.5,0.0,abs(p.y + 2.9) - 0.1));\r\n\r\n         \/\/ Planets\r\n         p += vec2(-0.5,0.0);\r\n         p*=r2d(PI\/16.0);\r\n         float Planete01 = smoothstep(0.01,0.0,length(p - vec2(0.0,0.0)) - 0.5);\r\n         float T1 = smoothstep(0.3,0.0,length(p - vec2(-0.3,0.0)) - 0.4);\r\n         col = mix(col,vec4(T1*(vec3(0.99,0.5,0.2) + 0.25*texture2D(tex02,0.5*vec2(3.*(vec2(0.1,0.5)*p\/cos(length(1.75*p)))) + vec2(0.02*TimeVar,0.0)).xxx),1.0),Planete01);\r\n         if(p.y<0.0)col = mix(col,vec4(vec3(1.0,0.7,0.3),1.0),0.85*smoothstep(0.15,0.0,abs(length(vec2(1.0,64.0)*p)-1.25)-0.2));\r\n         if(p.y>0.0)col = mix(col,vec4(vec3(1.0,0.7,0.3),1.0),0.85*smoothstep(0.15,0.0,abs(length(vec2(1.0,64.0)*p)-1.25)-0.2)*smoothstep(0.0,0.01,length(p) - 0.5));\r\n         \/\/ Satellite\r\n         col = mix(col,vec4(0.1,0.1,0.1,1.0)+vec4(0.7,0.5,0.2,1.0)*smoothstep(0.05,0.0,length(p - vec2(-0.99,0.1)) - 0.025),smoothstep(0.01,0.0,length(p - vec2(-0.95,0.1)) - 0.025));\r\n         p*=r2d(-PI\/16.0);\r\n         p -= vec2(-0.5,0.0);\r\n\r\n         p += vec2(0.5,-1.0);\r\n         p*=r2d(PI\/16.0);\r\n         float Planete02 = smoothstep(0.01,0.0,length(p - vec2(0.0,0.0)) - 0.3);\r\n         float T2 = 0.25+0.75*smoothstep(0.1,0.,length(p - vec2(-0.1,0.0)) - 0.3);\r\n         col = mix(col,vec4(T2*(vec3(0.44,0.55,0.44)-0.1*texture2D(tex00,0.125*vec2(3.*(p\/cos(length(1.75*p))))  + vec2(0.01*TimeVar,0.0)).xxx),1.0),Planete02);\r\n         p*=r2d(-PI\/16.0);\r\n         p -= vec2(0.5,-1.0);\r\n\r\n         p *= 10.0;\r\n\r\n         \/\/ Moutains\r\n         vec4 ColorMountains = vec4(1.0,0.44,0.1,1.0);\r\n         float M1 = p.y - 3.5*Smooth1D(vec2(0.10*p.x + 123.5)) + 1.25\r\n                        - 0.5*Smooth1D(vec2(0.50*p.x + 456.5)) + 0.25\r\n                        - 0.1*Smooth1D(vec2(2.50*p.x + 789.5)) + 0.05\r\n                        + 29.0;\r\n         float M2 = p.y - 1.0*Smooth1D(vec2(0.30*p.x + 258.5)) + 0.50\r\n                        - 0.5*Smooth1D(vec2(0.50*p.x + 147.5)) + 0.25\r\n                        - 0.2*Smooth1D(vec2(2.50*p.x + 369.5)) + 0.05\r\n                        + 29.5;\r\n         float M3 = p.y - 0.5*Smooth1D(vec2(0.75*p.x + 159.3)) + 31.0;\r\n\r\n         col = mix(col,1.2*ColorMountains,smoothstep(0.01,0.0,M1));\r\n         col = mix(col,1.0*ColorMountains,smoothstep(0.01,0.0,M2));\r\n         col = mix(col,0.8*ColorMountains,smoothstep(0.01,0.0,M3));\r\n\r\n         \/\/ Back Pilons : Left\r\n         col = drawPylon(p,col,1., 5.0);\r\n         \/\/ Back Pilons : Right\r\n         col = drawPylon(p,col,2.,-5.0);\r\n\r\n         vec2 w = p;\r\n         p*=0.1;\r\n\r\n         \/\/ Beam\r\n         if( TimeVar > VScrollerLength )\r\n         {\r\n             col += vec4(1.0,0.55,0.11,1.0)*smoothstep(0.40,0.0,abs(10.0*p.x) - 0.2*Smooth1D(vec2(10.0*p.y - 50.0*TimeVar)));\r\n             col += vec4(1.0,0.77,0.77,1.0)*smoothstep(0.05,0.0,abs(10.0*p.x) - 0.2*Smooth1D(vec2(10.0*p.y - 50.0*TimeVar)));\r\n         };\r\n\r\n         \/\/ The Hypersphere aka \"The Teknikor Bubble\", aka \"La G\u00e9odyss\u00e9e\"\r\n         if( TimeVar> VScrollerLength )col += vec4(1.0)*smoothstep(0.05,0.0,length(p - vec2(0.0,-1.95)) - (0.5 + 0.01*sin(50.0*p.y - 5.0*TimeVar)));\r\n         vec2 r = p - vec2(0.0,-1.95);\r\n         float ht = 0.35;\r\n         if( TimeVar > VScrollerLength )ht=1.0;\r\n         vec3 ColorS = ht*vec3(1.0,0.1,0.1)*texture2D(tex02,2.0*dw2(r\/cos(length(2.0*r)) + vec2(0.0,-0.1*TimeVar))).xxx;\r\n         float Sphere = smoothstep(0.01,0.0,length(r) - 0.5);\r\n         if( TimeVar > VScrollerLength )ColorS = ColorS*(vec3(0.5,0.5,0.5) + 0.5*vec3(1.0,0.7,0.5)*pow(0.85*length(p-vec2(0.0,-2.55)),-2.0));\r\n         col = mix(col,vec4(ColorS,1.0),Sphere);\r\n\r\n         \/\/ Upper Shading Sphere\r\n         col = mix(col,vec4(0.0,0.0,0.0,1.0),smoothstep(0.0,0.4,p.y + 1.95)*Sphere);\r\n\r\n         p = w;\r\n\r\n         \/\/ The Temple !\r\n         float StepPyramid = abs(1.5*p.x) + floor(1.0*p.y) + 29.0;\r\n         vec4 TexColor = vec4(1.0,0.5,0.0,1.0)*texture2D(tex00,(mod(0.125*abs(p),0.5)));\r\n         TexColor += 0.3*vec4(1.0,0.5,0.2,1.0)*smoothstep(0.01,0.0,abs(p.y - 0.5*clamp(cos(20.0*p.x),0.0,0.1) - floor(p.y) - 0.90) - 0.05 );\r\n\r\n         col = mix(col,vec4(TexColor.xyz*abs(sin(PI*p.y + PI\/4.0)),1.0),smoothstep(0.01,0.0,p.y + StepPyramid + 25.0));\r\n\r\n         \/\/ Edges\r\n         col += vec4(0.33,0.15,0.0,1.0)*smoothstep(0.3,0.0,abs(sin(PI*p.y + 0.1)))*smoothstep(0.01,0.0,p.y + StepPyramid + 25.0)*abs(0.6*sin(150.0*TimeVar))\r\n             *smoothstep(0.01,0.0,p.y - 7.0*p.x + 27.0 )\r\n             *smoothstep(0.01,0.0,p.y + 7.0*p.x + 27.0);\r\n\r\n         \/\/ Highlight Pyramid Stages\r\n         if(TimeVar>35.0)col += vec4(0.5,0.25,0.0,1.0)*smoothstep(0.25,0.0,abs(sin(PI*p.y + 0.1)))*smoothstep(0.01,0.0,p.y + StepPyramid + 25.0);\r\n\r\n         col += vec4(0.8,0.5,0.1,1.0)*smoothstep(0.01,0.0,p.y + StepPyramid + 25.0)*smoothstep(0.01,0.0,abs(p.y - 0.5*clamp(cos(20.0*p.x),0.0,0.1) - floor(1.0*p.y) - 0.96) - 0.02 );\r\n\r\n         \/\/ FLARE !\r\n         if( TimeVar > VScrollerLength )col += vec4(1.0,0.5,0.2,1.0)*metaDiamond(p,vec2(0.0,-27.0),0.5+0.25*abs(sin(50.0*TimeVar)));\r\n\r\n         \/\/ Front Pilons : Left\r\n         col = drawPylon(p,col,3., 7.0);\r\n         \/\/ Front Pilons : Right\r\n         col = drawPylon(p,col,4.,-7.0);\r\n\r\n         \/\/ Dust\r\n         float DustWall01 = p.y - 2.50*Smooth1D(vec2(0.10*p.x + 0.175*TimeVar)) - 1.25*Smooth1D(vec2(0.40*p.x + 0.35*TimeVar)) + 34.0;\r\n         float DustWall02 = p.y - 2.00*Smooth1D(vec2(0.25*p.x + 0.300*TimeVar)) - 1.00*Smooth1D(vec2(0.25*p.x + 0.60*TimeVar)) + 34.5;\r\n         col = mix(col,vec4(0.77,0.4,0.2,1.0),smoothstep(2.0,0.0,DustWall01));\r\n         col += vec4(0.20,0.10,0.05,1.0)*smoothstep(0.2+0.8*Smooth1D(vec2(0.5*p.x - 0.05*TimeVar)),0.0,abs(DustWall01));\r\n         col = mix(col,vec4(0.60,0.23,0.15,1.0),smoothstep(2.0,0.0,DustWall02));\r\n\r\n         col = drawProbe(p,col);\r\n\r\n         float PosX = 25.0*Smooth1D(vec2(0.3*TimeVar))-12.5;\r\n\r\n         \/\/ Ground\r\n         if(p.y+31.0<0.0)col = mix(col,vec4(2.0*vec3(0.8,0.4,0.1)*texture2D(tex00,0.08*vec2(5.0*p.x\/(p.y+30.0),50.0\/(p.y+30.0))).xxx,1.0),\r\n                                       smoothstep(0.1,0.0,p.y + 0.1*Smooth1D(vec2(p.x)) + 33.5));\r\n         col+= vec4(0.8,0.6,0.1,1.0)*Smooth1D(vec2(2.0*p.x + 123.4))*smoothstep(0.08,0.0,abs(p.y + 0.1*Smooth1D(vec2(p.x)) + 33.5));\r\n\r\n         \/\/ Shadow\r\n         col = mix(col,vec4(0.20,0.0,0.0,1.0),0.65*smoothstep(0.9,0.0,length(vec2(1.0,3.0)*(p-vec2(-PosX,-34.5)))-1.1));\r\n\r\n         if( TimeVar > VScrollerLength )\r\n         {\r\n             vec2 spikes = (p-vec2(0.0,-27.0));\r\n             col += vec4(1.0,0.8,0.2,1.0)*abs(0.40*abs(\r\n                    Smooth1D(vec2(10.0*atan(spikes.y,spikes.x) - 0.75*TimeVar)))*\r\n                    Smooth1D(vec2(10.0*atan(spikes.y,spikes.x) + 0.75*TimeVar)))*\r\n                    abs(sin(1.0*atan(spikes.y,spikes.x)));\r\n         };\r\n\r\n         \/\/ TEXT DISPLAYING PART !\r\n         p = 0.75*a;\r\n         p.y+=0.20;\r\n\r\n         if( smoothstep(0.01,0.0,length(p - vec2(0.0,1.4)) - 0.6) > 0.0 )\r\n         {\r\n             if(TimeVar > 0.1*VScrollerLength*1.0)col = mix(col,vec4(0.2,0.2,0.25,1.0),smoothstep(0.005,0.0,abs(p.y - 1.59)-0.025));\r\n             if(TimeVar > 0.1*VScrollerLength*2.0)col = mix(col,vec4(0.2,0.2,0.25,1.0),smoothstep(0.005,0.0,abs(p.y - 1.49)-0.025));\r\n             if(TimeVar > 0.1*VScrollerLength*3.0)col = mix(col,vec4(0.2,0.2,0.25,1.0),smoothstep(0.005,0.0,abs(p.y - 1.39)-0.025));\r\n             if(TimeVar > 0.1*VScrollerLength*4.0)col = mix(col,vec4(0.2,0.2,0.25,1.0),smoothstep(0.005,0.0,abs(p.y - 1.29)-0.025));\r\n             if(TimeVar >     VScrollerLength    )col = mix(col,vec4(0.2,0.2,0.25,1.0),smoothstep(0.005,0.0,abs(p.y - 1.17)-0.050));\r\n\r\n\r\n             \/\/ MAIN TITLES\r\n             if(TimeVar > 0.1*VScrollerLength*1.0)col += 1.5*ColorTxt*traceStr(0.5*(vec2(1.0,-1.0)*p + vec2(0.0,3.65)),Title01);\r\n             if(TimeVar > 0.1*VScrollerLength*2.0)col += 1.5*ColorTxt*traceStr(0.5*(vec2(1.0,-1.0)*p + vec2(0.0,3.55)),Title02);\r\n             if(TimeVar > 0.1*VScrollerLength*3.0)col += 1.5*ColorTxt*traceStr(0.5*(vec2(1.0,-1.0)*p + vec2(0.0,3.45)),Title03);\r\n             if(TimeVar > 0.1*VScrollerLength*4.0)col += 1.5*ColorTxt*traceStr(0.5*(vec2(1.0,-1.0)*p + vec2(0.0,3.35)),Title04);\r\n\r\n             \/\/ Tagline\r\n             if(TimeVar > VScrollerLength)col = mix(col,vec4(1.0),traceStr(0.9*(vec2(1.0,-1.0)*p + vec2(0.0,2.335)),Tagline01));\r\n             if(TimeVar > VScrollerLength)col = mix(col,vec4(1.0),traceStr(0.9*(vec2(1.0,-1.0)*p + vec2(0.0,2.295)),Tagline02));\r\n         };\r\n\r\n          \/\/ Explanations...\r\n         if(TimeVar > VScrollerLength)col = mix(col,vec4(0.2,0.2,0.25,1.0),smoothstep(0.005,0.0,abs(p.y - 0.25)-0.025)*clamp(sin(2.0*TimeVar),0.0,1.0));\r\n         if(TimeVar > VScrollerLength)col += vec4(1.0)*traceStr(vec2(1.0,-1.0)*p + vec2(0.0,1.28),Invitation)*clamp(sin(2.0*TimeVar),0.0,1.0);\r\n     };\r\n     \r\n     \/\/ Scene 01\r\n     if( TimeVar>57.0 && TimeVar<69.326 )\r\n     {\r\n         p+=vec2(0.0,-1.0);\r\n         col = Scene01(p,col);\r\n     };\r\n\r\n     \/\/ Scene 02\r\n     if( TimeVar>69.326 && TimeVar<81.849 )\r\n     {\r\n         p+=vec2(0.0,-1.0);\r\n         col = Scene02(2.0*p,col);\r\n         p+=vec2(0.0, 1.0);\r\n         col = mix(col,vec4(0.05,0.05,0.15,1.0),0.75*smoothstep(0.01,0.0,abs(p.x+0.375) - 0.45));\r\n         if( abs(p.x+0.375) - 0.45<0.0 && abs(p.y-1.0)<0.35 )\r\n         {\r\n             p *= 2.0;\r\n             col = mix(col,vec4(1.0),traceStr(0.5*(vec2(1.0,-1.0)*p + vec2(0.75,4.50)),Epita1));\r\n             col = mix(col,vec4(1.0),traceStr(0.5*(vec2(1.0,-1.0)*p + vec2(0.75,4.25)),Epita2));\r\n             col = mix(col,vec4(1.0),traceStr(0.5*(vec2(1.0,-1.0)*p + vec2(0.75,4.00)),Epita3));\r\n             col = mix(col,vec4(1.0,0.1,0.1,1.0),traceStr(0.5*(vec2(1.0,-1.0)*p + vec2(0.75,3.75)),Epita4));\r\n             col = mix(col,vec4(1.0,0.1,0.1,1.0),abs(sin(10.*TimeVar))*traceStr(0.5*(vec2(1.0,-1.0)*p + vec2(0.75,3.5)),Epita5));\r\n             p *= 0.5;\r\n         };\r\n     };\r\n\r\n     \/\/ Scene 03\r\n     if( TimeVar>81.849 && TimeVar<100.609 )\r\n     {\r\n         p+=vec2(0.0,-1.0);\r\n         col = Scene03(10.0*p,col);\r\n     };\r\n\r\n     \/\/ Scene 04\r\n     if( TimeVar>100.609 && TimeVar<135.7 )\r\n     {\r\n         p+=vec2(0.0,-1.0);\r\n         col = Scene04(3.0*p,col);\r\n     };\r\n\r\n      \/\/ The END ! (...the beginning, really !)\r\n      gl_FragColor = clamp(col,0.0,1.0);\r\n}\r\n<\/script>\r\n<!--Interface Buttons-->\r\n\r\n<div id=\"cadre\" style=\"background:#FFFFFF;width:600px;height:720px;align:center;\">\r\n\r\n<!--Rendering surface for the shader...-->\r\n<canvas id = \"gl\" width=\"0\" height=\"0\" style=\"width:600px;height:720px;align:center;background-color: #000000;\"><\/canvas>\r\n\r\n\r\n<\/div>\r\n\r\n<!--Text Help for Controls-->\r\n<div style=\"display:block;margin:0px;padding:0px;width:600px;font-size:0;border:none;outline:none;background:#000000;\"><button id=\"but1\" onclick=\"launchShaders();PlaySound();\" style=\"width:450px;height:20px;border:none;outline:none;font-size:15;background:#FFDD11;color:#000000;font-weight:bold;\" onmouseover=\"myOverFunctionBut1()\" onmouseout=\"myOutFunctionBut1()\">RESTART WITH SOUND<\/button><button id=\"but2\" onclick=\"SoundtrackOnOff();\" style=\"width:150px;height:20px;border:none;outline:none;font-size:15;background:#FFDD11;color:#000000;font-weight:bold;\" onmouseover=\"myOverFunctionBut2()\" onmouseout=\"myOutFunctionBut2()\">TOGGLE SOUND<\/button><\/div>\r\n<div id=\"help01\" style=\"display:block;background:#000000;color:#FFDD11;width:598px;font-size:15px;border:1px solid;border-color:#FFDD11;\">\r\n&nbsp;&nbsp;CONTROLS :<br>\r\n&nbsp;&nbsp;1-The shader starts automatically in no-sound mode.<br>\r\n&nbsp;&nbsp;2-Click once or twice on RESTART WITH SOUND to hear the music.<br>\r\n&nbsp;&nbsp;3-Stop\/start the sound at any time using TOGGLE SOUND.<br>\r\n&nbsp;&nbsp;4-Double-click for fullscreen or leaving fullscreen.<br>\r\n<\/div>\r\n<br>\r\n<div id=\"credits01\" style=\"display:block;background:#000000;color:#CCCCCC;width:592px;font-size:15px;border:4px solid;border-color:#CCCCCC;\">\r\n&nbsp;&nbsp;Concept\/Code\/Art\/Writing : J. Paillottet<br>\r\n&nbsp;&nbsp;Copyright - Baselunaire.fr - March 2026<br>\r\n&nbsp;&nbsp;Music : <b>\"Volatile Formula\"<\/b> by Kevin MacLeod<br>\r\n&nbsp;&nbsp;Music licence CC By 4.0 : https:\/\/creativecommons.org\/licenses\/by\/4.0\/<br>\r\n<\/div>\r\n<audio controls src=\"https:\/\/baselunaire.fr\/blog\/wp-content\/uploads\/2026\/03\/S01E00.mp3\" id=\"odio\" style=\"width:750px;display:none;\"><\/audio><br \/>\n<script>\/\/ Description :\r\n\/\/ Morimea's base minimal webgl code, upgraded with textures, fullscreen, loader,\r\n\/\/ inline fragment, plus (kinda) synchro soundtrack ! It doesn't look like much,\r\n\/\/ but it's basically a copy\/paste demo framework for your next prod ! All in one\r\n\/\/ single html file, ready to hack ! Just add your own textures, your own soundtrack,\r\n\/\/ tweak the code if needed, copy your shadertoy between the tags, and enter the\r\n\/\/ next democompo ! :D\r\n\r\n\/\/ BIG Thanks to :\r\n\/\/ -Morimea, Iq, and everyone at Shadertoy's. You guys ROCKS !\r\n\r\n\/\/ Licence : since this is pretty much the smallest, minimal code to run things,\r\n\/\/ there's not much licencing that applies. This is just \"boilerplate\" code...\r\n\/\/ Do what you want. I do not care.\r\n\r\n\/\/ The fragment shader however, is my own artistic work, so is VERY MUCH protected\r\n\/\/ by copyright.\r\n\r\n\/\/ MSM01\r\n\r\n\/\/ -------------------------------------------------\r\n\/\/ PATHS AND VARS TO CHANGE--------------------BEGIN\r\n\/\/ -------------------------------------------------\r\n\"use strict\";\r\nvar PostSizeX = 600.0;\r\nvar PostSizeY = 720.0;\r\n\r\ndocument.getElementById(\"gl\").width           = PostSizeX;\r\ndocument.getElementById(\"gl\").height          = PostSizeY;\r\ndocument.getElementById(\"gl\").style.width     = PostSizeX;\r\ndocument.getElementById(\"gl\").style.height    = PostSizeY;\r\n\r\ndocument.getElementById(\"cadre\").style.height = PostSizeY;\r\n\r\nvar sh_width  = PostSizeX;\r\nvar sh_height = PostSizeY;\r\n\r\nvar tex00_path = \"https:\/\/baselunaire.fr\/blog\/wp-content\/uploads\/2026\/03\/tex00.jpg\";\r\nvar tex01_path = \"https:\/\/baselunaire.fr\/blog\/wp-content\/uploads\/2026\/03\/tex01.jpg\";\r\nvar tex02_path = \"https:\/\/baselunaire.fr\/blog\/wp-content\/uploads\/2026\/03\/tex02.jpg\";\r\nvar tex03_path = \"https:\/\/baselunaire.fr\/blog\/wp-content\/uploads\/2026\/03\/tex03.jpg\";\r\n\r\n\/\/ -------------------------------------------------\r\n\/\/ PATHS AND VARS TO CHANGE----------------------END\r\n\/\/ -------------------------------------------------\r\n\r\nvar gl            = null;\r\nvar Shader        = null;\r\nvar time_start    = null;\r\nvar shadersloaded = false;\r\nvar texturex1     = null;\r\nvar texturex2     = null;\r\nvar texturex3     = null;\r\nvar texturex4     = null;\r\n\r\nfunction InitializeShader(source_vs, source_frag, fv, ff)\r\n{\r\n         var ErrorMessage = \"Initializing Shader Program: <\" + fv + \">, <\" + ff + \">\";\r\n         var shader_vs = gl.createShader(gl.VERTEX_SHADER);\r\n         var shader_frag = gl.createShader(gl.FRAGMENT_SHADER);\r\n         gl.shaderSource(shader_vs, source_vs);\r\n         gl.shaderSource(shader_frag, source_frag);\r\n         gl.compileShader(shader_vs);\r\n         gl.compileShader(shader_frag);\r\n         var error = false;\r\n         if( !gl.getShaderParameter(shader_vs, gl.COMPILE_STATUS) )\r\n         {\r\n             ErrorMessage += gl.getShaderInfoLog(shader_vs);\r\n             error = true;\r\n         }\r\n         if( !gl.getShaderParameter(shader_frag, gl.COMPILE_STATUS) )\r\n         {\r\n             ErrorMessage += gl.getShaderInfoLog(shader_frag);\r\n             error = true;\r\n         }\r\n         var program = gl.createProgram();\r\n         var ret = gl.getProgramInfoLog(program);\r\n         if( ret != \"\" )ErrorMessage += ret;\r\n         gl.attachShader(program, shader_vs);\r\n         gl.attachShader(program, shader_frag);\r\n         if( gl.linkProgram(program) == 0 )\r\n         {\r\n             ErrorMessage += \"\\r\\ngl.linkProgram(program) failed with error code 0.\";\r\n             error = true;\r\n         }\r\n         if( error )\r\n         {\r\n             console.log(ErrorMessage + ' ...failed to initialize shader.');\r\n             return false;\r\n         }else{\r\n             console.log(ErrorMessage + ' ...shader successfully created.');\r\n             return program;\r\n         }\r\n}\r\n\r\nfunction isPowerOf2(value){ return (value & (value - 1)) == 0; }\r\n\r\nvar Texture = function( fn )\r\n{\r\n              var that      = this;\r\n              var root      = this;\r\n              this.filename = fn;\r\n              this.isload   = false;\r\n              this.width    = 0;\r\n              this.height   = 0;\r\n              this.image    = null;\r\n              this.texture  = gl.createTexture();\r\n              this.load     = function (filename)\r\n              {\r\n                   that.image = new Image();\r\n                   that.image.onload = function (event)\r\n                   {\r\n                        var file = fn.split(\"\/\");\r\n                        that.width = this.width;\r\n                        that.height = this.height;\r\n                        gl.bindTexture(gl.TEXTURE_2D, that.texture);\r\n                        gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, that.image);\r\n                        if( isPowerOf2(that.image.width) && isPowerOf2(that.image.height) )\r\n                        {\r\n                            gl.generateMipmap(gl.TEXTURE_2D);\r\n                        }else{\r\n                            gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\r\n                            gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\r\n                            gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);\r\n                            gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);\r\n                        }\r\n                        gl.bindTexture(gl.TEXTURE_2D, null);\r\n                        console.log(\"Loaded texture (\" + that.width + \"x\" + that.height + \") filename = \" + file[file.length - 1]);\r\n                        that.isload = true;\r\n                   };\r\n                   that.image.src = filename;\r\n                   return that;\r\n              };\r\n              if( fn != undefined && fn != \"\" && fn != null )\r\n              {\r\n                  this.load(fn);\r\n              }else{\r\n                  console.log(\"Unable to load texture. Filename '\" + fn + \"' is undefined or null.\");\r\n              };\r\n}\r\n            \r\nvar atmpt = 10;\r\nvar catmpt = 0;\r\nfunction waiting()\r\n{\r\n         catmpt++;\r\n         console.log('waiting for shaders loading');\r\n         setTimeout( function()\r\n                     {\r\n                       if( catmpt < atmpt )\r\n                       {\r\n                           if( !shadersloaded )\r\n                           {\r\n                               waiting();\r\n                           }else{\r\n                               catmpt=0;\r\n                               loadtextures();\r\n                           }\r\n                       }else{\r\n                           console.log('failed loading shaders');\r\n                       };\r\n                     }, 500);\r\n}\r\n\r\nfunction waitingtextures()\r\n{\r\n         catmpt++;\r\n         console.log('waiting for textures loading');\r\n         setTimeout( function()\r\n                     {\r\n                       if( catmpt < atmpt )\r\n                       {\r\n                           if( (!texturex1.isload) || (!texturex2.isload) || (!texturex3.isload) || (!texturex4.isload) )\r\n                           {\r\n                               waitingtextures();\r\n                           }else{\r\n                               launchwebgl();\r\n                           }\r\n                       }else{\r\n                           console.log('failed loading textures');\r\n                       }\r\n                     }, 500);\r\n}\r\n\r\ndocument.addEventListener(\"DOMContentLoaded\",\r\nfunction( event )\r\n{\r\n          var canvas = document.getElementById('gl');\r\n          gl = canvas.getContext(\"webgl2\");\r\n          if( !gl )\r\n          {\r\n              console.log('webgl2 not supported, trying webgl');\r\n              gl = canvas.getContext(\"webgl\") || canvas.getContext(\"experimental-webgl\") || canvas.getContext(\"moz-webgl\") || canvas.getContext(\"webkit-3d\");\r\n              if( !gl )\r\n              {\r\n                  console.log('webgl not suported');\r\n                  return;\r\n              }else{\r\n                  console.log('continue using webgl');\r\n              }\r\n          }else{\r\n                  console.log('continue with webgl2');\r\n          }\r\n          var vs = document.getElementById(\"standard-vs\").textContent;\r\n          var fs = document.getElementById(\"standard-frag\").textContent;\r\n          Shader = InitializeShader(vs, fs, \"01\", \"02\");\r\n          shadersloaded = true;\r\n          waiting();\r\n}\r\n);\r\n\r\nfunction loadtextures()\r\n{\r\n         texturex1 = new Texture(tex00_path);\r\n         texturex2 = new Texture(tex01_path);\r\n         texturex3 = new Texture(tex02_path);\r\n         texturex4 = new Texture(tex03_path);\r\n         waitingtextures();\r\n}\r\n\r\nfunction animation_frame(T)\r\n{\r\n         if( !time_start )time_start = T;\r\n         if( !gl )\r\n         {\r\n             console.log(\"ERROR: webgl lost\");\r\n             return;\r\n         }\r\n         var iTime = (T - time_start) \/ 1000;\r\n         gl.clearColor(0.0, 0.0, 0.0, 1.0);\r\n         gl.clear(gl.COLOR_BUFFER_BIT);\r\n         gl.useProgram(Shader);\r\n         gl.uniform1f(gl.getUniformLocation(Shader, \"iTime\"), iTime);\r\n\r\n         gl.uniform2f(gl.getUniformLocation(Shader, \"iResolution\"), sh_width, sh_height);\r\n\r\n         gl.activeTexture(gl.TEXTURE0);\r\n         gl.bindTexture(gl.TEXTURE_2D, texturex1.texture);\r\n         gl.uniform1i(gl.getUniformLocation(Shader, 'tex00'), 0);\r\n\r\n         gl.activeTexture(gl.TEXTURE1);\r\n         gl.bindTexture(gl.TEXTURE_2D, texturex2.texture);\r\n         gl.uniform1i(gl.getUniformLocation(Shader, 'tex01'), 1);\r\n\r\n         gl.activeTexture(gl.TEXTURE2);\r\n         gl.bindTexture(gl.TEXTURE_2D, texturex3.texture);\r\n         gl.uniform1i(gl.getUniformLocation(Shader, 'tex02'), 2);\r\n\r\n         gl.activeTexture(gl.TEXTURE3);\r\n         gl.bindTexture(gl.TEXTURE_2D, texturex4.texture);\r\n         gl.uniform1i(gl.getUniformLocation(Shader, 'tex03'), 3);\r\n\r\n\/\/       gl.viewport(0, 0, sh_width, sh_height);\r\n         gl.drawElements(gl.TRIANGLES, 3, gl.UNSIGNED_SHORT, 0);\r\n         window.requestAnimationFrame(animation_frame);\r\n}\r\n\r\nfunction launchwebgl()\r\n{\r\n         \/\/ We can draw 2 triangles to make a rectangle framebuffer...\r\n         \/\/ Or we can draw 1 giant triangle and draw the fragment on\r\n         \/\/ the visible (rectangular) sub-part !\r\n         var vertices = new Float32Array([ -1.001,  3.001, 0.0,\r\n                                           -1.001, -1.001, 0.0,\r\n                                            3.001, -1.001, 0.0, ]);\r\n         var indices = [0, 1, 2];\r\n         gl.viewport(0, 0, sh_width, sh_height);\r\n         var vertexbuffer = gl.createBuffer();\r\n         var indexbuffer = gl.createBuffer();\r\n         gl.bindBuffer(gl.ARRAY_BUFFER, vertexbuffer);\r\n         gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(vertices), gl.STATIC_DRAW);\r\n         gl.bindBuffer(gl.ARRAY_BUFFER, null);\r\n         gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, indexbuffer);\r\n         gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, new Uint16Array(indices), gl.STATIC_DRAW);\r\n         gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, null);\r\n         gl.bindBuffer(gl.ARRAY_BUFFER, vertexbuffer);\r\n         gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, indexbuffer);\r\n         var coords = gl.getAttribLocation(Shader, \"a_Position\");\r\n         gl.vertexAttribPointer(coords, 3, gl.FLOAT, false, 0, 0);\r\n         gl.enableVertexAttribArray(coords);\r\n         window.requestAnimationFrame(animation_frame);\r\n}\r\n\r\n\/\/ Restart the shader with synch sound here !\r\nfunction launchShaders(){ time_start = null; }\r\n\r\n\/\/ Second part : all the sound functions.\r\n\/\/ All the fullcreen functions.\r\n\r\nfunction PlaySound()\r\n{\r\n         var audio = document.getElementById(\"odio\");\r\n         audio.currentTime = 0;\r\n         audio.play();\r\n};\r\n\r\nfunction SoundtrackOnOff()\r\n{\r\n         var audio = document.getElementById(\"odio\");\r\n         if( !audio.paused )\r\n         {\r\n             audio.pause();\r\n         }else{\r\n             audio.currentTime = 0;\r\n             audio.play();\r\n         };\r\n}\r\n\r\nfunction getFullscreenElement()\r\n{\r\n         return document.fullscreenElement\r\n         || document.webkitFullscreenElement\r\n         || document.mozFullscreenElement\r\n         || document.msFullscreenElement;\r\n}\r\n\r\nfunction ToggleFullScreen()\r\n{\r\n         if( getFullscreenElement() )\r\n         {\r\n             document.getElementById(\"gl\").width        = PostSizeX;\r\n             document.getElementById(\"gl\").height       = PostSizeY;\r\n             document.getElementById(\"gl\").style.width  = PostSizeX;\r\n             document.getElementById(\"gl\").style.height = PostSizeY;\r\n             sh_width  = PostSizeX;\r\n             sh_height = PostSizeY;\r\n             gl.viewport(0, 0, sh_width, sh_height);\r\n             document.exitFullscreen();\r\n         }else{\r\n             document.getElementById(\"gl\").width        = window.screen.width;\r\n             document.getElementById(\"gl\").height       = window.screen.height;\r\n             document.getElementById(\"gl\").style.width  = window.screen.width;\r\n             document.getElementById(\"gl\").style.height = window.screen.height;\r\n             sh_width = window.screen.width;\r\n             sh_height = window.screen.height;\r\n             gl.viewport(0, 0, sh_width, sh_height);\r\n             document.getElementById(\"gl\").requestFullscreen().catch(console.log);\r\n         };\r\n}\r\n\r\nfunction myOverFunctionBut1()\r\n{\r\n  document.getElementById(\"but1\").style.color      = \"#FFDD11\";\r\n  document.getElementById(\"but1\").style.background = \"#000000\";\r\n}\r\nfunction myOutFunctionBut1()\r\n{\r\n  document.getElementById(\"but1\").style.color      = \"#000000\";\r\n  document.getElementById(\"but1\").style.background = \"#FFDD11\";\r\n}\r\n\r\nfunction myOverFunctionBut2()\r\n{\r\n  document.getElementById(\"but2\").style.color      = \"#FFDD11\";\r\n  document.getElementById(\"but2\").style.background = \"#000000\";\r\n}\r\nfunction myOutFunctionBut2()\r\n{\r\n  document.getElementById(\"but2\").style.color      = \"#000000\";\r\n  document.getElementById(\"but2\").style.background = \"#FFDD11\";\r\n}\r\n\r\nfunction myOverFunctionBut3()\r\n{\r\n  document.getElementById(\"but3\").style.color      = \"#FFDD11\";\r\n  document.getElementById(\"but3\").style.background = \"#000000\";\r\n}\r\nfunction myOutFunctionBut3()\r\n{\r\n  document.getElementById(\"but3\").style.color      = \"#000000\";\r\n  document.getElementById(\"but3\").style.background = \"#FFDD11\";\r\n}\r\n\r\ndocument.addEventListener('dblclick',()=>{ToggleFullScreen();});\r\ndocument.addEventListener('keyup', event => { if( event.code === 'Space' ){ SoundtrackOnOff(); } })\r\n<\/script><\/p>\n<p><strong>EPISODE 00 : THAT TEMPLE ON DRAXACAR&#8230;<\/strong><em> (15-20 minutes read)<\/em><\/p>\n<p>Date : 500 002 025 CE &#8211; The Great Serval Galaxy (10 billion lightyears from the Milky Way)<\/p>\n<p>The Captain was a little bit tipsy. Nobody would have blamed him, though : thanks to his lifelong experience, we&rsquo;d just survived the attack from another pirate ship.<\/p>\n<p>A few hours earlier, we had come to rest near a small asteroid in order to make quick repairs. Those bastards had then sneaked on us, all lights off, barely above the regolith, sticking to the curvature. They had selected the optimal angle, coming at us right on the damaged side, where they thought we couldn&rsquo;t easily retaliate. Actually, our situation was even worse than this because fighting near an asteroid without functioning deflectors basically amounts to throwing a grenade inside an elevator. Sure enough, your opponent won&rsquo;t walk out of this alive. Then again, neither will you.<\/p>\n<p>Sadly for these hyenas, Lynx was on watch, with the brand-new gear we&rsquo;d bought on Aronax. He saw them coming mere instants before anyone else. Also, the Captain was at the helm, and in a really bad mood. The way they came at us, starboard, we had very little firepower. They were striking at our most vulnerable moment. It was a good tactical idea and -by the way- an outstanding move, so elaborate and fast, in fact, that it had probably been executed by navcomputers. Against any other ship, their treacherous attack would have succeeded&#8230; But they were dealing with The Claw.<\/p>\n<p>Just after MASSIVE upgrades on the Attitude Control Systems&#8230; courtesy of Yours Truly !<\/p>\n<p>Lynx whistled a very peculiar arpegio. Without warning, the Captain rolled our ship port-side, +PI\/2, which probably sent half the crew cracking their skulls on a nearby wall. He stopped the rotation within less than one degree of the target, then punched the firing command of the belly gun hard enough to crush it !<\/p>\n<p>I remember thinking : \u00ab\u00a0&#8230;without aiming, proper pre-checks, cycling, heating, calibration and shit ? Just like that, point-blank, on a whim ?\u00a0\u00bb because I was an engineer, and also a very ignorant newbie in matters of actual space combat.<\/p>\n<p>There was an impressive flash. An instant, lethal surge of radiations that made several screens flip to warning-mode on the bridge. Between tears and phosphenes, I noticed that the enemy con tower had now vanished (possibly vaporised) leaving a 40-feet-wide hole through the metal. Also, their magnetic grappling hooks (several tons each) had already bounced off our just-repaired deflector shields and were now going back to the sender at an alarming speed. They crashed through their hull like tissue paper.<\/p>\n<p>Our crew had been given exactly five seconds to react. They had absolutely killed it. I was amazed.<\/p>\n<p>The ship was now slowly resuming its former position.<\/p>\n<p>\u00ab\u00a0Freaking amateurs !\u00a0\u00bb roared the Captain, his mane floating around his head like liquid copper. With a ferocious grin, he grabbed the mike :<\/p>\n<p>\u00ab\u00a0Finish them, Chonques !\u00a0\u00bb<\/p>\n<p>The enemy ship&rsquo;s engine immediately blew up. In utter silence. Then their fuel tank. A fuzzy, azur cloud spread onto the void around the wreck, as cryox flowed out in beautiful drapes that shimmered in the sunlight (and in the paths of our violently-strobing tactical lasers). Through the portholes, the sky was now so blue we could have been in a nebula&#8230; or even right back to Redax on a perfect summer day !<\/p>\n<p>While the Second Officer was shouting orders to our boarding team, the Captain was enjoying the sight, arms crossed. The blue gas clouds reflected in his wide, golden eyes whose pupils were now reduced to mere slits. He, too, hadn&rsquo;t put his glasses on. Those were still hanging around his neck. The old man had just blinked at the right time, maybe. Only then did I realize that this ambush had been foiled before I could even ponder on my own death ! I was simultaneously impressed, proud to be a part of this crew, and slightly terrified by their efficiency. I wiped sweat off my brows, trying to focus.<\/p>\n<p>Then one of the techs shouted excitedly : \u00ab\u00a0They got Kzal ! The bastards got Kzal ! &#8230; FREAKING TONS OF KZAL !\u00a0\u00bb<\/p>\n<p>Cheers rose from the combat deck through the radio. The strike team was thirsty. So was Captain Kiral apparently, because he smiled -suddenly in a good mood- and left the bridge like a missile !<\/p>\n<p style=\"text-align: center; font-size: 50px;\">\u2234<\/p>\n<p>So five hours later, the situation was under control, we had deployed advanced-warning drones, Lynx was still on watch, and the Captain already a bit wasted. Or sleepy. Probably both. Rivers of Kzal were flowing. The golden poison had already claimed several crewmen : they were now lying under the table, purring, snoring like old gas engines, while the rest of us partied, ate, sang and drank. I remember this occasion vividly since it was that day that I heard for the first time about <strong>The Last Temple Of Science-Fiction<\/strong> !<\/p>\n<p>The whole crew had gathered in the dining-room (in the rotating part of the ship), and people were celebrating perhaps a bit harder than usual since nobody we knew had actually died that day ! Great Captain Kiral was sitting on his throne, at the end of the long table, seemingly lost in thoughts, when Retz and Kardys came in with obvious intentions. They sat casually, to the right of the Old Man. Kiral automatically let his enormous paw fall on Retz&rsquo;s head, claws half-out :<\/p>\n<p>\u00ab\u00a0The Eagle has landed !\u00a0\u00bb he said in a deeply cavernous, menacing voice.<\/p>\n<p>His eyes, though, were filled with fatherly pride and happiness. Retz, who had basically grown up aboard this ship and was used to this routine, evaded from under the heavy paw while holding back a laugh. But Kardys jumped between them and walked back into the arms of her boyfriend while openly defying the Old Man, ears flat, teeth out ! Kzal may have slowed down his reflexes, but the Captain still raised an eyebrow, like he was gauging the situation before exploding&#8230; only to burst into genuine laughters. Looking at them with a feigned, comical defiance, Kiral rose his glass to honor the couple, waved both eyebrows twice, cracked his signature crooked smile, and drank it all !<\/p>\n<p>Kardys relaxed, and added something in her usual brash, careless manner. I didn&rsquo;t hear anything because at that very moment, all the gunmen -Chonques leading the pack- started singing an oldie from the War, and these guys were LOUD you have no idea !<\/p>\n<p>So I heard nothing&#8230; However I definitely saw Kiral&rsquo;s wholesome expression receiding, fading as daylight during an eclipse. The big golden eyes closed, the nose wrinkled with concern. I used this pause to sneak closer, pretending to be interested in the content of a plate full of delicious meat. Well&#8230; I didn&rsquo;t have to pretend too hard. I hadn&rsquo;t eaten proteins for the last two days (too much work, long story!), so I may have been salivating a little bit, hahaha. Retz saw me closing in, and welcomed me with a glare. Kardys just gave me a quick glance (the \u00ab\u00a0none of your business, don&rsquo;t interfere&#8230;\u00a0\u00bb kind). When he opened his eyes again, the Captain called me out : \u00ab\u00a0Heeeey ! Here&rsquo;s my new engineer ! I was just looking for you, Gyro ! You gave a hell of a kick to the RCS system, son. Dear Gods, it felt slippery like magnetic bearings ! How did you put it last time ?! &#8230; &lsquo;Fine-tuning The Inertial Tensor&rsquo; ?! Is that it ?! Well, I had never held the bridge grips so tight in my entire life ! The son of a bitch behind this attack knew some of our weaknesses&#8230; He must have followed us from Aronax, I&rsquo;m pretty sure you figured that one out, uh ?! They had military navcomputers too, did you see this ?! That precision ?! Ah, but it wasn&rsquo;t enough ! With my reflexes and your talent, we beat them. And now I&rsquo;m left wondering : can we cheat Fate a bit longer, with just sheer luck, raw skill, and some fancy tech by our side !?\u00a0\u00bb<\/p>\n<p>Feeling suddenly like a billion bucks, I stabbed a gigantic piece of meat, put it into my plate, and added -in a cool voice, hopefully :<\/p>\n<p>\u00ab\u00a0Yeah, and with just a few more upgrades, we might even defeat the Imperial Fleet ! How&rsquo;s that for a start, Captain ?!\u00a0\u00bb<\/p>\n<p>Kiral abruptly rose on his feet, holding his glass so tight in his hand, I heard it whine ! I don&rsquo;t know if he had missed the irony in my reply, or if he had turned it against me, but the man doubled down :<\/p>\n<p>\u00ab\u00a0And then the entire Galaxy would be free ! Wouldn&rsquo;t THAT be a sight ?!\u00a0\u00bb<\/p>\n<p>He drank another sip before exploding so loud, even the singers at the other end of the table shut up for a sec :<\/p>\n<p>\u00ab\u00a0BY THE GODS ! TRILYON, YOU SHOULD SEE US NOW, OLD FRIEND ! THE &lsquo;RIGHT STUFF&rsquo; ! RAHAHA !\u00a0\u00bb<\/p>\n<p>Falling back in his chair, he finished his glass, then slammed it on the table with a smug grin and a wild, rebellious glint in the eye&#8230; Then, and only then, did he turn to Retz with a straight face, and in a very conspiratorial tone he went on :<\/p>\n<p>\u00ab\u00a0Okay, kids. That memory somehow stings a little&#8230; But&#8230; Why not, after all. I owe you. You fought well during the last few months, and I know it wasn&rsquo;t easy, especially these last two weeks ! So. What I know about&#8230; you know what&#8230; is extremely shady. Limited. Vague. Ear-say, mostly. In fact (he nodded in my direction) it would probably make Gyro over there blow a fuse or two ! Except&#8230;<\/p>\n<p>Except I have travelled the galaxy upwards and backwards. For a veeeery long time. Noone, on Redax or beyond, knows Space like I do. Better : I was there -actually there, in the flesh- when Trilyon went mad with rage and despair, and invented the hyperdrive in a single night ! And again : I was there when, changed by this breakthrough, he launched the Great Galactic Exploration just a few weeks later ! I was part of the First Wave, a simple crewman on the Mighty Roar, one of five stolen military torchships under the rule of dissident hero Commander Jade ! I can even tell you He was every bit of the legend we remember these days ! &#8230; People were not&#8230;\u00a0\u00bb He waited a bit, as if reminded of a peculiar anecdote, then : \u00ab\u00a0&#8230;They built people differently back then. Bigger, tougher. Larger than life.\u00a0\u00bb<\/p>\n<p>Retz and Kardys were in a state of shock and admiration, as the captain reminisced about this distant, mythical era. Much later, Retz told me that this fateful evening, they had tried their luck, and Kiral -to their surprise- had willingly shared this old yarn about the Temple.<\/p>\n<p>\u00ab\u00a0You have to understand&#8230; This knowledge is no gift. It&rsquo;s more akin to sharing a heavy burden.\u00a0\u00bb He corrected himself : \u00ab\u00a0&#8230;and some hope, I reckon. It is also just a fragment of the thousands facts WE, Prime Explorers, WE, the Free Men of Redax, have gathered in a 30 years span, on countless worlds, as we pushed forward through the Yot-Redash galaxy, with -always- the Three-Moons Fleet on our heels ! Seven hundred military battleships supported by the entire Empire, relentlessly going after three thousand smaller spacecrafts with limited resources, inferior firepower&#8230; but an infinite supply of VISION !<\/p>\n<p>-The Second Galactic War, whispered Kardys without even noticing.<\/p>\n<p>The Captain heard her, though, and sneered at the phrasing :<\/p>\n<p>-It only became the &lsquo;Second&rsquo; Galactic War much later, after they crushed that poor small alien civilization near Liagatyr V. In the beginning, we had no colonies, no worlds, no money, no nothing. Just our ships ! We ignored the true extent of the Empire, and the depth of its crimes ! At first, our &lsquo;galactic war&rsquo; seemed more like a civil war. Internal affairs ! We hadn&rsquo;t even met the Fire Swarm : this tells you how truly clueless we were !<\/p>\n<p>\u00ab\u00a0Anyway&#8230; &#8230; I have no idea how you discovered the existence of <strong>The Last Temple Of Science-Fiction<\/strong>. Information certainly has&#8230;\u00a0\u00bb He waved his hand in a vague manner. \u00ab\u00a0&#8230;strange properties. It escapes confinement. It moves, if diffuses. It even has a mass, apparently !? Isn&rsquo;t that right, Gyro ?! Am I talking shit or what ?<\/p>\n<p>-Spitting FACTS, Cap ! I shouted, too tired (and hungry) to join a physics debate.<\/p>\n<p>-However, in the event of my untimely death, this secret should not, MUST NOT, die with me. That would be such a waste !<\/p>\n<p>He looked at the audience : we were about ten to fifteen space pirates, some of them young, some less so, all gathered around that incredible monster of a man. Laughters and songs were still exploding from the other end, but on our side of the table, we were all quiet, ears raised high and wide, riveted to the edge of our seats.<\/p>\n<p>\u00ab\u00a0The Universe is old, you know.\u00a0\u00bb he started. \u00ab\u00a0Ancient, you might even say. Filled to the brim with bad memories. And death traps ! These are the cursed legacy of our predecessors. The temple you&rsquo;re looking for is a part of this crazy heritage. Small important detail, though : it&rsquo;s not located in this galactic sector. No. Not even close ! It&rsquo;s on freaking Draxacar, of all places !\u00a0\u00bb He shook his head. \u00ab\u00a0Ah&#8230; I&rsquo;m sorry, this probably doesn&rsquo;t ring a bell for you guys. It&rsquo;s an uncharted planet located in the far reaches of the galaxy. About seventy thousands light-years from here !\u00a0\u00bb<\/p>\n<p>A gasp of disbelief rose from the pirate crowd. We were all calculating in our heads (well, some on their fingers !) the number of months it meant with the Claw&rsquo;s advanced hyperdrives. The number of jumps was&#8230; astronomical. Even for us, \u00ab\u00a0the fastest of the fast\u00a0\u00bb, that kind of distance seemed staggering.<\/p>\n<p>-&#8230; Yep, 70000 lightyears, that&rsquo;s about it.\u00a0\u00bb confirmed the Captain, who was visibly straining to recall the exact number. He rose a finger in our direction, lips tilted in a dubious grin. \u00ab\u00a0Well, that&rsquo;s if you believe my old brain&#8230; and what&rsquo;s written in the Nebula Chronicles, anyway.\u00a0\u00bb<\/p>\n<p>I had NEVER heard of these Nebula Chrons, and wasn&rsquo;t going to risk interrupting Captain Kiral about it.<\/p>\n<p>\u00ab\u00a0On Draxacar there is a vast jungle not unlike the one in the Northern hemisphere of Redax : immense, dangerous, filled with ancient ruins going back eons, teeming with weird creatures and lost souls. In this tropical forest there&rsquo;s a Scar : a mysterious dry valley that cut through the vegetation. There, shrouded in the red dust of a desert wasteland, stands a temple of incredible power. It&rsquo;s old, a bit collapsed in some places, but it still shines beams of golden light around&#8230; Of course, you CAN NOT access it from orbit, by dropping to the coordinates in a capsule or a shuttle.\u00a0\u00bb He lowered his voice, leaned towards us : \u00ab\u00a0Nooooooooo&#8230; That would be too easy. Reaching the temple has a cost. To actually get there, you&rsquo;ll first have to land far enough of its influence, then walk for miles, at ground level, under a wild canopy full of stranglianas, neurotoxic trees, barbed-harpoon bushes and carnivorous plants, all while cutting through dark thickets hiding beasts, parasites, extra-terrestrial bugs and a thousand repulsive lifeforms.\u00a0\u00bb<\/p>\n<p>\u00ab\u00a0You&rsquo;ll have to move through this greenish hell for days. Because the technology of lesser creatures (like us) doesn&rsquo;t work in this region of the universe. Not even good old lasguns. Flying machines, ground vehicles, they won&rsquo;t help you one bit. They won&rsquo;t start. In this place of higher reality, comlinks fail, batteries drain in a few seconds. Even nuclear ones ! And try to science this one out, by the way, I&rsquo;m listening ! No, in the end : a blade, your own teeth, your claws and your colloidal joke of a brain, that&rsquo;s all you&rsquo;ll get.<\/p>\n<p>Now, the most obvious path requires to land at the biggest Equatorial Lake, then proceed due North for a few hundred miles&#8230; Follow the ancient road remnants still hidden under the bushes. If fate is on your side, this should lead you to the ruins of Sandara, the ancient stone city that rests forever in a red evening glow. Its spectacular alien architecture covers a vast area, and offers many lairs to a species of hideous flying creatures with massive wingspan : pale crimsom-eyed monsters, whose crual calls sometimes echo for hours over the city, bouncing around between empty buildings, collapsed dungeons and broken fortifications. The nearby jungle provides them with massive amounts of preys, which they hunt and consume in a frenzy during giant collective feasts !<\/p>\n<p>Liotrao, red sun of this system, has been watching over these feedings for several million years. All this blood pleases him so much he never sets !<\/p>\n<p>This is because Draxacar is an eye-planet. It doesn&rsquo;t spin ! &lsquo;Everywhere you are, there&rsquo;s no time on Draxacar !&rsquo; says the legend&#8230; The jungle coils around the world along the terminator, like an emerald snake, a biological barrier between the lit hemisphere, where air is so warm it can cook your lungs in five minutes, and the night hemisphere where cold reigns supreme in 20 different types of ice ! But do not worry about that : your next destination stays well within the inhabitable zone. North-west of Sandara, you&rsquo;ll find the Great Pool of Xool. Follow its golden beach to the North, past the Dome with its prismatic forcefield, and you&rsquo;ll discover the pond of the Five Godesses, a place full of cool shadows, eroded sculptures and the clean, whitish light of gentle mornings. In this enchanted place, the Jdar river falls into a shallow lake in five places. Climb the moss-covered steps right of the biggest waterfall. Once you&rsquo;ve reached the top, follow the shore for about eighty kilometers. That should bring you to the Great Mecalith !<\/p>\n<p>Head covered with his usual skull beanie, Chonques came our direction while tearing bites out of an enormous ham. His voice sounded sarcastic : \u00ab\u00a0So we&rsquo;re still at the freaking Mecalith, uh !? Dear Lord&#8230;\u00a0\u00bb He turned on his heels, and went back right where he came from, in that same nonchalant manner, taking a sip of Kzal from the bottle to help with the meat. He was, I believe, the only member of our crew that could mutter these kinds of remarks around the captain without getting nailed to the bulkhead. And he enjoyed that privilege anytime he could.<\/p>\n<div id=\"attachment_1028\" style=\"width: 243px\" class=\"wp-caption alignright\"><a href=\"https:\/\/baselunaire.fr\/blog\/wp-content\/uploads\/2021\/04\/tm_01.gif\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-1028\" class=\"size-medium wp-image-1028\" src=\"https:\/\/baselunaire.fr\/blog\/wp-content\/uploads\/2021\/04\/tm_01-233x300.gif\" alt=\"\" width=\"233\" height=\"300\" \/><\/a><p id=\"caption-attachment-1028\" class=\"wp-caption-text\">The Torii Maglev on Draxacar<\/p><\/div>\n<p>\u00ab\u00a0The Great Mecalith is the cyclopean entrance to the Temple : two square pylons rising straight out of the ground, like a tuning fork, if you want, and a giant horizontal slab that magically levitates a few meters above. Just like the Torii Maglev, to the south, but much, much bigger ! The Holy Scriptures tell us that everything depends on this instant. You open the Temple&rsquo;s Gate by passing between those obelisks, underneath this immense rock table that floats and hums eerily in the twilight.<\/p>\n<p>We don&rsquo;t really know if a door appears in a real, physical way, if some formerly-tangled geodesics suddenly loosen up, tearing a traversable hole through space, or if the thing is just folklore, a simple ritual, tradition. Anyway, once you&rsquo;re through, you&rsquo;ll have to follow the Jdar upstream further North. It may be tempting, yet I wouldn&rsquo;t recommand building a raft. In this new area, the river is not only deeper, it&rsquo;s also ridden with treacherous currents, and infested with armored fishes. The violent, hungry kind. So don&rsquo;t bath in these waters, and don&rsquo;t use them to fill your bottles. If you want to drink, or wash, it&rsquo;s better to try one of the many smaller streams nearby.<\/p>\n<p>Along the journey, strange things can and will happen. Visions of unknown worlds, sight of ghostly cities, mysterious sounds, mirages. And sometimes, hidden within the shadows of the jungle, shadows of a darker, more evil nature. Some may try to speak to you ! DO NOT LISTEN TO THEM !<\/p>\n<p>He looked sideways, sighed, then :<\/p>\n<p>\u00ab\u00a0In the skies too, you may see some uncanny creatures. Vehicles with alien shapes. New, suprising, unfamiliar scents will startle you out of nowhere. Be on your guard at every step, keep a cool, analytical mind under all circumstances ! I mean, don&rsquo;t get me wrong : physical danger is absolutely real&#8230; But it is your very soul, more than anything, that will be tested again and again, the closer you get to the Temple.<\/p>\n<p>The last part of the trip is called the Canyon of Madness : 5 miles of a deep, narrow fault cutting through a small moutain range : the Southern Lip of the Scar which I told you about at the beginning. It is very possible to cross that passage without dying in the process ! That being said, be careful. There are things that live in that narrow path, things that DO NOT like intruders. Oh, and don&rsquo;t look at the walls for too long. There are paintings on these rocks, patterns so complex you&rsquo;d go mad just trying to understand them. Some of you may know the concept of the &lsquo;Fractal Fugue&rsquo; that the Empire used as psychological torture. Glatz, Styx, the old Trilyon, and many, many others, have lost their minds because of this interrogation technique. Well, the things on the walls of this canyon are like that, times a million. And the more educated you are\u00a0\u00bb, the captain said, looking right at me,\u00a0\u00bb the easier it is to get crushed !<\/p>\n<p>&#8230;<\/p>\n<p>I see your eyes. You&rsquo;re thinking : why couldn&rsquo;t we climb those moutains a few meters away. Follow the upper lip instead of going in&#8230;\u00a0\u00bb<\/p>\n<p>He had a dry laugh.<\/p>\n<p>\u00ab\u00a0There&rsquo;s an explanation for this. You&rsquo;ll see when or if you get there.<\/p>\n<p>Cross those last few miles though, and you&rsquo;ll access the dry valley. The Red Scar of Draxacar. This is where you&rsquo;ll see the myth. The dream. The legend. This is where you find <strong>The Last Temple Of Science-Fiction<\/strong> !<\/p>\n<p>Watching over him are four ghastly pylons so old their stones have yellowed and eroded beyond all recognition. The main building looks a lot like ancient Redaxian Temples of the Second Dynasty. A giant, crimsom hypersphere hovers above it. That thing is also called &lsquo;g\u00e9odyss\u00e9e&rsquo;, or &lsquo;the Technikor Bubble&rsquo;, although the meaning of such names has been forgotten for million years. We know next to nothing about this sphere, apart from the fact that it floats efforlessly, and that it contains a red liquid that boils with fury.<\/p>\n<p>Set up your camp on the low hills, and wait. A metal sphere adorned with lights has been mentioned by a few visitors during the last millenia. Don&rsquo;t fret over it. It is only passing by&#8230; We don&rsquo;t know if it&rsquo;s a local security system, or&#8230; something else entirely.<\/p>\n<p>The Captain looked at us, raised his hands.<\/p>\n<p>\u00ab\u00a0Hey, what did you expect&#8230; ?! We&rsquo;re not the only intelligent creatures fascinated by this place&#8230; There ARE other alien lifeforms in the galaxy, some of them can even cross space like we do. So just get confortable, sit peacefully in the sand, and wait.<\/p>\n<p>Depending on your luck, maybe you&rsquo;ll see something. Something, or someone, like&#8230; An ageless man, with salt and pepper hair and sad eyes. Or maybe his companion, a beautiful blonde that smiles easily, even laughs sometimes, but somehow still looks menacing in a subtle way.<\/p>\n<p>The man presents strange physical characteristics, like round ears that can&rsquo;t move, and positioned on the sides of his skull ! The woman has more usual ears, but they&rsquo;re longer and pointier ! They, too, are on the sides of her skull ! Also the claws on her hands are NOT retractiles!\u00a0\u00bb<\/p>\n<p>Now the public showed clear signs of distrust. Was Kiral mocking us by adding ridiculous details ?!&#8230; Probably.<\/p>\n<p>\u00ab\u00a0These two beings are, with the Temple, all that remains of Mankind : an alien species that lived a long time ago, on a blue planet around a yellow star, in a VERY distant galaxy. Nobody really knows if those two are dead or alive. Ghosts or gods ?! Demons or guardian-angels ?! In any case, I strongly suggest you show the highest respect when speaking to them. If they think you&rsquo;re worthy, they&rsquo;ll give you advice. And warnings.<\/p>\n<p>Pay close attention because, as you&rsquo;ve probably guessed by now, your journey is only just beginning ! The Last Temple contains many secret passages, countless rooms filled with doors, halls of columns, arcades that open on the depths of Time and Space ! Portals on realities beautiful, yet dangerous. Fantastic yet deadly. Some of them&#8230; Some of them may be utterly terrifying. Some, actual visions of paradise.\u00a0\u00bb<\/p>\n<p>The Captain suddenly changed mood and let out an impressive, heart-felt sigh. There was obviously something wrong. A detail he had clearly omitted, and felt divided about.<\/p>\n<p>\u00ab\u00a0In truth I couldn&rsquo;t tell you if this place is a miracle, or a curse. But&#8230; When you&rsquo;ll enter <strong>The Last Temple Of Science-Fiction<\/strong>, young fools&#8230; When, eager for adventures, you&rsquo;ll step into this pile of eroded stones&#8230; When you&rsquo;ll explore this improbable maze of halls, domes, hypostyles, corridors and gates with massive lintels&#8230; When the ancient magic of words, code, images and sound will make your head spin and your mind go wild&#8230; Take a step back. Contemplate. Ponder. Decypher. Do not take all this at face value.<\/p>\n<p>Enjoy those experiences offered to the Universe by an extinct civilization. Witness the madness of these humans. Witness their errors, their moments of grandeur, their awesome victories, their worst, most evil deeds, and their constant attempts at redemption. Don&rsquo;t be too hasty when you judge them. Remember our own issues. Our own strengths. And get w&#8230;\u00a0\u00bb The Captain opened his mouth, closed it. Then went on, a bit louder : \u00ab\u00a0In my opinion, the Temple is not here to teach us anything specific, but more to induce some kind of reaction&#8230; So take what you can and come back to us. Changed -probably-, better -maybe ?-, bigger and wiser -if possible ! Strong with new insights, with your own original answers. An abstract prize that you can own, but also that you can&#8230; share.<\/p>\n<p>He stayed quiet for a while, then, in a hopeful voice :<\/p>\n<p>\u00ab\u00a0Our future as a species could depend on it !\u00a0\u00bb<\/p>\n<p>Kardys was clawing at Retz&rsquo;s arm. But he didn&rsquo;t feel the pain. I could see the absolute awe inside the mind of this young pirate, even as he, himself, watched the possessed light within the golden eyes of Kiral. That glimmer was fading, though. The moment had passed. So Retz ventured one last question, as if breathing on an ember :<\/p>\n<p>\u00ab\u00a0Cap&#8230; You entered The Last Temple, didn&rsquo;t you ?!\u00a0\u00bb<\/p>\n<p>The Captain suddenly seemed to wake up. Looked at Retz, Kardys, then at the entire group. His face now felt more lucid and serious, almost in a grave, ominous way.<\/p>\n<p>\u00ab\u00a0Did I&#8230; get in&#8230; the Temple ?!\u00a0\u00bb<\/p>\n<p>He muttered in his beard, then spoke in a clear, incredibly bitter voice :<\/p>\n<p>\u00ab\u00a0The true question, young man, the one that&rsquo;s been haunting me all these years, is rather : did I ever GET OUT ?!\u00a0\u00bb<\/p>\n<p>And just this instant, all hell broke loose. Lynx and Chonques, who had just arrived stealthily, started screaming \u00ab\u00a0KIRAL !\u00a0\u00bb, \u00ab\u00a0KIRAL !\u00a0\u00bb while raising their fists, and laughing their drunken asses off ! Everybody immediately joined them, cheering, laughing, and screaming louder. The distraction was so perfect and the cheers so loud, in fact, that nobody heard the Captain -nobody except me, and Retz, and Kardys. Only the three of us saw his bewildered expression when he uttered these last words, that sounded like a reluctant confession :<\/p>\n<p>\u00ab\u00a0I swear to Gods, I can&rsquo;t&#8230; I&#8230; I can&rsquo;t recall&#8230;\u00a0\u00bb<\/p>\n<p>He abruptly rose on his feet, his cape flapping in a theatrical manner, gave an embarrassed smile to the crowd, glared at Chonques, reached for a new bottle of Kzal then swiftly left for his apartments.<\/p>\n<p>This night, like everyone, I laughed it up. I had to. It was obviously a made-up story to entertain the crew. Some classic pirate tale, twisted in a strange, dark, poetic way with a trick ending.<\/p>\n<p style=\"text-align: center; font-size: 50px;\">\u2234<\/p>\n<p>Thirty years later, though, these whispered words still rang to my old ears. They had recently acquired a new weight, the sour taste of Truth as, overwhelmed by insane visions, alone, wounded, thirsty, completely lost, and on the brink of death, I was walking the endless corridors of<\/p>\n<p style=\"text-align: center;\"><button id=\"but3\" style=\"width: 500px; height: 30px; border: none; outline: none; font-size: 20px; background: #FFDD11; color: #000000; font-weight: bold;\" onclick=\"launchShaders();PlaySound();\"  onmouseover=\"myOverFunctionBut3()\" onmouseout=\"myOutFunctionBut3()\"><strong>THE LAST TEMPLE OF SCIENCE-FICTION !<\/strong><\/button><\/p>\n<p style=\"text-align: center;height:50px;\">&nbsp;<\/p>\n<p style=\"text-align: center;font-size: 20px;\">T&nbsp;&nbsp;H&nbsp;&nbsp;E&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;E&nbsp;&nbsp;N&nbsp;&nbsp;D<\/p>\n<p style=\"text-align: center;height:50px;\">&nbsp;<\/p>\n<p style=\"text-align: center; height: 50px;\">\n<div style=\"text-align: center;\"><script type='text\/javascript' src='https:\/\/storage.ko-fi.com\/cdn\/widget\/Widget_2.js'><\/script><script type='text\/javascript'>kofiwidget2.init('Buy Me A Coffee !', '#72a4f2', 'V7V31LRRH8');kofiwidget2.draw();<\/script><\/div>\n<p style=\"text-align: center; height: 50px;\">\n","protected":false},"excerpt":{"rendered":"<p>Author&rsquo;s note : This Episode Zero was very much NOT planned. The original intent was simply to animate an \u00ab\u00a0Opening\u00a0\u00bb of sorts, in the spirit of the Twilight Zone (&#8230;with a bit more punch, in my own style, also I &hellip; <a href=\"https:\/\/baselunaire.fr\/?page_id=5687\">Continuer la lecture <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"open","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-5687","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/baselunaire.fr\/index.php?rest_route=\/wp\/v2\/pages\/5687","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/baselunaire.fr\/index.php?rest_route=\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/baselunaire.fr\/index.php?rest_route=\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/baselunaire.fr\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/baselunaire.fr\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=5687"}],"version-history":[{"count":28,"href":"https:\/\/baselunaire.fr\/index.php?rest_route=\/wp\/v2\/pages\/5687\/revisions"}],"predecessor-version":[{"id":6241,"href":"https:\/\/baselunaire.fr\/index.php?rest_route=\/wp\/v2\/pages\/5687\/revisions\/6241"}],"wp:attachment":[{"href":"https:\/\/baselunaire.fr\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=5687"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}