export / load json

This commit is contained in:
wass08
2026-01-30 07:48:52 +09:00
parent edb2b181c2
commit 498da300db
6 changed files with 180 additions and 4 deletions
+13
View File
@@ -22,6 +22,7 @@ export type SceneState = {
// Actions
loadScene: () => void
clearScene: () => void
setScene: (nodes: Record<AnyNodeId, AnyNode>, rootNodeIds: AnyNodeId[]) => void
markDirty: (id: AnyNodeId) => void
clearDirty: (id: AnyNodeId) => void
@@ -60,6 +61,18 @@ const useScene = create<SceneState>()(
get().loadScene() // Default scene
},
setScene: (nodes, rootNodeIds) => {
set({
nodes,
rootNodeIds,
dirtyNodes: new Set<AnyNodeId>(),
})
// Mark all nodes as dirty to trigger re-validation
Object.values(nodes).forEach((node) => {
get().markDirty(node.id)
})
},
loadScene: () => {
if (get().rootNodeIds.length > 0) {
// Assign all nodes as dirty to force re-validation
@@ -6,7 +6,11 @@ import { NodeRenderer } from "./node-renderer";
export const SceneRenderer = () => {
const rootNodes = useScene((state) => state.rootNodeIds);
return rootNodes.map((nodeId) => (
<NodeRenderer key={nodeId} nodeId={nodeId} />
));
return (
<group name="scene-renderer">
{rootNodes.map((nodeId) => (
<NodeRenderer key={nodeId} nodeId={nodeId} />
))}
</group>
);
};
+7
View File
@@ -45,6 +45,10 @@ type ViewerState = {
resetSelection: () => void;
outliner: Outliner; // No setter as we will manipulate directly the arrays
// Export functionality
exportScene: (() => Promise<void>) | null;
setExportScene: (fn: (() => Promise<void>) | null) => void;
};
const useViewer = create<ViewerState>()((set, get) => ({
@@ -94,6 +98,9 @@ const useViewer = create<ViewerState>()((set, get) => ({
}),
outliner: { selectedObjects: [], hoveredObjects: [] },
exportScene: null,
setExportScene: (fn) => set({ exportScene: fn }),
}));
export default useViewer;