@sudobility/music_spatial_core 0.0.6 → 0.0.8
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/dist/geometry.d.ts +26 -8
- package/dist/geometry.d.ts.map +1 -1
- package/dist/geometry.js +46 -16
- package/dist/geometry.js.map +1 -1
- package/dist/project.js +5 -7
- package/dist/project.js.map +1 -1
- package/dist/scene.d.ts +25 -2
- package/dist/scene.d.ts.map +1 -1
- package/dist/scene.js +29 -16
- package/dist/scene.js.map +1 -1
- package/package.json +3 -3
package/dist/geometry.d.ts
CHANGED
|
@@ -5,15 +5,33 @@
|
|
|
5
5
|
* Deliberately does NOT take a pose. A model's pose (offset/rotation/scale
|
|
6
6
|
* from `spatialModelForTrack`) becomes an *object* transform — applied by
|
|
7
7
|
* `buildScene` as the `position`/`rotation`/`scale` a platform package
|
|
8
|
-
* hands to `<
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
8
|
+
* hands to `<lineSegments>` — rather than baked into vertex coordinates
|
|
9
|
+
* here. `three`'s own transform pipeline already does this correctly;
|
|
10
|
+
* re-deriving rotation matrices by hand in this file would only be a
|
|
11
|
+
* second, riskier way to compute the same thing.
|
|
12
12
|
*/
|
|
13
13
|
import { BufferGeometry } from 'three';
|
|
14
14
|
import type { InstrumentSpatialModel } from '@sudobility/music_types';
|
|
15
|
-
/**
|
|
16
|
-
*
|
|
17
|
-
*
|
|
18
|
-
|
|
15
|
+
/**
|
|
16
|
+
* ONE `THREE.BufferGeometry` per model, holding every stroke, laid out for
|
|
17
|
+
* `THREE.LineSegments` (consecutive vertex pairs, not a line strip) — a
|
|
18
|
+
* platform package wraps it in a single `<lineSegments geometry={g} />`.
|
|
19
|
+
*
|
|
20
|
+
* It used to be one geometry per stroke, and the platform packages drew one
|
|
21
|
+
* `<lineSegments>` + one material for each. Measured on a four-track band
|
|
22
|
+
* (piano, bass, string ensemble, drum kit): ~645 draw calls for 6,850
|
|
23
|
+
* vertices, because 58% of the strokes across all GM models are a single
|
|
24
|
+
* two-vertex segment. Every stroke of a model is drawn in the same colour
|
|
25
|
+
* (`InstrumentSpatialModel` carries no per-stroke colour or width — see
|
|
26
|
+
* music_types' `spatial-art.ts`), so nothing distinguished those draw calls
|
|
27
|
+
* but the buffer they read from. Merged: one draw call per instrument.
|
|
28
|
+
*/
|
|
29
|
+
export declare function buildInstrumentGeometry(model: InstrumentSpatialModel): BufferGeometry;
|
|
30
|
+
/**
|
|
31
|
+
* How many line segments `model` draws: the sum over its strokes of
|
|
32
|
+
* (points - 1). The merged geometry holds exactly twice this many vertices.
|
|
33
|
+
* This was the per-model draw-call count before merging, and is what a
|
|
34
|
+
* test compares the merged vertex count against.
|
|
35
|
+
*/
|
|
36
|
+
export declare function instrumentSegmentCount(model: InstrumentSpatialModel): number;
|
|
19
37
|
//# sourceMappingURL=geometry.d.ts.map
|
package/dist/geometry.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"geometry.d.ts","sourceRoot":"","sources":["../src/geometry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,OAAO,EAAE,cAAc,EAA0B,MAAM,OAAO,CAAC;AAC/D,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,yBAAyB,CAAC;AAEtE
|
|
1
|
+
{"version":3,"file":"geometry.d.ts","sourceRoot":"","sources":["../src/geometry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,OAAO,EAAE,cAAc,EAA0B,MAAM,OAAO,CAAC;AAC/D,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,yBAAyB,CAAC;AAEtE;;;;;;;;;;;;;GAaG;AACH,wBAAgB,uBAAuB,CACrC,KAAK,EAAE,sBAAsB,GAC5B,cAAc,CAMhB;AAED;;;;;GAKG;AACH,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,sBAAsB,GAAG,MAAM,CAI5E"}
|
package/dist/geometry.js
CHANGED
|
@@ -5,15 +5,26 @@
|
|
|
5
5
|
* Deliberately does NOT take a pose. A model's pose (offset/rotation/scale
|
|
6
6
|
* from `spatialModelForTrack`) becomes an *object* transform — applied by
|
|
7
7
|
* `buildScene` as the `position`/`rotation`/`scale` a platform package
|
|
8
|
-
* hands to `<
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
8
|
+
* hands to `<lineSegments>` — rather than baked into vertex coordinates
|
|
9
|
+
* here. `three`'s own transform pipeline already does this correctly;
|
|
10
|
+
* re-deriving rotation matrices by hand in this file would only be a
|
|
11
|
+
* second, riskier way to compute the same thing.
|
|
12
12
|
*/
|
|
13
13
|
import { BufferGeometry, Float32BufferAttribute } from 'three';
|
|
14
|
-
/**
|
|
15
|
-
*
|
|
16
|
-
*
|
|
14
|
+
/**
|
|
15
|
+
* ONE `THREE.BufferGeometry` per model, holding every stroke, laid out for
|
|
16
|
+
* `THREE.LineSegments` (consecutive vertex pairs, not a line strip) — a
|
|
17
|
+
* platform package wraps it in a single `<lineSegments geometry={g} />`.
|
|
18
|
+
*
|
|
19
|
+
* It used to be one geometry per stroke, and the platform packages drew one
|
|
20
|
+
* `<lineSegments>` + one material for each. Measured on a four-track band
|
|
21
|
+
* (piano, bass, string ensemble, drum kit): ~645 draw calls for 6,850
|
|
22
|
+
* vertices, because 58% of the strokes across all GM models are a single
|
|
23
|
+
* two-vertex segment. Every stroke of a model is drawn in the same colour
|
|
24
|
+
* (`InstrumentSpatialModel` carries no per-stroke colour or width — see
|
|
25
|
+
* music_types' `spatial-art.ts`), so nothing distinguished those draw calls
|
|
26
|
+
* but the buffer they read from. Merged: one draw call per instrument.
|
|
27
|
+
*/
|
|
17
28
|
export function buildInstrumentGeometry(model) {
|
|
18
29
|
const cached = GEOMETRY_CACHE.get(model);
|
|
19
30
|
if (cached)
|
|
@@ -22,18 +33,32 @@ export function buildInstrumentGeometry(model) {
|
|
|
22
33
|
GEOMETRY_CACHE.set(model, built);
|
|
23
34
|
return built;
|
|
24
35
|
}
|
|
36
|
+
/**
|
|
37
|
+
* How many line segments `model` draws: the sum over its strokes of
|
|
38
|
+
* (points - 1). The merged geometry holds exactly twice this many vertices.
|
|
39
|
+
* This was the per-model draw-call count before merging, and is what a
|
|
40
|
+
* test compares the merged vertex count against.
|
|
41
|
+
*/
|
|
42
|
+
export function instrumentSegmentCount(model) {
|
|
43
|
+
let count = 0;
|
|
44
|
+
for (const stroke of model.strokes)
|
|
45
|
+
count += Math.max(0, stroke.length - 1);
|
|
46
|
+
return count;
|
|
47
|
+
}
|
|
25
48
|
/**
|
|
26
49
|
* Keyed by model identity: the models are module-level singletons in
|
|
27
50
|
* music_types (a violin is one object for the life of the process), and
|
|
28
51
|
* `buildScene` runs on every sounding-state change — many times a second
|
|
29
52
|
* while playing — so without this every note-on rebuilt a few hundred
|
|
30
|
-
* segments per instrument
|
|
31
|
-
* so sharing one across instances and
|
|
53
|
+
* segments per instrument (measured: 3.0ms cold, 0.44ms warm). Geometries
|
|
54
|
+
* are never mutated after creation, so sharing one across instances and
|
|
55
|
+
* frames is safe.
|
|
32
56
|
*/
|
|
33
57
|
const GEOMETRY_CACHE = new WeakMap();
|
|
34
58
|
function buildUncached(model) {
|
|
35
|
-
|
|
36
|
-
|
|
59
|
+
const positions = new Float32Array(instrumentSegmentCount(model) * 6);
|
|
60
|
+
let at = 0;
|
|
61
|
+
for (const stroke of model.strokes) {
|
|
37
62
|
for (let i = 0; i < stroke.length - 1; i++) {
|
|
38
63
|
const [ax, ay, az] = stroke[i];
|
|
39
64
|
const [bx, by, bz] = stroke[i + 1];
|
|
@@ -41,11 +66,16 @@ function buildUncached(model) {
|
|
|
41
66
|
// frame (+x = the player's right facing +z); three.js is
|
|
42
67
|
// right-handed. See scene.ts, which mirrors positions and rotations
|
|
43
68
|
// to match.
|
|
44
|
-
positions
|
|
69
|
+
positions[at++] = -ax;
|
|
70
|
+
positions[at++] = ay;
|
|
71
|
+
positions[at++] = az;
|
|
72
|
+
positions[at++] = -bx;
|
|
73
|
+
positions[at++] = by;
|
|
74
|
+
positions[at++] = bz;
|
|
45
75
|
}
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
76
|
+
}
|
|
77
|
+
const geometry = new BufferGeometry();
|
|
78
|
+
geometry.setAttribute('position', new Float32BufferAttribute(positions, 3));
|
|
79
|
+
return geometry;
|
|
50
80
|
}
|
|
51
81
|
//# sourceMappingURL=geometry.js.map
|
package/dist/geometry.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"geometry.js","sourceRoot":"","sources":["../src/geometry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,OAAO,EAAE,cAAc,EAAE,sBAAsB,EAAE,MAAM,OAAO,CAAC;AAG/D
|
|
1
|
+
{"version":3,"file":"geometry.js","sourceRoot":"","sources":["../src/geometry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,OAAO,EAAE,cAAc,EAAE,sBAAsB,EAAE,MAAM,OAAO,CAAC;AAG/D;;;;;;;;;;;;;GAaG;AACH,MAAM,UAAU,uBAAuB,CACrC,KAA6B;IAE7B,MAAM,MAAM,GAAG,cAAc,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IACzC,IAAI,MAAM;QAAE,OAAO,MAAM,CAAC;IAC1B,MAAM,KAAK,GAAG,aAAa,CAAC,KAAK,CAAC,CAAC;IACnC,cAAc,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;IACjC,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,sBAAsB,CAAC,KAA6B;IAClE,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,KAAK,MAAM,MAAM,IAAI,KAAK,CAAC,OAAO;QAAE,KAAK,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAC5E,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,cAAc,GAAG,IAAI,OAAO,EAA0C,CAAC;AAE7E,SAAS,aAAa,CAAC,KAA6B;IAClD,MAAM,SAAS,GAAG,IAAI,YAAY,CAAC,sBAAsB,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;IACtE,IAAI,EAAE,GAAG,CAAC,CAAC;IACX,KAAK,MAAM,MAAM,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;QACnC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YAC3C,MAAM,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;YAC/B,MAAM,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,GAAG,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;YACnC,qEAAqE;YACrE,yDAAyD;YACzD,oEAAoE;YACpE,YAAY;YACZ,SAAS,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC;YACtB,SAAS,CAAC,EAAE,EAAE,CAAC,GAAG,EAAE,CAAC;YACrB,SAAS,CAAC,EAAE,EAAE,CAAC,GAAG,EAAE,CAAC;YACrB,SAAS,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC;YACtB,SAAS,CAAC,EAAE,EAAE,CAAC,GAAG,EAAE,CAAC;YACrB,SAAS,CAAC,EAAE,EAAE,CAAC,GAAG,EAAE,CAAC;QACvB,CAAC;IACH,CAAC;IACD,MAAM,QAAQ,GAAG,IAAI,cAAc,EAAE,CAAC;IACtC,QAAQ,CAAC,YAAY,CAAC,UAAU,EAAE,IAAI,sBAAsB,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,CAAC;IAC5E,OAAO,QAAQ,CAAC;AAClB,CAAC"}
|
package/dist/project.js
CHANGED
|
@@ -127,13 +127,11 @@ class Projector {
|
|
|
127
127
|
const segments = [];
|
|
128
128
|
const a = new Vector3();
|
|
129
129
|
const b = new Vector3();
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
this.pushSegment(segments, a, b);
|
|
136
|
-
}
|
|
130
|
+
const positions = instrument.geometry.getAttribute('position');
|
|
131
|
+
for (let i = 0; i + 1 < positions.count; i += 2) {
|
|
132
|
+
a.fromBufferAttribute(positions, i).applyMatrix4(modelView);
|
|
133
|
+
b.fromBufferAttribute(positions, i + 1).applyMatrix4(modelView);
|
|
134
|
+
this.pushSegment(segments, a, b);
|
|
137
135
|
}
|
|
138
136
|
const distance = this.eye.distanceTo(new Vector3(px, py, pz));
|
|
139
137
|
return {
|
package/dist/project.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"project.js","sourceRoot":"","sources":["../src/project.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"project.js","sourceRoot":"","sources":["../src/project.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC;AAE5D,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AA2C3D,6EAA6E;AAC7E,MAAM,CAAC,MAAM,aAAa,GAAG;IAC3B,UAAU,EAAE,SAAS;IACrB,SAAS,EAAE,SAAS;IACpB,SAAS,EAAE,SAAS;IACpB,IAAI,EAAE,SAAS;CACP,CAAC;AAEX,uFAAuF;AACvF,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,CAAC;AAC1B,MAAM,CAAC,MAAM,OAAO,GAAG,EAAE,CAAC;AAE1B,MAAM,CAAC,MAAM,eAAe,GAAG,EAAE,CAAC;AAClC,gFAAgF;AAChF,MAAM,UAAU,GAAG,IAAI,CAAC;AAExB,sGAAsG;AACtG,MAAM,SAAS,GAAG,EAAE,CAAC;AACrB,MAAM,cAAc,GAAG,EAAE,CAAC;AAC1B,sDAAsD;AACtD,MAAM,UAAU,GAAG,CAAC,CAAC;AACrB,MAAM,aAAa,GAAG,EAAE,CAAC;AACzB,MAAM,MAAM,GAAG,KAAK,CAAC;AAErB,wEAAwE;AACxE,MAAM,UAAU,OAAO,CAAC,QAAgB;IACtC,MAAM,CAAC,GAAG,CAAC,QAAQ,GAAG,QAAQ,CAAC,GAAG,CAAC,OAAO,GAAG,QAAQ,CAAC,CAAC;IACvD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACrC,CAAC;AAED,MAAM,UAAU,YAAY,CAC1B,KAAmB,EACnB,QAAkB;IAElB,MAAM,SAAS,GAAG,IAAI,SAAS,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;IACjD,OAAO;QACL,KAAK,EAAE,SAAS,CAAC,KAAK,CAAC,KAAK,CAAC;QAC7B,SAAS,EAAE,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC;QAChC,IAAI,EAAE,SAAS,CAAC,IAAI,EAAE;QACtB,WAAW,EAAE,KAAK,CAAC,WAAW;aAC3B,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC,SAAS,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;aACnD,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,QAAQ,CAAC;KAC3C,CAAC;AACJ,CAAC;AAED,MAAM,SAAS;IASb,YAAY,KAAmB,EAAE,QAAkB;QARlC;;;;mBAAO,IAAI,OAAO,EAAE;WAAC;QACrB;;;;;WAAkB;QAClB;;;;;WAAmB;QACpC,mEAAmE;QAClD;;;;;WAAe;QACf;;;;;WAAe;QACf;;;;;WAAa;QAG5B,MAAM,GAAG,GAAG,CAAC,CAAC,QAAQ,CAAC,MAAM,IAAI,eAAe,CAAC,GAAG,IAAI,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC;QACnE,IAAI,CAAC,SAAS,GAAG,QAAQ,CAAC,KAAK,GAAG,CAAC,CAAC;QACpC,IAAI,CAAC,UAAU,GAAG,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC;QACtC,uEAAuE;QACvE,mEAAmE;QACnE,sEAAsE;QACtE,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;QAClD,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;QAE1B,MAAM,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC;QAC3C,MAAM,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC;QAC3C,IAAI,CAAC,GAAG,GAAG,IAAI,OAAO,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;QACnC,MAAM,WAAW,GAAG,IAAI,OAAO,EAAE,CAAC,OAAO,CACvC,IAAI,CAAC,GAAG,EACR,IAAI,UAAU,EAAE,CAAC,YAAY,CAAC,IAAI,KAAK,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,CAAC,CAAC,EAC3D,IAAI,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CACrB,CAAC;QACF,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,MAAM,EAAE,CAAC;IACvC,CAAC;IAED,UAAU,CAAC,UAA6B;QACtC,MAAM,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,GAAG,UAAU,CAAC,QAAQ,CAAC;QACzC,MAAM,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,GAAG,UAAU,CAAC,QAAQ,CAAC;QACzC,MAAM,KAAK,GAAG,IAAI,OAAO,EAAE,CAAC,OAAO,CACjC,IAAI,OAAO,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EACvB,IAAI,UAAU,EAAE,CAAC,YAAY,CAAC,IAAI,KAAK,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,CAAC,CAAC,EAC3D,IAAI,OAAO,CAAC,UAAU,CAAC,KAAK,EAAE,UAAU,CAAC,KAAK,EAAE,UAAU,CAAC,KAAK,CAAC,CAClE,CAAC;QACF,MAAM,SAAS,GAAG,IAAI,OAAO,EAAE,CAAC,gBAAgB,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QAEnE,MAAM,QAAQ,GAAa,EAAE,CAAC;QAC9B,MAAM,CAAC,GAAG,IAAI,OAAO,EAAE,CAAC;QACxB,MAAM,CAAC,GAAG,IAAI,OAAO,EAAE,CAAC;QACxB,MAAM,SAAS,GAAG,UAAU,CAAC,QAAQ,CAAC,YAAY,CAAC,UAAU,CAAC,CAAC;QAC/D,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,SAAS,CAAC,KAAK,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;YAChD,CAAC,CAAC,mBAAmB,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC;YAC5D,CAAC,CAAC,mBAAmB,CAAC,SAAS,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC;YAChE,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QACnC,CAAC;QAED,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,OAAO,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;QAC9D,OAAO;YACL,OAAO,EAAE,UAAU,CAAC,OAAO;YAC3B,GAAG,EAAE,UAAU,CAAC,GAAG;YACnB,KAAK,EAAE,UAAU,CAAC,KAAK;YACvB,QAAQ,EAAE,UAAU,CAAC,QAAQ;YAC7B,QAAQ;YACR,IAAI,EAAE,OAAO,CAAC,QAAQ,CAAC;YACvB,QAAQ;SACT,CAAC;IACJ,CAAC;IAED,sEAAsE;IACtE,KAAK,CAAC,QAAiB;QACrB,MAAM,IAAI,GAAG,SAAS,GAAG,CAAC,CAAC;QAC3B,MAAM,IAAI,GAAG,SAAS,GAAG,cAAc,CAAC;QACxC,MAAM,OAAO,GAAG,IAAI,WAAW,EAAE,CAAC;QAClC,MAAM,CAAC,GAAG,IAAI,OAAO,EAAE,CAAC;QACxB,MAAM,CAAC,GAAG,IAAI,OAAO,EAAE,CAAC;QACxB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,cAAc,EAAE,CAAC,EAAE,EAAE,CAAC;YACzC,MAAM,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,GAAG,IAAI,CAAC;YAC3B,MAAM,MAAM,GAAG,CAAC,KAAK,CAAC,CAAC;YACvB,IAAI,MAAM,KAAK,QAAQ;gBAAE,SAAS;YAClC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,cAAc,EAAE,CAAC,EAAE,EAAE,CAAC;gBACxC,MAAM,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,GAAG,IAAI,CAAC;gBAC3B,kDAAkD;gBAClD,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;gBACf,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC;gBACtB,IAAI,CAAC,gBAAgB,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;gBACrC,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;gBACf,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;gBACtB,IAAI,CAAC,gBAAgB,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;YACvC,CAAC;QACH,CAAC;QACD,OAAO,OAAO,CAAC,OAAO,EAAE,CAAC;IAC3B,CAAC;IAED,IAAI;QACF,MAAM,OAAO,GAAG,IAAI,WAAW,EAAE,CAAC;QAClC,MAAM,CAAC,GAAG,IAAI,OAAO,EAAE,CAAC;QACxB,MAAM,CAAC,GAAG,IAAI,OAAO,EAAE,CAAC;QACxB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,aAAa,EAAE,CAAC,EAAE,EAAE,CAAC;YACvC,MAAM,EAAE,GAAG,CAAC,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC,GAAG,aAAa,CAAC;YACzC,MAAM,EAAE,GAAG,CAAC,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,aAAa,CAAC;YAC/C,CAAC,CAAC,GAAG,CACH,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,gBAAgB,EAC/B,MAAM,EACN,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,gBAAgB,CAChC,CAAC;YACF,CAAC,CAAC,GAAG,CACH,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,gBAAgB,EAC/B,MAAM,EACN,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,gBAAgB,CAChC,CAAC;YACF,IAAI,CAAC,gBAAgB,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QACvC,CAAC;QACD,OAAO,OAAO,CAAC,OAAO,EAAE,CAAC;IAC3B,CAAC;IAEO,gBAAgB,CAAC,OAAoB,EAAE,CAAU,EAAE,CAAU;QACnE,MAAM,IAAI,GAAG,OAAO,CAClB,IAAI,CAAC,GAAG,CAAC,UAAU,CACjB,IAAI,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAC/D,CACF,CAAC;QACF,IAAI,IAAI,IAAI,CAAC;YAAE,OAAO;QACtB,CAAC,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC1B,CAAC,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC1B,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IAC5C,CAAC;IAED;;;;;;;OAOG;IACK,WAAW,CAAC,GAAa,EAAE,CAAU,EAAE,CAAU;QACvD,2DAA2D;QAC3D,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,UAAU,CAAC;QAC9B,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,UAAU,CAAC;QAC9B,IAAI,CAAC,GAAG,IAAI,CAAC,GAAG;YAAE,OAAO;QACzB,IAAI,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YACjB,MAAM,CAAC,GAAG,CAAC,CAAC,UAAU,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;YAC5C,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;YACjC,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;YACjC,IAAI,GAAG;gBAAE,CAAC,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC;;gBAC/B,CAAC,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC;QAClC,CAAC;QACD,GAAG,CAAC,IAAI,CACN,IAAI,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM,EAC3C,IAAI,CAAC,UAAU,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM,EAC5C,IAAI,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM,EAC3C,IAAI,CAAC,UAAU,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM,CAC7C,CAAC;IACJ,CAAC;CACF;AAED;+DAC+D;AAC/D,MAAM,WAAW;IAAjB;QACmB;;;;mBAAU,IAAI,GAAG,EAAoB;WAAC;IAoBzD,CAAC;IAlBC,GAAG,CAAC,IAAY;QACd,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,UAAU,GAAG,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,UAAU,CAAC,CAAC,CAAC;QACtE,IAAI,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QACrC,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,GAAG,EAAE,CAAC;YACZ,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;QAClC,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,OAAO;QACL,OAAO,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;aAC/B,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;aAC3B,GAAG,CAAC,CAAC,CAAC,KAAK,EAAE,QAAQ,CAAC,EAAE,EAAE,CAAC,CAAC;YAC3B,QAAQ;YACR,IAAI,EAAE,CAAC,KAAK,GAAG,GAAG,CAAC,GAAG,UAAU;SACjC,CAAC,CAAC,CAAC;IACR,CAAC;CACF"}
|
package/dist/scene.d.ts
CHANGED
|
@@ -5,6 +5,16 @@
|
|
|
5
5
|
* once per relevant render/tick — a platform's `SpatialCanvas` becomes
|
|
6
6
|
* close to a plain `.map()` over `instruments` plus one camera assignment.
|
|
7
7
|
*
|
|
8
|
+
* ## Two halves, memoised apart
|
|
9
|
+
*
|
|
10
|
+
* `buildInstruments` reads the tracks, their stage positions and the lit
|
|
11
|
+
* set; `cameraFor` reads the listener and nothing else. They are separate
|
|
12
|
+
* functions so a platform can memoise each on its own inputs: the listener
|
|
13
|
+
* moves on every walking frame, and when the whole scene was one memo keyed
|
|
14
|
+
* on `score` every step re-created every instrument's element for a camera
|
|
15
|
+
* that was the only thing that had changed. `buildScene` composes the two
|
|
16
|
+
* for callers that want the whole frame at once.
|
|
17
|
+
*
|
|
8
18
|
* ## Handedness
|
|
9
19
|
*
|
|
10
20
|
* The arrangement convention (`unplugged.ts`, the map overlay, the audio
|
|
@@ -19,11 +29,12 @@
|
|
|
19
29
|
* every rotation about y and z. Nothing upstream has to know.
|
|
20
30
|
*/
|
|
21
31
|
import type { BufferGeometry } from 'three';
|
|
22
|
-
import type { Score } from '@sudobility/music_types';
|
|
32
|
+
import type { EffectiveUnpluggedArrangement, Score, Track, UnpluggedListener } from '@sudobility/music_types';
|
|
23
33
|
export type Vec3Tuple = readonly [number, number, number];
|
|
24
34
|
export interface SpatialInstrument {
|
|
25
35
|
readonly trackId: string;
|
|
26
|
-
|
|
36
|
+
/** Every stroke of the model in one `LineSegments` buffer — one draw call. */
|
|
37
|
+
readonly geometry: BufferGeometry;
|
|
27
38
|
readonly position: Vec3Tuple;
|
|
28
39
|
readonly rotation: Vec3Tuple;
|
|
29
40
|
readonly scale: number;
|
|
@@ -41,5 +52,17 @@ export interface SpatialScene {
|
|
|
41
52
|
readonly instruments: readonly SpatialInstrument[];
|
|
42
53
|
readonly camera: SpatialCamera;
|
|
43
54
|
}
|
|
55
|
+
/** What `buildInstruments` needs to know about a track. */
|
|
56
|
+
export type SpatialTrack = Pick<Track, 'id' | 'name' | 'clef' | 'midiProgram'>;
|
|
57
|
+
/**
|
|
58
|
+
* One `SpatialInstrument` per track, placed by `arrangementTracks` (the
|
|
59
|
+
* `tracks` half of an `EffectiveUnpluggedArrangement`) and lit by
|
|
60
|
+
* `soundingTrackIds`. Independent of the listener: memoise it on these
|
|
61
|
+
* three inputs and a walking frame costs nothing here.
|
|
62
|
+
*/
|
|
63
|
+
export declare function buildInstruments(tracks: readonly SpatialTrack[], arrangementTracks: EffectiveUnpluggedArrangement['tracks'], soundingTrackIds: ReadonlySet<string>): readonly SpatialInstrument[];
|
|
64
|
+
/** The camera transform for `listener`: ear height, x mirrored, yaw from its facing. */
|
|
65
|
+
export declare function cameraFor(listener: UnpluggedListener): SpatialCamera;
|
|
66
|
+
/** Both halves at once, from the score's effective arrangement. */
|
|
44
67
|
export declare function buildScene(score: Pick<Score, 'tracks' | 'unplugged'>, soundingTrackIds: ReadonlySet<string>): SpatialScene;
|
|
45
68
|
//# sourceMappingURL=scene.d.ts.map
|
package/dist/scene.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scene.d.ts","sourceRoot":"","sources":["../src/scene.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"scene.d.ts","sourceRoot":"","sources":["../src/scene.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,OAAO,CAAC;AAK5C,OAAO,KAAK,EACV,6BAA6B,EAC7B,KAAK,EACL,KAAK,EACL,iBAAiB,EAClB,MAAM,yBAAyB,CAAC;AAIjC,MAAM,MAAM,SAAS,GAAG,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;AAE1D,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,8EAA8E;IAC9E,QAAQ,CAAC,QAAQ,EAAE,cAAc,CAAC;IAClC,QAAQ,CAAC,QAAQ,EAAE,SAAS,CAAC;IAC7B,QAAQ,CAAC,QAAQ,EAAE,SAAS,CAAC;IAC7B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,GAAG,EAAE,OAAO,CAAC;IACtB,uEAAuE;IACvE,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,uEAAuE;IACvE,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,QAAQ,EAAE,SAAS,CAAC;IAC7B,QAAQ,CAAC,QAAQ,EAAE,SAAS,CAAC;CAC9B;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,WAAW,EAAE,SAAS,iBAAiB,EAAE,CAAC;IACnD,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAC;CAChC;AAED,2DAA2D;AAC3D,MAAM,MAAM,YAAY,GAAG,IAAI,CAAC,KAAK,EAAE,IAAI,GAAG,MAAM,GAAG,MAAM,GAAG,aAAa,CAAC,CAAC;AAqB/E;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAC9B,MAAM,EAAE,SAAS,YAAY,EAAE,EAC/B,iBAAiB,EAAE,6BAA6B,CAAC,QAAQ,CAAC,EAC1D,gBAAgB,EAAE,WAAW,CAAC,MAAM,CAAC,GACpC,SAAS,iBAAiB,EAAE,CAkC9B;AAED,wFAAwF;AACxF,wBAAgB,SAAS,CAAC,QAAQ,EAAE,iBAAiB,GAAG,aAAa,CAWpE;AAED,mEAAmE;AACnE,wBAAgB,UAAU,CACxB,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,QAAQ,GAAG,WAAW,CAAC,EAC1C,gBAAgB,EAAE,WAAW,CAAC,MAAM,CAAC,GACpC,YAAY,CAUd"}
|
package/dist/scene.js
CHANGED
|
@@ -16,11 +16,16 @@ const AUDIENCE_YAW = Math.PI;
|
|
|
16
16
|
function degToRad(deg) {
|
|
17
17
|
return (deg * Math.PI) / 180;
|
|
18
18
|
}
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
19
|
+
/**
|
|
20
|
+
* One `SpatialInstrument` per track, placed by `arrangementTracks` (the
|
|
21
|
+
* `tracks` half of an `EffectiveUnpluggedArrangement`) and lit by
|
|
22
|
+
* `soundingTrackIds`. Independent of the listener: memoise it on these
|
|
23
|
+
* three inputs and a walking frame costs nothing here.
|
|
24
|
+
*/
|
|
25
|
+
export function buildInstruments(tracks, arrangementTracks, soundingTrackIds) {
|
|
26
|
+
const colors = trackColors(tracks);
|
|
27
|
+
return tracks.map(track => {
|
|
28
|
+
const point = arrangementTracks[track.id] ?? { x: 0, z: 0 };
|
|
24
29
|
const { model, pose } = trackSpatialModel(track);
|
|
25
30
|
const lit = soundingTrackIds.has(track.id);
|
|
26
31
|
const color = colors[track.id];
|
|
@@ -49,18 +54,26 @@ export function buildScene(score, soundingTrackIds) {
|
|
|
49
54
|
litColor: color.lit,
|
|
50
55
|
};
|
|
51
56
|
});
|
|
57
|
+
}
|
|
58
|
+
/** The camera transform for `listener`: ear height, x mirrored, yaw from its facing. */
|
|
59
|
+
export function cameraFor(listener) {
|
|
60
|
+
return {
|
|
61
|
+
position: [-listener.x, EAR_HEIGHT, listener.z],
|
|
62
|
+
// Three.js cameras look down their local -Z. With x mirrored, a
|
|
63
|
+
// facing of f degrees (clockwise-positive from +z in arrangement
|
|
64
|
+
// space) is a camera yaw of PI - f: PI looks toward +z, and turning
|
|
65
|
+
// left (f decreasing) turns the camera toward its own left. Pinned
|
|
66
|
+
// by scene.test.ts rather than left to visual inspection — the sign
|
|
67
|
+
// is exactly what was wrong before.
|
|
68
|
+
rotation: [0, Math.PI - degToRad(listener.facingDeg), 0],
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
/** Both halves at once, from the score's effective arrangement. */
|
|
72
|
+
export function buildScene(score, soundingTrackIds) {
|
|
73
|
+
const arrangement = effectiveUnpluggedArrangement(score);
|
|
52
74
|
return {
|
|
53
|
-
instruments,
|
|
54
|
-
camera:
|
|
55
|
-
position: [-arrangement.listener.x, EAR_HEIGHT, arrangement.listener.z],
|
|
56
|
-
// Three.js cameras look down their local -Z. With x mirrored, a
|
|
57
|
-
// facing of f degrees (clockwise-positive from +z in arrangement
|
|
58
|
-
// space) is a camera yaw of PI - f: PI looks toward +z, and turning
|
|
59
|
-
// left (f decreasing) turns the camera toward its own left. Pinned
|
|
60
|
-
// by scene.test.ts rather than left to visual inspection — the sign
|
|
61
|
-
// is exactly what was wrong before.
|
|
62
|
-
rotation: [0, Math.PI - degToRad(arrangement.listener.facingDeg), 0],
|
|
63
|
-
},
|
|
75
|
+
instruments: buildInstruments(score.tracks, arrangement.tracks, soundingTrackIds),
|
|
76
|
+
camera: cameraFor(arrangement.listener),
|
|
64
77
|
};
|
|
65
78
|
}
|
|
66
79
|
//# sourceMappingURL=scene.js.map
|
package/dist/scene.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scene.js","sourceRoot":"","sources":["../src/scene.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"scene.js","sourceRoot":"","sources":["../src/scene.ts"],"names":[],"mappings":"AA+BA,OAAO,EACL,6BAA6B,EAC7B,iBAAiB,GAClB,MAAM,yBAAyB,CAAC;AAOjC,OAAO,EAAE,uBAAuB,EAAE,MAAM,YAAY,CAAC;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AA+BvC,8EAA8E;AAC9E,MAAM,QAAQ,GAAG,CAAC,CAAC;AAEnB,4DAA4D;AAC5D,MAAM,UAAU,GAAG,GAAG,CAAC;AAEvB;;;;;;GAMG;AACH,MAAM,YAAY,GAAG,IAAI,CAAC,EAAE,CAAC;AAE7B,SAAS,QAAQ,CAAC,GAAW;IAC3B,OAAO,CAAC,GAAG,GAAG,IAAI,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC;AAC/B,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,gBAAgB,CAC9B,MAA+B,EAC/B,iBAA0D,EAC1D,gBAAqC;IAErC,MAAM,MAAM,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC;IAEnC,OAAO,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE;QACxB,MAAM,KAAK,GAAG,iBAAiB,CAAC,KAAK,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;QAC5D,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,iBAAiB,CAAC,KAAK,CAAC,CAAC;QACjD,MAAM,GAAG,GAAG,gBAAgB,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAC3C,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAE/B,OAAO;YACL,OAAO,EAAE,KAAK,CAAC,EAAE;YACjB,QAAQ,EAAE,uBAAuB,CAAC,KAAK,CAAC;YACxC,mCAAmC;YACnC,QAAQ,EAAE;gBACR,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;gBAC7B,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;gBAC3B,KAAK,CAAC,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;aAC3B;YACD,oEAAoE;YACpE,sEAAsE;YACtE,mEAAmE;YACnE,gEAAgE;YAChE,sCAAsC;YACtC,QAAQ,EAAE;gBACR,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;gBAC7B,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,GAAG,YAAY,CAAC;gBAC/C,CAAC,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;aAC/B;YACD,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,GAAG;YACH,KAAK,EAAE,KAAK,CAAC,IAAI;YACjB,QAAQ,EAAE,KAAK,CAAC,GAAG;SACpB,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC;AAED,wFAAwF;AACxF,MAAM,UAAU,SAAS,CAAC,QAA2B;IACnD,OAAO;QACL,QAAQ,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,UAAU,EAAE,QAAQ,CAAC,CAAC,CAAC;QAC/C,gEAAgE;QAChE,iEAAiE;QACjE,oEAAoE;QACpE,mEAAmE;QACnE,oEAAoE;QACpE,oCAAoC;QACpC,QAAQ,EAAE,CAAC,CAAC,EAAE,IAAI,CAAC,EAAE,GAAG,QAAQ,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;KACzD,CAAC;AACJ,CAAC;AAED,mEAAmE;AACnE,MAAM,UAAU,UAAU,CACxB,KAA0C,EAC1C,gBAAqC;IAErC,MAAM,WAAW,GAAG,6BAA6B,CAAC,KAAK,CAAC,CAAC;IACzD,OAAO;QACL,WAAW,EAAE,gBAAgB,CAC3B,KAAK,CAAC,MAAM,EACZ,WAAW,CAAC,MAAM,EAClB,gBAAgB,CACjB;QACD,MAAM,EAAE,SAAS,CAAC,WAAW,CAAC,QAAQ,CAAC;KACxC,CAAC;AACJ,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@sudobility/music_spatial_core",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.8",
|
|
4
4
|
"description": "Platform-agnostic engine behind the Moosiac Spatial view: instrument geometry, scene composition, camera/listener math, movement, and map-overlay math shared by music_spatial and music_spatial_rn.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -31,13 +31,13 @@
|
|
|
31
31
|
},
|
|
32
32
|
"dependencies": {},
|
|
33
33
|
"peerDependencies": {
|
|
34
|
-
"@sudobility/music_types": "^0.13.
|
|
34
|
+
"@sudobility/music_types": "^0.13.43",
|
|
35
35
|
"react": ">=18",
|
|
36
36
|
"three": "^0.160.0"
|
|
37
37
|
},
|
|
38
38
|
"devDependencies": {
|
|
39
39
|
"@eslint/js": "^9.38.0",
|
|
40
|
-
"@sudobility/music_types": "^0.13.
|
|
40
|
+
"@sudobility/music_types": "^0.13.43",
|
|
41
41
|
"@testing-library/react": "^16.0.0",
|
|
42
42
|
"@types/react": "^19.2.18",
|
|
43
43
|
"@types/react-dom": "^19.2.0",
|