From 61fd7527cc3f46ce892b607b4f665251dbaeabe3 Mon Sep 17 00:00:00 2001 From: Victor Giers Date: Tue, 31 Mar 2026 05:54:57 +0200 Subject: [PATCH] Refactor entity handling in App.tsx --- src/app/App.tsx | 26 +++++++++++++++++++++----- 1 file changed, 21 insertions(+), 5 deletions(-) diff --git a/src/app/App.tsx b/src/app/App.tsx index 63af213f..48f9497d 100644 --- a/src/app/App.tsx +++ b/src/app/App.tsx @@ -370,16 +370,21 @@ function formatWorldBackgroundLabel(world: WorldSettings): string { export function App({ store, initialStatusMessage }: AppProps) { const editorState = useEditorStoreState(store); const brushList = Object.values(editorState.document.brushes); - const playerStartList = getPlayerStartEntities(editorState.document.entities); + const entityList = getEntityInstances(editorState.document.entities); + const entityDisplayList = getSortedEntityDisplayLabels(editorState.document.entities); const primaryPlayerStart = getPrimaryPlayerStartEntity(editorState.document.entities); const materialList = sortDocumentMaterials(editorState.document.materials); const selectedBrush = getSelectedBoxBrush(editorState.selection, brushList); - const selectedPlayerStart = getSelectedPlayerStart(editorState.selection, playerStartList); + const selectedEntity = getSelectedEntity(editorState.selection, entityList); const selectedFaceId = getSelectedBrushFaceId(editorState.selection); const selectedFace = selectedBrush !== null && selectedFaceId !== null ? selectedBrush.faces[selectedFaceId] : null; const selectedFaceMaterial = selectedFace !== null && selectedFace.materialId !== null ? editorState.document.materials[selectedFace.materialId] ?? null : null; - const editablePlayerStart = selectedPlayerStart ?? primaryPlayerStart; + const selectedPlayerStart = selectedEntity?.kind === "playerStart" ? selectedEntity : null; + const selectedSoundEmitter = selectedEntity?.kind === "soundEmitter" ? selectedEntity : null; + const selectedTriggerVolume = selectedEntity?.kind === "triggerVolume" ? selectedEntity : null; + const selectedTeleportTarget = selectedEntity?.kind === "teleportTarget" ? selectedEntity : null; + const selectedInteractable = selectedEntity?.kind === "interactable" ? selectedEntity : null; const [sceneNameDraft, setSceneNameDraft] = useState(editorState.document.name); const [brushNameDraft, setBrushNameDraft] = useState(""); @@ -387,12 +392,23 @@ export function App({ store, initialStatusMessage }: AppProps) { const [sizeDraft, setSizeDraft] = useState(createVec3Draft(DEFAULT_BOX_BRUSH_SIZE)); const [uvOffsetDraft, setUvOffsetDraft] = useState(createVec2Draft(createDefaultFaceUvState().offset)); const [uvScaleDraft, setUvScaleDraft] = useState(createVec2Draft(createDefaultFaceUvState().scale)); - const [playerStartPositionDraft, setPlayerStartPositionDraft] = useState(createVec3Draft(DEFAULT_PLAYER_START_POSITION)); + const [entityPositionDraft, setEntityPositionDraft] = useState(createVec3Draft(DEFAULT_ENTITY_POSITION)); const [playerStartYawDraft, setPlayerStartYawDraft] = useState("0"); + const [soundEmitterRadiusDraft, setSoundEmitterRadiusDraft] = useState(String(DEFAULT_SOUND_EMITTER_RADIUS)); + const [soundEmitterGainDraft, setSoundEmitterGainDraft] = useState(String(DEFAULT_SOUND_EMITTER_GAIN)); + const [soundEmitterAutoplayDraft, setSoundEmitterAutoplayDraft] = useState(false); + const [soundEmitterLoopDraft, setSoundEmitterLoopDraft] = useState(false); + const [triggerVolumeSizeDraft, setTriggerVolumeSizeDraft] = useState(createVec3Draft(DEFAULT_TRIGGER_VOLUME_SIZE)); + const [triggerOnEnterDraft, setTriggerOnEnterDraft] = useState(true); + const [triggerOnExitDraft, setTriggerOnExitDraft] = useState(false); + const [teleportTargetYawDraft, setTeleportTargetYawDraft] = useState(String(DEFAULT_TELEPORT_TARGET_YAW_DEGREES)); + const [interactableRadiusDraft, setInteractableRadiusDraft] = useState(String(DEFAULT_INTERACTABLE_RADIUS)); + const [interactablePromptDraft, setInteractablePromptDraft] = useState(DEFAULT_INTERACTABLE_PROMPT); + const [interactableEnabledDraft, setInteractableEnabledDraft] = useState(true); const [ambientLightIntensityDraft, setAmbientLightIntensityDraft] = useState(String(editorState.document.world.ambientLight.intensity)); const [sunLightIntensityDraft, setSunLightIntensityDraft] = useState(String(editorState.document.world.sunLight.intensity)); const [sunDirectionDraft, setSunDirectionDraft] = useState(createVec3Draft(editorState.document.world.sunLight.direction)); - const [statusMessage, setStatusMessage] = useState(initialStatusMessage ?? "Slice 1.5 world environment settings ready."); + const [statusMessage, setStatusMessage] = useState(initialStatusMessage ?? "Slice 2.1 entity system foundation ready."); const [preferredNavigationMode, setPreferredNavigationMode] = useState( primaryPlayerStart === null ? "orbitVisitor" : "firstPerson" );