@nebula-spatial/viewer 0.4.3 → 0.4.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.
@@ -1,9 +1,9 @@
1
- import { n as ot, c as rt, a as ie, b as it, d as at, p as ct, S as Te } from "./session-DhZXy40-.js";
1
+ import { n as ot, c as rt, a as ie, b as it, d as at, p as ct, S as Te } from "./session-Cz6qHYMc.js";
2
2
  import { DataTexture as Oe, UnsignedByteType as Me, RGBAFormat as Ce, NoColorSpace as De, Mesh as ne, Float32BufferAttribute as lt, SRGBColorSpace as Le, MeshStandardMaterial as ut, MeshPhysicalMaterial as pt, TextureLoader as dt, RepeatWrapping as ft, MirroredRepeatWrapping as ht, ClampToEdgeWrapping as mt, Color as yt, Group as le, Vector3 as I, Quaternion as V, Matrix4 as H, Box3 as ue, Sphere as St, SphereGeometry as gt, BoxGeometry as _t } from "three";
3
3
  import { ConvexGeometry as Ut } from "three/examples/jsm/geometries/ConvexGeometry.js";
4
4
  import { buildUSDScene as wt, USDLoader as Et } from "@openusd-wasm/three-loader";
5
5
  import { PXR as bt } from "@openusd-wasm/pxr";
6
- import { d as Ye } from "./stage-BKqg5vNe.js";
6
+ import { d as Ye } from "./stage-D113SHD8.js";
7
7
  function Dt(e) {
8
8
  if (!e) return;
9
9
  if (typeof window > "u") return { baseURL: e };
@@ -651,7 +651,7 @@ async function dn(e, t, n) {
651
651
  let v;
652
652
  try {
653
653
  v = Wt(l, E.map((L) => L.path), U, b), (N = v.massOverrides) != null && N.length && w.approximations.push({ code: "USD_INFERRED_INERTIA", message: "保留显式总质量;惯量按碰撞几何的密度分布推导并同比缩放,重叠体积会重复计入。", source: "usd-physics" });
654
- const { MujocoRuntime: _ } = await import("./mujoco-runtime-s85kwjo7.js");
654
+ const { MujocoRuntime: _ } = await import("./mujoco-runtime-C29PXDOl.js");
655
655
  y = new _(), await y.initialize(v, t.options.mujocoBaseUrl), t.signal.throwIfAborted();
656
656
  } catch (_) {
657
657
  const L = ct(_, t.signal, "usd-physics");
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nebula-spatial/viewer",
3
- "version": "0.4.3",
3
+ "version": "0.4.4",
4
4
  "description": "Read-only Three.js viewer facade",
5
5
  "license": "ISC",
6
6
  "engines": {
@@ -40,7 +40,8 @@
40
40
  "@mujoco/mujoco": "^3.12.0",
41
41
  "@nebula-spatial/cad-loader": "^0.3.0",
42
42
  "@openusd-wasm/pxr": "0.0.13",
43
- "@openusd-wasm/three-loader": "^0.0.13"
43
+ "@openusd-wasm/three-loader": "^0.0.13",
44
+ "three-mesh-bvh": "^0.9.5"
44
45
  },
45
46
  "peerDependencies": {
46
47
  "three": "0.182.0"
@@ -1,208 +0,0 @@
1
- var E = Object.defineProperty;
2
- var M = (r, t, i) => t in r ? E(r, t, { enumerable: !0, configurable: !0, writable: !0, value: i }) : r[t] = i;
3
- var p = (r, t, i) => M(r, typeof t != "symbol" ? t + "" : t, i);
4
- import T from "@mujoco/mujoco";
5
- import I from "@mujoco/mujoco/mujoco.wasm?url";
6
- let w = 0;
7
- function F(r, t) {
8
- const i = `/viewer-simulation-${++w}`;
9
- r.mkdir(i);
10
- const n = /* @__PURE__ */ new Set([i]), o = /* @__PURE__ */ new Set(), a = (e, s) => {
11
- const c = e.replaceAll("\\", "/").split("/");
12
- if (c[0] === "" || c.some((u) => u === ".." || u.includes(":"))) throw b(`Invalid package path: ${e}`, "E_SIMULATION_PATH");
13
- const l = c.filter((u) => u && u !== ".");
14
- if (!l.length) throw b("Package path is empty.", "E_SIMULATION_PATH");
15
- let m = i;
16
- for (const u of l.slice(0, -1))
17
- m += `/${u}`, n.has(m) || (r.mkdir(m), n.add(m));
18
- const d = `${i}/${l.join("/")}`;
19
- return r.writeFile(d, s), o.add(d), d;
20
- }, h = () => {
21
- for (const e of o) r.unlink(e);
22
- o.clear();
23
- for (const e of [...n].reverse()) r.rmdir(e);
24
- n.clear();
25
- };
26
- try {
27
- for (const [e, s] of t) a(e, s);
28
- return { writeEntry: (e) => a("__viewer_entry.xml", e), dispose: h };
29
- } catch (e) {
30
- throw h(), e;
31
- }
32
- }
33
- function b(r, t) {
34
- return Object.assign(new Error(r), { code: t });
35
- }
36
- function O({
37
- target: r,
38
- point: t,
39
- velocity: i,
40
- stiffness: n,
41
- damping: o,
42
- maxForce: a,
43
- strength: h
44
- }) {
45
- const e = [
46
- n * (r[0] - t[0]) - o * i[0],
47
- n * (r[1] - t[1]) - o * i[1],
48
- n * (r[2] - t[2]) - o * i[2]
49
- ], s = Math.hypot(e[0], e[1], e[2]), c = a * h;
50
- if (s > c && s > 0) {
51
- const l = c / s;
52
- e[0] *= l, e[1] *= l, e[2] *= l;
53
- }
54
- return e;
55
- }
56
- const f = 1 / 240, A = 0.05, v = 80, x = 1.15, g = 3.5, y = 14;
57
- class C {
58
- constructor() {
59
- p(this, "mujoco", null);
60
- p(this, "model", null);
61
- p(this, "data", null);
62
- p(this, "grab", null);
63
- p(this, "lastGrabForce", [0, 0, 0]);
64
- p(this, "velocityBuffer", new Float64Array(6));
65
- p(this, "initialControls", []);
66
- p(this, "accumulator", 0);
67
- p(this, "initialVelocities", []);
68
- }
69
- async initialize(t, i) {
70
- var h;
71
- this.mujoco ?? (this.mujoco = await T({ locateFile: (e) => e.endsWith(".wasm") ? i ? new URL(e, i).href : I : e }));
72
- const n = F(this.mujoco.FS, t.files);
73
- let o = null, a = null;
74
- try {
75
- o = this.mujoco.MjModel.from_xml_path(n.writeEntry(t.xml));
76
- for (const e of t.massOverrides ?? []) {
77
- const s = this.mujoco.mj_name2id(o, this.mujoco.mjtObj.mjOBJ_BODY.value, e.body);
78
- if (s <= 0 || !Number.isFinite(e.mass) || e.mass <= 0 || !(o.body_mass[s] > 0)) throw new Error(`Invalid mass override: ${e.body}`);
79
- const c = e.mass / o.body_mass[s];
80
- o.body_mass[s] = e.mass;
81
- for (let l = 0; l < 3; l++) o.body_inertia[s * 3 + l] *= c;
82
- }
83
- a = new this.mujoco.MjData(o), (h = t.massOverrides) != null && h.length && this.mujoco.mj_setConst(o, a), o.opt.timestep = f, this.applyInitialControls(a, t.initialControls), this.applyInitialVelocities(o, a, t.initialVelocities), this.mujoco.mj_forward(o, a);
84
- } catch (e) {
85
- throw a == null || a.delete(), o == null || o.delete(), _(e, "E_MUJOCO_INITIALIZE");
86
- } finally {
87
- n.dispose();
88
- }
89
- this.disposeModel(), this.model = o, this.data = a, this.initialControls = t.initialControls ?? [], this.initialVelocities = t.initialVelocities ?? [], this.accumulator = 0;
90
- }
91
- beginGrab({
92
- bodyId: t,
93
- localPoint: i,
94
- target: n,
95
- stiffness: o = v,
96
- damping: a,
97
- maxForce: h,
98
- dampingRatio: e = x,
99
- maxTargetSpeed: s = g,
100
- targetResponse: c = y
101
- }) {
102
- var j;
103
- const l = Math.max(((j = this.model) == null ? void 0 : j.body_mass[t]) ?? 1, 1e-3), m = a ?? 2 * Math.sqrt(o * l) * e, d = h ?? Math.max(120, l * 60), u = [n[0], n[1], n[2]];
104
- this.grab = {
105
- bodyId: t,
106
- localPoint: [i[0], i[1], i[2]],
107
- target: [...u],
108
- requestedTarget: u,
109
- stiffness: o,
110
- damping: m,
111
- maxForce: d,
112
- strength: 1,
113
- maxTargetSpeed: s,
114
- targetResponse: c
115
- };
116
- }
117
- updateGrabTarget(t) {
118
- this.grab && (this.grab.requestedTarget = [t[0], t[1], t[2]]);
119
- }
120
- updateGrabStrength(t) {
121
- this.grab && (this.grab.strength = t);
122
- }
123
- applyGrabForce() {
124
- if (!this.grab || !this.model || !this.data || !this.mujoco) return;
125
- const { bodyId: t, localPoint: i, target: n, stiffness: o, damping: a, maxForce: h, strength: e } = this.grab, s = this.data.xmat.subarray(t * 9, t * 9 + 9), c = this.data.xpos.subarray(t * 3, t * 3 + 3), l = [
126
- c[0] + s[0] * i[0] + s[1] * i[1] + s[2] * i[2],
127
- c[1] + s[3] * i[0] + s[4] * i[1] + s[5] * i[2],
128
- c[2] + s[6] * i[0] + s[7] * i[1] + s[8] * i[2]
129
- ];
130
- this.mujoco.mj_objectVelocity(
131
- this.model,
132
- this.data,
133
- this.mujoco.mjtObj.mjOBJ_BODY.value,
134
- t,
135
- this.velocityBuffer,
136
- 0
137
- );
138
- const m = this.velocityBuffer, d = [
139
- l[0] - c[0],
140
- l[1] - c[1],
141
- l[2] - c[2]
142
- ], u = [
143
- m[3] + m[1] * d[2] - m[2] * d[1],
144
- m[4] + m[2] * d[0] - m[0] * d[2],
145
- m[5] + m[0] * d[1] - m[1] * d[0]
146
- ], j = O({ target: n, point: l, velocity: u, stiffness: o, damping: a, maxForce: h, strength: e });
147
- this.lastGrabForce = [...j], this.data.qfrc_applied.fill(0), this.mujoco.mj_applyFT(
148
- this.model,
149
- this.data,
150
- j,
151
- [0, 0, 0],
152
- l,
153
- t,
154
- this.data.qfrc_applied
155
- );
156
- }
157
- endGrab() {
158
- this.data && this.data.qfrc_applied.fill(0), this.lastGrabForce = [0, 0, 0], this.grab = null;
159
- }
160
- step(t) {
161
- if (!this.mujoco || !this.model || !this.data || t <= 0) return !1;
162
- this.accumulator += Math.min(t, A);
163
- let i = !1;
164
- for (; this.accumulator >= f; )
165
- this.updateGrabTargetForStep(), this.applyGrabForce(), this.mujoco.mj_step(this.model, this.data), this.accumulator -= f, i = !0;
166
- return i;
167
- }
168
- updateGrabTargetForStep() {
169
- const t = this.grab;
170
- if (!t) return;
171
- const i = t.requestedTarget ?? t.target, n = (t.maxTargetSpeed ?? g) * Math.max(1, Math.sqrt(t.strength)), o = t.targetResponse ?? y, a = 1 - Math.exp(-o * f), h = n * f;
172
- for (let e = 0; e < 3; e++) {
173
- const s = i[e] - t.target[e], c = Math.sign(s) * Math.min(Math.abs(s) * a, h);
174
- t.target[e] += c;
175
- }
176
- }
177
- reset() {
178
- !this.mujoco || !this.model || !this.data || (this.endGrab(), this.mujoco.mj_resetData(this.model, this.data), this.applyInitialControls(this.data, this.initialControls), this.applyInitialVelocities(this.model, this.data, this.initialVelocities), this.mujoco.mj_forward(this.model, this.data), this.accumulator = 0);
179
- }
180
- dispose() {
181
- this.disposeModel(), this.mujoco = null;
182
- }
183
- applyInitialControls(t, i) {
184
- if (i != null && i.length) {
185
- if (i.length !== t.ctrl.length) throw _(new Error(`Initial control count ${i.length} does not match MuJoCo actuator count ${t.ctrl.length}.`), "E_MUJOCO_INITIALIZE");
186
- t.ctrl.set(i);
187
- }
188
- }
189
- applyInitialVelocities(t, i, n) {
190
- for (const o of n ?? []) {
191
- const a = this.mujoco.mj_name2id(t, this.mujoco.mjtObj.mjOBJ_BODY.value, o.body), h = a >= 0 ? t.body_jntadr[a] : -1;
192
- if (h < 0 || t.jnt_type[h] !== this.mujoco.mjtJoint.mjJNT_FREE.value || o.velocity.length !== 6 || !o.velocity.every(Number.isFinite))
193
- throw _(new Error(`Invalid free-body initial velocity: ${o.body}`), "E_MUJOCO_INITIALIZE");
194
- i.qvel.set(o.velocity, t.jnt_dofadr[h]);
195
- }
196
- }
197
- disposeModel() {
198
- var t, i;
199
- this.endGrab(), (t = this.data) == null || t.delete(), (i = this.model) == null || i.delete(), this.data = null, this.model = null, this.initialControls = [], this.initialVelocities = [], this.accumulator = 0;
200
- }
201
- }
202
- function _(r, t) {
203
- const i = r instanceof Error ? r : new Error(String(r));
204
- return Object.assign(i, { code: t });
205
- }
206
- export {
207
- C as MujocoRuntime
208
- };