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.
Files changed (187) hide show
  1. package/README.md +297 -0
  2. package/dist/index.html +83 -0
  3. package/dist/static/image/arrow.6f27b59f.png +0 -0
  4. package/dist/static/image/blocksAtlasLatest.7850afa3.png +0 -0
  5. package/dist/static/image/blocksAtlasLegacy.5c76823d.png +0 -0
  6. package/dist/static/image/itemsAtlasLatest.36036f95.png +0 -0
  7. package/dist/static/image/itemsAtlasLegacy.dcb1b58d.png +0 -0
  8. package/dist/static/image/tipped_arrow.6f27b59f.png +0 -0
  9. package/dist/static/js/365.f05233ab.js +8462 -0
  10. package/dist/static/js/365.f05233ab.js.LICENSE.txt +52 -0
  11. package/dist/static/js/async/738.efa27644.js +1 -0
  12. package/dist/static/js/index.092ec5be.js +56 -0
  13. package/dist/static/js/lib-polyfill.98986ac5.js +1 -0
  14. package/dist/static/js/lib-react.5c9129e0.js +2 -0
  15. package/dist/static/js/lib-react.5c9129e0.js.LICENSE.txt +39 -0
  16. package/package.json +104 -0
  17. package/src/assets/destroy_stage_0.png +0 -0
  18. package/src/assets/destroy_stage_1.png +0 -0
  19. package/src/assets/destroy_stage_2.png +0 -0
  20. package/src/assets/destroy_stage_3.png +0 -0
  21. package/src/assets/destroy_stage_4.png +0 -0
  22. package/src/assets/destroy_stage_5.png +0 -0
  23. package/src/assets/destroy_stage_6.png +0 -0
  24. package/src/assets/destroy_stage_7.png +0 -0
  25. package/src/assets/destroy_stage_8.png +0 -0
  26. package/src/assets/destroy_stage_9.png +0 -0
  27. package/src/examples/README.md +146 -0
  28. package/src/examples/appViewerExample.ts +205 -0
  29. package/src/examples/initialMenuStart.ts +161 -0
  30. package/src/graphicsBackend/appViewer.ts +297 -0
  31. package/src/graphicsBackend/config.ts +119 -0
  32. package/src/graphicsBackend/index.ts +10 -0
  33. package/src/graphicsBackend/playerState.ts +61 -0
  34. package/src/graphicsBackend/types.ts +143 -0
  35. package/src/index.ts +97 -0
  36. package/src/lib/DebugGui.ts +190 -0
  37. package/src/lib/animationController.ts +85 -0
  38. package/src/lib/buildSharedConfig.mjs +1 -0
  39. package/src/lib/cameraBobbing.ts +94 -0
  40. package/src/lib/canvas2DOverlay.example.ts +361 -0
  41. package/src/lib/canvas2DOverlay.quickstart.ts +242 -0
  42. package/src/lib/canvas2DOverlay.ts +381 -0
  43. package/src/lib/cleanupDecorator.ts +29 -0
  44. package/src/lib/createPlayerObject.ts +55 -0
  45. package/src/lib/frameTimingCollector.ts +164 -0
  46. package/src/lib/guiRenderer.ts +283 -0
  47. package/src/lib/items.ts +140 -0
  48. package/src/lib/mesherlogReader.ts +131 -0
  49. package/src/lib/moreBlockDataGenerated.json +714 -0
  50. package/src/lib/preflatMap.json +1741 -0
  51. package/src/lib/simpleUtils.ts +40 -0
  52. package/src/lib/smoothSwitcher.ts +168 -0
  53. package/src/lib/spiral.ts +29 -0
  54. package/src/lib/ui/newStats.ts +120 -0
  55. package/src/lib/utils/proxy.ts +23 -0
  56. package/src/lib/utils/skins.ts +63 -0
  57. package/src/lib/utils.ts +76 -0
  58. package/src/lib/workerProxy.ts +342 -0
  59. package/src/lib/worldrendererCommon.ts +1088 -0
  60. package/src/mesher/mesher.ts +253 -0
  61. package/src/mesher/models.ts +769 -0
  62. package/src/mesher/modelsGeometryCommon.ts +142 -0
  63. package/src/mesher/shared.ts +80 -0
  64. package/src/mesher/standaloneRenderer.ts +270 -0
  65. package/src/mesher/test/a.ts +3 -0
  66. package/src/mesher/test/mesherTester.ts +76 -0
  67. package/src/mesher/test/playground.ts +19 -0
  68. package/src/mesher/test/test-perf.ts +74 -0
  69. package/src/mesher/test/tests.test.ts +56 -0
  70. package/src/mesher/world.ts +294 -0
  71. package/src/mesher/worldConstants.ts +1 -0
  72. package/src/modules/index.ts +11 -0
  73. package/src/modules/starfield.ts +313 -0
  74. package/src/modules/types.ts +110 -0
  75. package/src/playerState/playerState.ts +78 -0
  76. package/src/playerState/types.ts +36 -0
  77. package/src/playground/allEntitiesDebug.ts +170 -0
  78. package/src/playground/baseScene.ts +587 -0
  79. package/src/playground/mobileControls.tsx +268 -0
  80. package/src/playground/playground.html +83 -0
  81. package/src/playground/playground.ts +11 -0
  82. package/src/playground/playgroundUi.tsx +140 -0
  83. package/src/playground/reactUtils.ts +71 -0
  84. package/src/playground/scenes/allEntities.ts +13 -0
  85. package/src/playground/scenes/entities.ts +37 -0
  86. package/src/playground/scenes/floorRandom.ts +33 -0
  87. package/src/playground/scenes/frequentUpdates.ts +148 -0
  88. package/src/playground/scenes/geometryExport.ts +142 -0
  89. package/src/playground/scenes/index.ts +12 -0
  90. package/src/playground/scenes/lightingStarfield.ts +40 -0
  91. package/src/playground/scenes/main.ts +313 -0
  92. package/src/playground/scenes/railsCobweb.ts +14 -0
  93. package/src/playground/scenes/rotationIssue.ts +7 -0
  94. package/src/playground/scenes/slabsOptimization.ts +16 -0
  95. package/src/playground/scenes/transparencyIssue.ts +11 -0
  96. package/src/playground/shared.ts +79 -0
  97. package/src/resourcesManager/index.ts +5 -0
  98. package/src/resourcesManager/resourcesManager.ts +314 -0
  99. package/src/shims/minecraftData.ts +41 -0
  100. package/src/sign-renderer/index.html +21 -0
  101. package/src/sign-renderer/index.ts +216 -0
  102. package/src/sign-renderer/noop.js +1 -0
  103. package/src/sign-renderer/playground.ts +38 -0
  104. package/src/sign-renderer/tests.test.ts +69 -0
  105. package/src/sign-renderer/vite.config.ts +10 -0
  106. package/src/three/appShared.ts +75 -0
  107. package/src/three/bannerRenderer.ts +275 -0
  108. package/src/three/cameraShake.ts +120 -0
  109. package/src/three/cinimaticScript.ts +350 -0
  110. package/src/three/documentRenderer.ts +491 -0
  111. package/src/three/entities.ts +1580 -0
  112. package/src/three/entity/EntityMesh.ts +707 -0
  113. package/src/three/entity/animations.js +171 -0
  114. package/src/three/entity/armorModels.json +204 -0
  115. package/src/three/entity/armorModels.ts +36 -0
  116. package/src/three/entity/entities.json +6230 -0
  117. package/src/three/entity/exportedModels.js +38 -0
  118. package/src/three/entity/externalTextures.json +1 -0
  119. package/src/three/entity/models/allay.obj +325 -0
  120. package/src/three/entity/models/arrow.obj +60 -0
  121. package/src/three/entity/models/axolotl.obj +509 -0
  122. package/src/three/entity/models/blaze.obj +601 -0
  123. package/src/three/entity/models/boat.obj +417 -0
  124. package/src/three/entity/models/camel.obj +1061 -0
  125. package/src/three/entity/models/cat.obj +509 -0
  126. package/src/three/entity/models/chicken.obj +371 -0
  127. package/src/three/entity/models/cod.obj +371 -0
  128. package/src/three/entity/models/creeper.obj +279 -0
  129. package/src/three/entity/models/dolphin.obj +371 -0
  130. package/src/three/entity/models/ender_dragon.obj +2993 -0
  131. package/src/three/entity/models/enderman.obj +325 -0
  132. package/src/three/entity/models/endermite.obj +187 -0
  133. package/src/three/entity/models/fox.obj +463 -0
  134. package/src/three/entity/models/frog.obj +739 -0
  135. package/src/three/entity/models/ghast.obj +463 -0
  136. package/src/three/entity/models/goat.obj +601 -0
  137. package/src/three/entity/models/guardian.obj +1015 -0
  138. package/src/three/entity/models/horse.obj +1061 -0
  139. package/src/three/entity/models/llama.obj +509 -0
  140. package/src/three/entity/models/minecart.obj +233 -0
  141. package/src/three/entity/models/parrot.obj +509 -0
  142. package/src/three/entity/models/piglin.obj +739 -0
  143. package/src/three/entity/models/pillager.obj +371 -0
  144. package/src/three/entity/models/rabbit.obj +555 -0
  145. package/src/three/entity/models/sheep.obj +555 -0
  146. package/src/three/entity/models/shulker.obj +141 -0
  147. package/src/three/entity/models/sniffer.obj +693 -0
  148. package/src/three/entity/models/spider.obj +509 -0
  149. package/src/three/entity/models/tadpole.obj +95 -0
  150. package/src/three/entity/models/turtle.obj +371 -0
  151. package/src/three/entity/models/vex.obj +325 -0
  152. package/src/three/entity/models/villager.obj +509 -0
  153. package/src/three/entity/models/warden.obj +463 -0
  154. package/src/three/entity/models/witch.obj +647 -0
  155. package/src/three/entity/models/wolf.obj +509 -0
  156. package/src/three/entity/models/zombie_villager.obj +463 -0
  157. package/src/three/entity/objModels.js +1 -0
  158. package/src/three/fireworks.ts +661 -0
  159. package/src/three/fireworksRenderer.ts +434 -0
  160. package/src/three/globals.d.ts +7 -0
  161. package/src/three/graphicsBackend.ts +274 -0
  162. package/src/three/graphicsBackendOffThread.ts +107 -0
  163. package/src/three/hand.ts +89 -0
  164. package/src/three/holdingBlock.ts +926 -0
  165. package/src/three/index.ts +20 -0
  166. package/src/three/itemMesh.ts +427 -0
  167. package/src/three/modules.d.ts +14 -0
  168. package/src/three/panorama.ts +308 -0
  169. package/src/three/panoramaShared.ts +1 -0
  170. package/src/three/renderSlot.ts +82 -0
  171. package/src/three/skyboxRenderer.ts +406 -0
  172. package/src/three/starField.ts +13 -0
  173. package/src/three/threeJsMedia.ts +731 -0
  174. package/src/three/threeJsMethods.ts +15 -0
  175. package/src/three/threeJsParticles.ts +160 -0
  176. package/src/three/threeJsSound.ts +95 -0
  177. package/src/three/threeJsUtils.ts +90 -0
  178. package/src/three/waypointSprite.ts +435 -0
  179. package/src/three/waypoints.ts +163 -0
  180. package/src/three/world/cursorBlock.ts +172 -0
  181. package/src/three/world/vr.ts +257 -0
  182. package/src/three/worldGeometryExport.ts +259 -0
  183. package/src/three/worldGeometryHandler.ts +279 -0
  184. package/src/three/worldRendererThree.ts +1381 -0
  185. package/src/worldView/index.ts +6 -0
  186. package/src/worldView/types.ts +66 -0
  187. 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
+ }