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,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'
|