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