@3driseai/3drise-viewer 0.1.7 → 0.1.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (259) hide show
  1. package/dist/components/Clouds.d.ts.map +1 -1
  2. package/dist/components/Clouds.js +0 -1
  3. package/dist/components/CloudsGenerator.d.ts +32 -0
  4. package/dist/components/CloudsGenerator.d.ts.map +1 -0
  5. package/dist/components/CloudsGenerator.js +58 -0
  6. package/dist/components/EnvironmentManager.d.ts +47 -5
  7. package/dist/components/EnvironmentManager.d.ts.map +1 -1
  8. package/dist/components/EnvironmentManager.js +35 -66
  9. package/dist/components/HdrEnvironment.d.ts +20 -0
  10. package/dist/components/HdrEnvironment.d.ts.map +1 -0
  11. package/dist/components/HdrEnvironment.js +44 -0
  12. package/dist/components/LandscapeBuilder.d.ts +23 -0
  13. package/dist/components/LandscapeBuilder.d.ts.map +1 -0
  14. package/dist/components/LandscapeBuilder.js +25 -0
  15. package/dist/components/LandscapeObject.d.ts +24 -0
  16. package/dist/components/LandscapeObject.d.ts.map +1 -0
  17. package/dist/components/LandscapeObject.js +27 -0
  18. package/dist/components/ObjectNode.d.ts.map +1 -1
  19. package/dist/components/ObjectNode.js +10 -0
  20. package/dist/components/OceanBuilder.d.ts +35 -0
  21. package/dist/components/OceanBuilder.d.ts.map +1 -0
  22. package/dist/components/OceanBuilder.js +53 -0
  23. package/dist/components/SceneBuilder.d.ts.map +1 -1
  24. package/dist/components/SkySystem.d.ts +27 -6
  25. package/dist/components/SkySystem.d.ts.map +1 -1
  26. package/dist/components/SkySystem.js +6 -5
  27. package/dist/components/SunLight.d.ts.map +1 -1
  28. package/dist/components/SunLight.js +4 -1
  29. package/dist/components/TerrainBuilder.d.ts +30 -0
  30. package/dist/components/TerrainBuilder.d.ts.map +1 -0
  31. package/dist/components/TerrainBuilder.js +44 -0
  32. package/dist/components/index.d.ts +17 -1
  33. package/dist/components/index.d.ts.map +1 -1
  34. package/dist/components/index.js +10 -0
  35. package/dist/components/landscape/LandscapeMesh.d.ts +18 -0
  36. package/dist/components/landscape/LandscapeMesh.d.ts.map +1 -0
  37. package/dist/components/landscape/LandscapeMesh.js +278 -0
  38. package/dist/components/landscape/index.d.ts +3 -0
  39. package/dist/components/landscape/index.d.ts.map +1 -0
  40. package/dist/components/landscape/index.js +1 -0
  41. package/dist/components/landscape/types.d.ts +13 -0
  42. package/dist/components/landscape/types.d.ts.map +1 -0
  43. package/dist/components/landscape/types.js +1 -0
  44. package/dist/components/terrain/Canyon.d.ts +23 -0
  45. package/dist/components/terrain/Canyon.d.ts.map +1 -0
  46. package/dist/components/terrain/Canyon.js +29 -0
  47. package/dist/components/terrain/Dunes.d.ts +22 -0
  48. package/dist/components/terrain/Dunes.d.ts.map +1 -0
  49. package/dist/components/terrain/Dunes.js +25 -0
  50. package/dist/components/terrain/Hills.d.ts +17 -0
  51. package/dist/components/terrain/Hills.d.ts.map +1 -0
  52. package/dist/components/terrain/Hills.js +20 -0
  53. package/dist/components/terrain/Mountains.d.ts +19 -0
  54. package/dist/components/terrain/Mountains.d.ts.map +1 -0
  55. package/dist/components/terrain/Mountains.js +22 -0
  56. package/dist/components/terrain/TerrainSurface.d.ts +22 -0
  57. package/dist/components/terrain/TerrainSurface.d.ts.map +1 -0
  58. package/dist/components/terrain/TerrainSurface.js +94 -0
  59. package/dist/components/terrain/index.d.ts +7 -0
  60. package/dist/components/terrain/index.d.ts.map +1 -0
  61. package/dist/components/terrain/index.js +7 -0
  62. package/dist/components/terrain/types.d.ts +17 -0
  63. package/dist/components/terrain/types.d.ts.map +1 -0
  64. package/dist/components/terrain/types.js +1 -0
  65. package/dist/components/volumetricClouds/Cirrus.d.ts +14 -0
  66. package/dist/components/volumetricClouds/Cirrus.d.ts.map +1 -0
  67. package/dist/components/volumetricClouds/Cirrus.js +13 -0
  68. package/dist/components/volumetricClouds/Cumulonimbus.d.ts +17 -0
  69. package/dist/components/volumetricClouds/Cumulonimbus.d.ts.map +1 -0
  70. package/dist/components/volumetricClouds/Cumulonimbus.js +20 -0
  71. package/dist/components/volumetricClouds/Cumulus.d.ts +14 -0
  72. package/dist/components/volumetricClouds/Cumulus.d.ts.map +1 -0
  73. package/dist/components/volumetricClouds/Cumulus.js +17 -0
  74. package/dist/components/volumetricClouds/Stratocumulus.d.ts +12 -0
  75. package/dist/components/volumetricClouds/Stratocumulus.d.ts.map +1 -0
  76. package/dist/components/volumetricClouds/Stratocumulus.js +16 -0
  77. package/dist/components/volumetricClouds/VolumetricCloudsPass.d.ts +42 -0
  78. package/dist/components/volumetricClouds/VolumetricCloudsPass.d.ts.map +1 -0
  79. package/dist/components/volumetricClouds/VolumetricCloudsPass.js +298 -0
  80. package/dist/components/volumetricClouds/index.d.ts +8 -0
  81. package/dist/components/volumetricClouds/index.d.ts.map +1 -0
  82. package/dist/components/volumetricClouds/index.js +7 -0
  83. package/dist/components/volumetricClouds/types.d.ts +17 -0
  84. package/dist/components/volumetricClouds/types.d.ts.map +1 -0
  85. package/dist/components/volumetricClouds/types.js +1 -0
  86. package/dist/components/water/Host.d.ts +12 -0
  87. package/dist/components/water/Host.d.ts.map +1 -0
  88. package/dist/components/water/Host.js +12 -0
  89. package/dist/components/water/Lake.d.ts +18 -0
  90. package/dist/components/water/Lake.d.ts.map +1 -0
  91. package/dist/components/water/Lake.js +21 -0
  92. package/dist/components/water/OceanSurface.d.ts +27 -0
  93. package/dist/components/water/OceanSurface.d.ts.map +1 -0
  94. package/dist/components/water/OceanSurface.js +60 -0
  95. package/dist/components/water/Sea.d.ts +18 -0
  96. package/dist/components/water/Sea.d.ts.map +1 -0
  97. package/dist/components/water/Sea.js +17 -0
  98. package/dist/components/water/Shore.d.ts +16 -0
  99. package/dist/components/water/Shore.d.ts.map +1 -0
  100. package/dist/components/water/Shore.js +15 -0
  101. package/dist/components/water/Storm.d.ts +14 -0
  102. package/dist/components/water/Storm.d.ts.map +1 -0
  103. package/dist/components/water/Storm.js +13 -0
  104. package/dist/components/water/WaterBody.d.ts +31 -0
  105. package/dist/components/water/WaterBody.d.ts.map +1 -0
  106. package/dist/components/water/WaterBody.js +76 -0
  107. package/dist/components/water/index.d.ts +9 -0
  108. package/dist/components/water/index.d.ts.map +1 -0
  109. package/dist/components/water/index.js +11 -0
  110. package/dist/components/water/types.d.ts +20 -0
  111. package/dist/components/water/types.d.ts.map +1 -0
  112. package/dist/components/water/types.js +1 -0
  113. package/dist/constants.d.ts.map +1 -1
  114. package/dist/constants.js +9 -0
  115. package/dist/hooks/index.d.ts +24 -1
  116. package/dist/hooks/index.d.ts.map +1 -1
  117. package/dist/hooks/index.js +12 -0
  118. package/dist/hooks/useClipmap.d.ts +71 -0
  119. package/dist/hooks/useClipmap.d.ts.map +1 -0
  120. package/dist/hooks/useClipmap.js +81 -0
  121. package/dist/hooks/useCloudLive.d.ts +29 -0
  122. package/dist/hooks/useCloudLive.d.ts.map +1 -0
  123. package/dist/hooks/useCloudLive.js +43 -0
  124. package/dist/hooks/useCloudNoise.d.ts +28 -0
  125. package/dist/hooks/useCloudNoise.d.ts.map +1 -0
  126. package/dist/hooks/useCloudNoise.js +128 -0
  127. package/dist/hooks/useCloudSun.d.ts +49 -0
  128. package/dist/hooks/useCloudSun.d.ts.map +1 -0
  129. package/dist/hooks/useCloudSun.js +84 -0
  130. package/dist/hooks/useCubeCamera.d.ts +27 -9
  131. package/dist/hooks/useCubeCamera.d.ts.map +1 -1
  132. package/dist/hooks/useCubeCamera.js +28 -70
  133. package/dist/hooks/useEnvironmentProbe.d.ts +32 -0
  134. package/dist/hooks/useEnvironmentProbe.d.ts.map +1 -0
  135. package/dist/hooks/useEnvironmentProbe.js +35 -0
  136. package/dist/hooks/useFrameRenderer.d.ts +15 -0
  137. package/dist/hooks/useFrameRenderer.d.ts.map +1 -0
  138. package/dist/hooks/useFrameRenderer.js +23 -0
  139. package/dist/hooks/useLandscapeLive.d.ts +29 -0
  140. package/dist/hooks/useLandscapeLive.d.ts.map +1 -0
  141. package/dist/hooks/useLandscapeLive.js +41 -0
  142. package/dist/hooks/useLandscapeMaps.d.ts +32 -0
  143. package/dist/hooks/useLandscapeMaps.d.ts.map +1 -0
  144. package/dist/hooks/useLandscapeMaps.js +138 -0
  145. package/dist/hooks/useOceanLive.d.ts +29 -0
  146. package/dist/hooks/useOceanLive.d.ts.map +1 -0
  147. package/dist/hooks/useOceanLive.js +38 -0
  148. package/dist/hooks/useOceanMaterial.d.ts +39 -0
  149. package/dist/hooks/useOceanMaterial.d.ts.map +1 -0
  150. package/dist/hooks/useOceanMaterial.js +65 -0
  151. package/dist/hooks/useTerrainClipmap.d.ts +12 -0
  152. package/dist/hooks/useTerrainClipmap.d.ts.map +1 -0
  153. package/dist/hooks/useTerrainClipmap.js +10 -0
  154. package/dist/hooks/useTerrainLive.d.ts +34 -0
  155. package/dist/hooks/useTerrainLive.d.ts.map +1 -0
  156. package/dist/hooks/useTerrainLive.js +45 -0
  157. package/dist/index.d.ts +26 -0
  158. package/dist/index.d.ts.map +1 -1
  159. package/dist/index.js +16 -0
  160. package/dist/presets/landscapePresets.d.ts +60 -0
  161. package/dist/presets/landscapePresets.d.ts.map +1 -0
  162. package/dist/presets/landscapePresets.js +194 -0
  163. package/dist/presets/landscapeTypes.d.ts +195 -0
  164. package/dist/presets/landscapeTypes.d.ts.map +1 -0
  165. package/dist/presets/landscapeTypes.js +315 -0
  166. package/dist/presets/oceanSurfacePresets.d.ts +33 -0
  167. package/dist/presets/oceanSurfacePresets.d.ts.map +1 -0
  168. package/dist/presets/oceanSurfacePresets.js +245 -0
  169. package/dist/presets/terrainPresets.d.ts +28 -0
  170. package/dist/presets/terrainPresets.d.ts.map +1 -0
  171. package/dist/presets/terrainPresets.js +293 -0
  172. package/dist/presets/volumetricCloudPresets.d.ts +38 -0
  173. package/dist/presets/volumetricCloudPresets.d.ts.map +1 -0
  174. package/dist/presets/volumetricCloudPresets.js +480 -0
  175. package/dist/shaders/clouds/CirrusMaterial.d.ts +84 -0
  176. package/dist/shaders/clouds/CirrusMaterial.d.ts.map +1 -0
  177. package/dist/shaders/clouds/CirrusMaterial.js +167 -0
  178. package/dist/shaders/clouds/CloudCompositeMaterial.d.ts +20 -0
  179. package/dist/shaders/clouds/CloudCompositeMaterial.d.ts.map +1 -0
  180. package/dist/shaders/clouds/CloudCompositeMaterial.js +82 -0
  181. package/dist/shaders/clouds/CloudResolveMaterial.d.ts +22 -0
  182. package/dist/shaders/clouds/CloudResolveMaterial.d.ts.map +1 -0
  183. package/dist/shaders/clouds/CloudResolveMaterial.js +77 -0
  184. package/dist/shaders/clouds/CloudVolumeMaterial.d.ts +143 -0
  185. package/dist/shaders/clouds/CloudVolumeMaterial.d.ts.map +1 -0
  186. package/dist/shaders/clouds/CloudVolumeMaterial.js +249 -0
  187. package/dist/shaders/clouds/SkyBackgroundMaterial.d.ts +21 -0
  188. package/dist/shaders/clouds/SkyBackgroundMaterial.d.ts.map +1 -0
  189. package/dist/shaders/clouds/SkyBackgroundMaterial.js +42 -0
  190. package/dist/shaders/glsl/cloudCore.glsl.d.ts +24 -0
  191. package/dist/shaders/glsl/cloudCore.glsl.d.ts.map +1 -0
  192. package/dist/shaders/glsl/cloudCore.glsl.js +348 -0
  193. package/dist/shaders/glsl/landscapeCore.glsl.d.ts +49 -0
  194. package/dist/shaders/glsl/landscapeCore.glsl.d.ts.map +1 -0
  195. package/dist/shaders/glsl/landscapeCore.glsl.js +518 -0
  196. package/dist/shaders/glsl/noiseBake.glsl.d.ts +30 -0
  197. package/dist/shaders/glsl/noiseBake.glsl.d.ts.map +1 -0
  198. package/dist/shaders/glsl/noiseBake.glsl.js +164 -0
  199. package/dist/shaders/glsl/oceanCore.glsl.d.ts +52 -0
  200. package/dist/shaders/glsl/oceanCore.glsl.d.ts.map +1 -0
  201. package/dist/shaders/glsl/oceanCore.glsl.js +421 -0
  202. package/dist/shaders/glsl/terrainCore.glsl.d.ts +78 -0
  203. package/dist/shaders/glsl/terrainCore.glsl.d.ts.map +1 -0
  204. package/dist/shaders/glsl/terrainCore.glsl.js +625 -0
  205. package/dist/shaders/landscape/LandscapeMaterial.d.ts +73 -0
  206. package/dist/shaders/landscape/LandscapeMaterial.d.ts.map +1 -0
  207. package/dist/shaders/landscape/LandscapeMaterial.js +136 -0
  208. package/dist/shaders/ocean/OceanSurfaceMaterial.d.ts +57 -0
  209. package/dist/shaders/ocean/OceanSurfaceMaterial.d.ts.map +1 -0
  210. package/dist/shaders/ocean/OceanSurfaceMaterial.js +268 -0
  211. package/dist/shaders/terrain/TerrainMaterial.d.ts +80 -0
  212. package/dist/shaders/terrain/TerrainMaterial.d.ts.map +1 -0
  213. package/dist/shaders/terrain/TerrainMaterial.js +291 -0
  214. package/dist/types/cloudConfigs.d.ts +244 -0
  215. package/dist/types/cloudConfigs.d.ts.map +1 -0
  216. package/dist/types/cloudConfigs.js +282 -0
  217. package/dist/types/index.d.ts +8 -0
  218. package/dist/types/index.d.ts.map +1 -1
  219. package/dist/types/index.js +4 -1
  220. package/dist/types/landscapeConfigs.d.ts +218 -0
  221. package/dist/types/landscapeConfigs.d.ts.map +1 -0
  222. package/dist/types/landscapeConfigs.js +256 -0
  223. package/dist/types/oceanConfigs.d.ts +290 -0
  224. package/dist/types/oceanConfigs.d.ts.map +1 -0
  225. package/dist/types/oceanConfigs.js +380 -0
  226. package/dist/types/terrainConfigs.d.ts +251 -0
  227. package/dist/types/terrainConfigs.d.ts.map +1 -0
  228. package/dist/types/terrainConfigs.js +292 -0
  229. package/dist/utils/cloudUniforms.d.ts +14 -0
  230. package/dist/utils/cloudUniforms.d.ts.map +1 -0
  231. package/dist/utils/cloudUniforms.js +122 -0
  232. package/dist/utils/frameRenderer.d.ts +33 -0
  233. package/dist/utils/frameRenderer.d.ts.map +1 -0
  234. package/dist/utils/frameRenderer.js +24 -0
  235. package/dist/utils/handleCloudsAnimations.d.ts +16 -0
  236. package/dist/utils/handleCloudsAnimations.d.ts.map +1 -0
  237. package/dist/utils/handleCloudsAnimations.js +64 -0
  238. package/dist/utils/landscapeGeometry.d.ts +61 -0
  239. package/dist/utils/landscapeGeometry.d.ts.map +1 -0
  240. package/dist/utils/landscapeGeometry.js +126 -0
  241. package/dist/utils/landscapeHeight.d.ts +44 -0
  242. package/dist/utils/landscapeHeight.d.ts.map +1 -0
  243. package/dist/utils/landscapeHeight.js +65 -0
  244. package/dist/utils/landscapeTextures.d.ts +94 -0
  245. package/dist/utils/landscapeTextures.d.ts.map +1 -0
  246. package/dist/utils/landscapeTextures.js +290 -0
  247. package/dist/utils/landscapeUniforms.d.ts +20 -0
  248. package/dist/utils/landscapeUniforms.d.ts.map +1 -0
  249. package/dist/utils/landscapeUniforms.js +61 -0
  250. package/dist/utils/oceanUniforms.d.ts +47 -0
  251. package/dist/utils/oceanUniforms.d.ts.map +1 -0
  252. package/dist/utils/oceanUniforms.js +216 -0
  253. package/dist/utils/rtin.d.ts +63 -0
  254. package/dist/utils/rtin.d.ts.map +1 -0
  255. package/dist/utils/rtin.js +202 -0
  256. package/dist/utils/terrainUniforms.d.ts +14 -0
  257. package/dist/utils/terrainUniforms.d.ts.map +1 -0
  258. package/dist/utils/terrainUniforms.js +196 -0
  259. package/package.json +2 -2
@@ -0,0 +1,167 @@
1
+ import * as THREE from 'three';
2
+ import { shaderMaterial } from '@react-three/drei';
3
+ import { extend } from '@react-three/fiber';
4
+ import { cloudCommon, skyLib, cloudGeometry } from '../glsl/cloudCore.glsl.js';
5
+ /**
6
+ * Cirrus is not a volume, and rendering it as one is why most implementations get it
7
+ * wrong. It is ice, not water: optical depth well under one, no meaningful self-shadow,
8
+ * lit almost entirely by forward scattering, and stretched hard along the shear vector
9
+ * into fibratus streaks.
10
+ *
11
+ * Three samples through a thin slab is enough. What it needs instead of samples is
12
+ * anisotropy and the 22-degree halo — the refraction minimum of a hexagonal ice prism,
13
+ * which is the detail that makes a viewer read "ice" rather than "thin cloud".
14
+ */
15
+ const vertex = /* glsl */ `
16
+ out vec2 vUv;
17
+ void main(){ vUv = uv; gl_Position = vec4(position.xy, 0.0, 1.0); }
18
+ `;
19
+ const fragment = /* glsl */ `
20
+ ${cloudCommon}
21
+ precision highp float;
22
+ precision highp sampler2D;
23
+ ${skyLib}
24
+
25
+ uniform float u_curvature;
26
+ ${cloudGeometry}
27
+
28
+ in vec2 vUv;
29
+ out vec4 outColor;
30
+
31
+ uniform sampler2D u_weather;
32
+ uniform sampler2D u_depth;
33
+ uniform float u_hasDepth;
34
+ uniform float u_time;
35
+ uniform vec3 u_camPos, u_camFwd;
36
+ uniform mat4 u_invProj, u_camWorld;
37
+ uniform float u_near, u_far;
38
+ uniform vec2 u_resolution;
39
+
40
+ uniform float u_altitude, u_thickness;
41
+ uniform float u_coverage, u_opticalDepth;
42
+ uniform float u_featureScale, u_anisotropy;
43
+ uniform vec2 u_windDir;
44
+ uniform float u_windSpeed;
45
+ uniform float u_halo, u_g1, u_g2;
46
+ uniform vec3 u_skyAmbient;
47
+ uniform float u_ambient, u_sunIntensityScale, u_fogDensity;
48
+ uniform float u_screenSpace;
49
+
50
+ float hg(float mu, float g){
51
+ float g2 = g * g;
52
+ return (1.0 - g2) / (4.0 * PI * pow(max(1.0 + g2 - 2.0 * g * mu, 1e-4), 1.5));
53
+ }
54
+
55
+ /**
56
+ * Noise rotated into the wind frame, then compressed along it. Compressing the
57
+ * coordinate stretches the feature, so streaks always follow the shear no matter which
58
+ * way the wind points — rotating the sample rather than the result is what keeps that
59
+ * true when the wind bearing is animated.
60
+ */
61
+ float cirrusField(vec3 p){
62
+ vec2 wd = normalize(u_windDir + vec2(1e-5, 0.0));
63
+ mat2 R = mat2(wd.x, -wd.y, wd.y, wd.x);
64
+ vec2 q = R * (p.xz * u_featureScale);
65
+ q.x *= u_anisotropy;
66
+ vec2 drift = vec2(u_time * u_windSpeed * u_featureScale, 0.0);
67
+ float a = texture(u_weather, q + drift).r;
68
+ float b = texture(u_weather, q * 2.7 + drift * 1.7 + vec2(0.41, 0.13)).g;
69
+ float c = texture(u_weather, q * 6.3 - drift * 0.6 + vec2(0.83, 0.37)).g;
70
+ float n = a * 0.55 + b * 0.30 + c * 0.15;
71
+ return saturate(remap(n, 1.0 - u_coverage, 1.0 - u_coverage * 0.35, 0.0, 1.0));
72
+ }
73
+
74
+ void main(){
75
+ vec2 uv = (u_screenSpace > 0.5) ? vUv : (gl_FragCoord.xy / u_resolution);
76
+ vec2 ndc = uv * 2.0 - 1.0;
77
+ vec4 vp = u_invProj * vec4(ndc, -1.0, 1.0); vp /= vp.w;
78
+ vec3 rd = normalize(mat3(u_camWorld) * vp.xyz);
79
+ vec3 ro = u_camPos;
80
+
81
+ float maxT = 1e7;
82
+ if (u_hasDepth > 0.5){
83
+ float dz = texture(u_depth, uv).x;
84
+ if (dz < 0.999999){
85
+ float viewZ = (u_near * u_far) / ((u_far - u_near) * dz - u_far);
86
+ maxT = -viewZ / max(dot(rd, u_camFwd), 1e-4);
87
+ }
88
+ }
89
+
90
+ vec3 acc = vec3(0.0);
91
+ float T = 1.0;
92
+
93
+ float t0, t1;
94
+ if (layerRange(ro, rd, u_altitude, u_altitude + u_thickness, t0, t1)){
95
+ // Cap the traversal or a grazing ray turns the horizon into an opaque wall.
96
+ t1 = min(min(t1, maxT), t0 + u_thickness * 6.0);
97
+ if (t1 > t0){
98
+ float mu = dot(rd, u_sunDir);
99
+ float dt = (t1 - t0) / 3.0;
100
+
101
+ // 22 degrees = 0.3840 rad. The minimum deviation angle of a 60-degree ice prism.
102
+ float halo = smoothstep(0.030, 0.004, abs(acos(clamp(mu, -1.0, 1.0)) - 0.3840)) * u_halo;
103
+ float ph = mix(hg(mu, u_g1), hg(mu, u_g2), 0.35);
104
+
105
+ for (int i = 0; i < 3; i++){
106
+ vec3 p = ro + rd * (t0 + dt * (float(i) + 0.5));
107
+ float d = cirrusField(p) * u_opticalDepth;
108
+ if (d > 0.0){
109
+ float sigma = d * 0.0007 * dt;
110
+ vec3 S = u_sunColor * (u_sunIntensity * SUN_RADIANCE * u_sunIntensityScale)
111
+ * (ph * 0.9 + halo * 0.5)
112
+ + u_skyAmbient * 0.35 * u_ambient;
113
+ float trs = exp(-sigma);
114
+ acc += T * S * (1.0 - trs);
115
+ T *= trs;
116
+ }
117
+ }
118
+ // Same rule as the deck: dissolve toward the real background rather than
119
+ // toward an analytic sky that is not what the viewer is looking at.
120
+ float fogT = exp(-t0 * u_fogDensity * 0.55);
121
+ acc *= fogT;
122
+ T = mix(1.0, T, fogT);
123
+ }
124
+ }
125
+
126
+ outColor = vec4(acc, T);
127
+ }
128
+ `;
129
+ export const cirrusDefaults = {
130
+ u_weather: null,
131
+ u_depth: null,
132
+ u_hasDepth: 0,
133
+ u_time: 0,
134
+ u_sunDir: new THREE.Vector3(0.3, 0.4, 0.86).normalize(),
135
+ u_sunColor: new THREE.Color(1, 1, 1),
136
+ u_sunIntensity: 1,
137
+ u_turbidity: 1,
138
+ u_rayleigh: 1,
139
+ u_mieCoefficient: 0.005,
140
+ u_mieG: 0.76,
141
+ u_skyAmbient: new THREE.Color(0.32, 0.5, 0.86),
142
+ u_ambient: 1,
143
+ u_sunIntensityScale: 1,
144
+ u_altitude: 8200,
145
+ u_thickness: 700,
146
+ u_coverage: 0.62,
147
+ u_opticalDepth: 0.95,
148
+ u_featureScale: 1 / 44000,
149
+ u_anisotropy: 0.11,
150
+ u_windDir: new THREE.Vector2(1, 0.22).normalize(),
151
+ u_windSpeed: 16,
152
+ u_halo: 1.1,
153
+ u_g1: 0.9,
154
+ u_g2: 0.2,
155
+ u_curvature: 1 / (2 * 6371000),
156
+ u_fogDensity: 0.000026,
157
+ u_camPos: new THREE.Vector3(),
158
+ u_camFwd: new THREE.Vector3(0, 0, -1),
159
+ u_invProj: new THREE.Matrix4(),
160
+ u_camWorld: new THREE.Matrix4(),
161
+ u_near: 1,
162
+ u_far: 100000,
163
+ u_resolution: new THREE.Vector2(1, 1),
164
+ u_screenSpace: 1
165
+ };
166
+ export const CirrusMaterial = shaderMaterial(cirrusDefaults, vertex, fragment);
167
+ extend({ CirrusMaterial });
@@ -0,0 +1,20 @@
1
+ import * as THREE from 'three';
2
+ import { type ThreeElement } from '@react-three/fiber';
3
+ export declare const CloudCompositeMaterial: import("@react-three/fiber").ConstructorRepresentation<THREE.ShaderMaterial & {
4
+ u_scene: any;
5
+ u_clouds: any;
6
+ u_cirrus: any;
7
+ u_depth: any;
8
+ u_lowTexel: THREE.Vector2;
9
+ u_exposure: number;
10
+ u_tonemap: number;
11
+ u_hasCirrus: number;
12
+ }> & {
13
+ key: string;
14
+ };
15
+ declare module '@react-three/fiber' {
16
+ interface ThreeElements {
17
+ cloudCompositeMaterial: ThreeElement<typeof CloudCompositeMaterial>;
18
+ }
19
+ }
20
+ //# sourceMappingURL=CloudCompositeMaterial.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CloudCompositeMaterial.d.ts","sourceRoot":"","sources":["../../../src/shaders/clouds/CloudCompositeMaterial.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAE9B,OAAO,EAAU,KAAK,YAAY,EAAE,MAAM,oBAAoB,CAAA;AAyE9D,eAAO,MAAM,sBAAsB;;;;;;;;;;;CAalC,CAAA;AAID,OAAO,QAAQ,oBAAoB,CAAC;IAClC,UAAU,aAAa;QACrB,sBAAsB,EAAE,YAAY,CAAC,OAAO,sBAAsB,CAAC,CAAA;KACpE;CACF"}
@@ -0,0 +1,82 @@
1
+ import * as THREE from 'three';
2
+ import { shaderMaterial } from '@react-three/drei';
3
+ import { extend } from '@react-three/fiber';
4
+ /**
5
+ * Depth-aware upsample and composite for the layer path.
6
+ *
7
+ * A plain bilinear upsample of the half-res cloud buffer smears cloud across the
8
+ * silhouette of any geometry it meets. Weighting the four taps by depth similarity keeps
9
+ * the edge where the geometry is.
10
+ *
11
+ * u_tonemap: 1 when this pass writes the final image (the layer path takes over
12
+ * rendering, so three's own tone mapping never runs); 0 when something downstream —
13
+ * an EffectComposer, say — will tonemap instead.
14
+ */
15
+ const vertex = /* glsl */ `
16
+ out vec2 vUv;
17
+ void main(){ vUv = uv; gl_Position = vec4(position.xy, 0.0, 1.0); }
18
+ `;
19
+ const fragment = /* glsl */ `
20
+ precision highp float;
21
+ in vec2 vUv;
22
+ out vec4 outColor;
23
+
24
+ uniform sampler2D u_scene;
25
+ uniform sampler2D u_clouds;
26
+ uniform sampler2D u_cirrus;
27
+ uniform sampler2D u_depth;
28
+ uniform vec2 u_lowTexel;
29
+ uniform float u_exposure;
30
+ uniform float u_tonemap;
31
+ uniform float u_hasCirrus;
32
+
33
+ vec3 aces(vec3 x){
34
+ const float a = 2.51, b = 0.03, c = 2.43, d = 0.59, e = 0.14;
35
+ return clamp((x * (a * x + b)) / (x * (c * x + d) + e), 0.0, 1.0);
36
+ }
37
+
38
+ vec4 bilateral(sampler2D tex, float dRef){
39
+ vec4 sum = vec4(0.0);
40
+ float wsum = 0.0;
41
+ for (int y = -1; y <= 1; y++)
42
+ for (int x = -1; x <= 1; x++){
43
+ vec2 o = vec2(float(x), float(y)) * u_lowTexel;
44
+ float dS = texture(u_depth, vUv + o).x;
45
+ float w = exp(-abs(dS - dRef) * 900.0) * (1.0 - 0.18 * float(abs(x) + abs(y)));
46
+ sum += texture(tex, vUv + o) * w;
47
+ wsum += w;
48
+ }
49
+ return (wsum > 0.0) ? sum / wsum : texture(tex, vUv);
50
+ }
51
+
52
+ void main(){
53
+ vec3 col = texture(u_scene, vUv).rgb;
54
+ float dRef = texture(u_depth, vUv).x;
55
+
56
+ // Cirrus sits above and beyond the convective deck, so it composites first.
57
+ if (u_hasCirrus > 0.5){
58
+ vec4 ci = bilateral(u_cirrus, dRef);
59
+ col = col * ci.a + ci.rgb;
60
+ }
61
+ vec4 cl = bilateral(u_clouds, dRef);
62
+ col = col * cl.a + cl.rgb;
63
+
64
+ col *= u_exposure;
65
+ if (u_tonemap > 0.5){
66
+ col = aces(col);
67
+ col = pow(col, vec3(1.0 / 2.2));
68
+ }
69
+ outColor = vec4(col, 1.0);
70
+ }
71
+ `;
72
+ export const CloudCompositeMaterial = shaderMaterial({
73
+ u_scene: null,
74
+ u_clouds: null,
75
+ u_cirrus: null,
76
+ u_depth: null,
77
+ u_lowTexel: new THREE.Vector2(1, 1),
78
+ u_exposure: 1,
79
+ u_tonemap: 1,
80
+ u_hasCirrus: 0
81
+ }, vertex, fragment);
82
+ extend({ CloudCompositeMaterial });
@@ -0,0 +1,22 @@
1
+ import * as THREE from 'three';
2
+ import { type ThreeElement } from '@react-three/fiber';
3
+ export declare const CloudResolveMaterial: import("@react-three/fiber").ConstructorRepresentation<THREE.ShaderMaterial & {
4
+ u_current: any;
5
+ u_history: any;
6
+ u_prevViewProj: THREE.Matrix4;
7
+ u_invProj: THREE.Matrix4;
8
+ u_camWorld: THREE.Matrix4;
9
+ u_camPos: THREE.Vector3;
10
+ u_texel: THREE.Vector2;
11
+ u_blend: number;
12
+ u_proxyHeight: number;
13
+ u_valid: number;
14
+ }> & {
15
+ key: string;
16
+ };
17
+ declare module '@react-three/fiber' {
18
+ interface ThreeElements {
19
+ cloudResolveMaterial: ThreeElement<typeof CloudResolveMaterial>;
20
+ }
21
+ }
22
+ //# sourceMappingURL=CloudResolveMaterial.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CloudResolveMaterial.d.ts","sourceRoot":"","sources":["../../../src/shaders/clouds/CloudResolveMaterial.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAE9B,OAAO,EAAU,KAAK,YAAY,EAAE,MAAM,oBAAoB,CAAA;AAkE9D,eAAO,MAAM,oBAAoB;;;;;;;;;;;;;CAehC,CAAA;AAID,OAAO,QAAQ,oBAAoB,CAAC;IAClC,UAAU,aAAa;QACrB,oBAAoB,EAAE,YAAY,CAAC,OAAO,oBAAoB,CAAC,CAAA;KAChE;CACF"}
@@ -0,0 +1,77 @@
1
+ import * as THREE from 'three';
2
+ import { shaderMaterial } from '@react-three/drei';
3
+ import { extend } from '@react-three/fiber';
4
+ /**
5
+ * Temporal resolve for the layer path. Blends this frame's half-resolution march with a
6
+ * reprojected history buffer, so 96 march steps at quarter the pixel count converge to
7
+ * something close to a full-resolution result over ~4 frames.
8
+ *
9
+ * Reprojection runs against a proxy surface at the layer's mid-height rather than a
10
+ * per-pixel cloud depth. That avoids a second render target for depth, and for a layer
11
+ * that is far relative to per-frame camera motion the two are indistinguishable. The
12
+ * neighbourhood clamp is what actually prevents ghosting.
13
+ */
14
+ const vertex = /* glsl */ `
15
+ out vec2 vUv;
16
+ void main(){ vUv = uv; gl_Position = vec4(position.xy, 0.0, 1.0); }
17
+ `;
18
+ const fragment = /* glsl */ `
19
+ precision highp float;
20
+ in vec2 vUv;
21
+ out vec4 outColor;
22
+
23
+ uniform sampler2D u_current;
24
+ uniform sampler2D u_history;
25
+ uniform mat4 u_prevViewProj;
26
+ uniform mat4 u_invProj, u_camWorld;
27
+ uniform vec3 u_camPos;
28
+ uniform vec2 u_texel;
29
+ uniform float u_blend;
30
+ uniform float u_proxyHeight;
31
+ uniform float u_valid;
32
+
33
+ void main(){
34
+ vec4 cur = texture(u_current, vUv);
35
+
36
+ if (u_valid < 0.5){ outColor = cur; return; }
37
+
38
+ vec2 ndc = vUv * 2.0 - 1.0;
39
+ vec4 vp = u_invProj * vec4(ndc, -1.0, 1.0); vp /= vp.w;
40
+ vec3 rd = normalize(mat3(u_camWorld) * vp.xyz);
41
+
42
+ float denom = (abs(rd.y) < 1e-3) ? (1e-3 * sign(rd.y + 1e-6)) : rd.y;
43
+ float t = (u_proxyHeight - u_camPos.y) / denom;
44
+ if (t < 0.0) t = 40000.0;
45
+ t = clamp(t, 200.0, 60000.0);
46
+ vec3 world = u_camPos + rd * t;
47
+
48
+ vec4 clip = u_prevViewProj * vec4(world, 1.0);
49
+ vec2 pUv = (clip.xy / clip.w) * 0.5 + 0.5;
50
+ if (clip.w <= 0.0 || pUv.x < 0.0 || pUv.x > 1.0 || pUv.y < 0.0 || pUv.y > 1.0){
51
+ outColor = cur; return;
52
+ }
53
+
54
+ vec4 hist = texture(u_history, pUv);
55
+
56
+ vec4 lo = cur, hi = cur;
57
+ for (int y = -1; y <= 1; y++)
58
+ for (int x = -1; x <= 1; x++){
59
+ vec4 s = texture(u_current, vUv + vec2(float(x), float(y)) * u_texel);
60
+ lo = min(lo, s); hi = max(hi, s);
61
+ }
62
+ outColor = mix(cur, clamp(hist, lo, hi), u_blend);
63
+ }
64
+ `;
65
+ export const CloudResolveMaterial = shaderMaterial({
66
+ u_current: null,
67
+ u_history: null,
68
+ u_prevViewProj: new THREE.Matrix4(),
69
+ u_invProj: new THREE.Matrix4(),
70
+ u_camWorld: new THREE.Matrix4(),
71
+ u_camPos: new THREE.Vector3(),
72
+ u_texel: new THREE.Vector2(1, 1),
73
+ u_blend: 0.9,
74
+ u_proxyHeight: 2400,
75
+ u_valid: 0
76
+ }, vertex, fragment);
77
+ extend({ CloudResolveMaterial });
@@ -0,0 +1,143 @@
1
+ import * as THREE from 'three';
2
+ import { type ThreeElement } from '@react-three/fiber';
3
+ export interface CloudVolumeUniformDefaults {
4
+ [key: string]: unknown;
5
+ }
6
+ export declare const cloudVolumeDefaults: {
7
+ u_base: any;
8
+ u_detail: any;
9
+ u_weather: any;
10
+ u_curl: any;
11
+ u_depth: any;
12
+ u_hasDepth: number;
13
+ u_time: number;
14
+ u_frame: number;
15
+ u_sunDir: THREE.Vector3;
16
+ u_sunColor: THREE.Color;
17
+ u_sunIntensity: number;
18
+ u_turbidity: number;
19
+ u_rayleigh: number;
20
+ u_mieCoefficient: number;
21
+ u_mieG: number;
22
+ u_skyAmbient: THREE.Color;
23
+ u_groundAmbient: THREE.Color;
24
+ u_coverage: number;
25
+ u_density: number;
26
+ u_cloudType: number;
27
+ u_baseScale: number;
28
+ u_detailScale: number;
29
+ u_detailStrength: number;
30
+ u_curlStrength: number;
31
+ u_layerBottom: number;
32
+ u_layerTop: number;
33
+ u_shear: number;
34
+ u_anvil: number;
35
+ u_precip: number;
36
+ u_weatherScale: number;
37
+ u_evolution: number;
38
+ u_windDir: THREE.Vector2;
39
+ u_windSpeed: number;
40
+ u_rise: number;
41
+ u_churn: number;
42
+ u_sigmaT: number;
43
+ u_g1: number;
44
+ u_g2: number;
45
+ u_msExtinction: number;
46
+ u_msEnergy: number;
47
+ u_msPhase: number;
48
+ u_powder: number;
49
+ u_silver: number;
50
+ u_ambient: number;
51
+ u_steps: number;
52
+ u_lightSteps: number;
53
+ u_lightStep: number;
54
+ u_stepGrowth: number;
55
+ u_maxSpan: number;
56
+ u_detailFade: number;
57
+ u_host: number;
58
+ u_center: THREE.Vector3;
59
+ u_radius: number;
60
+ u_curvature: number;
61
+ u_fogDensity: number;
62
+ u_camPos: THREE.Vector3;
63
+ u_camFwd: THREE.Vector3;
64
+ u_invProj: THREE.Matrix4;
65
+ u_camWorld: THREE.Matrix4;
66
+ u_near: number;
67
+ u_far: number;
68
+ u_resolution: THREE.Vector2;
69
+ u_screenSpace: number;
70
+ };
71
+ export declare const CloudVolumeMaterial: import("@react-three/fiber").ConstructorRepresentation<THREE.ShaderMaterial & {
72
+ u_base: any;
73
+ u_detail: any;
74
+ u_weather: any;
75
+ u_curl: any;
76
+ u_depth: any;
77
+ u_hasDepth: number;
78
+ u_time: number;
79
+ u_frame: number;
80
+ u_sunDir: THREE.Vector3;
81
+ u_sunColor: THREE.Color;
82
+ u_sunIntensity: number;
83
+ u_turbidity: number;
84
+ u_rayleigh: number;
85
+ u_mieCoefficient: number;
86
+ u_mieG: number;
87
+ u_skyAmbient: THREE.Color;
88
+ u_groundAmbient: THREE.Color;
89
+ u_coverage: number;
90
+ u_density: number;
91
+ u_cloudType: number;
92
+ u_baseScale: number;
93
+ u_detailScale: number;
94
+ u_detailStrength: number;
95
+ u_curlStrength: number;
96
+ u_layerBottom: number;
97
+ u_layerTop: number;
98
+ u_shear: number;
99
+ u_anvil: number;
100
+ u_precip: number;
101
+ u_weatherScale: number;
102
+ u_evolution: number;
103
+ u_windDir: THREE.Vector2;
104
+ u_windSpeed: number;
105
+ u_rise: number;
106
+ u_churn: number;
107
+ u_sigmaT: number;
108
+ u_g1: number;
109
+ u_g2: number;
110
+ u_msExtinction: number;
111
+ u_msEnergy: number;
112
+ u_msPhase: number;
113
+ u_powder: number;
114
+ u_silver: number;
115
+ u_ambient: number;
116
+ u_steps: number;
117
+ u_lightSteps: number;
118
+ u_lightStep: number;
119
+ u_stepGrowth: number;
120
+ u_maxSpan: number;
121
+ u_detailFade: number;
122
+ u_host: number;
123
+ u_center: THREE.Vector3;
124
+ u_radius: number;
125
+ u_curvature: number;
126
+ u_fogDensity: number;
127
+ u_camPos: THREE.Vector3;
128
+ u_camFwd: THREE.Vector3;
129
+ u_invProj: THREE.Matrix4;
130
+ u_camWorld: THREE.Matrix4;
131
+ u_near: number;
132
+ u_far: number;
133
+ u_resolution: THREE.Vector2;
134
+ u_screenSpace: number;
135
+ }> & {
136
+ key: string;
137
+ };
138
+ declare module '@react-three/fiber' {
139
+ interface ThreeElements {
140
+ cloudVolumeMaterial: ThreeElement<typeof CloudVolumeMaterial>;
141
+ }
142
+ }
143
+ //# sourceMappingURL=CloudVolumeMaterial.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CloudVolumeMaterial.d.ts","sourceRoot":"","sources":["../../../src/shaders/clouds/CloudVolumeMaterial.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAE9B,OAAO,EAAU,KAAK,YAAY,EAAE,MAAM,oBAAoB,CAAA;AAwL9D,MAAM,WAAW,0BAA0B;IACzC,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;CACvB;AAED,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAuE/B,CAAA;AAED,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAAwD,CAAA;AAIxF,OAAO,QAAQ,oBAAoB,CAAC;IAClC,UAAU,aAAa;QACrB,mBAAmB,EAAE,YAAY,CAAC,OAAO,mBAAmB,CAAC,CAAA;KAC9D;CACF"}