@holoscript/core 6.0.3 → 6.0.4
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 +38 -38
- package/dist/GLTFPipeline-DEN36VNK.js +12 -0
- package/dist/GLTFPipeline-YPCAK236.cjs +33 -0
- package/dist/{HoloScriptPlusParser-BZR5DELQ.js → HoloScriptPlusParser-BN6KVRCM.js} +5 -5
- package/dist/{HoloScriptPlusParser-SBMYDNXO.cjs → HoloScriptPlusParser-NC5FE6AL.cjs} +16 -16
- package/dist/{USDZExporter-YA55ZS35.js → USDZExporter-NTMBNTDB.js} +3 -3
- package/dist/{USDZExporter-MHEHXZB4.cjs → USDZExporter-UWGWNMMD.cjs} +3 -3
- package/dist/{chunk-32TWR3HE.js → chunk-2CWOLHTE.js} +3 -4
- package/dist/{chunk-2UX5LRAP.cjs → chunk-33LSUQDD.cjs} +33 -31
- package/dist/{chunk-LBPEZQAF.js → chunk-3FJCK5XA.js} +7 -7
- package/dist/{chunk-EGIZHYJP.cjs → chunk-3SAK5KFL.cjs} +2 -4
- package/dist/{chunk-PJMOXFPR.cjs → chunk-4XSNJCLC.cjs} +25 -27
- package/dist/{chunk-HKCVM6OK.cjs → chunk-5BGSECRJ.cjs} +21 -21
- package/dist/{chunk-EMO7HAKJ.cjs → chunk-5O6TQC6M.cjs} +26 -30
- package/dist/{chunk-XSUZMPVQ.cjs → chunk-5OEOHAAW.cjs} +26 -26
- package/dist/{chunk-EJA7G2C4.cjs → chunk-5WUNN6ZN.cjs} +2 -2
- package/dist/{chunk-CQDOF3G7.cjs → chunk-6TZPZCOJ.cjs} +18 -18
- package/dist/{chunk-NRUB55IT.cjs → chunk-6UEHYZ7V.cjs} +18 -16
- package/dist/{chunk-V42NTCFH.js → chunk-6XSERL6L.js} +4230 -2197
- package/dist/{chunk-X4YVN7H3.cjs → chunk-72EQECGT.cjs} +37 -17
- package/dist/{chunk-4KJ2R7VP.cjs → chunk-7AGYRWKW.cjs} +19 -19
- package/dist/{chunk-UQW6SLM5.js → chunk-A7PIMZGU.js} +110 -19
- package/dist/{chunk-RT7LJRSF.cjs → chunk-ATSKSYVE.cjs} +1013 -6708
- package/dist/{chunk-WN3YF33G.cjs → chunk-B5TCIAPQ.cjs} +9 -10
- package/dist/{chunk-AIUXRS74.cjs → chunk-BF2235SI.cjs} +4275 -2242
- package/dist/{chunk-DIEDKX5B.cjs → chunk-BND3ST2K.cjs} +18 -16
- package/dist/{chunk-EPWRXL6S.js → chunk-BU7VWW2K.js} +29 -29
- package/dist/{chunk-6OQBLABR.js → chunk-BWFJEM5A.js} +368 -189
- package/dist/{chunk-ARNKA274.cjs → chunk-CAUCGUEA.cjs} +6 -6
- package/dist/{chunk-YCMQQQ5U.cjs → chunk-CBJSLA2E.cjs} +398 -219
- package/dist/{chunk-BU5ZAFMC.js → chunk-CDPGV4DN.js} +6 -7
- package/dist/{chunk-CO2VM2DK.js → chunk-CS2EMTGF.js} +10 -9
- package/dist/{chunk-AW7WAELW.js → chunk-DMG7C4H2.js} +4 -4
- package/dist/{chunk-XSF76QRU.js → chunk-DXJQDCFL.js} +3 -3
- package/dist/{chunk-4FCZDTD5.js → chunk-E3FWRT3Z.js} +7 -9
- package/dist/{chunk-KYM4XRFG.js → chunk-E3UALNFA.js} +4 -4
- package/dist/{chunk-GC3YU46J.js → chunk-EONILVMF.js} +2 -2
- package/dist/{chunk-VJVCD5T5.cjs → chunk-EQV4R3EV.cjs} +22 -22
- package/dist/{chunk-FEFHPUEM.cjs → chunk-F3HH56EB.cjs} +74 -658
- package/dist/{chunk-WYH4GVZ5.js → chunk-F4IULT7N.js} +2 -2
- package/dist/{chunk-XDXZM3ZP.cjs → chunk-FFKU7BTK.cjs} +19 -19
- package/dist/{chunk-NKRKT6V2.js → chunk-FHQVYCH2.js} +11 -10
- package/dist/{chunk-7H5UNJZD.cjs → chunk-FSF7EQVA.cjs} +11 -10
- package/dist/{chunk-KUJRR4FJ.js → chunk-G4VZTCIB.js} +9 -7
- package/dist/{chunk-A6GO3DPZ.cjs → chunk-G7CT3EMP.cjs} +4 -4
- package/dist/{chunk-EUFLX2PI.js → chunk-GGHSW2NN.js} +989 -6611
- package/dist/chunk-GVUR45UF.cjs +777 -0
- package/dist/{chunk-ODGMVILH.js → chunk-H5Z7NASB.js} +3 -3
- package/dist/{chunk-7KPI4EKH.cjs → chunk-HE7ULERA.cjs} +45 -49
- package/dist/{chunk-26TLYBFD.js → chunk-HPS76H7Q.js} +3 -3
- package/dist/{chunk-RE3OKSYF.cjs → chunk-HQUEA5R6.cjs} +6 -6
- package/dist/{chunk-ZGTGVSTZ.js → chunk-HYNTS5CP.js} +2 -2
- package/dist/{chunk-PBA6NXCT.cjs → chunk-IBDG74G2.cjs} +6 -3
- package/dist/chunk-IFNQFCTM.js +3098 -0
- package/dist/{chunk-ZL6VJ6SN.js → chunk-IWI6J7FX.js} +5 -5
- package/dist/{chunk-3KEU5QYY.cjs → chunk-K3JDKWGI.cjs} +118 -23
- package/dist/{chunk-NLPSZT4C.js → chunk-K6EKD26I.js} +6 -6
- package/dist/chunk-KCQ5NDYC.cjs +3172 -0
- package/dist/{chunk-ELLQPFAF.js → chunk-KED34ILP.js} +11 -9
- package/dist/{chunk-BY3B7ZYV.cjs → chunk-KSGXLT74.cjs} +3 -3
- package/dist/{chunk-65RFOWZI.js → chunk-L4G4RLXX.js} +9 -7
- package/dist/{chunk-4SMUJFHL.js → chunk-LDP5OK6G.js} +6 -3
- package/dist/{chunk-VZNKJZTT.cjs → chunk-LGGRPKTV.cjs} +82 -96
- package/dist/{chunk-C2QHVHZF.js → chunk-LSW7P7ML.js} +23 -414
- package/dist/{chunk-HHS6FMOU.cjs → chunk-LXJ4667L.cjs} +83 -22
- package/dist/{chunk-H6WMMLQK.cjs → chunk-LZ266PCM.cjs} +20 -13
- package/dist/{chunk-V2ILLPHK.cjs → chunk-MD6KDHVE.cjs} +10 -10
- package/dist/{chunk-6WNCRE6F.js → chunk-MEASWI2Y.js} +5 -5
- package/dist/chunk-MPXBVFHQ.js +768 -0
- package/dist/{chunk-WUXIRGZP.cjs → chunk-NCUKG4SK.cjs} +304 -144
- package/dist/chunk-NDQNIJEH.js +1715 -0
- package/dist/{chunk-Y5MUAYTO.js → chunk-NOZZ46QU.js} +9 -8
- package/dist/{chunk-F5LVGHNT.js → chunk-OFKWH2IP.js} +3 -3
- package/dist/{chunk-SPDELRRV.cjs → chunk-PMGODDJA.cjs} +12 -12
- package/dist/{chunk-I3XGTIHM.cjs → chunk-Q4QX3AET.cjs} +2 -2
- package/dist/{chunk-Y7VK5TH3.cjs → chunk-Q5JT3YML.cjs} +10 -10
- package/dist/{chunk-TSWTWZ42.cjs → chunk-Q5SJOGHQ.cjs} +247 -205
- package/dist/{chunk-M6FU6S22.js → chunk-QGKNANZ3.js} +251 -91
- package/dist/{chunk-WFJIDI2N.cjs → chunk-QLEAOI3Q.cjs} +10 -10
- package/dist/{chunk-VK5AXKO3.js → chunk-R7MA7QWV.js} +70 -84
- package/dist/{chunk-W76ETJTI.js → chunk-RVYPEYPX.js} +6 -6
- package/dist/{chunk-MWEFR6YQ.js → chunk-S2N5TNMA.js} +7 -9
- package/dist/{chunk-NCUHGRTZ.js → chunk-S565K7NK.js} +7 -7
- package/dist/{chunk-AC4BSHFV.js → chunk-SDAMZIRE.js} +5 -5
- package/dist/{chunk-HBZYCASG.js → chunk-T36DDXSF.js} +75 -33
- package/dist/{chunk-BO2OKHIY.js → chunk-T4NKMBDL.js} +30 -611
- package/dist/{chunk-7X2IEJIE.cjs → chunk-T7LEXZUZ.cjs} +29 -29
- package/dist/{chunk-HUFNKFA6.js → chunk-TEWCN33Y.js} +8 -12
- package/dist/{chunk-L3Z2HIWJ.cjs → chunk-TQSZUOW5.cjs} +2 -2
- package/dist/chunk-TSH3MSQU.cjs +129 -0
- package/dist/{chunk-PLMYCCA4.js → chunk-UERJ3YJV.js} +6 -6
- package/dist/{chunk-7N3JIJMT.js → chunk-UPJBDCVF.js} +6 -6
- package/dist/{chunk-CMYAWUX3.js → chunk-V3NN3HPP.js} +12 -5
- package/dist/{chunk-SUCBB66F.js → chunk-WB4Z63GG.js} +3 -3
- package/dist/{chunk-PPULB4GG.cjs → chunk-WDW67DZB.cjs} +68 -68
- package/dist/chunk-WGMEAYBG.js +126 -0
- package/dist/{chunk-VSXOIUCF.cjs → chunk-X4ZF6CNE.cjs} +7 -7
- package/dist/{chunk-HF4OFY25.cjs → chunk-X6SEAXAX.cjs} +29 -445
- package/dist/{chunk-C7BNX4XJ.js → chunk-XCWFGZAA.js} +6 -6
- package/dist/{chunk-CNVM7J3M.js → chunk-XD6IYDUX.js} +34 -14
- package/dist/chunk-XG23EUQX.cjs +1717 -0
- package/dist/{chunk-DN7UFU63.cjs → chunk-XRKWN5PL.cjs} +12 -11
- package/dist/{chunk-XNMEH2BI.js → chunk-XUTX5CBW.js} +3 -3
- package/dist/{chunk-PQLGZKMC.cjs → chunk-XWPNTWDN.cjs} +26 -26
- package/dist/{chunk-NTMZSDXM.cjs → chunk-XXINBTZK.cjs} +43 -43
- package/dist/{chunk-74YCHHTE.js → chunk-YCXFCXDS.js} +8 -12
- package/dist/{chunk-KDB6BUMB.js → chunk-YQK5JNFK.js} +77 -18
- package/dist/{chunk-DH5G2JUA.cjs → chunk-Z34RLXRA.cjs} +44 -46
- package/dist/{chunk-XH7SE4HH.cjs → chunk-ZP4D3CSX.cjs} +19 -19
- package/dist/cli/holoscript-runner.cjs +33 -32
- package/dist/cli/holoscript-runner.js +13 -12
- package/dist/codebase/index.cjs +1 -1
- package/dist/codebase/index.d.ts +25 -0
- package/dist/codebase/index.js +1 -1
- package/dist/compiler/agent-inference.cjs +7 -8
- package/dist/compiler/agent-inference.js +3 -4
- package/dist/compiler/android-xr.cjs +7 -8
- package/dist/compiler/android-xr.js +5 -6
- package/dist/compiler/android.cjs +8 -9
- package/dist/compiler/android.js +6 -7
- package/dist/compiler/ar.cjs +6 -7
- package/dist/compiler/ar.js +4 -5
- package/dist/compiler/babylon.cjs +8 -9
- package/dist/compiler/babylon.js +7 -8
- package/dist/compiler/coco.cjs +1 -1
- package/dist/compiler/coco.js +1 -1
- package/dist/compiler/domain-block-utils.cjs +158 -151
- package/dist/compiler/domain-block-utils.js +4 -5
- package/dist/compiler/dtdl.cjs +7 -8
- package/dist/compiler/dtdl.js +4 -5
- package/dist/compiler/gltf-pipeline.cjs +9 -9
- package/dist/compiler/gltf-pipeline.js +2 -2
- package/dist/compiler/godot.cjs +6 -7
- package/dist/compiler/godot.js +5 -6
- package/dist/compiler/incremental.cjs +7 -8
- package/dist/compiler/incremental.js +2 -3
- package/dist/compiler/index.cjs +1934 -878
- package/dist/compiler/index.js +1904 -842
- package/dist/compiler/ios.cjs +8 -9
- package/dist/compiler/ios.js +6 -7
- package/dist/compiler/multi-layer.cjs +10 -17
- package/dist/compiler/multi-layer.js +9 -10
- package/dist/compiler/nodetoy.cjs +1 -1
- package/dist/compiler/nodetoy.js +1 -1
- package/dist/compiler/openxr.cjs +6 -7
- package/dist/compiler/openxr.js +5 -6
- package/dist/compiler/playcanvas.cjs +7 -8
- package/dist/compiler/playcanvas.js +6 -7
- package/dist/compiler/r3f.cjs +13 -14
- package/dist/compiler/r3f.js +8 -9
- package/dist/compiler/remotion.cjs +1 -1
- package/dist/compiler/remotion.js +1 -1
- package/dist/compiler/reproducibility.cjs +1 -1
- package/dist/compiler/reproducibility.js +1 -1
- package/dist/compiler/sdf.cjs +7 -8
- package/dist/compiler/sdf.js +5 -6
- package/dist/compiler/semantic-scene.cjs +7 -7
- package/dist/compiler/semantic-scene.js +2 -2
- package/dist/compiler/state.cjs +5 -6
- package/dist/compiler/state.js +3 -4
- package/dist/compiler/trait-composition.cjs +7 -8
- package/dist/compiler/trait-composition.js +3 -4
- package/dist/compiler/unity.cjs +6 -7
- package/dist/compiler/unity.js +5 -6
- package/dist/compiler/unreal.cjs +7 -8
- package/dist/compiler/unreal.js +5 -6
- package/dist/compiler/urdf.cjs +13 -14
- package/dist/compiler/urdf.js +5 -6
- package/dist/compiler/usd-physics.cjs +7 -8
- package/dist/compiler/usd-physics.js +4 -5
- package/dist/compiler/visionos.cjs +6 -7
- package/dist/compiler/visionos.js +5 -6
- package/dist/compiler/vrchat.cjs +7 -8
- package/dist/compiler/vrchat.js +5 -6
- package/dist/compiler/vrr.cjs +7 -8
- package/dist/compiler/vrr.js +5 -6
- package/dist/compiler/wasm.cjs +10 -11
- package/dist/compiler/wasm.js +5 -6
- package/dist/compiler/webgpu.cjs +6 -7
- package/dist/compiler/webgpu.js +5 -6
- package/dist/constants.d.ts +3 -0
- package/dist/debugger.cjs +7 -7
- package/dist/debugger.js +5 -5
- package/dist/entries/interop.cjs +1 -1
- package/dist/entries/interop.d.ts +9 -0
- package/dist/entries/interop.js +1 -1
- package/dist/entries/scripting.cjs +18 -17
- package/dist/entries/scripting.d.ts +7 -0
- package/dist/entries/scripting.js +8 -7
- package/dist/index.cjs +6773 -27555
- package/dist/index.d.ts +19 -0
- package/dist/index.js +5212 -26101
- package/dist/math/vec3.cjs +1 -1
- package/dist/math/vec3.js +1 -1
- package/dist/ml-dsa-PHCWUBPX.cjs +1178 -0
- package/dist/ml-dsa-WYLJHJO6.js +1178 -0
- package/dist/parser.cjs +11 -10
- package/dist/parser.js +8 -7
- package/dist/{playwright-BIZXMLD2.js → playwright-5OSAPTNH.js} +3 -3
- package/dist/{playwright-7DTEQCBD.cjs → playwright-RL6GY4F7.cjs} +1985 -1985
- package/dist/runtime.cjs +5 -5
- package/dist/runtime.js +4 -4
- package/dist/self-improvement/index.d.ts +0 -48
- package/dist/storage/index.cjs +1 -1
- package/dist/storage/index.d.ts +24 -0
- package/dist/storage/index.js +1 -1
- package/dist/tools/index.d.ts +12 -0
- package/dist/traits/index.cjs +925 -607
- package/dist/traits/index.js +137 -20
- package/dist/type-checker.cjs +4 -4
- package/dist/type-checker.js +2 -2
- package/package.json +56 -21
- package/LICENSE +0 -21
- package/dist/GLTFPipeline-3KLWWUQO.cjs +0 -34
- package/dist/GLTFPipeline-LYII2ZVQ.js +0 -13
- package/dist/chunk-CN4NOESF.cjs +0 -416
- package/dist/chunk-DXVCEFZB.js +0 -2027
- package/dist/chunk-ENV7K6XA.js +0 -282
- package/dist/chunk-H7XMORZI.js +0 -2731
- package/dist/chunk-HAN4V3PF.cjs +0 -2037
- package/dist/chunk-LER4WXW5.cjs +0 -286
- package/dist/chunk-QHVVVN47.cjs +0 -2033
- package/dist/chunk-QWKUKVRE.js +0 -2026
- package/dist/chunk-UITWA6DV.cjs +0 -2829
- package/dist/chunk-X67XRI2T.js +0 -410
- package/dist/post-quantum-JTTAAGO3.cjs +0 -6
- package/dist/post-quantum-RVPVDEPI.js +0 -4
- package/dist/wot/index.cjs +0 -29
- package/dist/wot/index.js +0 -4
|
@@ -1,13 +1,14 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var
|
|
4
|
-
var
|
|
5
|
-
var
|
|
6
|
-
var
|
|
3
|
+
var chunkMD6KDHVE_cjs = require('./chunk-MD6KDHVE.cjs');
|
|
4
|
+
var chunkCAUCGUEA_cjs = require('./chunk-CAUCGUEA.cjs');
|
|
5
|
+
var chunkBF2235SI_cjs = require('./chunk-BF2235SI.cjs');
|
|
6
|
+
var chunk3SAK5KFL_cjs = require('./chunk-3SAK5KFL.cjs');
|
|
7
|
+
var platform = require('@holoscript/platform');
|
|
7
8
|
|
|
8
9
|
// src/compiler/IOSCompiler.ts
|
|
9
10
|
var IOSCompiler_exports = {};
|
|
10
|
-
|
|
11
|
+
chunk3SAK5KFL_cjs.__export(IOSCompiler_exports, {
|
|
11
12
|
IOSCompiler: () => exports.IOSCompiler,
|
|
12
13
|
compileToIOS: () => compileToIOS
|
|
13
14
|
});
|
|
@@ -16,21 +17,20 @@ function compileToIOS(composition, options) {
|
|
|
16
17
|
return compiler.compile(composition, "test-token");
|
|
17
18
|
}
|
|
18
19
|
exports.IOSCompiler = void 0;
|
|
19
|
-
var init_IOSCompiler =
|
|
20
|
+
var init_IOSCompiler = chunk3SAK5KFL_cjs.__esm({
|
|
20
21
|
"src/compiler/IOSCompiler.ts"() {
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
exports.IOSCompiler = class extends chunkQHVVVN47_cjs.CompilerBase {
|
|
22
|
+
chunkBF2235SI_cjs.init_CompilerBase();
|
|
23
|
+
chunkMD6KDHVE_cjs.init_roomplan();
|
|
24
|
+
chunkMD6KDHVE_cjs.init_lidar_scanner();
|
|
25
|
+
chunkCAUCGUEA_cjs.init_npu_scene();
|
|
26
|
+
chunkCAUCGUEA_cjs.init_portal_ar();
|
|
27
|
+
chunkCAUCGUEA_cjs.init_camera_hand_tracking();
|
|
28
|
+
chunkMD6KDHVE_cjs.init_face_tracking();
|
|
29
|
+
chunkMD6KDHVE_cjs.init_ios_object_capture();
|
|
30
|
+
chunkMD6KDHVE_cjs.init_shareplay();
|
|
31
|
+
chunkMD6KDHVE_cjs.init_uwb_positioning();
|
|
32
|
+
chunkMD6KDHVE_cjs.init_airpods_spatial_audio();
|
|
33
|
+
exports.IOSCompiler = class extends chunkBF2235SI_cjs.CompilerBase {
|
|
34
34
|
constructor(options = {}) {
|
|
35
35
|
super();
|
|
36
36
|
this.compilerName = "IOSCompiler";
|
|
@@ -46,7 +46,7 @@ var init_IOSCompiler = chunkEGIZHYJP_cjs.__esm({
|
|
|
46
46
|
};
|
|
47
47
|
}
|
|
48
48
|
getRequiredCapability() {
|
|
49
|
-
return
|
|
49
|
+
return platform.ANSCapabilityPath.IOS;
|
|
50
50
|
}
|
|
51
51
|
compile(composition, agentToken, outputPath) {
|
|
52
52
|
this.validateCompilerAccess(agentToken, outputPath);
|
|
@@ -669,9 +669,7 @@ var init_IOSCompiler = chunkEGIZHYJP_cjs.__esm({
|
|
|
669
669
|
const name = this.sanitizeName(action.name);
|
|
670
670
|
this.emit(`func ${name}() {`);
|
|
671
671
|
this.indentLevel++;
|
|
672
|
-
this.emit(
|
|
673
|
-
`print("[HoloScript] Action: ${this.escapeStringValue(action.name, "Swift")}")`
|
|
674
|
-
);
|
|
672
|
+
this.emit(`print("[HoloScript] Action: ${this.escapeStringValue(action.name, "Swift")}")`);
|
|
675
673
|
this.emit("// Action implementation");
|
|
676
674
|
this.indentLevel--;
|
|
677
675
|
this.emit("}");
|
|
@@ -732,7 +730,9 @@ var init_IOSCompiler = chunkEGIZHYJP_cjs.__esm({
|
|
|
732
730
|
this.indentLevel--;
|
|
733
731
|
this.emit("} else {");
|
|
734
732
|
this.indentLevel++;
|
|
735
|
-
this.emit(
|
|
733
|
+
this.emit(
|
|
734
|
+
'print("[HoloScript] ARGeoTracking not available: \\(error?.localizedDescription ?? \\"unknown\\")")'
|
|
735
|
+
);
|
|
736
736
|
this.indentLevel--;
|
|
737
737
|
this.emit("}");
|
|
738
738
|
this.indentLevel--;
|
|
@@ -767,9 +767,13 @@ var init_IOSCompiler = chunkEGIZHYJP_cjs.__esm({
|
|
|
767
767
|
const heading = headingConfig.degrees ?? 0;
|
|
768
768
|
this.emit(`// Geo-anchor: ${this.escapeStringValue(obj.name, "Swift")}`);
|
|
769
769
|
if (usesARGeoAnchor) {
|
|
770
|
-
this.emit(
|
|
770
|
+
this.emit(
|
|
771
|
+
`createGeoAnchor(name: "${this.escapeStringValue(obj.name, "Swift")}", latitude: ${lat}, longitude: ${lng}, altitude: ${alt}, heading: ${heading})`
|
|
772
|
+
);
|
|
771
773
|
} else {
|
|
772
|
-
this.emit(
|
|
774
|
+
this.emit(
|
|
775
|
+
`createLocationAnchor(name: "${this.escapeStringValue(obj.name, "Swift")}", latitude: ${lat}, longitude: ${lng}, altitude: ${alt})`
|
|
776
|
+
);
|
|
773
777
|
}
|
|
774
778
|
}
|
|
775
779
|
const usesPersist = this.compositionHasTrait(composition, "geo_persist");
|
|
@@ -782,20 +786,28 @@ var init_IOSCompiler = chunkEGIZHYJP_cjs.__esm({
|
|
|
782
786
|
this.emit("}");
|
|
783
787
|
this.emit("");
|
|
784
788
|
if (usesARGeoAnchor) {
|
|
785
|
-
this.emit(
|
|
789
|
+
this.emit(
|
|
790
|
+
"func createGeoAnchor(name: String, latitude: Double, longitude: Double, altitude: Double, heading: Double) {"
|
|
791
|
+
);
|
|
786
792
|
this.indentLevel++;
|
|
787
793
|
this.emit("guard let arView = arView else { return }");
|
|
788
|
-
this.emit(
|
|
794
|
+
this.emit(
|
|
795
|
+
"let coordinate = CLLocationCoordinate2D(latitude: latitude, longitude: longitude)"
|
|
796
|
+
);
|
|
789
797
|
this.emit("let geoAnchor = ARGeoAnchor(coordinate: coordinate, altitude: altitude)");
|
|
790
798
|
this.emit("geoAnchor.name = name");
|
|
791
799
|
this.emit("arView.session.add(anchor: geoAnchor)");
|
|
792
800
|
this.emit("geoAnchors[name] = geoAnchor");
|
|
793
|
-
this.emit(
|
|
801
|
+
this.emit(
|
|
802
|
+
'print("[HoloScript] Geo-anchored: \\(name) at (\\(latitude), \\(longitude), \\(altitude))")'
|
|
803
|
+
);
|
|
794
804
|
this.indentLevel--;
|
|
795
805
|
this.emit("}");
|
|
796
806
|
this.emit("");
|
|
797
807
|
}
|
|
798
|
-
this.emit(
|
|
808
|
+
this.emit(
|
|
809
|
+
"func createLocationAnchor(name: String, latitude: Double, longitude: Double, altitude: Double) {"
|
|
810
|
+
);
|
|
799
811
|
this.indentLevel++;
|
|
800
812
|
this.emit("guard let arView = arView else { return }");
|
|
801
813
|
this.emit("let _ = CLLocation(latitude: latitude, longitude: longitude)");
|
|
@@ -820,14 +832,18 @@ var init_IOSCompiler = chunkEGIZHYJP_cjs.__esm({
|
|
|
820
832
|
this.indentLevel++;
|
|
821
833
|
this.emit("guard let map = worldMap else {");
|
|
822
834
|
this.indentLevel++;
|
|
823
|
-
this.emit(
|
|
835
|
+
this.emit(
|
|
836
|
+
'print("[HoloScript] Failed to get world map: \\(error?.localizedDescription ?? \\"unknown\\")")'
|
|
837
|
+
);
|
|
824
838
|
this.emit("return");
|
|
825
839
|
this.indentLevel--;
|
|
826
840
|
this.emit("}");
|
|
827
841
|
this.emit("");
|
|
828
842
|
this.emit("do {");
|
|
829
843
|
this.indentLevel++;
|
|
830
|
-
this.emit(
|
|
844
|
+
this.emit(
|
|
845
|
+
"let data = try NSKeyedArchiver.archivedData(withRootObject: map, requiringSecureCoding: true)"
|
|
846
|
+
);
|
|
831
847
|
this.emit("let url = self.worldMapURL()");
|
|
832
848
|
this.emit("try data.write(to: url)");
|
|
833
849
|
this.emit('print("[HoloScript] World map saved to \\(url)")');
|
|
@@ -846,7 +862,9 @@ var init_IOSCompiler = chunkEGIZHYJP_cjs.__esm({
|
|
|
846
862
|
this.indentLevel++;
|
|
847
863
|
this.emit("let url = worldMapURL()");
|
|
848
864
|
this.emit("guard let data = try? Data(contentsOf: url),");
|
|
849
|
-
this.emit(
|
|
865
|
+
this.emit(
|
|
866
|
+
" let worldMap = try? NSKeyedUnarchiver.unarchivedObject(ofClass: ARWorldMap.self, from: data) else {"
|
|
867
|
+
);
|
|
850
868
|
this.indentLevel++;
|
|
851
869
|
this.emit('print("[HoloScript] No saved world map found")');
|
|
852
870
|
this.emit("return");
|
|
@@ -857,14 +875,18 @@ var init_IOSCompiler = chunkEGIZHYJP_cjs.__esm({
|
|
|
857
875
|
this.emit("let configuration = ARWorldTrackingConfiguration()");
|
|
858
876
|
this.emit("configuration.planeDetection = [.horizontal, .vertical]");
|
|
859
877
|
this.emit("configuration.initialWorldMap = worldMap");
|
|
860
|
-
this.emit(
|
|
878
|
+
this.emit(
|
|
879
|
+
"arView.session.run(configuration, options: [.resetTracking, .removeExistingAnchors])"
|
|
880
|
+
);
|
|
861
881
|
this.emit('print("[HoloScript] World map restored with \\(worldMap.anchors.count) anchors")');
|
|
862
882
|
this.indentLevel--;
|
|
863
883
|
this.emit("}");
|
|
864
884
|
this.emit("");
|
|
865
885
|
this.emit("private func worldMapURL() -> URL {");
|
|
866
886
|
this.indentLevel++;
|
|
867
|
-
this.emit(
|
|
887
|
+
this.emit(
|
|
888
|
+
"let documentsPath = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first!"
|
|
889
|
+
);
|
|
868
890
|
this.emit('return documentsPath.appendingPathComponent("holoscript_worldmap.arworldmap")');
|
|
869
891
|
this.indentLevel--;
|
|
870
892
|
this.emit("}");
|
|
@@ -876,7 +898,7 @@ var init_IOSCompiler = chunkEGIZHYJP_cjs.__esm({
|
|
|
876
898
|
* Check whether the composition references any roomplan_* traits.
|
|
877
899
|
*/
|
|
878
900
|
hasRoomPlanTraits(composition) {
|
|
879
|
-
const roomplanNames =
|
|
901
|
+
const roomplanNames = chunkMD6KDHVE_cjs.ROOMPLAN_TRAITS;
|
|
880
902
|
for (const obj of composition.objects || []) {
|
|
881
903
|
if (obj.traits?.some((t) => roomplanNames.includes(t.name))) {
|
|
882
904
|
return true;
|
|
@@ -911,9 +933,7 @@ var init_IOSCompiler = chunkEGIZHYJP_cjs.__esm({
|
|
|
911
933
|
this.emit("import SceneKit");
|
|
912
934
|
this.emit("import SwiftUI");
|
|
913
935
|
this.emit("");
|
|
914
|
-
this.emit(
|
|
915
|
-
"/// A single entity in the HoloScript scene graph produced from a RoomPlan scan."
|
|
916
|
-
);
|
|
936
|
+
this.emit("/// A single entity in the HoloScript scene graph produced from a RoomPlan scan.");
|
|
917
937
|
this.emit("struct HoloEntity: Identifiable {");
|
|
918
938
|
this.indentLevel++;
|
|
919
939
|
this.emit("let id: UUID");
|
|
@@ -972,9 +992,7 @@ var init_IOSCompiler = chunkEGIZHYJP_cjs.__esm({
|
|
|
972
992
|
this.emit("");
|
|
973
993
|
this.emit("// MARK: - Surface mapping");
|
|
974
994
|
this.emit("");
|
|
975
|
-
this.emit(
|
|
976
|
-
"private func mapSurface(_ surface: CapturedRoom.Surface) -> HoloEntity {"
|
|
977
|
-
);
|
|
995
|
+
this.emit("private func mapSurface(_ surface: CapturedRoom.Surface) -> HoloEntity {");
|
|
978
996
|
this.indentLevel++;
|
|
979
997
|
this.emit("let (label, category, traits) = surfaceMeta(surface)");
|
|
980
998
|
this.emit("return HoloEntity(");
|
|
@@ -1030,9 +1048,7 @@ var init_IOSCompiler = chunkEGIZHYJP_cjs.__esm({
|
|
|
1030
1048
|
this.emit("");
|
|
1031
1049
|
this.emit("// MARK: - Object mapping");
|
|
1032
1050
|
this.emit("");
|
|
1033
|
-
this.emit(
|
|
1034
|
-
"private func mapObject(_ object: CapturedRoom.Object) -> HoloEntity {"
|
|
1035
|
-
);
|
|
1051
|
+
this.emit("private func mapObject(_ object: CapturedRoom.Object) -> HoloEntity {");
|
|
1036
1052
|
this.indentLevel++;
|
|
1037
1053
|
this.emit("let (label, traits) = objectMeta(object)");
|
|
1038
1054
|
this.emit("return HoloEntity(");
|
|
@@ -1049,9 +1065,7 @@ var init_IOSCompiler = chunkEGIZHYJP_cjs.__esm({
|
|
|
1049
1065
|
this.indentLevel--;
|
|
1050
1066
|
this.emit("}");
|
|
1051
1067
|
this.emit("");
|
|
1052
|
-
this.emit(
|
|
1053
|
-
"private func objectMeta(_ o: CapturedRoom.Object) -> (String, [String]) {"
|
|
1054
|
-
);
|
|
1068
|
+
this.emit("private func objectMeta(_ o: CapturedRoom.Object) -> (String, [String]) {");
|
|
1055
1069
|
this.indentLevel++;
|
|
1056
1070
|
this.emit("switch o.category {");
|
|
1057
1071
|
this.emit("case .table:");
|
|
@@ -1105,9 +1119,7 @@ var init_IOSCompiler = chunkEGIZHYJP_cjs.__esm({
|
|
|
1105
1119
|
this.emit("self.capturedRoom = room");
|
|
1106
1120
|
this.emit("var result: [HoloEntity] = []");
|
|
1107
1121
|
this.emit("");
|
|
1108
|
-
this.emit(
|
|
1109
|
-
"for surface in room.walls + room.doors + room.windows + room.openings {"
|
|
1110
|
-
);
|
|
1122
|
+
this.emit("for surface in room.walls + room.doors + room.windows + room.openings {");
|
|
1111
1123
|
this.indentLevel++;
|
|
1112
1124
|
this.emit("result.append(mapSurface(surface))");
|
|
1113
1125
|
this.indentLevel--;
|
|
@@ -1126,35 +1138,27 @@ var init_IOSCompiler = chunkEGIZHYJP_cjs.__esm({
|
|
|
1126
1138
|
this.emit("}");
|
|
1127
1139
|
this.emit("");
|
|
1128
1140
|
this.emit("self.entities = result");
|
|
1129
|
-
this.emit(
|
|
1130
|
-
'print("[HoloScript] Processed \\(result.count) entities from RoomPlan scan")'
|
|
1131
|
-
);
|
|
1141
|
+
this.emit('print("[HoloScript] Processed \\(result.count) entities from RoomPlan scan")');
|
|
1132
1142
|
this.indentLevel--;
|
|
1133
1143
|
this.emit("}");
|
|
1134
1144
|
this.emit("");
|
|
1135
1145
|
this.emit("// MARK: - .holo export");
|
|
1136
1146
|
this.emit("");
|
|
1137
|
-
this.emit(
|
|
1138
|
-
"/// Serialize captured entities to a HoloScript .holo scene string."
|
|
1139
|
-
);
|
|
1147
|
+
this.emit("/// Serialize captured entities to a HoloScript .holo scene string.");
|
|
1140
1148
|
this.emit("func exportToHolo() -> String {");
|
|
1141
1149
|
this.indentLevel++;
|
|
1142
1150
|
this.emit("var lines: [String] = []");
|
|
1143
1151
|
this.emit('lines.append("composition RoomScan {")');
|
|
1144
1152
|
this.emit("for entity in entities {");
|
|
1145
1153
|
this.indentLevel++;
|
|
1146
|
-
this.emit(
|
|
1147
|
-
'lines.append(" object \\(entity.label)_\\(entity.id.uuidString.prefix(8)) {")'
|
|
1148
|
-
);
|
|
1154
|
+
this.emit('lines.append(" object \\(entity.label)_\\(entity.id.uuidString.prefix(8)) {")');
|
|
1149
1155
|
this.emit(
|
|
1150
1156
|
'lines.append(" position: [\\(entity.position.x), \\(entity.position.y), \\(entity.position.z)]")'
|
|
1151
1157
|
);
|
|
1152
1158
|
this.emit(
|
|
1153
1159
|
'lines.append(" dimensions: [\\(entity.dimensions.x), \\(entity.dimensions.y), \\(entity.dimensions.z)]")'
|
|
1154
1160
|
);
|
|
1155
|
-
this.emit(
|
|
1156
|
-
'lines.append(" category: \\"\\(entity.category)\\"")'
|
|
1157
|
-
);
|
|
1161
|
+
this.emit('lines.append(" category: \\"\\(entity.category)\\"")');
|
|
1158
1162
|
this.emit("for trait in entity.traits {");
|
|
1159
1163
|
this.indentLevel++;
|
|
1160
1164
|
this.emit('lines.append(" trait \\(trait)")');
|
|
@@ -1170,13 +1174,9 @@ var init_IOSCompiler = chunkEGIZHYJP_cjs.__esm({
|
|
|
1170
1174
|
this.indentLevel--;
|
|
1171
1175
|
this.emit("}");
|
|
1172
1176
|
this.emit("");
|
|
1173
|
-
this.emit(
|
|
1174
|
-
`extension ${cls}RoomPlanManager: RoomCaptureSessionDelegate {`
|
|
1175
|
-
);
|
|
1177
|
+
this.emit(`extension ${cls}RoomPlanManager: RoomCaptureSessionDelegate {`);
|
|
1176
1178
|
this.indentLevel++;
|
|
1177
|
-
this.emit(
|
|
1178
|
-
"func captureSession(_ session: RoomCaptureSession, didUpdate room: CapturedRoom) {"
|
|
1179
|
-
);
|
|
1179
|
+
this.emit("func captureSession(_ session: RoomCaptureSession, didUpdate room: CapturedRoom) {");
|
|
1180
1180
|
this.indentLevel++;
|
|
1181
1181
|
this.emit("DispatchQueue.main.async { [weak self] in");
|
|
1182
1182
|
this.indentLevel++;
|
|
@@ -1195,9 +1195,7 @@ var init_IOSCompiler = chunkEGIZHYJP_cjs.__esm({
|
|
|
1195
1195
|
this.emit("self?.isScanning = false");
|
|
1196
1196
|
this.emit("if let error = error {");
|
|
1197
1197
|
this.indentLevel++;
|
|
1198
|
-
this.emit(
|
|
1199
|
-
'print("[HoloScript] RoomPlan error: \\(error.localizedDescription)")'
|
|
1200
|
-
);
|
|
1198
|
+
this.emit('print("[HoloScript] RoomPlan error: \\(error.localizedDescription)")');
|
|
1201
1199
|
this.emit("return");
|
|
1202
1200
|
this.indentLevel--;
|
|
1203
1201
|
this.emit("}");
|
|
@@ -1213,9 +1211,7 @@ var init_IOSCompiler = chunkEGIZHYJP_cjs.__esm({
|
|
|
1213
1211
|
this.emit("");
|
|
1214
1212
|
this.emit(`struct ${cls}RoomPlanView: View {`);
|
|
1215
1213
|
this.indentLevel++;
|
|
1216
|
-
this.emit(
|
|
1217
|
-
`@StateObject private var manager = ${cls}RoomPlanManager()`
|
|
1218
|
-
);
|
|
1214
|
+
this.emit(`@StateObject private var manager = ${cls}RoomPlanManager()`);
|
|
1219
1215
|
this.emit("");
|
|
1220
1216
|
this.emit("var body: some View {");
|
|
1221
1217
|
this.indentLevel++;
|
|
@@ -1245,12 +1241,8 @@ var init_IOSCompiler = chunkEGIZHYJP_cjs.__esm({
|
|
|
1245
1241
|
this.emit("VStack(alignment: .leading) {");
|
|
1246
1242
|
this.indentLevel++;
|
|
1247
1243
|
this.emit("Text(entity.label).font(.headline)");
|
|
1248
|
-
this.emit(
|
|
1249
|
-
|
|
1250
|
-
);
|
|
1251
|
-
this.emit(
|
|
1252
|
-
'Text(entity.traits.joined(separator: ", ")).font(.caption2)'
|
|
1253
|
-
);
|
|
1244
|
+
this.emit("Text(entity.category).font(.caption).foregroundColor(.secondary)");
|
|
1245
|
+
this.emit('Text(entity.traits.joined(separator: ", ")).font(.caption2)');
|
|
1254
1246
|
this.indentLevel--;
|
|
1255
1247
|
this.emit("}");
|
|
1256
1248
|
this.indentLevel--;
|
|
@@ -1265,14 +1257,14 @@ var init_IOSCompiler = chunkEGIZHYJP_cjs.__esm({
|
|
|
1265
1257
|
}
|
|
1266
1258
|
// === LiDAR Scanner (iOS 15+, LiDAR hardware — M.010.02a) ===
|
|
1267
1259
|
hasLiDARTraits(composition) {
|
|
1268
|
-
const lidarNames =
|
|
1260
|
+
const lidarNames = chunkMD6KDHVE_cjs.LIDAR_SCANNER_TRAITS;
|
|
1269
1261
|
for (const obj of composition.objects || []) {
|
|
1270
1262
|
if (obj.traits?.some((t) => lidarNames.includes(t.name))) return true;
|
|
1271
1263
|
}
|
|
1272
1264
|
return false;
|
|
1273
1265
|
}
|
|
1274
1266
|
collectLiDARTraits(composition) {
|
|
1275
|
-
const lidarNames =
|
|
1267
|
+
const lidarNames = chunkMD6KDHVE_cjs.LIDAR_SCANNER_TRAITS;
|
|
1276
1268
|
const found = /* @__PURE__ */ new Set();
|
|
1277
1269
|
for (const obj of composition.objects || []) {
|
|
1278
1270
|
for (const t of obj.traits || []) {
|
|
@@ -1298,7 +1290,9 @@ var init_IOSCompiler = chunkEGIZHYJP_cjs.__esm({
|
|
|
1298
1290
|
const cls = this.options.className;
|
|
1299
1291
|
const traits = this.collectLiDARTraits(composition);
|
|
1300
1292
|
this.emit("// Auto-generated by HoloScript IOSCompiler \u2014 LiDAR Scanner integration");
|
|
1301
|
-
this.emit(
|
|
1293
|
+
this.emit(
|
|
1294
|
+
`// Source: composition "${this.escapeStringValue(composition.name, "Swift")}"`
|
|
1295
|
+
);
|
|
1302
1296
|
this.emit("// Requires iOS 15.0+, device with LiDAR sensor");
|
|
1303
1297
|
this.emit("// Do not edit manually \u2014 regenerate from .holo source");
|
|
1304
1298
|
this.emit("");
|
|
@@ -1354,7 +1348,8 @@ var init_IOSCompiler = chunkEGIZHYJP_cjs.__esm({
|
|
|
1354
1348
|
this.emit("@Published var meshAnchors: [ARMeshAnchor] = []");
|
|
1355
1349
|
if (traits.has("lidar_point_cloud")) this.emit("@Published var pointCloud: [simd_float3] = []");
|
|
1356
1350
|
if (traits.has("lidar_depth_map")) this.emit("@Published var depthMap: CVPixelBuffer?");
|
|
1357
|
-
if (traits.has("lidar_depth_confidence"))
|
|
1351
|
+
if (traits.has("lidar_depth_confidence"))
|
|
1352
|
+
this.emit("@Published var confidenceMap: CVPixelBuffer?");
|
|
1358
1353
|
this.emit("");
|
|
1359
1354
|
this.emit("private var arSession: ARSession?");
|
|
1360
1355
|
this.emit("");
|
|
@@ -1367,7 +1362,9 @@ var init_IOSCompiler = chunkEGIZHYJP_cjs.__esm({
|
|
|
1367
1362
|
this.emit("/// Begin a LiDAR scanning session.");
|
|
1368
1363
|
this.emit("func startScan() {");
|
|
1369
1364
|
this.indentLevel++;
|
|
1370
|
-
this.emit(
|
|
1365
|
+
this.emit(
|
|
1366
|
+
"guard ARWorldTrackingConfiguration.supportsSceneReconstruction(.meshWithClassification) else {"
|
|
1367
|
+
);
|
|
1371
1368
|
this.indentLevel++;
|
|
1372
1369
|
this.emit('print("[HoloScript] LiDAR scene reconstruction is not supported on this device")');
|
|
1373
1370
|
this.emit("return");
|
|
@@ -1402,7 +1399,9 @@ var init_IOSCompiler = chunkEGIZHYJP_cjs.__esm({
|
|
|
1402
1399
|
this.emit("// MARK: - Mesh extraction");
|
|
1403
1400
|
this.emit("");
|
|
1404
1401
|
this.emit("/// Extract vertices, normals, and faces from an ARMeshGeometry.");
|
|
1405
|
-
this.emit(
|
|
1402
|
+
this.emit(
|
|
1403
|
+
"func extractGeometry(_ meshGeometry: ARMeshGeometry) -> (vertices: [simd_float3], normals: [simd_float3], faces: [[UInt32]]) {"
|
|
1404
|
+
);
|
|
1406
1405
|
this.indentLevel++;
|
|
1407
1406
|
this.emit("var vertices: [simd_float3] = []");
|
|
1408
1407
|
this.emit("var normals: [simd_float3] = []");
|
|
@@ -1411,7 +1410,9 @@ var init_IOSCompiler = chunkEGIZHYJP_cjs.__esm({
|
|
|
1411
1410
|
this.emit("let vertexBuffer = meshGeometry.vertices");
|
|
1412
1411
|
this.emit("for i in 0..<vertexBuffer.count {");
|
|
1413
1412
|
this.indentLevel++;
|
|
1414
|
-
this.emit(
|
|
1413
|
+
this.emit(
|
|
1414
|
+
"let ptr = vertexBuffer.buffer.contents().advanced(by: vertexBuffer.offset + vertexBuffer.stride * i)"
|
|
1415
|
+
);
|
|
1415
1416
|
this.emit("let vertex = ptr.assumingMemoryBound(to: simd_float3.self).pointee");
|
|
1416
1417
|
this.emit("vertices.append(vertex)");
|
|
1417
1418
|
this.indentLevel--;
|
|
@@ -1420,7 +1421,9 @@ var init_IOSCompiler = chunkEGIZHYJP_cjs.__esm({
|
|
|
1420
1421
|
this.emit("let normalBuffer = meshGeometry.normals");
|
|
1421
1422
|
this.emit("for i in 0..<normalBuffer.count {");
|
|
1422
1423
|
this.indentLevel++;
|
|
1423
|
-
this.emit(
|
|
1424
|
+
this.emit(
|
|
1425
|
+
"let ptr = normalBuffer.buffer.contents().advanced(by: normalBuffer.offset + normalBuffer.stride * i)"
|
|
1426
|
+
);
|
|
1424
1427
|
this.emit("let normal = ptr.assumingMemoryBound(to: simd_float3.self).pointee");
|
|
1425
1428
|
this.emit("normals.append(normal)");
|
|
1426
1429
|
this.indentLevel--;
|
|
@@ -1432,7 +1435,9 @@ var init_IOSCompiler = chunkEGIZHYJP_cjs.__esm({
|
|
|
1432
1435
|
this.emit("var indices: [UInt32] = []");
|
|
1433
1436
|
this.emit("for j in 0..<faceBuffer.indexCountPerPrimitive {");
|
|
1434
1437
|
this.indentLevel++;
|
|
1435
|
-
this.emit(
|
|
1438
|
+
this.emit(
|
|
1439
|
+
"let ptr = faceBuffer.buffer.contents().advanced(by: faceBuffer.offset + (i * faceBuffer.indexCountPerPrimitive + j) * faceBuffer.bytesPerIndex)"
|
|
1440
|
+
);
|
|
1436
1441
|
this.emit("let index = ptr.assumingMemoryBound(to: UInt32.self).pointee");
|
|
1437
1442
|
this.emit("indices.append(index)");
|
|
1438
1443
|
this.indentLevel--;
|
|
@@ -1455,7 +1460,9 @@ var init_IOSCompiler = chunkEGIZHYJP_cjs.__esm({
|
|
|
1455
1460
|
this.emit("var classifications: [ARMeshClassification] = []");
|
|
1456
1461
|
this.emit("for i in 0..<classBuffer.count {");
|
|
1457
1462
|
this.indentLevel++;
|
|
1458
|
-
this.emit(
|
|
1463
|
+
this.emit(
|
|
1464
|
+
"let ptr = classBuffer.buffer.contents().advanced(by: classBuffer.offset + classBuffer.stride * i)"
|
|
1465
|
+
);
|
|
1459
1466
|
this.emit("let raw = ptr.assumingMemoryBound(to: UInt8.self).pointee");
|
|
1460
1467
|
this.emit("let classification = ARMeshClassification(rawValue: Int(raw)) ?? .none");
|
|
1461
1468
|
this.emit("classifications.append(classification)");
|
|
@@ -1475,7 +1482,9 @@ var init_IOSCompiler = chunkEGIZHYJP_cjs.__esm({
|
|
|
1475
1482
|
if (traits.has("lidar_mesh_classification") || traits.has("lidar_mesh_to_holo")) {
|
|
1476
1483
|
this.emit("let classifications = extractClassifications(anchor)");
|
|
1477
1484
|
this.emit("");
|
|
1478
|
-
this.emit(
|
|
1485
|
+
this.emit(
|
|
1486
|
+
"var grouped: [ARMeshClassification: (verts: [simd_float3], norms: [simd_float3], faces: [[UInt32]])] = [:]"
|
|
1487
|
+
);
|
|
1479
1488
|
this.emit("for (i, face) in faces.enumerated() {");
|
|
1480
1489
|
this.indentLevel++;
|
|
1481
1490
|
this.emit("let cls = i < classifications.count ? classifications[i] : .none");
|
|
@@ -1503,7 +1512,9 @@ var init_IOSCompiler = chunkEGIZHYJP_cjs.__esm({
|
|
|
1503
1512
|
this.emit("normals: data.norms,");
|
|
1504
1513
|
this.emit("faces: data.faces,");
|
|
1505
1514
|
this.emit("transform: anchor.transform,");
|
|
1506
|
-
this.emit(
|
|
1515
|
+
this.emit(
|
|
1516
|
+
'traits: ["lidar_mesh_classification", "lidar_\\(holoLabel(for: classification))"]'
|
|
1517
|
+
);
|
|
1507
1518
|
this.indentLevel--;
|
|
1508
1519
|
this.emit("))");
|
|
1509
1520
|
this.indentLevel--;
|
|
@@ -1564,7 +1575,9 @@ var init_IOSCompiler = chunkEGIZHYJP_cjs.__esm({
|
|
|
1564
1575
|
this.emit("let asset = MDLAsset(bufferAllocator: allocator)");
|
|
1565
1576
|
this.emit("for anchor in meshAnchors {");
|
|
1566
1577
|
this.indentLevel++;
|
|
1567
|
-
this.emit(
|
|
1578
|
+
this.emit(
|
|
1579
|
+
"let mdlMesh = anchor.geometry.toMDLMesh(device: MTLCreateSystemDefaultDevice()!, allocator: allocator)"
|
|
1580
|
+
);
|
|
1568
1581
|
this.emit("asset.add(mdlMesh)");
|
|
1569
1582
|
this.indentLevel--;
|
|
1570
1583
|
this.emit("}");
|
|
@@ -1606,7 +1619,9 @@ var init_IOSCompiler = chunkEGIZHYJP_cjs.__esm({
|
|
|
1606
1619
|
this.indentLevel++;
|
|
1607
1620
|
this.emit("let device = MTLCreateSystemDefaultDevice()!");
|
|
1608
1621
|
this.emit("let allocator = MTKMeshBufferAllocator(device: device)");
|
|
1609
|
-
this.emit(
|
|
1622
|
+
this.emit(
|
|
1623
|
+
"let simplified = MDLMesh(meshBySubdividing: mdlMesh, submeshIndex: 0, subdivisionLevels: 0, allocator: allocator)"
|
|
1624
|
+
);
|
|
1610
1625
|
this.emit('print("[HoloScript] Mesh simplified to target face count: \\(targetFaceCount)")');
|
|
1611
1626
|
this.emit("return simplified");
|
|
1612
1627
|
this.indentLevel--;
|
|
@@ -1671,7 +1686,9 @@ var init_IOSCompiler = chunkEGIZHYJP_cjs.__esm({
|
|
|
1671
1686
|
this.emit("self?.entities.append(contentsOf: newEntities)");
|
|
1672
1687
|
this.indentLevel--;
|
|
1673
1688
|
this.emit("}");
|
|
1674
|
-
this.emit(
|
|
1689
|
+
this.emit(
|
|
1690
|
+
'print("[HoloScript] LiDAR mesh updated: \\(self?.meshAnchors.count ?? 0) anchors, \\(self?.entities.count ?? 0) entities")'
|
|
1691
|
+
);
|
|
1675
1692
|
this.indentLevel--;
|
|
1676
1693
|
this.emit("}");
|
|
1677
1694
|
this.indentLevel--;
|
|
@@ -1737,7 +1754,7 @@ var init_IOSCompiler = chunkEGIZHYJP_cjs.__esm({
|
|
|
1737
1754
|
* Check whether the composition references any npu_* scene understanding traits.
|
|
1738
1755
|
*/
|
|
1739
1756
|
hasNPUSceneTraits(composition) {
|
|
1740
|
-
const npuNames =
|
|
1757
|
+
const npuNames = chunkCAUCGUEA_cjs.NPU_SCENE_TRAITS;
|
|
1741
1758
|
for (const obj of composition.objects || []) {
|
|
1742
1759
|
if (obj.traits?.some((t) => {
|
|
1743
1760
|
const name = typeof t === "string" ? t : t.name;
|
|
@@ -1763,7 +1780,7 @@ var init_IOSCompiler = chunkEGIZHYJP_cjs.__esm({
|
|
|
1763
1780
|
this.lines = [];
|
|
1764
1781
|
this.indentLevel = 0;
|
|
1765
1782
|
const cls = this.options.className;
|
|
1766
|
-
const defaults =
|
|
1783
|
+
const defaults = chunkCAUCGUEA_cjs.NPU_SCENE_DEFAULTS;
|
|
1767
1784
|
this.emit("// Auto-generated by HoloScript IOSCompiler \u2014 NPU Scene Understanding");
|
|
1768
1785
|
this.emit(
|
|
1769
1786
|
`// Source: composition "${this.escapeStringValue(composition.name, "Swift")}"`
|
|
@@ -1810,7 +1827,7 @@ var init_IOSCompiler = chunkEGIZHYJP_cjs.__esm({
|
|
|
1810
1827
|
for (const obj of composition.objects || []) {
|
|
1811
1828
|
for (const trait of obj.traits || []) {
|
|
1812
1829
|
const name = typeof trait === "string" ? trait : trait.name;
|
|
1813
|
-
if (
|
|
1830
|
+
if (chunkCAUCGUEA_cjs.NPU_SCENE_TRAITS.includes(name)) {
|
|
1814
1831
|
usedTraits.add(name);
|
|
1815
1832
|
}
|
|
1816
1833
|
}
|
|
@@ -1823,7 +1840,9 @@ var init_IOSCompiler = chunkEGIZHYJP_cjs.__esm({
|
|
|
1823
1840
|
this.emit("let request = VNClassifyImageRequest { [weak self] request, error in");
|
|
1824
1841
|
this.indentLevel++;
|
|
1825
1842
|
this.emit("guard let self = self, error == nil else { return }");
|
|
1826
|
-
this.emit(
|
|
1843
|
+
this.emit(
|
|
1844
|
+
"guard let results = request.results as? [VNClassificationObservation] else { return }"
|
|
1845
|
+
);
|
|
1827
1846
|
this.emit("let filtered = results.filter { $0.confidence >= self.confidenceThreshold }");
|
|
1828
1847
|
this.emit(" .prefix(self.maxDetections)");
|
|
1829
1848
|
this.emit("DispatchQueue.main.async {");
|
|
@@ -1831,7 +1850,9 @@ var init_IOSCompiler = chunkEGIZHYJP_cjs.__esm({
|
|
|
1831
1850
|
this.emit("self.detections = filtered.map { obs in");
|
|
1832
1851
|
this.indentLevel++;
|
|
1833
1852
|
this.emit("NPUDetection(label: obs.identifier, confidence: obs.confidence,");
|
|
1834
|
-
this.emit(
|
|
1853
|
+
this.emit(
|
|
1854
|
+
" boundingBox: nil, position: nil, segmentationMask: nil, depthValue: nil)"
|
|
1855
|
+
);
|
|
1835
1856
|
this.indentLevel--;
|
|
1836
1857
|
this.emit("}");
|
|
1837
1858
|
this.emit("self.inferenceCount += 1");
|
|
@@ -1875,7 +1896,9 @@ var init_IOSCompiler = chunkEGIZHYJP_cjs.__esm({
|
|
|
1875
1896
|
this.emit("");
|
|
1876
1897
|
this.emit("private func handleDetectionResults(_ results: [VNObservation]?) {");
|
|
1877
1898
|
this.indentLevel++;
|
|
1878
|
-
this.emit(
|
|
1899
|
+
this.emit(
|
|
1900
|
+
"guard let observations = results as? [VNRecognizedObjectObservation] else { return }"
|
|
1901
|
+
);
|
|
1879
1902
|
this.emit("let filtered = observations.filter { $0.confidence >= confidenceThreshold }");
|
|
1880
1903
|
this.emit(" .prefix(maxDetections)");
|
|
1881
1904
|
this.emit("DispatchQueue.main.async { [weak self] in");
|
|
@@ -1945,7 +1968,9 @@ var init_IOSCompiler = chunkEGIZHYJP_cjs.__esm({
|
|
|
1945
1968
|
this.emit("if #available(iOS 18.0, *) {");
|
|
1946
1969
|
this.indentLevel++;
|
|
1947
1970
|
this.emit("let request = VNGenerateDepthRequest()");
|
|
1948
|
-
this.emit(
|
|
1971
|
+
this.emit(
|
|
1972
|
+
"let handler = VNImageRequestHandler(cvPixelBuffer: frame.capturedImage, options: [:])"
|
|
1973
|
+
);
|
|
1949
1974
|
this.emit("try? handler.perform([request])");
|
|
1950
1975
|
this.emit("if let result = request.results?.first {");
|
|
1951
1976
|
this.indentLevel++;
|
|
@@ -1970,14 +1995,18 @@ var init_IOSCompiler = chunkEGIZHYJP_cjs.__esm({
|
|
|
1970
1995
|
if (usedTraits.has("npu_entity_pipe")) {
|
|
1971
1996
|
this.emit("// MARK: - Entity Pipeline (npu_entity_pipe)");
|
|
1972
1997
|
this.emit("");
|
|
1973
|
-
this.emit(
|
|
1998
|
+
this.emit(
|
|
1999
|
+
"func mapDetectionsToEntities(_ detections: [NPUDetection], in sceneView: ARSCNView) -> [SCNNode] {"
|
|
2000
|
+
);
|
|
1974
2001
|
this.indentLevel++;
|
|
1975
2002
|
this.emit("var nodes: [SCNNode] = []");
|
|
1976
2003
|
this.emit("for detection in detections {");
|
|
1977
2004
|
this.indentLevel++;
|
|
1978
2005
|
this.emit("guard let bbox = detection.boundingBox else { continue }");
|
|
1979
2006
|
this.emit("let center = CGPoint(x: bbox.midX, y: bbox.midY)");
|
|
1980
|
-
this.emit(
|
|
2007
|
+
this.emit(
|
|
2008
|
+
"guard let query = sceneView.raycastQuery(from: center, allowing: .estimatedPlane, alignment: .any),"
|
|
2009
|
+
);
|
|
1981
2010
|
this.emit(" let result = sceneView.session.raycast(query).first else { continue }");
|
|
1982
2011
|
this.emit("let anchor = ARAnchor(name: detection.label, transform: result.worldTransform)");
|
|
1983
2012
|
this.emit("sceneView.session.add(anchor: anchor)");
|
|
@@ -1985,7 +2014,9 @@ var init_IOSCompiler = chunkEGIZHYJP_cjs.__esm({
|
|
|
1985
2014
|
this.emit("node.name = detection.label");
|
|
1986
2015
|
this.emit(`node.simdWorldPosition = simd_make_float3(result.worldTransform.columns.3)`);
|
|
1987
2016
|
this.emit(`let sphere = SCNSphere(radius: CGFloat(entityScale))`);
|
|
1988
|
-
this.emit(
|
|
2017
|
+
this.emit(
|
|
2018
|
+
"sphere.firstMaterial?.diffuse.contents = UIColor.systemBlue.withAlphaComponent(0.6)"
|
|
2019
|
+
);
|
|
1989
2020
|
this.emit("node.geometry = sphere");
|
|
1990
2021
|
this.emit("nodes.append(node)");
|
|
1991
2022
|
this.indentLevel--;
|
|
@@ -2037,9 +2068,13 @@ var init_IOSCompiler = chunkEGIZHYJP_cjs.__esm({
|
|
|
2037
2068
|
this.emit("");
|
|
2038
2069
|
this.emit("func loadCustomModel(named name: String) throws {");
|
|
2039
2070
|
this.indentLevel++;
|
|
2040
|
-
this.emit(
|
|
2071
|
+
this.emit(
|
|
2072
|
+
'guard let url = Bundle.main.url(forResource: name, withExtension: "mlmodelc") else {'
|
|
2073
|
+
);
|
|
2041
2074
|
this.indentLevel++;
|
|
2042
|
-
this.emit(
|
|
2075
|
+
this.emit(
|
|
2076
|
+
'throw NSError(domain: "HoloScript", code: -1, userInfo: [NSLocalizedDescriptionKey: "Model \\(name) not found"])'
|
|
2077
|
+
);
|
|
2043
2078
|
this.indentLevel--;
|
|
2044
2079
|
this.emit("}");
|
|
2045
2080
|
this.emit("try loadCustomModel(at: url)");
|
|
@@ -2052,7 +2087,9 @@ var init_IOSCompiler = chunkEGIZHYJP_cjs.__esm({
|
|
|
2052
2087
|
this.emit("");
|
|
2053
2088
|
this.emit("func createLabelNode(for detection: NPUDetection) -> SCNNode {");
|
|
2054
2089
|
this.indentLevel++;
|
|
2055
|
-
this.emit(
|
|
2090
|
+
this.emit(
|
|
2091
|
+
'let text = SCNText(string: "\\(detection.label) (\\(String(format: "%.0f%%", detection.confidence * 100)))", extrusionDepth: 0.5)'
|
|
2092
|
+
);
|
|
2056
2093
|
this.emit("text.font = UIFont.systemFont(ofSize: 4, weight: .bold)");
|
|
2057
2094
|
this.emit("text.firstMaterial?.diffuse.contents = UIColor.white");
|
|
2058
2095
|
this.emit("text.firstMaterial?.isDoubleSided = true");
|
|
@@ -2216,7 +2253,7 @@ var init_IOSCompiler = chunkEGIZHYJP_cjs.__esm({
|
|
|
2216
2253
|
}
|
|
2217
2254
|
// === Portal AR Methods (M.010.06) ===
|
|
2218
2255
|
hasPortalARTraits(composition) {
|
|
2219
|
-
const portalNames =
|
|
2256
|
+
const portalNames = chunkCAUCGUEA_cjs.PORTAL_AR_TRAITS;
|
|
2220
2257
|
for (const obj of composition.objects || []) {
|
|
2221
2258
|
for (const trait of obj.traits || []) {
|
|
2222
2259
|
const name = typeof trait === "string" ? trait : trait.name;
|
|
@@ -2284,7 +2321,9 @@ var init_IOSCompiler = chunkEGIZHYJP_cjs.__esm({
|
|
|
2284
2321
|
if (this.compositionHasTrait(composition, "portal_people_occlusion")) {
|
|
2285
2322
|
this.emit("");
|
|
2286
2323
|
this.emit("// People occlusion via ARKit person segmentation");
|
|
2287
|
-
this.emit(
|
|
2324
|
+
this.emit(
|
|
2325
|
+
"if ARWorldTrackingConfiguration.supportsFrameSemantics(.personSegmentationWithDepth) {"
|
|
2326
|
+
);
|
|
2288
2327
|
this.indentLevel++;
|
|
2289
2328
|
this.emit("config.frameSemantics.insert(.personSegmentationWithDepth)");
|
|
2290
2329
|
this.indentLevel--;
|
|
@@ -2317,14 +2356,20 @@ var init_IOSCompiler = chunkEGIZHYJP_cjs.__esm({
|
|
|
2317
2356
|
this.emit("// Apply depth-based occlusion to holographic layer");
|
|
2318
2357
|
this.emit("for child in holographicLayer.childNodes {");
|
|
2319
2358
|
this.indentLevel++;
|
|
2320
|
-
this.emit(
|
|
2321
|
-
|
|
2359
|
+
this.emit(
|
|
2360
|
+
"let screenPoint = frame.camera.projectPoint(child.worldPosition, orientation: .portrait, viewportSize: CGSize(width: 1, height: 1))"
|
|
2361
|
+
);
|
|
2362
|
+
this.emit(
|
|
2363
|
+
"child.isHidden = isOccluded(at: screenPoint, depthMap: depthMap, nodeDepth: child.worldPosition.z)"
|
|
2364
|
+
);
|
|
2322
2365
|
this.indentLevel--;
|
|
2323
2366
|
this.emit("}");
|
|
2324
2367
|
this.indentLevel--;
|
|
2325
2368
|
this.emit("}");
|
|
2326
2369
|
this.emit("");
|
|
2327
|
-
this.emit(
|
|
2370
|
+
this.emit(
|
|
2371
|
+
"private func isOccluded(at point: CGPoint, depthMap: CVPixelBuffer, nodeDepth: Float) -> Bool {"
|
|
2372
|
+
);
|
|
2328
2373
|
this.indentLevel++;
|
|
2329
2374
|
this.emit("CVPixelBufferLockBaseAddress(depthMap, .readOnly)");
|
|
2330
2375
|
this.emit("defer { CVPixelBufferUnlockBaseAddress(depthMap, .readOnly) }");
|
|
@@ -2348,8 +2393,12 @@ var init_IOSCompiler = chunkEGIZHYJP_cjs.__esm({
|
|
|
2348
2393
|
this.emit("guard let segmentation = frame.segmentationBuffer else { return }");
|
|
2349
2394
|
this.emit("guard let estimatedDepth = frame.estimatedDepthData else { return }");
|
|
2350
2395
|
this.emit("// Use matteGenerator for alpha matte of people");
|
|
2351
|
-
this.emit(
|
|
2352
|
-
|
|
2396
|
+
this.emit(
|
|
2397
|
+
"let matteGenerator = ARMatteGenerator(device: MTLCreateSystemDefaultDevice()!, matteResolution: .half)"
|
|
2398
|
+
);
|
|
2399
|
+
this.emit(
|
|
2400
|
+
"let matte = matteGenerator.generateMatte(from: frame, commandBuffer: MTLCreateSystemDefaultDevice()!.makeCommandQueue()!.makeCommandBuffer()!)"
|
|
2401
|
+
);
|
|
2353
2402
|
this.emit("// Apply people matte to holographic layer rendering");
|
|
2354
2403
|
this.emit('portalScene.rootNode.setValue(matte, forKey: "peopleOcclusionMatte")');
|
|
2355
2404
|
this.indentLevel--;
|
|
@@ -2361,14 +2410,20 @@ var init_IOSCompiler = chunkEGIZHYJP_cjs.__esm({
|
|
|
2361
2410
|
this.emit("func applyParallaxCorrection(frame: ARFrame) {");
|
|
2362
2411
|
this.indentLevel++;
|
|
2363
2412
|
this.emit("let cameraTransform = frame.camera.transform");
|
|
2364
|
-
this.emit(
|
|
2413
|
+
this.emit(
|
|
2414
|
+
"let cameraPosition = SIMD3<Float>(cameraTransform.columns.3.x, cameraTransform.columns.3.y, cameraTransform.columns.3.z)"
|
|
2415
|
+
);
|
|
2365
2416
|
this.emit("// Offset holographic layer based on camera movement for parallax");
|
|
2366
2417
|
this.emit("for child in holographicLayer.childNodes {");
|
|
2367
2418
|
this.indentLevel++;
|
|
2368
2419
|
this.emit("let depth = child.worldPosition.z");
|
|
2369
2420
|
this.emit("let parallaxFactor: Float = 1.0 - (depth / 10.0)");
|
|
2370
|
-
this.emit(
|
|
2371
|
-
|
|
2421
|
+
this.emit(
|
|
2422
|
+
"child.position.x += (cameraPosition.x - child.position.x) * parallaxFactor * 0.01"
|
|
2423
|
+
);
|
|
2424
|
+
this.emit(
|
|
2425
|
+
"child.position.y += (cameraPosition.y - child.position.y) * parallaxFactor * 0.01"
|
|
2426
|
+
);
|
|
2372
2427
|
this.indentLevel--;
|
|
2373
2428
|
this.emit("}");
|
|
2374
2429
|
this.indentLevel--;
|
|
@@ -2380,15 +2435,21 @@ var init_IOSCompiler = chunkEGIZHYJP_cjs.__esm({
|
|
|
2380
2435
|
this.emit("func applyDepthFade(frame: ARFrame) {");
|
|
2381
2436
|
this.indentLevel++;
|
|
2382
2437
|
this.emit("let cameraTransform = frame.camera.transform");
|
|
2383
|
-
this.emit(
|
|
2438
|
+
this.emit(
|
|
2439
|
+
"let cameraPos = SIMD3<Float>(cameraTransform.columns.3.x, cameraTransform.columns.3.y, cameraTransform.columns.3.z)"
|
|
2440
|
+
);
|
|
2384
2441
|
this.emit("let nearPlane: Float = 0.1");
|
|
2385
2442
|
this.emit("let farPlane: Float = 10.0");
|
|
2386
2443
|
this.emit("");
|
|
2387
2444
|
this.emit("for child in holographicLayer.childNodes {");
|
|
2388
2445
|
this.indentLevel++;
|
|
2389
|
-
this.emit(
|
|
2446
|
+
this.emit(
|
|
2447
|
+
"let nodePos = SIMD3<Float>(child.worldPosition.x, child.worldPosition.y, child.worldPosition.z)"
|
|
2448
|
+
);
|
|
2390
2449
|
this.emit("let distance = simd_distance(cameraPos, nodePos)");
|
|
2391
|
-
this.emit(
|
|
2450
|
+
this.emit(
|
|
2451
|
+
"let alpha = max(0, min(1, 1.0 - (distance - nearPlane) / (farPlane - nearPlane)))"
|
|
2452
|
+
);
|
|
2392
2453
|
this.emit("child.opacity = CGFloat(alpha)");
|
|
2393
2454
|
this.indentLevel--;
|
|
2394
2455
|
this.emit("}");
|
|
@@ -2397,7 +2458,9 @@ var init_IOSCompiler = chunkEGIZHYJP_cjs.__esm({
|
|
|
2397
2458
|
this.emit("");
|
|
2398
2459
|
}
|
|
2399
2460
|
if (this.compositionHasTrait(composition, "portal_lighting_match")) {
|
|
2400
|
-
this.emit(
|
|
2461
|
+
this.emit(
|
|
2462
|
+
"// Portal lighting match: match hologram lighting to real environment via ARKit environment probe"
|
|
2463
|
+
);
|
|
2401
2464
|
this.emit("func updateLightingMatch(frame: ARFrame) {");
|
|
2402
2465
|
this.indentLevel++;
|
|
2403
2466
|
this.emit("guard let lightEstimate = frame.lightEstimate else { return }");
|
|
@@ -2405,7 +2468,9 @@ var init_IOSCompiler = chunkEGIZHYJP_cjs.__esm({
|
|
|
2405
2468
|
this.emit("let temperature = lightEstimate.ambientColorTemperature");
|
|
2406
2469
|
this.emit("");
|
|
2407
2470
|
this.emit("// Update holographic scene lighting");
|
|
2408
|
-
this.emit(
|
|
2471
|
+
this.emit(
|
|
2472
|
+
'if let light = holographicLayer.childNode(withName: "portalAmbientLight", recursively: true)?.light {'
|
|
2473
|
+
);
|
|
2409
2474
|
this.indentLevel++;
|
|
2410
2475
|
this.emit("light.intensity = intensity");
|
|
2411
2476
|
this.emit("light.temperature = temperature");
|
|
@@ -2427,7 +2492,9 @@ var init_IOSCompiler = chunkEGIZHYJP_cjs.__esm({
|
|
|
2427
2492
|
}
|
|
2428
2493
|
if (this.compositionHasTrait(composition, "portal_boundary")) {
|
|
2429
2494
|
this.emit("// Portal boundary: define portal edges with configurable shape");
|
|
2430
|
-
this.emit(
|
|
2495
|
+
this.emit(
|
|
2496
|
+
'func createPortalBoundary(shape: String = "circle", radius: Float = 1.5) -> SCNNode {'
|
|
2497
|
+
);
|
|
2431
2498
|
this.indentLevel++;
|
|
2432
2499
|
this.emit("let boundaryNode = SCNNode()");
|
|
2433
2500
|
this.emit('boundaryNode.name = "portalBoundary"');
|
|
@@ -2441,7 +2508,9 @@ var init_IOSCompiler = chunkEGIZHYJP_cjs.__esm({
|
|
|
2441
2508
|
this.indentLevel--;
|
|
2442
2509
|
this.emit('case "rect":');
|
|
2443
2510
|
this.indentLevel++;
|
|
2444
|
-
this.emit(
|
|
2511
|
+
this.emit(
|
|
2512
|
+
"let box = SCNBox(width: CGFloat(radius * 2), height: CGFloat(radius * 2), length: 0.02, chamferRadius: 0.01)"
|
|
2513
|
+
);
|
|
2445
2514
|
this.emit("box.firstMaterial?.diffuse.contents = UIColor.cyan.withAlphaComponent(0.8)");
|
|
2446
2515
|
this.emit("boundaryNode.geometry = box");
|
|
2447
2516
|
this.indentLevel--;
|
|
@@ -2465,8 +2534,12 @@ var init_IOSCompiler = chunkEGIZHYJP_cjs.__esm({
|
|
|
2465
2534
|
this.emit(" float glowIntensity;");
|
|
2466
2535
|
this.emit(" float time;");
|
|
2467
2536
|
this.emit(" #pragma body");
|
|
2468
|
-
this.emit(
|
|
2469
|
-
|
|
2537
|
+
this.emit(
|
|
2538
|
+
" float edgeFactor = 1.0 - abs(dot(normalize(_surface.normal), normalize(_surface.view)));"
|
|
2539
|
+
);
|
|
2540
|
+
this.emit(
|
|
2541
|
+
" float glow = pow(edgeFactor, 3.0) * glowIntensity * (0.8 + 0.2 * sin(time * 2.0));"
|
|
2542
|
+
);
|
|
2470
2543
|
this.emit(" _output.color.rgb += vec3(0.0, glow * 0.8, glow);");
|
|
2471
2544
|
this.emit('"""');
|
|
2472
2545
|
this.emit("");
|
|
@@ -2475,7 +2548,9 @@ var init_IOSCompiler = chunkEGIZHYJP_cjs.__esm({
|
|
|
2475
2548
|
this.emit(".fragment: glowShader");
|
|
2476
2549
|
this.indentLevel--;
|
|
2477
2550
|
this.emit("]");
|
|
2478
|
-
this.emit(
|
|
2551
|
+
this.emit(
|
|
2552
|
+
'boundaryNode.geometry?.firstMaterial?.setValue(Float(1.5), forKey: "glowIntensity")'
|
|
2553
|
+
);
|
|
2479
2554
|
this.indentLevel--;
|
|
2480
2555
|
this.emit("}");
|
|
2481
2556
|
this.emit("");
|
|
@@ -2486,7 +2561,9 @@ var init_IOSCompiler = chunkEGIZHYJP_cjs.__esm({
|
|
|
2486
2561
|
this.indentLevel++;
|
|
2487
2562
|
this.emit("let cameraTransform = frame.camera.transform");
|
|
2488
2563
|
this.emit("// Calculate tilt angle from camera orientation");
|
|
2489
|
-
this.emit(
|
|
2564
|
+
this.emit(
|
|
2565
|
+
"let forward = SIMD3<Float>(cameraTransform.columns.2.x, cameraTransform.columns.2.y, cameraTransform.columns.2.z)"
|
|
2566
|
+
);
|
|
2490
2567
|
this.emit("let tiltAngle = abs(asin(forward.y)) * 180.0 / .pi");
|
|
2491
2568
|
this.emit("let tiltThreshold: Float = 30.0");
|
|
2492
2569
|
this.emit("portalEnabled = tiltAngle > tiltThreshold");
|
|
@@ -2525,7 +2602,7 @@ var init_IOSCompiler = chunkEGIZHYJP_cjs.__esm({
|
|
|
2525
2602
|
}
|
|
2526
2603
|
// === Camera Hand Tracking Methods (M.010.04) ===
|
|
2527
2604
|
hasHandTrackingTraits(composition) {
|
|
2528
|
-
const handTraitNames =
|
|
2605
|
+
const handTraitNames = chunkCAUCGUEA_cjs.CAMERA_HAND_TRACKING_TRAITS;
|
|
2529
2606
|
for (const obj of composition.objects || []) {
|
|
2530
2607
|
for (const trait of obj.traits || []) {
|
|
2531
2608
|
const name = typeof trait === "string" ? trait : trait.name;
|
|
@@ -2548,7 +2625,9 @@ var init_IOSCompiler = chunkEGIZHYJP_cjs.__esm({
|
|
|
2548
2625
|
const hasSkeleton = this.compositionHasTrait(composition, "camera_hand_skeleton");
|
|
2549
2626
|
const hasToSpatial = this.compositionHasTrait(composition, "camera_hand_to_spatial");
|
|
2550
2627
|
this.emit("// Auto-generated by HoloScript IOSCompiler \u2014 Hand Tracking integration");
|
|
2551
|
-
this.emit(
|
|
2628
|
+
this.emit(
|
|
2629
|
+
`// Source: composition "${this.escapeStringValue(composition.name, "Swift")}"`
|
|
2630
|
+
);
|
|
2552
2631
|
this.emit("// Requires iOS 14.0+, Vision framework");
|
|
2553
2632
|
this.emit("// Do not edit manually \u2014 regenerate from .holo source");
|
|
2554
2633
|
this.emit("");
|
|
@@ -2573,7 +2652,9 @@ var init_IOSCompiler = chunkEGIZHYJP_cjs.__esm({
|
|
|
2573
2652
|
this.emit("@Published var currentGesture: HandGesture = .none");
|
|
2574
2653
|
this.emit("@Published var handCount: Int = 0");
|
|
2575
2654
|
if (hasSkeleton) {
|
|
2576
|
-
this.emit(
|
|
2655
|
+
this.emit(
|
|
2656
|
+
"@Published var jointPositions: [[VNHumanHandPoseObservation.JointName: VNRecognizedPoint]] = []"
|
|
2657
|
+
);
|
|
2577
2658
|
}
|
|
2578
2659
|
this.emit("");
|
|
2579
2660
|
this.emit("private var captureSession: AVCaptureSession?");
|
|
@@ -2597,7 +2678,9 @@ var init_IOSCompiler = chunkEGIZHYJP_cjs.__esm({
|
|
|
2597
2678
|
this.emit("let session = AVCaptureSession()");
|
|
2598
2679
|
this.emit("session.sessionPreset = .high");
|
|
2599
2680
|
this.emit("");
|
|
2600
|
-
this.emit(
|
|
2681
|
+
this.emit(
|
|
2682
|
+
"guard let device = AVCaptureDevice.default(.builtInWideAngleCamera, for: .video, position: .front),"
|
|
2683
|
+
);
|
|
2601
2684
|
this.emit(" let input = try? AVCaptureDeviceInput(device: device) else {");
|
|
2602
2685
|
this.indentLevel++;
|
|
2603
2686
|
this.emit('print("[HoloScript] Failed to access front camera")');
|
|
@@ -2644,7 +2727,9 @@ var init_IOSCompiler = chunkEGIZHYJP_cjs.__esm({
|
|
|
2644
2727
|
this.emit("");
|
|
2645
2728
|
if (hasConfidence) {
|
|
2646
2729
|
this.emit("// Filter low-confidence joints");
|
|
2647
|
-
this.emit(
|
|
2730
|
+
this.emit(
|
|
2731
|
+
"guard thumbTip.confidence > minConfidence && indexTip.confidence > minConfidence else { return }"
|
|
2732
|
+
);
|
|
2648
2733
|
this.emit("");
|
|
2649
2734
|
}
|
|
2650
2735
|
if (hasSkeleton) {
|
|
@@ -2672,7 +2757,9 @@ var init_IOSCompiler = chunkEGIZHYJP_cjs.__esm({
|
|
|
2672
2757
|
}
|
|
2673
2758
|
if (hasPinch) {
|
|
2674
2759
|
this.emit("// Pinch gesture: thumb tip close to index tip");
|
|
2675
|
-
this.emit(
|
|
2760
|
+
this.emit(
|
|
2761
|
+
"let pinchDist = hypot(thumbTip.location.x - indexTip.location.x, thumbTip.location.y - indexTip.location.y)"
|
|
2762
|
+
);
|
|
2676
2763
|
this.emit("if pinchDist < 0.05 {");
|
|
2677
2764
|
this.indentLevel++;
|
|
2678
2765
|
this.emit("DispatchQueue.main.async { self.currentGesture = .pinch }");
|
|
@@ -2758,13 +2845,19 @@ var init_IOSCompiler = chunkEGIZHYJP_cjs.__esm({
|
|
|
2758
2845
|
this.indentLevel--;
|
|
2759
2846
|
this.emit("}");
|
|
2760
2847
|
this.emit("");
|
|
2761
|
-
this.emit(
|
|
2848
|
+
this.emit(
|
|
2849
|
+
`extension ${cls}HandTrackingManager: AVCaptureVideoDataOutputSampleBufferDelegate {`
|
|
2850
|
+
);
|
|
2762
2851
|
this.indentLevel++;
|
|
2763
|
-
this.emit(
|
|
2852
|
+
this.emit(
|
|
2853
|
+
"func captureOutput(_ output: AVCaptureOutput, didOutput sampleBuffer: CMSampleBuffer, from connection: AVCaptureConnection) {"
|
|
2854
|
+
);
|
|
2764
2855
|
this.indentLevel++;
|
|
2765
2856
|
this.emit("guard let pixelBuffer = CMSampleBufferGetImageBuffer(sampleBuffer) else { return }");
|
|
2766
2857
|
this.emit("");
|
|
2767
|
-
this.emit(
|
|
2858
|
+
this.emit(
|
|
2859
|
+
"let handler = VNImageRequestHandler(cvPixelBuffer: pixelBuffer, orientation: .up, options: [:])"
|
|
2860
|
+
);
|
|
2768
2861
|
this.emit("do {");
|
|
2769
2862
|
this.indentLevel++;
|
|
2770
2863
|
this.emit("try handler.perform([handPoseRequest])");
|
|
@@ -2803,7 +2896,7 @@ var init_IOSCompiler = chunkEGIZHYJP_cjs.__esm({
|
|
|
2803
2896
|
}
|
|
2804
2897
|
// ─── Object Capture (iOS 17+, M.010.10) ────────────────────────────
|
|
2805
2898
|
hasObjectCaptureTraits(composition) {
|
|
2806
|
-
const captureNames =
|
|
2899
|
+
const captureNames = chunkMD6KDHVE_cjs.IOS_OBJECT_CAPTURE_TRAITS;
|
|
2807
2900
|
for (const obj of composition.objects || []) {
|
|
2808
2901
|
for (const trait of obj.traits || []) {
|
|
2809
2902
|
const name = typeof trait === "string" ? trait : trait.name;
|
|
@@ -2813,7 +2906,7 @@ var init_IOSCompiler = chunkEGIZHYJP_cjs.__esm({
|
|
|
2813
2906
|
return false;
|
|
2814
2907
|
}
|
|
2815
2908
|
collectObjectCaptureTraits(composition) {
|
|
2816
|
-
const captureNames =
|
|
2909
|
+
const captureNames = chunkMD6KDHVE_cjs.IOS_OBJECT_CAPTURE_TRAITS;
|
|
2817
2910
|
const found = /* @__PURE__ */ new Set();
|
|
2818
2911
|
for (const obj of composition.objects || []) {
|
|
2819
2912
|
for (const t of obj.traits || []) {
|
|
@@ -2896,7 +2989,9 @@ var init_IOSCompiler = chunkEGIZHYJP_cjs.__esm({
|
|
|
2896
2989
|
this.emit(`class ${cls}ObjectCaptureManager: ObservableObject {`);
|
|
2897
2990
|
this.indentLevel++;
|
|
2898
2991
|
this.emit("");
|
|
2899
|
-
this.emit(
|
|
2992
|
+
this.emit(
|
|
2993
|
+
'private let logger = Logger(subsystem: "net.holoscript", category: "ObjectCapture")'
|
|
2994
|
+
);
|
|
2900
2995
|
this.emit("");
|
|
2901
2996
|
this.emit("enum CaptureState: Equatable {");
|
|
2902
2997
|
this.indentLevel++;
|
|
@@ -2930,9 +3025,15 @@ var init_IOSCompiler = chunkEGIZHYJP_cjs.__esm({
|
|
|
2930
3025
|
this.emit("");
|
|
2931
3026
|
this.emit("init() {");
|
|
2932
3027
|
this.indentLevel++;
|
|
2933
|
-
this.emit(
|
|
2934
|
-
|
|
2935
|
-
|
|
3028
|
+
this.emit(
|
|
3029
|
+
"let docs = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first!"
|
|
3030
|
+
);
|
|
3031
|
+
this.emit(
|
|
3032
|
+
'self.outputDirectory = docs.appendingPathComponent("HoloCaptures", isDirectory: true)'
|
|
3033
|
+
);
|
|
3034
|
+
this.emit(
|
|
3035
|
+
"try? FileManager.default.createDirectory(at: outputDirectory, withIntermediateDirectories: true)"
|
|
3036
|
+
);
|
|
2936
3037
|
this.indentLevel--;
|
|
2937
3038
|
this.emit("}");
|
|
2938
3039
|
this.emit("");
|
|
@@ -2955,7 +3056,9 @@ var init_IOSCompiler = chunkEGIZHYJP_cjs.__esm({
|
|
|
2955
3056
|
this.emit("self.captureSession = session");
|
|
2956
3057
|
this.emit("");
|
|
2957
3058
|
this.emit("var configuration = ObjectCaptureSession.Configuration()");
|
|
2958
|
-
this.emit(
|
|
3059
|
+
this.emit(
|
|
3060
|
+
'configuration.checkpointDirectory = outputDirectory.appendingPathComponent("Checkpoints")'
|
|
3061
|
+
);
|
|
2959
3062
|
this.emit("configuration.isOverCaptureEnabled = true");
|
|
2960
3063
|
this.emit('session.start(imagesDirectory: outputDirectory.appendingPathComponent("Images"),');
|
|
2961
3064
|
this.emit(" configuration: configuration)");
|
|
@@ -3070,7 +3173,9 @@ var init_IOSCompiler = chunkEGIZHYJP_cjs.__esm({
|
|
|
3070
3173
|
this.emit("private func makePhotogrammetryRequest() -> PhotogrammetrySession.Request {");
|
|
3071
3174
|
this.indentLevel++;
|
|
3072
3175
|
this.emit('let outputURL = outputDirectory.appendingPathComponent("model.usdz")');
|
|
3073
|
-
this.emit(
|
|
3176
|
+
this.emit(
|
|
3177
|
+
"// .full detail level captures PBR maps (diffuse, normal, roughness, metallic, AO)"
|
|
3178
|
+
);
|
|
3074
3179
|
this.emit("return .modelFile(url: outputURL, detail: .full)");
|
|
3075
3180
|
this.indentLevel--;
|
|
3076
3181
|
this.emit("}");
|
|
@@ -3083,7 +3188,9 @@ var init_IOSCompiler = chunkEGIZHYJP_cjs.__esm({
|
|
|
3083
3188
|
this.emit("");
|
|
3084
3189
|
this.emit("for level in HoloCapturedEntity.DetailLevel.allCases {");
|
|
3085
3190
|
this.indentLevel++;
|
|
3086
|
-
this.emit(
|
|
3191
|
+
this.emit(
|
|
3192
|
+
'let url = outputDirectory.appendingPathComponent("model_\\(level.rawValue).usdz")'
|
|
3193
|
+
);
|
|
3087
3194
|
this.emit("let detail: PhotogrammetrySession.Request.Detail");
|
|
3088
3195
|
this.emit("switch level {");
|
|
3089
3196
|
this.emit("case .preview: detail = .preview");
|
|
@@ -3107,7 +3214,9 @@ var init_IOSCompiler = chunkEGIZHYJP_cjs.__esm({
|
|
|
3107
3214
|
this.emit("");
|
|
3108
3215
|
}
|
|
3109
3216
|
if (traits.has("pbr_texture_extract") || traits.has("object_capture")) {
|
|
3110
|
-
this.emit(
|
|
3217
|
+
this.emit(
|
|
3218
|
+
"private func extractPBRMaterials(from modelURL: URL) -> HoloCapturedEntity.PBRMaterialSet? {"
|
|
3219
|
+
);
|
|
3111
3220
|
this.indentLevel++;
|
|
3112
3221
|
this.emit("let baseDir = modelURL.deletingLastPathComponent()");
|
|
3113
3222
|
this.emit('let diffuse = baseDir.appendingPathComponent("diffuse.png")');
|
|
@@ -3117,10 +3226,18 @@ var init_IOSCompiler = chunkEGIZHYJP_cjs.__esm({
|
|
|
3117
3226
|
this.emit('let ao = baseDir.appendingPathComponent("ao.png")');
|
|
3118
3227
|
this.emit("");
|
|
3119
3228
|
this.emit("return HoloCapturedEntity.PBRMaterialSet(");
|
|
3120
|
-
this.emit(
|
|
3121
|
-
|
|
3122
|
-
|
|
3123
|
-
this.emit(
|
|
3229
|
+
this.emit(
|
|
3230
|
+
" diffuseMap: FileManager.default.fileExists(atPath: diffuse.path) ? diffuse : nil,"
|
|
3231
|
+
);
|
|
3232
|
+
this.emit(
|
|
3233
|
+
" normalMap: FileManager.default.fileExists(atPath: normal.path) ? normal : nil,"
|
|
3234
|
+
);
|
|
3235
|
+
this.emit(
|
|
3236
|
+
" roughnessMap: FileManager.default.fileExists(atPath: roughness.path) ? roughness : nil,"
|
|
3237
|
+
);
|
|
3238
|
+
this.emit(
|
|
3239
|
+
" metallicMap: FileManager.default.fileExists(atPath: metallic.path) ? metallic : nil,"
|
|
3240
|
+
);
|
|
3124
3241
|
this.emit(" aoMap: FileManager.default.fileExists(atPath: ao.path) ? ao : nil");
|
|
3125
3242
|
this.emit(")");
|
|
3126
3243
|
this.indentLevel--;
|
|
@@ -3185,16 +3302,24 @@ var init_IOSCompiler = chunkEGIZHYJP_cjs.__esm({
|
|
|
3185
3302
|
this.emit('var holo = "scene CapturedObject {\\n"');
|
|
3186
3303
|
this.emit('holo += " object \\(entity.name) {\\n"');
|
|
3187
3304
|
this.emit('holo += " model: \\"\\(entity.modelURL.lastPathComponent)\\"\\n"');
|
|
3188
|
-
this.emit(
|
|
3189
|
-
|
|
3305
|
+
this.emit(
|
|
3306
|
+
'holo += " position: [\\(entity.boundingBox.center.x), \\(entity.boundingBox.center.y), \\(entity.boundingBox.center.z)]\\n"'
|
|
3307
|
+
);
|
|
3308
|
+
this.emit(
|
|
3309
|
+
'holo += " scale: [\\(entity.boundingBox.extents.x), \\(entity.boundingBox.extents.y), \\(entity.boundingBox.extents.z)]\\n"'
|
|
3310
|
+
);
|
|
3190
3311
|
this.emit('holo += " traits: [object_capture, photogrammetry_scan]\\n"');
|
|
3191
3312
|
if (traits.has("pbr_texture_extract")) {
|
|
3192
3313
|
this.emit("if let pbr = entity.pbrMaterials {");
|
|
3193
3314
|
this.indentLevel++;
|
|
3194
3315
|
this.emit('if pbr.diffuseMap != nil { holo += " diffuse_map: \\"diffuse.png\\"\\n" }');
|
|
3195
3316
|
this.emit('if pbr.normalMap != nil { holo += " normal_map: \\"normal.png\\"\\n" }');
|
|
3196
|
-
this.emit(
|
|
3197
|
-
|
|
3317
|
+
this.emit(
|
|
3318
|
+
'if pbr.roughnessMap != nil { holo += " roughness_map: \\"roughness.png\\"\\n" }'
|
|
3319
|
+
);
|
|
3320
|
+
this.emit(
|
|
3321
|
+
'if pbr.metallicMap != nil { holo += " metallic_map: \\"metallic.png\\"\\n" }'
|
|
3322
|
+
);
|
|
3198
3323
|
this.emit('if pbr.aoMap != nil { holo += " ao_map: \\"ao.png\\"\\n" }');
|
|
3199
3324
|
this.indentLevel--;
|
|
3200
3325
|
this.emit("}");
|
|
@@ -3323,7 +3448,7 @@ var init_IOSCompiler = chunkEGIZHYJP_cjs.__esm({
|
|
|
3323
3448
|
}
|
|
3324
3449
|
// ─── SharePlay Multi-User AR (M.010.12) ──────────────────────────────
|
|
3325
3450
|
hasSharePlayTraits(composition) {
|
|
3326
|
-
const sharePlayNames =
|
|
3451
|
+
const sharePlayNames = chunkMD6KDHVE_cjs.SHAREPLAY_TRAITS;
|
|
3327
3452
|
for (const obj of composition.objects || []) {
|
|
3328
3453
|
for (const trait of obj.traits || []) {
|
|
3329
3454
|
const name = typeof trait === "string" ? trait : trait.name;
|
|
@@ -3437,7 +3562,9 @@ var init_IOSCompiler = chunkEGIZHYJP_cjs.__esm({
|
|
|
3437
3562
|
this.emit("");
|
|
3438
3563
|
}
|
|
3439
3564
|
if (this.compositionHasTrait(composition, "shareplay_anchor_local")) {
|
|
3440
|
-
this.emit(
|
|
3565
|
+
this.emit(
|
|
3566
|
+
"// Local AR anchor mapping \u2014 each participant maps shared positions to local space"
|
|
3567
|
+
);
|
|
3441
3568
|
this.emit("private var localWorldTransform: simd_float4x4 = matrix_identity_float4x4");
|
|
3442
3569
|
this.emit("private var sharedToLocalOffset: simd_float3 = .zero");
|
|
3443
3570
|
this.emit("");
|
|
@@ -3528,9 +3655,7 @@ var init_IOSCompiler = chunkEGIZHYJP_cjs.__esm({
|
|
|
3528
3655
|
this.emit("func becomeHost() {");
|
|
3529
3656
|
this.indentLevel++;
|
|
3530
3657
|
this.emit("isHost = true");
|
|
3531
|
-
this.emit(
|
|
3532
|
-
"broadcastSceneState() // Host pushes authoritative state to all participants"
|
|
3533
|
-
);
|
|
3658
|
+
this.emit("broadcastSceneState() // Host pushes authoritative state to all participants");
|
|
3534
3659
|
this.indentLevel--;
|
|
3535
3660
|
this.emit("}");
|
|
3536
3661
|
this.emit("");
|
|
@@ -3776,9 +3901,7 @@ var init_IOSCompiler = chunkEGIZHYJP_cjs.__esm({
|
|
|
3776
3901
|
if (this.compositionHasTrait(composition, "shareplay_anchor_local")) {
|
|
3777
3902
|
this.emit("// MARK: - Local Anchor Mapping");
|
|
3778
3903
|
this.emit("");
|
|
3779
|
-
this.emit(
|
|
3780
|
-
"func calibrateLocalAnchor(arFrame: ARFrame, sharedReferencePoint: simd_float3) {"
|
|
3781
|
-
);
|
|
3904
|
+
this.emit("func calibrateLocalAnchor(arFrame: ARFrame, sharedReferencePoint: simd_float3) {");
|
|
3782
3905
|
this.indentLevel++;
|
|
3783
3906
|
this.emit("// Each participant creates a local ARKit anchor and maps shared positions");
|
|
3784
3907
|
this.emit("let cameraPos = arFrame.camera.transform.columns.3");
|
|
@@ -3807,9 +3930,7 @@ var init_IOSCompiler = chunkEGIZHYJP_cjs.__esm({
|
|
|
3807
3930
|
this.emit("");
|
|
3808
3931
|
this.emit("func configureSpatialAudio() {");
|
|
3809
3932
|
this.indentLevel++;
|
|
3810
|
-
this.emit(
|
|
3811
|
-
"// SpatialAudioExperience.custom(fixedToScene: true) for participant voices"
|
|
3812
|
-
);
|
|
3933
|
+
this.emit("// SpatialAudioExperience.custom(fixedToScene: true) for participant voices");
|
|
3813
3934
|
this.emit("guard let session = groupSession else { return }");
|
|
3814
3935
|
this.emit("session.spatialAudioExperience = .custom(fixedToScene: true)");
|
|
3815
3936
|
this.indentLevel--;
|
|
@@ -3819,9 +3940,7 @@ var init_IOSCompiler = chunkEGIZHYJP_cjs.__esm({
|
|
|
3819
3940
|
if (this.compositionHasTrait(composition, "shareplay_mute_zone")) {
|
|
3820
3941
|
this.emit("// MARK: - Mute Zones");
|
|
3821
3942
|
this.emit("");
|
|
3822
|
-
this.emit(
|
|
3823
|
-
"func addMuteZone(center: simd_float3, radius: Float, attenuation: Float = 0.0) {"
|
|
3824
|
-
);
|
|
3943
|
+
this.emit("func addMuteZone(center: simd_float3, radius: Float, attenuation: Float = 0.0) {");
|
|
3825
3944
|
this.indentLevel++;
|
|
3826
3945
|
this.emit(
|
|
3827
3946
|
"muteZones.append(MuteZone(center: center, radius: radius, attenuation: attenuation))"
|
|
@@ -3838,9 +3957,7 @@ var init_IOSCompiler = chunkEGIZHYJP_cjs.__esm({
|
|
|
3838
3957
|
this.emit("if distance < zone.radius {");
|
|
3839
3958
|
this.indentLevel++;
|
|
3840
3959
|
this.emit("let factor = distance / zone.radius");
|
|
3841
|
-
this.emit(
|
|
3842
|
-
"let zoneAttenuation = zone.attenuation + (1.0 - zone.attenuation) * factor"
|
|
3843
|
-
);
|
|
3960
|
+
this.emit("let zoneAttenuation = zone.attenuation + (1.0 - zone.attenuation) * factor");
|
|
3844
3961
|
this.emit("minAttenuation = min(minAttenuation, zoneAttenuation)");
|
|
3845
3962
|
this.indentLevel--;
|
|
3846
3963
|
this.emit("}");
|
|
@@ -3880,12 +3997,8 @@ var init_IOSCompiler = chunkEGIZHYJP_cjs.__esm({
|
|
|
3880
3997
|
this.emit("// Session status");
|
|
3881
3998
|
this.emit("HStack {");
|
|
3882
3999
|
this.indentLevel++;
|
|
3883
|
-
this.emit(
|
|
3884
|
-
|
|
3885
|
-
);
|
|
3886
|
-
this.emit(
|
|
3887
|
-
'Text(manager.isSessionActive ? "SharePlay Active" : "SharePlay Inactive")'
|
|
3888
|
-
);
|
|
4000
|
+
this.emit('Image(systemName: manager.isSessionActive ? "person.2.fill" : "person.2")');
|
|
4001
|
+
this.emit('Text(manager.isSessionActive ? "SharePlay Active" : "SharePlay Inactive")');
|
|
3889
4002
|
this.indentLevel--;
|
|
3890
4003
|
this.emit("}");
|
|
3891
4004
|
this.emit(".padding()");
|
|
@@ -3928,7 +4041,7 @@ var init_IOSCompiler = chunkEGIZHYJP_cjs.__esm({
|
|
|
3928
4041
|
}
|
|
3929
4042
|
// ─── TrueDepth Face Tracking (M.010.14) ─────────────────────────────
|
|
3930
4043
|
hasFaceTrackingTraits(composition) {
|
|
3931
|
-
const faceTraitNames =
|
|
4044
|
+
const faceTraitNames = chunkMD6KDHVE_cjs.FACE_TRACKING_TRAITS;
|
|
3932
4045
|
for (const obj of composition.objects || []) {
|
|
3933
4046
|
for (const trait of obj.traits || []) {
|
|
3934
4047
|
const name = typeof trait === "string" ? trait : trait.name;
|
|
@@ -3952,7 +4065,9 @@ var init_IOSCompiler = chunkEGIZHYJP_cjs.__esm({
|
|
|
3952
4065
|
const hasGaze = this.compositionHasTrait(composition, "face_gaze_direction");
|
|
3953
4066
|
const hasTongue = this.compositionHasTrait(composition, "face_tongue_detect");
|
|
3954
4067
|
this.emit("// Auto-generated by HoloScript IOSCompiler \u2014 TrueDepth Face Tracking");
|
|
3955
|
-
this.emit(
|
|
4068
|
+
this.emit(
|
|
4069
|
+
`// Source: composition "${this.escapeStringValue(composition.name, "Swift")}"`
|
|
4070
|
+
);
|
|
3956
4071
|
this.emit("// Requires iOS 11.0+, ARKit, TrueDepth camera");
|
|
3957
4072
|
this.emit("// Do not edit manually \u2014 regenerate from .holo source");
|
|
3958
4073
|
this.emit("");
|
|
@@ -3998,7 +4113,9 @@ var init_IOSCompiler = chunkEGIZHYJP_cjs.__esm({
|
|
|
3998
4113
|
}
|
|
3999
4114
|
if (hasRetarget) {
|
|
4000
4115
|
this.emit("@Published var retargetedBlendShapes: [String: Float] = [:]");
|
|
4001
|
-
this.emit(
|
|
4116
|
+
this.emit(
|
|
4117
|
+
"var retargetMap: [ARFaceAnchor.BlendShapeLocation: (target: String, scale: Float)] = [:]"
|
|
4118
|
+
);
|
|
4002
4119
|
}
|
|
4003
4120
|
this.emit("");
|
|
4004
4121
|
this.emit("private var arSession: ARSession?");
|
|
@@ -4054,7 +4171,9 @@ var init_IOSCompiler = chunkEGIZHYJP_cjs.__esm({
|
|
|
4054
4171
|
this.emit("");
|
|
4055
4172
|
this.emit("func session(_ session: ARSession, didUpdate anchors: [ARAnchor]) {");
|
|
4056
4173
|
this.indentLevel++;
|
|
4057
|
-
this.emit(
|
|
4174
|
+
this.emit(
|
|
4175
|
+
"guard let faceAnchor = anchors.compactMap({ $0 as? ARFaceAnchor }).first else { return }"
|
|
4176
|
+
);
|
|
4058
4177
|
this.emit("");
|
|
4059
4178
|
if (hasBlendshapes || hasAvatarDrive || hasMirror || hasPuppet) {
|
|
4060
4179
|
this.emit("let shapes = faceAnchor.blendShapes");
|
|
@@ -4151,7 +4270,9 @@ var init_IOSCompiler = chunkEGIZHYJP_cjs.__esm({
|
|
|
4151
4270
|
this.emit("// MARK: - Puppet Mode");
|
|
4152
4271
|
this.emit("");
|
|
4153
4272
|
this.emit("/// Puppet mode: avatar responds exclusively to face input.");
|
|
4154
|
-
this.emit(
|
|
4273
|
+
this.emit(
|
|
4274
|
+
"/// Returns a complete morph target dictionary derived solely from face tracking."
|
|
4275
|
+
);
|
|
4155
4276
|
this.emit("func getPuppetMorphTargets() -> [String: Float] {");
|
|
4156
4277
|
this.indentLevel++;
|
|
4157
4278
|
this.emit("var targets: [String: Float] = [:]");
|
|
@@ -4168,8 +4289,12 @@ var init_IOSCompiler = chunkEGIZHYJP_cjs.__esm({
|
|
|
4168
4289
|
if (hasRetarget) {
|
|
4169
4290
|
this.emit("// MARK: - Retargeting");
|
|
4170
4291
|
this.emit("");
|
|
4171
|
-
this.emit(
|
|
4172
|
-
|
|
4292
|
+
this.emit(
|
|
4293
|
+
"/// Applies retarget map to remap/scale blendshapes for non-human avatar topologies."
|
|
4294
|
+
);
|
|
4295
|
+
this.emit(
|
|
4296
|
+
"private func applyRetargeting(from shapes: [ARFaceAnchor.BlendShapeLocation: NSNumber]) {"
|
|
4297
|
+
);
|
|
4173
4298
|
this.indentLevel++;
|
|
4174
4299
|
this.emit("var result: [String: Float] = [:]");
|
|
4175
4300
|
this.emit("for (arkitShape, value) in shapes {");
|
|
@@ -4198,7 +4323,9 @@ var init_IOSCompiler = chunkEGIZHYJP_cjs.__esm({
|
|
|
4198
4323
|
this.emit("// MARK: - Emotion Detection");
|
|
4199
4324
|
this.emit("");
|
|
4200
4325
|
this.emit("/// Derives emotion from blendshape combinations.");
|
|
4201
|
-
this.emit(
|
|
4326
|
+
this.emit(
|
|
4327
|
+
"private func detectEmotion(from shapes: [ARFaceAnchor.BlendShapeLocation: NSNumber]) {"
|
|
4328
|
+
);
|
|
4202
4329
|
this.indentLevel++;
|
|
4203
4330
|
this.emit("let mouthSmileL = shapes[.mouthSmileLeft]?.floatValue ?? 0.0");
|
|
4204
4331
|
this.emit("let mouthSmileR = shapes[.mouthSmileRight]?.floatValue ?? 0.0");
|
|
@@ -4230,7 +4357,9 @@ var init_IOSCompiler = chunkEGIZHYJP_cjs.__esm({
|
|
|
4230
4357
|
this.emit("emotion = .surprised");
|
|
4231
4358
|
this.indentLevel--;
|
|
4232
4359
|
this.emit("// Angry: browDown + mouthPress");
|
|
4233
|
-
this.emit(
|
|
4360
|
+
this.emit(
|
|
4361
|
+
"} else if ((browDownL + browDownR) / 2.0 > 0.4) && ((mouthPressL + mouthPressR) / 2.0 > 0.3) {"
|
|
4362
|
+
);
|
|
4234
4363
|
this.indentLevel++;
|
|
4235
4364
|
this.emit("emotion = .angry");
|
|
4236
4365
|
this.indentLevel--;
|
|
@@ -4269,7 +4398,9 @@ var init_IOSCompiler = chunkEGIZHYJP_cjs.__esm({
|
|
|
4269
4398
|
this.emit('Text("Blendshapes (\\(manager.blendShapes.count))").font(.subheadline)');
|
|
4270
4399
|
this.emit("ScrollView {");
|
|
4271
4400
|
this.indentLevel++;
|
|
4272
|
-
this.emit(
|
|
4401
|
+
this.emit(
|
|
4402
|
+
"ForEach(Array(manager.blendShapes.keys).sorted(by: { $0.rawValue < $1.rawValue }), id: \\.rawValue) { key in"
|
|
4403
|
+
);
|
|
4273
4404
|
this.indentLevel++;
|
|
4274
4405
|
this.emit("HStack {");
|
|
4275
4406
|
this.indentLevel++;
|
|
@@ -4286,7 +4417,9 @@ var init_IOSCompiler = chunkEGIZHYJP_cjs.__esm({
|
|
|
4286
4417
|
this.emit('Text("Emotion: \\(manager.currentEmotion.rawValue)").font(.subheadline)');
|
|
4287
4418
|
}
|
|
4288
4419
|
if (hasGaze) {
|
|
4289
|
-
this.emit(
|
|
4420
|
+
this.emit(
|
|
4421
|
+
'Text("Gaze: \\(manager.gazeDirection.x, specifier: "%.2f"), \\(manager.gazeDirection.y, specifier: "%.2f"), \\(manager.gazeDirection.z, specifier: "%.2f")").font(.caption)'
|
|
4422
|
+
);
|
|
4290
4423
|
}
|
|
4291
4424
|
if (hasTongue) {
|
|
4292
4425
|
this.emit('Text("Tongue Out: \\(manager.isTongueOut ? "Yes" : "No")").font(.caption)');
|
|
@@ -4313,7 +4446,7 @@ var init_IOSCompiler = chunkEGIZHYJP_cjs.__esm({
|
|
|
4313
4446
|
}
|
|
4314
4447
|
// ─── UWB Positioning (iOS 16+, Nearby Interaction — M.010.13) ────────
|
|
4315
4448
|
hasUWBPositioningTraits(composition) {
|
|
4316
|
-
const uwbNames =
|
|
4449
|
+
const uwbNames = chunkMD6KDHVE_cjs.UWB_POSITIONING_TRAITS;
|
|
4317
4450
|
for (const obj of composition.objects || []) {
|
|
4318
4451
|
for (const trait of obj.traits || []) {
|
|
4319
4452
|
const name = typeof trait === "string" ? trait : trait.name;
|
|
@@ -4418,11 +4551,15 @@ var init_IOSCompiler = chunkEGIZHYJP_cjs.__esm({
|
|
|
4418
4551
|
this.indentLevel++;
|
|
4419
4552
|
this.emit("guard !isScanning else { return }");
|
|
4420
4553
|
this.emit("");
|
|
4421
|
-
this.emit(
|
|
4554
|
+
this.emit(
|
|
4555
|
+
"let session = MCSession(peer: localPeerId, securityIdentity: nil, encryptionPreference: .required)"
|
|
4556
|
+
);
|
|
4422
4557
|
this.emit("session.delegate = self");
|
|
4423
4558
|
this.emit("mcSession = session");
|
|
4424
4559
|
this.emit("");
|
|
4425
|
-
this.emit(
|
|
4560
|
+
this.emit(
|
|
4561
|
+
"mcAdvertiser = MCNearbyServiceAdvertiser(peer: localPeerId, discoveryInfo: nil, serviceType: serviceType)"
|
|
4562
|
+
);
|
|
4426
4563
|
this.emit("mcAdvertiser?.delegate = self");
|
|
4427
4564
|
this.emit("mcAdvertiser?.startAdvertisingPeer()");
|
|
4428
4565
|
this.emit("");
|
|
@@ -4508,9 +4645,13 @@ var init_IOSCompiler = chunkEGIZHYJP_cjs.__esm({
|
|
|
4508
4645
|
this.indentLevel--;
|
|
4509
4646
|
this.emit("]");
|
|
4510
4647
|
this.emit("");
|
|
4511
|
-
this.emit(
|
|
4648
|
+
this.emit(
|
|
4649
|
+
"guard let data = try? JSONSerialization.data(withJSONObject: payload) else { return }"
|
|
4650
|
+
);
|
|
4512
4651
|
this.emit("");
|
|
4513
|
-
this.emit(
|
|
4652
|
+
this.emit(
|
|
4653
|
+
"if let mcPeer = session.connectedPeers.first(where: { $0.displayName == peerId }) {"
|
|
4654
|
+
);
|
|
4514
4655
|
this.indentLevel++;
|
|
4515
4656
|
this.emit("try? session.send(data, toPeers: [mcPeer], with: .reliable)");
|
|
4516
4657
|
this.emit('print("[UWB] Handoff entity \\(entityId) to \\(peerId)")');
|
|
@@ -4571,7 +4712,9 @@ var init_IOSCompiler = chunkEGIZHYJP_cjs.__esm({
|
|
|
4571
4712
|
this.emit("private func shareDiscoveryToken(with mcPeer: MCPeerID) {");
|
|
4572
4713
|
this.indentLevel++;
|
|
4573
4714
|
this.emit("guard let token = niSession?.discoveryToken,");
|
|
4574
|
-
this.emit(
|
|
4715
|
+
this.emit(
|
|
4716
|
+
" let data = try? NSKeyedArchiver.archivedData(withRootObject: token, requiringSecureCoding: true) else { return }"
|
|
4717
|
+
);
|
|
4575
4718
|
this.emit("try? mcSession?.send(data, toPeers: [mcPeer], with: .reliable)");
|
|
4576
4719
|
this.indentLevel--;
|
|
4577
4720
|
this.emit("}");
|
|
@@ -4607,7 +4750,9 @@ var init_IOSCompiler = chunkEGIZHYJP_cjs.__esm({
|
|
|
4607
4750
|
this.emit("for obj in nearbyObjects {");
|
|
4608
4751
|
this.indentLevel++;
|
|
4609
4752
|
this.emit("guard let peerId = peerTokenMap[obj.discoveryToken] else { continue }");
|
|
4610
|
-
this.emit(
|
|
4753
|
+
this.emit(
|
|
4754
|
+
"var peer = peers[peerId] ?? UWBPeer(id: peerId, discoveryToken: obj.discoveryToken)"
|
|
4755
|
+
);
|
|
4611
4756
|
this.emit("peer.distance = obj.distance");
|
|
4612
4757
|
this.emit("peer.direction = obj.direction");
|
|
4613
4758
|
this.emit("peer.lastSeen = Date()");
|
|
@@ -4618,7 +4763,9 @@ var init_IOSCompiler = chunkEGIZHYJP_cjs.__esm({
|
|
|
4618
4763
|
this.indentLevel--;
|
|
4619
4764
|
this.emit("}");
|
|
4620
4765
|
this.emit("");
|
|
4621
|
-
this.emit(
|
|
4766
|
+
this.emit(
|
|
4767
|
+
"func session(_ session: NISession, didRemove nearbyObjects: [NINearbyObject], reason: NINearbyObject.RemovalReason) {"
|
|
4768
|
+
);
|
|
4622
4769
|
this.indentLevel++;
|
|
4623
4770
|
this.emit("for obj in nearbyObjects {");
|
|
4624
4771
|
this.indentLevel++;
|
|
@@ -4663,7 +4810,9 @@ var init_IOSCompiler = chunkEGIZHYJP_cjs.__esm({
|
|
|
4663
4810
|
this.emit(`extension ${cls}UWBManager: MCSessionDelegate {`);
|
|
4664
4811
|
this.indentLevel++;
|
|
4665
4812
|
this.emit("");
|
|
4666
|
-
this.emit(
|
|
4813
|
+
this.emit(
|
|
4814
|
+
"func session(_ session: MCSession, peer peerID: MCPeerID, didChange state: MCSessionState) {"
|
|
4815
|
+
);
|
|
4667
4816
|
this.indentLevel++;
|
|
4668
4817
|
this.emit("switch state {");
|
|
4669
4818
|
this.emit("case .connected:");
|
|
@@ -4689,10 +4838,14 @@ var init_IOSCompiler = chunkEGIZHYJP_cjs.__esm({
|
|
|
4689
4838
|
this.indentLevel--;
|
|
4690
4839
|
this.emit("}");
|
|
4691
4840
|
this.emit("");
|
|
4692
|
-
this.emit(
|
|
4841
|
+
this.emit(
|
|
4842
|
+
"func session(_ session: MCSession, didReceive data: Data, fromPeer peerID: MCPeerID) {"
|
|
4843
|
+
);
|
|
4693
4844
|
this.indentLevel++;
|
|
4694
4845
|
this.emit("// Try to decode as NI discovery token");
|
|
4695
|
-
this.emit(
|
|
4846
|
+
this.emit(
|
|
4847
|
+
"if let token = try? NSKeyedUnarchiver.unarchivedObject(ofClass: NIDiscoveryToken.self, from: data) {"
|
|
4848
|
+
);
|
|
4696
4849
|
this.indentLevel++;
|
|
4697
4850
|
this.emit("peerTokenMap[token] = peerID.displayName");
|
|
4698
4851
|
this.emit("let peer = UWBPeer(id: peerID.displayName, discoveryToken: token)");
|
|
@@ -4705,7 +4858,9 @@ var init_IOSCompiler = chunkEGIZHYJP_cjs.__esm({
|
|
|
4705
4858
|
if (this.compositionHasTrait(composition, "uwb_handoff")) {
|
|
4706
4859
|
this.emit("");
|
|
4707
4860
|
this.emit("// Try to decode as handoff payload");
|
|
4708
|
-
this.emit(
|
|
4861
|
+
this.emit(
|
|
4862
|
+
"if let json = try? JSONSerialization.jsonObject(with: data) as? [String: String],"
|
|
4863
|
+
);
|
|
4709
4864
|
this.emit(' json["type"] == "uwb_handoff",');
|
|
4710
4865
|
this.emit(' let entityId = json["entityId"],');
|
|
4711
4866
|
this.emit(" let peer = peers[peerID.displayName] {");
|
|
@@ -4717,9 +4872,15 @@ var init_IOSCompiler = chunkEGIZHYJP_cjs.__esm({
|
|
|
4717
4872
|
this.indentLevel--;
|
|
4718
4873
|
this.emit("}");
|
|
4719
4874
|
this.emit("");
|
|
4720
|
-
this.emit(
|
|
4721
|
-
|
|
4722
|
-
|
|
4875
|
+
this.emit(
|
|
4876
|
+
"func session(_ session: MCSession, didReceive stream: InputStream, withName streamName: String, fromPeer peerID: MCPeerID) {}"
|
|
4877
|
+
);
|
|
4878
|
+
this.emit(
|
|
4879
|
+
"func session(_ session: MCSession, didStartReceivingResourceWithName resourceName: String, fromPeer peerID: MCPeerID, with progress: Progress) {}"
|
|
4880
|
+
);
|
|
4881
|
+
this.emit(
|
|
4882
|
+
"func session(_ session: MCSession, didFinishReceivingResourceWithName resourceName: String, fromPeer peerID: MCPeerID, at localURL: URL?, withError error: Error?) {}"
|
|
4883
|
+
);
|
|
4723
4884
|
this.indentLevel--;
|
|
4724
4885
|
this.emit("}");
|
|
4725
4886
|
this.emit("");
|
|
@@ -4728,7 +4889,9 @@ var init_IOSCompiler = chunkEGIZHYJP_cjs.__esm({
|
|
|
4728
4889
|
this.emit(`extension ${cls}UWBManager: MCNearbyServiceAdvertiserDelegate {`);
|
|
4729
4890
|
this.indentLevel++;
|
|
4730
4891
|
this.emit("");
|
|
4731
|
-
this.emit(
|
|
4892
|
+
this.emit(
|
|
4893
|
+
"func advertiser(_ advertiser: MCNearbyServiceAdvertiser, didReceiveInvitationFromPeer peerID: MCPeerID, withContext context: Data?, invitationHandler: @escaping (Bool, MCSession?) -> Void) {"
|
|
4894
|
+
);
|
|
4732
4895
|
this.indentLevel++;
|
|
4733
4896
|
this.emit("invitationHandler(true, mcSession)");
|
|
4734
4897
|
this.indentLevel--;
|
|
@@ -4741,7 +4904,9 @@ var init_IOSCompiler = chunkEGIZHYJP_cjs.__esm({
|
|
|
4741
4904
|
this.emit(`extension ${cls}UWBManager: MCNearbyServiceBrowserDelegate {`);
|
|
4742
4905
|
this.indentLevel++;
|
|
4743
4906
|
this.emit("");
|
|
4744
|
-
this.emit(
|
|
4907
|
+
this.emit(
|
|
4908
|
+
"func browser(_ browser: MCNearbyServiceBrowser, foundPeer peerID: MCPeerID, withDiscoveryInfo info: [String: String]?) {"
|
|
4909
|
+
);
|
|
4745
4910
|
this.indentLevel++;
|
|
4746
4911
|
this.emit("guard let session = mcSession else { return }");
|
|
4747
4912
|
this.emit("browser.invitePeer(peerID, to: session, withContext: nil, timeout: 10)");
|
|
@@ -4798,7 +4963,7 @@ var init_IOSCompiler = chunkEGIZHYJP_cjs.__esm({
|
|
|
4798
4963
|
}
|
|
4799
4964
|
// === AirPods Spatial Audio (iOS 15+, AVFoundation PHASE + CMHeadphoneMotionManager — M.010.11) ===
|
|
4800
4965
|
hasSpatialAudioTraits(composition) {
|
|
4801
|
-
const spatialNames =
|
|
4966
|
+
const spatialNames = chunkMD6KDHVE_cjs.AIRPODS_SPATIAL_AUDIO_TRAITS;
|
|
4802
4967
|
for (const obj of composition.objects || []) {
|
|
4803
4968
|
for (const trait of obj.traits || []) {
|
|
4804
4969
|
const name = typeof trait === "string" ? trait : trait.name;
|
|
@@ -4808,7 +4973,7 @@ var init_IOSCompiler = chunkEGIZHYJP_cjs.__esm({
|
|
|
4808
4973
|
return false;
|
|
4809
4974
|
}
|
|
4810
4975
|
collectSpatialAudioTraits(composition) {
|
|
4811
|
-
const spatialNames =
|
|
4976
|
+
const spatialNames = chunkMD6KDHVE_cjs.AIRPODS_SPATIAL_AUDIO_TRAITS;
|
|
4812
4977
|
const found = /* @__PURE__ */ new Set();
|
|
4813
4978
|
for (const obj of composition.objects || []) {
|
|
4814
4979
|
for (const t of obj.traits || []) {
|
|
@@ -4932,7 +5097,9 @@ var init_IOSCompiler = chunkEGIZHYJP_cjs.__esm({
|
|
|
4932
5097
|
this.indentLevel--;
|
|
4933
5098
|
this.emit("}");
|
|
4934
5099
|
this.emit("");
|
|
4935
|
-
this.emit(
|
|
5100
|
+
this.emit(
|
|
5101
|
+
"headphoneMotionManager.startDeviceMotionUpdates(to: .main) { [weak self] motion, error in"
|
|
5102
|
+
);
|
|
4936
5103
|
this.indentLevel++;
|
|
4937
5104
|
this.emit("guard let self = self, let motion = motion else { return }");
|
|
4938
5105
|
this.emit("self.headTrackingActive = true");
|
|
@@ -4980,7 +5147,9 @@ var init_IOSCompiler = chunkEGIZHYJP_cjs.__esm({
|
|
|
4980
5147
|
this.emit("sources[source.id] = phaseSource");
|
|
4981
5148
|
this.emit("audioSources.append(source)");
|
|
4982
5149
|
this.emit("");
|
|
4983
|
-
this.emit(
|
|
5150
|
+
this.emit(
|
|
5151
|
+
"loadAndPlayAudio(sourceId: source.id, audioFile: source.audioFile, gain: source.gain)"
|
|
5152
|
+
);
|
|
4984
5153
|
this.indentLevel--;
|
|
4985
5154
|
this.emit("}");
|
|
4986
5155
|
this.emit("");
|
|
@@ -5042,7 +5211,9 @@ var init_IOSCompiler = chunkEGIZHYJP_cjs.__esm({
|
|
|
5042
5211
|
this.indentLevel--;
|
|
5043
5212
|
this.emit(")");
|
|
5044
5213
|
this.emit("samplerNodeDef.playbackMode = .looping");
|
|
5045
|
-
this.emit(
|
|
5214
|
+
this.emit(
|
|
5215
|
+
"samplerNodeDef.setCalibrationMode(calibrationMode: .relativeSpl, level: Double(gain * 20))"
|
|
5216
|
+
);
|
|
5046
5217
|
this.emit("");
|
|
5047
5218
|
if (traits.has("audio_falloff")) {
|
|
5048
5219
|
this.emit("// Distance-based falloff (audio_falloff)");
|
|
@@ -5055,7 +5226,9 @@ var init_IOSCompiler = chunkEGIZHYJP_cjs.__esm({
|
|
|
5055
5226
|
this.emit("distanceModelParameters.rolloffFactor = 1.0");
|
|
5056
5227
|
this.emit("");
|
|
5057
5228
|
this.emit("let spatialPipelineDef = PHASESpatialPipeline(flags: [.directPathTransmission])!");
|
|
5058
|
-
this.emit(
|
|
5229
|
+
this.emit(
|
|
5230
|
+
"spatialPipelineDef.entries[PHASESpatialCategory.directPath]!.sendLevel = Double(gain)"
|
|
5231
|
+
);
|
|
5059
5232
|
this.emit("");
|
|
5060
5233
|
this.emit("let spatialMixerDef = PHASESpatialMixerDefinition(");
|
|
5061
5234
|
this.indentLevel++;
|
|
@@ -5065,7 +5238,9 @@ var init_IOSCompiler = chunkEGIZHYJP_cjs.__esm({
|
|
|
5065
5238
|
this.emit("spatialMixerDef.distanceModelParameters = distanceModelParameters");
|
|
5066
5239
|
} else {
|
|
5067
5240
|
this.emit("let spatialPipelineDef = PHASESpatialPipeline(flags: [.directPathTransmission])!");
|
|
5068
|
-
this.emit(
|
|
5241
|
+
this.emit(
|
|
5242
|
+
"spatialPipelineDef.entries[PHASESpatialCategory.directPath]!.sendLevel = Double(gain)"
|
|
5243
|
+
);
|
|
5069
5244
|
this.emit("");
|
|
5070
5245
|
this.emit("let spatialMixerDef = PHASESpatialMixerDefinition(");
|
|
5071
5246
|
this.indentLevel++;
|
|
@@ -5139,7 +5314,9 @@ var init_IOSCompiler = chunkEGIZHYJP_cjs.__esm({
|
|
|
5139
5314
|
if (traits.has("audio_occlusion")) {
|
|
5140
5315
|
this.emit("// MARK: - Audio Occlusion (audio_occlusion)");
|
|
5141
5316
|
this.emit("");
|
|
5142
|
-
this.emit(
|
|
5317
|
+
this.emit(
|
|
5318
|
+
"func updateOcclusionForSource(id: String, occluded: Bool, attenuationDb: Float = -12.0) {"
|
|
5319
|
+
);
|
|
5143
5320
|
this.indentLevel++;
|
|
5144
5321
|
this.emit("guard let event = soundEvents[id] else { return }");
|
|
5145
5322
|
this.emit("if occluded {");
|
|
@@ -5213,7 +5390,9 @@ var init_IOSCompiler = chunkEGIZHYJP_cjs.__esm({
|
|
|
5213
5390
|
this.emit('Image(systemName: "speaker.wave.3")');
|
|
5214
5391
|
this.emit("Text(source.id)");
|
|
5215
5392
|
this.emit("Spacer()");
|
|
5216
|
-
this.emit(
|
|
5393
|
+
this.emit(
|
|
5394
|
+
'Text(String(format: "(%.1f, %.1f, %.1f)", source.position.x, source.position.y, source.position.z))'
|
|
5395
|
+
);
|
|
5217
5396
|
this.indentLevel--;
|
|
5218
5397
|
this.emit("}");
|
|
5219
5398
|
this.indentLevel--;
|
|
@@ -5240,5 +5419,5 @@ var init_IOSCompiler = chunkEGIZHYJP_cjs.__esm({
|
|
|
5240
5419
|
exports.IOSCompiler_exports = IOSCompiler_exports;
|
|
5241
5420
|
exports.compileToIOS = compileToIOS;
|
|
5242
5421
|
exports.init_IOSCompiler = init_IOSCompiler;
|
|
5243
|
-
//# sourceMappingURL=chunk-
|
|
5244
|
-
//# sourceMappingURL=chunk-
|
|
5422
|
+
//# sourceMappingURL=chunk-CBJSLA2E.cjs.map
|
|
5423
|
+
//# sourceMappingURL=chunk-CBJSLA2E.cjs.map
|