auto-git:
[change] src/runtime-three/runtime-project-time.ts
This commit is contained in:
@@ -530,7 +530,7 @@ function resolveTimeDrivenSunDirection(
|
|||||||
return rotateAroundAxis(noonDirection, orbitAxis, orbitRadians);
|
return rotateAroundAxis(noonDirection, orbitAxis, orbitRadians);
|
||||||
}
|
}
|
||||||
|
|
||||||
function createPhaseGradientBackground(
|
function createFallbackPhaseGradientBackground(
|
||||||
profile: WorldTimePhaseProfile
|
profile: WorldTimePhaseProfile
|
||||||
): WorldBackgroundSettings {
|
): WorldBackgroundSettings {
|
||||||
return {
|
return {
|
||||||
@@ -540,6 +540,29 @@ function createPhaseGradientBackground(
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function resolveTimePhaseBackground(
|
||||||
|
profile: WorldTimePhaseProfile
|
||||||
|
): WorldBackgroundSettings {
|
||||||
|
if (profile.background.mode === "image") {
|
||||||
|
return {
|
||||||
|
...profile.background
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
return cloneWorldBackgroundSettings(
|
||||||
|
profile.background.mode === "solid" ||
|
||||||
|
profile.background.mode === "verticalGradient"
|
||||||
|
? profile.background
|
||||||
|
: createFallbackPhaseGradientBackground(profile)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
function hasConfiguredImageBackground(
|
||||||
|
background: WorldBackgroundSettings
|
||||||
|
): background is Extract<WorldBackgroundSettings, { mode: "image" }> {
|
||||||
|
return background.mode === "image" && background.assetId.trim().length > 0;
|
||||||
|
}
|
||||||
|
|
||||||
function resolveBackgroundTopColor(background: WorldBackgroundSettings): string {
|
function resolveBackgroundTopColor(background: WorldBackgroundSettings): string {
|
||||||
if (background.mode === "solid") {
|
if (background.mode === "solid") {
|
||||||
return background.colorHex;
|
return background.colorHex;
|
||||||
@@ -642,7 +665,7 @@ function resolveBackgroundImageOverlay(
|
|||||||
background: WorldBackgroundSettings,
|
background: WorldBackgroundSettings,
|
||||||
opacity: number
|
opacity: number
|
||||||
): RuntimeDayNightWorldState["nightBackgroundOverlay"] {
|
): RuntimeDayNightWorldState["nightBackgroundOverlay"] {
|
||||||
if (background.mode !== "image") {
|
if (!hasConfiguredImageBackground(background)) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -659,6 +682,38 @@ function resolveBackgroundImageOverlay(
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function resolvePreferredDaylikeImageBackground(
|
||||||
|
contributions: Array<{
|
||||||
|
background: WorldBackgroundSettings;
|
||||||
|
weight: number;
|
||||||
|
}>
|
||||||
|
): Extract<WorldBackgroundSettings, { mode: "image" }> | null {
|
||||||
|
let bestContribution: {
|
||||||
|
background: Extract<WorldBackgroundSettings, { mode: "image" }>;
|
||||||
|
weight: number;
|
||||||
|
} | null = null;
|
||||||
|
|
||||||
|
for (const contribution of contributions) {
|
||||||
|
if (!hasConfiguredImageBackground(contribution.background)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (
|
||||||
|
bestContribution === null ||
|
||||||
|
contribution.weight > bestContribution.weight + 1e-6
|
||||||
|
) {
|
||||||
|
bestContribution = {
|
||||||
|
background: contribution.background,
|
||||||
|
weight: contribution.weight
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return bestContribution === null
|
||||||
|
? null
|
||||||
|
: cloneWorldBackgroundSettings(bestContribution.background);
|
||||||
|
}
|
||||||
|
|
||||||
function resolveTimeDrivenBackground(
|
function resolveTimeDrivenBackground(
|
||||||
dayBackground: WorldBackgroundSettings,
|
dayBackground: WorldBackgroundSettings,
|
||||||
timeOfDay: WorldTimeOfDaySettings,
|
timeOfDay: WorldTimeOfDaySettings,
|
||||||
@@ -667,47 +722,37 @@ function resolveTimeDrivenBackground(
|
|||||||
background: WorldBackgroundSettings;
|
background: WorldBackgroundSettings;
|
||||||
nightBackgroundOverlay: RuntimeDayNightWorldState["nightBackgroundOverlay"];
|
nightBackgroundOverlay: RuntimeDayNightWorldState["nightBackgroundOverlay"];
|
||||||
} {
|
} {
|
||||||
const dawnBackground = createPhaseGradientBackground(timeOfDay.dawn);
|
const dawnBackground = resolveTimePhaseBackground(timeOfDay.dawn);
|
||||||
const duskBackground = createPhaseGradientBackground(timeOfDay.dusk);
|
const duskBackground = resolveTimePhaseBackground(timeOfDay.dusk);
|
||||||
const nightBackground = timeOfDay.night.background;
|
const nightBackground = timeOfDay.night.background;
|
||||||
const twilightNightOpacity =
|
const twilightNightOpacity =
|
||||||
weights.night + weights.dawn * 0.5 + weights.dusk * 0.5;
|
weights.night + weights.dawn * 0.5 + weights.dusk * 0.5;
|
||||||
const twilightDayOpacity = weights.day + weights.dawn * 0.5 + weights.dusk * 0.5;
|
const daylikeImageBackground = resolvePreferredDaylikeImageBackground([
|
||||||
|
{
|
||||||
|
background: dayBackground,
|
||||||
|
weight: weights.day
|
||||||
|
},
|
||||||
|
{
|
||||||
|
background: dawnBackground,
|
||||||
|
weight: weights.dawn
|
||||||
|
},
|
||||||
|
{
|
||||||
|
background: duskBackground,
|
||||||
|
weight: weights.dusk
|
||||||
|
}
|
||||||
|
]);
|
||||||
|
|
||||||
if (dayBackground.mode === "image" && nightBackground.mode === "image") {
|
if (daylikeImageBackground !== null) {
|
||||||
return {
|
return {
|
||||||
background: cloneWorldBackgroundSettings(dayBackground),
|
background: daylikeImageBackground,
|
||||||
nightBackgroundOverlay: resolveBackgroundImageOverlay(
|
|
||||||
nightBackground,
|
|
||||||
twilightNightOpacity
|
|
||||||
)
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
if (dayBackground.mode === "image") {
|
|
||||||
return {
|
|
||||||
background: blendNonImageBackgrounds([
|
|
||||||
{
|
|
||||||
background: dawnBackground,
|
|
||||||
weight: weights.dawn
|
|
||||||
},
|
|
||||||
{
|
|
||||||
background: duskBackground,
|
|
||||||
weight: weights.dusk
|
|
||||||
},
|
|
||||||
{
|
|
||||||
background: nightBackground,
|
|
||||||
weight: weights.night
|
|
||||||
}
|
|
||||||
]),
|
|
||||||
nightBackgroundOverlay: resolveBackgroundImageOverlay(
|
nightBackgroundOverlay: resolveBackgroundImageOverlay(
|
||||||
dayBackground,
|
dayBackground,
|
||||||
twilightDayOpacity
|
0
|
||||||
)
|
)
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
if (nightBackground.mode === "image") {
|
if (hasConfiguredImageBackground(nightBackground)) {
|
||||||
return {
|
return {
|
||||||
background: blendNonImageBackgrounds([
|
background: blendNonImageBackgrounds([
|
||||||
{
|
{
|
||||||
@@ -942,4 +987,4 @@ export function resolveRuntimeDayNightWorldState(
|
|||||||
nightBackgroundOverlay: resolvedBackground.nightBackgroundOverlay,
|
nightBackgroundOverlay: resolvedBackground.nightBackgroundOverlay,
|
||||||
daylightFactor
|
daylightFactor
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user