@nice2dev/ui-3d 1.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/CHANGELOG.md +25 -0
- package/LICENSE +21 -0
- package/README.md +90 -0
- package/dist/cjs/core/i18n.js +16 -0
- package/dist/cjs/core/i18n.js.map +1 -0
- package/dist/cjs/index.js +11 -0
- package/dist/cjs/index.js.map +1 -0
- package/dist/cjs/model/ModelEditor.js +33 -0
- package/dist/cjs/model/ModelEditor.js.map +1 -0
- package/dist/cjs/model/ModelEditor.module.css.js +6 -0
- package/dist/cjs/model/ModelEditor.module.css.js.map +1 -0
- package/dist/cjs/model/ModelEditorLeftPanel.js +40 -0
- package/dist/cjs/model/ModelEditorLeftPanel.js.map +1 -0
- package/dist/cjs/model/ModelEditorMenuBar.js +14 -0
- package/dist/cjs/model/ModelEditorMenuBar.js.map +1 -0
- package/dist/cjs/model/ModelEditorRightPanel.js +106 -0
- package/dist/cjs/model/ModelEditorRightPanel.js.map +1 -0
- package/dist/cjs/model/ModelEditorSubComponents.js +99 -0
- package/dist/cjs/model/ModelEditorSubComponents.js.map +1 -0
- package/dist/cjs/model/ModelEditorTimeline.js +31 -0
- package/dist/cjs/model/ModelEditorTimeline.js.map +1 -0
- package/dist/cjs/model/ModelEditorToolbar.js +14 -0
- package/dist/cjs/model/ModelEditorToolbar.js.map +1 -0
- package/dist/cjs/model/ModelEditorViewport.js +20 -0
- package/dist/cjs/model/ModelEditorViewport.js.map +1 -0
- package/dist/cjs/model/modelEditorTypes.js +122 -0
- package/dist/cjs/model/modelEditorTypes.js.map +1 -0
- package/dist/cjs/model/useModelEditor.js +1581 -0
- package/dist/cjs/model/useModelEditor.js.map +1 -0
- package/dist/cjs/nice2dev-ui-3d.css +1 -0
- package/dist/esm/core/i18n.js +13 -0
- package/dist/esm/core/i18n.js.map +1 -0
- package/dist/esm/index.js +3 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/model/ModelEditor.js +31 -0
- package/dist/esm/model/ModelEditor.js.map +1 -0
- package/dist/esm/model/ModelEditor.module.css.js +4 -0
- package/dist/esm/model/ModelEditor.module.css.js.map +1 -0
- package/dist/esm/model/ModelEditorLeftPanel.js +38 -0
- package/dist/esm/model/ModelEditorLeftPanel.js.map +1 -0
- package/dist/esm/model/ModelEditorMenuBar.js +12 -0
- package/dist/esm/model/ModelEditorMenuBar.js.map +1 -0
- package/dist/esm/model/ModelEditorRightPanel.js +85 -0
- package/dist/esm/model/ModelEditorRightPanel.js.map +1 -0
- package/dist/esm/model/ModelEditorSubComponents.js +76 -0
- package/dist/esm/model/ModelEditorSubComponents.js.map +1 -0
- package/dist/esm/model/ModelEditorTimeline.js +29 -0
- package/dist/esm/model/ModelEditorTimeline.js.map +1 -0
- package/dist/esm/model/ModelEditorToolbar.js +12 -0
- package/dist/esm/model/ModelEditorToolbar.js.map +1 -0
- package/dist/esm/model/ModelEditorViewport.js +18 -0
- package/dist/esm/model/ModelEditorViewport.js.map +1 -0
- package/dist/esm/model/modelEditorTypes.js +97 -0
- package/dist/esm/model/modelEditorTypes.js.map +1 -0
- package/dist/esm/model/useModelEditor.js +1560 -0
- package/dist/esm/model/useModelEditor.js.map +1 -0
- package/dist/esm/nice2dev-ui-3d.css +1 -0
- package/dist/types/core/i18n.d.ts +27 -0
- package/dist/types/index.d.ts +10 -0
- package/dist/types/model/ModelEditor.d.ts +17 -0
- package/dist/types/model/ModelEditorLeftPanel.d.ts +10 -0
- package/dist/types/model/ModelEditorMenuBar.d.ts +11 -0
- package/dist/types/model/ModelEditorRightPanel.d.ts +11 -0
- package/dist/types/model/ModelEditorSubComponents.d.ts +24 -0
- package/dist/types/model/ModelEditorTimeline.d.ts +11 -0
- package/dist/types/model/ModelEditorToolbar.d.ts +11 -0
- package/dist/types/model/ModelEditorViewport.d.ts +11 -0
- package/dist/types/model/modelEditorTypes.d.ts +52 -0
- package/dist/types/model/useModelEditor.d.ts +125 -0
- package/package.json +89 -0
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
2
|
+
import { useState } from 'react';
|
|
3
|
+
import * as THREE from 'three';
|
|
4
|
+
import styles from './ModelEditor.module.css.js';
|
|
5
|
+
import { DEG } from './modelEditorTypes.js';
|
|
6
|
+
|
|
7
|
+
/* ═══════════════════════════════════════════
|
|
8
|
+
Sub-components
|
|
9
|
+
═══════════════════════════════════════════ */
|
|
10
|
+
/** Vec3 input row for position/scale */
|
|
11
|
+
const Vec3Row = ({ label, value, onChange }) => {
|
|
12
|
+
const [, forceUpdate] = useState(0);
|
|
13
|
+
const set = (axis, v) => {
|
|
14
|
+
const n = parseFloat(v);
|
|
15
|
+
if (!isNaN(n)) {
|
|
16
|
+
value[axis] = n;
|
|
17
|
+
forceUpdate((x) => x + 1);
|
|
18
|
+
onChange();
|
|
19
|
+
}
|
|
20
|
+
};
|
|
21
|
+
return (jsxs("div", { className: styles.propRow, children: [jsx("span", { className: styles.propLabel, children: label }), jsxs("div", { className: styles.propVec3, children: [jsx("input", { className: styles.propVec3X, value: value.x.toFixed(3), onChange: (e) => set("x", e.target.value) }), jsx("input", { className: styles.propVec3Y, value: value.y.toFixed(3), onChange: (e) => set("y", e.target.value) }), jsx("input", { className: styles.propVec3Z, value: value.z.toFixed(3), onChange: (e) => set("z", e.target.value) })] })] }));
|
|
22
|
+
};
|
|
23
|
+
/** Vec3 input row for rotation (shows degrees) */
|
|
24
|
+
const Vec3RowDeg = ({ label, value, onChange }) => {
|
|
25
|
+
const [, forceUpdate] = useState(0);
|
|
26
|
+
const set = (axis, v) => {
|
|
27
|
+
const n = parseFloat(v);
|
|
28
|
+
if (!isNaN(n)) {
|
|
29
|
+
value[axis] = n / DEG;
|
|
30
|
+
forceUpdate((x) => x + 1);
|
|
31
|
+
onChange();
|
|
32
|
+
}
|
|
33
|
+
};
|
|
34
|
+
return (jsxs("div", { className: styles.propRow, children: [jsx("span", { className: styles.propLabel, children: label }), jsxs("div", { className: styles.propVec3, children: [jsx("input", { className: styles.propVec3X, value: (value.x * DEG).toFixed(1), onChange: (e) => set("x", e.target.value) }), jsx("input", { className: styles.propVec3Y, value: (value.y * DEG).toFixed(1), onChange: (e) => set("y", e.target.value) }), jsx("input", { className: styles.propVec3Z, value: (value.z * DEG).toFixed(1), onChange: (e) => set("z", e.target.value) })] })] }));
|
|
35
|
+
};
|
|
36
|
+
/** Material card with editable properties */
|
|
37
|
+
const MaterialCard = ({ material, active, onClick, onUpdate }) => {
|
|
38
|
+
var _a, _b, _c, _d;
|
|
39
|
+
const mat = material;
|
|
40
|
+
const hasColor = "color" in mat;
|
|
41
|
+
const hasMetalness = "metalness" in mat;
|
|
42
|
+
const hasRoughness = "roughness" in mat;
|
|
43
|
+
const hasEmissive = "emissive" in mat;
|
|
44
|
+
const hasMap = "map" in mat;
|
|
45
|
+
const hasNormalMap = "normalMap" in mat;
|
|
46
|
+
const setColor = (hex) => {
|
|
47
|
+
if (hasColor) {
|
|
48
|
+
mat.color.set(hex);
|
|
49
|
+
mat.needsUpdate = true;
|
|
50
|
+
onUpdate();
|
|
51
|
+
}
|
|
52
|
+
};
|
|
53
|
+
const setNum = (prop, val) => {
|
|
54
|
+
mat[prop] = val;
|
|
55
|
+
mat.needsUpdate = true;
|
|
56
|
+
onUpdate();
|
|
57
|
+
};
|
|
58
|
+
return (jsxs("div", { className: `${styles.materialCard} ${active ? styles.materialCardActive : ""}`, onClick: onClick, children: [jsx("div", { className: styles.materialHeader, children: jsx("span", { className: styles.materialName, children: mat.name || mat.type }) }), hasColor && (jsxs("div", { className: styles.propRow, children: [jsx("span", { className: styles.propLabel, children: "Color" }), jsx("div", { className: styles.propColorSwatch, style: { background: `#${mat.color.getHexString()}` }, children: jsx("input", { type: "color", value: `#${mat.color.getHexString()}`, onChange: (e) => setColor(e.target.value) }) }), jsxs("span", { style: { fontSize: 10, color: "#888" }, children: ["#", mat.color.getHexString()] })] })), hasMetalness && (jsxs("div", { className: styles.propRow, children: [jsx("span", { className: styles.propLabel, children: "Metal" }), jsx("input", { type: "range", min: 0, max: 1, step: 0.01, value: mat.metalness, onChange: (e) => setNum("metalness", parseFloat(e.target.value)), style: { flex: 1, accentColor: "#5566cc" } }), jsx("span", { style: { fontSize: 9, color: "#888", width: 28, textAlign: "right" }, children: mat.metalness.toFixed(2) })] })), hasRoughness && (jsxs("div", { className: styles.propRow, children: [jsx("span", { className: styles.propLabel, children: "Rough" }), jsx("input", { type: "range", min: 0, max: 1, step: 0.01, value: mat.roughness, onChange: (e) => setNum("roughness", parseFloat(e.target.value)), style: { flex: 1, accentColor: "#5566cc" } }), jsx("span", { style: { fontSize: 9, color: "#888", width: 28, textAlign: "right" }, children: mat.roughness.toFixed(2) })] })), hasEmissive && mat.emissive && (jsxs("div", { className: styles.propRow, children: [jsx("span", { className: styles.propLabel, children: "Emissive" }), jsx("div", { className: styles.propColorSwatch, style: { background: `#${mat.emissive.getHexString()}` }, children: jsx("input", { type: "color", value: `#${mat.emissive.getHexString()}`, onChange: (e) => {
|
|
59
|
+
mat.emissive.set(e.target.value);
|
|
60
|
+
mat.needsUpdate = true;
|
|
61
|
+
onUpdate();
|
|
62
|
+
} }) })] })), jsxs("div", { className: styles.propRow, children: [jsx("span", { className: styles.propLabel, children: "Opacity" }), jsx("input", { type: "range", min: 0, max: 1, step: 0.01, value: mat.opacity, onChange: (e) => {
|
|
63
|
+
const v = parseFloat(e.target.value);
|
|
64
|
+
mat.opacity = v;
|
|
65
|
+
mat.transparent = v < 1;
|
|
66
|
+
mat.needsUpdate = true;
|
|
67
|
+
onUpdate();
|
|
68
|
+
}, style: { flex: 1, accentColor: "#5566cc" } }), jsx("span", { style: { fontSize: 9, color: "#888", width: 28, textAlign: "right" }, children: mat.opacity.toFixed(2) })] }), jsxs("div", { className: styles.propRow, children: [jsx("span", { className: styles.propLabel, children: "Side" }), jsxs("select", { className: styles.propSelect, value: mat.side, onChange: (e) => {
|
|
69
|
+
mat.side = parseInt(e.target.value);
|
|
70
|
+
mat.needsUpdate = true;
|
|
71
|
+
onUpdate();
|
|
72
|
+
}, children: [jsx("option", { value: THREE.FrontSide, children: "Front" }), jsx("option", { value: THREE.BackSide, children: "Back" }), jsx("option", { value: THREE.DoubleSide, children: "Double" })] })] }), hasMap && mat.map && (jsxs("div", { className: styles.textureSlot, children: [jsx("div", { className: styles.textureThumb, children: mat.map.image != null && (jsx("img", { src: (_a = mat.map.image.src) !== null && _a !== void 0 ? _a : "", alt: "diffuse" })) }), jsxs("div", { className: styles.textureInfo, children: [jsx("div", { className: styles.textureName, children: "Diffuse Map" }), jsxs("div", { style: { fontSize: 9, color: "#666" }, children: [(_b = mat.map.image) === null || _b === void 0 ? void 0 : _b.width, "\u00D7", (_c = mat.map.image) === null || _c === void 0 ? void 0 : _c.height] })] })] })), hasNormalMap && mat.normalMap && (jsxs("div", { className: styles.textureSlot, children: [jsx("div", { className: styles.textureThumb, children: mat.normalMap.image != null && (jsx("img", { src: (_d = mat.normalMap.image.src) !== null && _d !== void 0 ? _d : "", alt: "normal" })) }), jsx("div", { className: styles.textureInfo, children: jsx("div", { className: styles.textureName, children: "Normal Map" }) })] }))] }));
|
|
73
|
+
};
|
|
74
|
+
|
|
75
|
+
export { MaterialCard, Vec3Row, Vec3RowDeg };
|
|
76
|
+
//# sourceMappingURL=ModelEditorSubComponents.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ModelEditorSubComponents.js","sources":["../../../src/model/ModelEditorSubComponents.tsx"],"sourcesContent":[null],"names":["_jsxs","_jsx"],"mappings":"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"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
2
|
+
import React from 'react';
|
|
3
|
+
import styles from './ModelEditor.module.css.js';
|
|
4
|
+
import { fmtTime } from './modelEditorTypes.js';
|
|
5
|
+
|
|
6
|
+
const ModelEditorTimeline = React.memo(({ api }) => {
|
|
7
|
+
const { bottomCollapsed, setBottomCollapsed, animations, activeAnimIdx, isPlaying, animTime, animDuration, animSpeed, setAnimSpeed, loopAnim, setLoopAnim, seekAnim, togglePlay, stopAnim, playClip, mergeInputRef, } = api;
|
|
8
|
+
return (jsxs("div", { className: `${styles.bottomPanel} ${bottomCollapsed ? styles.bottomPanelCollapsed : ""}`, children: [jsxs("div", { className: styles.bottomPanelHeader, children: [jsx("span", { className: styles.bottomToggle, onClick: () => setBottomCollapsed((c) => !c), children: bottomCollapsed ? "▶" : "▼" }), jsxs("span", { className: styles.bottomPanelTitle, onClick: () => setBottomCollapsed((c) => !c), children: ["Animation (", animations.length, " clip", animations.length !== 1 ? "s" : "", ")"] }), jsx("div", { className: styles.menuSep }), jsxs("div", { className: styles.transportBar, children: [jsx("button", { className: styles.transportBtn, onClick: () => seekAnim(0), title: "Go to start", children: "\u23EE" }), jsx("button", { className: `${styles.transportBtn} ${isPlaying ? styles.transportBtnActive : ""}`, onClick: togglePlay, title: "Play/Pause (Space)", children: isPlaying ? "⏸" : "▶" }), jsx("button", { className: styles.transportBtn, onClick: stopAnim, title: "Stop", children: "\u23F9" }), jsx("button", { className: `${styles.transportBtn} ${loopAnim ? styles.transportBtnActive : ""}`, onClick: () => setLoopAnim((v) => !v), title: "Loop", children: "\uD83D\uDD01" })] }), jsxs("span", { className: styles.transportTime, children: [fmtTime(animTime), " / ", fmtTime(animDuration)] }), jsx("div", { className: styles.menuSep }), jsx("label", { className: styles.menuLabel, children: "Speed" }), jsx("input", { type: "range", min: 0.1, max: 3, step: 0.1, value: animSpeed, onChange: (e) => setAnimSpeed(parseFloat(e.target.value)), style: { width: 60, accentColor: "#5566cc" } }), jsxs("span", { className: styles.menuLabel, children: [animSpeed.toFixed(1), "\u00D7"] })] }), !bottomCollapsed && (jsxs("div", { className: styles.animListArea, children: [jsxs("div", { className: styles.animList, children: [animations.length === 0 && (jsx("div", { style: { color: "#666", fontSize: 10, padding: 8 }, children: "No animations loaded" })), animations.map((anim, i) => (jsxs("div", { className: `${styles.animItem} ${i === activeAnimIdx ? styles.animItemActive : ""}`, onClick: () => playClip(i), children: [jsx("span", { children: anim.name }), jsxs("span", { className: styles.animDuration, children: [anim.duration.toFixed(1), "s"] })] }, `${anim.name}-${i}`))), jsx("div", { style: { padding: "4px 8px" }, children: jsx("button", { className: styles.btnSecondary, style: { width: "100%", fontSize: 10 }, onClick: () => { var _a; return (_a = mergeInputRef.current) === null || _a === void 0 ? void 0 : _a.click(); }, children: "+ Add Animation File" }) })] }), jsxs("div", { className: styles.timelineArea, children: [jsxs("div", { className: styles.timelineRuler, children: [animDuration > 0 &&
|
|
9
|
+
Array.from({ length: Math.ceil(animDuration) + 1 }, (_, i) => {
|
|
10
|
+
const pct = (i / animDuration) * 100;
|
|
11
|
+
return (jsxs(React.Fragment, { children: [jsx("div", { className: styles.rulerTick, style: { left: `${pct}%` } }), jsxs("span", { className: styles.rulerLabel, style: { left: `${pct}%` }, children: [i, "s"] })] }, i));
|
|
12
|
+
}), animDuration > 0 && (jsx("div", { className: styles.playhead, style: {
|
|
13
|
+
left: `${(animTime / animDuration) * 100}%`,
|
|
14
|
+
height: "100%",
|
|
15
|
+
}, children: jsx("div", { className: styles.playheadHandle }) }))] }), jsx("div", { className: styles.timelineTracks, style: { height: 140, cursor: "pointer" }, onClick: (e) => {
|
|
16
|
+
if (animDuration <= 0)
|
|
17
|
+
return;
|
|
18
|
+
const rect = e.currentTarget.getBoundingClientRect();
|
|
19
|
+
const pct = (e.clientX - rect.left) / rect.width;
|
|
20
|
+
seekAnim(Math.max(0, Math.min(animDuration, pct * animDuration)));
|
|
21
|
+
}, children: animDuration > 0 && (jsx("div", { className: styles.playhead, style: {
|
|
22
|
+
left: `${(animTime / animDuration) * 100}%`,
|
|
23
|
+
height: "100%",
|
|
24
|
+
} })) })] })] }))] }));
|
|
25
|
+
});
|
|
26
|
+
ModelEditorTimeline.displayName = "ModelEditorTimeline";
|
|
27
|
+
|
|
28
|
+
export { ModelEditorTimeline as default };
|
|
29
|
+
//# sourceMappingURL=ModelEditorTimeline.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ModelEditorTimeline.js","sources":["../../../src/model/ModelEditorTimeline.tsx"],"sourcesContent":[null],"names":["_jsxs","_jsx"],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
2
|
+
import React from 'react';
|
|
3
|
+
import styles from './ModelEditor.module.css.js';
|
|
4
|
+
|
|
5
|
+
const ModelEditorToolbar = React.memo(({ api }) => {
|
|
6
|
+
const { transformMode, setTransformMode, snapEnabled, setSnapEnabled, gizmoSpace, setGizmoSpace, rootObjectRef, focusOnObject, setCameraPreset, deleteSelected, duplicateSelected, selectedNode, } = api;
|
|
7
|
+
return (jsxs("div", { className: styles.toolbar, children: [jsx("button", { className: `${styles.toolBtn} ${transformMode === "translate" ? styles.toolBtnActive : ""}`, onClick: () => setTransformMode("translate"), title: "Translate (G)", children: "\u2725" }), jsx("button", { className: `${styles.toolBtn} ${transformMode === "rotate" ? styles.toolBtnActive : ""}`, onClick: () => setTransformMode("rotate"), title: "Rotate (R)", children: "\u21BB" }), jsx("button", { className: `${styles.toolBtn} ${transformMode === "scale" ? styles.toolBtnActive : ""}`, onClick: () => setTransformMode("scale"), title: "Scale (S)", children: "\u2B21" }), jsx("div", { className: styles.toolSep }), jsx("button", { className: `${styles.toolBtn} ${snapEnabled ? styles.toolBtnActive : ""}`, onClick: () => setSnapEnabled((v) => !v), title: `Snap to Grid (${snapEnabled ? "ON" : "OFF"})`, children: "\uD83E\uDDF2" }), jsx("button", { className: styles.toolBtn, onClick: () => setGizmoSpace((s) => (s === "local" ? "world" : "local")), title: `Orientation: ${gizmoSpace}`, children: gizmoSpace === "local" ? "🔶" : "🌐" }), jsx("div", { className: styles.toolSep }), jsx("button", { className: styles.toolBtn, onClick: () => rootObjectRef.current && focusOnObject(rootObjectRef.current), title: "Focus (F)", children: "\u25CE" }), jsx("button", { className: styles.toolBtn, onClick: () => setCameraPreset("front"), title: "Front view (Numpad 1)", children: "1" }), jsx("button", { className: styles.toolBtn, onClick: () => setCameraPreset("right"), title: "Right view (Numpad 3)", children: "3" }), jsx("button", { className: styles.toolBtn, onClick: () => setCameraPreset("top"), title: "Top view (Numpad 7)", children: "7" }), jsx("div", { className: styles.toolSep }), jsx("button", { className: styles.toolBtn, onClick: deleteSelected, title: "Delete selected (Del)", children: "\uD83D\uDDD1" }), jsx("button", { className: styles.toolBtn, onClick: duplicateSelected, title: "Duplicate (Shift+D)", disabled: !selectedNode, children: "\uD83D\uDCCB" })] }));
|
|
8
|
+
});
|
|
9
|
+
ModelEditorToolbar.displayName = "ModelEditorToolbar";
|
|
10
|
+
|
|
11
|
+
export { ModelEditorToolbar as default };
|
|
12
|
+
//# sourceMappingURL=ModelEditorToolbar.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ModelEditorToolbar.js","sources":["../../../src/model/ModelEditorToolbar.tsx"],"sourcesContent":[null],"names":["_jsxs","_jsx"],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { jsxs, Fragment, jsx } from 'react/jsx-runtime';
|
|
2
|
+
import React from 'react';
|
|
3
|
+
import styles from './ModelEditor.module.css.js';
|
|
4
|
+
|
|
5
|
+
const ModelEditorViewport = React.memo(({ api }) => {
|
|
6
|
+
const { mountRef, dragOver, handleDragOver, handleDragLeave, handleDrop, handleViewportClick, handleContextMenu, editorMode, polyCount, meshCount, boneCount, shadingMode, setShadingMode, gizmoSpace, setGizmoSpace, contextMenu, closeContextMenu, addPrimitive, addSceneLight, duplicateSelected, deleteSelected, selectedNode, rootObjectRef, focusOnObject, snapEnabled, setSnapEnabled, } = api;
|
|
7
|
+
return (jsxs(Fragment, { children: [jsxs("div", { ref: mountRef, className: `${styles.viewportContainer} ${dragOver ? styles.dragOver : ""}`, onDragOver: handleDragOver, onDragLeave: handleDragLeave, onDrop: handleDrop, onClick: handleViewportClick, onContextMenu: handleContextMenu, children: [jsxs("div", { className: styles.viewportOverlay, children: [jsxs("span", { className: styles.viewportBadge, children: [editorMode.toUpperCase(), " MODE"] }), jsxs("span", { className: styles.viewportBadge, children: [polyCount.toLocaleString(), " tris \u00B7 ", meshCount, " meshes \u00B7 ", boneCount, " bones"] })] }), jsx("div", { className: styles.viewportShadingBar, children: ["wireframe", "solid", "material", "rendered"].map((m) => (jsx("button", { className: `${styles.shadingBtn} ${shadingMode === m ? styles.shadingBtnActive : ""}`, onClick: (e) => { e.stopPropagation(); setShadingMode(m); }, title: m.charAt(0).toUpperCase() + m.slice(1), children: m === "wireframe" ? "◇" : m === "solid" ? "◆" : m === "material" ? "🎨" : "☀" }, m))) }), jsx("div", { className: styles.viewportGizmoInfo, children: jsx("button", { className: styles.shadingBtn, onClick: (e) => {
|
|
8
|
+
e.stopPropagation();
|
|
9
|
+
setGizmoSpace((s) => (s === "local" ? "world" : "local"));
|
|
10
|
+
}, title: `Orientation: ${gizmoSpace}`, children: gizmoSpace === "local" ? "🔶 Local" : "🌐 World" }) }), dragOver && (jsx("div", { className: styles.viewportDropZone, children: jsx("span", { children: "Drop 3D files here" }) }))] }), contextMenu && (jsxs("div", { className: styles.contextMenu, style: { top: contextMenu.y, left: contextMenu.x }, onClick: closeContextMenu, children: [jsxs("div", { className: styles.contextItem, onClick: () => addPrimitive("cube"), children: [jsx("span", { children: "Add Cube" }), jsx("span", { className: styles.contextKey, children: "Shift+A" })] }), jsx("div", { className: styles.contextItem, onClick: () => addPrimitive("sphere"), children: jsx("span", { children: "Add Sphere" }) }), jsx("div", { className: styles.contextItem, onClick: () => addSceneLight("point"), children: jsx("span", { children: "Add Point Light" }) }), jsx("div", { className: styles.contextSep }), jsxs("div", { className: styles.contextItem, onClick: duplicateSelected, style: !selectedNode ? { opacity: 0.4, pointerEvents: "none" } : {}, children: [jsx("span", { children: "Duplicate" }), jsx("span", { className: styles.contextKey, children: "Shift+D" })] }), jsxs("div", { className: styles.contextItem, onClick: deleteSelected, style: !selectedNode ? { opacity: 0.4, pointerEvents: "none" } : {}, children: [jsx("span", { children: "Delete" }), jsx("span", { className: styles.contextKey, children: "Del" })] }), jsx("div", { className: styles.contextSep }), jsxs("div", { className: styles.contextItem, onClick: () => {
|
|
11
|
+
if (rootObjectRef.current)
|
|
12
|
+
focusOnObject(rootObjectRef.current);
|
|
13
|
+
}, children: [jsx("span", { children: "Focus Camera" }), jsx("span", { className: styles.contextKey, children: "F" })] }), jsx("div", { className: styles.contextItem, onClick: () => setSnapEnabled((v) => !v), children: jsxs("span", { children: [snapEnabled ? "✓ " : "", "Snap to Grid"] }) })] }))] }));
|
|
14
|
+
});
|
|
15
|
+
ModelEditorViewport.displayName = "ModelEditorViewport";
|
|
16
|
+
|
|
17
|
+
export { ModelEditorViewport as default };
|
|
18
|
+
//# sourceMappingURL=ModelEditorViewport.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ModelEditorViewport.js","sources":["../../../src/model/ModelEditorViewport.tsx"],"sourcesContent":[null],"names":["_jsxs","_Fragment","_jsx"],"mappings":"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"}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
import * as THREE from 'three';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Shared types, constants, and helpers for the ModelEditor.
|
|
5
|
+
*/
|
|
6
|
+
/* ═══════════════════════════════════════════
|
|
7
|
+
Constants & helpers
|
|
8
|
+
═══════════════════════════════════════════ */
|
|
9
|
+
const DEG = 180 / Math.PI;
|
|
10
|
+
const fmtTime = (s) => {
|
|
11
|
+
const m = Math.floor(s / 60);
|
|
12
|
+
const sec = (s % 60).toFixed(2);
|
|
13
|
+
return `${m}:${sec.padStart(5, "0")}`;
|
|
14
|
+
};
|
|
15
|
+
const SUPPORTED_EXTENSIONS = [
|
|
16
|
+
".fbx",
|
|
17
|
+
".glb",
|
|
18
|
+
".gltf",
|
|
19
|
+
".obj",
|
|
20
|
+
".mtl",
|
|
21
|
+
".dae",
|
|
22
|
+
".stl",
|
|
23
|
+
".ply",
|
|
24
|
+
".3ds",
|
|
25
|
+
".3mf",
|
|
26
|
+
".amf",
|
|
27
|
+
".pcd",
|
|
28
|
+
".vtk",
|
|
29
|
+
".vtp",
|
|
30
|
+
".wrl",
|
|
31
|
+
".vrml",
|
|
32
|
+
".gcode",
|
|
33
|
+
".svg",
|
|
34
|
+
".usdz",
|
|
35
|
+
];
|
|
36
|
+
/* ═══════════════════════════════════════════
|
|
37
|
+
AI helpers — convert pose3D to AnimationClip
|
|
38
|
+
═══════════════════════════════════════════ */
|
|
39
|
+
/** Standard bone names mapping from pose keypoints */
|
|
40
|
+
const POSE_TO_BONE = {
|
|
41
|
+
nose: "Head",
|
|
42
|
+
left_eye: "Head",
|
|
43
|
+
right_eye: "Head",
|
|
44
|
+
left_ear: "Head",
|
|
45
|
+
right_ear: "Head",
|
|
46
|
+
left_shoulder: "LeftArm",
|
|
47
|
+
right_shoulder: "RightArm",
|
|
48
|
+
left_elbow: "LeftForeArm",
|
|
49
|
+
right_elbow: "RightForeArm",
|
|
50
|
+
left_wrist: "LeftHand",
|
|
51
|
+
right_wrist: "RightHand",
|
|
52
|
+
left_hip: "LeftUpLeg",
|
|
53
|
+
right_hip: "RightUpLeg",
|
|
54
|
+
left_knee: "LeftLeg",
|
|
55
|
+
right_knee: "RightLeg",
|
|
56
|
+
left_ankle: "LeftFoot",
|
|
57
|
+
right_ankle: "RightFoot",
|
|
58
|
+
};
|
|
59
|
+
function pose3dToClip(result) {
|
|
60
|
+
var _a, _b, _c;
|
|
61
|
+
if (!result.frames || result.frames.length === 0)
|
|
62
|
+
return null;
|
|
63
|
+
const fps = result.fps || 30;
|
|
64
|
+
const tracks = [];
|
|
65
|
+
// Group keypoints by bone across all frames
|
|
66
|
+
const boneData = new Map();
|
|
67
|
+
for (const frame of result.frames) {
|
|
68
|
+
const t = (_a = frame.timestamp_sec) !== null && _a !== void 0 ? _a : frame.frame_index / fps;
|
|
69
|
+
// Take first person
|
|
70
|
+
const person = (_b = frame.persons) === null || _b === void 0 ? void 0 : _b[0];
|
|
71
|
+
if (!person)
|
|
72
|
+
continue;
|
|
73
|
+
for (const kp of person.keypoints) {
|
|
74
|
+
const boneName = POSE_TO_BONE[kp.name];
|
|
75
|
+
if (!boneName)
|
|
76
|
+
continue;
|
|
77
|
+
let data = boneData.get(boneName);
|
|
78
|
+
if (!data) {
|
|
79
|
+
data = { times: [], positions: [] };
|
|
80
|
+
boneData.set(boneName, data);
|
|
81
|
+
}
|
|
82
|
+
data.times.push(t);
|
|
83
|
+
// Scale pose coordinates to reasonable 3D space
|
|
84
|
+
data.positions.push(kp.x * 0.01, kp.y * 0.01, kp.z * 0.01);
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
for (const [boneName, data] of boneData) {
|
|
88
|
+
tracks.push(new THREE.VectorKeyframeTrack(`${boneName}.position`, data.times, data.positions));
|
|
89
|
+
}
|
|
90
|
+
if (tracks.length === 0)
|
|
91
|
+
return null;
|
|
92
|
+
const duration = (_c = result.frames[result.frames.length - 1].timestamp_sec) !== null && _c !== void 0 ? _c : result.frame_count / fps;
|
|
93
|
+
return new THREE.AnimationClip("AI_Pose", duration, tracks);
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
export { DEG, POSE_TO_BONE, SUPPORTED_EXTENSIONS, fmtTime, pose3dToClip };
|
|
97
|
+
//# sourceMappingURL=modelEditorTypes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"modelEditorTypes.js","sources":["../../../src/model/modelEditorTypes.ts"],"sourcesContent":[null],"names":[],"mappings":"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"}
|