Refactor terrain grid resizing logic and synchronize sample drafts
This commit is contained in:
102
src/app/App.tsx
102
src/app/App.tsx
@@ -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));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user