Spatial.shader 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443
  1. shader_type spatial;
  2. render_mode blend_mix, depth_draw_opaque, cull_back, diffuse_burley,
  3. specular_schlick_ggx, unshaded;
  4. uniform sampler2D texture_1 : hint_albedo;
  5. uniform sampler2D texture_2 : hint_albedo;
  6. uniform sampler2D texture_3 : hint_albedo;
  7. uniform sampler2D texture_4 : hint_albedo;
  8. uniform sampler2D texture_5 : hint_albedo;
  9. uniform sampler2D panorama_bg;
  10. uniform sampler2D floor_texture;
  11. uniform sampler2D floor_tile;
  12. uniform sampler2D pallte;
  13. uniform sampler2D chbtex;
  14. uniform vec4 single_light_color:hint_color;
  15. uniform vec4 border_light_color:hint_color;
  16. uniform sampler2D light_data : hint_albedo;
  17. const vec2 real_size = vec2(4., 8.);
  18. const vec2 light_data_size = vec2(40., 80.);
  19. varying vec2 uv1[4];
  20. varying vec2 uv1m[4];
  21. varying float posz;
  22. float rand(vec2 co) {
  23. return fract(sin(dot(co.xy, vec2(12.9898, 78.233))) * 43758.5453);
  24. }
  25. mat3 rotx(float a){float s = sin(a);float c = cos(a);return mat3(vec3(1.0, 0.0, 0.0), vec3(0.0, c, s), vec3(0.0, -s, c)); }
  26. mat3 roty(float a){float s = sin(a);float c = cos(a);return mat3(vec3(c, 0.0, s), vec3(0.0, 1.0, 0.0), vec3(-s, 0.0, c));}
  27. mat3 rotz(float a){float s = sin(a);float c = cos(a);return mat3(vec3(c, s, 0.0), vec3(-s, c, 0.0), vec3(0.0, 0.0, 1.0 ));}
  28. vec2 rot_uv_180(vec2 uv, vec3 nor) {
  29. vec2 ts = vec2(1. / 4., 1. / 3.);
  30. if ((nor.z > 0.) && (nor.x > 0.))
  31. uv = uv + vec2(-1. * (ts.y), 0. * (2. * ts.x));
  32. else if ((nor.z > 0.))
  33. uv = uv + vec2(-1. * (ts.y), 1. * (2. * ts.x));
  34. if ((nor.z < 0.) && (nor.x < 0.))
  35. uv = uv + vec2(-2. * (ts.y), 0. * (2. * ts.x));
  36. else if ((nor.z < 0.))
  37. uv = uv + vec2(1. * (ts.y), 1. * (2. * ts.x));
  38. if ((nor.y > 0.))
  39. uv = vec2(1. - uv.x, 3. * ts.x - uv.y);
  40. else if ((nor.y < 0.))
  41. uv = vec2(1. - uv.x + 2. * ts.y, 3. * ts.x - uv.y);
  42. return uv;
  43. }
  44. vec2 rot_uv_90(vec2 uv, vec3 nor) {
  45. vec2 ts = vec2(1. / 4., 1. / 3.);
  46. if ((nor.z > 0.) && (nor.x > 0.))
  47. uv = uv + vec2(-0. * (ts.y), 1. * (2. * ts.x));
  48. else if ((nor.z > 0.))
  49. uv = uv + vec2(-1. * (ts.y), 2. * (2. * ts.x));
  50. if ((nor.z < 0.) && (nor.x < 0.))
  51. uv = uv + vec2(-1. * (ts.y), 0. * (2. * ts.x));
  52. else if ((nor.z < 0.))
  53. uv = uv + vec2(-1. * (ts.y), 1. * (2. * ts.x));
  54. if ((nor.y > 0.))
  55. uv = vec2(((uv.y - 2. * ts.x) * 1. / ts.x) * ts.y + 2. * ts.y,
  56. 3. * ts.x - (((uv.x - ts.y) * 1. / ts.y) * ts.x + ts.x));
  57. else if ((nor.y < 0.))
  58. uv = vec2(1. - (((uv.y - 0. * ts.x) * 1. / ts.x) * ts.y + 1. * ts.y) +
  59. 2. * ts.y,
  60. (((uv.x - ts.y) * 1. / ts.y) * ts.x + 0. * ts.x));
  61. return uv;
  62. }
  63. vec2 rot_uv_m(vec2 uv, vec3 nor) {
  64. vec2 ts = vec2(1. / 4., 1. / 3.);
  65. if ((nor.z > 0.) && (nor.x > 0.)) {
  66. uv = uv + vec2(1. * (ts.y), 0. * (2. * ts.x));
  67. uv.x = 1. - uv.x;
  68. } else if ((nor.z > 0.)) {
  69. uv = uv + vec2(-1. * (ts.y), 0. * (2. * ts.x));
  70. uv.x = 1. - uv.x + 1. * ts.y;
  71. }
  72. if ((nor.z < 0.) && (nor.x < 0.)) {
  73. uv = uv + vec2(-2. * (ts.y), 1. * (2. * ts.x));
  74. uv.x = 1. - uv.x + 1. * ts.y;
  75. } else if ((nor.z < 0.)) {
  76. uv = uv + vec2(-1. * (ts.y), 1. * (2. * ts.x));
  77. uv.x = 1. - uv.x - 1. * ts.y;
  78. }
  79. if ((nor.y > 0.))
  80. uv = vec2(1. - ((uv.y - 2. * ts.x) * 1. / ts.x) * ts.y + 2. * ts.y +
  81. 2. * ts.y,
  82. 3. * ts.x - (((uv.x - ts.y) * 1. / ts.y) * ts.x + ts.x));
  83. else if ((nor.y < 0.))
  84. uv = vec2(1. - (((uv.y - 0. * ts.x) * 1. / ts.x) * ts.y + 1. * ts.y) +
  85. 2. * ts.y,
  86. (1. - ((uv.x - ts.y) * 1. / ts.y) * ts.x + 3. * ts.x));
  87. return uv;
  88. }
  89. vec2 rot_uv(vec2 uv, vec3 nor, int ang) {
  90. if (ang == 0) {
  91. return uv;
  92. }
  93. if (ang == 1) {
  94. uv = rot_uv_180(uv, nor);
  95. return uv;
  96. }
  97. if (ang == 2) {
  98. uv = rot_uv_90(uv, nor);
  99. return uv;
  100. }
  101. if (ang == 3) {
  102. uv = rot_uv_180(rot_uv_90(uv, nor), nor * roty(3.1415926 / 2.));
  103. return uv;
  104. }
  105. return uv;
  106. }
  107. vec3 get_posz_cube(vec3 wmpos){
  108. vec2 shiftpos=(real_size-light_data_size)*vec2(1.,0.5)*4.;
  109. wmpos+=-vec3(shiftpos.x,0.,shiftpos.y);
  110. float obj_size=1.;
  111. float tva=(((light_data_size.x/2.)*12.*0.5-(wmpos.z-obj_size*0.5))/12.)/(light_data_size.x/2.);
  112. float va=tva;
  113. float fx=floor((1.0/6.0)*(light_data_size.x/2.))*2.;
  114. float tvb=(((light_data_size.x/2.+fx)*12.*0.5-(wmpos.x-obj_size*0.5))/12.)/(light_data_size.x/2.+fx);
  115. float vb=abs(tvb);
  116. va+=0.2;
  117. float z=(1.0 - (pow(va, 2.0) + pow(vb, 2.0)));
  118. return vec3(va,tvb,z-1.);
  119. }
  120. void vertex() {
  121. vec3 poszt=get_posz_cube((WORLD_MATRIX[3].xyz+vec3(0.5,0.,-11.5)));
  122. posz=poszt.z;
  123. mat3 rotmx=rotx(sign(poszt.x)*.5*pow(poszt.x, 2.0));
  124. mat3 rotmxm=rotx(-sign(poszt.x)*.5*pow(poszt.x, 2.0));
  125. mat3 rotmy=rotz(-sign(poszt.y)*.5*pow(poszt.y, 2.0));
  126. mat3 rotmym=rotz(sign(poszt.y)*.5*pow(poszt.y, 2.0));
  127. VERTEX=VERTEX*rotmx*rotmy;
  128. VERTEX.y+=posz*50.-0.15;
  129. VERTEX.z+=-(vec3(0.,1.,0.)*rotmxm).z*1.;
  130. VERTEX.x+=(vec3(1.,0.,0.)*rotmym).y*0.75;
  131. VERTEX.xz*=01.025;
  132. uv1[3] = rot_uv(UV, NORMAL, 0);
  133. uv1[1] = rot_uv(UV, NORMAL, 1);
  134. uv1[2] = rot_uv(UV, NORMAL, 2);
  135. uv1[0] = rot_uv(UV, NORMAL, 3);
  136. uv1m[3] = rot_uv_m(uv1[3], NORMAL);
  137. uv1m[1] = rot_uv_m(uv1[1], NORMAL * vec3(-1., 1., -1.));
  138. uv1m[2] = rot_uv_m(uv1[2], NORMAL * roty(3.1415926 / 2.));
  139. uv1m[0] =
  140. rot_uv_m(uv1[0], NORMAL * vec3(-1., 1., -1.) * roty(3.1415926 / 2.));
  141. }
  142. vec3 decodeSRGB(vec3 screenRGB) {
  143. vec3 a = screenRGB / 12.92;
  144. vec3 b = pow((screenRGB + 0.055) / 1.055, vec3(2.4));
  145. vec3 c = step(vec3(0.04045), screenRGB);
  146. return mix(a, b, c);
  147. }
  148. vec2 uv_sphere(vec3 v) {
  149. float pi = 3.1415926536;
  150. return vec2(0.5 + atan(v.z, v.x) / (2.0 * pi), acos(v.y) / pi);
  151. }
  152. vec3 gridTexture(vec2 p,vec3 light_pos,float iTime, float iscb){
  153. float d=0.;
  154. d=1.-smoothstep(0.,2.,length(p+light_pos.xz));
  155. d=max(d,1.-smoothstep(0.,3.5,length(p+vec2(0.,-0.025))));
  156. float intensity=(0.15+0.45*(p.y*(1.-smoothstep(0.,2.,abs(p.x)))));
  157. vec2 rOffset = vec2(-0.02,0)*intensity;
  158. vec2 gOffset = vec2(0.0,0)*intensity;
  159. vec2 bOffset = vec2(0.04,0)*intensity;
  160. vec3 col=vec3(texture(floor_tile,p+rOffset,iscb).r,texture(floor_tile,p+gOffset,iscb).g,texture(floor_tile,p+bOffset,iscb).b);
  161. col*=d;
  162. col*=texture(floor_texture,(p)*0.18+light_pos.xz).r;
  163. return pow(col,vec3(2.));
  164. }
  165. float iPlane( in vec3 ro, in vec3 rd )
  166. {
  167. return (-1.0 - ro.y)/rd.y;
  168. }
  169. vec2 sphere(in vec3 ro, in vec3 rd, in float r, out vec3 ni) {
  170. float pd = dot(ro, rd);
  171. float disc = pd * pd + r * r - dot(ro, ro);
  172. if (disc < 0.)
  173. return vec2(-1.);
  174. float tdiff = sqrt(disc);
  175. float tin = -pd - tdiff;
  176. float tout = -pd + tdiff;
  177. ni = normalize(ro + tin * rd);
  178. return vec2(tin, tout);
  179. }
  180. void mi(out vec4 fragColor, in vec2 p, float iTime, float iscb) {
  181. p *= 0.25;
  182. p = 0.5 * p / dot(p, p);
  183. vec2 q = p;
  184. p.y += mod(iTime * 0.5, 1. / 0.4); // loop no float precious loss
  185. vec3 col = texture(pallte, vec2(0.4 * p.y, 0.),iscb).rgb;
  186. col *= 1.4 - 0.07 * length(q);
  187. col = clamp(col, 0., 1.);
  188. fragColor = vec4(col, 1.0);
  189. }
  190. void fragment() {
  191. vec3 rdn=normalize(((CAMERA_MATRIX) * vec4(normalize(VERTEX), 0.0)).xyz);
  192. vec3 nor=normalize((CAMERA_MATRIX * vec4(NORMAL, 0.0)).xyz);
  193. vec3 res_col = vec3(0.);
  194. vec3 ref_col = vec3(0.);
  195. float iscb=texture(chbtex,(UV2+vec2(0.5,0.15))*vec2(1.5,2.)*1.5).r;
  196. for (int i = 0; i < 8; i++) {
  197. vec3 col = vec3(0.);
  198. vec2 id_pos = vec2(0.);
  199. if (i < 4) {
  200. id_pos = floor(
  201. (WORLD_MATRIX[3].zx +
  202. vec2(-4. * (mod(float(i), 2.) * (1. - 2. * float((i + 2) / 4))),
  203. 4. *
  204. (mod(float(i + 1), 2.) * (1. - 2. * float((i + 3) / 4))))) *
  205. vec2(0.5, 1.) * vec2(1. / 4.));
  206. } else {
  207. int ti = i - 4;
  208. id_pos = floor((WORLD_MATRIX[3].zx +
  209. 3. * vec2(-4. * (mod(float(ti), 2.) *
  210. (1. - 2. * float((ti + 2) / 4))),
  211. 4. * (mod(float(ti + 1), 2.) *
  212. (1. - 2. * float((ti + 3) / 4))))) *
  213. vec2(0.5, 1.) * vec2(1. / 4.));
  214. }
  215. if (any(lessThan(id_pos, vec2(-0.001)))||any(greaterThan(id_pos, vec2(real_size)-0.001)))
  216. {}else{
  217. vec4 light_data_vals =
  218. textureLod(light_data, (id_pos + 0.5) / real_size, 0.)*single_light_color;
  219. float light_power = mix(light_data_vals.w * 2.,light_data_vals.w*light_data_vals.w,light_data_vals.w);
  220. vec3 light_color = light_data_vals.rgb;
  221. float d = 0.;
  222. // EDIT NEXT LINE
  223. if (i == 3) {
  224. d = texture(texture_1, uv1[i]).r;
  225. vec3 tref_col=vec3(0.);
  226. {
  227. vec3 ref = refract(rdn,nor,0.851);
  228. vec3 ro=CAMERA_MATRIX[3].xyz-WORLD_MATRIX[3].xyz;
  229. vec3 light_pos=vec3(0.,-0.5,-04.);
  230. ro.y+=-(posz*50.-0.);
  231. float t1 = iPlane( ro, ref );
  232. if( t1>0.0 )
  233. {
  234. vec3 posx = ro + t1*ref;
  235. tref_col=light_power*light_color * gridTexture( 4.*(1./12.)*posx.xz+vec2(0.,0.75*(1./12.)),4.*(1./12.)*light_pos,TIME, iscb*5.);
  236. }
  237. ro+=light_pos;
  238. vec3 ni;
  239. vec2 t = sphere(ro, ref, 1., ni);
  240. if(t.x>0.){
  241. vec3 rd2 = ro + t.x * ref;
  242. float intensity = clamp(pow(0.32122 + max(dot(ni, normalize(-ref)), 0.), 010.85),0.,1.);
  243. vec4 tcol = vec4(0.);
  244. mi(tcol,rd2.zx,TIME, iscb*5.);
  245. vec3 tex = tcol.rgb;
  246. //tex = light_color * intensity * tex * light_power;
  247. tref_col=mix(tref_col,tex.rgb*intensity*light_color,intensity);
  248. }
  249. }
  250. ref_col = (ref_col + tref_col) + 2.5 * tref_col * ref_col;
  251. ref_col = clamp(ref_col, 0., 1.);
  252. } else {
  253. d = texture(texture_2, uv1[i - 4]).r;
  254. }
  255. col =
  256. light_color.rgb * d * 0.75 +
  257. 0.75 *
  258. clamp((-light_color.rgb + light_color.rgb / max(1. - d, 0.10001)) *
  259. 0.125,
  260. 0., 1.);
  261. col *= light_power;
  262. res_col = (res_col + col) + 2.5 * col * res_col;
  263. res_col = clamp(res_col, 0., 1.);
  264. }
  265. col = vec3(0.);
  266. id_pos = vec2(0.);
  267. if (i < 4) {
  268. id_pos = floor(
  269. (WORLD_MATRIX[3].zx +
  270. vec2(-4. * (mod(float(i), 2.) * (1. - 2. * float((i + 2) / 4))),
  271. 4. * (mod(float(i + 1), 2.) * (1. - 2. * float((i + 3) / 4)))) +
  272. vec2(4., 4.) * vec2(1. - 2. * min(mod(float(i), 3.), 1.),
  273. (1. - 2. * float((i) / 2)))) *
  274. vec2(0.5, 1.) * vec2(1. / 4.));
  275. } else {
  276. int ti = i - 4;
  277. id_pos = floor(
  278. (WORLD_MATRIX[3].zx +
  279. vec2(-4. * (mod(float(ti), 2.) * (1. - 2. * float((ti + 2) / 4))),
  280. 4. * (mod(float(ti + 1), 2.) *
  281. (1. - 2. * float((ti + 3) / 4)))) +
  282. 2. * vec2(4., 4.) *
  283. vec2(1. - 2. * min(mod(float(ti), 3.), 1.),
  284. (1. - 2. * float((ti) / 2)))) *
  285. vec2(0.5, 1.) * vec2(1. / 4.));
  286. }
  287. if (any(lessThan(id_pos, vec2(-0.001)))||any(greaterThan(id_pos, vec2(real_size)-0.001)))
  288. {}else{
  289. vec4 light_data_vals =
  290. textureLod(light_data, (id_pos + 0.5) / real_size, 0.)*single_light_color;
  291. float light_power = mix(light_data_vals.w * 2.,light_data_vals.w*light_data_vals.w,light_data_vals.w);
  292. vec3 light_color = light_data_vals.rgb;
  293. float d = 0.;
  294. if (i < 4) {
  295. d = texture(texture_3, uv1[i]).r;
  296. } else {
  297. d = texture(texture_4, uv1[i - 4]).r;
  298. }
  299. col =
  300. light_color.rgb * d * 0.75 +
  301. 0.75 *
  302. clamp((-light_color.rgb + light_color.rgb / max(1. - d, 0.10001)) *
  303. 0.125,
  304. 0., 1.);
  305. col *= light_power;
  306. res_col = (res_col + col) + 2.5 * col * res_col;
  307. res_col = clamp(res_col, 0., 1.);
  308. }
  309. col = vec3(0.);
  310. id_pos = vec2(0.);
  311. if (i < 4) {
  312. id_pos = floor(
  313. (WORLD_MATRIX[3].zx +
  314. vec2(-4. * (mod(float(i), 2.) * (1. - 2. * float((i + 2) / 4))),
  315. 4. * (mod(float(i + 1), 2.) * (1. - 2. * float((i + 3) / 4)))) +
  316. vec2(-4., 4.) * vec2(1. - 2. * min(max(float(i) - 1., 0.), 1.),
  317. (1. - 2. * min(mod(float(i), 3.), 1.)))) *
  318. vec2(0.5, 1.) * vec2(1. / 4.));
  319. } else {
  320. int ti = i - 4;
  321. id_pos = floor(
  322. (WORLD_MATRIX[3].zx +
  323. vec2(-4. * (mod(float(ti), 2.) * (1. - 2. * float((ti + 2) / 4))),
  324. 4. * (mod(float(ti + 1), 2.) *
  325. (1. - 2. * float((ti + 3) / 4)))) +
  326. 2. * vec2(-4., 4.) *
  327. vec2(1. - 2. * min(max(float(ti) - 1., 0.), 1.),
  328. (1. - 2. * min(mod(float(ti), 3.), 1.)))) *
  329. vec2(0.5, 1.) * vec2(1. / 4.));
  330. }
  331. if (any(lessThan(id_pos, vec2(-0.001)))||any(greaterThan(id_pos, vec2(real_size)-0.001)))
  332. {}else{
  333. vec4 light_data_vals =
  334. textureLod(light_data, (id_pos + 0.5) / real_size, 0.)*single_light_color;
  335. float light_power = mix(light_data_vals.w * 2.,light_data_vals.w*light_data_vals.w,light_data_vals.w);
  336. vec3 light_color = light_data_vals.rgb;
  337. float d = 0.;
  338. if (i < 4) {
  339. d = texture(texture_3, uv1m[i]).r;
  340. } else {
  341. d = texture(texture_4, uv1m[i - 4]).r;
  342. }
  343. col =
  344. light_color.rgb * d * 0.75 +
  345. 0.75 *
  346. clamp((-light_color.rgb + light_color.rgb / max(1. - d, 0.10001)) *
  347. 0.125,
  348. 0., 1.);
  349. col *= light_power;
  350. res_col = (res_col + col) + 2.5 * col * res_col;
  351. res_col = clamp(res_col, 0., 1.);
  352. }
  353. }
  354. vec2 id_gpos=floor((WORLD_MATRIX[3].zx) * vec2(0.5, 1.) * vec2(1. / 4.));
  355. bvec4 is_border=bvec4(false);
  356. is_border=bvec4(
  357. (id_gpos.x<0.5)&&(floor(mod(id_gpos.y,2.))>0.5),
  358. (id_gpos.y<0.5),
  359. (id_gpos.x>0.5+real_size.x-2.)&&(floor(mod(id_gpos.y,2.))>0.5),
  360. (id_gpos.y>0.5+real_size.y-3.)
  361. );
  362. if(any(is_border)){
  363. vec2 tuv2=uv1[0];
  364. if(is_border[0]){
  365. tuv2=uv1[3];
  366. }else
  367. if(is_border[1]){
  368. tuv2=uv1[0];
  369. }else
  370. if(is_border[2]){
  371. tuv2=uv1[1];
  372. }else
  373. if(is_border[3]){
  374. tuv2=uv1[2];
  375. }
  376. float detx=texture(texture_5,tuv2).r;
  377. detx=detx*detx*01.15+detx*0.5;
  378. res_col+=pow(detx*border_light_color.rgb,vec3(1.1));
  379. }
  380. float rv = (rand(SCREEN_UV) - .5) * .067;
  381. ALBEDO = res_col * 1. + rv;
  382. ALBEDO=clamp(ALBEDO,0.,1.);
  383. vec2 tuv=uv_sphere(rdn);
  384. tuv.x = fract(tuv.x + 0.75);
  385. ALBEDO=mix(ALBEDO,texture(panorama_bg,tuv).rgb, smoothstep(39., 149.9,
  386. length(WORLD_MATRIX[3].xyz - CAMERA_MATRIX[3].xyz)));
  387. ALBEDO=ALBEDO*iscb+ref_col*(1.-iscb*0.35);
  388. if (!OUTPUT_IS_SRGB) {
  389. ALBEDO = decodeSRGB(ALBEDO);
  390. }
  391. }