Refactor terrain grid resizing logic and synchronize sample drafts

This commit is contained in:
2026-05-13 14:51:02 +02:00
parent 163b768af9
commit a865c82240

View File

@@ -10320,19 +10320,105 @@ export function App({
} }
}; };
const applyTerrainGridChange = () => { const syncTerrainGridSampleDraftsFromTerrain = (terrain: Terrain) => {
setTerrainSideSampleDrafts(
createTerrainGridSideSampleDrafts(
terrain.sampleCountX,
terrain.sampleCountZ
)
);
setTerrainLastEditedSampleSide(null);
};
const handleTerrainGridSideSampleDraftChange = (
side: TerrainGridSampleSide,
value: string
) => {
setTerrainSideSampleDrafts((drafts) => ({
...drafts,
[side]: value
}));
setTerrainLastEditedSampleSide(side);
};
const resolveTerrainGridResizeSideX = (
terrain: Terrain,
requestedSide?: TerrainGridSampleSide
): "east" | "west" => {
if (isTerrainGridSampleXSide(requestedSide)) {
return requestedSide;
}
if (isTerrainGridSampleXSide(terrainLastEditedSampleSide)) {
return terrainLastEditedSampleSide;
}
const eastChanged =
Number(terrainSideSampleDrafts.east) !== terrain.sampleCountX;
const westChanged =
Number(terrainSideSampleDrafts.west) !== terrain.sampleCountX;
if (westChanged && !eastChanged) {
return "west";
}
return "east";
};
const resolveTerrainGridResizeSideZ = (
terrain: Terrain,
requestedSide?: TerrainGridSampleSide
): "north" | "south" => {
if (isTerrainGridSampleZSide(requestedSide)) {
return requestedSide;
}
if (isTerrainGridSampleZSide(terrainLastEditedSampleSide)) {
return terrainLastEditedSampleSide;
}
const northChanged =
Number(terrainSideSampleDrafts.north) !== terrain.sampleCountZ;
const southChanged =
Number(terrainSideSampleDrafts.south) !== terrain.sampleCountZ;
if (southChanged && !northChanged) {
return "south";
}
return "north";
};
const applyTerrainGridChange = (requestedSide?: TerrainGridSampleSide) => {
if (selectedTerrain === null) { if (selectedTerrain === null) {
setStatusMessage("Select a terrain before resizing its grid."); setStatusMessage("Select a terrain before resizing its grid.");
return; return;
} }
try { try {
const resizeDirectionX = resolveTerrainGridResizeSideX(
selectedTerrain,
requestedSide
);
const resizeDirectionZ = resolveTerrainGridResizeSideZ(
selectedTerrain,
requestedSide
);
const applyAllDrafts =
requestedSide === undefined ||
Number(terrainCellSizeDraft) !== selectedTerrain.cellSize;
const nextTerrain = resizeTerrainGrid(selectedTerrain, { const nextTerrain = resizeTerrainGrid(selectedTerrain, {
sampleCountX: Number(terrainSampleCountXDraft), sampleCountX:
sampleCountZ: Number(terrainSampleCountZDraft), isTerrainGridSampleXSide(requestedSide) || applyAllDrafts
? Number(terrainSideSampleDrafts[resizeDirectionX])
: selectedTerrain.sampleCountX,
sampleCountZ:
isTerrainGridSampleZSide(requestedSide) || applyAllDrafts
? Number(terrainSideSampleDrafts[resizeDirectionZ])
: selectedTerrain.sampleCountZ,
cellSize: Number(terrainCellSizeDraft), cellSize: Number(terrainCellSizeDraft),
resizeDirectionX: terrainResizeDirectionXDraft, resizeDirectionX,
resizeDirectionZ: terrainResizeDirectionZDraft resizeDirectionZ
}); });
const terrainLabel = getTerrainLabelById(selectedTerrain.id, terrainList); const terrainLabel = getTerrainLabelById(selectedTerrain.id, terrainList);
@@ -10344,8 +10430,7 @@ export function App({
); );
if (committed) { if (committed) {
setTerrainSampleCountXDraft(String(nextTerrain.sampleCountX)); syncTerrainGridSampleDraftsFromTerrain(nextTerrain);
setTerrainSampleCountZDraft(String(nextTerrain.sampleCountZ));
setTerrainCellSizeDraft(String(nextTerrain.cellSize)); setTerrainCellSizeDraft(String(nextTerrain.cellSize));
} }
} catch (error) { } catch (error) {
@@ -10370,8 +10455,7 @@ export function App({
); );
if (committed && selectedTerrain?.id === nextTerrain.id) { if (committed && selectedTerrain?.id === nextTerrain.id) {
setTerrainSampleCountXDraft(String(nextTerrain.sampleCountX)); syncTerrainGridSampleDraftsFromTerrain(nextTerrain);
setTerrainSampleCountZDraft(String(nextTerrain.sampleCountZ));
setTerrainCellSizeDraft(String(nextTerrain.cellSize)); setTerrainCellSizeDraft(String(nextTerrain.cellSize));
} }