fix(vegetation): scale-correct sapin and buisson LOD meshes
The exported sapin-LOD and buisson-LOD models do not match their full detail counterpart's baseline scale, so they appear oversized once the LOD swap kicks in. Add MAP_LOD_SCALE_MULTIPLIERS keyed by map name (sapin: 0.5, buisson: 0.8) and apply it on top of the chunk's existing scaleMultiplier whenever the resolved model path is the LOD variant.
This commit is contained in:
@@ -25,6 +25,20 @@ export function getMapLodModelPath(modelName: string): string | null {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
export const MAP_LOD_SCALE_MULTIPLIERS = {
|
||||||
|
sapin: 0.35,
|
||||||
|
buisson: 0.7,
|
||||||
|
} as const satisfies Partial<Record<keyof typeof MAP_LOD_MODEL_PATHS, number>>;
|
||||||
|
|
||||||
|
export function getMapLodScaleMultiplier(modelName: string): number {
|
||||||
|
return (
|
||||||
|
MAP_LOD_SCALE_MULTIPLIERS[
|
||||||
|
modelName as keyof typeof MAP_LOD_SCALE_MULTIPLIERS
|
||||||
|
] ?? 1
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
export function selectMapModelPathByDistance({
|
export function selectMapModelPathByDistance({
|
||||||
distance,
|
distance,
|
||||||
modelName,
|
modelName,
|
||||||
|
|||||||
@@ -8,7 +8,11 @@ import {
|
|||||||
} from "react";
|
} from "react";
|
||||||
import { useFrame, useThree } from "@react-three/fiber";
|
import { useFrame, useThree } from "@react-three/fiber";
|
||||||
import { CHUNK_CONFIG } from "@/data/world/chunkStreamingConfig";
|
import { CHUNK_CONFIG } from "@/data/world/chunkStreamingConfig";
|
||||||
import { selectMapModelPathByDistance } from "@/data/world/mapLodConfig";
|
import {
|
||||||
|
getMapLodModelPath,
|
||||||
|
getMapLodScaleMultiplier,
|
||||||
|
selectMapModelPathByDistance,
|
||||||
|
} from "@/data/world/mapLodConfig";
|
||||||
import { useCameraMode } from "@/hooks/debug/useCameraMode";
|
import { useCameraMode } from "@/hooks/debug/useCameraMode";
|
||||||
import { useSceneMode } from "@/hooks/debug/useSceneMode";
|
import { useSceneMode } from "@/hooks/debug/useSceneMode";
|
||||||
import {
|
import {
|
||||||
@@ -205,12 +209,17 @@ export function VegetationSystem({
|
|||||||
<group name="vegetation-system">
|
<group name="vegetation-system">
|
||||||
{visibleChunks.map((chunk) => {
|
{visibleChunks.map((chunk) => {
|
||||||
const modelPath = chunkModelPaths.get(chunk.key) ?? chunk.modelPath;
|
const modelPath = chunkModelPaths.get(chunk.key) ?? chunk.modelPath;
|
||||||
|
const mapName = VEGETATION_TYPES[chunk.type].mapName;
|
||||||
|
const isLod = modelPath === getMapLodModelPath(mapName);
|
||||||
|
const scaleMultiplier =
|
||||||
|
chunk.scaleMultiplier *
|
||||||
|
(isLod ? getMapLodScaleMultiplier(mapName) : 1);
|
||||||
return (
|
return (
|
||||||
<Suspense key={`${chunk.key}:${modelPath}`} fallback={null}>
|
<Suspense key={`${chunk.key}:${modelPath}`} fallback={null}>
|
||||||
<InstancedVegetation
|
<InstancedVegetation
|
||||||
modelPath={modelPath}
|
modelPath={modelPath}
|
||||||
instances={chunk.instances}
|
instances={chunk.instances}
|
||||||
scaleMultiplier={chunk.scaleMultiplier}
|
scaleMultiplier={scaleMultiplier}
|
||||||
castShadow={chunk.castShadow}
|
castShadow={chunk.castShadow}
|
||||||
receiveShadow={chunk.receiveShadow}
|
receiveShadow={chunk.receiveShadow}
|
||||||
windStrength={chunk.windStrength}
|
windStrength={chunk.windStrength}
|
||||||
|
|||||||
Reference in New Issue
Block a user