@playdrop/playdrop-cli 0.5.1 → 0.5.2

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.
Files changed (64) hide show
  1. package/config/client-meta.json +5 -5
  2. package/dist/apps/upload.js +6 -0
  3. package/dist/clientInfo.js +19 -3
  4. package/dist/commands/captureRemote.js +33 -0
  5. package/dist/commands/generation.d.ts +2 -0
  6. package/dist/commands/generation.js +1 -0
  7. package/node_modules/@playdrop/ai-client/package.json +1 -1
  8. package/node_modules/@playdrop/api-client/package.json +1 -1
  9. package/node_modules/@playdrop/boxel-core/dist/test/entity-utils.test.d.ts +1 -0
  10. package/node_modules/@playdrop/boxel-core/dist/test/entity-utils.test.js +92 -0
  11. package/node_modules/@playdrop/boxel-core/dist/test/entity-utils.test.js.map +1 -0
  12. package/node_modules/@playdrop/boxel-core/dist/test/greedy-mesher.test.d.ts +1 -0
  13. package/node_modules/@playdrop/boxel-core/dist/test/greedy-mesher.test.js +48 -0
  14. package/node_modules/@playdrop/boxel-core/dist/test/greedy-mesher.test.js.map +1 -0
  15. package/node_modules/@playdrop/boxel-core/dist/test/humanoid/humanoid-builders.test.d.ts +1 -0
  16. package/node_modules/@playdrop/boxel-core/dist/test/humanoid/humanoid-builders.test.js +270 -0
  17. package/node_modules/@playdrop/boxel-core/dist/test/humanoid/humanoid-builders.test.js.map +1 -0
  18. package/node_modules/@playdrop/boxel-core/dist/test/index.test.d.ts +1 -0
  19. package/node_modules/@playdrop/boxel-core/dist/test/index.test.js +48 -0
  20. package/node_modules/@playdrop/boxel-core/dist/test/index.test.js.map +1 -0
  21. package/node_modules/@playdrop/boxel-core/dist/test/layer-mode.test.d.ts +1 -0
  22. package/node_modules/@playdrop/boxel-core/dist/test/layer-mode.test.js +67 -0
  23. package/node_modules/@playdrop/boxel-core/dist/test/layer-mode.test.js.map +1 -0
  24. package/node_modules/@playdrop/boxel-core/dist/test/materials.test.d.ts +1 -0
  25. package/node_modules/@playdrop/boxel-core/dist/test/materials.test.js +55 -0
  26. package/node_modules/@playdrop/boxel-core/dist/test/materials.test.js.map +1 -0
  27. package/node_modules/@playdrop/boxel-core/dist/test/palette-tools.test.d.ts +1 -0
  28. package/node_modules/@playdrop/boxel-core/dist/test/palette-tools.test.js +124 -0
  29. package/node_modules/@playdrop/boxel-core/dist/test/palette-tools.test.js.map +1 -0
  30. package/node_modules/@playdrop/boxel-core/dist/test/serialization.test.d.ts +1 -0
  31. package/node_modules/@playdrop/boxel-core/dist/test/serialization.test.js +35 -0
  32. package/node_modules/@playdrop/boxel-core/dist/test/serialization.test.js.map +1 -0
  33. package/node_modules/@playdrop/boxel-core/dist/test/textures.test.d.ts +1 -0
  34. package/node_modules/@playdrop/boxel-core/dist/test/textures.test.js +120 -0
  35. package/node_modules/@playdrop/boxel-core/dist/test/textures.test.js.map +1 -0
  36. package/node_modules/@playdrop/boxel-core/dist/test/types.test.d.ts +1 -0
  37. package/node_modules/@playdrop/boxel-core/dist/test/types.test.js +32 -0
  38. package/node_modules/@playdrop/boxel-core/dist/test/types.test.js.map +1 -0
  39. package/node_modules/@playdrop/boxel-core/dist/test/upscale.test.d.ts +1 -0
  40. package/node_modules/@playdrop/boxel-core/dist/test/upscale.test.js +100 -0
  41. package/node_modules/@playdrop/boxel-core/dist/test/upscale.test.js.map +1 -0
  42. package/node_modules/@playdrop/boxel-core/dist/test/validation.test.d.ts +1 -0
  43. package/node_modules/@playdrop/boxel-core/dist/test/validation.test.js +61 -0
  44. package/node_modules/@playdrop/boxel-core/dist/test/validation.test.js.map +1 -0
  45. package/node_modules/@playdrop/boxel-core/dist/test/voxels.test.d.ts +1 -0
  46. package/node_modules/@playdrop/boxel-core/dist/test/voxels.test.js +51 -0
  47. package/node_modules/@playdrop/boxel-core/dist/test/voxels.test.js.map +1 -0
  48. package/node_modules/@playdrop/boxel-core/package.json +1 -1
  49. package/node_modules/@playdrop/boxel-three/package.json +1 -1
  50. package/node_modules/@playdrop/config/client-meta.json +5 -5
  51. package/node_modules/@playdrop/config/dist/src/creator-docs.d.ts +24 -0
  52. package/node_modules/@playdrop/config/dist/src/creator-docs.d.ts.map +1 -0
  53. package/node_modules/@playdrop/config/dist/src/creator-docs.js +253 -0
  54. package/node_modules/@playdrop/config/dist/src/creator-faq.d.ts +17 -0
  55. package/node_modules/@playdrop/config/dist/src/creator-faq.d.ts.map +1 -0
  56. package/node_modules/@playdrop/config/dist/src/creator-faq.js +141 -0
  57. package/node_modules/@playdrop/config/dist/test/creator-docs.test.d.ts +2 -0
  58. package/node_modules/@playdrop/config/dist/test/creator-docs.test.d.ts.map +1 -0
  59. package/node_modules/@playdrop/config/dist/test/creator-docs.test.js +36 -0
  60. package/node_modules/@playdrop/config/dist/tsconfig.tsbuildinfo +1 -1
  61. package/node_modules/@playdrop/config/package.json +1 -1
  62. package/node_modules/@playdrop/types/package.json +1 -1
  63. package/node_modules/@playdrop/vox-three/package.json +1 -1
  64. package/package.json +1 -1
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "version": "0.5.1",
3
- "build": 2,
3
+ "build": 1,
4
4
  "platforms": {
5
5
  "ios": {
6
6
  "minimumVersion": "16.0"
@@ -26,12 +26,12 @@
26
26
  },
27
27
  "clients": {
28
28
  "web": {
29
- "minimumVersion": "0.5.0",
30
- "minimumBuild": 2
29
+ "minimumVersion": "0.5.1",
30
+ "minimumBuild": 1
31
31
  },
32
32
  "admin": {
33
- "minimumVersion": "0.5.0",
34
- "minimumBuild": 2
33
+ "minimumVersion": "0.5.1",
34
+ "minimumBuild": 1
35
35
  },
36
36
  "apple": {
37
37
  "minimumVersion": "0.3.10",
@@ -151,6 +151,12 @@ async function uploadAppVersion(client, task, artifacts, options) {
151
151
  }
152
152
  if (unknownError instanceof types_1.ApiError) {
153
153
  const detail = unknownError.message?.trim();
154
+ if (unknownError.code === 'version_limit_reached') {
155
+ const appRef = `${creatorUsername}/app/${task.name}`;
156
+ throw new Error(`${detail || `App "${task.name}" has reached the maximum version count.`}\n`
157
+ + `Review versions: playdrop versions browse ${appRef}\n`
158
+ + `Delete one old version: playdrop creations apps versions delete ${task.name} <version>`);
159
+ }
154
160
  // Handle duplicate version error with helpful message
155
161
  if (unknownError.status === 409) {
156
162
  throw new Error(`Version ${task.version} already exists for app "${task.name}".\n` +
@@ -9,7 +9,23 @@ exports.getCliVersion = getCliVersion;
9
9
  exports.getCliBuild = getCliBuild;
10
10
  exports.getRuntimeInfo = getRuntimeInfo;
11
11
  const os_1 = __importDefault(require("os"));
12
+ const path_1 = __importDefault(require("path"));
13
+ const fs_1 = require("fs");
12
14
  const config_1 = require("@playdrop/config");
15
+ let cachedCliPackageVersion = null;
16
+ function readCliPackageVersion() {
17
+ if (cachedCliPackageVersion) {
18
+ return cachedCliPackageVersion;
19
+ }
20
+ const packageJsonPath = path_1.default.resolve(__dirname, '..', 'package.json');
21
+ const packageJson = JSON.parse((0, fs_1.readFileSync)(packageJsonPath, 'utf8'));
22
+ const version = typeof packageJson.version === 'string' ? packageJson.version.trim() : '';
23
+ if (!/^\d+\.\d+\.\d+$/.test(version)) {
24
+ throw new Error(`invalid_cli_package_version:${version}`);
25
+ }
26
+ cachedCliPackageVersion = version;
27
+ return version;
28
+ }
13
29
  function mapPlatform(platform) {
14
30
  switch (platform) {
15
31
  case 'aix':
@@ -42,7 +58,7 @@ function detectPlatformVersion() {
42
58
  function buildRuntimeInfo() {
43
59
  return {
44
60
  client: 'cli',
45
- clientVersion: (0, config_1.getClientVersion)(),
61
+ clientVersion: readCliPackageVersion(),
46
62
  clientBuild: (0, config_1.getClientBuild)(),
47
63
  platform: mapPlatform(os_1.default.platform()),
48
64
  platformVersion: detectPlatformVersion()
@@ -52,10 +68,10 @@ function createClientHeaders() {
52
68
  return (0, config_1.createClientHeaderRecord)(buildRuntimeInfo());
53
69
  }
54
70
  function getCliVersionLabel() {
55
- return (0, config_1.getClientVersionLabel)();
71
+ return `${readCliPackageVersion()} (build ${(0, config_1.getClientBuild)()})`;
56
72
  }
57
73
  function getCliVersion() {
58
- return (0, config_1.getClientVersion)();
74
+ return readCliPackageVersion();
59
75
  }
60
76
  function getCliBuild() {
61
77
  return (0, config_1.getClientBuild)();
@@ -9,6 +9,29 @@ const http_1 = require("../http");
9
9
  const messages_1 = require("../messages");
10
10
  const devShared_1 = require("./devShared");
11
11
  const captureRuntime_1 = require("../captureRuntime");
12
+ function readUnsupportedPlaydropCaptureMessage(targetUrl) {
13
+ let parsed;
14
+ try {
15
+ parsed = new URL(targetUrl);
16
+ }
17
+ catch {
18
+ return null;
19
+ }
20
+ const hostname = parsed.hostname.toLowerCase();
21
+ const isPlaydropHost = hostname === 'www.playdrop.ai'
22
+ || hostname === 'playdrop.ai'
23
+ || hostname === 'localhost'
24
+ || hostname === '127.0.0.1';
25
+ if (!isPlaydropHost) {
26
+ return null;
27
+ }
28
+ const pathname = parsed.pathname.replace(/\/+$/, '') || '/';
29
+ const matchesCreatorAppRoute = /^\/(?:_auth\/)?creators\/[^/]+\/apps\/[^/]+\/[^/]+(?:\/.*)?$/i.test(pathname);
30
+ if (!matchesCreatorAppRoute || pathname.endsWith('/play')) {
31
+ return null;
32
+ }
33
+ return `Only Playdrop /play URLs are supported for remote capture. Use ${parsed.origin}${pathname}/play instead.`;
34
+ }
12
35
  function parseTimeout(raw) {
13
36
  if (raw === undefined) {
14
37
  return 10;
@@ -70,6 +93,10 @@ function parseOptions(url, options = {}) {
70
93
  if (expectedUrl) {
71
94
  assertValidUrl(expectedUrl, 'invalid_expected_url');
72
95
  }
96
+ const unsupportedPlaydropCaptureMessage = readUnsupportedPlaydropCaptureMessage(trimmedUrl);
97
+ if (unsupportedPlaydropCaptureMessage) {
98
+ throw new Error(`unsupported_playdrop_capture_target:${unsupportedPlaydropCaptureMessage}`);
99
+ }
73
100
  const { username, password } = parseCredentialPair(options);
74
101
  return {
75
102
  targetUrl: trimmedUrl,
@@ -92,6 +119,12 @@ async function captureRemote(url, options = {}) {
92
119
  parsed = parseOptions(url, options);
93
120
  }
94
121
  catch (error) {
122
+ if (error instanceof Error && error.message.startsWith('unsupported_playdrop_capture_target:')) {
123
+ const detail = error.message.slice('unsupported_playdrop_capture_target:'.length).trim();
124
+ (0, messages_1.printErrorWithHelp)(detail, [], { command: 'project capture remote' });
125
+ process.exitCode = 1;
126
+ return;
127
+ }
95
128
  if (error instanceof Error && error.message === 'invalid_expected_url') {
96
129
  (0, messages_1.printErrorWithHelp)('The --expected-url value must be a valid URL.', [], { command: 'project capture remote' });
97
130
  process.exitCode = 1;
@@ -1,3 +1,4 @@
1
+ import type { ImageAttachment } from '@playdrop/ai-client';
1
2
  type AiGenerateOptions = {
2
3
  subcategory?: string;
3
4
  assetName?: string;
@@ -28,6 +29,7 @@ type AiListOptions = {
28
29
  offset?: string | number;
29
30
  format?: string;
30
31
  };
32
+ export declare function resolveImageAttachment(value: string | undefined, optionName: 'image1' | 'image2'): ImageAttachment | undefined;
31
33
  export declare function generate(typeInput: string, promptInput: string, options?: AiGenerateOptions): Promise<void>;
32
34
  type AiJobBrowseOptions = {
33
35
  type?: string;
@@ -1,5 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.resolveImageAttachment = resolveImageAttachment;
3
4
  exports.generate = generate;
4
5
  exports.browseGenerationJobs = browseGenerationJobs;
5
6
  exports.showGenerationJob = showGenerationJob;
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@playdrop/ai-client",
3
- "version": "0.5.0",
3
+ "version": "0.5.1",
4
4
  "description": "Client SDK for the Playdrop AI server",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@playdrop/api-client",
3
- "version": "0.5.0",
3
+ "version": "0.5.1",
4
4
  "description": "TypeScript HTTP client for Playdrop platform API",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -0,0 +1,92 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const strict_1 = __importDefault(require("node:assert/strict"));
7
+ const node_test_1 = __importDefault(require("node:test"));
8
+ const src_1 = require("../src");
9
+ (0, node_test_1.default)('collectPrimitiveDependencies resolves dependent ids', () => {
10
+ const entity = {
11
+ id: 'deps',
12
+ geometry: {
13
+ id: 'geo',
14
+ root: { id: 'root', position: [0, 0, 0], children: [] },
15
+ },
16
+ patterns: [{ id: 'pat', size: [1, 1], data: [0] }],
17
+ materials: [{ id: 'mat', baseColor: [0, 0, 0] }],
18
+ textures: [{ id: 'tex', pattern: 'pat', materials: ['mat'] }],
19
+ primitives: [
20
+ { id: 'plain', kind: 'plain_box', size: [1, 1, 1], material: 'mat' },
21
+ { id: 'textured', kind: 'textured_box', size: [1, 1, 1], north: 'tex' },
22
+ ],
23
+ animations: [],
24
+ };
25
+ const deps = (0, src_1.collectPrimitiveDependencies)(entity, 'textured');
26
+ strict_1.default.deepEqual(new Set(deps.primitives), new Set(['textured']));
27
+ strict_1.default.deepEqual(new Set(deps.textures), new Set(['tex']));
28
+ strict_1.default.deepEqual(new Set(deps.patterns), new Set(['pat']));
29
+ strict_1.default.deepEqual(new Set(deps.materials), new Set(['mat']));
30
+ });
31
+ (0, node_test_1.default)('collectPrimitiveUsage discovers nodes and combo slots', () => {
32
+ const combo = {
33
+ id: 'combo',
34
+ kind: 'combo_box',
35
+ size: [1, 1, 1],
36
+ slots: [{ id: 'slot', primitive: 'plain', offset: [0, 0, 0] }],
37
+ };
38
+ const entity = {
39
+ id: 'usage',
40
+ geometry: {
41
+ id: 'geo',
42
+ root: {
43
+ id: 'root',
44
+ position: [0, 0, 0],
45
+ children: [{ id: 'child', position: [0, 0, 0], mesh: 'plain', children: [] }],
46
+ },
47
+ },
48
+ patterns: [],
49
+ materials: [{ id: 'mat', baseColor: [0, 0, 0] }],
50
+ textures: [],
51
+ primitives: [
52
+ { id: 'plain', kind: 'plain_box', size: [1, 1, 1], material: 'mat' },
53
+ combo,
54
+ ],
55
+ animations: [],
56
+ };
57
+ const usage = (0, src_1.collectPrimitiveUsage)(entity, 'plain');
58
+ strict_1.default.deepEqual(usage.nodeIds, ['child']);
59
+ strict_1.default.deepEqual(usage.comboIds, ['combo']);
60
+ });
61
+ (0, node_test_1.default)('applyMaterialRewrite utilities update material references', () => {
62
+ const plain = { id: 'plain', kind: 'plain_box', size: [1, 1, 1], material: 'old' };
63
+ const rewrittenPlain = (0, src_1.applyMaterialRewriteToPrimitive)(plain, id => (id === 'old' ? 'new' : id));
64
+ strict_1.default.equal(rewrittenPlain.material, 'new');
65
+ const texture = { id: 'tex', pattern: 'pat', materials: ['old'] };
66
+ const rewrittenTexture = (0, src_1.applyMaterialRewriteToTexture)(texture, id => (id === 'old' ? 'new' : id));
67
+ strict_1.default.deepEqual(rewrittenTexture.materials, ['new']);
68
+ });
69
+ (0, node_test_1.default)('ensureNoIdCollisions throws when duplicate ids exist', () => {
70
+ strict_1.default.throws(() => (0, src_1.ensureNoIdCollisions)([{ id: 'a' }], new Set(['a']), 'test'), /test/);
71
+ });
72
+ (0, node_test_1.default)('selectByIdOrder filters and shallow copies items', () => {
73
+ const results = (0, src_1.selectByIdOrder)([{ id: 'a', value: 1 }, { id: 'b', value: 2 }], new Set(['b']));
74
+ strict_1.default.deepEqual(results, [{ id: 'b', value: 2 }]);
75
+ strict_1.default.notEqual(results[0], { id: 'b', value: 2 });
76
+ });
77
+ (0, node_test_1.default)('cloneEntity produces deep copy', () => {
78
+ const entity = {
79
+ id: 'clone',
80
+ geometry: { id: 'geo', root: { id: 'root', position: [0, 0, 0], children: [] } },
81
+ patterns: [],
82
+ materials: [],
83
+ textures: [],
84
+ primitives: [],
85
+ animations: [],
86
+ };
87
+ const copy = (0, src_1.cloneEntity)(entity);
88
+ strict_1.default.notEqual(copy, entity);
89
+ copy.geometry.root.id = 'changed';
90
+ strict_1.default.equal(entity.geometry.root.id, 'root');
91
+ });
92
+ //# sourceMappingURL=entity-utils.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"entity-utils.test.js","sourceRoot":"","sources":["../../test/entity-utils.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,48 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const strict_1 = __importDefault(require("node:assert/strict"));
7
+ const node_test_1 = __importDefault(require("node:test"));
8
+ const src_1 = require("../src");
9
+ const material = 1;
10
+ (0, node_test_1.default)('generateGreedyQuads collapses contiguous voxels into single quads per face', () => {
11
+ const dimensions = [2, 1, 1];
12
+ const voxels = [material, material];
13
+ const quads = (0, src_1.generateGreedyQuads)(voxels, dimensions);
14
+ strict_1.default.equal(quads.length, 6);
15
+ const axisCounts = new Map();
16
+ quads.forEach(quad => {
17
+ axisCounts.set(quad.axis, (axisCounts.get(quad.axis) ?? 0) + 1);
18
+ });
19
+ strict_1.default.equal(axisCounts.get(0), 2);
20
+ strict_1.default.equal(axisCounts.get(1), 2);
21
+ strict_1.default.equal(axisCounts.get(2), 2);
22
+ const posZ = quads.find(quad => quad.axis === 2 && quad.normal === 1);
23
+ strict_1.default.deepEqual(posZ?.size, [2, 1]);
24
+ strict_1.default.equal(posZ?.plane, 1);
25
+ const negX = quads.find(quad => quad.axis === 0 && quad.normal === -1);
26
+ strict_1.default.deepEqual(negX?.plane, 0);
27
+ });
28
+ (0, node_test_1.default)('generateGreedyQuads keeps seams between differing materials', () => {
29
+ const dimensions = [2, 1, 1];
30
+ const voxels = [1, 2];
31
+ const quads = (0, src_1.generateGreedyQuads)(voxels, dimensions);
32
+ strict_1.default.equal(quads.length, 12);
33
+ const sharedPlane = quads.filter(quad => quad.axis === 0 && quad.plane === 1);
34
+ strict_1.default.equal(sharedPlane.length, 2);
35
+ strict_1.default.equal(new Set(sharedPlane.map(quad => quad.material)).size, 2);
36
+ });
37
+ (0, node_test_1.default)('generateQuadsForVoxelBox normalizes voxel dimensions', () => {
38
+ const primitive = {
39
+ id: 'voxel',
40
+ kind: 'voxel_box',
41
+ size: [1.2, 1.6, 1],
42
+ palette: ['mat'],
43
+ voxels: [1, 1],
44
+ };
45
+ const quads = (0, src_1.generateQuadsForVoxelBox)(primitive);
46
+ strict_1.default.equal(quads.length, 6);
47
+ });
48
+ //# sourceMappingURL=greedy-mesher.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"greedy-mesher.test.js","sourceRoot":"","sources":["../../test/greedy-mesher.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,270 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const node_test_1 = __importDefault(require("node:test"));
7
+ const strict_1 = __importDefault(require("node:assert/strict"));
8
+ const pngjs_1 = require("pngjs");
9
+ const src_1 = require("../../src");
10
+ const HUMANOID_GEOMETRY = {
11
+ texturewidth: 64,
12
+ textureheight: 64,
13
+ bones: [
14
+ {
15
+ name: 'body',
16
+ pivot: [0, 12, 0],
17
+ cubes: [{ origin: [-4, 0, -2], size: [8, 12, 4], uv: [16, 16] }],
18
+ },
19
+ {
20
+ name: 'head',
21
+ pivot: [0, 24, 0],
22
+ cubes: [{ origin: [-4, 24, -4], size: [8, 8, 8], uv: [0, 0] }],
23
+ },
24
+ {
25
+ name: 'leftarm',
26
+ pivot: [5, 22, 0],
27
+ cubes: [{ origin: [4, 12, -2], size: [4, 12, 4], uv: [32, 48] }],
28
+ },
29
+ {
30
+ name: 'rightarm',
31
+ pivot: [-5, 22, 0],
32
+ cubes: [{ origin: [-8, 12, -2], size: [4, 12, 4], uv: [40, 16] }],
33
+ },
34
+ {
35
+ name: 'leftleg',
36
+ pivot: [1.9, 12, 0],
37
+ cubes: [{ origin: [0, 0, -2], size: [4, 12, 4], uv: [16, 48] }],
38
+ },
39
+ {
40
+ name: 'rightleg',
41
+ pivot: [-1.9, 12, 0],
42
+ cubes: [{ origin: [-4, 0, -2], size: [4, 12, 4], uv: [0, 16] }],
43
+ },
44
+ {
45
+ name: 'hat',
46
+ pivot: [0, 24, 0],
47
+ cubes: [{ origin: [-4, 24, -4], size: [8, 8, 8], uv: [32, 0], inflate: 0.5 }],
48
+ },
49
+ {
50
+ name: 'leftsleeve',
51
+ pivot: [5, 22, 0],
52
+ cubes: [{ origin: [4, 12, -2], size: [4, 12, 4], uv: [48, 48], inflate: 0.25 }],
53
+ },
54
+ {
55
+ name: 'rightsleeve',
56
+ pivot: [-5, 22, 0],
57
+ cubes: [{ origin: [-8, 12, -2], size: [4, 12, 4], uv: [40, 32], inflate: 0.25 }],
58
+ },
59
+ {
60
+ name: 'leftpants',
61
+ pivot: [1.9, 12, 0],
62
+ cubes: [{ origin: [0, 0, -2], size: [4, 12, 4], uv: [0, 48], inflate: 0.25 }],
63
+ },
64
+ {
65
+ name: 'rightpants',
66
+ pivot: [-1.9, 12, 0],
67
+ cubes: [{ origin: [-4, 0, -2], size: [4, 12, 4], uv: [32, 16], inflate: 0.25 }],
68
+ },
69
+ {
70
+ name: 'torso_outer',
71
+ pivot: [0, 12, 0],
72
+ cubes: [{ origin: [-4, 0, -2], size: [8, 12, 4], uv: [16, 32], inflate: 0.25 }],
73
+ },
74
+ ],
75
+ };
76
+ const OVERSIZED_HEAD_GEOMETRY = {
77
+ texturewidth: 64,
78
+ textureheight: 64,
79
+ bones: [
80
+ {
81
+ name: 'body',
82
+ pivot: [0, 12, 0],
83
+ cubes: [{ origin: [-4, 0, -2], size: [8, 12, 4], uv: [16, 16] }],
84
+ },
85
+ {
86
+ name: 'head',
87
+ pivot: [0, 24, 0],
88
+ cubes: [{ origin: [-5, 24, -4], size: [10, 8, 8], uv: [0, 0] }],
89
+ },
90
+ {
91
+ name: 'leftarm',
92
+ pivot: [5, 22, 0],
93
+ cubes: [{ origin: [4, 12, -2], size: [4, 12, 4], uv: [32, 48] }],
94
+ },
95
+ {
96
+ name: 'rightarm',
97
+ pivot: [-5, 22, 0],
98
+ cubes: [{ origin: [-8, 12, -2], size: [4, 12, 4], uv: [40, 16] }],
99
+ },
100
+ {
101
+ name: 'leftleg',
102
+ pivot: [1.9, 12, 0],
103
+ cubes: [{ origin: [0, 0, -2], size: [4, 12, 4], uv: [16, 48] }],
104
+ },
105
+ {
106
+ name: 'rightleg',
107
+ pivot: [-1.9, 12, 0],
108
+ cubes: [{ origin: [-4, 0, -2], size: [4, 12, 4], uv: [0, 16] }],
109
+ },
110
+ ],
111
+ };
112
+ function createTestSkin() {
113
+ const width = 64;
114
+ const height = 64;
115
+ const png = new pngjs_1.PNG({ width, height });
116
+ const data = png.data;
117
+ const setPixel = (x, y, rgba) => {
118
+ const idx = (y * width + x) << 2;
119
+ data[idx] = rgba[0];
120
+ data[idx + 1] = rgba[1];
121
+ data[idx + 2] = rgba[2];
122
+ data[idx + 3] = rgba[3];
123
+ };
124
+ for (let y = 0; y < height; y += 1) {
125
+ for (let x = 0; x < width; x += 1) {
126
+ if (y < 8) {
127
+ setPixel(x, y, [198, 134, 66, 255]);
128
+ }
129
+ else if (y < 16) {
130
+ setPixel(x, y, [160, 101, 53, 255]);
131
+ }
132
+ else if (y < 32) {
133
+ setPixel(x, y, [58, 142, 186, 255]);
134
+ }
135
+ else if (y < 48) {
136
+ setPixel(x, y, [97, 56, 24, 255]);
137
+ }
138
+ else {
139
+ setPixel(x, y, [58, 71, 166, 255]);
140
+ }
141
+ }
142
+ }
143
+ return { width, height, pixels: new Uint8Array(data) };
144
+ }
145
+ (0, node_test_1.default)('buildHumanoidR6Entity produces textured primitives for test skin', () => {
146
+ const { width, height, pixels } = createTestSkin();
147
+ const source = (0, src_1.scanHumanoidSource)({
148
+ geometryId: 'test.humanoid',
149
+ geometry: HUMANOID_GEOMETRY,
150
+ textureWidth: width,
151
+ textureHeight: height,
152
+ texturePixels: pixels,
153
+ });
154
+ const template = (0, src_1.getHumanoidTemplate)(src_1.HUMANOID_R6_TEMPLATE_ID);
155
+ const entity = (0, src_1.buildHumanoidR6Entity)({
156
+ template,
157
+ source,
158
+ geometryId: 'test.humanoid',
159
+ outputId: 'steve_core_test',
160
+ textureWidth: width,
161
+ textureHeight: height,
162
+ texturePixels: pixels,
163
+ });
164
+ const primitivesById = new Map(entity.primitives.map(primitive => [primitive.id, primitive]));
165
+ const torso = primitivesById.get('torso_primitive');
166
+ const armLeft = primitivesById.get('arm_left_primitive');
167
+ const armRight = primitivesById.get('arm_right_primitive');
168
+ strict_1.default.ok(torso, 'torso primitive missing');
169
+ strict_1.default.ok(armLeft, 'arm_left primitive missing');
170
+ strict_1.default.ok(armRight, 'arm_right primitive missing');
171
+ strict_1.default.deepEqual(torso.size, [8, 12, 4]);
172
+ strict_1.default.ok(entity.patterns.length > 0, 'expected patterns to be generated');
173
+ strict_1.default.ok(entity.textures.length > 0, 'expected textures to be generated');
174
+ });
175
+ (0, node_test_1.default)('humanoid R6 entity converts to voxel and textured R15 variants', () => {
176
+ const { width, height, pixels } = createTestSkin();
177
+ const sourceScan = (0, src_1.scanHumanoidSource)({
178
+ geometryId: 'test.humanoid',
179
+ geometry: HUMANOID_GEOMETRY,
180
+ textureWidth: width,
181
+ textureHeight: height,
182
+ texturePixels: pixels,
183
+ });
184
+ const r6Template = (0, src_1.getHumanoidTemplate)(src_1.HUMANOID_R6_TEMPLATE_ID);
185
+ const baseR6Entity = (0, src_1.buildHumanoidR6Entity)({
186
+ template: r6Template,
187
+ source: sourceScan,
188
+ geometryId: 'test.humanoid',
189
+ outputId: 'steve_r6',
190
+ textureWidth: width,
191
+ textureHeight: height,
192
+ texturePixels: pixels,
193
+ });
194
+ const r6HdEntity = (0, src_1.upscaleEntity)(baseR6Entity, 2);
195
+ const r6VoxelEntity = (0, src_1.applyLayerMode)(r6HdEntity, 'voxel');
196
+ const r15Template = (0, src_1.getHumanoidTemplate)(src_1.HUMANOID_R15_TEMPLATE_ID);
197
+ const voxelR15 = (0, src_1.buildHumanoidR15Entity)({
198
+ template: r15Template,
199
+ source: r6VoxelEntity,
200
+ outputId: 'steve_r15_voxel',
201
+ });
202
+ const voxelPrimitives = new Map(voxelR15.primitives.map(primitive => [primitive.id, primitive]));
203
+ const expectedVoxelIds = [
204
+ 'Head_voxel',
205
+ 'Chest_voxel',
206
+ 'Hip_voxel',
207
+ 'Left_Arm_voxel',
208
+ 'Left_Forearm_voxel',
209
+ 'Left_Hand_voxel',
210
+ 'Right_Arm_voxel',
211
+ 'Right_Forearm_voxel',
212
+ 'Right_Hand_voxel',
213
+ 'Left_Thigh_voxel',
214
+ 'Left_Leg_voxel',
215
+ 'Left_Foot_voxel',
216
+ 'Right_Thigh_voxel',
217
+ 'Right_Leg_voxel',
218
+ 'Right_Foot_voxel',
219
+ ];
220
+ expectedVoxelIds.forEach(id => {
221
+ const primitive = voxelPrimitives.get(id);
222
+ strict_1.default.ok(primitive, `voxel primitive ${id} missing`);
223
+ strict_1.default.equal(primitive.kind, 'voxel_box');
224
+ });
225
+ strict_1.default.equal(voxelPrimitives.size, expectedVoxelIds.length, 'unexpected voxel primitive count for R15 conversion');
226
+ strict_1.default.ok(voxelR15.materials.length > 0, 'expected voxel materials to be cloned');
227
+ });
228
+ (0, node_test_1.default)('oversized head geometry preserves dimensions through R6 and R15 builders', () => {
229
+ const { width, height, pixels } = createTestSkin();
230
+ const sourceScan = (0, src_1.scanHumanoidSource)({
231
+ geometryId: 'geometry.piglin_like',
232
+ geometry: OVERSIZED_HEAD_GEOMETRY,
233
+ textureWidth: width,
234
+ textureHeight: height,
235
+ texturePixels: pixels,
236
+ });
237
+ const r6Template = (0, src_1.getHumanoidTemplate)(src_1.HUMANOID_R6_TEMPLATE_ID);
238
+ const r6Entity = (0, src_1.buildHumanoidR6Entity)({
239
+ template: r6Template,
240
+ source: sourceScan,
241
+ geometryId: 'geometry.piglin_like',
242
+ outputId: 'oversized_r6',
243
+ textureWidth: width,
244
+ textureHeight: height,
245
+ texturePixels: pixels,
246
+ });
247
+ const r6Head = r6Entity.primitives.find(primitive => primitive.id === 'head_primitive');
248
+ strict_1.default.ok(r6Head, 'oversized head primitive missing on R6 entity');
249
+ strict_1.default.deepEqual(r6Head.size, [10, 8, 8], 'R6 head size should match oversized geometry');
250
+ const r6Hd = (0, src_1.upscaleEntity)(r6Entity, 2);
251
+ const voxelSource = (0, src_1.applyLayerMode)(r6Hd, 'voxel');
252
+ const r15Template = (0, src_1.getHumanoidTemplate)(src_1.HUMANOID_R15_TEMPLATE_ID);
253
+ const r15Voxel = (0, src_1.buildHumanoidR15Entity)({
254
+ template: r15Template,
255
+ source: voxelSource,
256
+ outputId: 'oversized_r15_voxel',
257
+ });
258
+ const headVoxel = r15Voxel.primitives.find(primitive => primitive.id === 'Head_voxel');
259
+ strict_1.default.ok(headVoxel, 'Head_voxel missing for oversized geometry');
260
+ strict_1.default.deepEqual(headVoxel.size, [20, 16, 16], 'R15 voxel head size should reflect HD upscale of oversized head');
261
+ const texturedSource = (0, src_1.buildHumanoidR15TexturedEntity)({
262
+ template: r15Template,
263
+ source: (0, src_1.applyLayerMode)(r6Hd, 'overlay'),
264
+ outputId: 'oversized_r15_textured',
265
+ });
266
+ const headTextured = texturedSource.primitives.find(primitive => primitive.id === 'Head_textured');
267
+ strict_1.default.ok(headTextured, 'Head_textured missing for oversized geometry');
268
+ strict_1.default.deepEqual(headTextured.size, [20, 16, 16], 'R15 textured head size should match voxel head size');
269
+ });
270
+ //# sourceMappingURL=humanoid-builders.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"humanoid-builders.test.js","sourceRoot":"","sources":["../../../test/humanoid/humanoid-builders.test.ts"],"names":[],"mappings":"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"}