@playdrop/playdrop-cli 0.3.8-build.1 → 0.3.8-build.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.
- package/dist/catalogue.js +13 -0
- package/node_modules/@playdrop/vox-three/dist/src/index.d.ts +1 -0
- package/node_modules/@playdrop/vox-three/dist/src/index.js +18 -0
- package/node_modules/@playdrop/vox-three/dist/src/index.js.map +1 -0
- package/node_modules/@playdrop/vox-three/dist/src/vox.d.ts +25 -0
- package/node_modules/@playdrop/vox-three/dist/src/vox.js +425 -0
- package/node_modules/@playdrop/vox-three/dist/src/vox.js.map +1 -0
- package/node_modules/@playdrop/vox-three/dist/test/vox.test.d.ts +1 -0
- package/node_modules/@playdrop/vox-three/dist/test/vox.test.js +79 -0
- package/node_modules/@playdrop/vox-three/dist/test/vox.test.js.map +1 -0
- package/node_modules/@playdrop/vox-three/package.json +25 -0
- package/package.json +2 -1
package/dist/catalogue.js
CHANGED
|
@@ -157,6 +157,13 @@ function normalizeCatalogueRelations(value, errors, context) {
|
|
|
157
157
|
}
|
|
158
158
|
return rows.length > 0 ? rows : undefined;
|
|
159
159
|
}
|
|
160
|
+
function rejectLegacyShopPriceCoinsField(value, errors, context) {
|
|
161
|
+
if (Object.prototype.hasOwnProperty.call(value, 'shopPriceCoins')) {
|
|
162
|
+
errors.push(`${context} uses legacy shopPriceCoins. Rename it to shopPriceCredits.`);
|
|
163
|
+
return true;
|
|
164
|
+
}
|
|
165
|
+
return false;
|
|
166
|
+
}
|
|
160
167
|
function normalizeRelativePath(root, target) {
|
|
161
168
|
const rel = (0, node_path_1.relative)(root, target).split(node_path_1.sep).join('/');
|
|
162
169
|
return rel.replace(/^\/+/, '');
|
|
@@ -918,6 +925,9 @@ function buildAppTasks(rootDir, catalogues, options) {
|
|
|
918
925
|
continue;
|
|
919
926
|
}
|
|
920
927
|
}
|
|
928
|
+
if (rejectLegacyShopPriceCoinsField(embedded, errors, `[${label}] Embedded asset "${embeddedName}"`)) {
|
|
929
|
+
continue;
|
|
930
|
+
}
|
|
921
931
|
embeddedAssets.push({
|
|
922
932
|
kind: 'embedded-asset',
|
|
923
933
|
appName: rawName,
|
|
@@ -1084,6 +1094,9 @@ function buildAssetTasks(catalogues) {
|
|
|
1084
1094
|
const username = typeof entry.username === 'string' && entry.username.trim().length > 0
|
|
1085
1095
|
? entry.username.trim()
|
|
1086
1096
|
: undefined;
|
|
1097
|
+
if (rejectLegacyShopPriceCoinsField(entry, errors, `[${label}] Asset "${name}"`)) {
|
|
1098
|
+
continue;
|
|
1099
|
+
}
|
|
1087
1100
|
tasks.push({
|
|
1088
1101
|
kind: 'asset',
|
|
1089
1102
|
name,
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './vox.js';
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
__exportStar(require("./vox.js"), exports);
|
|
18
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,2CAAyB"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type * as THREEType from 'three';
|
|
2
|
+
import type { BoxelDefinition } from '@playdrop/boxel-core';
|
|
3
|
+
export type VoxChunk = {
|
|
4
|
+
palette: number[];
|
|
5
|
+
size: {
|
|
6
|
+
x: number;
|
|
7
|
+
y: number;
|
|
8
|
+
z: number;
|
|
9
|
+
};
|
|
10
|
+
data: Uint8Array;
|
|
11
|
+
};
|
|
12
|
+
export interface RenderVoxImageOptions {
|
|
13
|
+
THREE: typeof THREEType;
|
|
14
|
+
renderer: THREEType.WebGLRenderer;
|
|
15
|
+
input: ArrayBuffer | ArrayBufferView;
|
|
16
|
+
width?: number;
|
|
17
|
+
height?: number;
|
|
18
|
+
}
|
|
19
|
+
export declare function assertValidVoxBuffer(input: ArrayBuffer | ArrayBufferView): ArrayBuffer;
|
|
20
|
+
export declare function parseVoxChunks(input: ArrayBuffer | ArrayBufferView): Promise<VoxChunk[]>;
|
|
21
|
+
export declare function convertVoxChunksToBoxel(chunks: VoxChunk[], id?: string): BoxelDefinition;
|
|
22
|
+
export declare function convertVoxToBoxel(input: ArrayBuffer | ArrayBufferView, id?: string): Promise<BoxelDefinition>;
|
|
23
|
+
export declare function buildVoxGroupFromChunks(chunks: VoxChunk[], three: typeof THREEType): THREEType.Group;
|
|
24
|
+
export declare function buildVoxGroup(input: ArrayBuffer | ArrayBufferView, three?: typeof THREEType): Promise<THREEType.Group<THREEType.Object3DEventMap>>;
|
|
25
|
+
export declare function renderVoxToDataURL(options: RenderVoxImageOptions): Promise<string>;
|
|
@@ -0,0 +1,425 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.assertValidVoxBuffer = assertValidVoxBuffer;
|
|
37
|
+
exports.parseVoxChunks = parseVoxChunks;
|
|
38
|
+
exports.convertVoxChunksToBoxel = convertVoxChunksToBoxel;
|
|
39
|
+
exports.convertVoxToBoxel = convertVoxToBoxel;
|
|
40
|
+
exports.buildVoxGroupFromChunks = buildVoxGroupFromChunks;
|
|
41
|
+
exports.buildVoxGroup = buildVoxGroup;
|
|
42
|
+
exports.renderVoxToDataURL = renderVoxToDataURL;
|
|
43
|
+
const PREVIEW_TARGET_HEIGHT = 1.8;
|
|
44
|
+
const PREVIEW_MODEL_LIFT = 0.05;
|
|
45
|
+
const PREVIEW_AMBIENT_LIGHT_COLOR = 0xb4c6fc;
|
|
46
|
+
const PREVIEW_AMBIENT_LIGHT_INTENSITY = 0.55;
|
|
47
|
+
const PREVIEW_DIRECTIONAL_LIGHT_COLOR = 0xf8fafc;
|
|
48
|
+
const PREVIEW_DIRECTIONAL_LIGHT_INTENSITY = 0.9;
|
|
49
|
+
const PREVIEW_DIRECTIONAL_LIGHT_MIN_HEIGHT = 1.6;
|
|
50
|
+
const PREVIEW_BACKGROUND_COLOR = 0x111827;
|
|
51
|
+
const PREVIEW_FLOOR_COLOR_1 = 0x1c7c3c;
|
|
52
|
+
const PREVIEW_FLOOR_COLOR_2 = 0x14532d;
|
|
53
|
+
const PREVIEW_GROUND_SIZE = 20;
|
|
54
|
+
const PREVIEW_TILE_SIZE = 1;
|
|
55
|
+
const PREVIEW_CAMERA_DIRECTION = [-0.65, 0.6, 1];
|
|
56
|
+
const PREVIEW_CAMERA_MIN_DISTANCE = 1.8;
|
|
57
|
+
const PREVIEW_CAMERA_MIN_TARGET_Y = 0.2;
|
|
58
|
+
const PREVIEW_SHADOW_MAP_SIZE = 2048;
|
|
59
|
+
const PREVIEW_FOG_NEAR = 8;
|
|
60
|
+
const PREVIEW_FOG_FAR = 35;
|
|
61
|
+
function toArrayBuffer(input) {
|
|
62
|
+
if (input instanceof ArrayBuffer) {
|
|
63
|
+
return input;
|
|
64
|
+
}
|
|
65
|
+
const view = input;
|
|
66
|
+
const copy = new Uint8Array(view.byteLength);
|
|
67
|
+
copy.set(new Uint8Array(view.buffer, view.byteOffset, view.byteLength));
|
|
68
|
+
return copy.buffer;
|
|
69
|
+
}
|
|
70
|
+
function assertValidVoxBuffer(input) {
|
|
71
|
+
const buffer = toArrayBuffer(input);
|
|
72
|
+
if (buffer.byteLength < 8) {
|
|
73
|
+
throw new Error('vox_buffer_too_small');
|
|
74
|
+
}
|
|
75
|
+
const view = new DataView(buffer);
|
|
76
|
+
const magic = String.fromCharCode(view.getUint8(0), view.getUint8(1), view.getUint8(2), view.getUint8(3));
|
|
77
|
+
if (magic !== 'VOX ') {
|
|
78
|
+
throw new Error('vox_header_invalid');
|
|
79
|
+
}
|
|
80
|
+
const version = view.getUint32(4, true);
|
|
81
|
+
if (version !== 150) {
|
|
82
|
+
throw new Error(`vox_version_unsupported:${version}`);
|
|
83
|
+
}
|
|
84
|
+
return buffer;
|
|
85
|
+
}
|
|
86
|
+
async function loadVoxLoaderModule() {
|
|
87
|
+
return Promise.resolve().then(() => __importStar(require('three/examples/jsm/loaders/VOXLoader.js')));
|
|
88
|
+
}
|
|
89
|
+
async function parseVoxChunks(input) {
|
|
90
|
+
const buffer = assertValidVoxBuffer(input);
|
|
91
|
+
const loaderModule = await loadVoxLoaderModule();
|
|
92
|
+
const loader = new loaderModule.VOXLoader();
|
|
93
|
+
const chunks = loader.parse(buffer);
|
|
94
|
+
if (!Array.isArray(chunks) || chunks.length === 0) {
|
|
95
|
+
throw new Error('vox_chunks_missing');
|
|
96
|
+
}
|
|
97
|
+
return chunks;
|
|
98
|
+
}
|
|
99
|
+
function paletteHexToMaterial(hex, id) {
|
|
100
|
+
const red = hex & 0xff;
|
|
101
|
+
const green = (hex >> 8) & 0xff;
|
|
102
|
+
const blue = (hex >> 16) & 0xff;
|
|
103
|
+
const alpha = (hex >> 24) & 0xff;
|
|
104
|
+
const material = {
|
|
105
|
+
id,
|
|
106
|
+
baseColor: [red, green, blue],
|
|
107
|
+
};
|
|
108
|
+
if (alpha >= 0 && alpha < 255) {
|
|
109
|
+
material.opacity = Number((alpha / 255).toFixed(4));
|
|
110
|
+
}
|
|
111
|
+
return material;
|
|
112
|
+
}
|
|
113
|
+
function buildPrimitiveFromChunk(chunk, index, materialsByHex, materials) {
|
|
114
|
+
const size = [chunk.size.x, chunk.size.y, chunk.size.z];
|
|
115
|
+
const total = size[0] * size[1] * size[2];
|
|
116
|
+
const voxels = new Array(total).fill(0);
|
|
117
|
+
const paletteColorIndices = new Set();
|
|
118
|
+
for (let offset = 0; offset < chunk.data.length; offset += 4) {
|
|
119
|
+
paletteColorIndices.add(chunk.data[offset + 3] ?? 0);
|
|
120
|
+
}
|
|
121
|
+
const sortedColorIndices = Array.from(paletteColorIndices).filter(value => value > 0).sort((left, right) => left - right);
|
|
122
|
+
const paletteLookup = new Map();
|
|
123
|
+
const palette = [];
|
|
124
|
+
sortedColorIndices.forEach((colorIndex, paletteIndex) => {
|
|
125
|
+
const hex = chunk.palette[colorIndex] ?? 0xffffffff;
|
|
126
|
+
let materialId = materialsByHex.get(hex);
|
|
127
|
+
if (!materialId) {
|
|
128
|
+
materialId = `vox_material_${hex.toString(16).padStart(8, '0')}`;
|
|
129
|
+
materialsByHex.set(hex, materialId);
|
|
130
|
+
materials.push(paletteHexToMaterial(hex, materialId));
|
|
131
|
+
}
|
|
132
|
+
palette.push(materialId);
|
|
133
|
+
paletteLookup.set(colorIndex, paletteIndex);
|
|
134
|
+
});
|
|
135
|
+
for (let offset = 0; offset < chunk.data.length; offset += 4) {
|
|
136
|
+
const x = chunk.data[offset] ?? 0;
|
|
137
|
+
const y = chunk.data[offset + 1] ?? 0;
|
|
138
|
+
const z = chunk.data[offset + 2] ?? 0;
|
|
139
|
+
const colorIndex = chunk.data[offset + 3] ?? 0;
|
|
140
|
+
const paletteIndex = paletteLookup.get(colorIndex);
|
|
141
|
+
if (paletteIndex === undefined) {
|
|
142
|
+
continue;
|
|
143
|
+
}
|
|
144
|
+
const voxelIndex = x + y * size[0] + z * size[0] * size[1];
|
|
145
|
+
voxels[voxelIndex] = paletteIndex + 1;
|
|
146
|
+
}
|
|
147
|
+
const primitiveId = `vox_primitive_${index + 1}`;
|
|
148
|
+
return {
|
|
149
|
+
primitive: {
|
|
150
|
+
id: primitiveId,
|
|
151
|
+
kind: 'voxel_box',
|
|
152
|
+
size,
|
|
153
|
+
voxels,
|
|
154
|
+
palette,
|
|
155
|
+
},
|
|
156
|
+
node: {
|
|
157
|
+
id: `vox_node_${index + 1}`,
|
|
158
|
+
position: [0, 0, 0],
|
|
159
|
+
size,
|
|
160
|
+
mesh: primitiveId,
|
|
161
|
+
children: [],
|
|
162
|
+
},
|
|
163
|
+
};
|
|
164
|
+
}
|
|
165
|
+
function convertVoxChunksToBoxel(chunks, id = 'vox_boxel') {
|
|
166
|
+
if (!Array.isArray(chunks) || chunks.length === 0) {
|
|
167
|
+
throw new Error('vox_chunks_required');
|
|
168
|
+
}
|
|
169
|
+
const materials = [];
|
|
170
|
+
const materialsByHex = new Map();
|
|
171
|
+
const primitives = [];
|
|
172
|
+
const nodes = [];
|
|
173
|
+
chunks.forEach((chunk, index) => {
|
|
174
|
+
const { primitive, node } = buildPrimitiveFromChunk(chunk, index, materialsByHex, materials);
|
|
175
|
+
primitives.push(primitive);
|
|
176
|
+
nodes.push(node);
|
|
177
|
+
});
|
|
178
|
+
const rootNode = nodes.length === 1
|
|
179
|
+
? {
|
|
180
|
+
...nodes[0],
|
|
181
|
+
id: `${id}_root`,
|
|
182
|
+
}
|
|
183
|
+
: {
|
|
184
|
+
id: `${id}_root`,
|
|
185
|
+
position: [0, 0, 0],
|
|
186
|
+
children: nodes,
|
|
187
|
+
};
|
|
188
|
+
return {
|
|
189
|
+
id,
|
|
190
|
+
geometry: {
|
|
191
|
+
id: `${id}_geometry`,
|
|
192
|
+
root: rootNode,
|
|
193
|
+
},
|
|
194
|
+
patterns: [],
|
|
195
|
+
materials,
|
|
196
|
+
textures: [],
|
|
197
|
+
primitives,
|
|
198
|
+
animations: [],
|
|
199
|
+
};
|
|
200
|
+
}
|
|
201
|
+
async function convertVoxToBoxel(input, id) {
|
|
202
|
+
const chunks = await parseVoxChunks(input);
|
|
203
|
+
return convertVoxChunksToBoxel(chunks, id);
|
|
204
|
+
}
|
|
205
|
+
const FACE_NEGATIVE_X = [0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 1, 1, 0, 1, 0, 0, 0, 1];
|
|
206
|
+
const FACE_POSITIVE_X = [1, 0, 0, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0];
|
|
207
|
+
const FACE_POSITIVE_Y = [0, 0, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1];
|
|
208
|
+
const FACE_NEGATIVE_Y = [0, 0, 0, 0, 1, 0, 1, 0, 0, 1, 1, 0, 1, 0, 0, 0, 1, 0];
|
|
209
|
+
const FACE_NEGATIVE_Z = [0, 0, 1, 0, 0, 0, 1, 0, 1, 1, 0, 0, 1, 0, 1, 0, 0, 0];
|
|
210
|
+
const FACE_POSITIVE_Z = [0, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 0, 0, 1, 0, 1, 1, 1];
|
|
211
|
+
function pushFace(three, vertices, colors, tile, chunk, x, y, z, red, green, blue) {
|
|
212
|
+
const color = new three.Color();
|
|
213
|
+
const srgbColorSpace = three.SRGBColorSpace;
|
|
214
|
+
const translatedX = x - chunk.size.x / 2;
|
|
215
|
+
const translatedY = y - chunk.size.z / 2;
|
|
216
|
+
const translatedZ = z + chunk.size.y / 2;
|
|
217
|
+
if (srgbColorSpace) {
|
|
218
|
+
color.setRGB(red, green, blue, srgbColorSpace);
|
|
219
|
+
}
|
|
220
|
+
else {
|
|
221
|
+
color.setRGB(red, green, blue);
|
|
222
|
+
}
|
|
223
|
+
for (let index = 0; index < tile.length; index += 3) {
|
|
224
|
+
vertices.push(tile[index] + translatedX, tile[index + 1] + translatedY, tile[index + 2] + translatedZ);
|
|
225
|
+
colors.push(color.r, color.g, color.b);
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
function buildVoxMeshFromChunk(three, chunk) {
|
|
229
|
+
const vertices = [];
|
|
230
|
+
const colors = [];
|
|
231
|
+
const occupancy = new Uint8Array(chunk.size.x * chunk.size.y * chunk.size.z);
|
|
232
|
+
const offsetY = chunk.size.x;
|
|
233
|
+
const offsetZ = chunk.size.x * chunk.size.y;
|
|
234
|
+
for (let index = 0; index < chunk.data.length; index += 4) {
|
|
235
|
+
const x = chunk.data[index] ?? 0;
|
|
236
|
+
const y = chunk.data[index + 1] ?? 0;
|
|
237
|
+
const z = chunk.data[index + 2] ?? 0;
|
|
238
|
+
const voxelIndex = x + y * offsetY + z * offsetZ;
|
|
239
|
+
occupancy[voxelIndex] = 255;
|
|
240
|
+
}
|
|
241
|
+
let hasColors = false;
|
|
242
|
+
for (let index = 0; index < chunk.data.length; index += 4) {
|
|
243
|
+
const x = chunk.data[index] ?? 0;
|
|
244
|
+
const y = chunk.data[index + 1] ?? 0;
|
|
245
|
+
const z = chunk.data[index + 2] ?? 0;
|
|
246
|
+
const colorIndex = chunk.data[index + 3] ?? 0;
|
|
247
|
+
const hex = chunk.palette[colorIndex] ?? 0;
|
|
248
|
+
const red = (hex & 0xff) / 0xff;
|
|
249
|
+
const green = ((hex >> 8) & 0xff) / 0xff;
|
|
250
|
+
const blue = ((hex >> 16) & 0xff) / 0xff;
|
|
251
|
+
if (red > 0 || green > 0 || blue > 0) {
|
|
252
|
+
hasColors = true;
|
|
253
|
+
}
|
|
254
|
+
const voxelIndex = x + y * offsetY + z * offsetZ;
|
|
255
|
+
if (x === chunk.size.x - 1 || occupancy[voxelIndex + 1] === 0) {
|
|
256
|
+
pushFace(three, vertices, colors, FACE_POSITIVE_X, chunk, x, z, -y, red, green, blue);
|
|
257
|
+
}
|
|
258
|
+
if (x === 0 || occupancy[voxelIndex - 1] === 0) {
|
|
259
|
+
pushFace(three, vertices, colors, FACE_NEGATIVE_X, chunk, x, z, -y, red, green, blue);
|
|
260
|
+
}
|
|
261
|
+
if (y === chunk.size.y - 1 || occupancy[voxelIndex + offsetY] === 0) {
|
|
262
|
+
pushFace(three, vertices, colors, FACE_NEGATIVE_Y, chunk, x, z, -y, red, green, blue);
|
|
263
|
+
}
|
|
264
|
+
if (y === 0 || occupancy[voxelIndex - offsetY] === 0) {
|
|
265
|
+
pushFace(three, vertices, colors, FACE_POSITIVE_Y, chunk, x, z, -y, red, green, blue);
|
|
266
|
+
}
|
|
267
|
+
if (z === chunk.size.z - 1 || occupancy[voxelIndex + offsetZ] === 0) {
|
|
268
|
+
pushFace(three, vertices, colors, FACE_POSITIVE_Z, chunk, x, z, -y, red, green, blue);
|
|
269
|
+
}
|
|
270
|
+
if (z === 0 || occupancy[voxelIndex - offsetZ] === 0) {
|
|
271
|
+
pushFace(three, vertices, colors, FACE_NEGATIVE_Z, chunk, x, z, -y, red, green, blue);
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
const geometry = new three.BufferGeometry();
|
|
275
|
+
geometry.setAttribute('position', new three.Float32BufferAttribute(vertices, 3));
|
|
276
|
+
geometry.computeVertexNormals();
|
|
277
|
+
const material = new three.MeshStandardMaterial();
|
|
278
|
+
if (hasColors) {
|
|
279
|
+
geometry.setAttribute('color', new three.Float32BufferAttribute(colors, 3));
|
|
280
|
+
material.vertexColors = true;
|
|
281
|
+
}
|
|
282
|
+
return new three.Mesh(geometry, material);
|
|
283
|
+
}
|
|
284
|
+
function buildVoxGroupFromChunks(chunks, three) {
|
|
285
|
+
if (!Array.isArray(chunks) || chunks.length === 0) {
|
|
286
|
+
throw new Error('vox_chunks_required');
|
|
287
|
+
}
|
|
288
|
+
const group = new three.Group();
|
|
289
|
+
chunks.forEach((chunk) => {
|
|
290
|
+
group.add(buildVoxMeshFromChunk(three, chunk));
|
|
291
|
+
});
|
|
292
|
+
return group;
|
|
293
|
+
}
|
|
294
|
+
async function buildVoxGroup(input, three) {
|
|
295
|
+
const chunks = await parseVoxChunks(input);
|
|
296
|
+
const runtimeThree = three ?? (await Promise.resolve().then(() => __importStar(require('three'))));
|
|
297
|
+
return buildVoxGroupFromChunks(chunks, runtimeThree);
|
|
298
|
+
}
|
|
299
|
+
function setMeshShadowFlags(root) {
|
|
300
|
+
root.traverse((child) => {
|
|
301
|
+
const mesh = child;
|
|
302
|
+
if (mesh.isMesh) {
|
|
303
|
+
mesh.castShadow = true;
|
|
304
|
+
mesh.receiveShadow = true;
|
|
305
|
+
}
|
|
306
|
+
});
|
|
307
|
+
}
|
|
308
|
+
function disposeSceneObject(root) {
|
|
309
|
+
root.traverse((child) => {
|
|
310
|
+
const mesh = child;
|
|
311
|
+
mesh.geometry?.dispose?.();
|
|
312
|
+
if (Array.isArray(mesh.material)) {
|
|
313
|
+
mesh.material.forEach((material) => material.dispose?.());
|
|
314
|
+
}
|
|
315
|
+
else {
|
|
316
|
+
mesh.material?.dispose?.();
|
|
317
|
+
}
|
|
318
|
+
});
|
|
319
|
+
}
|
|
320
|
+
function createPreviewGround(three) {
|
|
321
|
+
const group = new three.Group();
|
|
322
|
+
const color1 = new three.Color(PREVIEW_FLOOR_COLOR_1);
|
|
323
|
+
const color2 = new three.Color(PREVIEW_FLOOR_COLOR_2);
|
|
324
|
+
for (let x = -PREVIEW_GROUND_SIZE / 2; x < PREVIEW_GROUND_SIZE / 2; x += 1) {
|
|
325
|
+
for (let z = -PREVIEW_GROUND_SIZE / 2; z < PREVIEW_GROUND_SIZE / 2; z += 1) {
|
|
326
|
+
const material = new three.MeshStandardMaterial({
|
|
327
|
+
color: (x + z) % 2 === 0 ? color1 : color2,
|
|
328
|
+
roughness: 0.9,
|
|
329
|
+
metalness: 0,
|
|
330
|
+
});
|
|
331
|
+
const tile = new three.Mesh(new three.PlaneGeometry(PREVIEW_TILE_SIZE, PREVIEW_TILE_SIZE), material);
|
|
332
|
+
tile.rotation.x = -Math.PI / 2;
|
|
333
|
+
tile.position.set((x + 0.5) * PREVIEW_TILE_SIZE, 0, (z + 0.5) * PREVIEW_TILE_SIZE);
|
|
334
|
+
tile.receiveShadow = true;
|
|
335
|
+
group.add(tile);
|
|
336
|
+
}
|
|
337
|
+
}
|
|
338
|
+
return group;
|
|
339
|
+
}
|
|
340
|
+
function normalizePreviewPlacement(three, root) {
|
|
341
|
+
const initialBounds = new three.Box3().setFromObject(root);
|
|
342
|
+
const initialSize = initialBounds.getSize(new three.Vector3());
|
|
343
|
+
if (!(initialSize.y > 0) || !Number.isFinite(initialSize.y)) {
|
|
344
|
+
throw new Error('vox_preview_invalid_bounds');
|
|
345
|
+
}
|
|
346
|
+
root.scale.setScalar(PREVIEW_TARGET_HEIGHT / initialSize.y);
|
|
347
|
+
root.updateMatrixWorld(true);
|
|
348
|
+
const scaledBounds = new three.Box3().setFromObject(root);
|
|
349
|
+
const scaledCenter = scaledBounds.getCenter(new three.Vector3());
|
|
350
|
+
const groundOffset = new three.Vector3(scaledCenter.x, scaledBounds.min.y, scaledCenter.z);
|
|
351
|
+
root.position.sub(groundOffset);
|
|
352
|
+
root.position.y += PREVIEW_MODEL_LIFT;
|
|
353
|
+
root.updateMatrixWorld(true);
|
|
354
|
+
return new three.Box3().setFromObject(root).getSize(new three.Vector3());
|
|
355
|
+
}
|
|
356
|
+
function framePreviewCamera(three, camera, directional, size) {
|
|
357
|
+
const maxDim = Math.max(size.x, size.y, size.z, 0.01);
|
|
358
|
+
const distance = Math.max(maxDim * 1.8 * 1.5, PREVIEW_CAMERA_MIN_DISTANCE * 1.5);
|
|
359
|
+
const direction = new three.Vector3().fromArray(PREVIEW_CAMERA_DIRECTION).normalize();
|
|
360
|
+
const position = direction.multiplyScalar(distance);
|
|
361
|
+
const targetY = Math.max(size.y * 0.5, PREVIEW_CAMERA_MIN_TARGET_Y);
|
|
362
|
+
camera.position.set(position.x, Math.max(position.y, PREVIEW_DIRECTIONAL_LIGHT_MIN_HEIGHT), position.z);
|
|
363
|
+
camera.lookAt(0, targetY, 0);
|
|
364
|
+
camera.near = Math.max(distance / 100, 0.05);
|
|
365
|
+
camera.far = Math.max(distance * 10, 50);
|
|
366
|
+
camera.updateProjectionMatrix();
|
|
367
|
+
directional.position.set(position.x, position.y, position.z);
|
|
368
|
+
directional.target.position.set(0, targetY, 0);
|
|
369
|
+
directional.target.updateMatrixWorld();
|
|
370
|
+
}
|
|
371
|
+
async function renderVoxToDataURL(options) {
|
|
372
|
+
const { THREE: three, renderer, input, width, height, } = options;
|
|
373
|
+
const sizeTarget = new three.Vector2();
|
|
374
|
+
renderer.getSize(sizeTarget);
|
|
375
|
+
const previousWidth = sizeTarget.x;
|
|
376
|
+
const previousHeight = sizeTarget.y;
|
|
377
|
+
const previousPixelRatio = renderer.getPixelRatio();
|
|
378
|
+
const previousShadowEnabled = renderer.shadowMap.enabled;
|
|
379
|
+
const previousShadowType = renderer.shadowMap.type;
|
|
380
|
+
const previousClearColor = renderer.getClearColor(new three.Color());
|
|
381
|
+
const previousClearAlpha = renderer.getClearAlpha();
|
|
382
|
+
const targetWidth = width ?? (previousWidth || 1024);
|
|
383
|
+
const targetHeight = height ?? (previousHeight || 1024);
|
|
384
|
+
renderer.setPixelRatio(1);
|
|
385
|
+
renderer.setSize(targetWidth, targetHeight, false);
|
|
386
|
+
renderer.shadowMap.enabled = true;
|
|
387
|
+
renderer.shadowMap.type = three.PCFSoftShadowMap;
|
|
388
|
+
renderer.setClearColor(new three.Color(PREVIEW_BACKGROUND_COLOR), 1);
|
|
389
|
+
const scene = new three.Scene();
|
|
390
|
+
scene.fog = new three.Fog(PREVIEW_BACKGROUND_COLOR, PREVIEW_FOG_NEAR, PREVIEW_FOG_FAR);
|
|
391
|
+
const ambient = new three.AmbientLight(PREVIEW_AMBIENT_LIGHT_COLOR, PREVIEW_AMBIENT_LIGHT_INTENSITY);
|
|
392
|
+
const directional = new three.DirectionalLight(PREVIEW_DIRECTIONAL_LIGHT_COLOR, PREVIEW_DIRECTIONAL_LIGHT_INTENSITY);
|
|
393
|
+
directional.castShadow = true;
|
|
394
|
+
directional.shadow.mapSize.set(PREVIEW_SHADOW_MAP_SIZE, PREVIEW_SHADOW_MAP_SIZE);
|
|
395
|
+
const ground = createPreviewGround(three);
|
|
396
|
+
const camera = new three.PerspectiveCamera(50, targetWidth / targetHeight, 0.1, 500);
|
|
397
|
+
const root = await buildVoxGroup(input, three);
|
|
398
|
+
setMeshShadowFlags(root);
|
|
399
|
+
const finalSize = normalizePreviewPlacement(three, root);
|
|
400
|
+
scene.add(ambient);
|
|
401
|
+
scene.add(directional);
|
|
402
|
+
scene.add(directional.target);
|
|
403
|
+
scene.add(ground);
|
|
404
|
+
scene.add(root);
|
|
405
|
+
framePreviewCamera(three, camera, directional, finalSize);
|
|
406
|
+
try {
|
|
407
|
+
renderer.render(scene, camera);
|
|
408
|
+
return renderer.domElement.toDataURL('image/png');
|
|
409
|
+
}
|
|
410
|
+
finally {
|
|
411
|
+
scene.remove(root);
|
|
412
|
+
scene.remove(ground);
|
|
413
|
+
scene.remove(directional.target);
|
|
414
|
+
scene.remove(directional);
|
|
415
|
+
scene.remove(ambient);
|
|
416
|
+
disposeSceneObject(root);
|
|
417
|
+
disposeSceneObject(ground);
|
|
418
|
+
renderer.setPixelRatio(previousPixelRatio);
|
|
419
|
+
renderer.setSize(previousWidth || targetWidth, previousHeight || targetHeight, false);
|
|
420
|
+
renderer.shadowMap.enabled = previousShadowEnabled;
|
|
421
|
+
renderer.shadowMap.type = previousShadowType;
|
|
422
|
+
renderer.setClearColor(previousClearColor, previousClearAlpha);
|
|
423
|
+
}
|
|
424
|
+
}
|
|
425
|
+
//# sourceMappingURL=vox.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vox.js","sourceRoot":"","sources":["../../src/vox.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
36
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
37
|
+
};
|
|
38
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
const node_test_1 = __importDefault(require("node:test"));
|
|
40
|
+
const strict_1 = __importDefault(require("node:assert/strict"));
|
|
41
|
+
const THREE = __importStar(require("three"));
|
|
42
|
+
const src_1 = require("../src");
|
|
43
|
+
(0, node_test_1.default)('assertValidVoxBuffer rejects invalid magic', () => {
|
|
44
|
+
strict_1.default.throws(() => (0, src_1.assertValidVoxBuffer)(new Uint8Array([0, 1, 2, 3, 150, 0, 0, 0])), /vox_header_invalid/);
|
|
45
|
+
});
|
|
46
|
+
(0, node_test_1.default)('convertVoxChunksToBoxel creates voxel primitive and palette', () => {
|
|
47
|
+
const chunk = {
|
|
48
|
+
palette: [0, 0xff0000ff, 0xff00ff00],
|
|
49
|
+
size: { x: 2, y: 1, z: 1 },
|
|
50
|
+
data: new Uint8Array([
|
|
51
|
+
0, 0, 0, 1,
|
|
52
|
+
1, 0, 0, 2,
|
|
53
|
+
]),
|
|
54
|
+
};
|
|
55
|
+
const boxel = (0, src_1.convertVoxChunksToBoxel)([chunk], 'sample_vox');
|
|
56
|
+
strict_1.default.equal(boxel.id, 'sample_vox');
|
|
57
|
+
strict_1.default.equal(boxel.materials.length, 2);
|
|
58
|
+
strict_1.default.equal(boxel.primitives.length, 1);
|
|
59
|
+
const primitive = boxel.primitives[0];
|
|
60
|
+
strict_1.default.equal(primitive.kind, 'voxel_box');
|
|
61
|
+
if (primitive.kind !== 'voxel_box') {
|
|
62
|
+
throw new Error('expected voxel_box primitive');
|
|
63
|
+
}
|
|
64
|
+
strict_1.default.deepEqual(primitive.size, [2, 1, 1]);
|
|
65
|
+
strict_1.default.deepEqual(primitive.voxels, [1, 2]);
|
|
66
|
+
});
|
|
67
|
+
(0, node_test_1.default)('buildVoxGroupFromChunks uses the provided Three runtime for materials', () => {
|
|
68
|
+
const chunk = {
|
|
69
|
+
palette: [0, 0xff0000ff],
|
|
70
|
+
size: { x: 1, y: 1, z: 1 },
|
|
71
|
+
data: new Uint8Array([0, 0, 0, 1]),
|
|
72
|
+
};
|
|
73
|
+
const group = (0, src_1.buildVoxGroupFromChunks)([chunk], THREE);
|
|
74
|
+
strict_1.default.equal(group.children.length, 1);
|
|
75
|
+
const mesh = group.children[0];
|
|
76
|
+
strict_1.default.equal(mesh.material instanceof THREE.MeshStandardMaterial, true);
|
|
77
|
+
strict_1.default.equal(mesh.material.vertexColors, true);
|
|
78
|
+
});
|
|
79
|
+
//# sourceMappingURL=vox.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vox.test.js","sourceRoot":"","sources":["../../test/vox.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@playdrop/vox-three",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "Three.js and boxel helpers for MagicaVoxel .vox assets",
|
|
5
|
+
"main": "dist/src/index.js",
|
|
6
|
+
"types": "dist/src/index.d.ts",
|
|
7
|
+
"scripts": {
|
|
8
|
+
"build": "tsc",
|
|
9
|
+
"test": "node --test --import tsx test/**/*.test.ts",
|
|
10
|
+
"dev": "tsc --watch",
|
|
11
|
+
"clean": "rm -rf dist"
|
|
12
|
+
},
|
|
13
|
+
"dependencies": {
|
|
14
|
+
"@playdrop/boxel-core": "file:../boxel-core"
|
|
15
|
+
},
|
|
16
|
+
"peerDependencies": {
|
|
17
|
+
"three": "^0.181.1"
|
|
18
|
+
},
|
|
19
|
+
"devDependencies": {
|
|
20
|
+
"@types/node": "^20.10.0",
|
|
21
|
+
"@types/three": "^0.181.0",
|
|
22
|
+
"three": "^0.181.1",
|
|
23
|
+
"typescript": "^5.3.0"
|
|
24
|
+
}
|
|
25
|
+
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@playdrop/playdrop-cli",
|
|
3
|
-
"version": "0.3.8-build.
|
|
3
|
+
"version": "0.3.8-build.2",
|
|
4
4
|
"description": "CLI for Playdrop platform",
|
|
5
5
|
"bin": {
|
|
6
6
|
"playdrop": "bin/playdrop"
|
|
@@ -38,6 +38,7 @@
|
|
|
38
38
|
"scripts": {
|
|
39
39
|
"build": "npm run clean && ../../node_modules/.bin/tsc --build",
|
|
40
40
|
"test": "npm run build && node --test test/*.test.js",
|
|
41
|
+
"test:packaging": "node scripts/smoke-pack.js",
|
|
41
42
|
"dev": "../../node_modules/.bin/tsc --build --watch",
|
|
42
43
|
"clean": "rm -rf dist tsconfig.tsbuildinfo",
|
|
43
44
|
"prepublishOnly": "npm run build",
|