@nice2dev/ui-3d 1.0.0 → 1.0.3

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 (204) hide show
  1. package/CHANGELOG.md +115 -1
  2. package/dist/cjs/collaborative/collaborativeScene.js +210 -0
  3. package/dist/cjs/collaborative/collaborativeScene.js.map +1 -0
  4. package/dist/cjs/core/i18n.js +3 -3
  5. package/dist/cjs/core/i18n.js.map +1 -1
  6. package/dist/cjs/dance/DanceBridge.js +162 -0
  7. package/dist/cjs/dance/DanceBridge.js.map +1 -0
  8. package/dist/cjs/dance/DanceScoreEngine.js +210 -0
  9. package/dist/cjs/dance/DanceScoreEngine.js.map +1 -0
  10. package/dist/cjs/dance/PoseDetector.js +199 -0
  11. package/dist/cjs/dance/PoseDetector.js.map +1 -0
  12. package/dist/cjs/index.js +254 -0
  13. package/dist/cjs/index.js.map +1 -1
  14. package/dist/cjs/material/MaterialEditor.module.css.js +6 -0
  15. package/dist/cjs/material/MaterialEditor.module.css.js.map +1 -0
  16. package/dist/cjs/material/NiceMaterialEditor.js +737 -0
  17. package/dist/cjs/material/NiceMaterialEditor.js.map +1 -0
  18. package/dist/cjs/material/materialEditorTypes.js +73 -0
  19. package/dist/cjs/material/materialEditorTypes.js.map +1 -0
  20. package/dist/cjs/material/materialEditorUtils.js +841 -0
  21. package/dist/cjs/material/materialEditorUtils.js.map +1 -0
  22. package/dist/cjs/material/materialNodeDefinitions.js +1285 -0
  23. package/dist/cjs/material/materialNodeDefinitions.js.map +1 -0
  24. package/dist/cjs/model/ModelEditor.js +4 -1
  25. package/dist/cjs/model/ModelEditor.js.map +1 -1
  26. package/dist/cjs/model/ModelEditor.module.css.js +1 -1
  27. package/dist/cjs/model/ModelEditorLeftPanel.js +5 -4
  28. package/dist/cjs/model/ModelEditorLeftPanel.js.map +1 -1
  29. package/dist/cjs/model/ModelEditorMenuBar.js +8 -3
  30. package/dist/cjs/model/ModelEditorMenuBar.js.map +1 -1
  31. package/dist/cjs/model/ModelEditorRightPanel.js +27 -26
  32. package/dist/cjs/model/ModelEditorRightPanel.js.map +1 -1
  33. package/dist/cjs/model/ModelEditorSubComponents.js +20 -16
  34. package/dist/cjs/model/ModelEditorSubComponents.js.map +1 -1
  35. package/dist/cjs/model/ModelEditorTimeline.js +5 -4
  36. package/dist/cjs/model/ModelEditorTimeline.js.map +1 -1
  37. package/dist/cjs/model/ModelEditorToolbar.js +4 -3
  38. package/dist/cjs/model/ModelEditorToolbar.js.map +1 -1
  39. package/dist/cjs/model/ModelEditorViewport.js +2 -2
  40. package/dist/cjs/model/ModelEditorViewport.js.map +1 -1
  41. package/dist/cjs/model/ModelViewer.js +68 -0
  42. package/dist/cjs/model/ModelViewer.js.map +1 -0
  43. package/dist/cjs/model/ModelViewer.module.css.js +6 -0
  44. package/dist/cjs/model/ModelViewer.module.css.js.map +1 -0
  45. package/dist/cjs/model/NiceArmatureEditor.js +255 -0
  46. package/dist/cjs/model/NiceArmatureEditor.js.map +1 -0
  47. package/dist/cjs/model/NiceMorphTargetEditor.js +206 -0
  48. package/dist/cjs/model/NiceMorphTargetEditor.js.map +1 -0
  49. package/dist/cjs/model/NiceOctree.js +339 -0
  50. package/dist/cjs/model/NiceOctree.js.map +1 -0
  51. package/dist/cjs/model/NicePhysicsSimulation.js +283 -0
  52. package/dist/cjs/model/NicePhysicsSimulation.js.map +1 -0
  53. package/dist/cjs/model/NiceProceduralGeometry.js +269 -0
  54. package/dist/cjs/model/NiceProceduralGeometry.js.map +1 -0
  55. package/dist/cjs/model/NiceTerrainEditor.js +343 -0
  56. package/dist/cjs/model/NiceTerrainEditor.js.map +1 -0
  57. package/dist/cjs/model/NiceWeightPainter.js +258 -0
  58. package/dist/cjs/model/NiceWeightPainter.js.map +1 -0
  59. package/dist/cjs/model/NiceXRPreview.js +269 -0
  60. package/dist/cjs/model/NiceXRPreview.js.map +1 -0
  61. package/dist/cjs/model/cadModeUtils.js +130 -0
  62. package/dist/cjs/model/cadModeUtils.js.map +1 -0
  63. package/dist/cjs/model/editorShortcuts.js +187 -0
  64. package/dist/cjs/model/editorShortcuts.js.map +1 -0
  65. package/dist/cjs/model/modelEditorTypes.js +11 -0
  66. package/dist/cjs/model/modelEditorTypes.js.map +1 -1
  67. package/dist/cjs/model/modelEditorUtils.js +1049 -0
  68. package/dist/cjs/model/modelEditorUtils.js.map +1 -0
  69. package/dist/cjs/model/simsModeUtils.js +358 -0
  70. package/dist/cjs/model/simsModeUtils.js.map +1 -0
  71. package/dist/cjs/model/useModelEditor.js +319 -115
  72. package/dist/cjs/model/useModelEditor.js.map +1 -1
  73. package/dist/cjs/model/useModelViewer.js +634 -0
  74. package/dist/cjs/model/useModelViewer.js.map +1 -0
  75. package/dist/cjs/nice2dev-ui-3d.css +1 -1
  76. package/dist/cjs/particle/NiceParticleEditor.js +526 -0
  77. package/dist/cjs/particle/NiceParticleEditor.js.map +1 -0
  78. package/dist/cjs/particle/ParticleEditor.module.css.js +6 -0
  79. package/dist/cjs/particle/ParticleEditor.module.css.js.map +1 -0
  80. package/dist/cjs/particle/particleEditorTypes.js +92 -0
  81. package/dist/cjs/particle/particleEditorTypes.js.map +1 -0
  82. package/dist/cjs/particle/particleEditorUtils.js +1084 -0
  83. package/dist/cjs/particle/particleEditorUtils.js.map +1 -0
  84. package/dist/cjs/rendering/NiceCascadedShadows.js +266 -0
  85. package/dist/cjs/rendering/NiceCascadedShadows.js.map +1 -0
  86. package/dist/cjs/rendering/NiceRenderExport.js +341 -0
  87. package/dist/cjs/rendering/NiceRenderExport.js.map +1 -0
  88. package/dist/cjs/rendering/NiceSSAO.js +359 -0
  89. package/dist/cjs/rendering/NiceSSAO.js.map +1 -0
  90. package/dist/cjs/rendering/NiceSSR.js +277 -0
  91. package/dist/cjs/rendering/NiceSSR.js.map +1 -0
  92. package/dist/cjs/rendering/NiceWebGPURenderer.js +215 -0
  93. package/dist/cjs/rendering/NiceWebGPURenderer.js.map +1 -0
  94. package/dist/cjs/ui/dist/index.js +50089 -0
  95. package/dist/cjs/ui/dist/index.js.map +1 -0
  96. package/dist/cjs/uv/NiceUVEditor.js +520 -0
  97. package/dist/cjs/uv/NiceUVEditor.js.map +1 -0
  98. package/dist/cjs/uv/UVEditor.module.css.js +6 -0
  99. package/dist/cjs/uv/UVEditor.module.css.js.map +1 -0
  100. package/dist/cjs/uv/uvEditorTypes.js +98 -0
  101. package/dist/cjs/uv/uvEditorTypes.js.map +1 -0
  102. package/dist/cjs/uv/uvEditorUtils.js +670 -0
  103. package/dist/cjs/uv/uvEditorUtils.js.map +1 -0
  104. package/dist/esm/collaborative/collaborativeScene.js +206 -0
  105. package/dist/esm/collaborative/collaborativeScene.js.map +1 -0
  106. package/dist/esm/dance/DanceBridge.js +158 -0
  107. package/dist/esm/dance/DanceBridge.js.map +1 -0
  108. package/dist/esm/dance/DanceScoreEngine.js +207 -0
  109. package/dist/esm/dance/DanceScoreEngine.js.map +1 -0
  110. package/dist/esm/dance/PoseDetector.js +195 -0
  111. package/dist/esm/dance/PoseDetector.js.map +1 -0
  112. package/dist/esm/index.js +35 -1
  113. package/dist/esm/index.js.map +1 -1
  114. package/dist/esm/material/MaterialEditor.module.css.js +4 -0
  115. package/dist/esm/material/MaterialEditor.module.css.js.map +1 -0
  116. package/dist/esm/material/NiceMaterialEditor.js +734 -0
  117. package/dist/esm/material/NiceMaterialEditor.js.map +1 -0
  118. package/dist/esm/material/materialEditorTypes.js +62 -0
  119. package/dist/esm/material/materialEditorTypes.js.map +1 -0
  120. package/dist/esm/material/materialEditorUtils.js +811 -0
  121. package/dist/esm/material/materialEditorUtils.js.map +1 -0
  122. package/dist/esm/material/materialNodeDefinitions.js +1280 -0
  123. package/dist/esm/material/materialNodeDefinitions.js.map +1 -0
  124. package/dist/esm/model/ModelEditor.js +4 -2
  125. package/dist/esm/model/ModelEditor.js.map +1 -1
  126. package/dist/esm/model/ModelEditor.module.css.js +1 -1
  127. package/dist/esm/model/ModelEditorLeftPanel.js +5 -4
  128. package/dist/esm/model/ModelEditorLeftPanel.js.map +1 -1
  129. package/dist/esm/model/ModelEditorMenuBar.js +8 -3
  130. package/dist/esm/model/ModelEditorMenuBar.js.map +1 -1
  131. package/dist/esm/model/ModelEditorRightPanel.js +27 -26
  132. package/dist/esm/model/ModelEditorRightPanel.js.map +1 -1
  133. package/dist/esm/model/ModelEditorSubComponents.js +17 -13
  134. package/dist/esm/model/ModelEditorSubComponents.js.map +1 -1
  135. package/dist/esm/model/ModelEditorTimeline.js +5 -4
  136. package/dist/esm/model/ModelEditorTimeline.js.map +1 -1
  137. package/dist/esm/model/ModelEditorToolbar.js +4 -3
  138. package/dist/esm/model/ModelEditorToolbar.js.map +1 -1
  139. package/dist/esm/model/ModelEditorViewport.js +2 -2
  140. package/dist/esm/model/ModelEditorViewport.js.map +1 -1
  141. package/dist/esm/model/ModelViewer.js +65 -0
  142. package/dist/esm/model/ModelViewer.js.map +1 -0
  143. package/dist/esm/model/ModelViewer.module.css.js +4 -0
  144. package/dist/esm/model/ModelViewer.module.css.js.map +1 -0
  145. package/dist/esm/model/NiceArmatureEditor.js +233 -0
  146. package/dist/esm/model/NiceArmatureEditor.js.map +1 -0
  147. package/dist/esm/model/NiceMorphTargetEditor.js +184 -0
  148. package/dist/esm/model/NiceMorphTargetEditor.js.map +1 -0
  149. package/dist/esm/model/NiceOctree.js +317 -0
  150. package/dist/esm/model/NiceOctree.js.map +1 -0
  151. package/dist/esm/model/NicePhysicsSimulation.js +261 -0
  152. package/dist/esm/model/NicePhysicsSimulation.js.map +1 -0
  153. package/dist/esm/model/NiceProceduralGeometry.js +242 -0
  154. package/dist/esm/model/NiceProceduralGeometry.js.map +1 -0
  155. package/dist/esm/model/NiceTerrainEditor.js +321 -0
  156. package/dist/esm/model/NiceTerrainEditor.js.map +1 -0
  157. package/dist/esm/model/NiceWeightPainter.js +236 -0
  158. package/dist/esm/model/NiceWeightPainter.js.map +1 -0
  159. package/dist/esm/model/NiceXRPreview.js +247 -0
  160. package/dist/esm/model/NiceXRPreview.js.map +1 -0
  161. package/dist/esm/model/cadModeUtils.js +103 -0
  162. package/dist/esm/model/cadModeUtils.js.map +1 -0
  163. package/dist/esm/model/editorShortcuts.js +185 -0
  164. package/dist/esm/model/editorShortcuts.js.map +1 -0
  165. package/dist/esm/model/modelEditorTypes.js +11 -0
  166. package/dist/esm/model/modelEditorTypes.js.map +1 -1
  167. package/dist/esm/model/modelEditorUtils.js +997 -0
  168. package/dist/esm/model/modelEditorUtils.js.map +1 -0
  169. package/dist/esm/model/simsModeUtils.js +325 -0
  170. package/dist/esm/model/simsModeUtils.js.map +1 -0
  171. package/dist/esm/model/useModelEditor.js +204 -0
  172. package/dist/esm/model/useModelEditor.js.map +1 -1
  173. package/dist/esm/model/useModelViewer.js +613 -0
  174. package/dist/esm/model/useModelViewer.js.map +1 -0
  175. package/dist/esm/nice2dev-ui-3d.css +1 -1
  176. package/dist/esm/particle/NiceParticleEditor.js +523 -0
  177. package/dist/esm/particle/NiceParticleEditor.js.map +1 -0
  178. package/dist/esm/particle/ParticleEditor.module.css.js +4 -0
  179. package/dist/esm/particle/ParticleEditor.module.css.js.map +1 -0
  180. package/dist/esm/particle/particleEditorTypes.js +84 -0
  181. package/dist/esm/particle/particleEditorTypes.js.map +1 -0
  182. package/dist/esm/particle/particleEditorUtils.js +1054 -0
  183. package/dist/esm/particle/particleEditorUtils.js.map +1 -0
  184. package/dist/esm/rendering/NiceCascadedShadows.js +244 -0
  185. package/dist/esm/rendering/NiceCascadedShadows.js.map +1 -0
  186. package/dist/esm/rendering/NiceRenderExport.js +319 -0
  187. package/dist/esm/rendering/NiceRenderExport.js.map +1 -0
  188. package/dist/esm/rendering/NiceSSAO.js +337 -0
  189. package/dist/esm/rendering/NiceSSAO.js.map +1 -0
  190. package/dist/esm/rendering/NiceSSR.js +255 -0
  191. package/dist/esm/rendering/NiceSSR.js.map +1 -0
  192. package/dist/esm/rendering/NiceWebGPURenderer.js +193 -0
  193. package/dist/esm/rendering/NiceWebGPURenderer.js.map +1 -0
  194. package/dist/esm/ui/dist/index.js +49686 -0
  195. package/dist/esm/ui/dist/index.js.map +1 -0
  196. package/dist/esm/uv/NiceUVEditor.js +518 -0
  197. package/dist/esm/uv/NiceUVEditor.js.map +1 -0
  198. package/dist/esm/uv/UVEditor.module.css.js +4 -0
  199. package/dist/esm/uv/UVEditor.module.css.js.map +1 -0
  200. package/dist/esm/uv/uvEditorTypes.js +88 -0
  201. package/dist/esm/uv/uvEditorTypes.js.map +1 -0
  202. package/dist/esm/uv/uvEditorUtils.js +621 -0
  203. package/dist/esm/uv/uvEditorUtils.js.map +1 -0
  204. package/package.json +3 -4
@@ -0,0 +1,359 @@
1
+ 'use strict';
2
+
3
+ var jsxRuntime = require('react/jsx-runtime');
4
+ var THREE = require('three');
5
+ var Ae = require('react');
6
+
7
+ function _interopNamespaceDefault(e) {
8
+ var n = Object.create(null);
9
+ if (e) {
10
+ Object.keys(e).forEach(function (k) {
11
+ if (k !== 'default') {
12
+ var d = Object.getOwnPropertyDescriptor(e, k);
13
+ Object.defineProperty(n, k, d.get ? d : {
14
+ enumerable: true,
15
+ get: function () { return e[k]; }
16
+ });
17
+ }
18
+ });
19
+ }
20
+ n.default = e;
21
+ return Object.freeze(n);
22
+ }
23
+
24
+ var THREE__namespace = /*#__PURE__*/_interopNamespaceDefault(THREE);
25
+
26
+ /* ── SSAO Shaders ── */
27
+ const SSAO_VERTEX = `
28
+ varying vec2 vUv;
29
+ void main() {
30
+ vUv = uv;
31
+ gl_Position = vec4(position, 1.0);
32
+ }
33
+ `;
34
+ const SSAO_FRAGMENT = `
35
+ uniform sampler2D tDepth;
36
+ uniform sampler2D tNoise;
37
+ uniform vec3 kernel[128];
38
+ uniform int kernelSize;
39
+ uniform vec2 resolution;
40
+ uniform mat4 projMatrix;
41
+ uniform mat4 projInverseMatrix;
42
+ uniform float cameraNear;
43
+ uniform float cameraFar;
44
+ uniform float radius;
45
+ uniform float bias;
46
+ uniform float intensity;
47
+ uniform float minDistance;
48
+ uniform float maxDistance;
49
+
50
+ varying vec2 vUv;
51
+
52
+ float linearDepth(float d) {
53
+ return cameraNear * cameraFar / (cameraFar - d * (cameraFar - cameraNear));
54
+ }
55
+
56
+ vec3 getViewPos(vec2 uv) {
57
+ float d = texture2D(tDepth, uv).r;
58
+ vec4 clipPos = vec4(uv * 2.0 - 1.0, d * 2.0 - 1.0, 1.0);
59
+ vec4 viewPos = projInverseMatrix * clipPos;
60
+ return viewPos.xyz / viewPos.w;
61
+ }
62
+
63
+ void main() {
64
+ float depth = texture2D(tDepth, vUv).r;
65
+ if (depth >= 1.0) {
66
+ gl_FragColor = vec4(1.0);
67
+ return;
68
+ }
69
+
70
+ vec3 viewPos = getViewPos(vUv);
71
+
72
+ // Reconstruct normal from depth buffer
73
+ vec3 dpdx = dFdx(viewPos);
74
+ vec3 dpdy = dFdy(viewPos);
75
+ vec3 normal = normalize(cross(dpdx, dpdy));
76
+
77
+ // Random rotation from noise texture
78
+ vec2 noiseUv = vUv * resolution / 4.0;
79
+ vec3 randomVec = texture2D(tNoise, noiseUv).xyz * 2.0 - 1.0;
80
+
81
+ // Create TBN matrix
82
+ vec3 tangent = normalize(randomVec - normal * dot(randomVec, normal));
83
+ vec3 bitangent = cross(normal, tangent);
84
+ mat3 TBN = mat3(tangent, bitangent, normal);
85
+
86
+ float occlusion = 0.0;
87
+
88
+ for (int i = 0; i < 128; i++) {
89
+ if (i >= kernelSize) break;
90
+
91
+ // Transform sample to view space
92
+ vec3 samplePos = TBN * kernel[i];
93
+ samplePos = viewPos + samplePos * radius;
94
+
95
+ // Project sample to screen
96
+ vec4 offset = projMatrix * vec4(samplePos, 1.0);
97
+ offset.xyz /= offset.w;
98
+ vec2 sampleUv = offset.xy * 0.5 + 0.5;
99
+
100
+ // Out of screen
101
+ if (sampleUv.x < 0.0 || sampleUv.x > 1.0 || sampleUv.y < 0.0 || sampleUv.y > 1.0) continue;
102
+
103
+ float sampleDepth = linearDepth(texture2D(tDepth, sampleUv).r);
104
+ float rangeCheck = smoothstep(0.0, 1.0, radius / abs(-viewPos.z - sampleDepth));
105
+
106
+ float dist = abs(-viewPos.z - sampleDepth);
107
+ if (dist >= minDistance && dist <= maxDistance) {
108
+ occlusion += (sampleDepth <= -samplePos.z - bias ? 1.0 : 0.0) * rangeCheck;
109
+ }
110
+ }
111
+
112
+ occlusion = 1.0 - (occlusion / float(kernelSize)) * intensity;
113
+ gl_FragColor = vec4(vec3(occlusion), 1.0);
114
+ }
115
+ `;
116
+ const BLUR_FRAGMENT = `
117
+ uniform sampler2D tAO;
118
+ uniform sampler2D tDepth;
119
+ uniform vec2 resolution;
120
+ uniform int blurSize;
121
+ uniform float cameraNear;
122
+ uniform float cameraFar;
123
+
124
+ varying vec2 vUv;
125
+
126
+ float linearDepth(float d) {
127
+ return cameraNear * cameraFar / (cameraFar - d * (cameraFar - cameraNear));
128
+ }
129
+
130
+ void main() {
131
+ float centerDepth = linearDepth(texture2D(tDepth, vUv).r);
132
+ float result = 0.0;
133
+ float weightSum = 0.0;
134
+
135
+ for (int x = -4; x <= 4; x++) {
136
+ for (int y = -4; y <= 4; y++) {
137
+ if (abs(x) > blurSize || abs(y) > blurSize) continue;
138
+
139
+ vec2 offset = vec2(float(x), float(y)) / resolution;
140
+ float sampleDepth = linearDepth(texture2D(tDepth, vUv + offset).r);
141
+
142
+ // Bilateral weight based on depth difference
143
+ float depthWeight = exp(-abs(centerDepth - sampleDepth) * 10.0);
144
+ float spatialWeight = exp(-float(x * x + y * y) / (2.0 * float(blurSize * blurSize)));
145
+ float weight = depthWeight * spatialWeight;
146
+
147
+ result += texture2D(tAO, vUv + offset).r * weight;
148
+ weightSum += weight;
149
+ }
150
+ }
151
+
152
+ gl_FragColor = vec4(vec3(result / weightSum), 1.0);
153
+ }
154
+ `;
155
+ /* ── Generate kernel and noise ── */
156
+ function generateSSAOKernel(size) {
157
+ const kernel = new Float32Array(size * 3);
158
+ for (let i = 0; i < size; i++) {
159
+ // Hemisphere samples
160
+ let x = Math.random() * 2 - 1;
161
+ let y = Math.random() * 2 - 1;
162
+ let z = Math.random(); // hemisphere — positive z only
163
+ const len = Math.sqrt(x * x + y * y + z * z);
164
+ x /= len;
165
+ y /= len;
166
+ z /= len;
167
+ // Scale to distribute more samples closer to origin
168
+ let scale = i / size;
169
+ scale = 0.1 + scale * scale * 0.9; // lerp(0.1, 1.0, scale^2)
170
+ kernel[i * 3] = x * scale;
171
+ kernel[i * 3 + 1] = y * scale;
172
+ kernel[i * 3 + 2] = z * scale;
173
+ }
174
+ return kernel;
175
+ }
176
+ function generateNoiseTexture() {
177
+ const size = 4;
178
+ const data = new Float32Array(size * size * 4);
179
+ for (let i = 0; i < size * size; i++) {
180
+ data[i * 4] = Math.random() * 2 - 1;
181
+ data[i * 4 + 1] = Math.random() * 2 - 1;
182
+ data[i * 4 + 2] = 0;
183
+ data[i * 4 + 3] = 1;
184
+ }
185
+ const tex = new THREE__namespace.DataTexture(data, size, size, THREE__namespace.RGBAFormat, THREE__namespace.FloatType);
186
+ tex.wrapS = THREE__namespace.RepeatWrapping;
187
+ tex.wrapT = THREE__namespace.RepeatWrapping;
188
+ tex.needsUpdate = true;
189
+ return tex;
190
+ }
191
+ /* ── Hook ── */
192
+ const DEFAULT_SSAO = {
193
+ enabled: true,
194
+ mode: 'ssao',
195
+ samples: 32,
196
+ radius: 1.0,
197
+ bias: 0.025,
198
+ intensity: 1.5,
199
+ resolution: 0.5,
200
+ blurEnabled: true,
201
+ blurSize: 2,
202
+ minDistance: 0.01,
203
+ maxDistance: 10,
204
+ };
205
+ function useSSAO(renderer, scene, camera, configOverride) {
206
+ const [config, setConfigState] = Ae.useState({ ...DEFAULT_SSAO, ...configOverride });
207
+ const [aoRenderTarget, setAoRenderTarget] = Ae.useState(null);
208
+ const depthRT = Ae.useRef(null);
209
+ const blurRT = Ae.useRef(null);
210
+ const ssaoMaterial = Ae.useRef(null);
211
+ const blurMaterial = Ae.useRef(null);
212
+ const noiseTexture = Ae.useRef(generateNoiseTexture());
213
+ const kernel = Ae.useRef(generateSSAOKernel(128));
214
+ const orthoScene = Ae.useRef(new THREE__namespace.Scene());
215
+ const orthoCamera = Ae.useRef(new THREE__namespace.OrthographicCamera(-1, 1, 1, -1, 0, 1));
216
+ const quadRef = Ae.useRef(null);
217
+ const setConfig = Ae.useCallback((partial) => {
218
+ setConfigState((prev) => ({ ...prev, ...partial }));
219
+ }, []);
220
+ // Setup
221
+ Ae.useEffect(() => {
222
+ if (!renderer || !camera)
223
+ return;
224
+ const width = Math.floor(renderer.domElement.width * config.resolution);
225
+ const height = Math.floor(renderer.domElement.height * config.resolution);
226
+ // Depth render target
227
+ const dRT = new THREE__namespace.WebGLRenderTarget(width, height, {
228
+ minFilter: THREE__namespace.NearestFilter,
229
+ magFilter: THREE__namespace.NearestFilter,
230
+ type: THREE__namespace.FloatType,
231
+ });
232
+ dRT.depthTexture = new THREE__namespace.DepthTexture(width, height);
233
+ dRT.depthTexture.type = THREE__namespace.UnsignedIntType;
234
+ depthRT.current = dRT;
235
+ // AO render target
236
+ const aoRT = new THREE__namespace.WebGLRenderTarget(width, height, {
237
+ minFilter: THREE__namespace.LinearFilter,
238
+ magFilter: THREE__namespace.LinearFilter,
239
+ });
240
+ setAoRenderTarget(aoRT);
241
+ // Blur render target
242
+ const bRT = new THREE__namespace.WebGLRenderTarget(width, height, {
243
+ minFilter: THREE__namespace.LinearFilter,
244
+ magFilter: THREE__namespace.LinearFilter,
245
+ });
246
+ blurRT.current = bRT;
247
+ // Kernel uniform as vec3 array
248
+ const kernelUniforms = [];
249
+ for (let i = 0; i < 128; i++) {
250
+ kernelUniforms.push(new THREE__namespace.Vector3(kernel.current[i * 3], kernel.current[i * 3 + 1], kernel.current[i * 3 + 2]));
251
+ }
252
+ // SSAO material
253
+ const ssaoMat = new THREE__namespace.ShaderMaterial({
254
+ vertexShader: SSAO_VERTEX,
255
+ fragmentShader: SSAO_FRAGMENT,
256
+ uniforms: {
257
+ tDepth: { value: dRT.depthTexture },
258
+ tNoise: { value: noiseTexture.current },
259
+ kernel: { value: kernelUniforms },
260
+ kernelSize: { value: config.samples },
261
+ resolution: { value: new THREE__namespace.Vector2(width, height) },
262
+ projMatrix: { value: camera.projectionMatrix },
263
+ projInverseMatrix: { value: camera.projectionMatrixInverse },
264
+ cameraNear: { value: camera.near },
265
+ cameraFar: { value: camera.far },
266
+ radius: { value: config.radius },
267
+ bias: { value: config.bias },
268
+ intensity: { value: config.intensity },
269
+ minDistance: { value: config.minDistance },
270
+ maxDistance: { value: config.maxDistance },
271
+ },
272
+ });
273
+ ssaoMaterial.current = ssaoMat;
274
+ // Blur material
275
+ const blurMat = new THREE__namespace.ShaderMaterial({
276
+ vertexShader: SSAO_VERTEX,
277
+ fragmentShader: BLUR_FRAGMENT,
278
+ uniforms: {
279
+ tAO: { value: aoRT.texture },
280
+ tDepth: { value: dRT.depthTexture },
281
+ resolution: { value: new THREE__namespace.Vector2(width, height) },
282
+ blurSize: { value: config.blurSize },
283
+ cameraNear: { value: camera.near },
284
+ cameraFar: { value: camera.far },
285
+ },
286
+ });
287
+ blurMaterial.current = blurMat;
288
+ // Full-screen quad
289
+ const quad = new THREE__namespace.Mesh(new THREE__namespace.PlaneGeometry(2, 2), ssaoMat);
290
+ quad.frustumCulled = false;
291
+ orthoScene.current.add(quad);
292
+ quadRef.current = quad;
293
+ return () => {
294
+ dRT.dispose();
295
+ aoRT.dispose();
296
+ bRT.dispose();
297
+ ssaoMat.dispose();
298
+ blurMat.dispose();
299
+ orthoScene.current.remove(quad);
300
+ };
301
+ }, [renderer, camera, config.resolution]);
302
+ // Update uniforms
303
+ Ae.useEffect(() => {
304
+ if (!ssaoMaterial.current)
305
+ return;
306
+ const u = ssaoMaterial.current.uniforms;
307
+ u.kernelSize.value = config.samples;
308
+ u.radius.value = config.radius;
309
+ u.bias.value = config.bias;
310
+ u.intensity.value = config.intensity;
311
+ u.minDistance.value = config.minDistance;
312
+ u.maxDistance.value = config.maxDistance;
313
+ }, [config]);
314
+ Ae.useEffect(() => {
315
+ if (!blurMaterial.current)
316
+ return;
317
+ blurMaterial.current.uniforms.blurSize.value = config.blurSize;
318
+ }, [config.blurSize]);
319
+ const update = Ae.useCallback(() => {
320
+ if (!renderer || !scene || !camera || !config.enabled)
321
+ return;
322
+ if (!depthRT.current || !aoRenderTarget || !quadRef.current)
323
+ return;
324
+ // Render depth
325
+ renderer.setRenderTarget(depthRT.current);
326
+ renderer.render(scene, camera);
327
+ // SSAO pass
328
+ quadRef.current.material = ssaoMaterial.current;
329
+ renderer.setRenderTarget(aoRenderTarget);
330
+ renderer.render(orthoScene.current, orthoCamera.current);
331
+ // Blur pass
332
+ if (config.blurEnabled && blurMaterial.current && blurRT.current) {
333
+ blurMaterial.current.uniforms.tAO.value = aoRenderTarget.texture;
334
+ quadRef.current.material = blurMaterial.current;
335
+ renderer.setRenderTarget(blurRT.current);
336
+ renderer.render(orthoScene.current, orthoCamera.current);
337
+ }
338
+ renderer.setRenderTarget(null);
339
+ }, [renderer, scene, camera, config.enabled, config.blurEnabled, aoRenderTarget]);
340
+ const dispose = Ae.useCallback(() => {
341
+ var _a, _b, _c, _d, _e;
342
+ (_a = depthRT.current) === null || _a === void 0 ? void 0 : _a.dispose();
343
+ aoRenderTarget === null || aoRenderTarget === void 0 ? void 0 : aoRenderTarget.dispose();
344
+ (_b = blurRT.current) === null || _b === void 0 ? void 0 : _b.dispose();
345
+ (_c = ssaoMaterial.current) === null || _c === void 0 ? void 0 : _c.dispose();
346
+ (_d = blurMaterial.current) === null || _d === void 0 ? void 0 : _d.dispose();
347
+ (_e = noiseTexture.current) === null || _e === void 0 ? void 0 : _e.dispose();
348
+ }, [aoRenderTarget]);
349
+ return { config, setConfig, aoRenderTarget, update, dispose };
350
+ }
351
+ /* ── Component ── */
352
+ const NiceSSAO = ({ renderer, scene, camera, config: configProp, className = '', }) => {
353
+ const { config, setConfig } = useSSAO(renderer, scene, camera, configProp);
354
+ return (jsxRuntime.jsxs("div", { className: `nice-ssao ${className}`, style: { display: 'grid', gap: 8, fontSize: 13 }, children: [jsxRuntime.jsxs("div", { style: { display: 'flex', justifyContent: 'space-between', alignItems: 'center' }, children: [jsxRuntime.jsx("strong", { children: "\uD83C\uDF11 Ambient Occlusion" }), jsxRuntime.jsxs("label", { style: { display: 'flex', alignItems: 'center', gap: 4, fontSize: 11 }, children: [jsxRuntime.jsx("input", { type: "checkbox", checked: config.enabled, onChange: (e) => setConfig({ enabled: e.target.checked }) }), "Enabled"] })] }), jsxRuntime.jsxs("label", { children: ["Mode:", jsxRuntime.jsxs("select", { value: config.mode, onChange: (e) => setConfig({ mode: e.target.value }), style: { width: '100%', marginTop: 2 }, children: [jsxRuntime.jsx("option", { value: "ssao", children: "SSAO" }), jsxRuntime.jsx("option", { value: "hbao", children: "HBAO" })] })] }), jsxRuntime.jsxs("label", { children: ["Samples: ", config.samples, jsxRuntime.jsx("input", { type: "range", min: 8, max: 128, step: 8, value: config.samples, onChange: (e) => setConfig({ samples: parseInt(e.target.value, 10) }), style: { width: '100%' } })] }), jsxRuntime.jsxs("label", { children: ["Radius: ", config.radius.toFixed(2), jsxRuntime.jsx("input", { type: "range", min: 0.1, max: 5, step: 0.1, value: config.radius, onChange: (e) => setConfig({ radius: parseFloat(e.target.value) }), style: { width: '100%' } })] }), jsxRuntime.jsxs("label", { children: ["Intensity: ", config.intensity.toFixed(2), jsxRuntime.jsx("input", { type: "range", min: 0, max: 3, step: 0.1, value: config.intensity, onChange: (e) => setConfig({ intensity: parseFloat(e.target.value) }), style: { width: '100%' } })] }), jsxRuntime.jsxs("label", { children: ["Bias: ", config.bias.toFixed(3), jsxRuntime.jsx("input", { type: "range", min: 0.001, max: 0.1, step: 0.001, value: config.bias, onChange: (e) => setConfig({ bias: parseFloat(e.target.value) }), style: { width: '100%' } })] }), jsxRuntime.jsxs("label", { children: ["Resolution: ", config.resolution.toFixed(2), jsxRuntime.jsx("input", { type: "range", min: 0.25, max: 1, step: 0.25, value: config.resolution, onChange: (e) => setConfig({ resolution: parseFloat(e.target.value) }), style: { width: '100%' } })] }), jsxRuntime.jsxs("label", { style: { display: 'flex', alignItems: 'center', gap: 6 }, children: [jsxRuntime.jsx("input", { type: "checkbox", checked: config.blurEnabled, onChange: (e) => setConfig({ blurEnabled: e.target.checked }) }), "Bilateral Blur (size: ", config.blurSize, ")"] })] }));
355
+ };
356
+
357
+ exports.NiceSSAO = NiceSSAO;
358
+ exports.useSSAO = useSSAO;
359
+ //# sourceMappingURL=NiceSSAO.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"NiceSSAO.js","sources":["../../../src/rendering/NiceSSAO.tsx"],"sourcesContent":[null],"names":["THREE","useState","useRef","useCallback","useEffect","_jsxs","_jsx"],"mappings":"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"}
@@ -0,0 +1,277 @@
1
+ 'use strict';
2
+
3
+ var jsxRuntime = require('react/jsx-runtime');
4
+ var THREE = require('three');
5
+ var Ae = require('react');
6
+
7
+ function _interopNamespaceDefault(e) {
8
+ var n = Object.create(null);
9
+ if (e) {
10
+ Object.keys(e).forEach(function (k) {
11
+ if (k !== 'default') {
12
+ var d = Object.getOwnPropertyDescriptor(e, k);
13
+ Object.defineProperty(n, k, d.get ? d : {
14
+ enumerable: true,
15
+ get: function () { return e[k]; }
16
+ });
17
+ }
18
+ });
19
+ }
20
+ n.default = e;
21
+ return Object.freeze(n);
22
+ }
23
+
24
+ var THREE__namespace = /*#__PURE__*/_interopNamespaceDefault(THREE);
25
+
26
+ /* ── SSR Shader ── */
27
+ const SSR_VERTEX = `
28
+ varying vec2 vUv;
29
+ void main() {
30
+ vUv = uv;
31
+ gl_Position = vec4(position, 1.0);
32
+ }
33
+ `;
34
+ const SSR_FRAGMENT = `
35
+ uniform sampler2D tDiffuse;
36
+ uniform sampler2D tDepth;
37
+ uniform sampler2D tNormal;
38
+ uniform mat4 projMatrix;
39
+ uniform mat4 projInverseMatrix;
40
+ uniform mat4 viewMatrix;
41
+ uniform vec2 resolution;
42
+ uniform float cameraNear;
43
+ uniform float cameraFar;
44
+ uniform int maxSteps;
45
+ uniform float maxDistance;
46
+ uniform float thickness;
47
+ uniform float jitter;
48
+ uniform float intensity;
49
+ uniform float fresnelExponent;
50
+
51
+ varying vec2 vUv;
52
+
53
+ float getDepth(vec2 uv) {
54
+ float d = texture2D(tDepth, uv).r;
55
+ return cameraNear * cameraFar / (cameraFar - d * (cameraFar - cameraNear));
56
+ }
57
+
58
+ vec3 getViewPosition(vec2 uv, float depth) {
59
+ vec4 clipPos = vec4(uv * 2.0 - 1.0, depth * 2.0 - 1.0, 1.0);
60
+ vec4 viewPos = projInverseMatrix * clipPos;
61
+ return viewPos.xyz / viewPos.w;
62
+ }
63
+
64
+ vec3 getViewNormal(vec2 uv) {
65
+ return normalize(texture2D(tNormal, uv).xyz * 2.0 - 1.0);
66
+ }
67
+
68
+ float fresnel(vec3 viewDir, vec3 normal, float exponent) {
69
+ return pow(1.0 - max(dot(-viewDir, normal), 0.0), exponent);
70
+ }
71
+
72
+ vec2 rayMarch(vec3 origin, vec3 direction) {
73
+ vec3 pos = origin;
74
+ float stepSize = maxDistance / float(maxSteps);
75
+
76
+ for (int i = 0; i < 256; i++) {
77
+ if (i >= maxSteps) break;
78
+
79
+ pos += direction * stepSize;
80
+
81
+ // Project to screen space
82
+ vec4 projPos = projMatrix * vec4(pos, 1.0);
83
+ projPos.xyz /= projPos.w;
84
+ vec2 screenUv = projPos.xy * 0.5 + 0.5;
85
+
86
+ // Out of screen
87
+ if (screenUv.x < 0.0 || screenUv.x > 1.0 || screenUv.y < 0.0 || screenUv.y > 1.0) {
88
+ return vec2(-1.0);
89
+ }
90
+
91
+ float sceneDepth = getDepth(screenUv);
92
+ float rayDepth = -pos.z;
93
+
94
+ if (rayDepth > sceneDepth && rayDepth - sceneDepth < thickness) {
95
+ return screenUv;
96
+ }
97
+ }
98
+
99
+ return vec2(-1.0);
100
+ }
101
+
102
+ void main() {
103
+ vec4 baseColor = texture2D(tDiffuse, vUv);
104
+ float depth = texture2D(tDepth, vUv).r;
105
+
106
+ if (depth >= 1.0) {
107
+ gl_FragColor = baseColor;
108
+ return;
109
+ }
110
+
111
+ vec3 viewPos = getViewPosition(vUv, depth);
112
+ vec3 viewNormal = getViewNormal(vUv);
113
+ vec3 viewDir = normalize(viewPos);
114
+
115
+ // Reflect view direction around normal
116
+ vec3 reflectDir = reflect(viewDir, viewNormal);
117
+
118
+ // Add jitter
119
+ float j = fract(sin(dot(vUv, vec2(12.9898, 78.233))) * 43758.5453) * jitter;
120
+ reflectDir += j * 0.01;
121
+ reflectDir = normalize(reflectDir);
122
+
123
+ // Ray march
124
+ vec2 hitUv = rayMarch(viewPos + viewNormal * 0.01, reflectDir);
125
+
126
+ vec3 reflection = vec3(0.0);
127
+ if (hitUv.x >= 0.0) {
128
+ reflection = texture2D(tDiffuse, hitUv).rgb;
129
+ }
130
+
131
+ // Fresnel attenuation
132
+ float f = fresnel(viewDir, viewNormal, fresnelExponent);
133
+
134
+ gl_FragColor = vec4(mix(baseColor.rgb, reflection, f * intensity), baseColor.a);
135
+ }
136
+ `;
137
+ /* ── Hook ── */
138
+ const DEFAULT_SSR = {
139
+ enabled: true,
140
+ maxSteps: 64,
141
+ maxDistance: 50,
142
+ thickness: 0.5,
143
+ resolution: 0.5,
144
+ jitter: 0.3,
145
+ intensity: 0.6,
146
+ roughnessFade: 0.8,
147
+ fresnelExponent: 3.0,
148
+ };
149
+ function useSSR(renderer, scene, camera, configOverride) {
150
+ const [config, setConfigState] = Ae.useState({ ...DEFAULT_SSR, ...configOverride });
151
+ const [renderTarget, setRenderTarget] = Ae.useState(null);
152
+ const depthTarget = Ae.useRef(null);
153
+ const normalTarget = Ae.useRef(null);
154
+ const ssrMaterial = Ae.useRef(null);
155
+ const fullScreenQuad = Ae.useRef(null);
156
+ const orthoScene = Ae.useRef(new THREE__namespace.Scene());
157
+ const orthoCamera = Ae.useRef(new THREE__namespace.OrthographicCamera(-1, 1, 1, -1, 0, 1));
158
+ const setConfig = Ae.useCallback((partial) => {
159
+ setConfigState((prev) => ({ ...prev, ...partial }));
160
+ }, []);
161
+ // Setup render targets and shader
162
+ Ae.useEffect(() => {
163
+ if (!renderer || !camera)
164
+ return;
165
+ const width = Math.floor(renderer.domElement.width * config.resolution);
166
+ const height = Math.floor(renderer.domElement.height * config.resolution);
167
+ // Scene render target
168
+ const sceneRT = new THREE__namespace.WebGLRenderTarget(width, height, {
169
+ minFilter: THREE__namespace.LinearFilter,
170
+ magFilter: THREE__namespace.LinearFilter,
171
+ format: THREE__namespace.RGBAFormat,
172
+ type: THREE__namespace.HalfFloatType,
173
+ });
174
+ setRenderTarget(sceneRT);
175
+ // Depth render target
176
+ const dTarget = new THREE__namespace.WebGLRenderTarget(width, height, {
177
+ minFilter: THREE__namespace.NearestFilter,
178
+ magFilter: THREE__namespace.NearestFilter,
179
+ format: THREE__namespace.RGBAFormat,
180
+ type: THREE__namespace.FloatType,
181
+ });
182
+ dTarget.depthTexture = new THREE__namespace.DepthTexture(width, height);
183
+ dTarget.depthTexture.type = THREE__namespace.UnsignedIntType;
184
+ depthTarget.current = dTarget;
185
+ // Normal render target
186
+ const nTarget = new THREE__namespace.WebGLRenderTarget(width, height, {
187
+ minFilter: THREE__namespace.NearestFilter,
188
+ magFilter: THREE__namespace.NearestFilter,
189
+ format: THREE__namespace.RGBAFormat,
190
+ });
191
+ normalTarget.current = nTarget;
192
+ // SSR shader material
193
+ const material = new THREE__namespace.ShaderMaterial({
194
+ vertexShader: SSR_VERTEX,
195
+ fragmentShader: SSR_FRAGMENT,
196
+ uniforms: {
197
+ tDiffuse: { value: sceneRT.texture },
198
+ tDepth: { value: dTarget.depthTexture },
199
+ tNormal: { value: nTarget.texture },
200
+ projMatrix: { value: camera.projectionMatrix },
201
+ projInverseMatrix: { value: camera.projectionMatrixInverse },
202
+ viewMatrix: { value: camera.matrixWorldInverse },
203
+ resolution: { value: new THREE__namespace.Vector2(width, height) },
204
+ cameraNear: { value: camera.near },
205
+ cameraFar: { value: camera.far },
206
+ maxSteps: { value: config.maxSteps },
207
+ maxDistance: { value: config.maxDistance },
208
+ thickness: { value: config.thickness },
209
+ jitter: { value: config.jitter },
210
+ intensity: { value: config.intensity },
211
+ fresnelExponent: { value: config.fresnelExponent },
212
+ },
213
+ });
214
+ ssrMaterial.current = material;
215
+ // Full-screen quad
216
+ const quad = new THREE__namespace.Mesh(new THREE__namespace.PlaneGeometry(2, 2), material);
217
+ quad.frustumCulled = false;
218
+ orthoScene.current.add(quad);
219
+ fullScreenQuad.current = quad;
220
+ return () => {
221
+ sceneRT.dispose();
222
+ dTarget.dispose();
223
+ nTarget.dispose();
224
+ material.dispose();
225
+ orthoScene.current.remove(quad);
226
+ };
227
+ }, [renderer, camera, config.resolution]);
228
+ // Update uniforms when config changes
229
+ Ae.useEffect(() => {
230
+ if (!ssrMaterial.current)
231
+ return;
232
+ const u = ssrMaterial.current.uniforms;
233
+ u.maxSteps.value = config.maxSteps;
234
+ u.maxDistance.value = config.maxDistance;
235
+ u.thickness.value = config.thickness;
236
+ u.jitter.value = config.jitter;
237
+ u.intensity.value = config.intensity;
238
+ u.fresnelExponent.value = config.fresnelExponent;
239
+ }, [config]);
240
+ const update = Ae.useCallback(() => {
241
+ if (!renderer || !scene || !camera || !config.enabled)
242
+ return;
243
+ if (!renderTarget || !depthTarget.current)
244
+ return;
245
+ // Render scene to render target (color + depth)
246
+ renderer.setRenderTarget(depthTarget.current);
247
+ renderer.render(scene, camera);
248
+ renderer.setRenderTarget(renderTarget);
249
+ renderer.render(scene, camera);
250
+ // Update camera matrices in uniforms
251
+ if (ssrMaterial.current) {
252
+ ssrMaterial.current.uniforms.projMatrix.value.copy(camera.projectionMatrix);
253
+ ssrMaterial.current.uniforms.projInverseMatrix.value.copy(camera.projectionMatrixInverse);
254
+ ssrMaterial.current.uniforms.viewMatrix.value.copy(camera.matrixWorldInverse);
255
+ }
256
+ // Render SSR pass to screen
257
+ renderer.setRenderTarget(null);
258
+ renderer.render(orthoScene.current, orthoCamera.current);
259
+ }, [renderer, scene, camera, config.enabled, renderTarget]);
260
+ const dispose = Ae.useCallback(() => {
261
+ var _a, _b, _c;
262
+ renderTarget === null || renderTarget === void 0 ? void 0 : renderTarget.dispose();
263
+ (_a = depthTarget.current) === null || _a === void 0 ? void 0 : _a.dispose();
264
+ (_b = normalTarget.current) === null || _b === void 0 ? void 0 : _b.dispose();
265
+ (_c = ssrMaterial.current) === null || _c === void 0 ? void 0 : _c.dispose();
266
+ }, [renderTarget]);
267
+ return { config, setConfig, renderTarget, update, dispose };
268
+ }
269
+ /* ── Component ── */
270
+ const NiceSSR = ({ renderer, scene, camera, config: configProp, className = '', }) => {
271
+ const { config, setConfig } = useSSR(renderer, scene, camera, configProp);
272
+ return (jsxRuntime.jsxs("div", { className: `nice-ssr ${className}`, style: { display: 'grid', gap: 8, fontSize: 13 }, children: [jsxRuntime.jsxs("div", { style: { display: 'flex', justifyContent: 'space-between', alignItems: 'center' }, children: [jsxRuntime.jsx("strong", { children: "\uD83E\uDE9E Screen-Space Reflections" }), jsxRuntime.jsxs("label", { style: { display: 'flex', alignItems: 'center', gap: 4, fontSize: 11 }, children: [jsxRuntime.jsx("input", { type: "checkbox", checked: config.enabled, onChange: (e) => setConfig({ enabled: e.target.checked }) }), "Enabled"] })] }), jsxRuntime.jsxs("label", { children: ["Max Steps: ", config.maxSteps, jsxRuntime.jsx("input", { type: "range", min: 16, max: 256, step: 16, value: config.maxSteps, onChange: (e) => setConfig({ maxSteps: parseInt(e.target.value, 10) }), style: { width: '100%' } })] }), jsxRuntime.jsxs("label", { children: ["Max Distance: ", config.maxDistance, jsxRuntime.jsx("input", { type: "range", min: 5, max: 200, step: 5, value: config.maxDistance, onChange: (e) => setConfig({ maxDistance: parseInt(e.target.value, 10) }), style: { width: '100%' } })] }), jsxRuntime.jsxs("label", { children: ["Intensity: ", config.intensity.toFixed(2), jsxRuntime.jsx("input", { type: "range", min: 0, max: 1, step: 0.05, value: config.intensity, onChange: (e) => setConfig({ intensity: parseFloat(e.target.value) }), style: { width: '100%' } })] }), jsxRuntime.jsxs("label", { children: ["Thickness: ", config.thickness.toFixed(2), jsxRuntime.jsx("input", { type: "range", min: 0.05, max: 2, step: 0.05, value: config.thickness, onChange: (e) => setConfig({ thickness: parseFloat(e.target.value) }), style: { width: '100%' } })] }), jsxRuntime.jsxs("label", { children: ["Jitter: ", config.jitter.toFixed(2), jsxRuntime.jsx("input", { type: "range", min: 0, max: 1, step: 0.05, value: config.jitter, onChange: (e) => setConfig({ jitter: parseFloat(e.target.value) }), style: { width: '100%' } })] }), jsxRuntime.jsxs("label", { children: ["Resolution Scale: ", config.resolution.toFixed(2), jsxRuntime.jsx("input", { type: "range", min: 0.25, max: 1, step: 0.25, value: config.resolution, onChange: (e) => setConfig({ resolution: parseFloat(e.target.value) }), style: { width: '100%' } })] }), jsxRuntime.jsxs("label", { children: ["Fresnel: ", config.fresnelExponent.toFixed(1), jsxRuntime.jsx("input", { type: "range", min: 1, max: 8, step: 0.5, value: config.fresnelExponent, onChange: (e) => setConfig({ fresnelExponent: parseFloat(e.target.value) }), style: { width: '100%' } })] })] }));
273
+ };
274
+
275
+ exports.NiceSSR = NiceSSR;
276
+ exports.useSSR = useSSR;
277
+ //# sourceMappingURL=NiceSSR.js.map