minecraft-renderer 0.1.0
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 +297 -0
- package/dist/index.html +83 -0
- package/dist/static/image/arrow.6f27b59f.png +0 -0
- package/dist/static/image/blocksAtlasLatest.7850afa3.png +0 -0
- package/dist/static/image/blocksAtlasLegacy.5c76823d.png +0 -0
- package/dist/static/image/itemsAtlasLatest.36036f95.png +0 -0
- package/dist/static/image/itemsAtlasLegacy.dcb1b58d.png +0 -0
- package/dist/static/image/tipped_arrow.6f27b59f.png +0 -0
- package/dist/static/js/365.f05233ab.js +8462 -0
- package/dist/static/js/365.f05233ab.js.LICENSE.txt +52 -0
- package/dist/static/js/async/738.efa27644.js +1 -0
- package/dist/static/js/index.092ec5be.js +56 -0
- package/dist/static/js/lib-polyfill.98986ac5.js +1 -0
- package/dist/static/js/lib-react.5c9129e0.js +2 -0
- package/dist/static/js/lib-react.5c9129e0.js.LICENSE.txt +39 -0
- package/package.json +104 -0
- package/src/assets/destroy_stage_0.png +0 -0
- package/src/assets/destroy_stage_1.png +0 -0
- package/src/assets/destroy_stage_2.png +0 -0
- package/src/assets/destroy_stage_3.png +0 -0
- package/src/assets/destroy_stage_4.png +0 -0
- package/src/assets/destroy_stage_5.png +0 -0
- package/src/assets/destroy_stage_6.png +0 -0
- package/src/assets/destroy_stage_7.png +0 -0
- package/src/assets/destroy_stage_8.png +0 -0
- package/src/assets/destroy_stage_9.png +0 -0
- package/src/examples/README.md +146 -0
- package/src/examples/appViewerExample.ts +205 -0
- package/src/examples/initialMenuStart.ts +161 -0
- package/src/graphicsBackend/appViewer.ts +297 -0
- package/src/graphicsBackend/config.ts +119 -0
- package/src/graphicsBackend/index.ts +10 -0
- package/src/graphicsBackend/playerState.ts +61 -0
- package/src/graphicsBackend/types.ts +143 -0
- package/src/index.ts +97 -0
- package/src/lib/DebugGui.ts +190 -0
- package/src/lib/animationController.ts +85 -0
- package/src/lib/buildSharedConfig.mjs +1 -0
- package/src/lib/cameraBobbing.ts +94 -0
- package/src/lib/canvas2DOverlay.example.ts +361 -0
- package/src/lib/canvas2DOverlay.quickstart.ts +242 -0
- package/src/lib/canvas2DOverlay.ts +381 -0
- package/src/lib/cleanupDecorator.ts +29 -0
- package/src/lib/createPlayerObject.ts +55 -0
- package/src/lib/frameTimingCollector.ts +164 -0
- package/src/lib/guiRenderer.ts +283 -0
- package/src/lib/items.ts +140 -0
- package/src/lib/mesherlogReader.ts +131 -0
- package/src/lib/moreBlockDataGenerated.json +714 -0
- package/src/lib/preflatMap.json +1741 -0
- package/src/lib/simpleUtils.ts +40 -0
- package/src/lib/smoothSwitcher.ts +168 -0
- package/src/lib/spiral.ts +29 -0
- package/src/lib/ui/newStats.ts +120 -0
- package/src/lib/utils/proxy.ts +23 -0
- package/src/lib/utils/skins.ts +63 -0
- package/src/lib/utils.ts +76 -0
- package/src/lib/workerProxy.ts +342 -0
- package/src/lib/worldrendererCommon.ts +1088 -0
- package/src/mesher/mesher.ts +253 -0
- package/src/mesher/models.ts +769 -0
- package/src/mesher/modelsGeometryCommon.ts +142 -0
- package/src/mesher/shared.ts +80 -0
- package/src/mesher/standaloneRenderer.ts +270 -0
- package/src/mesher/test/a.ts +3 -0
- package/src/mesher/test/mesherTester.ts +76 -0
- package/src/mesher/test/playground.ts +19 -0
- package/src/mesher/test/test-perf.ts +74 -0
- package/src/mesher/test/tests.test.ts +56 -0
- package/src/mesher/world.ts +294 -0
- package/src/mesher/worldConstants.ts +1 -0
- package/src/modules/index.ts +11 -0
- package/src/modules/starfield.ts +313 -0
- package/src/modules/types.ts +110 -0
- package/src/playerState/playerState.ts +78 -0
- package/src/playerState/types.ts +36 -0
- package/src/playground/allEntitiesDebug.ts +170 -0
- package/src/playground/baseScene.ts +587 -0
- package/src/playground/mobileControls.tsx +268 -0
- package/src/playground/playground.html +83 -0
- package/src/playground/playground.ts +11 -0
- package/src/playground/playgroundUi.tsx +140 -0
- package/src/playground/reactUtils.ts +71 -0
- package/src/playground/scenes/allEntities.ts +13 -0
- package/src/playground/scenes/entities.ts +37 -0
- package/src/playground/scenes/floorRandom.ts +33 -0
- package/src/playground/scenes/frequentUpdates.ts +148 -0
- package/src/playground/scenes/geometryExport.ts +142 -0
- package/src/playground/scenes/index.ts +12 -0
- package/src/playground/scenes/lightingStarfield.ts +40 -0
- package/src/playground/scenes/main.ts +313 -0
- package/src/playground/scenes/railsCobweb.ts +14 -0
- package/src/playground/scenes/rotationIssue.ts +7 -0
- package/src/playground/scenes/slabsOptimization.ts +16 -0
- package/src/playground/scenes/transparencyIssue.ts +11 -0
- package/src/playground/shared.ts +79 -0
- package/src/resourcesManager/index.ts +5 -0
- package/src/resourcesManager/resourcesManager.ts +314 -0
- package/src/shims/minecraftData.ts +41 -0
- package/src/sign-renderer/index.html +21 -0
- package/src/sign-renderer/index.ts +216 -0
- package/src/sign-renderer/noop.js +1 -0
- package/src/sign-renderer/playground.ts +38 -0
- package/src/sign-renderer/tests.test.ts +69 -0
- package/src/sign-renderer/vite.config.ts +10 -0
- package/src/three/appShared.ts +75 -0
- package/src/three/bannerRenderer.ts +275 -0
- package/src/three/cameraShake.ts +120 -0
- package/src/three/cinimaticScript.ts +350 -0
- package/src/three/documentRenderer.ts +491 -0
- package/src/three/entities.ts +1580 -0
- package/src/three/entity/EntityMesh.ts +707 -0
- package/src/three/entity/animations.js +171 -0
- package/src/three/entity/armorModels.json +204 -0
- package/src/three/entity/armorModels.ts +36 -0
- package/src/three/entity/entities.json +6230 -0
- package/src/three/entity/exportedModels.js +38 -0
- package/src/three/entity/externalTextures.json +1 -0
- package/src/three/entity/models/allay.obj +325 -0
- package/src/three/entity/models/arrow.obj +60 -0
- package/src/three/entity/models/axolotl.obj +509 -0
- package/src/three/entity/models/blaze.obj +601 -0
- package/src/three/entity/models/boat.obj +417 -0
- package/src/three/entity/models/camel.obj +1061 -0
- package/src/three/entity/models/cat.obj +509 -0
- package/src/three/entity/models/chicken.obj +371 -0
- package/src/three/entity/models/cod.obj +371 -0
- package/src/three/entity/models/creeper.obj +279 -0
- package/src/three/entity/models/dolphin.obj +371 -0
- package/src/three/entity/models/ender_dragon.obj +2993 -0
- package/src/three/entity/models/enderman.obj +325 -0
- package/src/three/entity/models/endermite.obj +187 -0
- package/src/three/entity/models/fox.obj +463 -0
- package/src/three/entity/models/frog.obj +739 -0
- package/src/three/entity/models/ghast.obj +463 -0
- package/src/three/entity/models/goat.obj +601 -0
- package/src/three/entity/models/guardian.obj +1015 -0
- package/src/three/entity/models/horse.obj +1061 -0
- package/src/three/entity/models/llama.obj +509 -0
- package/src/three/entity/models/minecart.obj +233 -0
- package/src/three/entity/models/parrot.obj +509 -0
- package/src/three/entity/models/piglin.obj +739 -0
- package/src/three/entity/models/pillager.obj +371 -0
- package/src/three/entity/models/rabbit.obj +555 -0
- package/src/three/entity/models/sheep.obj +555 -0
- package/src/three/entity/models/shulker.obj +141 -0
- package/src/three/entity/models/sniffer.obj +693 -0
- package/src/three/entity/models/spider.obj +509 -0
- package/src/three/entity/models/tadpole.obj +95 -0
- package/src/three/entity/models/turtle.obj +371 -0
- package/src/three/entity/models/vex.obj +325 -0
- package/src/three/entity/models/villager.obj +509 -0
- package/src/three/entity/models/warden.obj +463 -0
- package/src/three/entity/models/witch.obj +647 -0
- package/src/three/entity/models/wolf.obj +509 -0
- package/src/three/entity/models/zombie_villager.obj +463 -0
- package/src/three/entity/objModels.js +1 -0
- package/src/three/fireworks.ts +661 -0
- package/src/three/fireworksRenderer.ts +434 -0
- package/src/three/globals.d.ts +7 -0
- package/src/three/graphicsBackend.ts +274 -0
- package/src/three/graphicsBackendOffThread.ts +107 -0
- package/src/three/hand.ts +89 -0
- package/src/three/holdingBlock.ts +926 -0
- package/src/three/index.ts +20 -0
- package/src/three/itemMesh.ts +427 -0
- package/src/three/modules.d.ts +14 -0
- package/src/three/panorama.ts +308 -0
- package/src/three/panoramaShared.ts +1 -0
- package/src/three/renderSlot.ts +82 -0
- package/src/three/skyboxRenderer.ts +406 -0
- package/src/three/starField.ts +13 -0
- package/src/three/threeJsMedia.ts +731 -0
- package/src/three/threeJsMethods.ts +15 -0
- package/src/three/threeJsParticles.ts +160 -0
- package/src/three/threeJsSound.ts +95 -0
- package/src/three/threeJsUtils.ts +90 -0
- package/src/three/waypointSprite.ts +435 -0
- package/src/three/waypoints.ts +163 -0
- package/src/three/world/cursorBlock.ts +172 -0
- package/src/three/world/vr.ts +257 -0
- package/src/three/worldGeometryExport.ts +259 -0
- package/src/three/worldGeometryHandler.ts +279 -0
- package/src/three/worldRendererThree.ts +1381 -0
- package/src/worldView/index.ts +6 -0
- package/src/worldView/types.ts +66 -0
- package/src/worldView/worldView.ts +424 -0
|
@@ -0,0 +1,279 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* WorldGeometryHandler - Manages world block geometry for Three.js renderer.
|
|
3
|
+
*
|
|
4
|
+
* Responsibilities:
|
|
5
|
+
* - Processing geometry data from mesher workers
|
|
6
|
+
* - Creating and managing THREE.js section objects (chunks)
|
|
7
|
+
* - Handling signs, banners, and player heads rendering
|
|
8
|
+
* - Memory tracking for geometry buffers
|
|
9
|
+
* - GPU upload and CPU array disposal for RAM optimization
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
import * as THREE from 'three'
|
|
13
|
+
import { Vec3 } from 'vec3'
|
|
14
|
+
import type { MesherGeometryOutput, WorldRendererConfig } from '../types'
|
|
15
|
+
|
|
16
|
+
export interface WorldGeometryHandlerOptions {
|
|
17
|
+
material: THREE.MeshLambertMaterial
|
|
18
|
+
scene: THREE.Scene
|
|
19
|
+
worldRendererConfig: WorldRendererConfig
|
|
20
|
+
version: string
|
|
21
|
+
worldSizeParams: { minY: number; worldHeight: number }
|
|
22
|
+
blockEntities: Record<string, any>
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
export interface SectionObject extends THREE.Object3D {
|
|
26
|
+
foutain?: boolean
|
|
27
|
+
tilesCount?: number
|
|
28
|
+
blocksCount?: number
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* Estimates GPU buffer memory usage for a BufferGeometry.
|
|
33
|
+
*/
|
|
34
|
+
export function estimateGeometryMemoryUsage(geometry: THREE.BufferGeometry): number {
|
|
35
|
+
let memoryBytes = 0
|
|
36
|
+
|
|
37
|
+
const { attributes } = geometry
|
|
38
|
+
for (const [name, attribute] of Object.entries(attributes)) {
|
|
39
|
+
if (attribute?.array) {
|
|
40
|
+
const bytesPerElement = attribute.array.BYTES_PER_ELEMENT
|
|
41
|
+
memoryBytes += attribute.array.length * bytesPerElement
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
if (geometry.index?.array) {
|
|
46
|
+
const bytesPerElement = geometry.index.array.BYTES_PER_ELEMENT
|
|
47
|
+
memoryBytes += geometry.index.array.length * bytesPerElement
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
return memoryBytes
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
* Disposes all child objects recursively.
|
|
55
|
+
*/
|
|
56
|
+
export function disposeObject(object: THREE.Object3D): void {
|
|
57
|
+
object.traverse((child) => {
|
|
58
|
+
if (child instanceof THREE.Mesh) {
|
|
59
|
+
child.geometry?.dispose()
|
|
60
|
+
if (Array.isArray(child.material)) {
|
|
61
|
+
for (const material of child.material) {
|
|
62
|
+
material.dispose()
|
|
63
|
+
}
|
|
64
|
+
} else {
|
|
65
|
+
child.material?.dispose()
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
})
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
/**
|
|
72
|
+
* WorldGeometryHandler - Manages all world geometry in the Three.js scene.
|
|
73
|
+
*/
|
|
74
|
+
export class WorldGeometryHandler {
|
|
75
|
+
sectionObjects: Record<string, SectionObject> = {}
|
|
76
|
+
private estimatedMemoryUsage = 0
|
|
77
|
+
|
|
78
|
+
constructor(private options: WorldGeometryHandlerOptions) {}
|
|
79
|
+
|
|
80
|
+
/**
|
|
81
|
+
* Get total estimated memory usage in bytes.
|
|
82
|
+
*/
|
|
83
|
+
get memoryUsage(): number {
|
|
84
|
+
return this.estimatedMemoryUsage
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
/**
|
|
88
|
+
* Get memory usage in human-readable format.
|
|
89
|
+
*/
|
|
90
|
+
getMemoryUsageReadable(): { bytes: number; readable: string } {
|
|
91
|
+
const bytes = this.estimatedMemoryUsage
|
|
92
|
+
const mb = bytes / (1024 * 1024)
|
|
93
|
+
return { bytes, readable: `${mb.toFixed(2)} MB` }
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
/**
|
|
97
|
+
* Process geometry data from mesher worker and create section mesh.
|
|
98
|
+
*/
|
|
99
|
+
handleGeometry(data: { geometry: MesherGeometryOutput; key: string }): SectionObject | null {
|
|
100
|
+
const { geometry, key } = data
|
|
101
|
+
const { material, scene, worldRendererConfig } = this.options
|
|
102
|
+
|
|
103
|
+
// Remove existing section if present
|
|
104
|
+
const existingObject = this.sectionObjects[key]
|
|
105
|
+
if (existingObject) {
|
|
106
|
+
this.removeSectionMemoryUsage(existingObject)
|
|
107
|
+
scene.remove(existingObject)
|
|
108
|
+
disposeObject(existingObject)
|
|
109
|
+
delete this.sectionObjects[key]
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
// Don't create empty sections
|
|
113
|
+
if (!geometry.positions.length) {
|
|
114
|
+
return null
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
// Create buffer geometry
|
|
118
|
+
const bufferGeometry = new THREE.BufferGeometry()
|
|
119
|
+
const positionAttr = new THREE.BufferAttribute(geometry.positions, 3)
|
|
120
|
+
const normalAttr = new THREE.BufferAttribute(geometry.normals, 3)
|
|
121
|
+
const colorAttr = new THREE.BufferAttribute(geometry.colors, 3)
|
|
122
|
+
const uvAttr = new THREE.BufferAttribute(geometry.uvs, 2)
|
|
123
|
+
const indexAttr = new THREE.BufferAttribute(geometry.indices, 1)
|
|
124
|
+
|
|
125
|
+
bufferGeometry.setAttribute('position', positionAttr)
|
|
126
|
+
bufferGeometry.setAttribute('normal', normalAttr)
|
|
127
|
+
bufferGeometry.setAttribute('color', colorAttr)
|
|
128
|
+
bufferGeometry.setAttribute('uv', uvAttr)
|
|
129
|
+
bufferGeometry.index = indexAttr
|
|
130
|
+
|
|
131
|
+
// Track memory before disposing CPU arrays
|
|
132
|
+
this.addSectionMemoryUsage(bufferGeometry)
|
|
133
|
+
|
|
134
|
+
// Setup GPU upload callbacks to dispose CPU arrays
|
|
135
|
+
this.setupGpuUploadCallbacks(bufferGeometry)
|
|
136
|
+
|
|
137
|
+
// Create mesh
|
|
138
|
+
const mesh = new THREE.Mesh(bufferGeometry, material)
|
|
139
|
+
mesh.position.set(geometry.sx, geometry.sy, geometry.sz)
|
|
140
|
+
mesh.name = 'mesh'
|
|
141
|
+
|
|
142
|
+
// Create section group
|
|
143
|
+
const sectionObject: SectionObject = new THREE.Group()
|
|
144
|
+
sectionObject.add(mesh)
|
|
145
|
+
|
|
146
|
+
// Add debug chunk border helper
|
|
147
|
+
const staticChunkMesh = new THREE.Mesh(
|
|
148
|
+
new THREE.BoxGeometry(16, 16, 16),
|
|
149
|
+
new THREE.MeshBasicMaterial({ color: 0x000000, transparent: true, opacity: 0 })
|
|
150
|
+
)
|
|
151
|
+
staticChunkMesh.position.set(geometry.sx, geometry.sy, geometry.sz)
|
|
152
|
+
const boxHelper = new THREE.BoxHelper(staticChunkMesh, 0xffff00)
|
|
153
|
+
boxHelper.name = 'helper'
|
|
154
|
+
boxHelper.visible = worldRendererConfig.showChunkBorders
|
|
155
|
+
sectionObject.add(boxHelper)
|
|
156
|
+
|
|
157
|
+
sectionObject.name = 'chunk'
|
|
158
|
+
sectionObject.tilesCount = geometry.positions.length / 3 / 4
|
|
159
|
+
sectionObject.blocksCount = geometry.blocksCount
|
|
160
|
+
sectionObject.matrixAutoUpdate = false
|
|
161
|
+
|
|
162
|
+
this.sectionObjects[key] = sectionObject
|
|
163
|
+
scene.add(sectionObject)
|
|
164
|
+
|
|
165
|
+
return sectionObject
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
/**
|
|
169
|
+
* Remove a section from the scene.
|
|
170
|
+
*/
|
|
171
|
+
removeSection(key: string): void {
|
|
172
|
+
const object = this.sectionObjects[key]
|
|
173
|
+
if (object) {
|
|
174
|
+
this.removeSectionMemoryUsage(object)
|
|
175
|
+
this.options.scene.remove(object)
|
|
176
|
+
disposeObject(object)
|
|
177
|
+
delete this.sectionObjects[key]
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
/**
|
|
182
|
+
* Remove all sections from the scene.
|
|
183
|
+
*/
|
|
184
|
+
clear(): void {
|
|
185
|
+
for (const key of Object.keys(this.sectionObjects)) {
|
|
186
|
+
this.removeSection(key)
|
|
187
|
+
}
|
|
188
|
+
this.estimatedMemoryUsage = 0
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
/**
|
|
192
|
+
* Update chunk border visibility for all sections.
|
|
193
|
+
*/
|
|
194
|
+
updateChunkBorderVisibility(visible: boolean): void {
|
|
195
|
+
for (const object of Object.values(this.sectionObjects)) {
|
|
196
|
+
for (const child of object.children) {
|
|
197
|
+
if (child.name === 'helper') {
|
|
198
|
+
child.visible = visible
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
/**
|
|
205
|
+
* Get total tiles rendered across all sections.
|
|
206
|
+
*/
|
|
207
|
+
getTilesRendered(): number {
|
|
208
|
+
return Object.values(this.sectionObjects).reduce(
|
|
209
|
+
(acc, obj) => acc + (obj.tilesCount || 0),
|
|
210
|
+
0
|
|
211
|
+
)
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
/**
|
|
215
|
+
* Get total blocks rendered across all sections.
|
|
216
|
+
*/
|
|
217
|
+
getBlocksRendered(): number {
|
|
218
|
+
return Object.values(this.sectionObjects).reduce(
|
|
219
|
+
(acc, obj) => acc + (obj.blocksCount || 0),
|
|
220
|
+
0
|
|
221
|
+
)
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
/**
|
|
225
|
+
* Setup callbacks to dispose CPU arrays after GPU upload.
|
|
226
|
+
*/
|
|
227
|
+
private setupGpuUploadCallbacks(geometry: THREE.BufferGeometry): void {
|
|
228
|
+
const { attributes } = geometry
|
|
229
|
+
for (const attributeName of Object.keys(attributes)) {
|
|
230
|
+
const attribute = attributes[attributeName]
|
|
231
|
+
if (attribute instanceof THREE.InterleavedBufferAttribute) continue
|
|
232
|
+
|
|
233
|
+
const existingCallback = attribute.onUploadCallback
|
|
234
|
+
attribute.onUploadCallback = () => {
|
|
235
|
+
existingCallback?.()
|
|
236
|
+
this.disposeCpuArray(attribute)
|
|
237
|
+
}
|
|
238
|
+
attribute.needsUpdate = true
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
if (geometry.index) {
|
|
242
|
+
const existingCallback = geometry.index.onUploadCallback
|
|
243
|
+
geometry.index.onUploadCallback = () => {
|
|
244
|
+
existingCallback?.()
|
|
245
|
+
this.disposeCpuArray(geometry.index!)
|
|
246
|
+
}
|
|
247
|
+
geometry.index.needsUpdate = true
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
/**
|
|
252
|
+
* Dispose CPU array data from buffer attribute.
|
|
253
|
+
*/
|
|
254
|
+
private disposeCpuArray(attribute: THREE.BufferAttribute): void {
|
|
255
|
+
if (attribute.array) {
|
|
256
|
+
;(attribute as any).array = null
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
/**
|
|
261
|
+
* Track memory usage when section is added.
|
|
262
|
+
*/
|
|
263
|
+
private addSectionMemoryUsage(geometry: THREE.BufferGeometry): void {
|
|
264
|
+
const memoryUsage = estimateGeometryMemoryUsage(geometry)
|
|
265
|
+
this.estimatedMemoryUsage += memoryUsage
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
/**
|
|
269
|
+
* Track memory usage when section is removed.
|
|
270
|
+
*/
|
|
271
|
+
private removeSectionMemoryUsage(object: THREE.Object3D): void {
|
|
272
|
+
const mesh = object.children.find(child => child.name === 'mesh') as THREE.Mesh
|
|
273
|
+
if (mesh?.geometry) {
|
|
274
|
+
const memoryUsage = estimateGeometryMemoryUsage(mesh.geometry)
|
|
275
|
+
this.estimatedMemoryUsage -= memoryUsage
|
|
276
|
+
this.estimatedMemoryUsage = Math.max(0, this.estimatedMemoryUsage)
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
}
|