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,406 @@
1
+ import * as THREE from 'three'
2
+ import { DebugGui } from '../lib/DebugGui'
3
+
4
+ export const DEFAULT_TEMPERATURE = 0.75
5
+
6
+ export class SkyboxRenderer {
7
+ private texture: THREE.Texture | null = null
8
+ private mesh: THREE.Mesh<THREE.SphereGeometry, THREE.MeshBasicMaterial> | null = null
9
+ private skyMesh: THREE.Mesh | null = null
10
+ private voidMesh: THREE.Mesh | null = null
11
+
12
+ // World state
13
+ private worldTime = 0
14
+ private partialTicks = 0
15
+ private viewDistance = 4
16
+ private temperature = DEFAULT_TEMPERATURE
17
+ private inWater = false
18
+ private waterBreathing = false
19
+ private fogBrightness = 0
20
+ private prevFogBrightness = 0
21
+ private readonly fogOrangeness = 0 // Debug property to control sky color orangeness
22
+ private readonly distanceFactor = 2.7
23
+
24
+ private readonly brightnessAtPosition = 1
25
+ debugGui: DebugGui
26
+
27
+ constructor (private readonly scene: THREE.Scene, public defaultSkybox: boolean, public initialImage: string | null) {
28
+ this.debugGui = new DebugGui('skybox_renderer', this, [
29
+ 'temperature',
30
+ 'worldTime',
31
+ 'inWater',
32
+ 'waterBreathing',
33
+ 'fogOrangeness',
34
+ 'brightnessAtPosition',
35
+ 'distanceFactor'
36
+ ], {
37
+ brightnessAtPosition: { min: 0, max: 1, step: 0.01 },
38
+ temperature: { min: 0, max: 1, step: 0.01 },
39
+ worldTime: { min: 0, max: 24_000, step: 1 },
40
+ fogOrangeness: { min: -1, max: 1, step: 0.01 },
41
+ distanceFactor: { min: 0, max: 5, step: 0.01 },
42
+ })
43
+
44
+ if (!initialImage) {
45
+ this.createGradientSky()
46
+ }
47
+ // this.debugGui.activate()
48
+ }
49
+
50
+ async init () {
51
+ if (this.initialImage) {
52
+ await this.setSkyboxImage(this.initialImage)
53
+ }
54
+ }
55
+
56
+ async setSkyboxImage (imageUrl: string) {
57
+ // Dispose old textures if they exist
58
+ if (this.texture) {
59
+ this.texture.dispose()
60
+ }
61
+
62
+ // Load the equirectangular texture
63
+ const textureLoader = new THREE.TextureLoader()
64
+ this.texture = await new Promise((resolve) => {
65
+ textureLoader.load(
66
+ imageUrl,
67
+ (texture) => {
68
+ texture.mapping = THREE.EquirectangularReflectionMapping
69
+ texture.encoding = THREE.sRGBEncoding
70
+ // Keep pixelated look
71
+ texture.minFilter = THREE.NearestFilter
72
+ texture.magFilter = THREE.NearestFilter
73
+ texture.needsUpdate = true
74
+ resolve(texture)
75
+ }
76
+ )
77
+ })
78
+
79
+ // Create or update the skybox
80
+ if (this.mesh) {
81
+ // Just update the texture on the existing material
82
+ this.mesh.material.map = this.texture
83
+ this.mesh.material.needsUpdate = true
84
+ } else {
85
+ // Create a large sphere geometry for the skybox
86
+ const geometry = new THREE.SphereGeometry(500, 60, 40)
87
+ // Flip the geometry inside out
88
+ geometry.scale(-1, 1, 1)
89
+
90
+ // Create material using the loaded texture
91
+ const material = new THREE.MeshBasicMaterial({
92
+ map: this.texture,
93
+ side: THREE.FrontSide // Changed to FrontSide since we're flipping the geometry
94
+ })
95
+
96
+ // Create and add the skybox mesh
97
+ this.mesh = new THREE.Mesh(geometry, material)
98
+ this.scene.add(this.mesh)
99
+ }
100
+ }
101
+
102
+ update (cameraPosition: THREE.Vector3, newViewDistance: number) {
103
+ if (newViewDistance !== this.viewDistance) {
104
+ this.viewDistance = newViewDistance
105
+ this.updateSkyColors()
106
+ }
107
+
108
+ if (this.mesh) {
109
+ // Update skybox position
110
+ this.mesh.position.copy(cameraPosition)
111
+ } else if (this.skyMesh) {
112
+ // Update gradient sky position
113
+ this.skyMesh.position.copy(cameraPosition)
114
+ this.voidMesh?.position.copy(cameraPosition)
115
+ this.updateSkyColors() // Update colors based on time of day
116
+ }
117
+ }
118
+
119
+ // Update world time
120
+ updateTime (timeOfDay: number, partialTicks = 0) {
121
+ if (this.debugGui.visible) return
122
+ this.worldTime = timeOfDay
123
+ this.partialTicks = partialTicks
124
+ this.updateSkyColors()
125
+ }
126
+
127
+ // Update view distance
128
+ updateViewDistance (viewDistance: number) {
129
+ this.viewDistance = viewDistance
130
+ this.updateSkyColors()
131
+ }
132
+
133
+ // Update temperature (for biome support)
134
+ updateTemperature (temperature: number) {
135
+ if (this.debugGui.visible) return
136
+ this.temperature = temperature
137
+ this.updateSkyColors()
138
+ }
139
+
140
+ // Update water state
141
+ updateWaterState (inWater: boolean, waterBreathing: boolean) {
142
+ if (this.debugGui.visible) return
143
+ this.inWater = inWater
144
+ this.waterBreathing = waterBreathing
145
+ this.updateSkyColors()
146
+ }
147
+
148
+ // Update default skybox setting
149
+ updateDefaultSkybox (defaultSkybox: boolean) {
150
+ if (this.debugGui.visible) return
151
+ this.defaultSkybox = defaultSkybox
152
+ this.updateSkyColors()
153
+ }
154
+
155
+ private createGradientSky () {
156
+ const size = 64
157
+ const scale = 256 / size + 2
158
+
159
+ {
160
+ const geometry = new THREE.PlaneGeometry(size * scale * 2, size * scale * 2)
161
+ geometry.rotateX(-Math.PI / 2)
162
+ geometry.translate(0, 16, 0)
163
+
164
+ const material = new THREE.MeshBasicMaterial({
165
+ color: 0xff_ff_ff,
166
+ side: THREE.DoubleSide,
167
+ depthTest: false
168
+ })
169
+
170
+ this.skyMesh = new THREE.Mesh(geometry, material)
171
+ this.scene.add(this.skyMesh)
172
+ }
173
+
174
+ {
175
+ const geometry = new THREE.PlaneGeometry(size * scale * 2, size * scale * 2)
176
+ geometry.rotateX(-Math.PI / 2)
177
+ geometry.translate(0, -16, 0)
178
+
179
+ const material = new THREE.MeshBasicMaterial({
180
+ color: 0xff_ff_ff,
181
+ side: THREE.DoubleSide,
182
+ depthTest: false
183
+ })
184
+
185
+ this.voidMesh = new THREE.Mesh(geometry, material)
186
+ this.scene.add(this.voidMesh)
187
+ }
188
+
189
+ this.updateSkyColors()
190
+ }
191
+
192
+ private getFogColor (partialTicks = 0): THREE.Vector3 {
193
+ const angle = this.getCelestialAngle(partialTicks)
194
+ let rotation = Math.cos(angle * Math.PI * 2) * 2 + 0.5
195
+ rotation = Math.max(0, Math.min(1, rotation))
196
+
197
+ let x = 0.752_941_2
198
+ let y = 0.847_058_83
199
+ let z = 1
200
+
201
+ x *= (rotation * 0.94 + 0.06)
202
+ y *= (rotation * 0.94 + 0.06)
203
+ z *= (rotation * 0.91 + 0.09)
204
+
205
+ return new THREE.Vector3(x, y, z)
206
+ }
207
+
208
+ private getSkyColor (x = 0, z = 0, partialTicks = 0): THREE.Vector3 {
209
+ const angle = this.getCelestialAngle(partialTicks)
210
+ let brightness = Math.cos(angle * 3.141_593 * 2) * 2 + 0.5
211
+
212
+ if (brightness < 0) brightness = 0
213
+ if (brightness > 1) brightness = 1
214
+
215
+ const temperature = this.getTemperature(x, z)
216
+ const rgb = this.getSkyColorByTemp(temperature)
217
+
218
+ const red = ((rgb >> 16) & 0xff) / 255
219
+ const green = ((rgb >> 8) & 0xff) / 255
220
+ const blue = (rgb & 0xff) / 255
221
+
222
+ return new THREE.Vector3(
223
+ red * brightness,
224
+ green * brightness,
225
+ blue * brightness
226
+ )
227
+ }
228
+
229
+ private calculateCelestialAngle (time: number, partialTicks: number): number {
230
+ const modTime = (time % 24_000)
231
+ let angle = (modTime + partialTicks) / 24_000 - 0.25
232
+
233
+ if (angle < 0) {
234
+ angle++
235
+ }
236
+ if (angle > 1) {
237
+ angle--
238
+ }
239
+
240
+ angle = 1 - ((Math.cos(angle * Math.PI) + 1) / 2)
241
+ angle += (angle - angle) / 3
242
+
243
+ return angle
244
+ }
245
+
246
+ private getCelestialAngle (partialTicks: number): number {
247
+ return this.calculateCelestialAngle(this.worldTime, partialTicks)
248
+ }
249
+
250
+ private getTemperature (x: number, z: number): number {
251
+ return this.temperature
252
+ }
253
+
254
+ private getSkyColorByTemp (temperature: number): number {
255
+ temperature /= 3
256
+ if (temperature < -1) temperature = -1
257
+ if (temperature > 1) temperature = 1
258
+
259
+ // Apply debug fog orangeness to hue - positive values make it more orange, negative make it less orange
260
+ const baseHue = 0.622_222_2 - temperature * 0.05
261
+ // Orange is around hue 0.08-0.15, so we need to shift from blue-purple (0.62) toward orange
262
+ // Use a more dramatic shift and also increase saturation for more noticeable effect
263
+ const orangeHue = 0.12 // Orange hue value
264
+ const hue = this.fogOrangeness > 0
265
+ ? baseHue + (orangeHue - baseHue) * this.fogOrangeness * 0.8 // Blend toward orange
266
+ : baseHue + this.fogOrangeness * 0.1 // Subtle shift for negative values
267
+ const saturation = 0.5 + temperature * 0.1 + Math.abs(this.fogOrangeness) * 0.3 // Increase saturation with orangeness
268
+ const brightness = 1
269
+
270
+ return this.hsbToRgb(hue, saturation, brightness)
271
+ }
272
+
273
+ private hsbToRgb (hue: number, saturation: number, brightness: number): number {
274
+ let r = 0; let g = 0; let b = 0
275
+ if (saturation === 0) {
276
+ r = g = b = Math.floor(brightness * 255 + 0.5)
277
+ } else {
278
+ const h = (hue - Math.floor(hue)) * 6
279
+ const f = h - Math.floor(h)
280
+ const p = brightness * (1 - saturation)
281
+ const q = brightness * (1 - saturation * f)
282
+ const t = brightness * (1 - (saturation * (1 - f)))
283
+ switch (Math.floor(h)) {
284
+ case 0:
285
+ r = Math.floor(brightness * 255 + 0.5)
286
+ g = Math.floor(t * 255 + 0.5)
287
+ b = Math.floor(p * 255 + 0.5)
288
+ break
289
+ case 1:
290
+ r = Math.floor(q * 255 + 0.5)
291
+ g = Math.floor(brightness * 255 + 0.5)
292
+ b = Math.floor(p * 255 + 0.5)
293
+ break
294
+ case 2:
295
+ r = Math.floor(p * 255 + 0.5)
296
+ g = Math.floor(brightness * 255 + 0.5)
297
+ b = Math.floor(t * 255 + 0.5)
298
+ break
299
+ case 3:
300
+ r = Math.floor(p * 255 + 0.5)
301
+ g = Math.floor(q * 255 + 0.5)
302
+ b = Math.floor(brightness * 255 + 0.5)
303
+ break
304
+ case 4:
305
+ r = Math.floor(t * 255 + 0.5)
306
+ g = Math.floor(p * 255 + 0.5)
307
+ b = Math.floor(brightness * 255 + 0.5)
308
+ break
309
+ case 5:
310
+ r = Math.floor(brightness * 255 + 0.5)
311
+ g = Math.floor(p * 255 + 0.5)
312
+ b = Math.floor(q * 255 + 0.5)
313
+ break
314
+ }
315
+ }
316
+ return 0xff_00_00_00 | (r << 16) | (g << 8) | (Math.trunc(b))
317
+ }
318
+
319
+ private updateSkyColors () {
320
+ if (!this.skyMesh || !this.voidMesh) return
321
+
322
+ // If default skybox is disabled, hide the skybox meshes
323
+ if (!this.defaultSkybox) {
324
+ this.skyMesh.visible = false
325
+ this.voidMesh.visible = false
326
+ if (this.mesh) {
327
+ this.mesh.visible = false
328
+ }
329
+ return
330
+ }
331
+
332
+ // Show skybox meshes when default skybox is enabled
333
+ this.skyMesh.visible = true
334
+ this.voidMesh.visible = true
335
+ if (this.mesh) {
336
+ this.mesh.visible = true
337
+ }
338
+
339
+ // Update fog brightness with smooth transition
340
+ this.prevFogBrightness = this.fogBrightness
341
+ const renderDistance = this.viewDistance / 32
342
+ const targetBrightness = this.brightnessAtPosition * (1 - renderDistance) + renderDistance
343
+ this.fogBrightness += (targetBrightness - this.fogBrightness) * 0.1
344
+
345
+ // Handle water fog
346
+ if (this.inWater) {
347
+ const waterViewDistance = this.waterBreathing ? 100 : 5
348
+ this.scene.fog = new THREE.Fog(new THREE.Color(0, 0, 1), 0.0025, waterViewDistance)
349
+ this.scene.background = new THREE.Color(0, 0, 1)
350
+
351
+ // Update sky and void colors for underwater effect
352
+ ;(this.skyMesh.material as THREE.MeshBasicMaterial).color.set(new THREE.Color(0, 0, 1))
353
+ ;(this.voidMesh.material as THREE.MeshBasicMaterial).color.set(new THREE.Color(0, 0, 0.6))
354
+ return
355
+ }
356
+
357
+ // Normal sky colors
358
+ const viewDistance = this.viewDistance * 16
359
+ const viewFactor = 1 - (0.25 + 0.75 * this.viewDistance / 32) ** 0.25
360
+
361
+ const angle = this.getCelestialAngle(this.partialTicks)
362
+ const skyColor = this.getSkyColor(0, 0, this.partialTicks)
363
+ const fogColor = this.getFogColor(this.partialTicks)
364
+
365
+ const brightness = Math.cos(angle * Math.PI * 2) * 2 + 0.5
366
+ const clampedBrightness = Math.max(0, Math.min(1, brightness))
367
+
368
+ // Interpolate fog brightness
369
+ const interpolatedBrightness = this.prevFogBrightness + (this.fogBrightness - this.prevFogBrightness) * this.partialTicks
370
+
371
+ const red = (fogColor.x + (skyColor.x - fogColor.x) * viewFactor) * clampedBrightness * interpolatedBrightness
372
+ const green = (fogColor.y + (skyColor.y - fogColor.y) * viewFactor) * clampedBrightness * interpolatedBrightness
373
+ const blue = (fogColor.z + (skyColor.z - fogColor.z) * viewFactor) * clampedBrightness * interpolatedBrightness
374
+
375
+ this.scene.background = new THREE.Color(red, green, blue)
376
+ this.scene.fog = new THREE.Fog(new THREE.Color(red, green, blue), 0.0025, viewDistance * this.distanceFactor)
377
+
378
+ ;(this.skyMesh.material as THREE.MeshBasicMaterial).color.set(new THREE.Color(skyColor.x, skyColor.y, skyColor.z))
379
+ ;(this.voidMesh.material as THREE.MeshBasicMaterial).color.set(new THREE.Color(
380
+ skyColor.x * 0.2 + 0.04,
381
+ skyColor.y * 0.2 + 0.04,
382
+ skyColor.z * 0.6 + 0.1
383
+ ))
384
+ }
385
+
386
+ dispose () {
387
+ if (this.texture) {
388
+ this.texture.dispose()
389
+ }
390
+ if (this.mesh) {
391
+ this.mesh.geometry.dispose()
392
+ ;(this.mesh.material as THREE.Material).dispose()
393
+ this.scene.remove(this.mesh)
394
+ }
395
+ if (this.skyMesh) {
396
+ this.skyMesh.geometry.dispose()
397
+ ;(this.skyMesh.material as THREE.Material).dispose()
398
+ this.scene.remove(this.skyMesh)
399
+ }
400
+ if (this.voidMesh) {
401
+ this.voidMesh.geometry.dispose()
402
+ ;(this.voidMesh.material as THREE.Material).dispose()
403
+ this.scene.remove(this.voidMesh)
404
+ }
405
+ }
406
+ }
@@ -0,0 +1,13 @@
1
+ /**
2
+ * StarField - Re-export from modules system for backwards compatibility.
3
+ *
4
+ * @deprecated Import from '@/modules/starfield' instead.
5
+ */
6
+
7
+ export {
8
+ StarfieldModule as StarField,
9
+ StarfieldModule,
10
+ createStarfieldModule,
11
+ starfieldManifest,
12
+ type StarfieldSettings
13
+ } from '../modules/starfield'