@kiberon-labs/behave-graph-scene 1.0.0 → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.storybook/main.ts +18 -0
- package/.storybook/preview.ts +16 -0
- package/.storybook/vscode.css +822 -0
- package/.turbo/turbo-build.log +8 -0
- package/CHANGELOG.md +84 -0
- package/LICENSE +6 -0
- package/README.md +13 -0
- package/dist/Abstractions/Drivers/DummyScene.d.ts +64 -0
- package/dist/Abstractions/Drivers/DummyScene.d.ts.map +1 -0
- package/dist/Abstractions/Drivers/DummyScene.js +115 -0
- package/dist/Abstractions/Drivers/DummyScene.js.map +1 -0
- package/dist/Abstractions/IScene.d.ts +75 -0
- package/dist/Abstractions/IScene.d.ts.map +1 -0
- package/dist/Abstractions/IScene.js +19 -0
- package/dist/Abstractions/IScene.js.map +1 -0
- package/dist/GLTFJson.d.ts +33 -0
- package/dist/GLTFJson.d.ts.map +1 -0
- package/dist/Nodes/Actions/AddLight.d.ts +21 -0
- package/dist/Nodes/Actions/AddLight.d.ts.map +1 -0
- package/dist/Nodes/Actions/AddLight.js +38 -0
- package/dist/Nodes/Actions/AddLight.js.map +1 -0
- package/dist/Nodes/Actions/CloneMesh.d.ts +16 -0
- package/dist/Nodes/Actions/CloneMesh.d.ts.map +1 -0
- package/dist/Nodes/Actions/CloneMesh.js +28 -0
- package/dist/Nodes/Actions/CloneMesh.js.map +1 -0
- package/dist/Nodes/Actions/CreateMesh.d.ts +22 -0
- package/dist/Nodes/Actions/CreateMesh.d.ts.map +1 -0
- package/dist/Nodes/Actions/CreateMesh.js +44 -0
- package/dist/Nodes/Actions/CreateMesh.js.map +1 -0
- package/dist/Nodes/Actions/DeleteMesh.d.ts +15 -0
- package/dist/Nodes/Actions/DeleteMesh.d.ts.map +1 -0
- package/dist/Nodes/Actions/DeleteMesh.js +27 -0
- package/dist/Nodes/Actions/DeleteMesh.js.map +1 -0
- package/dist/Nodes/Actions/EaseSceneProperty.d.ts +23 -0
- package/dist/Nodes/Actions/EaseSceneProperty.d.ts.map +1 -0
- package/dist/Nodes/Actions/EaseSceneProperty.js +73 -0
- package/dist/Nodes/Actions/EaseSceneProperty.js.map +1 -0
- package/dist/Nodes/Actions/LookAt.d.ts +16 -0
- package/dist/Nodes/Actions/LookAt.d.ts.map +1 -0
- package/dist/Nodes/Actions/LookAt.js +35 -0
- package/dist/Nodes/Actions/LookAt.js.map +1 -0
- package/dist/Nodes/Actions/MoveTowards.d.ts +21 -0
- package/dist/Nodes/Actions/MoveTowards.d.ts.map +1 -0
- package/dist/Nodes/Actions/MoveTowards.js +46 -0
- package/dist/Nodes/Actions/MoveTowards.js.map +1 -0
- package/dist/Nodes/Actions/RemoveLight.d.ts +15 -0
- package/dist/Nodes/Actions/RemoveLight.d.ts.map +1 -0
- package/dist/Nodes/Actions/RemoveLight.js +27 -0
- package/dist/Nodes/Actions/RemoveLight.js.map +1 -0
- package/dist/Nodes/Actions/SetLightProperty.d.ts +25 -0
- package/dist/Nodes/Actions/SetLightProperty.d.ts.map +1 -0
- package/dist/Nodes/Actions/SetLightProperty.js +64 -0
- package/dist/Nodes/Actions/SetLightProperty.js.map +1 -0
- package/dist/Nodes/Actions/SetMaterialProperty.d.ts +25 -0
- package/dist/Nodes/Actions/SetMaterialProperty.d.ts.map +1 -0
- package/dist/Nodes/Actions/SetMaterialProperty.js +69 -0
- package/dist/Nodes/Actions/SetMaterialProperty.js.map +1 -0
- package/dist/Nodes/Actions/SetMeshPosition.d.ts +18 -0
- package/dist/Nodes/Actions/SetMeshPosition.d.ts.map +1 -0
- package/dist/Nodes/Actions/SetMeshPosition.js +34 -0
- package/dist/Nodes/Actions/SetMeshPosition.js.map +1 -0
- package/dist/Nodes/Actions/SetMeshVisible.d.ts +16 -0
- package/dist/Nodes/Actions/SetMeshVisible.d.ts.map +1 -0
- package/dist/Nodes/Actions/SetMeshVisible.js +28 -0
- package/dist/Nodes/Actions/SetMeshVisible.js.map +1 -0
- package/dist/Nodes/Actions/SetSceneProperty.d.ts +16 -0
- package/dist/Nodes/Actions/SetSceneProperty.d.ts.map +1 -0
- package/dist/Nodes/Actions/SetSceneProperty.js +28 -0
- package/dist/Nodes/Actions/SetSceneProperty.js.map +1 -0
- package/dist/Nodes/Events/OnAnyMeshClicked.d.ts +13 -0
- package/dist/Nodes/Events/OnAnyMeshClicked.d.ts.map +1 -0
- package/dist/Nodes/Events/OnAnyMeshClicked.js +34 -0
- package/dist/Nodes/Events/OnAnyMeshClicked.js.map +1 -0
- package/dist/Nodes/Events/OnSceneChanged.d.ts +12 -0
- package/dist/Nodes/Events/OnSceneChanged.d.ts.map +1 -0
- package/dist/Nodes/Events/OnSceneChanged.js +28 -0
- package/dist/Nodes/Events/OnSceneChanged.js.map +1 -0
- package/dist/Nodes/Events/OnSceneNodeClick.d.ts +18 -0
- package/dist/Nodes/Events/OnSceneNodeClick.d.ts.map +1 -0
- package/dist/Nodes/Events/OnSceneNodeClick.js +39 -0
- package/dist/Nodes/Events/OnSceneNodeClick.js.map +1 -0
- package/dist/Nodes/Logic/ColorNodes.d.ts +23 -0
- package/dist/Nodes/Logic/ColorNodes.d.ts.map +1 -0
- package/dist/Nodes/Logic/ColorNodes.js +137 -0
- package/dist/Nodes/Logic/ColorNodes.js.map +1 -0
- package/dist/Nodes/Logic/EulerNodes.d.ts +22 -0
- package/dist/Nodes/Logic/EulerNodes.d.ts.map +1 -0
- package/dist/Nodes/Logic/EulerNodes.js +132 -0
- package/dist/Nodes/Logic/EulerNodes.js.map +1 -0
- package/dist/Nodes/Logic/Mat3Nodes.d.ts +31 -0
- package/dist/Nodes/Logic/Mat3Nodes.d.ts.map +1 -0
- package/dist/Nodes/Logic/Mat3Nodes.js +199 -0
- package/dist/Nodes/Logic/Mat3Nodes.js.map +1 -0
- package/dist/Nodes/Logic/Mat4Nodes.d.ts +38 -0
- package/dist/Nodes/Logic/Mat4Nodes.d.ts.map +1 -0
- package/dist/Nodes/Logic/Mat4Nodes.js +267 -0
- package/dist/Nodes/Logic/Mat4Nodes.js.map +1 -0
- package/dist/Nodes/Logic/QuatNodes.d.ts +28 -0
- package/dist/Nodes/Logic/QuatNodes.d.ts.map +1 -0
- package/dist/Nodes/Logic/QuatNodes.js +173 -0
- package/dist/Nodes/Logic/QuatNodes.js.map +1 -0
- package/dist/Nodes/Logic/Vec2Nodes.d.ts +22 -0
- package/dist/Nodes/Logic/Vec2Nodes.d.ts.map +1 -0
- package/dist/Nodes/Logic/Vec2Nodes.js +115 -0
- package/dist/Nodes/Logic/Vec2Nodes.js.map +1 -0
- package/dist/Nodes/Logic/Vec3Nodes.d.ts +23 -0
- package/dist/Nodes/Logic/Vec3Nodes.d.ts.map +1 -0
- package/dist/Nodes/Logic/Vec3Nodes.js +137 -0
- package/dist/Nodes/Logic/Vec3Nodes.js.map +1 -0
- package/dist/Nodes/Logic/Vec4Nodes.d.ts +22 -0
- package/dist/Nodes/Logic/Vec4Nodes.d.ts.map +1 -0
- package/dist/Nodes/Logic/Vec4Nodes.js +132 -0
- package/dist/Nodes/Logic/Vec4Nodes.js.map +1 -0
- package/dist/Nodes/Logic/VecElements.d.ts +9 -0
- package/dist/Nodes/Logic/VecElements.d.ts.map +1 -0
- package/dist/Nodes/Logic/VecElements.js +22 -0
- package/dist/Nodes/Logic/VecElements.js.map +1 -0
- package/dist/Nodes/Queries/GetDistanceBetween.d.ts +18 -0
- package/dist/Nodes/Queries/GetDistanceBetween.d.ts.map +1 -0
- package/dist/Nodes/Queries/GetDistanceBetween.js +30 -0
- package/dist/Nodes/Queries/GetDistanceBetween.js.map +1 -0
- package/dist/Nodes/Queries/GetLightProperty.d.ts +23 -0
- package/dist/Nodes/Queries/GetLightProperty.d.ts.map +1 -0
- package/dist/Nodes/Queries/GetLightProperty.js +68 -0
- package/dist/Nodes/Queries/GetLightProperty.js.map +1 -0
- package/dist/Nodes/Queries/GetMaterialProperty.d.ts +23 -0
- package/dist/Nodes/Queries/GetMaterialProperty.d.ts.map +1 -0
- package/dist/Nodes/Queries/GetMaterialProperty.js +69 -0
- package/dist/Nodes/Queries/GetMaterialProperty.js.map +1 -0
- package/dist/Nodes/Queries/GetMeshPosition.d.ts +16 -0
- package/dist/Nodes/Queries/GetMeshPosition.d.ts.map +1 -0
- package/dist/Nodes/Queries/GetMeshPosition.js +29 -0
- package/dist/Nodes/Queries/GetMeshPosition.js.map +1 -0
- package/dist/Nodes/Queries/GetSceneProperty.d.ts +14 -0
- package/dist/Nodes/Queries/GetSceneProperty.d.ts.map +1 -0
- package/dist/Nodes/Queries/GetSceneProperty.js +23 -0
- package/dist/Nodes/Queries/GetSceneProperty.js.map +1 -0
- package/dist/Values/ColorValue.d.ts +7 -0
- package/dist/Values/ColorValue.d.ts.map +1 -0
- package/dist/Values/ColorValue.js +20 -0
- package/dist/Values/ColorValue.js.map +1 -0
- package/dist/Values/EulerValue.d.ts +7 -0
- package/dist/Values/EulerValue.d.ts.map +1 -0
- package/dist/Values/EulerValue.js +20 -0
- package/dist/Values/EulerValue.js.map +1 -0
- package/dist/Values/Internal/Mat3.d.ts +43 -0
- package/dist/Values/Internal/Mat3.d.ts.map +1 -0
- package/dist/Values/Internal/Mat3.js +276 -0
- package/dist/Values/Internal/Mat3.js.map +1 -0
- package/dist/Values/Internal/Mat4.d.ts +53 -0
- package/dist/Values/Internal/Mat4.d.ts.map +1 -0
- package/dist/Values/Internal/Mat4.js +443 -0
- package/dist/Values/Internal/Mat4.js.map +1 -0
- package/dist/Values/Internal/Vec2.d.ts +25 -0
- package/dist/Values/Internal/Vec2.d.ts.map +1 -0
- package/dist/Values/Internal/Vec2.js +64 -0
- package/dist/Values/Internal/Vec2.js.map +1 -0
- package/dist/Values/Internal/Vec3.d.ts +38 -0
- package/dist/Values/Internal/Vec3.d.ts.map +1 -0
- package/dist/Values/Internal/Vec3.js +157 -0
- package/dist/Values/Internal/Vec3.js.map +1 -0
- package/dist/Values/Internal/Vec4.d.ts +49 -0
- package/dist/Values/Internal/Vec4.d.ts.map +1 -0
- package/dist/Values/Internal/Vec4.js +190 -0
- package/dist/Values/Internal/Vec4.js.map +1 -0
- package/dist/Values/Mat3Value.d.ts +7 -0
- package/dist/Values/Mat3Value.d.ts.map +1 -0
- package/dist/Values/Mat3Value.js +16 -0
- package/dist/Values/Mat3Value.js.map +1 -0
- package/dist/Values/Mat4Value.d.ts +7 -0
- package/dist/Values/Mat4Value.d.ts.map +1 -0
- package/dist/Values/Mat4Value.js +16 -0
- package/dist/Values/Mat4Value.js.map +1 -0
- package/dist/Values/QuatValue.d.ts +7 -0
- package/dist/Values/QuatValue.d.ts.map +1 -0
- package/dist/Values/QuatValue.js +21 -0
- package/dist/Values/QuatValue.js.map +1 -0
- package/dist/Values/Vec2Value.d.ts +7 -0
- package/dist/Values/Vec2Value.d.ts.map +1 -0
- package/dist/Values/Vec2Value.js +16 -0
- package/dist/Values/Vec2Value.js.map +1 -0
- package/dist/Values/Vec3Value.d.ts +7 -0
- package/dist/Values/Vec3Value.d.ts.map +1 -0
- package/dist/Values/Vec3Value.js +20 -0
- package/dist/Values/Vec3Value.js.map +1 -0
- package/dist/Values/Vec4Value.d.ts +7 -0
- package/dist/Values/Vec4Value.d.ts.map +1 -0
- package/dist/Values/Vec4Value.js +21 -0
- package/dist/Values/Vec4Value.js.map +1 -0
- package/dist/_virtual/rolldown_runtime.js +35 -0
- package/dist/behave-graph.manifest.json +6082 -0
- package/dist/buildScene.d.ts +74 -0
- package/dist/buildScene.d.ts.map +1 -0
- package/dist/buildScene.js +304 -0
- package/dist/buildScene.js.map +1 -0
- package/dist/index.d.ts +57 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +49 -0
- package/dist/manifest.source.d.ts +7 -0
- package/dist/manifest.source.d.ts.map +1 -0
- package/dist/manifest.source.js +54 -0
- package/dist/manifest.source.js.map +1 -0
- package/dist/node_modules/.pnpm/react@19.2.3/node_modules/react/cjs/react-jsx-runtime.development.js +207 -0
- package/dist/node_modules/.pnpm/react@19.2.3/node_modules/react/cjs/react-jsx-runtime.development.js.map +1 -0
- package/dist/node_modules/.pnpm/react@19.2.3/node_modules/react/cjs/react-jsx-runtime.production.js +40 -0
- package/dist/node_modules/.pnpm/react@19.2.3/node_modules/react/cjs/react-jsx-runtime.production.js.map +1 -0
- package/dist/node_modules/.pnpm/react@19.2.3/node_modules/react/cjs/react.development.js +766 -0
- package/dist/node_modules/.pnpm/react@19.2.3/node_modules/react/cjs/react.development.js.map +1 -0
- package/dist/node_modules/.pnpm/react@19.2.3/node_modules/react/cjs/react.production.js +367 -0
- package/dist/node_modules/.pnpm/react@19.2.3/node_modules/react/cjs/react.production.js.map +1 -0
- package/dist/node_modules/.pnpm/react@19.2.3/node_modules/react/index.js +15 -0
- package/dist/node_modules/.pnpm/react@19.2.3/node_modules/react/index.js.map +1 -0
- package/dist/node_modules/.pnpm/react@19.2.3/node_modules/react/jsx-runtime.js +15 -0
- package/dist/node_modules/.pnpm/react@19.2.3/node_modules/react/jsx-runtime.js.map +1 -0
- package/dist/packages/nodes/scene/package.js +7 -0
- package/dist/packages/nodes/scene/package.js.map +1 -0
- package/dist/registerSceneProfile.d.ts +10 -0
- package/dist/registerSceneProfile.d.ts.map +1 -0
- package/dist/registerSceneProfile.js +112 -0
- package/dist/registerSceneProfile.js.map +1 -0
- package/dist/ui/controls/vec3.d.ts +9 -0
- package/dist/ui/controls/vec3.d.ts.map +1 -0
- package/dist/ui/controls/vec3.js +99 -0
- package/dist/ui/controls/vec3.js.map +1 -0
- package/package.json +42 -13
- package/src/Abstractions/Drivers/DummyScene.ts +110 -2
- package/src/Abstractions/IScene.ts +74 -3
- package/src/Nodes/Actions/AddLight.ts +46 -0
- package/src/Nodes/Actions/CloneMesh.ts +31 -0
- package/src/Nodes/Actions/CreateMesh.ts +47 -0
- package/src/Nodes/Actions/DeleteMesh.ts +29 -0
- package/src/Nodes/Actions/EaseSceneProperty.ts +6 -2
- package/src/Nodes/Actions/LookAt.ts +34 -0
- package/src/Nodes/Actions/MoveTowards.ts +55 -0
- package/src/Nodes/Actions/RemoveLight.ts +29 -0
- package/src/Nodes/Actions/SetLightProperty.ts +60 -0
- package/src/Nodes/Actions/SetMaterialProperty.ts +62 -0
- package/src/Nodes/Actions/SetMeshPosition.ts +37 -0
- package/src/Nodes/Actions/SetMeshVisible.ts +31 -0
- package/src/Nodes/Actions/SetSceneProperty.ts +3 -5
- package/src/Nodes/Events/OnAnyMeshClicked.ts +48 -0
- package/src/Nodes/Events/OnSceneChanged.ts +43 -0
- package/src/Nodes/Events/OnSceneNodeClick.ts +3 -3
- package/src/Nodes/Logic/Mat3Nodes.ts +0 -10
- package/src/Nodes/Logic/QuatNodes.ts +11 -11
- package/src/Nodes/Queries/GetDistanceBetween.ts +37 -0
- package/src/Nodes/Queries/GetLightProperty.ts +53 -0
- package/src/Nodes/Queries/GetMaterialProperty.ts +55 -0
- package/src/Nodes/Queries/GetMeshPosition.ts +32 -0
- package/src/Nodes/Queries/GetSceneProperty.ts +4 -5
- package/src/Values/Internal/Mat3.ts +3 -3
- package/src/Values/Internal/Mat4.ts +5 -4
- package/src/Values/Internal/Vec3.ts +5 -4
- package/src/Values/Internal/Vec4.ts +3 -2
- package/src/buildScene.ts +36 -2
- package/src/index.ts +26 -2
- package/src/manifest.source.ts +61 -0
- package/src/registerSceneProfile.ts +41 -4
- package/src/ui/controls/vec3.tsx +69 -0
- package/stories/click.stories.tsx +112 -0
- package/stories/components/DemoScene.ts +610 -0
- package/stories/components/SceneViewer.tsx +204 -0
- package/stories/components/SceneViewerPanel.tsx +41 -0
- package/stories/data/clickDemo.json +94 -0
- package/stories/data/rotate.json +402 -0
- package/stories/index.stories.tsx +90 -0
- package/stories/plugin/sceneViewerPlugin.tsx +88 -0
- package/tests/graphs/logic/Color.json +53 -53
- package/tests/graphs/logic/Euler.json +53 -53
- package/tests/graphs/logic/Quaternion.json +56 -56
- package/tests/graphs/logic/Vector2.json +50 -50
- package/tests/graphs/logic/Vector3.json +53 -53
- package/tests/graphs/logic/Vector4.json +56 -56
- package/tests/manifest.test.ts +65 -0
- package/tests/readSceneGraphs.test.ts +8 -1
- package/tests/registerSceneProfile.test.ts +6 -5
- package/tests/tsconfig.json +10 -10
- package/tsconfig.json +61 -54
- package/tsdown.config.ts +5 -1
- package/vite.config.js +7 -0
- package/src/Values/Internal/Mat2.ts +0 -214
- package/src/loadScene.ts +0 -81
|
@@ -0,0 +1,204 @@
|
|
|
1
|
+
import { useEffect, useRef } from 'react';
|
|
2
|
+
import {
|
|
3
|
+
PerspectiveCamera,
|
|
4
|
+
WebGLRenderer,
|
|
5
|
+
DirectionalLight,
|
|
6
|
+
AmbientLight,
|
|
7
|
+
GridHelper,
|
|
8
|
+
AxesHelper,
|
|
9
|
+
Color,
|
|
10
|
+
Raycaster,
|
|
11
|
+
Vector2,
|
|
12
|
+
Mesh
|
|
13
|
+
} from 'three';
|
|
14
|
+
import { OrbitControls } from 'three-stdlib';
|
|
15
|
+
import Stats from 'three/examples/jsm/libs/stats.module.js';
|
|
16
|
+
import type { DemoScene } from './DemoScene';
|
|
17
|
+
|
|
18
|
+
interface SceneViewerProps {
|
|
19
|
+
scene: DemoScene;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
export const SceneViewer = ({ scene }: SceneViewerProps) => {
|
|
23
|
+
const containerRef = useRef<HTMLDivElement>(null);
|
|
24
|
+
const rendererRef = useRef<WebGLRenderer | null>(null);
|
|
25
|
+
const cameraRef = useRef<PerspectiveCamera | null>(null);
|
|
26
|
+
const controlsRef = useRef<OrbitControls | null>(null);
|
|
27
|
+
const animationFrameRef = useRef<number | null>(null);
|
|
28
|
+
const statsRef = useRef<Stats | null>(null);
|
|
29
|
+
|
|
30
|
+
useEffect(() => {
|
|
31
|
+
if (!containerRef.current) return;
|
|
32
|
+
|
|
33
|
+
// Use the scene from props
|
|
34
|
+
const threeScene = scene.scene;
|
|
35
|
+
threeScene.background = new Color(0x1e1e1e);
|
|
36
|
+
|
|
37
|
+
// Setup camera
|
|
38
|
+
const camera = new PerspectiveCamera(
|
|
39
|
+
75,
|
|
40
|
+
containerRef.current.clientWidth / containerRef.current.clientHeight,
|
|
41
|
+
0.1,
|
|
42
|
+
1000
|
|
43
|
+
);
|
|
44
|
+
camera.position.set(8, 6, 8);
|
|
45
|
+
camera.lookAt(0, 0, 0);
|
|
46
|
+
cameraRef.current = camera;
|
|
47
|
+
|
|
48
|
+
// Setup renderer
|
|
49
|
+
const renderer = new WebGLRenderer({ antialias: true });
|
|
50
|
+
renderer.setSize(
|
|
51
|
+
containerRef.current.clientWidth,
|
|
52
|
+
containerRef.current.clientHeight
|
|
53
|
+
);
|
|
54
|
+
renderer.setPixelRatio(window.devicePixelRatio);
|
|
55
|
+
containerRef.current.appendChild(renderer.domElement);
|
|
56
|
+
rendererRef.current = renderer;
|
|
57
|
+
|
|
58
|
+
// Setup orbit controls
|
|
59
|
+
const controls = new OrbitControls(camera, renderer.domElement);
|
|
60
|
+
controls.enableDamping = true;
|
|
61
|
+
controls.dampingFactor = 0.05;
|
|
62
|
+
controls.screenSpacePanning = false;
|
|
63
|
+
controls.minDistance = 3;
|
|
64
|
+
controls.maxDistance = 50;
|
|
65
|
+
controls.maxPolarAngle = Math.PI / 2;
|
|
66
|
+
controlsRef.current = controls;
|
|
67
|
+
|
|
68
|
+
// Setup raycaster for mesh click detection
|
|
69
|
+
const raycaster = new Raycaster();
|
|
70
|
+
const pointer = new Vector2();
|
|
71
|
+
|
|
72
|
+
const handlePointerDown = (event: PointerEvent) => {
|
|
73
|
+
if (!containerRef.current) return;
|
|
74
|
+
|
|
75
|
+
const rect = renderer.domElement.getBoundingClientRect();
|
|
76
|
+
pointer.x = ((event.clientX - rect.left) / rect.width) * 2 - 1;
|
|
77
|
+
pointer.y = -((event.clientY - rect.top) / rect.height) * 2 + 1;
|
|
78
|
+
|
|
79
|
+
raycaster.setFromCamera(pointer, camera);
|
|
80
|
+
|
|
81
|
+
// Only raycast against registered mesh objects, not helpers/lights
|
|
82
|
+
const meshes = Array.from(threeScene.children).filter(
|
|
83
|
+
(child): child is Mesh => child instanceof Mesh
|
|
84
|
+
);
|
|
85
|
+
|
|
86
|
+
const intersects = raycaster.intersectObjects(meshes, true);
|
|
87
|
+
|
|
88
|
+
for (const hit of intersects) {
|
|
89
|
+
// Walk up to find the nearest named Mesh
|
|
90
|
+
let obj = hit.object;
|
|
91
|
+
while (obj) {
|
|
92
|
+
if (obj instanceof Mesh && obj.name) {
|
|
93
|
+
scene.triggerAnyMeshClick(obj.name);
|
|
94
|
+
return;
|
|
95
|
+
}
|
|
96
|
+
if (obj.parent) {
|
|
97
|
+
obj = obj.parent;
|
|
98
|
+
} else {
|
|
99
|
+
break;
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
};
|
|
104
|
+
|
|
105
|
+
renderer.domElement.addEventListener('pointerdown', handlePointerDown);
|
|
106
|
+
|
|
107
|
+
// Setup Stats monitor
|
|
108
|
+
const stats = new Stats();
|
|
109
|
+
// Style the stats panel to fit within the container
|
|
110
|
+
stats.dom.style.position = 'absolute';
|
|
111
|
+
stats.dom.style.top = '0';
|
|
112
|
+
stats.dom.style.left = '0';
|
|
113
|
+
stats.dom.style.zIndex = '100';
|
|
114
|
+
containerRef.current.appendChild(stats.dom);
|
|
115
|
+
statsRef.current = stats;
|
|
116
|
+
|
|
117
|
+
// Add lights
|
|
118
|
+
const ambientLight = new AmbientLight(0x404040, 2);
|
|
119
|
+
threeScene.add(ambientLight);
|
|
120
|
+
|
|
121
|
+
const directionalLight = new DirectionalLight(0xffffff, 1);
|
|
122
|
+
directionalLight.position.set(5, 10, 7.5);
|
|
123
|
+
threeScene.add(directionalLight);
|
|
124
|
+
|
|
125
|
+
const directionalLight2 = new DirectionalLight(0x4466ff, 0.5);
|
|
126
|
+
directionalLight2.position.set(-5, 5, -5);
|
|
127
|
+
threeScene.add(directionalLight2);
|
|
128
|
+
|
|
129
|
+
// Add grid and axes helpers
|
|
130
|
+
const gridHelper = new GridHelper(20, 20, 0x444444, 0x222222);
|
|
131
|
+
threeScene.add(gridHelper);
|
|
132
|
+
|
|
133
|
+
const axesHelper = new AxesHelper(5);
|
|
134
|
+
threeScene.add(axesHelper);
|
|
135
|
+
|
|
136
|
+
// Animation loop
|
|
137
|
+
const animate = () => {
|
|
138
|
+
animationFrameRef.current = requestAnimationFrame(animate);
|
|
139
|
+
|
|
140
|
+
stats.update();
|
|
141
|
+
// Update controls
|
|
142
|
+
controls.update();
|
|
143
|
+
|
|
144
|
+
renderer.render(threeScene, camera);
|
|
145
|
+
};
|
|
146
|
+
animate();
|
|
147
|
+
|
|
148
|
+
// Handle container resize using ResizeObserver
|
|
149
|
+
const handleResize = () => {
|
|
150
|
+
if (!containerRef.current || !camera || !renderer) return;
|
|
151
|
+
|
|
152
|
+
const width = containerRef.current.clientWidth;
|
|
153
|
+
const height = containerRef.current.clientHeight;
|
|
154
|
+
|
|
155
|
+
camera.aspect = width / height;
|
|
156
|
+
camera.updateProjectionMatrix();
|
|
157
|
+
|
|
158
|
+
renderer.setSize(width, height);
|
|
159
|
+
};
|
|
160
|
+
|
|
161
|
+
// Use ResizeObserver to detect container size changes
|
|
162
|
+
const resizeObserver = new ResizeObserver(() => {
|
|
163
|
+
handleResize();
|
|
164
|
+
});
|
|
165
|
+
|
|
166
|
+
resizeObserver.observe(containerRef.current);
|
|
167
|
+
|
|
168
|
+
// Cleanup
|
|
169
|
+
return () => {
|
|
170
|
+
resizeObserver.disconnect();
|
|
171
|
+
|
|
172
|
+
renderer.domElement.removeEventListener('pointerdown', handlePointerDown);
|
|
173
|
+
|
|
174
|
+
if (animationFrameRef.current) {
|
|
175
|
+
cancelAnimationFrame(animationFrameRef.current);
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
if (statsRef.current && containerRef.current) {
|
|
179
|
+
containerRef.current.removeChild(statsRef.current.dom);
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
if (controlsRef.current) {
|
|
183
|
+
controlsRef.current.dispose();
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
if (rendererRef.current && containerRef.current) {
|
|
187
|
+
containerRef.current.removeChild(rendererRef.current.domElement);
|
|
188
|
+
rendererRef.current.dispose();
|
|
189
|
+
}
|
|
190
|
+
};
|
|
191
|
+
}, [scene]);
|
|
192
|
+
|
|
193
|
+
return (
|
|
194
|
+
<div
|
|
195
|
+
ref={containerRef}
|
|
196
|
+
style={{
|
|
197
|
+
width: '100%',
|
|
198
|
+
height: '100%',
|
|
199
|
+
position: 'relative',
|
|
200
|
+
overflow: 'hidden'
|
|
201
|
+
}}
|
|
202
|
+
/>
|
|
203
|
+
);
|
|
204
|
+
};
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { SceneViewer } from './SceneViewer';
|
|
2
|
+
import type { DemoScene } from './DemoScene';
|
|
3
|
+
|
|
4
|
+
interface SceneViewerPanelProps {
|
|
5
|
+
scene: DemoScene;
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
export const SceneViewerPanel = ({ scene }: SceneViewerPanelProps) => {
|
|
9
|
+
return (
|
|
10
|
+
<div
|
|
11
|
+
style={{
|
|
12
|
+
width: '100%',
|
|
13
|
+
height: '100%',
|
|
14
|
+
display: 'flex',
|
|
15
|
+
flexDirection: 'column',
|
|
16
|
+
backgroundColor: '#1e1e1e'
|
|
17
|
+
}}
|
|
18
|
+
>
|
|
19
|
+
<div style={{ flex: 1, position: 'relative' }}>
|
|
20
|
+
<SceneViewer scene={scene} />
|
|
21
|
+
</div>
|
|
22
|
+
<div
|
|
23
|
+
style={{
|
|
24
|
+
padding: '6px 12px',
|
|
25
|
+
borderTop: '1px solid #3e3e3e',
|
|
26
|
+
backgroundColor: '#252525',
|
|
27
|
+
color: '#888',
|
|
28
|
+
fontSize: '11px',
|
|
29
|
+
display: 'flex',
|
|
30
|
+
justifyContent: 'space-between'
|
|
31
|
+
}}
|
|
32
|
+
>
|
|
33
|
+
<span>Demo Scene - 4 objects with animation</span>
|
|
34
|
+
<span>
|
|
35
|
+
Left click + drag to rotate • Right click + drag to pan • Scroll to
|
|
36
|
+
zoom
|
|
37
|
+
</span>
|
|
38
|
+
</div>
|
|
39
|
+
</div>
|
|
40
|
+
);
|
|
41
|
+
};
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
{
|
|
2
|
+
"v": "1.0.0",
|
|
3
|
+
"name": "Click Demo",
|
|
4
|
+
"annotations": {},
|
|
5
|
+
"data": {},
|
|
6
|
+
"flow": {
|
|
7
|
+
"nodes": [
|
|
8
|
+
{
|
|
9
|
+
"id": "click-event-1",
|
|
10
|
+
"type": "scene/onAnyMeshClicked",
|
|
11
|
+
"flows": {
|
|
12
|
+
"flow": {
|
|
13
|
+
"nodeId": "log-click-1",
|
|
14
|
+
"socket": "flow"
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
},
|
|
18
|
+
{
|
|
19
|
+
"id": "log-click-1",
|
|
20
|
+
"type": "debug/log",
|
|
21
|
+
"parameters": {
|
|
22
|
+
"text": {
|
|
23
|
+
"link": {
|
|
24
|
+
"nodeId": "click-event-1",
|
|
25
|
+
"socket": "meshName"
|
|
26
|
+
}
|
|
27
|
+
},
|
|
28
|
+
"severity": {
|
|
29
|
+
"value": "info"
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
],
|
|
34
|
+
"variables": [],
|
|
35
|
+
"customEvents": []
|
|
36
|
+
},
|
|
37
|
+
"nodes": [
|
|
38
|
+
{
|
|
39
|
+
"id": "click-event-1",
|
|
40
|
+
"type": "behaveNode",
|
|
41
|
+
"position": {
|
|
42
|
+
"x": 200,
|
|
43
|
+
"y": 200
|
|
44
|
+
},
|
|
45
|
+
"data": {
|
|
46
|
+
"configuration": {},
|
|
47
|
+
"type": "scene/onAnyMeshClicked",
|
|
48
|
+
"ports": {}
|
|
49
|
+
},
|
|
50
|
+
"width": 160,
|
|
51
|
+
"height": 104
|
|
52
|
+
},
|
|
53
|
+
{
|
|
54
|
+
"id": "log-click-1",
|
|
55
|
+
"type": "behaveNode",
|
|
56
|
+
"position": {
|
|
57
|
+
"x": 500,
|
|
58
|
+
"y": 200
|
|
59
|
+
},
|
|
60
|
+
"data": {
|
|
61
|
+
"configuration": {},
|
|
62
|
+
"type": "debug/log",
|
|
63
|
+
"ports": {
|
|
64
|
+
"severity": "info"
|
|
65
|
+
}
|
|
66
|
+
},
|
|
67
|
+
"width": 160,
|
|
68
|
+
"height": 136
|
|
69
|
+
}
|
|
70
|
+
],
|
|
71
|
+
"edges": [
|
|
72
|
+
{
|
|
73
|
+
"id": "edge-flow-1",
|
|
74
|
+
"source": "click-event-1",
|
|
75
|
+
"target": "log-click-1",
|
|
76
|
+
"sourceHandle": "flow",
|
|
77
|
+
"targetHandle": "flow"
|
|
78
|
+
},
|
|
79
|
+
{
|
|
80
|
+
"id": "edge-mesh-name-1",
|
|
81
|
+
"source": "click-event-1",
|
|
82
|
+
"target": "log-click-1",
|
|
83
|
+
"sourceHandle": "meshName",
|
|
84
|
+
"targetHandle": "text"
|
|
85
|
+
}
|
|
86
|
+
],
|
|
87
|
+
"user": {
|
|
88
|
+
"viewport": {
|
|
89
|
+
"x": 0,
|
|
90
|
+
"y": 0,
|
|
91
|
+
"zoom": 1
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
}
|