@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.
- package/CHANGELOG.md +115 -1
- package/dist/cjs/collaborative/collaborativeScene.js +210 -0
- package/dist/cjs/collaborative/collaborativeScene.js.map +1 -0
- package/dist/cjs/core/i18n.js +3 -3
- package/dist/cjs/core/i18n.js.map +1 -1
- package/dist/cjs/dance/DanceBridge.js +162 -0
- package/dist/cjs/dance/DanceBridge.js.map +1 -0
- package/dist/cjs/dance/DanceScoreEngine.js +210 -0
- package/dist/cjs/dance/DanceScoreEngine.js.map +1 -0
- package/dist/cjs/dance/PoseDetector.js +199 -0
- package/dist/cjs/dance/PoseDetector.js.map +1 -0
- package/dist/cjs/index.js +254 -0
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/material/MaterialEditor.module.css.js +6 -0
- package/dist/cjs/material/MaterialEditor.module.css.js.map +1 -0
- package/dist/cjs/material/NiceMaterialEditor.js +737 -0
- package/dist/cjs/material/NiceMaterialEditor.js.map +1 -0
- package/dist/cjs/material/materialEditorTypes.js +73 -0
- package/dist/cjs/material/materialEditorTypes.js.map +1 -0
- package/dist/cjs/material/materialEditorUtils.js +841 -0
- package/dist/cjs/material/materialEditorUtils.js.map +1 -0
- package/dist/cjs/material/materialNodeDefinitions.js +1285 -0
- package/dist/cjs/material/materialNodeDefinitions.js.map +1 -0
- package/dist/cjs/model/ModelEditor.js +4 -1
- package/dist/cjs/model/ModelEditor.js.map +1 -1
- package/dist/cjs/model/ModelEditor.module.css.js +1 -1
- package/dist/cjs/model/ModelEditorLeftPanel.js +5 -4
- package/dist/cjs/model/ModelEditorLeftPanel.js.map +1 -1
- package/dist/cjs/model/ModelEditorMenuBar.js +8 -3
- package/dist/cjs/model/ModelEditorMenuBar.js.map +1 -1
- package/dist/cjs/model/ModelEditorRightPanel.js +27 -26
- package/dist/cjs/model/ModelEditorRightPanel.js.map +1 -1
- package/dist/cjs/model/ModelEditorSubComponents.js +20 -16
- package/dist/cjs/model/ModelEditorSubComponents.js.map +1 -1
- package/dist/cjs/model/ModelEditorTimeline.js +5 -4
- package/dist/cjs/model/ModelEditorTimeline.js.map +1 -1
- package/dist/cjs/model/ModelEditorToolbar.js +4 -3
- package/dist/cjs/model/ModelEditorToolbar.js.map +1 -1
- package/dist/cjs/model/ModelEditorViewport.js +2 -2
- package/dist/cjs/model/ModelEditorViewport.js.map +1 -1
- package/dist/cjs/model/ModelViewer.js +68 -0
- package/dist/cjs/model/ModelViewer.js.map +1 -0
- package/dist/cjs/model/ModelViewer.module.css.js +6 -0
- package/dist/cjs/model/ModelViewer.module.css.js.map +1 -0
- package/dist/cjs/model/NiceArmatureEditor.js +255 -0
- package/dist/cjs/model/NiceArmatureEditor.js.map +1 -0
- package/dist/cjs/model/NiceMorphTargetEditor.js +206 -0
- package/dist/cjs/model/NiceMorphTargetEditor.js.map +1 -0
- package/dist/cjs/model/NiceOctree.js +339 -0
- package/dist/cjs/model/NiceOctree.js.map +1 -0
- package/dist/cjs/model/NicePhysicsSimulation.js +283 -0
- package/dist/cjs/model/NicePhysicsSimulation.js.map +1 -0
- package/dist/cjs/model/NiceProceduralGeometry.js +269 -0
- package/dist/cjs/model/NiceProceduralGeometry.js.map +1 -0
- package/dist/cjs/model/NiceTerrainEditor.js +343 -0
- package/dist/cjs/model/NiceTerrainEditor.js.map +1 -0
- package/dist/cjs/model/NiceWeightPainter.js +258 -0
- package/dist/cjs/model/NiceWeightPainter.js.map +1 -0
- package/dist/cjs/model/NiceXRPreview.js +269 -0
- package/dist/cjs/model/NiceXRPreview.js.map +1 -0
- package/dist/cjs/model/cadModeUtils.js +130 -0
- package/dist/cjs/model/cadModeUtils.js.map +1 -0
- package/dist/cjs/model/editorShortcuts.js +187 -0
- package/dist/cjs/model/editorShortcuts.js.map +1 -0
- package/dist/cjs/model/modelEditorTypes.js +11 -0
- package/dist/cjs/model/modelEditorTypes.js.map +1 -1
- package/dist/cjs/model/modelEditorUtils.js +1049 -0
- package/dist/cjs/model/modelEditorUtils.js.map +1 -0
- package/dist/cjs/model/simsModeUtils.js +358 -0
- package/dist/cjs/model/simsModeUtils.js.map +1 -0
- package/dist/cjs/model/useModelEditor.js +319 -115
- package/dist/cjs/model/useModelEditor.js.map +1 -1
- package/dist/cjs/model/useModelViewer.js +634 -0
- package/dist/cjs/model/useModelViewer.js.map +1 -0
- package/dist/cjs/nice2dev-ui-3d.css +1 -1
- package/dist/cjs/particle/NiceParticleEditor.js +526 -0
- package/dist/cjs/particle/NiceParticleEditor.js.map +1 -0
- package/dist/cjs/particle/ParticleEditor.module.css.js +6 -0
- package/dist/cjs/particle/ParticleEditor.module.css.js.map +1 -0
- package/dist/cjs/particle/particleEditorTypes.js +92 -0
- package/dist/cjs/particle/particleEditorTypes.js.map +1 -0
- package/dist/cjs/particle/particleEditorUtils.js +1084 -0
- package/dist/cjs/particle/particleEditorUtils.js.map +1 -0
- package/dist/cjs/rendering/NiceCascadedShadows.js +266 -0
- package/dist/cjs/rendering/NiceCascadedShadows.js.map +1 -0
- package/dist/cjs/rendering/NiceRenderExport.js +341 -0
- package/dist/cjs/rendering/NiceRenderExport.js.map +1 -0
- package/dist/cjs/rendering/NiceSSAO.js +359 -0
- package/dist/cjs/rendering/NiceSSAO.js.map +1 -0
- package/dist/cjs/rendering/NiceSSR.js +277 -0
- package/dist/cjs/rendering/NiceSSR.js.map +1 -0
- package/dist/cjs/rendering/NiceWebGPURenderer.js +215 -0
- package/dist/cjs/rendering/NiceWebGPURenderer.js.map +1 -0
- package/dist/cjs/ui/dist/index.js +50089 -0
- package/dist/cjs/ui/dist/index.js.map +1 -0
- package/dist/cjs/uv/NiceUVEditor.js +520 -0
- package/dist/cjs/uv/NiceUVEditor.js.map +1 -0
- package/dist/cjs/uv/UVEditor.module.css.js +6 -0
- package/dist/cjs/uv/UVEditor.module.css.js.map +1 -0
- package/dist/cjs/uv/uvEditorTypes.js +98 -0
- package/dist/cjs/uv/uvEditorTypes.js.map +1 -0
- package/dist/cjs/uv/uvEditorUtils.js +670 -0
- package/dist/cjs/uv/uvEditorUtils.js.map +1 -0
- package/dist/esm/collaborative/collaborativeScene.js +206 -0
- package/dist/esm/collaborative/collaborativeScene.js.map +1 -0
- package/dist/esm/dance/DanceBridge.js +158 -0
- package/dist/esm/dance/DanceBridge.js.map +1 -0
- package/dist/esm/dance/DanceScoreEngine.js +207 -0
- package/dist/esm/dance/DanceScoreEngine.js.map +1 -0
- package/dist/esm/dance/PoseDetector.js +195 -0
- package/dist/esm/dance/PoseDetector.js.map +1 -0
- package/dist/esm/index.js +35 -1
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/material/MaterialEditor.module.css.js +4 -0
- package/dist/esm/material/MaterialEditor.module.css.js.map +1 -0
- package/dist/esm/material/NiceMaterialEditor.js +734 -0
- package/dist/esm/material/NiceMaterialEditor.js.map +1 -0
- package/dist/esm/material/materialEditorTypes.js +62 -0
- package/dist/esm/material/materialEditorTypes.js.map +1 -0
- package/dist/esm/material/materialEditorUtils.js +811 -0
- package/dist/esm/material/materialEditorUtils.js.map +1 -0
- package/dist/esm/material/materialNodeDefinitions.js +1280 -0
- package/dist/esm/material/materialNodeDefinitions.js.map +1 -0
- package/dist/esm/model/ModelEditor.js +4 -2
- package/dist/esm/model/ModelEditor.js.map +1 -1
- package/dist/esm/model/ModelEditor.module.css.js +1 -1
- package/dist/esm/model/ModelEditorLeftPanel.js +5 -4
- package/dist/esm/model/ModelEditorLeftPanel.js.map +1 -1
- package/dist/esm/model/ModelEditorMenuBar.js +8 -3
- package/dist/esm/model/ModelEditorMenuBar.js.map +1 -1
- package/dist/esm/model/ModelEditorRightPanel.js +27 -26
- package/dist/esm/model/ModelEditorRightPanel.js.map +1 -1
- package/dist/esm/model/ModelEditorSubComponents.js +17 -13
- package/dist/esm/model/ModelEditorSubComponents.js.map +1 -1
- package/dist/esm/model/ModelEditorTimeline.js +5 -4
- package/dist/esm/model/ModelEditorTimeline.js.map +1 -1
- package/dist/esm/model/ModelEditorToolbar.js +4 -3
- package/dist/esm/model/ModelEditorToolbar.js.map +1 -1
- package/dist/esm/model/ModelEditorViewport.js +2 -2
- package/dist/esm/model/ModelEditorViewport.js.map +1 -1
- package/dist/esm/model/ModelViewer.js +65 -0
- package/dist/esm/model/ModelViewer.js.map +1 -0
- package/dist/esm/model/ModelViewer.module.css.js +4 -0
- package/dist/esm/model/ModelViewer.module.css.js.map +1 -0
- package/dist/esm/model/NiceArmatureEditor.js +233 -0
- package/dist/esm/model/NiceArmatureEditor.js.map +1 -0
- package/dist/esm/model/NiceMorphTargetEditor.js +184 -0
- package/dist/esm/model/NiceMorphTargetEditor.js.map +1 -0
- package/dist/esm/model/NiceOctree.js +317 -0
- package/dist/esm/model/NiceOctree.js.map +1 -0
- package/dist/esm/model/NicePhysicsSimulation.js +261 -0
- package/dist/esm/model/NicePhysicsSimulation.js.map +1 -0
- package/dist/esm/model/NiceProceduralGeometry.js +242 -0
- package/dist/esm/model/NiceProceduralGeometry.js.map +1 -0
- package/dist/esm/model/NiceTerrainEditor.js +321 -0
- package/dist/esm/model/NiceTerrainEditor.js.map +1 -0
- package/dist/esm/model/NiceWeightPainter.js +236 -0
- package/dist/esm/model/NiceWeightPainter.js.map +1 -0
- package/dist/esm/model/NiceXRPreview.js +247 -0
- package/dist/esm/model/NiceXRPreview.js.map +1 -0
- package/dist/esm/model/cadModeUtils.js +103 -0
- package/dist/esm/model/cadModeUtils.js.map +1 -0
- package/dist/esm/model/editorShortcuts.js +185 -0
- package/dist/esm/model/editorShortcuts.js.map +1 -0
- package/dist/esm/model/modelEditorTypes.js +11 -0
- package/dist/esm/model/modelEditorTypes.js.map +1 -1
- package/dist/esm/model/modelEditorUtils.js +997 -0
- package/dist/esm/model/modelEditorUtils.js.map +1 -0
- package/dist/esm/model/simsModeUtils.js +325 -0
- package/dist/esm/model/simsModeUtils.js.map +1 -0
- package/dist/esm/model/useModelEditor.js +204 -0
- package/dist/esm/model/useModelEditor.js.map +1 -1
- package/dist/esm/model/useModelViewer.js +613 -0
- package/dist/esm/model/useModelViewer.js.map +1 -0
- package/dist/esm/nice2dev-ui-3d.css +1 -1
- package/dist/esm/particle/NiceParticleEditor.js +523 -0
- package/dist/esm/particle/NiceParticleEditor.js.map +1 -0
- package/dist/esm/particle/ParticleEditor.module.css.js +4 -0
- package/dist/esm/particle/ParticleEditor.module.css.js.map +1 -0
- package/dist/esm/particle/particleEditorTypes.js +84 -0
- package/dist/esm/particle/particleEditorTypes.js.map +1 -0
- package/dist/esm/particle/particleEditorUtils.js +1054 -0
- package/dist/esm/particle/particleEditorUtils.js.map +1 -0
- package/dist/esm/rendering/NiceCascadedShadows.js +244 -0
- package/dist/esm/rendering/NiceCascadedShadows.js.map +1 -0
- package/dist/esm/rendering/NiceRenderExport.js +319 -0
- package/dist/esm/rendering/NiceRenderExport.js.map +1 -0
- package/dist/esm/rendering/NiceSSAO.js +337 -0
- package/dist/esm/rendering/NiceSSAO.js.map +1 -0
- package/dist/esm/rendering/NiceSSR.js +255 -0
- package/dist/esm/rendering/NiceSSR.js.map +1 -0
- package/dist/esm/rendering/NiceWebGPURenderer.js +193 -0
- package/dist/esm/rendering/NiceWebGPURenderer.js.map +1 -0
- package/dist/esm/ui/dist/index.js +49686 -0
- package/dist/esm/ui/dist/index.js.map +1 -0
- package/dist/esm/uv/NiceUVEditor.js +518 -0
- package/dist/esm/uv/NiceUVEditor.js.map +1 -0
- package/dist/esm/uv/UVEditor.module.css.js +4 -0
- package/dist/esm/uv/UVEditor.module.css.js.map +1 -0
- package/dist/esm/uv/uvEditorTypes.js +88 -0
- package/dist/esm/uv/uvEditorTypes.js.map +1 -0
- package/dist/esm/uv/uvEditorUtils.js +621 -0
- package/dist/esm/uv/uvEditorUtils.js.map +1 -0
- 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
|