@nice2dev/ui-3d 1.0.0 → 1.0.2

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