|
194 | 194 | } |
195 | 195 | // Twister weather effect |
196 | 196 | vec4 twister(vec3 pos, vec3 scale, float t) { |
197 | | - float h = hash(pos).x + .1; |
| 197 | + vec3 h = hash(pos); |
198 | 198 | float s = smoothstep(0., 8., t*t*.1 - length(pos.xz)*2.+2.); |
199 | | - if (length(scale) < .05) pos.y = mix(-10., pos.y, pow(s, 2.*h)); |
200 | | - pos.xz = mix(pos.xz*.5, pos.xz, pow(s, 2.*h)); |
201 | | - pos.xz *= rot(t*.2 + pos.y*20.*(1.-s)*exp(-1.*length(pos.xz))); |
| 199 | + if (length(scale) < .05) pos.y = mix(-10., pos.y, pow(s, 2.*h.x)); |
| 200 | + pos.xz = mix(pos.xz*.5, pos.xz, pow(s, 2.*h.x)); |
| 201 | + float rotationTime = t * (1.0 - s) * 0.2; |
| 202 | + pos.xz *= rot(rotationTime + pos.y*20.*(1.-s)*exp(-1.*length(pos.xz))); |
202 | 203 | return vec4(pos, s*s*s*s); |
203 | 204 | } |
204 | 205 |
|
|
208 | 209 | float s = pow(smoothstep(0., 5., t*t*.1 - length(pos.xz)*2. + 1.), .5 + h.x); |
209 | 210 | float y = pos.y; |
210 | 211 | pos.y = min(-10. + s*15., pos.y); |
211 | | - pos.x += pos.y*.2; |
212 | 212 | pos.xz = mix(pos.xz*.3, pos.xz, s); |
213 | 213 | pos.xz *= rot(t*.3); |
214 | 214 | return vec4(pos, smoothstep(-10., y, pos.y)); |
|
253 | 253 | // Twister Effect: swirling weather reveal |
254 | 254 | vec4 effectResult = twister(localPos, scales, t); |
255 | 255 | ${outputs.gsplat}.center = effectResult.xyz; |
256 | | - ${outputs.gsplat}.scales = mix(vec3(.005), scales, pow(effectResult.w, 30.)); |
257 | | - ${outputs.gsplat}.rgba.a = pow(effectResult.w, .7) * smoothstep(30., 0., length(localPos.xz)); |
| 256 | + ${outputs.gsplat}.scales = mix(vec3(.002), scales, pow(effectResult.w, 12.)); |
| 257 | + float s = effectResult.w; |
| 258 | + // Also apply a spin (self-rotation) so each splat rotates about its own center. |
| 259 | + float spin = -t * 0.3 * (1.0 - s); |
| 260 | + vec4 spinQ = vec4(0.0, sin(spin*0.5), 0.0, cos(spin*0.5)); |
| 261 | + ${outputs.gsplat}.quaternion = quatQuat(spinQ, ${inputs.gsplat}.quaternion); |
258 | 262 | } else if (${inputs.effectType} == 5) { |
259 | 263 | // Rain Effect: falling streaks |
260 | 264 | vec4 effectResult = rain(localPos, scales, t); |
261 | 265 | ${outputs.gsplat}.center = effectResult.xyz; |
262 | 266 | ${outputs.gsplat}.scales = mix(vec3(.005), scales, pow(effectResult.w, 30.)); |
263 | | - ${outputs.gsplat}.rgba.a = pow(effectResult.w, .7) * smoothstep(30., 0., length(localPos.xz)); |
| 267 | + // Also apply a spin (self-rotation) so each splat rotates about its own center. |
| 268 | + float spin = -t*.3; |
| 269 | + vec4 spinQ = vec4(0.0, sin(spin*0.5), 0.0, cos(spin*0.5)); |
| 270 | + ${outputs.gsplat}.quaternion = quatQuat(spinQ, ${inputs.gsplat}.quaternion); |
264 | 271 | } |
265 | 272 | `), |
266 | 273 | }); |
|
0 commit comments