auto-git:
[change] src/runtime-three/runtime-host.ts
This commit is contained in:
@@ -19,6 +19,7 @@ import {
|
|||||||
MeshBasicMaterial,
|
MeshBasicMaterial,
|
||||||
MeshPhysicalMaterial,
|
MeshPhysicalMaterial,
|
||||||
MeshStandardMaterial,
|
MeshStandardMaterial,
|
||||||
|
OrthographicCamera,
|
||||||
PerspectiveCamera,
|
PerspectiveCamera,
|
||||||
PointLight,
|
PointLight,
|
||||||
Quaternion,
|
Quaternion,
|
||||||
@@ -1137,8 +1138,14 @@ export class RuntimeHost {
|
|||||||
|
|
||||||
this.ambientLight.color.set(resolvedWorld.ambientLight.colorHex);
|
this.ambientLight.color.set(resolvedWorld.ambientLight.colorHex);
|
||||||
this.ambientLight.intensity = resolvedWorld.ambientLight.intensity;
|
this.ambientLight.intensity = resolvedWorld.ambientLight.intensity;
|
||||||
|
this.currentCelestialShadowCaster =
|
||||||
|
resolveDominantCelestialShadowCaster(
|
||||||
|
resolvedWorld.sunLight,
|
||||||
|
resolvedWorld.moonLight
|
||||||
|
)?.key ?? null;
|
||||||
this.sunLight.color.set(resolvedWorld.sunLight.colorHex);
|
this.sunLight.color.set(resolvedWorld.sunLight.colorHex);
|
||||||
this.sunLight.intensity = resolvedWorld.sunLight.intensity;
|
this.sunLight.intensity = resolvedWorld.sunLight.intensity;
|
||||||
|
this.sunLight.visible = resolvedWorld.sunLight.intensity > 1e-4;
|
||||||
this.sunLight.position
|
this.sunLight.position
|
||||||
.set(
|
.set(
|
||||||
resolvedWorld.sunLight.direction.x,
|
resolvedWorld.sunLight.direction.x,
|
||||||
@@ -1147,10 +1154,12 @@ export class RuntimeHost {
|
|||||||
)
|
)
|
||||||
.normalize()
|
.normalize()
|
||||||
.multiplyScalar(18);
|
.multiplyScalar(18);
|
||||||
|
this.sunLight.target.position.set(0, 0, 0);
|
||||||
|
|
||||||
if (resolvedWorld.moonLight === null) {
|
if (resolvedWorld.moonLight === null) {
|
||||||
this.moonLight.visible = false;
|
this.moonLight.visible = false;
|
||||||
this.moonLight.intensity = 0;
|
this.moonLight.intensity = 0;
|
||||||
|
this.moonLight.target.position.set(0, 0, 0);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1165,6 +1174,7 @@ export class RuntimeHost {
|
|||||||
)
|
)
|
||||||
.normalize()
|
.normalize()
|
||||||
.multiplyScalar(16);
|
.multiplyScalar(16);
|
||||||
|
this.moonLight.target.position.set(0, 0, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
private async buildCollisionWorld(
|
private async buildCollisionWorld(
|
||||||
@@ -1247,17 +1257,6 @@ export class RuntimeHost {
|
|||||||
const shadowsEnabled =
|
const shadowsEnabled =
|
||||||
advancedRendering.enabled && advancedRendering.shadows.enabled;
|
advancedRendering.enabled && advancedRendering.shadows.enabled;
|
||||||
|
|
||||||
applyAdvancedRenderingLightShadowFlags(this.sunLight, advancedRendering);
|
|
||||||
this.moonLight.castShadow = false;
|
|
||||||
this.moonLight.shadow.autoUpdate = false;
|
|
||||||
|
|
||||||
for (const renderObjects of this.localLightObjects.values()) {
|
|
||||||
applyAdvancedRenderingLightShadowFlags(
|
|
||||||
renderObjects.group,
|
|
||||||
advancedRendering
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
for (const mesh of this.brushMeshes.values()) {
|
for (const mesh of this.brushMeshes.values()) {
|
||||||
applyAdvancedRenderingRenderableShadowFlags(mesh, shadowsEnabled);
|
applyAdvancedRenderingRenderableShadowFlags(mesh, shadowsEnabled);
|
||||||
}
|
}
|
||||||
@@ -1269,6 +1268,140 @@ export class RuntimeHost {
|
|||||||
for (const renderGroup of this.modelRenderObjects.values()) {
|
for (const renderGroup of this.modelRenderObjects.values()) {
|
||||||
applyAdvancedRenderingRenderableShadowFlags(renderGroup, shadowsEnabled);
|
applyAdvancedRenderingRenderableShadowFlags(renderGroup, shadowsEnabled);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
this.syncCelestialShadowState();
|
||||||
|
}
|
||||||
|
|
||||||
|
private resolveRuntimeShadowFocusTarget() {
|
||||||
|
const telemetry = this.currentPlayerControllerTelemetry;
|
||||||
|
|
||||||
|
if (telemetry !== null) {
|
||||||
|
return {
|
||||||
|
center: {
|
||||||
|
x: telemetry.feetPosition.x,
|
||||||
|
y: (telemetry.feetPosition.y + telemetry.eyePosition.y) * 0.5,
|
||||||
|
z: telemetry.feetPosition.z
|
||||||
|
},
|
||||||
|
radius: 8
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
if (this.runtimeScene?.sceneBounds !== null) {
|
||||||
|
return {
|
||||||
|
center: {
|
||||||
|
x: this.runtimeScene.sceneBounds.center.x,
|
||||||
|
y: this.runtimeScene.sceneBounds.center.y,
|
||||||
|
z: this.runtimeScene.sceneBounds.center.z
|
||||||
|
},
|
||||||
|
radius: Math.max(
|
||||||
|
6,
|
||||||
|
Math.hypot(
|
||||||
|
this.runtimeScene.sceneBounds.size.x,
|
||||||
|
this.runtimeScene.sceneBounds.size.y,
|
||||||
|
this.runtimeScene.sceneBounds.size.z
|
||||||
|
) * 0.2
|
||||||
|
)
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
return {
|
||||||
|
center: {
|
||||||
|
x: this.camera.position.x,
|
||||||
|
y: this.camera.position.y,
|
||||||
|
z: this.camera.position.z
|
||||||
|
},
|
||||||
|
radius: 8
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
private syncCelestialShadowState() {
|
||||||
|
if (this.currentWorld === null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const advancedRendering = this.currentWorld.advancedRendering;
|
||||||
|
const shadowsEnabled =
|
||||||
|
advancedRendering.enabled && advancedRendering.shadows.enabled;
|
||||||
|
|
||||||
|
for (const renderObjects of this.localLightObjects.values()) {
|
||||||
|
configureAdvancedRenderingShadowLight(
|
||||||
|
renderObjects.light,
|
||||||
|
advancedRendering,
|
||||||
|
false
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
for (const renderObjects of this.lightVolumeObjects.values()) {
|
||||||
|
for (const light of renderObjects.lights) {
|
||||||
|
configureAdvancedRenderingShadowLight(light, advancedRendering, false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!shadowsEnabled || this.currentCelestialShadowCaster === null) {
|
||||||
|
configureAdvancedRenderingShadowLight(this.sunLight, advancedRendering, false);
|
||||||
|
configureAdvancedRenderingShadowLight(this.moonLight, advancedRendering, false);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const activeLight =
|
||||||
|
this.currentCelestialShadowCaster === "moon"
|
||||||
|
? this.moonLight
|
||||||
|
: this.sunLight;
|
||||||
|
const lightDirection = activeLight.position
|
||||||
|
.clone()
|
||||||
|
.sub(activeLight.target.position)
|
||||||
|
.normalize();
|
||||||
|
const fit = fitCelestialDirectionalShadow({
|
||||||
|
activeCamera: this.camera,
|
||||||
|
focusTarget: this.resolveRuntimeShadowFocusTarget(),
|
||||||
|
lightDirection: {
|
||||||
|
x: lightDirection.x,
|
||||||
|
y: lightDirection.y,
|
||||||
|
z: lightDirection.z
|
||||||
|
},
|
||||||
|
mapSize: advancedRendering.shadows.mapSize,
|
||||||
|
sceneBounds: this.runtimeScene?.sceneBounds ?? null
|
||||||
|
});
|
||||||
|
|
||||||
|
if (fit === null) {
|
||||||
|
configureAdvancedRenderingShadowLight(this.sunLight, advancedRendering, false);
|
||||||
|
configureAdvancedRenderingShadowLight(this.moonLight, advancedRendering, false);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
configureAdvancedRenderingShadowLight(
|
||||||
|
this.sunLight,
|
||||||
|
advancedRendering,
|
||||||
|
this.currentCelestialShadowCaster === "sun",
|
||||||
|
this.currentCelestialShadowCaster === "sun" ? fit.normalBias : 0
|
||||||
|
);
|
||||||
|
configureAdvancedRenderingShadowLight(
|
||||||
|
this.moonLight,
|
||||||
|
advancedRendering,
|
||||||
|
this.currentCelestialShadowCaster === "moon",
|
||||||
|
this.currentCelestialShadowCaster === "moon" ? fit.normalBias : 0
|
||||||
|
);
|
||||||
|
|
||||||
|
activeLight.position.set(
|
||||||
|
fit.lightPosition.x,
|
||||||
|
fit.lightPosition.y,
|
||||||
|
fit.lightPosition.z
|
||||||
|
);
|
||||||
|
activeLight.target.position.set(
|
||||||
|
fit.targetPosition.x,
|
||||||
|
fit.targetPosition.y,
|
||||||
|
fit.targetPosition.z
|
||||||
|
);
|
||||||
|
activeLight.target.updateMatrixWorld();
|
||||||
|
const shadowCamera = activeLight.shadow.camera as OrthographicCamera;
|
||||||
|
shadowCamera.left = fit.cameraBounds.left;
|
||||||
|
shadowCamera.right = fit.cameraBounds.right;
|
||||||
|
shadowCamera.top = fit.cameraBounds.top;
|
||||||
|
shadowCamera.bottom = fit.cameraBounds.bottom;
|
||||||
|
shadowCamera.near = fit.cameraBounds.near;
|
||||||
|
shadowCamera.far = fit.cameraBounds.far;
|
||||||
|
shadowCamera.updateProjectionMatrix();
|
||||||
|
activeLight.shadow.needsUpdate = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
private rebuildLocalLights(localLights: RuntimeLocalLightCollection) {
|
private rebuildLocalLights(localLights: RuntimeLocalLightCollection) {
|
||||||
|
|||||||
Reference in New Issue
Block a user