@holoscript/core 7.0.0 → 8.0.1
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/README.md +4 -4
- package/bin/holoscript.cjs +3 -0
- package/dist/GLTFPipeline-N6B6PJ6G.cjs +38 -0
- package/dist/GLTFPipeline-P3WMNYCN.js +17 -0
- package/dist/HoloScriptPlusParser-7FBIFUFC.js +693 -0
- package/dist/HoloScriptPlusParser-A2W7OCN2.cjs +698 -0
- package/dist/HoloScriptPlusParser-F2Z56FJR.js +10 -0
- package/dist/HoloScriptPlusParser-WKHRIH6T.cjs +27 -0
- package/dist/HoloScriptRuntime-CBYJX3LZ.js +10 -0
- package/dist/HoloScriptRuntime-VJ374RER.cjs +19 -0
- package/dist/USDZExporter-3FWJ25JI.cjs +1037 -0
- package/dist/USDZExporter-D2HQLQYK.js +1035 -0
- package/dist/agents/index.cjs +19 -0
- package/dist/agents/index.d.ts +100 -0
- package/dist/agents/index.js +17 -0
- package/dist/chunk-2BSMSUCE.js +1941 -0
- package/dist/chunk-2IWC4FP7.cjs +1189 -0
- package/dist/chunk-2M2DPHKB.js +762 -0
- package/dist/chunk-2X7NGX3M.js +2426 -0
- package/dist/chunk-2YSNA2F2.cjs +1274 -0
- package/dist/chunk-3FOKASKO.cjs +348 -0
- package/dist/chunk-3WZEJHUQ.cjs +116 -0
- package/dist/chunk-4C57PR42.js +468 -0
- package/dist/chunk-4GU5GCIY.js +1384 -0
- package/dist/chunk-4N4SXXWF.js +769 -0
- package/dist/chunk-4PDEPEQW.cjs +41 -0
- package/dist/chunk-4R6SBXDB.js +45 -0
- package/dist/chunk-4SDKXQ4C.js +811 -0
- package/dist/chunk-4V2E7U7Q.cjs +2015 -0
- package/dist/chunk-5FSKKMR7.cjs +2092 -0
- package/dist/chunk-5GLCTO44.js +161 -0
- package/dist/chunk-5H2G27PK.cjs +627 -0
- package/dist/chunk-5JEU52DW.js +382 -0
- package/dist/chunk-5NWINHR5.cjs +689 -0
- package/dist/chunk-5S7RKFGR.cjs +446 -0
- package/dist/chunk-5WUNN6ZN.cjs +428 -0
- package/dist/chunk-6CTRH7HT.cjs +1985 -0
- package/dist/chunk-6EX3I5P4.cjs +130 -0
- package/dist/chunk-6Q7RC2MK.cjs +1418 -0
- package/dist/chunk-7H33U5SM.cjs +413 -0
- package/dist/chunk-7M3PNU2M.cjs +672 -0
- package/dist/chunk-7T25IEZ2.js +449 -0
- package/dist/chunk-7V4JI5TB.cjs +6947 -0
- package/dist/chunk-A6KINLZJ.js +236 -0
- package/dist/chunk-ADADVMXY.js +404 -0
- package/dist/chunk-AIA52I7T.cjs +543 -0
- package/dist/chunk-ALC6K7GL.cjs +4402 -0
- package/dist/chunk-ANXZFVY2.js +113 -0
- package/dist/chunk-AOVGZ25K.cjs +56583 -0
- package/dist/chunk-AVJHHUC5.cjs +718 -0
- package/dist/chunk-BGY3SDG3.js +4396 -0
- package/dist/chunk-BOVPWH4H.js +3857 -0
- package/dist/chunk-BRQJKJGT.cjs +20 -0
- package/dist/chunk-C37BHB7N.cjs +636 -0
- package/dist/chunk-CBJY23VL.js +126 -0
- package/dist/chunk-CCATWPXM.js +778 -0
- package/dist/chunk-CIWWXYHZ.cjs +50 -0
- package/dist/chunk-CMT5NMMS.js +669 -0
- package/dist/chunk-CR4FMIWL.cjs +1049 -0
- package/dist/chunk-CR7XRXRN.cjs +639 -0
- package/dist/chunk-CSD27UNQ.js +2176 -0
- package/dist/chunk-D3STJ56J.js +714 -0
- package/dist/chunk-DAJXW4KX.js +725 -0
- package/dist/chunk-DHO2YRIM.js +756 -0
- package/dist/chunk-DTGBOSEM.cjs +319 -0
- package/dist/chunk-E6XXE66V.js +2252 -0
- package/dist/chunk-E7JP3BS3.cjs +61 -0
- package/dist/chunk-EKBKLK7P.js +1169 -0
- package/dist/chunk-EKYL4PE3.cjs +404 -0
- package/dist/chunk-EXKSFGSX.cjs +274 -0
- package/dist/chunk-EXUP2BUM.cjs +1173 -0
- package/dist/chunk-FDSGHPAK.js +130 -0
- package/dist/chunk-FEWUHQNM.cjs +144 -0
- package/dist/chunk-FFAOS5HQ.js +70 -0
- package/dist/chunk-FGGJQRLZ.js +270 -0
- package/dist/chunk-FHP6LXJS.js +415 -0
- package/dist/chunk-FJPADH77.cjs +666 -0
- package/dist/chunk-FL33V6U7.js +421 -0
- package/dist/chunk-FYSPZT4V.cjs +169 -0
- package/dist/chunk-GIOYPNTH.js +5575 -0
- package/dist/chunk-GJNCFRJU.cjs +125 -0
- package/dist/chunk-GMP623FG.cjs +1508 -0
- package/dist/chunk-GQHQOPXZ.cjs +5580 -0
- package/dist/chunk-GTU2Z2WW.cjs +262 -0
- package/dist/chunk-GYZE55MO.js +2007 -0
- package/dist/chunk-GZG4KA4E.js +529 -0
- package/dist/chunk-H652NHX5.js +600 -0
- package/dist/chunk-HCCQLAA4.cjs +74 -0
- package/dist/chunk-HKEXJUWS.cjs +4007 -0
- package/dist/chunk-HNDK4IQU.cjs +5737 -0
- package/dist/chunk-HR2OSYVQ.js +56165 -0
- package/dist/chunk-HYNTS5CP.js +422 -0
- package/dist/chunk-I6XZ5DZF.cjs +488 -0
- package/dist/chunk-ILRBGFVD.cjs +72 -0
- package/dist/chunk-IUDGEUDO.cjs +1409 -0
- package/dist/chunk-IUTY5WQ2.cjs +424 -0
- package/dist/chunk-IVY74O6C.js +247 -0
- package/dist/chunk-IWC5DM2M.cjs +611 -0
- package/dist/chunk-J32ZJZJH.js +554 -0
- package/dist/chunk-J52VSAQ7.js +6884 -0
- package/dist/chunk-J6M4FPK5.js +421 -0
- package/dist/chunk-J7XZV333.js +844 -0
- package/dist/chunk-JBNDTXXV.cjs +2433 -0
- package/dist/chunk-JC5YBPSF.cjs +984 -0
- package/dist/chunk-JD7CIZ33.js +1949 -0
- package/dist/chunk-JIBL5LRK.js +4287 -0
- package/dist/chunk-JIYN45TV.cjs +2525 -0
- package/dist/chunk-K574J76X.cjs +457 -0
- package/dist/chunk-KHDZJE5D.cjs +2196 -0
- package/dist/chunk-KKFZ3B6J.cjs +557 -0
- package/dist/chunk-KKP7JKN4.cjs +6002 -0
- package/dist/chunk-KPJL34Y7.cjs +186 -0
- package/dist/chunk-KQCN6AKJ.cjs +3042 -0
- package/dist/chunk-L5LKKENW.cjs +424 -0
- package/dist/chunk-LHAXPADA.js +882 -0
- package/dist/chunk-LM2VU56C.cjs +37 -0
- package/dist/chunk-M56JSP4A.js +400 -0
- package/dist/chunk-MBOOR7X4.js +18 -0
- package/dist/chunk-MQWAT42R.cjs +4310 -0
- package/dist/chunk-MXFUTKCO.js +56 -0
- package/dist/chunk-MYY4PMWX.cjs +264 -0
- package/dist/chunk-N75IH2HY.js +258 -0
- package/dist/chunk-NCWCUZNS.cjs +72 -0
- package/dist/chunk-NG77ATEW.cjs +778 -0
- package/dist/chunk-NW5G5FBQ.js +215 -0
- package/dist/chunk-OBIYPYYS.cjs +1993 -0
- package/dist/chunk-OH2FAIVU.js +608 -0
- package/dist/chunk-OIQYIIO3.cjs +473 -0
- package/dist/chunk-OL46QLBJ.js +61 -0
- package/dist/chunk-OMXII44L.js +5386 -0
- package/dist/chunk-OSYNRVOV.cjs +243 -0
- package/dist/chunk-PGANYCAG.cjs +220 -0
- package/dist/chunk-PHENW4MQ.js +65 -0
- package/dist/chunk-PY37LNDP.js +686 -0
- package/dist/chunk-Q56TT7IL.js +483 -0
- package/dist/chunk-QD32ADK6.js +1046 -0
- package/dist/chunk-QPOQ7VPI.js +1491 -0
- package/dist/chunk-QPSKHBJP.js +5963 -0
- package/dist/chunk-QXH7QDSZ.js +1989 -0
- package/dist/chunk-R24NNAEG.js +1399 -0
- package/dist/chunk-R75BSDH7.cjs +50 -0
- package/dist/chunk-RARB3MBR.js +207 -0
- package/dist/chunk-ROHLEP2W.cjs +847 -0
- package/dist/chunk-S3MDHNKB.cjs +490 -0
- package/dist/chunk-S6YWHCKV.cjs +410 -0
- package/dist/chunk-SIEXCILW.js +229 -0
- package/dist/chunk-SLU6UPJI.cjs +410 -0
- package/dist/chunk-SMIWS6DE.cjs +212 -0
- package/dist/chunk-T5J7ZKP3.cjs +4885 -0
- package/dist/chunk-TDCNJHWO.js +341 -0
- package/dist/chunk-TG7O4WBC.js +406 -0
- package/dist/chunk-THCK6ECW.js +2085 -0
- package/dist/chunk-TJHVSBP2.js +439 -0
- package/dist/chunk-TVHSPJ4N.cjs +606 -0
- package/dist/chunk-TWUXUCEW.cjs +781 -0
- package/dist/chunk-U44IKGG7.cjs +5390 -0
- package/dist/chunk-UFZZ7TSN.cjs +886 -0
- package/dist/chunk-UJXISJBN.js +487 -0
- package/dist/chunk-UOIGFQXC.cjs +9750 -0
- package/dist/chunk-URG2SJLK.js +2521 -0
- package/dist/chunk-UWJHCOH2.js +623 -0
- package/dist/chunk-V6MKC2FZ.js +979 -0
- package/dist/chunk-VJ3L7CHT.cjs +169 -0
- package/dist/chunk-VMLKSV26.js +1216 -0
- package/dist/chunk-VVKVQZI6.js +55 -0
- package/dist/chunk-W6RW64BB.cjs +1219 -0
- package/dist/chunk-WKX5AMOY.js +309 -0
- package/dist/chunk-WNNE3PO3.js +34 -0
- package/dist/chunk-WRKUDAZJ.js +3038 -0
- package/dist/chunk-WRLUBRKS.cjs +1943 -0
- package/dist/chunk-WRNEH5MO.js +3169 -0
- package/dist/chunk-WRWEX5ZF.js +658 -0
- package/dist/chunk-X3GJPRVK.cjs +3246 -0
- package/dist/chunk-X3UVCWNL.cjs +2257 -0
- package/dist/chunk-XB274MW5.cjs +814 -0
- package/dist/chunk-XHIV6326.cjs +793 -0
- package/dist/chunk-XIVIE43A.cjs +729 -0
- package/dist/chunk-XJAN7CZG.cjs +432 -0
- package/dist/chunk-XKTPFXGA.js +164 -0
- package/dist/chunk-XL6INWKT.js +121 -0
- package/dist/chunk-XSFNHP2E.js +632 -0
- package/dist/chunk-XT6JY5W5.js +9684 -0
- package/dist/chunk-XUILI4KB.cjs +430 -0
- package/dist/chunk-YF2I3MV3.js +46 -0
- package/dist/chunk-YIMN575O.js +4847 -0
- package/dist/chunk-YIVFJNYV.js +176 -0
- package/dist/chunk-YKGPCZEE.cjs +237 -0
- package/dist/chunk-YN2YWTXW.js +5731 -0
- package/dist/chunk-YN6V7R3L.cjs +327 -0
- package/dist/chunk-YQELFNJV.js +39 -0
- package/dist/chunk-YVD3CSO3.js +1183 -0
- package/dist/chunk-YVOAF4ML.js +623 -0
- package/dist/chunk-YWOBW2PV.cjs +759 -0
- package/dist/chunk-YYXH45E2.js +426 -0
- package/dist/chunk-ZDSYWBIE.cjs +69 -0
- package/dist/chunk-ZU7NIRT6.js +325 -0
- package/dist/chunk-ZZ7RO2UQ.js +1243 -0
- package/dist/cli/holoscript-runner.cjs +2255 -0
- package/dist/cli/holoscript-runner.js +2230 -0
- package/dist/codebase/index.cjs +336 -0
- package/dist/codebase/index.js +331 -0
- package/dist/compiler/agent-inference.cjs +31 -0
- package/dist/compiler/agent-inference.js +8 -0
- package/dist/compiler/android-xr.cjs +24 -0
- package/dist/compiler/android-xr.js +14 -0
- package/dist/compiler/android.cjs +24 -0
- package/dist/compiler/android.js +14 -0
- package/dist/compiler/ar.cjs +23 -0
- package/dist/compiler/ar.js +11 -0
- package/dist/compiler/babylon.cjs +21 -0
- package/dist/compiler/babylon.js +15 -0
- package/dist/compiler/business-quest.cjs +43 -0
- package/dist/compiler/business-quest.js +4 -0
- package/dist/compiler/coco.cjs +27 -0
- package/dist/compiler/coco.js +4 -0
- package/dist/compiler/context.cjs +25 -0
- package/dist/compiler/context.d.ts +28 -0
- package/dist/compiler/context.js +8 -0
- package/dist/compiler/domain-block-utils.cjs +609 -0
- package/dist/compiler/domain-block-utils.js +11 -0
- package/dist/compiler/dtdl.cjs +27 -0
- package/dist/compiler/dtdl.js +11 -0
- package/dist/compiler/gltf-pipeline.cjs +39 -0
- package/dist/compiler/gltf-pipeline.js +4 -0
- package/dist/compiler/godot.cjs +18 -0
- package/dist/compiler/godot.js +12 -0
- package/dist/compiler/incremental.cjs +34 -0
- package/dist/compiler/incremental.js +9 -0
- package/dist/compiler/index.cjs +5408 -0
- package/dist/compiler/index.d.ts +334 -21
- package/dist/compiler/index.js +5069 -0
- package/dist/compiler/ios.cjs +23 -0
- package/dist/compiler/ios.js +13 -0
- package/dist/compiler/llm-provider-capabilities.cjs +25 -0
- package/dist/compiler/llm-provider-capabilities.d.ts +43 -0
- package/dist/compiler/llm-provider-capabilities.js +8 -0
- package/dist/compiler/multi-layer.cjs +24 -0
- package/dist/compiler/multi-layer.js +15 -0
- package/dist/compiler/nodetoy.cjs +23 -0
- package/dist/compiler/nodetoy.d.ts +69 -0
- package/dist/compiler/nodetoy.js +4 -0
- package/dist/compiler/openxr.cjs +19 -0
- package/dist/compiler/openxr.js +13 -0
- package/dist/compiler/playcanvas.cjs +19 -0
- package/dist/compiler/playcanvas.js +13 -0
- package/dist/compiler/r3f.cjs +39 -0
- package/dist/compiler/r3f.d.ts +22 -0
- package/dist/compiler/r3f.js +17 -0
- package/dist/compiler/remotion.cjs +23 -0
- package/dist/compiler/remotion.js +4 -0
- package/dist/compiler/reproducibility.cjs +39 -0
- package/dist/compiler/reproducibility.js +4 -0
- package/dist/compiler/sdf.cjs +24 -0
- package/dist/compiler/sdf.js +12 -0
- package/dist/compiler/semantic-scene.cjs +31 -0
- package/dist/compiler/semantic-scene.js +4 -0
- package/dist/compiler/state.cjs +21 -0
- package/dist/compiler/state.js +11 -0
- package/dist/compiler/trait-composition.cjs +30 -0
- package/dist/compiler/trait-composition.js +9 -0
- package/dist/compiler/unity.cjs +19 -0
- package/dist/compiler/unity.js +13 -0
- package/dist/compiler/unreal.cjs +23 -0
- package/dist/compiler/unreal.js +13 -0
- package/dist/compiler/urdf.cjs +52 -0
- package/dist/compiler/urdf.js +12 -0
- package/dist/compiler/usd-physics.cjs +26 -0
- package/dist/compiler/usd-physics.js +9 -0
- package/dist/compiler/visionos.cjs +19 -0
- package/dist/compiler/visionos.js +13 -0
- package/dist/compiler/vrchat.cjs +22 -0
- package/dist/compiler/vrchat.js +12 -0
- package/dist/compiler/vrr.cjs +24 -0
- package/dist/compiler/vrr.js +12 -0
- package/dist/compiler/wasm.cjs +36 -0
- package/dist/compiler/wasm.js +12 -0
- package/dist/compiler/webgpu.cjs +18 -0
- package/dist/compiler/webgpu.js +12 -0
- package/dist/coordinators/index.cjs +1266 -0
- package/dist/coordinators/index.d.ts +72 -1
- package/dist/coordinators/index.js +1259 -0
- package/dist/debugger.cjs +24 -0
- package/dist/debugger.js +11 -0
- package/dist/dist-ACXG6IH5.cjs +3113 -0
- package/dist/dist-VD4L6V7Q.js +3076 -0
- package/dist/entries/interop.cjs +64 -0
- package/dist/entries/interop.js +7 -0
- package/dist/entries/scripting.cjs +55 -0
- package/dist/entries/scripting.js +10 -0
- package/dist/hololand/index.cjs +146 -0
- package/dist/hololand/index.d.ts +70 -0
- package/dist/hololand/index.js +5 -0
- package/dist/index.cjs +44660 -0
- package/dist/index.d.ts +978 -21
- package/dist/index.js +41422 -0
- package/dist/math/tropical-spmv.cjs +45 -0
- package/dist/math/tropical-spmv.js +4 -0
- package/dist/math/vec3.cjs +57 -0
- package/dist/math/vec3.js +4 -0
- package/dist/ml-dsa-FSKBTE3W.cjs +1265 -0
- package/dist/ml-dsa-Z7JDKW4L.js +1265 -0
- package/dist/paper-0c-spike/index.cjs +150 -0
- package/dist/paper-0c-spike/index.js +141 -0
- package/dist/parser.cjs +61 -0
- package/dist/parser.d.ts +11 -0
- package/dist/parser.js +12 -0
- package/dist/playwright-3AT3AKTV.cjs +98673 -0
- package/dist/playwright-VZPDVUEQ.js +98660 -0
- package/dist/reconstruction/index.cjs +153 -0
- package/dist/reconstruction/index.d.ts +29 -2
- package/dist/reconstruction/index.js +8 -0
- package/dist/runtime.cjs +316 -0
- package/dist/runtime.d.ts +61 -0
- package/dist/runtime.js +31 -0
- package/dist/self-improvement/index.cjs +563 -0
- package/dist/self-improvement/index.js +545 -0
- package/dist/src-4ROC227P.cjs +2094 -0
- package/dist/src-HCCCSYP7.js +2073 -0
- package/dist/storage/index.cjs +38 -0
- package/dist/storage/index.js +5 -0
- package/dist/testing.cjs +25 -0
- package/dist/testing.d.ts +70 -0
- package/dist/testing.js +4 -0
- package/dist/traitDocs/traitDocs.cjs +33 -0
- package/dist/traitDocs/traitDocs.js +7 -0
- package/dist/traits/botanical-lotus.cjs +177 -0
- package/dist/traits/botanical-lotus.d.ts +502 -0
- package/dist/traits/botanical-lotus.js +7 -0
- package/dist/traits/engines/index.cjs +520 -0
- package/dist/traits/engines/index.js +380 -0
- package/dist/traits/index.cjs +24548 -0
- package/dist/traits/index.d.ts +171 -35
- package/dist/traits/index.js +21638 -0
- package/dist/traits/simulation-solver-factory.cjs +13 -0
- package/dist/traits/simulation-solver-factory.d.ts +23 -0
- package/dist/traits/simulation-solver-factory.js +4 -0
- package/dist/traits/webcam-gaze.cjs +35 -0
- package/dist/traits/webcam-gaze.d.ts +17 -0
- package/dist/traits/webcam-gaze.js +4 -0
- package/dist/type-checker.cjs +19 -0
- package/dist/type-checker.js +6 -0
- package/dist/world/index.cjs +947 -0
- package/dist/world/index.d.ts +147 -0
- package/dist/world/index.js +939 -0
- package/dist/world-model/index.cjs +1446 -0
- package/dist/world-model/index.d.ts +119 -0
- package/dist/world-model/index.js +1414 -0
- package/dist/wot/index.cjs +29 -0
- package/dist/wot/index.js +4 -0
- package/package.json +93 -49
|
@@ -0,0 +1,424 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var chunkKKP7JKN4_cjs = require('./chunk-KKP7JKN4.cjs');
|
|
4
|
+
var chunkHCCQLAA4_cjs = require('./chunk-HCCQLAA4.cjs');
|
|
5
|
+
var ans = require('@holoscript/core-types/ans');
|
|
6
|
+
|
|
7
|
+
// src/compiler/DTDLCompiler.ts
|
|
8
|
+
var DTDLCompiler_exports = {};
|
|
9
|
+
chunkHCCQLAA4_cjs.__export(DTDLCompiler_exports, {
|
|
10
|
+
DTDLCompiler: () => exports.DTDLCompiler,
|
|
11
|
+
DTDL_TRAIT_COMPONENTS: () => exports.DTDL_TRAIT_COMPONENTS,
|
|
12
|
+
default: () => exports.DTDLCompiler_default
|
|
13
|
+
});
|
|
14
|
+
exports.DTDLCompiler = void 0; exports.DTDL_TRAIT_COMPONENTS = void 0; exports.DTDLCompiler_default = void 0;
|
|
15
|
+
var init_DTDLCompiler = chunkHCCQLAA4_cjs.__esm({
|
|
16
|
+
"src/compiler/DTDLCompiler.ts"() {
|
|
17
|
+
chunkKKP7JKN4_cjs.init_CompilerBase();
|
|
18
|
+
exports.DTDLCompiler = class extends chunkKKP7JKN4_cjs.CompilerBase {
|
|
19
|
+
constructor(options = {}) {
|
|
20
|
+
super();
|
|
21
|
+
this.compilerName = "DTDLCompiler";
|
|
22
|
+
this.generatedInterfaces = [];
|
|
23
|
+
this.options = {
|
|
24
|
+
dtdlVersion: options.dtdlVersion ?? 3,
|
|
25
|
+
namespace: options.namespace || "dtmi:holoscript",
|
|
26
|
+
modelVersion: options.modelVersion ?? 1,
|
|
27
|
+
includeDescriptions: options.includeDescriptions ?? true,
|
|
28
|
+
includeTraitComponents: options.includeTraitComponents ?? true
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
getRequiredCapability() {
|
|
32
|
+
return ans.ANSCapabilityPath.DTDL;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Get trait name from either string or { name: string } format
|
|
36
|
+
*/
|
|
37
|
+
getTraitName(trait) {
|
|
38
|
+
return typeof trait === "string" ? trait : trait.name;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Check if traits include a specific trait name
|
|
42
|
+
*/
|
|
43
|
+
hasTrait(traits, targetTrait) {
|
|
44
|
+
return traits?.some((t) => this.getTraitName(t) === targetTrait) ?? false;
|
|
45
|
+
}
|
|
46
|
+
compile(composition, agentToken, outputPath) {
|
|
47
|
+
this.validateCompilerAccess(agentToken, outputPath);
|
|
48
|
+
this.generatedInterfaces = [];
|
|
49
|
+
if (composition.templates) {
|
|
50
|
+
for (const template of composition.templates) {
|
|
51
|
+
this.generatedInterfaces.push(this.compileTemplate(template));
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
const mainInterface = this.compileComposition(composition);
|
|
55
|
+
this.generatedInterfaces.push(mainInterface);
|
|
56
|
+
if (composition.objects) {
|
|
57
|
+
for (const obj of composition.objects) {
|
|
58
|
+
if (this.objectNeedsInterface(obj)) {
|
|
59
|
+
this.generatedInterfaces.push(this.compileObject(obj));
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
return JSON.stringify(this.generatedInterfaces, null, 2);
|
|
64
|
+
}
|
|
65
|
+
compileComposition(composition) {
|
|
66
|
+
const modelId = this.generateModelId(composition.name);
|
|
67
|
+
const contents = [];
|
|
68
|
+
if (composition.environment) {
|
|
69
|
+
contents.push(...this.compileEnvironmentProperties(composition.environment));
|
|
70
|
+
}
|
|
71
|
+
if (composition.state) {
|
|
72
|
+
contents.push(...this.compileStateProperties(composition.state));
|
|
73
|
+
}
|
|
74
|
+
if (composition.logic) {
|
|
75
|
+
contents.push(...this.compileLogicCommands(composition.logic));
|
|
76
|
+
}
|
|
77
|
+
if (composition.objects) {
|
|
78
|
+
for (const obj of composition.objects) {
|
|
79
|
+
contents.push(this.createObjectRelationship(obj));
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
if (composition.spatialGroups) {
|
|
83
|
+
for (const group of composition.spatialGroups) {
|
|
84
|
+
contents.push({
|
|
85
|
+
"@type": "Relationship",
|
|
86
|
+
name: this.sanitizeName(group.name),
|
|
87
|
+
displayName: group.name,
|
|
88
|
+
description: `Spatial group containing ${group.objects?.length || 0} objects`
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
const iface = {
|
|
93
|
+
"@context": this.getDtdlContext(),
|
|
94
|
+
"@type": "Interface",
|
|
95
|
+
"@id": modelId,
|
|
96
|
+
displayName: composition.name,
|
|
97
|
+
contents
|
|
98
|
+
};
|
|
99
|
+
if (this.options.includeDescriptions) {
|
|
100
|
+
iface.description = `Generated from HoloScript composition "${this.escapeStringValue(composition.name, "TypeScript")}"`;
|
|
101
|
+
}
|
|
102
|
+
return iface;
|
|
103
|
+
}
|
|
104
|
+
compileTemplate(template) {
|
|
105
|
+
const modelId = this.generateModelId(template.name);
|
|
106
|
+
const contents = [];
|
|
107
|
+
if (template.state) {
|
|
108
|
+
contents.push(...this.compileStateProperties(template.state));
|
|
109
|
+
}
|
|
110
|
+
if (template.actions) {
|
|
111
|
+
for (const action of template.actions) {
|
|
112
|
+
contents.push({
|
|
113
|
+
"@type": "Command",
|
|
114
|
+
name: action.name,
|
|
115
|
+
displayName: action.name,
|
|
116
|
+
description: `Action defined in template ${this.escapeStringValue(template.name, "TypeScript")}`
|
|
117
|
+
});
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
if (template.traits && this.options.includeTraitComponents) {
|
|
121
|
+
for (const trait of template.traits) {
|
|
122
|
+
const traitName = typeof trait === "string" ? trait : trait.name;
|
|
123
|
+
const component = this.traitToComponent(traitName);
|
|
124
|
+
if (component) {
|
|
125
|
+
contents.push(component);
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
const iface = {
|
|
130
|
+
"@context": this.getDtdlContext(),
|
|
131
|
+
"@type": "Interface",
|
|
132
|
+
"@id": modelId,
|
|
133
|
+
displayName: template.name,
|
|
134
|
+
contents
|
|
135
|
+
};
|
|
136
|
+
const templateExt = template;
|
|
137
|
+
if (templateExt.extends) {
|
|
138
|
+
iface.extends = [this.generateModelId(templateExt.extends)];
|
|
139
|
+
}
|
|
140
|
+
return iface;
|
|
141
|
+
}
|
|
142
|
+
compileObject(obj) {
|
|
143
|
+
const modelId = this.generateModelId(obj.name);
|
|
144
|
+
const contents = [];
|
|
145
|
+
const posProp = obj.properties.find((p) => p.key === "position");
|
|
146
|
+
if (posProp) {
|
|
147
|
+
contents.push({
|
|
148
|
+
"@type": ["Property", "Location"],
|
|
149
|
+
name: "position",
|
|
150
|
+
schema: {
|
|
151
|
+
"@type": "Object",
|
|
152
|
+
fields: [
|
|
153
|
+
{ name: "x", schema: "double" },
|
|
154
|
+
{ name: "y", schema: "double" },
|
|
155
|
+
{ name: "z", schema: "double" }
|
|
156
|
+
]
|
|
157
|
+
},
|
|
158
|
+
writable: true
|
|
159
|
+
});
|
|
160
|
+
}
|
|
161
|
+
for (const prop of obj.properties) {
|
|
162
|
+
if (prop.key !== "position" && prop.key !== "geometry") {
|
|
163
|
+
contents.push(this.propertyToContent(prop.key, prop.value));
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
if (this.hasTrait(obj.traits, "sensor") || this.hasTrait(obj.traits, "observable")) {
|
|
167
|
+
contents.push({
|
|
168
|
+
"@type": "Telemetry",
|
|
169
|
+
name: "sensorReading",
|
|
170
|
+
schema: "double",
|
|
171
|
+
description: "Sensor telemetry data"
|
|
172
|
+
});
|
|
173
|
+
}
|
|
174
|
+
if (obj.traits && this.options.includeTraitComponents) {
|
|
175
|
+
for (const trait of obj.traits) {
|
|
176
|
+
const traitName = this.getTraitName(trait);
|
|
177
|
+
const component = this.traitToComponent(traitName);
|
|
178
|
+
if (component) {
|
|
179
|
+
contents.push(component);
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
const iface = {
|
|
184
|
+
"@context": this.getDtdlContext(),
|
|
185
|
+
"@type": "Interface",
|
|
186
|
+
"@id": modelId,
|
|
187
|
+
displayName: obj.name,
|
|
188
|
+
contents
|
|
189
|
+
};
|
|
190
|
+
if (obj.template) {
|
|
191
|
+
iface.extends = this.generateModelId(obj.template);
|
|
192
|
+
}
|
|
193
|
+
return iface;
|
|
194
|
+
}
|
|
195
|
+
compileEnvironmentProperties(env) {
|
|
196
|
+
const props = [];
|
|
197
|
+
const envExt = env;
|
|
198
|
+
if (Array.isArray(envExt.properties)) {
|
|
199
|
+
for (const prop of envExt.properties) {
|
|
200
|
+
this.addEnvironmentProperty(props, prop.key, prop.value);
|
|
201
|
+
}
|
|
202
|
+
} else {
|
|
203
|
+
for (const key of Object.keys(envExt)) {
|
|
204
|
+
if (key !== "type") {
|
|
205
|
+
this.addEnvironmentProperty(props, key, envExt[key]);
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
return props;
|
|
210
|
+
}
|
|
211
|
+
addEnvironmentProperty(props, key, _value) {
|
|
212
|
+
if (key === "skybox") {
|
|
213
|
+
props.push({
|
|
214
|
+
"@type": "Property",
|
|
215
|
+
name: "skybox",
|
|
216
|
+
schema: "string",
|
|
217
|
+
displayName: "Skybox",
|
|
218
|
+
description: "Environment skybox setting"
|
|
219
|
+
});
|
|
220
|
+
} else if (key === "ambient_light") {
|
|
221
|
+
props.push({
|
|
222
|
+
"@type": "Property",
|
|
223
|
+
name: "ambientLight",
|
|
224
|
+
schema: "double",
|
|
225
|
+
displayName: "Ambient Light",
|
|
226
|
+
description: "Ambient light level"
|
|
227
|
+
});
|
|
228
|
+
} else if (key === "fog") {
|
|
229
|
+
props.push({
|
|
230
|
+
"@type": "Property",
|
|
231
|
+
name: "fogEnabled",
|
|
232
|
+
schema: "boolean",
|
|
233
|
+
displayName: "Fog Enabled"
|
|
234
|
+
});
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
compileStateProperties(state) {
|
|
238
|
+
const props = [];
|
|
239
|
+
for (const prop of state.properties) {
|
|
240
|
+
props.push(this.propertyToContent(prop.key, prop.value));
|
|
241
|
+
}
|
|
242
|
+
return props;
|
|
243
|
+
}
|
|
244
|
+
compileLogicCommands(logic) {
|
|
245
|
+
const commands = [];
|
|
246
|
+
const logicExt = logic;
|
|
247
|
+
const items = logicExt.handlers || logicExt.rules || [];
|
|
248
|
+
for (const item of items) {
|
|
249
|
+
const event = item.event;
|
|
250
|
+
if (event?.startsWith("on_")) {
|
|
251
|
+
commands.push({
|
|
252
|
+
"@type": "Command",
|
|
253
|
+
name: event.replace("on_", ""),
|
|
254
|
+
displayName: this.formatEventName(event),
|
|
255
|
+
description: `Event handler for ${event}`
|
|
256
|
+
});
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
return commands;
|
|
260
|
+
}
|
|
261
|
+
propertyToContent(key, value) {
|
|
262
|
+
return {
|
|
263
|
+
"@type": "Property",
|
|
264
|
+
name: this.sanitizeName(key),
|
|
265
|
+
schema: this.inferSchema(value),
|
|
266
|
+
displayName: this.formatDisplayName(key),
|
|
267
|
+
writable: true
|
|
268
|
+
};
|
|
269
|
+
}
|
|
270
|
+
createObjectRelationship(obj) {
|
|
271
|
+
return {
|
|
272
|
+
"@type": "Relationship",
|
|
273
|
+
name: `has${this.pascalCase(obj.name)}`,
|
|
274
|
+
displayName: obj.name,
|
|
275
|
+
target: this.objectNeedsInterface(obj) ? this.generateModelId(obj.name) : void 0,
|
|
276
|
+
maxMultiplicity: 1
|
|
277
|
+
};
|
|
278
|
+
}
|
|
279
|
+
traitToComponent(trait) {
|
|
280
|
+
const traitComponents = {
|
|
281
|
+
grabbable: {
|
|
282
|
+
schema: `${this.options.namespace}:component:Grabbable;${this.options.modelVersion}`,
|
|
283
|
+
description: "Allows object to be grabbed/manipulated"
|
|
284
|
+
},
|
|
285
|
+
networked: {
|
|
286
|
+
schema: `${this.options.namespace}:component:Networked;${this.options.modelVersion}`,
|
|
287
|
+
description: "Enables network synchronization"
|
|
288
|
+
},
|
|
289
|
+
physics: {
|
|
290
|
+
schema: `${this.options.namespace}:component:Physics;${this.options.modelVersion}`,
|
|
291
|
+
description: "Enables physics simulation"
|
|
292
|
+
},
|
|
293
|
+
collidable: {
|
|
294
|
+
schema: `${this.options.namespace}:component:Collidable;${this.options.modelVersion}`,
|
|
295
|
+
description: "Enables collision detection"
|
|
296
|
+
},
|
|
297
|
+
sensor: {
|
|
298
|
+
schema: `${this.options.namespace}:component:Sensor;${this.options.modelVersion}`,
|
|
299
|
+
description: "IoT sensor capabilities"
|
|
300
|
+
},
|
|
301
|
+
observable: {
|
|
302
|
+
schema: `${this.options.namespace}:component:Observable;${this.options.modelVersion}`,
|
|
303
|
+
description: "State observation capabilities"
|
|
304
|
+
}
|
|
305
|
+
};
|
|
306
|
+
const config = traitComponents[trait];
|
|
307
|
+
if (!config) return null;
|
|
308
|
+
return {
|
|
309
|
+
"@type": "Component",
|
|
310
|
+
name: trait,
|
|
311
|
+
schema: config.schema,
|
|
312
|
+
description: config.description
|
|
313
|
+
};
|
|
314
|
+
}
|
|
315
|
+
inferSchema(value) {
|
|
316
|
+
if (typeof value === "boolean") return "boolean";
|
|
317
|
+
if (typeof value === "number") {
|
|
318
|
+
return Number.isInteger(value) ? "integer" : "double";
|
|
319
|
+
}
|
|
320
|
+
if (typeof value === "string") return "string";
|
|
321
|
+
if (Array.isArray(value)) {
|
|
322
|
+
if (value.length > 0) {
|
|
323
|
+
return {
|
|
324
|
+
"@type": "Array",
|
|
325
|
+
elementSchema: this.inferSchema(value[0])
|
|
326
|
+
};
|
|
327
|
+
}
|
|
328
|
+
return { "@type": "Array", elementSchema: "double" };
|
|
329
|
+
}
|
|
330
|
+
if (typeof value === "object" && value !== null) {
|
|
331
|
+
const fields = Object.entries(value).map(([k, v]) => ({
|
|
332
|
+
name: k,
|
|
333
|
+
schema: this.inferSchema(v)
|
|
334
|
+
}));
|
|
335
|
+
return { "@type": "Object", fields };
|
|
336
|
+
}
|
|
337
|
+
return "string";
|
|
338
|
+
}
|
|
339
|
+
getDtdlContext() {
|
|
340
|
+
return this.options.dtdlVersion === 3 ? "dtmi:dtdl:context;3" : "dtmi:dtdl:context;2";
|
|
341
|
+
}
|
|
342
|
+
generateModelId(name) {
|
|
343
|
+
const sanitized = this.sanitizeName(name);
|
|
344
|
+
return `${this.options.namespace}:${sanitized};${this.options.modelVersion}`;
|
|
345
|
+
}
|
|
346
|
+
objectNeedsInterface(obj) {
|
|
347
|
+
const hasState = obj.properties.some((p) => p.key === "state" || typeof p.value === "object");
|
|
348
|
+
const complexTraitList = ["networked", "sensor", "observable", "state"];
|
|
349
|
+
const hasComplexTraits = obj.traits?.some(
|
|
350
|
+
(t) => complexTraitList.includes(this.getTraitName(t))
|
|
351
|
+
);
|
|
352
|
+
return hasState || hasComplexTraits || false;
|
|
353
|
+
}
|
|
354
|
+
sanitizeName(name) {
|
|
355
|
+
return name.replace(/[^a-zA-Z0-9_]/g, "_").replace(/^_+|_+$/g, "").replace(/_+/g, "_");
|
|
356
|
+
}
|
|
357
|
+
formatDisplayName(name) {
|
|
358
|
+
return name.replace(/_/g, " ").replace(/([A-Z])/g, " $1").replace(/^./, (s) => s.toUpperCase()).trim();
|
|
359
|
+
}
|
|
360
|
+
formatEventName(event) {
|
|
361
|
+
return event.replace(/^on_/, "").replace(/_/g, " ").replace(/^./, (s) => s.toUpperCase());
|
|
362
|
+
}
|
|
363
|
+
pascalCase(name) {
|
|
364
|
+
return name.replace(/[^a-zA-Z0-9]/g, " ").split(" ").map((w) => w.charAt(0).toUpperCase() + w.slice(1).toLowerCase()).join("");
|
|
365
|
+
}
|
|
366
|
+
};
|
|
367
|
+
exports.DTDL_TRAIT_COMPONENTS = [
|
|
368
|
+
{
|
|
369
|
+
"@context": "dtmi:dtdl:context;3",
|
|
370
|
+
"@type": "Interface",
|
|
371
|
+
"@id": "dtmi:holoscript:component:Grabbable;1",
|
|
372
|
+
displayName: "Grabbable",
|
|
373
|
+
description: "Component for objects that can be grabbed in VR/AR",
|
|
374
|
+
contents: [
|
|
375
|
+
{ "@type": "Property", name: "isGrabbed", schema: "boolean", writable: false },
|
|
376
|
+
{ "@type": "Property", name: "grabDistance", schema: "double", writable: true }
|
|
377
|
+
]
|
|
378
|
+
},
|
|
379
|
+
{
|
|
380
|
+
"@context": "dtmi:dtdl:context;3",
|
|
381
|
+
"@type": "Interface",
|
|
382
|
+
"@id": "dtmi:holoscript:component:Networked;1",
|
|
383
|
+
displayName: "Networked",
|
|
384
|
+
description: "Component for network-synchronized objects",
|
|
385
|
+
contents: [
|
|
386
|
+
{ "@type": "Property", name: "networkId", schema: "string", writable: false },
|
|
387
|
+
{ "@type": "Property", name: "syncRate", schema: "integer", writable: true },
|
|
388
|
+
{ "@type": "Property", name: "ownerId", schema: "string", writable: false }
|
|
389
|
+
]
|
|
390
|
+
},
|
|
391
|
+
{
|
|
392
|
+
"@context": "dtmi:dtdl:context;3",
|
|
393
|
+
"@type": "Interface",
|
|
394
|
+
"@id": "dtmi:holoscript:component:Physics;1",
|
|
395
|
+
displayName: "Physics",
|
|
396
|
+
description: "Component for physics-enabled objects",
|
|
397
|
+
contents: [
|
|
398
|
+
{ "@type": "Property", name: "mass", schema: "double", writable: true },
|
|
399
|
+
{ "@type": "Property", name: "friction", schema: "double", writable: true },
|
|
400
|
+
{ "@type": "Property", name: "restitution", schema: "double", writable: true },
|
|
401
|
+
{ "@type": "Property", name: "isKinematic", schema: "boolean", writable: true }
|
|
402
|
+
]
|
|
403
|
+
},
|
|
404
|
+
{
|
|
405
|
+
"@context": "dtmi:dtdl:context;3",
|
|
406
|
+
"@type": "Interface",
|
|
407
|
+
"@id": "dtmi:holoscript:component:Sensor;1",
|
|
408
|
+
displayName: "Sensor",
|
|
409
|
+
description: "Component for IoT sensor capabilities",
|
|
410
|
+
contents: [
|
|
411
|
+
{ "@type": "Property", name: "sensorType", schema: "string", writable: false },
|
|
412
|
+
{ "@type": "Telemetry", name: "value", schema: "double" },
|
|
413
|
+
{ "@type": "Telemetry", name: "timestamp", schema: "dateTime" }
|
|
414
|
+
]
|
|
415
|
+
}
|
|
416
|
+
];
|
|
417
|
+
exports.DTDLCompiler_default = exports.DTDLCompiler;
|
|
418
|
+
}
|
|
419
|
+
});
|
|
420
|
+
|
|
421
|
+
exports.DTDLCompiler_exports = DTDLCompiler_exports;
|
|
422
|
+
exports.init_DTDLCompiler = init_DTDLCompiler;
|
|
423
|
+
//# sourceMappingURL=chunk-IUTY5WQ2.cjs.map
|
|
424
|
+
//# sourceMappingURL=chunk-IUTY5WQ2.cjs.map
|
|
@@ -0,0 +1,247 @@
|
|
|
1
|
+
// src/traits/engines/motion-matching.ts
|
|
2
|
+
var TRAJECTORY_HORIZON_FRAMES = 12;
|
|
3
|
+
var TRAJECTORY_FRAME_DT = 1 / 30;
|
|
4
|
+
function magnitude(v) {
|
|
5
|
+
return Math.sqrt(v.x * v.x + v.y * v.y + v.z * v.z);
|
|
6
|
+
}
|
|
7
|
+
function classifyGait(speed, energyEfficiency) {
|
|
8
|
+
const efficiencyPenalty = energyEfficiency > 1 ? 0.85 : 1;
|
|
9
|
+
const adjusted = speed * efficiencyPenalty;
|
|
10
|
+
if (adjusted < 0.05) return "idle";
|
|
11
|
+
if (adjusted < 1.4) return "walk";
|
|
12
|
+
if (adjusted < 3) return "trot";
|
|
13
|
+
return "run";
|
|
14
|
+
}
|
|
15
|
+
function projectLinearTrajectory(velocity) {
|
|
16
|
+
const trajectory = [];
|
|
17
|
+
for (let i = 1; i <= TRAJECTORY_HORIZON_FRAMES; i++) {
|
|
18
|
+
const t = i * TRAJECTORY_FRAME_DT;
|
|
19
|
+
trajectory.push([velocity.x * t, velocity.y * t, velocity.z * t]);
|
|
20
|
+
}
|
|
21
|
+
return trajectory;
|
|
22
|
+
}
|
|
23
|
+
var NullMotionMatchingEngine = class {
|
|
24
|
+
constructor(modelId) {
|
|
25
|
+
this.loaded = false;
|
|
26
|
+
this.modelId = modelId;
|
|
27
|
+
}
|
|
28
|
+
async load() {
|
|
29
|
+
this.loaded = true;
|
|
30
|
+
}
|
|
31
|
+
infer(input) {
|
|
32
|
+
const speed = magnitude(input.targetVelocity);
|
|
33
|
+
const energyEfficiency = input.energyEfficiency ?? 1;
|
|
34
|
+
const phaseAdvance = (speed * 0.3 + 0.5) * input.delta;
|
|
35
|
+
const phase = (input.currentPhase + phaseAdvance) % 1;
|
|
36
|
+
const leftFootContact = phase < 0.5;
|
|
37
|
+
const rightFootContact = phase >= 0.5;
|
|
38
|
+
return {
|
|
39
|
+
pose: { joints: {}, timestamp: Date.now() },
|
|
40
|
+
phase,
|
|
41
|
+
trajectory: projectLinearTrajectory(input.targetVelocity),
|
|
42
|
+
stability: 1,
|
|
43
|
+
contactFeatures: { leftFoot: leftFootContact, rightFoot: rightFootContact },
|
|
44
|
+
gait: classifyGait(speed, energyEfficiency),
|
|
45
|
+
kineticEnergyProxy: speed * speed * energyEfficiency
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
dispose() {
|
|
49
|
+
this.loaded = false;
|
|
50
|
+
}
|
|
51
|
+
};
|
|
52
|
+
function createNullMotionMatchingEngine(modelId) {
|
|
53
|
+
return new NullMotionMatchingEngine(modelId);
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
// src/traits/engines/synthetic-walk-cycle.ts
|
|
57
|
+
var STRIDE_AMPLITUDE_RAD = 0.6;
|
|
58
|
+
var KNEE_FLEXION_AMPLITUDE_RAD = 0.5;
|
|
59
|
+
var HIP_BOB_AMPLITUDE = 0.04;
|
|
60
|
+
var SYNTHETIC_WALK_JOINTS = [
|
|
61
|
+
"hip",
|
|
62
|
+
"left_thigh",
|
|
63
|
+
"right_thigh",
|
|
64
|
+
"left_knee",
|
|
65
|
+
"right_knee",
|
|
66
|
+
"left_foot",
|
|
67
|
+
"right_foot"
|
|
68
|
+
];
|
|
69
|
+
function buildSyntheticBipedPose(phase, speed) {
|
|
70
|
+
const leftSwing = Math.sin(phase * 2 * Math.PI);
|
|
71
|
+
const rightSwing = Math.sin((phase + 0.5) * 2 * Math.PI);
|
|
72
|
+
const speedScale = Math.min(speed, 6) / 6;
|
|
73
|
+
const hipY = 1 + Math.cos(phase * 4 * Math.PI) * HIP_BOB_AMPLITUDE * speedScale;
|
|
74
|
+
const hipYawRad = leftSwing * 0.05 * speedScale;
|
|
75
|
+
const hipQuat = [0, Math.sin(hipYawRad / 2), 0, Math.cos(hipYawRad / 2)];
|
|
76
|
+
const leftThighPitchRad = leftSwing * STRIDE_AMPLITUDE_RAD * speedScale;
|
|
77
|
+
const rightThighPitchRad = rightSwing * STRIDE_AMPLITUDE_RAD * speedScale;
|
|
78
|
+
const leftThighQuat = [Math.sin(leftThighPitchRad / 2), 0, 0, Math.cos(leftThighPitchRad / 2)];
|
|
79
|
+
const rightThighQuat = [Math.sin(rightThighPitchRad / 2), 0, 0, Math.cos(rightThighPitchRad / 2)];
|
|
80
|
+
const leftKneeRad = Math.max(0, leftSwing) * KNEE_FLEXION_AMPLITUDE_RAD * speedScale;
|
|
81
|
+
const rightKneeRad = Math.max(0, rightSwing) * KNEE_FLEXION_AMPLITUDE_RAD * speedScale;
|
|
82
|
+
const leftKneeQuat = [Math.sin(leftKneeRad / 2), 0, 0, Math.cos(leftKneeRad / 2)];
|
|
83
|
+
const rightKneeQuat = [Math.sin(rightKneeRad / 2), 0, 0, Math.cos(rightKneeRad / 2)];
|
|
84
|
+
const leftFootRad = -leftThighPitchRad * 0.5;
|
|
85
|
+
const rightFootRad = -rightThighPitchRad * 0.5;
|
|
86
|
+
const leftFootQuat = [Math.sin(leftFootRad / 2), 0, 0, Math.cos(leftFootRad / 2)];
|
|
87
|
+
const rightFootQuat = [Math.sin(rightFootRad / 2), 0, 0, Math.cos(rightFootRad / 2)];
|
|
88
|
+
return {
|
|
89
|
+
hip: { position: [0, hipY, 0], rotation: hipQuat },
|
|
90
|
+
left_thigh: { position: [0.1, hipY - 0.4, 0], rotation: leftThighQuat },
|
|
91
|
+
right_thigh: { position: [-0.1, hipY - 0.4, 0], rotation: rightThighQuat },
|
|
92
|
+
left_knee: { position: [0.1, hipY - 0.8, 0], rotation: leftKneeQuat },
|
|
93
|
+
right_knee: { position: [-0.1, hipY - 0.8, 0], rotation: rightKneeQuat },
|
|
94
|
+
left_foot: { position: [0.1, hipY - 1, 0], rotation: leftFootQuat },
|
|
95
|
+
right_foot: { position: [-0.1, hipY - 1, 0], rotation: rightFootQuat }
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
var SyntheticWalkCycleEngine = class {
|
|
99
|
+
constructor(modelId = "synthetic_biped_walk") {
|
|
100
|
+
this.loaded = false;
|
|
101
|
+
this.modelId = modelId;
|
|
102
|
+
}
|
|
103
|
+
async load() {
|
|
104
|
+
this.loaded = true;
|
|
105
|
+
}
|
|
106
|
+
infer(input) {
|
|
107
|
+
const speed = magnitude(input.targetVelocity);
|
|
108
|
+
const energyEfficiency = input.energyEfficiency ?? 1;
|
|
109
|
+
const phaseAdvance = Math.max(speed, 0.1) * 0.5 * input.delta;
|
|
110
|
+
const phase = (input.currentPhase + phaseAdvance) % 1;
|
|
111
|
+
const joints = buildSyntheticBipedPose(phase, speed);
|
|
112
|
+
const pose = { joints, timestamp: Date.now() };
|
|
113
|
+
const leftFoot = speed < 0.05 || phase < 0.5;
|
|
114
|
+
const rightFoot = speed < 0.05 || phase >= 0.5;
|
|
115
|
+
const contactFeatures = { leftFoot, rightFoot };
|
|
116
|
+
return {
|
|
117
|
+
pose,
|
|
118
|
+
phase,
|
|
119
|
+
trajectory: projectLinearTrajectory(input.targetVelocity),
|
|
120
|
+
stability: speed > 5 ? Math.max(0.1, 1 - (speed - 5) * 0.2) : 1,
|
|
121
|
+
contactFeatures,
|
|
122
|
+
gait: classifyGait(speed, energyEfficiency),
|
|
123
|
+
kineticEnergyProxy: speed * speed * energyEfficiency
|
|
124
|
+
};
|
|
125
|
+
}
|
|
126
|
+
dispose() {
|
|
127
|
+
this.loaded = false;
|
|
128
|
+
}
|
|
129
|
+
};
|
|
130
|
+
function createSyntheticWalkCycleEngine(modelId) {
|
|
131
|
+
return new SyntheticWalkCycleEngine(modelId);
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
// src/traits/engines/motion-data-schema.ts
|
|
135
|
+
var MOTION_DATA_SCHEMA_VERSION = 1;
|
|
136
|
+
function validateTrainingFrame(frame) {
|
|
137
|
+
if (typeof frame.frameIndex !== "number" || frame.frameIndex < 0) {
|
|
138
|
+
throw new Error(`TrainingFrame: frameIndex must be a non-negative number, got ${frame.frameIndex}`);
|
|
139
|
+
}
|
|
140
|
+
if (typeof frame.phase !== "number" || frame.phase < 0 || frame.phase >= 1) {
|
|
141
|
+
throw new Error(`TrainingFrame: phase must be in [0, 1), got ${frame.phase}`);
|
|
142
|
+
}
|
|
143
|
+
if (!frame.pose || typeof frame.pose !== "object" || !frame.pose.joints) {
|
|
144
|
+
throw new Error("TrainingFrame: pose.joints required");
|
|
145
|
+
}
|
|
146
|
+
if (!frame.contactFeatures || typeof frame.contactFeatures !== "object") {
|
|
147
|
+
throw new Error("TrainingFrame: contactFeatures required");
|
|
148
|
+
}
|
|
149
|
+
const validGaits = ["idle", "walk", "trot", "run", "crouch"];
|
|
150
|
+
if (!validGaits.includes(frame.gait)) {
|
|
151
|
+
throw new Error(`TrainingFrame: gait must be one of ${validGaits.join(", ")}, got ${frame.gait}`);
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
function validateMotionCapture(capture) {
|
|
155
|
+
if (capture.schemaVersion !== MOTION_DATA_SCHEMA_VERSION) {
|
|
156
|
+
throw new Error(
|
|
157
|
+
`MotionCapture: schemaVersion ${capture.schemaVersion} unsupported (current=${MOTION_DATA_SCHEMA_VERSION})`
|
|
158
|
+
);
|
|
159
|
+
}
|
|
160
|
+
if (!capture.captureId || typeof capture.captureId !== "string") {
|
|
161
|
+
throw new Error("MotionCapture: captureId required");
|
|
162
|
+
}
|
|
163
|
+
if (!capture.skeletonId || typeof capture.skeletonId !== "string") {
|
|
164
|
+
throw new Error("MotionCapture: skeletonId required");
|
|
165
|
+
}
|
|
166
|
+
if (capture.fps <= 0 || capture.fps > 240) {
|
|
167
|
+
throw new Error(`MotionCapture: fps must be in (0, 240], got ${capture.fps}`);
|
|
168
|
+
}
|
|
169
|
+
if (!capture.license || !capture.license.spdx) {
|
|
170
|
+
throw new Error(
|
|
171
|
+
"MotionCapture: license.spdx required \u2014 every training capture must declare a commercial-use-compatible license (refuses CC BY-NC, GPL viral, proprietary without explicit grant)"
|
|
172
|
+
);
|
|
173
|
+
}
|
|
174
|
+
const blockedSpdx = ["CC-BY-NC-4.0", "CC-BY-NC-SA-4.0", "CC-BY-NC-ND-4.0", "GPL-3.0", "AGPL-3.0"];
|
|
175
|
+
if (blockedSpdx.includes(capture.license.spdx)) {
|
|
176
|
+
throw new Error(
|
|
177
|
+
`MotionCapture: license ${capture.license.spdx} is incompatible with @holoscript/core commercial distribution. Permitted: MIT, Apache-2.0, BSD-3-Clause, CC-BY-4.0 (with attribution), proprietary-with-grant.`
|
|
178
|
+
);
|
|
179
|
+
}
|
|
180
|
+
if (!Array.isArray(capture.frames) || capture.frames.length === 0) {
|
|
181
|
+
throw new Error("MotionCapture: frames must be a non-empty array");
|
|
182
|
+
}
|
|
183
|
+
for (const frame of capture.frames) validateTrainingFrame(frame);
|
|
184
|
+
}
|
|
185
|
+
function validateTrainingCorpus(corpus) {
|
|
186
|
+
if (corpus.schemaVersion !== MOTION_DATA_SCHEMA_VERSION) {
|
|
187
|
+
throw new Error(`TrainingCorpus: schemaVersion ${corpus.schemaVersion} unsupported`);
|
|
188
|
+
}
|
|
189
|
+
if (!corpus.corpusId) throw new Error("TrainingCorpus: corpusId required");
|
|
190
|
+
if (!corpus.skeletonId) throw new Error("TrainingCorpus: skeletonId required");
|
|
191
|
+
if (!corpus.splits) throw new Error("TrainingCorpus: splits required");
|
|
192
|
+
const captureIds = new Set(corpus.captures.map((c) => c.captureId));
|
|
193
|
+
const splitIds = [...corpus.splits.train, ...corpus.splits.val, ...corpus.splits.test];
|
|
194
|
+
for (const id of splitIds) {
|
|
195
|
+
if (!captureIds.has(id)) {
|
|
196
|
+
throw new Error(`TrainingCorpus: split references unknown captureId ${id}`);
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
const seenInSplit = /* @__PURE__ */ new Set();
|
|
200
|
+
for (const id of splitIds) {
|
|
201
|
+
if (seenInSplit.has(id)) {
|
|
202
|
+
throw new Error(`TrainingCorpus: captureId ${id} appears in multiple splits \u2014 data leakage`);
|
|
203
|
+
}
|
|
204
|
+
seenInSplit.add(id);
|
|
205
|
+
}
|
|
206
|
+
for (const cap of corpus.captures) {
|
|
207
|
+
if (cap.skeletonId !== corpus.skeletonId) {
|
|
208
|
+
throw new Error(
|
|
209
|
+
`TrainingCorpus: capture ${cap.captureId} skeleton ${cap.skeletonId} differs from corpus skeleton ${corpus.skeletonId}`
|
|
210
|
+
);
|
|
211
|
+
}
|
|
212
|
+
validateMotionCapture(cap);
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
function inferenceFrameToTensor(frame, sortedJointNames) {
|
|
216
|
+
const headerLen = 8;
|
|
217
|
+
const jointLen = sortedJointNames.length * 7;
|
|
218
|
+
const out = new Float32Array(headerLen + jointLen);
|
|
219
|
+
out[0] = frame.phase;
|
|
220
|
+
out[1] = frame.rootVelocity.x;
|
|
221
|
+
out[2] = frame.rootVelocity.y;
|
|
222
|
+
out[3] = frame.rootVelocity.z;
|
|
223
|
+
out[4] = frame.rootAngularVelocity;
|
|
224
|
+
const terrain = frame.terrainNormal ?? { x: 0, y: 1, z: 0 };
|
|
225
|
+
out[5] = terrain.x;
|
|
226
|
+
out[6] = terrain.y;
|
|
227
|
+
out[7] = terrain.z;
|
|
228
|
+
for (let i = 0; i < sortedJointNames.length; i++) {
|
|
229
|
+
const jointName = sortedJointNames[i];
|
|
230
|
+
const joint = frame.pose.joints[jointName];
|
|
231
|
+
const base = headerLen + i * 7;
|
|
232
|
+
if (joint) {
|
|
233
|
+
out[base + 0] = joint.position[0];
|
|
234
|
+
out[base + 1] = joint.position[1];
|
|
235
|
+
out[base + 2] = joint.position[2];
|
|
236
|
+
out[base + 3] = joint.rotation[0];
|
|
237
|
+
out[base + 4] = joint.rotation[1];
|
|
238
|
+
out[base + 5] = joint.rotation[2];
|
|
239
|
+
out[base + 6] = joint.rotation[3];
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
return out;
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
export { MOTION_DATA_SCHEMA_VERSION, NullMotionMatchingEngine, SYNTHETIC_WALK_JOINTS, SyntheticWalkCycleEngine, TRAJECTORY_FRAME_DT, TRAJECTORY_HORIZON_FRAMES, buildSyntheticBipedPose, classifyGait, createNullMotionMatchingEngine, createSyntheticWalkCycleEngine, inferenceFrameToTensor, magnitude, projectLinearTrajectory, validateMotionCapture, validateTrainingCorpus, validateTrainingFrame };
|
|
246
|
+
//# sourceMappingURL=chunk-IVY74O6C.js.map
|
|
247
|
+
//# sourceMappingURL=chunk-IVY74O6C.js.map
|