starting rewrite

This commit is contained in:
wass08
2026-01-14 11:14:12 +09:00
parent 25c14b54f2
commit 88f26dd09e
2 changed files with 68 additions and 5 deletions
+2 -5
View File
@@ -4,8 +4,8 @@ import { Environment, OrbitControls } from "@react-three/drei";
import { Canvas, ThreeToJSXElements } from "@react-three/fiber"; import { Canvas, ThreeToJSXElements } from "@react-three/fiber";
import { extend } from "@react-three/fiber"; import { extend } from "@react-three/fiber";
import { color, sin, time } from "three/tsl";
import * as THREE from "three/webgpu"; import * as THREE from "three/webgpu";
import { SceneRenderer } from "./renderers/scene-renderer";
declare module "@react-three/fiber" { declare module "@react-three/fiber" {
interface ThreeElements extends ThreeToJSXElements<typeof THREE> {} interface ThreeElements extends ThreeToJSXElements<typeof THREE> {}
@@ -26,10 +26,7 @@ export default function Editor() {
> >
<OrbitControls /> <OrbitControls />
<Environment preset="sunset" /> <Environment preset="sunset" />
<mesh> <SceneRenderer />
<boxGeometry args={[1, 1, 1]} />
<meshStandardNodeMaterial colorNode={color("pink").mul(sin(time))} />
</mesh>
</Canvas> </Canvas>
); );
} }
@@ -0,0 +1,66 @@
"use client";
import { AnyNode, LevelNode, useScene, WallNode } from "@pascal-app/core";
import { useRef } from "react";
import * as THREE from "three/webgpu";
export const SceneRenderer = () => {
const rootNodes = useScene((state) => state.rootNodeIds);
return rootNodes.map((nodeId) => (
<NodeRenderer key={nodeId} nodeId={nodeId} />
));
};
const NodeRenderer = ({ nodeId }: { nodeId: AnyNode["id"] }) => {
const node = useScene((state) => state.nodes[nodeId]);
if (!node) return null;
return (
<>
{node.type === "level" && <LevelRenderer node={node} />}
{/* {node.type === "item" && <ItemRenderer node={node} />} */}
{node.type === "wall" && <WallRenderer node={node} />}
</>
);
};
const LevelRenderer = ({ node }: { node: LevelNode }) => {
const ref = useRef<THREE.Group>(null!);
// useRegistry(node.id, node.type, ref);
return (
<group ref={ref}>
<mesh receiveShadow>
<boxGeometry args={[10, 0.1, 10]} />
<meshStandardMaterial color="orange" />
</mesh>
{node.children.map((childId) => (
<NodeRenderer key={childId} nodeId={childId} />
))}
</group>
);
};
const WallRenderer = ({ node }: { node: WallNode }) => {
const ref = useRef<THREE.Mesh>(null!);
console.log("node", node);
// useRegistry(node.id, "wall", ref);
return (
<mesh ref={ref} castShadow receiveShadow>
{/* WallSystem will replace this geometry in the next frame */}
<boxGeometry args={[1, 2, 0.1]} />
<meshStandardMaterial color="lightgray" />
{/* If you want windows to be inside the wall's local coordinate system:
render children here.
*/}
{/* {node.children.map((childId) => (
<NodeRenderer key={childId} nodeId={childId} />
))} */}
</mesh>
);
};