@nodetool-ai/game-renderer 0.8.4-a24.2 → 0.8.4
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/README.md +13 -0
- package/dist/.nodetool-build-stamp +1 -1
- package/dist/audio/player.d.ts +1 -0
- package/dist/audio/player.d.ts.map +1 -1
- package/dist/audio/player.js +13 -2
- package/dist/audio/player.js.map +1 -1
- package/dist/build-fingerprint.d.ts +3 -0
- package/dist/build-fingerprint.d.ts.map +1 -0
- package/dist/build-fingerprint.js +9 -0
- package/dist/build-fingerprint.js.map +1 -0
- package/dist/build-tauri.d.ts +3 -1
- package/dist/build-tauri.d.ts.map +1 -1
- package/dist/build-tauri.js +54 -8
- package/dist/build-tauri.js.map +1 -1
- package/dist/build.d.ts +4 -1
- package/dist/build.d.ts.map +1 -1
- package/dist/build.js +24 -11
- package/dist/build.js.map +1 -1
- package/dist/build3d.d.ts +2 -0
- package/dist/build3d.d.ts.map +1 -1
- package/dist/build3d.js +21 -6
- package/dist/build3d.js.map +1 -1
- package/dist/canvas2d.d.ts +1 -0
- package/dist/canvas2d.d.ts.map +1 -1
- package/dist/canvas2d.js +15 -10
- package/dist/canvas2d.js.map +1 -1
- package/dist/export-media.d.ts +7 -0
- package/dist/export-media.d.ts.map +1 -0
- package/dist/export-media.js +73 -0
- package/dist/export-media.js.map +1 -0
- package/dist/frame.d.ts +5 -0
- package/dist/frame.d.ts.map +1 -1
- package/dist/frame.js +7 -1
- package/dist/frame.js.map +1 -1
- package/dist/game3d-capture-page.js +306 -276
- package/dist/game3d-player.js +399 -350
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/lighting.d.ts.map +1 -1
- package/dist/lighting.js +4 -3
- package/dist/lighting.js.map +1 -1
- package/dist/mouse-input.d.ts +18 -0
- package/dist/mouse-input.d.ts.map +1 -0
- package/dist/mouse-input.js +135 -0
- package/dist/mouse-input.js.map +1 -0
- package/dist/node.d.ts.map +1 -1
- package/dist/node.js +2 -2
- package/dist/node.js.map +1 -1
- package/dist/node3d.d.ts.map +1 -1
- package/dist/node3d.js +5 -3
- package/dist/node3d.js.map +1 -1
- package/dist/particles/particles3d.d.ts +12 -10
- package/dist/particles/particles3d.d.ts.map +1 -1
- package/dist/particles/particles3d.js +81 -60
- package/dist/particles/particles3d.js.map +1 -1
- package/dist/particles/pass3d.d.ts +6 -4
- package/dist/particles/pass3d.d.ts.map +1 -1
- package/dist/particles/pass3d.js +28 -15
- package/dist/particles/pass3d.js.map +1 -1
- package/dist/particles/render2d.d.ts +3 -2
- package/dist/particles/render2d.d.ts.map +1 -1
- package/dist/particles/render2d.js +9 -2
- package/dist/particles/render2d.js.map +1 -1
- package/dist/particles/simulator.d.ts +13 -1
- package/dist/particles/simulator.d.ts.map +1 -1
- package/dist/particles/simulator.js +173 -44
- package/dist/particles/simulator.js.map +1 -1
- package/dist/particles/transparency3d.d.ts +17 -0
- package/dist/particles/transparency3d.d.ts.map +1 -0
- package/dist/particles/transparency3d.js +117 -0
- package/dist/particles/transparency3d.js.map +1 -0
- package/dist/player-v1.js +275 -256
- package/dist/renderer3d/animation/index.d.ts +2 -0
- package/dist/renderer3d/animation/index.d.ts.map +1 -1
- package/dist/renderer3d/animation/index.js +24 -10
- package/dist/renderer3d/animation/index.js.map +1 -1
- package/dist/renderer3d/assets/image-preparation.d.ts +9 -0
- package/dist/renderer3d/assets/image-preparation.d.ts.map +1 -1
- package/dist/renderer3d/assets/image-preparation.js +14 -4
- package/dist/renderer3d/assets/image-preparation.js.map +1 -1
- package/dist/renderer3d/assets/instances.d.ts.map +1 -1
- package/dist/renderer3d/assets/instances.js +38 -1
- package/dist/renderer3d/assets/instances.js.map +1 -1
- package/dist/renderer3d/decals/geometry.d.ts +27 -0
- package/dist/renderer3d/decals/geometry.d.ts.map +1 -0
- package/dist/renderer3d/decals/geometry.js +142 -0
- package/dist/renderer3d/decals/geometry.js.map +1 -0
- package/dist/renderer3d/decals/index.d.ts +29 -0
- package/dist/renderer3d/decals/index.d.ts.map +1 -0
- package/dist/renderer3d/decals/index.js +284 -0
- package/dist/renderer3d/decals/index.js.map +1 -0
- package/dist/renderer3d/environment/height-fog.d.ts +14 -0
- package/dist/renderer3d/environment/height-fog.d.ts.map +1 -0
- package/dist/renderer3d/environment/height-fog.js +114 -0
- package/dist/renderer3d/environment/height-fog.js.map +1 -0
- package/dist/renderer3d/environment/index.d.ts.map +1 -1
- package/dist/renderer3d/environment/index.js +4 -1
- package/dist/renderer3d/environment/index.js.map +1 -1
- package/dist/renderer3d/environment/sky.d.ts +1 -0
- package/dist/renderer3d/environment/sky.d.ts.map +1 -1
- package/dist/renderer3d/environment/sky.js +33 -16
- package/dist/renderer3d/environment/sky.js.map +1 -1
- package/dist/renderer3d/import.d.ts.map +1 -1
- package/dist/renderer3d/import.js +19 -3
- package/dist/renderer3d/import.js.map +1 -1
- package/dist/renderer3d/index.d.ts.map +1 -1
- package/dist/renderer3d/index.js +27 -4
- package/dist/renderer3d/index.js.map +1 -1
- package/dist/renderer3d/material-hooks.d.ts +8 -0
- package/dist/renderer3d/material-hooks.d.ts.map +1 -0
- package/dist/renderer3d/material-hooks.js +53 -0
- package/dist/renderer3d/material-hooks.js.map +1 -0
- package/dist/renderer3d/pipeline.d.ts +1 -0
- package/dist/renderer3d/pipeline.d.ts.map +1 -1
- package/dist/renderer3d/pipeline.js.map +1 -1
- package/dist/renderer3d/preparation.d.ts +1 -0
- package/dist/renderer3d/preparation.d.ts.map +1 -1
- package/dist/renderer3d/preparation.js +37 -4
- package/dist/renderer3d/preparation.js.map +1 -1
- package/dist/renderer3d/scene-sync.d.ts.map +1 -1
- package/dist/renderer3d/scene-sync.js +16 -1
- package/dist/renderer3d/scene-sync.js.map +1 -1
- package/dist/renderer3d/shadows/cascades.d.ts +2 -1
- package/dist/renderer3d/shadows/cascades.d.ts.map +1 -1
- package/dist/renderer3d/shadows/cascades.js +19 -37
- package/dist/renderer3d/shadows/cascades.js.map +1 -1
- package/dist/renderer3d/shadows/index.d.ts +1 -0
- package/dist/renderer3d/shadows/index.d.ts.map +1 -1
- package/dist/renderer3d/shadows/index.js +3 -2
- package/dist/renderer3d/shadows/index.js.map +1 -1
- package/dist/renderer3d/types.d.ts +1 -0
- package/dist/renderer3d/types.d.ts.map +1 -1
- package/dist/save-storage.d.ts.map +1 -1
- package/dist/save-storage.js +23 -7
- package/dist/save-storage.js.map +1 -1
- package/dist/smoke.d.ts.map +1 -1
- package/dist/smoke.js +27 -12
- package/dist/smoke.js.map +1 -1
- package/dist/standalone-assets.d.ts +25 -0
- package/dist/standalone-assets.d.ts.map +1 -0
- package/dist/standalone-assets.js +111 -0
- package/dist/standalone-assets.js.map +1 -0
- package/dist/standalone-frame.d.ts +7 -0
- package/dist/standalone-frame.d.ts.map +1 -0
- package/dist/standalone-frame.js +2 -0
- package/dist/standalone-frame.js.map +1 -0
- package/dist/standalone-player.d.ts +3 -2
- package/dist/standalone-player.d.ts.map +1 -1
- package/dist/standalone-player.js +246 -76
- package/dist/standalone-player.js.map +1 -1
- package/dist/standalone-player3d.d.ts +4 -3
- package/dist/standalone-player3d.d.ts.map +1 -1
- package/dist/standalone-player3d.js +193 -115
- package/dist/standalone-player3d.js.map +1 -1
- package/dist/touch-controls.d.ts +10 -1
- package/dist/touch-controls.d.ts.map +1 -1
- package/dist/touch-controls.js +98 -10
- package/dist/touch-controls.js.map +1 -1
- package/dist/touch-input.d.ts +13 -0
- package/dist/touch-input.d.ts.map +1 -0
- package/dist/touch-input.js +71 -0
- package/dist/touch-input.js.map +1 -0
- package/dist/ui/controller.d.ts +7 -0
- package/dist/ui/controller.d.ts.map +1 -1
- package/dist/ui/controller.js +40 -9
- package/dist/ui/controller.js.map +1 -1
- package/dist/webgpu/lighting.d.ts +1 -1
- package/dist/webgpu/lighting.d.ts.map +1 -1
- package/dist/webgpu/lighting.js +4 -3
- package/dist/webgpu/lighting.js.map +1 -1
- package/dist/webgpu.js +1 -1
- package/dist/webgpu.js.map +1 -1
- package/package.json +5 -5
|
@@ -0,0 +1,284 @@
|
|
|
1
|
+
import * as THREE from "three";
|
|
2
|
+
import { GAME_MAX_DECALS_3D } from "@nodetool-ai/protocol";
|
|
3
|
+
import { GameImageCache3D } from "../assets/image-cache.js";
|
|
4
|
+
import { GAME_DECAL_LIMITS_3D, GameDecalProjectionError3D, gameDecalAttributeKey3D, gameDecalProjector3D, projectGameDecalGeometry3D } from "./geometry.js";
|
|
5
|
+
// Decal overlap ordering stays before ordinary transparent geometry, whose default order is zero.
|
|
6
|
+
const DECAL_RENDER_ORDER_START = -(GAME_MAX_DECALS_3D * GAME_MAX_DECALS_3D);
|
|
7
|
+
/** One cache per renderer. Projected meshes remain in world space and never enter the simulation. */
|
|
8
|
+
export class GameDecals3D {
|
|
9
|
+
scene;
|
|
10
|
+
signal;
|
|
11
|
+
diagnostics;
|
|
12
|
+
onDiagnostic;
|
|
13
|
+
images;
|
|
14
|
+
entries = new Map();
|
|
15
|
+
loadedSlots = new Set();
|
|
16
|
+
reported = new Set();
|
|
17
|
+
onAbort = () => this.dispose();
|
|
18
|
+
disposed = false;
|
|
19
|
+
constructor(scene, sources, signal, diagnostics, onDiagnostic) {
|
|
20
|
+
this.scene = scene;
|
|
21
|
+
this.signal = signal;
|
|
22
|
+
this.diagnostics = diagnostics;
|
|
23
|
+
this.onDiagnostic = onDiagnostic;
|
|
24
|
+
this.images = new GameImageCache3D(sources, signal);
|
|
25
|
+
signal.addEventListener("abort", this.onAbort, { once: true });
|
|
26
|
+
if (signal.aborted) {
|
|
27
|
+
this.dispose();
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
get textureBytes() { return this.images.textureBytes; }
|
|
31
|
+
get geometryBytes() {
|
|
32
|
+
let bytes = 0;
|
|
33
|
+
for (const entry of this.entries.values()) {
|
|
34
|
+
for (const geometry of entry.geometries) {
|
|
35
|
+
for (const attribute of Object.values(geometry.attributes)) {
|
|
36
|
+
bytes += attribute instanceof THREE.InterleavedBufferAttribute ? attribute.data.array.byteLength : attribute.array.byteLength;
|
|
37
|
+
}
|
|
38
|
+
bytes += geometry.index?.array.byteLength ?? 0;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
return bytes;
|
|
42
|
+
}
|
|
43
|
+
async sync(frame, instances) {
|
|
44
|
+
this.signal.throwIfAborted();
|
|
45
|
+
if (this.disposed) {
|
|
46
|
+
throw new Error("Decal renderer is disposed");
|
|
47
|
+
}
|
|
48
|
+
const decals = frame.entities.filter((entity) => entity.decal3d);
|
|
49
|
+
const present = new Set(decals.slice(0, GAME_MAX_DECALS_3D).map((entity) => entity.entityId));
|
|
50
|
+
for (const [id, entry] of this.entries) {
|
|
51
|
+
if (!present.has(id)) {
|
|
52
|
+
this.release(id, entry);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
const usedSlots = new Set(decals.slice(0, GAME_MAX_DECALS_3D).flatMap((entity) => entity.decal3d ? [entity.decal3d.assetId] : []));
|
|
56
|
+
for (const slot of this.loadedSlots) {
|
|
57
|
+
if (!usedSlots.has(slot)) {
|
|
58
|
+
await this.images.invalidate(slot);
|
|
59
|
+
this.loadedSlots.delete(slot);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
if (decals.length === 0) {
|
|
63
|
+
return;
|
|
64
|
+
}
|
|
65
|
+
this.scene.updateMatrixWorld(true);
|
|
66
|
+
const receivers = new Map();
|
|
67
|
+
let cachedVertices = 0;
|
|
68
|
+
for (const entry of this.entries.values()) {
|
|
69
|
+
for (const geometry of entry.geometries) {
|
|
70
|
+
cachedVertices += geometry.getAttribute("position").count;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
const work = { nodes: 0, sourceTriangles: 0, candidateTriangles: 0, outputVertices: cachedVertices };
|
|
74
|
+
for (const [order, entity] of decals.entries()) {
|
|
75
|
+
const settings = entity.decal3d;
|
|
76
|
+
if (!settings) {
|
|
77
|
+
continue;
|
|
78
|
+
}
|
|
79
|
+
if (order >= GAME_MAX_DECALS_3D) {
|
|
80
|
+
this.report("Scene decal count limit exceeded");
|
|
81
|
+
break;
|
|
82
|
+
}
|
|
83
|
+
const existing = this.entries.get(entity.entityId);
|
|
84
|
+
const projectorObject = instances.get(entity.entityId)?.object;
|
|
85
|
+
const receiverObject = instances.get(settings.receiverId)?.object;
|
|
86
|
+
if (!projectorObject || !receiverObject) {
|
|
87
|
+
if (existing) {
|
|
88
|
+
this.release(entity.entityId, existing);
|
|
89
|
+
}
|
|
90
|
+
this.report(`Decal ${entity.entityId} receiver or projector is unavailable`);
|
|
91
|
+
continue;
|
|
92
|
+
}
|
|
93
|
+
if (!receiverObject.visible || !projectorObject.visible || (entity.opacity ?? 1) === 0) {
|
|
94
|
+
if (existing) {
|
|
95
|
+
existing.group.visible = false;
|
|
96
|
+
}
|
|
97
|
+
continue;
|
|
98
|
+
}
|
|
99
|
+
try {
|
|
100
|
+
let receiver = receivers.get(settings.receiverId);
|
|
101
|
+
if (!receiver) {
|
|
102
|
+
receiver = this.receiver(receiverObject, work);
|
|
103
|
+
receivers.set(settings.receiverId, receiver);
|
|
104
|
+
}
|
|
105
|
+
const key = `${JSON.stringify(settings)}:${projectorObject.matrixWorld.elements.join(",")}:${receiver.signature}`;
|
|
106
|
+
if (existing?.key === key) {
|
|
107
|
+
existing.group.visible = true;
|
|
108
|
+
if (existing.material) {
|
|
109
|
+
existing.material.opacity = settings.opacity * (entity.opacity ?? 1);
|
|
110
|
+
}
|
|
111
|
+
for (const child of existing.group.children) {
|
|
112
|
+
child.renderOrder = DECAL_RENDER_ORDER_START + settings.renderOrder * GAME_MAX_DECALS_3D + order;
|
|
113
|
+
}
|
|
114
|
+
continue;
|
|
115
|
+
}
|
|
116
|
+
if (existing) {
|
|
117
|
+
for (const geometry of existing.geometries) {
|
|
118
|
+
work.outputVertices -= geometry.getAttribute("position").count;
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
const next = await this.build(key, settings, projectorObject, receiver, work);
|
|
122
|
+
try {
|
|
123
|
+
this.signal.throwIfAborted();
|
|
124
|
+
}
|
|
125
|
+
catch (error) {
|
|
126
|
+
this.release(entity.entityId, next);
|
|
127
|
+
throw error;
|
|
128
|
+
}
|
|
129
|
+
if (existing) {
|
|
130
|
+
this.release(entity.entityId, existing);
|
|
131
|
+
}
|
|
132
|
+
next.group.userData.gameEntityId = entity.entityId;
|
|
133
|
+
for (const object of next.group.children) {
|
|
134
|
+
object.renderOrder = DECAL_RENDER_ORDER_START + settings.renderOrder * GAME_MAX_DECALS_3D + order;
|
|
135
|
+
}
|
|
136
|
+
if (next.material) {
|
|
137
|
+
next.material.opacity = settings.opacity * (entity.opacity ?? 1);
|
|
138
|
+
}
|
|
139
|
+
this.entries.set(entity.entityId, next);
|
|
140
|
+
this.scene.add(next.group);
|
|
141
|
+
}
|
|
142
|
+
catch (error) {
|
|
143
|
+
if (!(error instanceof GameDecalProjectionError3D)) {
|
|
144
|
+
throw error;
|
|
145
|
+
}
|
|
146
|
+
if (existing) {
|
|
147
|
+
this.release(entity.entityId, existing);
|
|
148
|
+
}
|
|
149
|
+
this.report(`Decal ${entity.entityId}: ${error.message}`);
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
receiver(root, work) {
|
|
154
|
+
const meshes = [];
|
|
155
|
+
const keys = [root.uuid];
|
|
156
|
+
const pending = [root];
|
|
157
|
+
while (pending.length > 0) {
|
|
158
|
+
const object = pending.pop();
|
|
159
|
+
if (!object) {
|
|
160
|
+
break;
|
|
161
|
+
}
|
|
162
|
+
work.nodes += 1;
|
|
163
|
+
if (work.nodes > GAME_DECAL_LIMITS_3D.sceneNodes) {
|
|
164
|
+
throw new GameDecalProjectionError3D("Scene decal receiver node work limit exceeded");
|
|
165
|
+
}
|
|
166
|
+
if (!object.visible) {
|
|
167
|
+
continue;
|
|
168
|
+
}
|
|
169
|
+
for (let index = object.children.length - 1; index >= 0; index--) {
|
|
170
|
+
const child = object.children[index];
|
|
171
|
+
if (child) {
|
|
172
|
+
pending.push(child);
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
if (!(object instanceof THREE.Mesh)) {
|
|
176
|
+
continue;
|
|
177
|
+
}
|
|
178
|
+
if (object instanceof THREE.SkinnedMesh || object instanceof THREE.InstancedMesh || Object.keys(object.geometry.morphAttributes).length > 0) {
|
|
179
|
+
throw new GameDecalProjectionError3D("Receivers must be rigid meshes without skinning, morph targets or instancing");
|
|
180
|
+
}
|
|
181
|
+
const materials = Array.isArray(object.material) ? object.material : [object.material];
|
|
182
|
+
if (materials.some((material) => !material.visible || material.transparent || material.alphaTest > 0 || material.opacity < 1)) {
|
|
183
|
+
throw new GameDecalProjectionError3D("Receivers must use visible opaque materials without alpha masking");
|
|
184
|
+
}
|
|
185
|
+
meshes.push(object);
|
|
186
|
+
keys.push(`${object.uuid}:${Array.isArray(object.material) ? `array-${object.material.length}` : "single"}:${object.geometry.uuid}:${gameDecalAttributeKey3D(object.geometry.getAttribute("position"))}:${gameDecalAttributeKey3D(object.geometry.getAttribute("normal"))}:${gameDecalAttributeKey3D(object.geometry.index ?? undefined)}:${JSON.stringify(object.geometry.drawRange)}:${JSON.stringify(object.geometry.groups)}:${object.matrixWorld.elements.join(",")}`);
|
|
187
|
+
}
|
|
188
|
+
return { meshes, signature: keys.join(";") };
|
|
189
|
+
}
|
|
190
|
+
async build(key, settings, object, receiver, work) {
|
|
191
|
+
const projector = gameDecalProjector3D(object, settings.size);
|
|
192
|
+
const geometries = [];
|
|
193
|
+
let texture;
|
|
194
|
+
let material;
|
|
195
|
+
try {
|
|
196
|
+
for (const mesh of receiver.meshes) {
|
|
197
|
+
const geometry = projectGameDecalGeometry3D(mesh, projector, work);
|
|
198
|
+
if (geometry) {
|
|
199
|
+
geometries.push(geometry);
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
const group = new THREE.Group();
|
|
203
|
+
group.name = "game-decal";
|
|
204
|
+
if (geometries.length === 0) {
|
|
205
|
+
return { key, assetId: settings.assetId, group, geometries };
|
|
206
|
+
}
|
|
207
|
+
this.loadedSlots.add(settings.assetId);
|
|
208
|
+
texture = (await this.images.get(settings.assetId)).clone();
|
|
209
|
+
texture.colorSpace = THREE.SRGBColorSpace;
|
|
210
|
+
texture.needsUpdate = true;
|
|
211
|
+
material = new THREE.MeshStandardMaterial({ map: texture, color: "#ffffff", roughness: 1, metalness: 0,
|
|
212
|
+
transparent: true, opacity: settings.opacity, depthTest: true, depthWrite: false,
|
|
213
|
+
polygonOffset: true, polygonOffsetFactor: -2, polygonOffsetUnits: -2 });
|
|
214
|
+
for (const geometry of geometries) {
|
|
215
|
+
const mesh = new THREE.Mesh(geometry, material);
|
|
216
|
+
mesh.castShadow = false;
|
|
217
|
+
mesh.receiveShadow = true;
|
|
218
|
+
group.add(mesh);
|
|
219
|
+
}
|
|
220
|
+
const entry = { key, assetId: settings.assetId, group, geometries, texture, material };
|
|
221
|
+
texture = undefined;
|
|
222
|
+
material = undefined;
|
|
223
|
+
return entry;
|
|
224
|
+
}
|
|
225
|
+
catch (error) {
|
|
226
|
+
for (const geometry of geometries) {
|
|
227
|
+
geometry.dispose();
|
|
228
|
+
}
|
|
229
|
+
throw error;
|
|
230
|
+
}
|
|
231
|
+
finally {
|
|
232
|
+
material?.dispose();
|
|
233
|
+
texture?.dispose();
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
release(id, entry) {
|
|
237
|
+
entry.group.removeFromParent();
|
|
238
|
+
for (const geometry of entry.geometries) {
|
|
239
|
+
geometry.dispose();
|
|
240
|
+
}
|
|
241
|
+
entry.material?.dispose();
|
|
242
|
+
entry.texture?.dispose();
|
|
243
|
+
if (this.entries.get(id) === entry) {
|
|
244
|
+
this.entries.delete(id);
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
report(message) {
|
|
248
|
+
if (this.reported.has(message) || this.reported.size >= 64) {
|
|
249
|
+
return;
|
|
250
|
+
}
|
|
251
|
+
this.reported.add(message);
|
|
252
|
+
this.diagnostics.push(message);
|
|
253
|
+
this.onDiagnostic?.(message);
|
|
254
|
+
}
|
|
255
|
+
async invalidate(slot) {
|
|
256
|
+
for (const [id, entry] of this.entries) {
|
|
257
|
+
if (entry.assetId === slot) {
|
|
258
|
+
this.release(id, entry);
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
await this.images.invalidate(slot);
|
|
262
|
+
this.loadedSlots.delete(slot);
|
|
263
|
+
}
|
|
264
|
+
async reset() {
|
|
265
|
+
for (const [id, entry] of this.entries) {
|
|
266
|
+
this.release(id, entry);
|
|
267
|
+
}
|
|
268
|
+
await Promise.all([...this.loadedSlots].map((slot) => this.images.invalidate(slot)));
|
|
269
|
+
this.loadedSlots.clear();
|
|
270
|
+
}
|
|
271
|
+
dispose() {
|
|
272
|
+
if (this.disposed) {
|
|
273
|
+
return;
|
|
274
|
+
}
|
|
275
|
+
this.disposed = true;
|
|
276
|
+
this.signal.removeEventListener("abort", this.onAbort);
|
|
277
|
+
for (const [id, entry] of this.entries) {
|
|
278
|
+
this.release(id, entry);
|
|
279
|
+
}
|
|
280
|
+
this.images.dispose();
|
|
281
|
+
this.loadedSlots.clear();
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/renderer3d/decals/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import * as THREE from "three";
|
|
2
|
+
import type { GameHeightFog3D as GameHeightFogSettings3D, GameVector3 } from "@nodetool-ai/protocol";
|
|
3
|
+
/** Analytic segment integral. Using its lower endpoint avoids subtracting two large exponentials. */
|
|
4
|
+
export declare function heightFogOpacity3D(settings: GameHeightFogSettings3D, start: GameVector3, end: GameVector3): number;
|
|
5
|
+
/** Owns reversible shader hooks. Configure after particle material creation and before the scene pass. */
|
|
6
|
+
export declare class GameHeightFog3D {
|
|
7
|
+
private readonly materials;
|
|
8
|
+
private readonly uniforms;
|
|
9
|
+
configure(scene: THREE.Scene, camera: THREE.Camera, settings: GameHeightFogSettings3D | undefined): void;
|
|
10
|
+
private attach;
|
|
11
|
+
private restore;
|
|
12
|
+
dispose(): void;
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=height-fog.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"height-fog.d.ts","sourceRoot":"","sources":["../../../src/renderer3d/environment/height-fog.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,KAAK,EAAE,eAAe,IAAI,uBAAuB,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAGrG,qGAAqG;AACrG,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,uBAAuB,EAAE,KAAK,EAAE,WAAW,EAAE,GAAG,EAAE,WAAW,GAAG,MAAM,CAOlH;AAmCD,0GAA0G;AAC1G,qBAAa,eAAe;IAC1B,OAAO,CAAC,QAAQ,CAAC,SAAS,CAA6B;IACvD,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAOvB;IAEF,SAAS,CAAC,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,QAAQ,EAAE,uBAAuB,GAAG,SAAS,GAAG,IAAI,CAuBvG;IAED,OAAO,CAAC,MAAM;IAed,OAAO,CAAC,OAAO;IAKf,OAAO,IAAI,IAAI,CAEd;CACF"}
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
import * as THREE from "three";
|
|
2
|
+
import { removeGameMaterialHook, setGameMaterialHook } from "../material-hooks.js";
|
|
3
|
+
/** Analytic segment integral. Using its lower endpoint avoids subtracting two large exponentials. */
|
|
4
|
+
export function heightFogOpacity3D(settings, start, end) {
|
|
5
|
+
const distance = Math.hypot(end.x - start.x, end.y - start.y, end.z - start.z);
|
|
6
|
+
const heightDelta = settings.heightFalloff * Math.abs(end.y - start.y);
|
|
7
|
+
const average = heightDelta < 0.001 ? 1 - heightDelta / 2 + heightDelta * heightDelta / 6 : -Math.expm1(-heightDelta) / heightDelta;
|
|
8
|
+
const exponent = Math.max(-60, Math.min(60, -settings.heightFalloff * (Math.min(start.y, end.y) - settings.baseHeight)));
|
|
9
|
+
const opticalDepth = Math.min(80, settings.density * distance * Math.exp(exponent) * average);
|
|
10
|
+
return Math.min(settings.maxOpacity, -Math.expm1(-opticalDepth));
|
|
11
|
+
}
|
|
12
|
+
const VERTEX_DECLARATIONS = `
|
|
13
|
+
uniform mat4 gameHeightFogCameraWorld;
|
|
14
|
+
varying vec3 vGameHeightFogPosition;
|
|
15
|
+
`;
|
|
16
|
+
const FRAGMENT_DECLARATIONS = `
|
|
17
|
+
uniform vec3 gameHeightFogOrigin;
|
|
18
|
+
uniform vec3 gameHeightFogDirection;
|
|
19
|
+
uniform bool gameHeightFogOrthographic;
|
|
20
|
+
uniform float gameHeightFogDensity;
|
|
21
|
+
uniform float gameHeightFogBase;
|
|
22
|
+
uniform float gameHeightFogFalloff;
|
|
23
|
+
uniform float gameHeightFogMaxOpacity;
|
|
24
|
+
varying vec3 vGameHeightFogPosition;
|
|
25
|
+
`;
|
|
26
|
+
const FOG_FRAGMENT = `
|
|
27
|
+
#ifdef USE_FOG
|
|
28
|
+
vec3 gameFogStart = gameHeightFogOrigin;
|
|
29
|
+
if (gameHeightFogOrthographic) {
|
|
30
|
+
float gameFogDepth = max(0.0, dot(vGameHeightFogPosition - gameHeightFogOrigin, gameHeightFogDirection));
|
|
31
|
+
gameFogStart = vGameHeightFogPosition - gameHeightFogDirection * gameFogDepth;
|
|
32
|
+
}
|
|
33
|
+
float gameFogDistance = length(vGameHeightFogPosition - gameFogStart);
|
|
34
|
+
float gameFogDelta = gameHeightFogFalloff * abs(vGameHeightFogPosition.y - gameFogStart.y);
|
|
35
|
+
float gameFogAverage = gameFogDelta < 0.001
|
|
36
|
+
? 1.0 - 0.5 * gameFogDelta + gameFogDelta * gameFogDelta / 6.0
|
|
37
|
+
: (1.0 - exp(-min(60.0, gameFogDelta))) / gameFogDelta;
|
|
38
|
+
float gameFogExponent = clamp(-gameHeightFogFalloff * (min(gameFogStart.y, vGameHeightFogPosition.y) - gameHeightFogBase), -60.0, 60.0);
|
|
39
|
+
float gameFogOpticalDepth = min(80.0, gameHeightFogDensity * gameFogDistance * exp(gameFogExponent) * gameFogAverage);
|
|
40
|
+
float gameFogOpacity = min(gameHeightFogMaxOpacity, 1.0 - exp(-gameFogOpticalDepth));
|
|
41
|
+
gl_FragColor.rgb = mix(gl_FragColor.rgb, fogColor, gameFogOpacity);
|
|
42
|
+
#endif
|
|
43
|
+
`;
|
|
44
|
+
/** Owns reversible shader hooks. Configure after particle material creation and before the scene pass. */
|
|
45
|
+
export class GameHeightFog3D {
|
|
46
|
+
materials = new Set();
|
|
47
|
+
uniforms = {
|
|
48
|
+
gameHeightFogCameraWorld: { value: new THREE.Matrix4() },
|
|
49
|
+
gameHeightFogOrigin: { value: new THREE.Vector3() },
|
|
50
|
+
gameHeightFogDirection: { value: new THREE.Vector3() },
|
|
51
|
+
gameHeightFogOrthographic: { value: false },
|
|
52
|
+
gameHeightFogDensity: { value: 0 }, gameHeightFogBase: { value: 0 },
|
|
53
|
+
gameHeightFogFalloff: { value: 1 }, gameHeightFogMaxOpacity: { value: 1 }
|
|
54
|
+
};
|
|
55
|
+
configure(scene, camera, settings) {
|
|
56
|
+
if (!settings) {
|
|
57
|
+
this.dispose();
|
|
58
|
+
return;
|
|
59
|
+
}
|
|
60
|
+
this.uniforms.gameHeightFogCameraWorld.value.copy(camera.matrixWorld);
|
|
61
|
+
camera.getWorldPosition(this.uniforms.gameHeightFogOrigin.value);
|
|
62
|
+
camera.getWorldDirection(this.uniforms.gameHeightFogDirection.value);
|
|
63
|
+
this.uniforms.gameHeightFogOrthographic.value = camera instanceof THREE.OrthographicCamera;
|
|
64
|
+
this.uniforms.gameHeightFogDensity.value = settings.density;
|
|
65
|
+
this.uniforms.gameHeightFogBase.value = settings.baseHeight;
|
|
66
|
+
this.uniforms.gameHeightFogFalloff.value = settings.heightFalloff;
|
|
67
|
+
this.uniforms.gameHeightFogMaxOpacity.value = settings.maxOpacity;
|
|
68
|
+
const present = new Set();
|
|
69
|
+
scene.traverse((object) => {
|
|
70
|
+
if (!(object instanceof THREE.Mesh || object instanceof THREE.Points || object instanceof THREE.Line)) {
|
|
71
|
+
return;
|
|
72
|
+
}
|
|
73
|
+
const materials = Array.isArray(object.material) ? object.material : [object.material];
|
|
74
|
+
for (const material of materials) {
|
|
75
|
+
if (!("fog" in material) || material.fog !== true) {
|
|
76
|
+
continue;
|
|
77
|
+
}
|
|
78
|
+
present.add(material);
|
|
79
|
+
if (!this.materials.has(material)) {
|
|
80
|
+
this.attach(material);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
});
|
|
84
|
+
for (const material of this.materials) {
|
|
85
|
+
if (!present.has(material)) {
|
|
86
|
+
this.restore(material);
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
attach(material) {
|
|
91
|
+
this.materials.add(material);
|
|
92
|
+
setGameMaterialHook(material, "heightFog", (shader) => {
|
|
93
|
+
if (!shader.vertexShader.includes("#include <fog_vertex>") || !shader.vertexShader.includes("#include <fog_pars_vertex>")
|
|
94
|
+
|| !shader.fragmentShader.includes("#include <fog_fragment>") || !shader.fragmentShader.includes("#include <fog_pars_fragment>")) {
|
|
95
|
+
throw new Error("Height fog requires the game material fog shader hooks");
|
|
96
|
+
}
|
|
97
|
+
Object.assign(shader.uniforms, this.uniforms);
|
|
98
|
+
shader.vertexShader = shader.vertexShader.replace("#include <fog_pars_vertex>", `#include <fog_pars_vertex>${VERTEX_DECLARATIONS}`)
|
|
99
|
+
.replace("#include <fog_vertex>", "#include <fog_vertex>\nvGameHeightFogPosition = (gameHeightFogCameraWorld * mvPosition).xyz;");
|
|
100
|
+
shader.fragmentShader = shader.fragmentShader.replace("#include <fog_pars_fragment>", `#include <fog_pars_fragment>${FRAGMENT_DECLARATIONS}`)
|
|
101
|
+
.replace("#include <fog_fragment>", FOG_FRAGMENT);
|
|
102
|
+
}, ":nodetool-height-fog-1");
|
|
103
|
+
}
|
|
104
|
+
restore(material) {
|
|
105
|
+
removeGameMaterialHook(material, "heightFog");
|
|
106
|
+
this.materials.delete(material);
|
|
107
|
+
}
|
|
108
|
+
dispose() {
|
|
109
|
+
for (const material of this.materials) {
|
|
110
|
+
this.restore(material);
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
//# sourceMappingURL=height-fog.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"height-fog.js","sourceRoot":"","sources":["../../../src/renderer3d/environment/height-fog.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/renderer3d/environment/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAC/D,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,OAAO,EAAE,KAAK,CAAC,YAAY,EAAE,QAAQ,EAAE,KAAK,CAAC,aAAa,EAAE,WAAW,EAAE,iBAAiB,CAAC,aAAa,CAAC,GAAG,IAAI,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/renderer3d/environment/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAC/D,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,OAAO,EAAE,KAAK,CAAC,YAAY,EAAE,QAAQ,EAAE,KAAK,CAAC,aAAa,EAAE,WAAW,EAAE,iBAAiB,CAAC,aAAa,CAAC,GAAG,IAAI,CAS5K"}
|
|
@@ -1,9 +1,12 @@
|
|
|
1
1
|
import * as THREE from "three";
|
|
2
2
|
export function configureGameEnvironment(scene, ambient, renderer, environment) {
|
|
3
3
|
scene.background = new THREE.Color(environment.background);
|
|
4
|
+
scene.backgroundIntensity = 1;
|
|
5
|
+
scene.backgroundRotation.set(0, 0, 0);
|
|
4
6
|
ambient.color.set(environment.ambient.color);
|
|
5
7
|
ambient.intensity = environment.ambient.intensity;
|
|
6
|
-
|
|
8
|
+
const fog = environment.fog;
|
|
9
|
+
scene.fog = !fog ? null : "kind" in fog ? new THREE.FogExp2(fog.color, 0) : new THREE.Fog(fog.color, fog.near, fog.far);
|
|
7
10
|
renderer.shadowMap.enabled = environment.shadows.enabled;
|
|
8
11
|
}
|
|
9
12
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/renderer3d/environment/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAE/B,MAAM,UAAU,wBAAwB,CAAC,KAAkB,EAAE,OAA2B,EAAE,QAA6B,EAAE,WAA6C;IAClK,KAAK,CAAC,UAAU,GAAG,IAAI,KAAK,CAAC,KAAK,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC;IAC3D,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,WAAW,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IAC7C,OAAO,CAAC,SAAS,GAAG,WAAW,CAAC,OAAO,CAAC,SAAS,CAAC;IAClD,KAAK,CAAC,GAAG,GAAG,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/renderer3d/environment/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAE/B,MAAM,UAAU,wBAAwB,CAAC,KAAkB,EAAE,OAA2B,EAAE,QAA6B,EAAE,WAA6C;IAClK,KAAK,CAAC,UAAU,GAAG,IAAI,KAAK,CAAC,KAAK,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC;IAC3D,KAAK,CAAC,mBAAmB,GAAG,CAAC,CAAC;IAC9B,KAAK,CAAC,kBAAkB,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IACtC,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,WAAW,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IAC7C,OAAO,CAAC,SAAS,GAAG,WAAW,CAAC,OAAO,CAAC,SAAS,CAAC;IAClD,MAAM,GAAG,GAAG,WAAW,CAAC,GAAG,CAAC;IAC5B,KAAK,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,IAAI,GAAG,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC;IACxH,QAAQ,CAAC,SAAS,CAAC,OAAO,GAAG,WAAW,CAAC,OAAO,CAAC,OAAO,CAAC;AAC7D,CAAC"}
|
|
@@ -30,6 +30,7 @@ export declare class GameSkyRenderer3D {
|
|
|
30
30
|
reset(): void;
|
|
31
31
|
dispose(): void;
|
|
32
32
|
private generator;
|
|
33
|
+
private detach;
|
|
33
34
|
private clear;
|
|
34
35
|
private applyProcedural;
|
|
35
36
|
/** Renders the sky into the retained cube and PMREM targets, allocating them only on first use. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sky.d.ts","sourceRoot":"","sources":["../../../src/renderer3d/environment/sky.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAE/B,OAAO,KAAK,EAAE,iBAAiB,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAC1E,OAAO,KAAK,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AAEvF,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,KAAK,OAAO,CAAC,kBAAkB,GAAG,IAAI,CAAC,CAAC;IACtG,QAAQ,CAAC,UAAU,CAAC,EAAE,gBAAgB,CAAC;CACxC;AAED,KAAK,eAAe,GAAG,OAAO,CAAC,SAAS,EAAE;IAAE,IAAI,EAAE,YAAY,CAAA;CAAE,CAAC,CAAC;AAMlE,yGAAyG;AACzG,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,eAAe,EAAE,KAAK,EAAE,IAAI,CAAC,iBAAiB,EAAE,QAAQ,CAAC,GAAG,KAAK,CAAC,OAAO,CAInH;AAQD,2GAA2G;AAC3G,qBAAa,iBAAiB;
|
|
1
|
+
{"version":3,"file":"sky.d.ts","sourceRoot":"","sources":["../../../src/renderer3d/environment/sky.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAE/B,OAAO,KAAK,EAAE,iBAAiB,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAC1E,OAAO,KAAK,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AAEvF,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,KAAK,OAAO,CAAC,kBAAkB,GAAG,IAAI,CAAC,CAAC;IACtG,QAAQ,CAAC,UAAU,CAAC,EAAE,gBAAgB,CAAC;CACxC;AAED,KAAK,eAAe,GAAG,OAAO,CAAC,SAAS,EAAE;IAAE,IAAI,EAAE,YAAY,CAAA;CAAE,CAAC,CAAC;AAMlE,yGAAyG;AACzG,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,eAAe,EAAE,KAAK,EAAE,IAAI,CAAC,iBAAiB,EAAE,QAAQ,CAAC,GAAG,KAAK,CAAC,OAAO,CAInH;AAQD,2GAA2G;AAC3G,qBAAa,iBAAiB;IAShB,OAAO,CAAC,QAAQ,CAAC,QAAQ;IAAuB,OAAO,CAAC,QAAQ,CAAC,OAAO;IAClF,OAAO,CAAC,QAAQ,CAAC,MAAM;IAAe,OAAO,CAAC,QAAQ,CAAC,WAAW;IATpE,OAAO,CAAC,OAAO,CACqC;IACpD,OAAO,CAAC,KAAK,CAAmC;IAChD,OAAO,CAAC,UAAU,CAA4J;IAC9K,OAAO,CAAC,eAAe,CAA6I;IACpK,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAiD;IACvE,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAqB;IAE9C,YAA6B,QAAQ,EAAE,KAAK,CAAC,aAAa,EAAmB,OAAO,EAAE,gBAAgB,EACnF,MAAM,EAAE,WAAW,EAAmB,WAAW,EAAE,MAAM,EAAE,EAAI;IAE5E,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,KAAK,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC,CAgBvE;IAED,qEAAqE;IAC/D,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAM5C;IAED,2GAA2G;IAC3G,KAAK,IAAI,IAAI,CAOZ;IAED,OAAO,IAAI,IAAI,CASd;IAED,OAAO,CAAC,SAAS;IAKjB,OAAO,CAAC,MAAM;IAiBd,OAAO,CAAC,KAAK;IAKb,OAAO,CAAC,eAAe;IAevB,mGAAmG;IACnG,OAAO,CAAC,gBAAgB;IA8BxB,OAAO,CAAC,SAAS;IAWjB,OAAO,CAAC,QAAQ;YAaF,UAAU;IAoBxB,OAAO,CAAC,MAAM;IAMd,OAAO,CAAC,iBAAiB;IAQzB,OAAO,CAAC,WAAW;CAKpB"}
|
|
@@ -29,6 +29,9 @@ export class GameSkyRenderer3D {
|
|
|
29
29
|
this.diagnostics = diagnostics;
|
|
30
30
|
}
|
|
31
31
|
async apply(scene, frame) {
|
|
32
|
+
if (this.applied && this.applied.scene !== scene) {
|
|
33
|
+
this.detach();
|
|
34
|
+
}
|
|
32
35
|
const sky = frame.environment.sky;
|
|
33
36
|
if (sky?.kind === "procedural") {
|
|
34
37
|
this.applyProcedural(scene, sky, frame);
|
|
@@ -48,7 +51,7 @@ export class GameSkyRenderer3D {
|
|
|
48
51
|
return;
|
|
49
52
|
}
|
|
50
53
|
}
|
|
51
|
-
this.clear(
|
|
54
|
+
this.clear();
|
|
52
55
|
}
|
|
53
56
|
/** Drops a cached HDRI so the next frame resolves the slot again. */
|
|
54
57
|
async invalidate(slot) {
|
|
@@ -59,12 +62,10 @@ export class GameSkyRenderer3D {
|
|
|
59
62
|
if (loaded) {
|
|
60
63
|
this.releaseHdri(loaded);
|
|
61
64
|
}
|
|
62
|
-
if (this.applied?.startsWith(`hdri:${slot}:`)) {
|
|
63
|
-
this.applied = undefined;
|
|
64
|
-
}
|
|
65
65
|
}
|
|
66
66
|
/** Regenerates GPU-built maps after a context restore. Decoded HDRI pixels are uploaded again by three. */
|
|
67
67
|
reset() {
|
|
68
|
+
this.detach();
|
|
68
69
|
this.releaseProcedural();
|
|
69
70
|
for (const pending of this.hdris.values()) {
|
|
70
71
|
void pending.then((loaded) => { if (loaded) {
|
|
@@ -74,7 +75,6 @@ export class GameSkyRenderer3D {
|
|
|
74
75
|
this.hdris.clear();
|
|
75
76
|
this.pmrem?.dispose();
|
|
76
77
|
this.pmrem = undefined;
|
|
77
|
-
this.applied = undefined;
|
|
78
78
|
}
|
|
79
79
|
dispose() {
|
|
80
80
|
this.reset();
|
|
@@ -90,18 +90,28 @@ export class GameSkyRenderer3D {
|
|
|
90
90
|
this.pmrem ??= new THREE.PMREMGenerator(this.renderer);
|
|
91
91
|
return this.pmrem;
|
|
92
92
|
}
|
|
93
|
-
|
|
94
|
-
|
|
93
|
+
detach() {
|
|
94
|
+
const applied = this.applied;
|
|
95
|
+
if (!applied) {
|
|
95
96
|
return;
|
|
96
97
|
}
|
|
97
|
-
scene
|
|
98
|
-
scene.
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
98
|
+
const { scene, background, environment } = applied;
|
|
99
|
+
if (scene.environment === environment) {
|
|
100
|
+
scene.environment = null;
|
|
101
|
+
scene.environmentIntensity = 1;
|
|
102
|
+
scene.environmentRotation.set(0, 0, 0);
|
|
103
|
+
}
|
|
104
|
+
if (scene.background === background) {
|
|
105
|
+
scene.background = null;
|
|
106
|
+
scene.backgroundIntensity = 1;
|
|
107
|
+
scene.backgroundRotation.set(0, 0, 0);
|
|
108
|
+
}
|
|
103
109
|
this.applied = undefined;
|
|
104
110
|
}
|
|
111
|
+
clear() {
|
|
112
|
+
this.detach();
|
|
113
|
+
this.releaseProcedural();
|
|
114
|
+
}
|
|
105
115
|
applyProcedural(scene, sky, frame) {
|
|
106
116
|
const sun = gameSkySunDirection3D(sky, frame);
|
|
107
117
|
const key = JSON.stringify([sky.turbidity, sky.rayleigh, sky.groundColor, sun.x, sun.y, sun.z]);
|
|
@@ -118,7 +128,7 @@ export class GameSkyRenderer3D {
|
|
|
118
128
|
scene.backgroundIntensity = sky.intensity;
|
|
119
129
|
scene.environmentRotation.set(0, 0, 0);
|
|
120
130
|
scene.backgroundRotation.set(0, 0, 0);
|
|
121
|
-
this.applied = "procedural";
|
|
131
|
+
this.applied = { key: "procedural", scene, background: cube.texture, environment: environment.texture };
|
|
122
132
|
}
|
|
123
133
|
/** Renders the sky into the retained cube and PMREM targets, allocating them only on first use. */
|
|
124
134
|
renderProcedural(key, sky, sun) {
|
|
@@ -154,7 +164,7 @@ export class GameSkyRenderer3D {
|
|
|
154
164
|
this.procedural = { key, cube, camera, environment };
|
|
155
165
|
}
|
|
156
166
|
applyHdri(scene, sky, loaded) {
|
|
157
|
-
if (this.applied !== `hdri:${sky.assetId}:${loaded.digest}`) {
|
|
167
|
+
if (this.applied?.key !== `hdri:${sky.assetId}:${loaded.digest}`) {
|
|
158
168
|
this.releaseProcedural();
|
|
159
169
|
}
|
|
160
170
|
scene.background = loaded.texture;
|
|
@@ -163,7 +173,7 @@ export class GameSkyRenderer3D {
|
|
|
163
173
|
scene.backgroundIntensity = sky.intensity;
|
|
164
174
|
scene.environmentRotation.set(0, sky.rotation, 0);
|
|
165
175
|
scene.backgroundRotation.set(0, sky.rotation, 0);
|
|
166
|
-
this.applied = `hdri:${sky.assetId}:${loaded.digest}
|
|
176
|
+
this.applied = { key: `hdri:${sky.assetId}:${loaded.digest}`, scene, background: loaded.texture, environment: loaded.environment.texture };
|
|
167
177
|
}
|
|
168
178
|
loadHdri(sky) {
|
|
169
179
|
let pending = this.hdris.get(sky.assetId);
|
|
@@ -209,11 +219,18 @@ export class GameSkyRenderer3D {
|
|
|
209
219
|
this.diagnostics.push(message);
|
|
210
220
|
}
|
|
211
221
|
releaseProcedural() {
|
|
222
|
+
if (this.procedural && (this.applied?.background === this.procedural.cube.texture
|
|
223
|
+
|| this.applied?.environment === this.procedural.environment.texture)) {
|
|
224
|
+
this.detach();
|
|
225
|
+
}
|
|
212
226
|
this.procedural?.cube.dispose();
|
|
213
227
|
this.procedural?.environment.dispose();
|
|
214
228
|
this.procedural = undefined;
|
|
215
229
|
}
|
|
216
230
|
releaseHdri(loaded) {
|
|
231
|
+
if (this.applied?.background === loaded.texture || this.applied?.environment === loaded.environment.texture) {
|
|
232
|
+
this.detach();
|
|
233
|
+
}
|
|
217
234
|
loaded.texture.dispose();
|
|
218
235
|
loaded.environment.dispose();
|
|
219
236
|
}
|