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:
Tom Boullay
2026-06-02 14:50:07 +02:00
parent 4f1b3b4ff3
commit 2dabb73d3d
2 changed files with 25 additions and 2 deletions
+14
View File
@@ -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,
+11 -2
View File
@@ -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}