@playdrop/playdrop-cli 0.7.13 → 0.7.16
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/config/client-meta.json +1 -1
- package/node_modules/@playdrop/ai-client/dist/index.js +461 -444
- package/node_modules/@playdrop/ai-client/package.json +1 -1
- package/node_modules/@playdrop/api-client/dist/client.js +903 -882
- package/node_modules/@playdrop/api-client/dist/core/errors.js +69 -45
- package/node_modules/@playdrop/api-client/dist/core/request.js +188 -159
- package/node_modules/@playdrop/api-client/dist/domains/admin.js +516 -491
- package/node_modules/@playdrop/api-client/dist/domains/ai.js +40 -14
- package/node_modules/@playdrop/api-client/dist/domains/apps.js +480 -462
- package/node_modules/@playdrop/api-client/dist/domains/asset-packs.js +439 -419
- package/node_modules/@playdrop/api-client/dist/domains/assets.js +696 -676
- package/node_modules/@playdrop/api-client/dist/domains/auth.js +346 -320
- package/node_modules/@playdrop/api-client/dist/domains/comments.js +124 -98
- package/node_modules/@playdrop/api-client/dist/domains/free-credits.js +91 -65
- package/node_modules/@playdrop/api-client/dist/domains/me.js +71 -45
- package/node_modules/@playdrop/api-client/dist/domains/payments.js +407 -386
- package/node_modules/@playdrop/api-client/dist/domains/player-meta.js +144 -118
- package/node_modules/@playdrop/api-client/dist/domains/search.js +117 -104
- package/node_modules/@playdrop/api-client/dist/domains/tags.js +188 -162
- package/node_modules/@playdrop/api-client/dist/index.js +993 -552
- package/node_modules/@playdrop/api-client/package.json +1 -1
- package/node_modules/@playdrop/boxel-three/dist/src/animations.js +84 -62
- package/node_modules/@playdrop/boxel-three/dist/src/builders.js +341 -308
- package/node_modules/@playdrop/boxel-three/dist/src/context.js +55 -29
- package/node_modules/@playdrop/boxel-three/dist/src/exporters/glb.js +856 -858
- package/node_modules/@playdrop/boxel-three/dist/src/exporters/image.js +267 -261
- package/node_modules/@playdrop/boxel-three/dist/src/index.js +64 -15
- package/node_modules/@playdrop/boxel-three/dist/src/instantiate.js +89 -63
- package/node_modules/@playdrop/boxel-three/dist/src/nodes.js +81 -56
- package/node_modules/@playdrop/boxel-three/dist/src/overlays.js +112 -86
- package/node_modules/@playdrop/boxel-three/dist/src/primitives.js +45 -17
- package/node_modules/@playdrop/boxel-three/dist/src/scene.js +160 -136
- package/node_modules/@playdrop/boxel-three/dist/src/skinned-mesh.js +582 -584
- package/node_modules/@playdrop/boxel-three/dist/src/texture-atlas.js +123 -97
- package/node_modules/@playdrop/boxel-three/dist/src/textures.js +207 -182
- package/node_modules/@playdrop/boxel-three/dist/src/types.js +15 -1
- package/node_modules/@playdrop/boxel-three/dist/src/voxels/faces.js +451 -425
- package/node_modules/@playdrop/boxel-three/dist/src/voxels/mesher.js +109 -84
- package/node_modules/@playdrop/boxel-three/dist/test/export-image.playwright.test.js +127 -106
- package/node_modules/@playdrop/boxel-three/dist/test/fixtures/render-worker.js +73 -51
- package/node_modules/@playdrop/boxel-three/dist/test/glb-skinned.test.js +97 -79
- package/node_modules/@playdrop/boxel-three/dist/test/index.test.js +29 -7
- package/node_modules/@playdrop/boxel-three/dist/test/instantiate.test.js +80 -60
- package/node_modules/@playdrop/boxel-three/dist/test/overlays.test.js +41 -19
- package/node_modules/@playdrop/boxel-three/dist/test/scene-filter.test.js +72 -50
- package/node_modules/@playdrop/boxel-three/dist/test/scene-smoke.test.js +84 -62
- package/node_modules/@playdrop/boxel-three/dist/test/skinned-mesh.test.js +69 -47
- package/node_modules/@playdrop/boxel-three/dist/test/textured-overlay.test.js +129 -109
- package/node_modules/@playdrop/boxel-three/dist/test/voxels.test.js +40 -18
- package/node_modules/@playdrop/boxel-three/package.json +1 -1
- package/node_modules/@playdrop/config/client-meta.json +1 -1
- package/node_modules/@playdrop/config/dist/tsconfig.tsbuildinfo +1 -1
- package/node_modules/@playdrop/types/dist/api.js +289 -203
- package/node_modules/@playdrop/types/dist/app-capability-filters.js +112 -62
- package/node_modules/@playdrop/types/dist/app.js +91 -45
- package/node_modules/@playdrop/types/dist/asset-pack.js +37 -5
- package/node_modules/@playdrop/types/dist/asset-spec.js +170 -90
- package/node_modules/@playdrop/types/dist/asset.js +186 -108
- package/node_modules/@playdrop/types/dist/content-license.js +49 -15
- package/node_modules/@playdrop/types/dist/creator-public-image.js +60 -32
- package/node_modules/@playdrop/types/dist/ecs.js +102 -82
- package/node_modules/@playdrop/types/dist/engine-builtins.js +603 -573
- package/node_modules/@playdrop/types/dist/entity.js +63 -53
- package/node_modules/@playdrop/types/dist/graph.js +116 -80
- package/node_modules/@playdrop/types/dist/index.js +47 -20
- package/node_modules/@playdrop/types/dist/owned-assets.js +55 -33
- package/node_modules/@playdrop/types/dist/player-meta.js +151 -100
- package/node_modules/@playdrop/types/dist/realtime.js +27 -7
- package/node_modules/@playdrop/types/dist/version.js +182 -124
- package/node_modules/@playdrop/types/package.json +1 -1
- package/package.json +1 -1
|
@@ -1,86 +1,104 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
})
|
|
45
|
-
.catch(error => {
|
|
46
|
-
this.onerror?.(error);
|
|
47
|
-
this.onloadend?.({ target: { result: null } });
|
|
48
|
-
});
|
|
49
|
-
}
|
|
50
|
-
abort() {
|
|
51
|
-
this.onabort?.(new Error('filereader_abort_not_supported'));
|
|
52
|
-
}
|
|
2
|
+
var __create = Object.create;
|
|
3
|
+
var __defProp = Object.defineProperty;
|
|
4
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
5
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
6
|
+
var __getProtoOf = Object.getPrototypeOf;
|
|
7
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
8
|
+
var __copyProps = (to, from, except, desc) => {
|
|
9
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
10
|
+
for (let key of __getOwnPropNames(from))
|
|
11
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
12
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
13
|
+
}
|
|
14
|
+
return to;
|
|
15
|
+
};
|
|
16
|
+
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
|
|
17
|
+
// If the importer is in node compatibility mode or this is not an ESM
|
|
18
|
+
// file that has been converted to a CommonJS file using a Babel-
|
|
19
|
+
// compatible transform (i.e. "__esModule" has not been set), then set
|
|
20
|
+
// "default" to the CommonJS "module.exports" for node compatibility.
|
|
21
|
+
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
|
|
22
|
+
mod
|
|
23
|
+
));
|
|
24
|
+
var import_node_test = __toESM(require("node:test"));
|
|
25
|
+
var import_strict = __toESM(require("node:assert/strict"));
|
|
26
|
+
var THREE = __toESM(require("three"));
|
|
27
|
+
var import_node_path = __toESM(require("node:path"));
|
|
28
|
+
var import_node_url = require("node:url");
|
|
29
|
+
var import_promises = require("node:fs/promises");
|
|
30
|
+
var import_boxel_core = require("@playdrop/boxel-core");
|
|
31
|
+
var import_GLTFExporter = require("three/examples/jsm/exporters/GLTFExporter.js");
|
|
32
|
+
var import_glb = require("../src/exporters/glb.js");
|
|
33
|
+
const import_meta = {};
|
|
34
|
+
const HERE = import_node_path.default.dirname((0, import_node_url.fileURLToPath)(import_meta.url));
|
|
35
|
+
const fixture = (...segments) => import_node_path.default.resolve(HERE, "./fixtures", ...segments);
|
|
36
|
+
if (typeof globalThis.FileReader === "undefined") {
|
|
37
|
+
class NodeFileReader {
|
|
38
|
+
constructor() {
|
|
39
|
+
this.onload = null;
|
|
40
|
+
this.onloadend = null;
|
|
41
|
+
this.onerror = null;
|
|
42
|
+
this.onabort = null;
|
|
43
|
+
this.result = null;
|
|
53
44
|
}
|
|
54
|
-
|
|
45
|
+
readAsDataURL(blob) {
|
|
46
|
+
blob.arrayBuffer().then((buffer) => {
|
|
47
|
+
const mime = blob.type || "application/octet-stream";
|
|
48
|
+
const base64 = Buffer.from(buffer).toString("base64");
|
|
49
|
+
this.result = `data:${mime};base64,${base64}`;
|
|
50
|
+
const event = { target: { result: this.result } };
|
|
51
|
+
this.onload?.(event);
|
|
52
|
+
this.onloadend?.(event);
|
|
53
|
+
}).catch((error) => {
|
|
54
|
+
this.onerror?.(error);
|
|
55
|
+
this.onloadend?.({ target: { result: null } });
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
readAsArrayBuffer(blob) {
|
|
59
|
+
blob.arrayBuffer().then((buffer) => {
|
|
60
|
+
this.result = buffer;
|
|
61
|
+
const event = { target: { result: this.result } };
|
|
62
|
+
this.onload?.(event);
|
|
63
|
+
this.onloadend?.(event);
|
|
64
|
+
}).catch((error) => {
|
|
65
|
+
this.onerror?.(error);
|
|
66
|
+
this.onloadend?.({ target: { result: null } });
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
abort() {
|
|
70
|
+
this.onabort?.(new Error("filereader_abort_not_supported"));
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
globalThis.FileReader = NodeFileReader;
|
|
55
74
|
}
|
|
56
75
|
async function loadEntity(relativePath) {
|
|
57
|
-
|
|
58
|
-
|
|
76
|
+
const raw = await (0, import_promises.readFile)(fixture(relativePath), "utf-8");
|
|
77
|
+
return (0, import_boxel_core.parseBoxel)(JSON.parse(raw));
|
|
59
78
|
}
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
}
|
|
79
|
+
(0, import_node_test.default)("createBoxelSceneGraph skinned mode exposes skinned mesh and bones", async () => {
|
|
80
|
+
const entity = await loadEntity("entity-connect.json");
|
|
81
|
+
const graph = (0, import_glb.createBoxelSceneGraph)({ THREE, model: entity, mode: "skinned" });
|
|
82
|
+
try {
|
|
83
|
+
import_strict.default.ok(graph.root instanceof THREE.Object3D, "root should be Object3D");
|
|
84
|
+
const skinnedMesh = graph.root.children.find((child) => child instanceof THREE.SkinnedMesh);
|
|
85
|
+
import_strict.default.ok(skinnedMesh, "skinned mesh missing from scene graph");
|
|
86
|
+
const boneIds = Array.from(graph.nodeLookup.keys());
|
|
87
|
+
import_strict.default.ok(boneIds.length > 0, "expected bones in lookup");
|
|
88
|
+
import_strict.default.ok(boneIds.some((id) => id.toLowerCase().includes("chest")), "expected Chest bone in lookup");
|
|
89
|
+
import_strict.default.ok(graph.animations.every((entry) => entry.clip instanceof THREE.AnimationClip), "clips missing");
|
|
90
|
+
} finally {
|
|
91
|
+
graph.dispose();
|
|
92
|
+
}
|
|
75
93
|
});
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
94
|
+
(0, import_node_test.default)("exportModelToGLB supports skinned mode", async () => {
|
|
95
|
+
const entity = await loadEntity("entity-connect.json");
|
|
96
|
+
const blob = await (0, import_glb.exportModelToGLB)({
|
|
97
|
+
THREE,
|
|
98
|
+
GLTFExporterCtor: import_GLTFExporter.GLTFExporter,
|
|
99
|
+
model: entity,
|
|
100
|
+
mode: "skinned"
|
|
101
|
+
});
|
|
102
|
+
const buffer = Buffer.from(await blob.arrayBuffer());
|
|
103
|
+
import_strict.default.ok(buffer.length > 0, "skinned export should produce non-empty binary");
|
|
86
104
|
});
|
|
@@ -1,8 +1,30 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
1
|
+
var __create = Object.create;
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __getProtoOf = Object.getPrototypeOf;
|
|
6
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
7
|
+
var __copyProps = (to, from, except, desc) => {
|
|
8
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
9
|
+
for (let key of __getOwnPropNames(from))
|
|
10
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
11
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
12
|
+
}
|
|
13
|
+
return to;
|
|
14
|
+
};
|
|
15
|
+
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
|
|
16
|
+
// If the importer is in node compatibility mode or this is not an ESM
|
|
17
|
+
// file that has been converted to a CommonJS file using a Babel-
|
|
18
|
+
// compatible transform (i.e. "__esModule" has not been set), then set
|
|
19
|
+
// "default" to the CommonJS "module.exports" for node compatibility.
|
|
20
|
+
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
|
|
21
|
+
mod
|
|
22
|
+
));
|
|
23
|
+
var import_node_test = __toESM(require("node:test"));
|
|
24
|
+
var import_strict = __toESM(require("node:assert/strict"));
|
|
25
|
+
var import_src = require("../src/index.js");
|
|
26
|
+
(0, import_node_test.default)("boxel-three exposes renderer entry points", () => {
|
|
27
|
+
import_strict.default.equal(typeof import_src.createBoxelScene, "function");
|
|
28
|
+
import_strict.default.equal(typeof import_src.createBoxelNodeScene, "function");
|
|
29
|
+
import_strict.default.equal(typeof import_src.attachBoxelOverlays, "function");
|
|
8
30
|
});
|
|
@@ -1,68 +1,88 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
2
|
+
var __create = Object.create;
|
|
3
|
+
var __defProp = Object.defineProperty;
|
|
4
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
5
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
6
|
+
var __getProtoOf = Object.getPrototypeOf;
|
|
7
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
8
|
+
var __copyProps = (to, from, except, desc) => {
|
|
9
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
10
|
+
for (let key of __getOwnPropNames(from))
|
|
11
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
12
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
13
|
+
}
|
|
14
|
+
return to;
|
|
15
|
+
};
|
|
16
|
+
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
|
|
17
|
+
// If the importer is in node compatibility mode or this is not an ESM
|
|
18
|
+
// file that has been converted to a CommonJS file using a Babel-
|
|
19
|
+
// compatible transform (i.e. "__esModule" has not been set), then set
|
|
20
|
+
// "default" to the CommonJS "module.exports" for node compatibility.
|
|
21
|
+
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
|
|
22
|
+
mod
|
|
23
|
+
));
|
|
24
|
+
var import_node_test = __toESM(require("node:test"));
|
|
25
|
+
var import_strict = __toESM(require("node:assert/strict"));
|
|
26
|
+
var THREE = __toESM(require("three"));
|
|
27
|
+
var import_node_path = __toESM(require("node:path"));
|
|
28
|
+
var import_node_url = require("node:url");
|
|
29
|
+
var import_promises = require("node:fs/promises");
|
|
30
|
+
var import_boxel_core = require("@playdrop/boxel-core");
|
|
31
|
+
var import_instantiate = require("../src/instantiate.js");
|
|
32
|
+
const import_meta = {};
|
|
33
|
+
const HERE = import_node_path.default.dirname((0, import_node_url.fileURLToPath)(import_meta.url));
|
|
34
|
+
const fixture = (...segments) => import_node_path.default.resolve(HERE, "./fixtures", ...segments);
|
|
12
35
|
async function loadEntity(relativePath) {
|
|
13
|
-
|
|
14
|
-
|
|
36
|
+
const raw = await (0, import_promises.readFile)(fixture(relativePath), "utf-8");
|
|
37
|
+
return (0, import_boxel_core.parseBoxel)(JSON.parse(raw));
|
|
15
38
|
}
|
|
16
39
|
function dispose(result) {
|
|
17
|
-
|
|
40
|
+
result.dispose();
|
|
18
41
|
}
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
}
|
|
42
|
+
(0, import_node_test.default)("instantiateEntityObject3D hierarchy mode exposes group and node helpers", async () => {
|
|
43
|
+
const entity = await loadEntity("entity-connect.json");
|
|
44
|
+
const result = (0, import_instantiate.instantiateEntityObject3D)({ THREE, entity, mode: "hierarchy" });
|
|
45
|
+
try {
|
|
46
|
+
import_strict.default.equal(result.mode, "hierarchy");
|
|
47
|
+
import_strict.default.ok(result.object instanceof THREE.Group, "hierarchy returns group");
|
|
48
|
+
import_strict.default.ok(result.scene.root === result.object, "group matches scene root");
|
|
49
|
+
import_strict.default.ok(typeof result.findNode === "function", "findNode helper available");
|
|
50
|
+
import_strict.default.ok(result.findNode(entity.geometry.root.id), "root node resolves");
|
|
51
|
+
let counted = 0;
|
|
52
|
+
result.forEachNode(() => {
|
|
53
|
+
counted += 1;
|
|
54
|
+
});
|
|
55
|
+
import_strict.default.equal(counted > 0, true, "forEachNode iterates nodes");
|
|
56
|
+
import_strict.default.ok(Array.isArray(result.clips), "clips array present");
|
|
57
|
+
} finally {
|
|
58
|
+
dispose(result);
|
|
59
|
+
}
|
|
38
60
|
});
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
}
|
|
61
|
+
(0, import_node_test.default)("instantiateEntityObject3D merged mode returns a reusable group", async () => {
|
|
62
|
+
const entity = await loadEntity("entity-connect.json");
|
|
63
|
+
const result = (0, import_instantiate.instantiateEntityObject3D)({ THREE, entity, mode: "merged" });
|
|
64
|
+
try {
|
|
65
|
+
import_strict.default.equal(result.mode, "merged");
|
|
66
|
+
import_strict.default.ok(result.object instanceof THREE.Object3D, "merged returns object3D");
|
|
67
|
+
} finally {
|
|
68
|
+
dispose(result);
|
|
69
|
+
}
|
|
49
70
|
});
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
}
|
|
71
|
+
(0, import_node_test.default)("instantiateEntityObject3D skinned mode returns skinned mesh and bone helpers", async () => {
|
|
72
|
+
const entity = await loadEntity("entity-connect.json");
|
|
73
|
+
const result = (0, import_instantiate.instantiateEntityObject3D)({ THREE, entity, mode: "skinned" });
|
|
74
|
+
try {
|
|
75
|
+
import_strict.default.equal(result.mode, "skinned");
|
|
76
|
+
import_strict.default.ok(result.object instanceof THREE.SkinnedMesh, "skinned returns SkinnedMesh");
|
|
77
|
+
import_strict.default.ok(result.skeleton instanceof THREE.Skeleton, "skeleton available");
|
|
78
|
+
import_strict.default.ok(result.findBone(entity.geometry.root.id), "findBone resolves root");
|
|
79
|
+
let boneCount = 0;
|
|
80
|
+
result.forEachBone(() => {
|
|
81
|
+
boneCount += 1;
|
|
82
|
+
});
|
|
83
|
+
import_strict.default.equal(boneCount > 0, true, "forEachBone iterates bones");
|
|
84
|
+
import_strict.default.ok(Array.isArray(result.clips), "clips array present");
|
|
85
|
+
} finally {
|
|
86
|
+
dispose(result);
|
|
87
|
+
}
|
|
68
88
|
});
|
|
@@ -1,20 +1,42 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
1
|
+
var __create = Object.create;
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __getProtoOf = Object.getPrototypeOf;
|
|
6
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
7
|
+
var __copyProps = (to, from, except, desc) => {
|
|
8
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
9
|
+
for (let key of __getOwnPropNames(from))
|
|
10
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
11
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
12
|
+
}
|
|
13
|
+
return to;
|
|
14
|
+
};
|
|
15
|
+
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
|
|
16
|
+
// If the importer is in node compatibility mode or this is not an ESM
|
|
17
|
+
// file that has been converted to a CommonJS file using a Babel-
|
|
18
|
+
// compatible transform (i.e. "__esModule" has not been set), then set
|
|
19
|
+
// "default" to the CommonJS "module.exports" for node compatibility.
|
|
20
|
+
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
|
|
21
|
+
mod
|
|
22
|
+
));
|
|
23
|
+
var import_node_test = __toESM(require("node:test"));
|
|
24
|
+
var import_strict = __toESM(require("node:assert/strict"));
|
|
25
|
+
var THREE = __toESM(require("three"));
|
|
26
|
+
var import_src = require("../src/index.js");
|
|
27
|
+
(0, import_node_test.default)("attachBoxelOverlays adds helpers and disposes cleanly", () => {
|
|
28
|
+
const THREERef = THREE;
|
|
29
|
+
const target = new THREERef.Object3D();
|
|
30
|
+
target.userData.size = [1, 2, 3];
|
|
31
|
+
target.userData.sockets = [
|
|
32
|
+
[0.5, 1, 0],
|
|
33
|
+
[-0.5, 0, 0]
|
|
34
|
+
];
|
|
35
|
+
const handles = (0, import_src.attachBoxelOverlays)({ THREE: THREERef, target }, { origin: true, bounds: true, sockets: true, color: 16711935, opacity: 0.5 });
|
|
36
|
+
import_strict.default.ok(handles.origin, "origin helper not attached");
|
|
37
|
+
import_strict.default.ok(handles.bounds && handles.bounds.length === 1, "bounds helper missing");
|
|
38
|
+
import_strict.default.ok(handles.sockets && handles.sockets.length === 2, "socket helpers missing");
|
|
39
|
+
import_strict.default.strictEqual(target.children.includes(handles.origin), true);
|
|
40
|
+
handles.dispose();
|
|
41
|
+
import_strict.default.strictEqual(target.children.length, 0, "helpers should be removed after dispose");
|
|
20
42
|
});
|
|
@@ -1,51 +1,73 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
1
|
+
var __create = Object.create;
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __getProtoOf = Object.getPrototypeOf;
|
|
6
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
7
|
+
var __copyProps = (to, from, except, desc) => {
|
|
8
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
9
|
+
for (let key of __getOwnPropNames(from))
|
|
10
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
11
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
12
|
+
}
|
|
13
|
+
return to;
|
|
14
|
+
};
|
|
15
|
+
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
|
|
16
|
+
// If the importer is in node compatibility mode or this is not an ESM
|
|
17
|
+
// file that has been converted to a CommonJS file using a Babel-
|
|
18
|
+
// compatible transform (i.e. "__esModule" has not been set), then set
|
|
19
|
+
// "default" to the CommonJS "module.exports" for node compatibility.
|
|
20
|
+
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
|
|
21
|
+
mod
|
|
22
|
+
));
|
|
23
|
+
var import_node_test = __toESM(require("node:test"));
|
|
24
|
+
var import_strict = __toESM(require("node:assert/strict"));
|
|
25
|
+
var THREE = __toESM(require("three"));
|
|
26
|
+
var import_src = require("../src/index.js");
|
|
27
|
+
(0, import_node_test.default)("createBoxelScene respects node filters and exposes reusable clips", () => {
|
|
28
|
+
const entity = {
|
|
29
|
+
id: "filter-test",
|
|
30
|
+
geometry: {
|
|
31
|
+
id: "geom",
|
|
32
|
+
root: {
|
|
33
|
+
id: "Root",
|
|
34
|
+
position: [0, 0, 0],
|
|
35
|
+
children: [
|
|
36
|
+
{
|
|
37
|
+
id: "Arm",
|
|
38
|
+
position: [2, 0, 0],
|
|
39
|
+
mesh: "arm",
|
|
40
|
+
children: []
|
|
41
|
+
},
|
|
42
|
+
{
|
|
43
|
+
id: "Leg",
|
|
44
|
+
position: [-2, 0, 0],
|
|
45
|
+
mesh: "leg",
|
|
46
|
+
children: []
|
|
47
|
+
}
|
|
48
|
+
]
|
|
49
|
+
}
|
|
50
|
+
},
|
|
51
|
+
primitives: [
|
|
52
|
+
{ id: "arm", kind: "plain_box", size: [1, 1, 1], material: "mat" },
|
|
53
|
+
{ id: "leg", kind: "plain_box", size: [1, 1, 1], material: "mat" }
|
|
54
|
+
],
|
|
55
|
+
materials: [{ id: "mat", baseColor: [255, 100, 100] }],
|
|
56
|
+
textures: [],
|
|
57
|
+
patterns: [],
|
|
58
|
+
animations: []
|
|
59
|
+
};
|
|
60
|
+
const full = (0, import_src.createBoxelScene)({ THREE, entity });
|
|
61
|
+
import_strict.default.ok(full.nodes.has("Arm"));
|
|
62
|
+
import_strict.default.ok(full.nodes.has("Leg"));
|
|
63
|
+
const filtered = (0, import_src.createBoxelScene)({ THREE, entity }, { nodes: "Arm" });
|
|
64
|
+
import_strict.default.strictEqual(filtered.root.children.length, 1, "filtered scene should include one limb");
|
|
65
|
+
import_strict.default.ok(filtered.nodes.has("Arm"));
|
|
66
|
+
import_strict.default.ok(!filtered.nodes.has("Leg"));
|
|
67
|
+
const nodeScene = (0, import_src.createBoxelNodeScene)({ THREE, entity }, "Leg");
|
|
68
|
+
import_strict.default.strictEqual(nodeScene.nodes.size, 1, "node scene should only contain requested limb");
|
|
69
|
+
import_strict.default.ok(nodeScene.nodes.has("Leg"));
|
|
70
|
+
full.dispose();
|
|
71
|
+
filtered.dispose();
|
|
72
|
+
nodeScene.dispose();
|
|
51
73
|
});
|