minerender 2.0.0-alpha.14 → 2.0.0-alpha.15
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/bundle.js +161 -132
- package/dist/bundle.js.map +4 -4
- package/dist/cjs/UVMapper.js +189 -204
- package/dist/cjs/UVMapper.js.map +1 -1
- package/dist/cjs/assets/AssetKey.js +7 -8
- package/dist/cjs/assets/AssetKey.js.map +1 -1
- package/dist/cjs/assets/AssetLoader.js +24 -37
- package/dist/cjs/assets/AssetLoader.js.map +1 -1
- package/dist/cjs/assets/Assets.js +4 -17
- package/dist/cjs/assets/Assets.js.map +1 -1
- package/dist/cjs/assets/BlockStates.js +29 -48
- package/dist/cjs/assets/BlockStates.js.map +1 -1
- package/dist/cjs/assets/Entities.js +46 -67
- package/dist/cjs/assets/Entities.js.map +1 -1
- package/dist/cjs/assets/ModelTextures.js +26 -43
- package/dist/cjs/assets/ModelTextures.js.map +1 -1
- package/dist/cjs/assets/Models.js +40 -61
- package/dist/cjs/assets/Models.js.map +1 -1
- package/dist/cjs/assets/source/HostedAssetSource.js +63 -79
- package/dist/cjs/assets/source/HostedAssetSource.js.map +1 -1
- package/dist/cjs/assets/source/archive/ArchiveAssetSource.js +74 -91
- package/dist/cjs/assets/source/archive/ArchiveAssetSource.js.map +1 -1
- package/dist/cjs/assets/source/archive/BrowserArchiveProxy.js +9 -20
- package/dist/cjs/assets/source/archive/BrowserArchiveProxy.js.map +1 -1
- package/dist/cjs/cache/CacheKey.js +1 -2
- package/dist/cjs/cache/CacheKey.js.map +1 -1
- package/dist/cjs/cache/PersistentCache.js +7 -18
- package/dist/cjs/cache/PersistentCache.js.map +1 -1
- package/dist/cjs/entity/scene/EntityObject.js +23 -37
- package/dist/cjs/entity/scene/EntityObject.js.map +1 -1
- package/dist/cjs/image/ImageLoader.js +85 -118
- package/dist/cjs/image/ImageLoader.js.map +1 -1
- package/dist/cjs/inspector/SceneInspector.js +1 -2
- package/dist/cjs/inspector/SceneInspector.js.map +1 -1
- package/dist/cjs/instance/InstanceManager.js +18 -31
- package/dist/cjs/instance/InstanceManager.js.map +1 -1
- package/dist/cjs/model/ModelMerger.js +23 -36
- package/dist/cjs/model/ModelMerger.js.map +1 -1
- package/dist/cjs/model/block/scene/BlockObject.js +211 -234
- package/dist/cjs/model/block/scene/BlockObject.js.map +1 -1
- package/dist/cjs/model/multiblock/SchematicParser.js +4 -15
- package/dist/cjs/model/multiblock/SchematicParser.js.map +1 -1
- package/dist/cjs/model/multiblock/StructureParser.js +28 -40
- package/dist/cjs/model/multiblock/StructureParser.js.map +1 -1
- package/dist/cjs/model/scene/ModelObject.js +10 -25
- package/dist/cjs/model/scene/ModelObject.js.map +1 -1
- package/dist/cjs/nbt/NBTHelper.js +4 -15
- package/dist/cjs/nbt/NBTHelper.js.map +1 -1
- package/dist/cjs/renderer/MineRenderScene.js +53 -75
- package/dist/cjs/renderer/MineRenderScene.js.map +1 -1
- package/dist/cjs/renderer/Renderer.js +5 -8
- package/dist/cjs/renderer/Renderer.js.map +1 -1
- package/dist/cjs/renderer/SceneObject.js +3 -15
- package/dist/cjs/renderer/SceneObject.js.map +1 -1
- package/dist/cjs/skin/SkinTextureCoordinates.js +115 -116
- package/dist/cjs/skin/SkinTextureCoordinates.js.map +1 -1
- package/dist/cjs/skin/Skins.js +112 -149
- package/dist/cjs/skin/Skins.js.map +1 -1
- package/dist/cjs/skin/scene/SkinObject.js +3 -14
- package/dist/cjs/skin/scene/SkinObject.js.map +1 -1
- package/dist/cjs/util/log.js +1 -1
- package/dist/cjs/util/log.js.map +1 -1
- package/dist/cjs/util/util.js +3 -14
- package/dist/cjs/util/util.js.map +1 -1
- package/dist/cjs/world/Chunk.js +56 -73
- package/dist/cjs/world/Chunk.js.map +1 -1
- package/dist/cjs/world/MineRenderWorld.js +34 -49
- package/dist/cjs/world/MineRenderWorld.js.map +1 -1
- package/dist/esm/UVMapper.js +189 -204
- package/dist/esm/UVMapper.js.map +1 -1
- package/dist/esm/assets/AssetKey.js +7 -8
- package/dist/esm/assets/AssetKey.js.map +1 -1
- package/dist/esm/assets/AssetLoader.js +24 -37
- package/dist/esm/assets/AssetLoader.js.map +1 -1
- package/dist/esm/assets/Assets.js +4 -17
- package/dist/esm/assets/Assets.js.map +1 -1
- package/dist/esm/assets/BlockStates.js +29 -48
- package/dist/esm/assets/BlockStates.js.map +1 -1
- package/dist/esm/assets/Entities.js +46 -67
- package/dist/esm/assets/Entities.js.map +1 -1
- package/dist/esm/assets/ModelTextures.js +26 -43
- package/dist/esm/assets/ModelTextures.js.map +1 -1
- package/dist/esm/assets/Models.js +40 -61
- package/dist/esm/assets/Models.js.map +1 -1
- package/dist/esm/assets/source/HostedAssetSource.js +63 -79
- package/dist/esm/assets/source/HostedAssetSource.js.map +1 -1
- package/dist/esm/assets/source/archive/ArchiveAssetSource.js +74 -91
- package/dist/esm/assets/source/archive/ArchiveAssetSource.js.map +1 -1
- package/dist/esm/assets/source/archive/BrowserArchiveProxy.js +9 -20
- package/dist/esm/assets/source/archive/BrowserArchiveProxy.js.map +1 -1
- package/dist/esm/cache/CacheKey.js +1 -2
- package/dist/esm/cache/CacheKey.js.map +1 -1
- package/dist/esm/cache/PersistentCache.js +7 -18
- package/dist/esm/cache/PersistentCache.js.map +1 -1
- package/dist/esm/entity/scene/EntityObject.js +23 -37
- package/dist/esm/entity/scene/EntityObject.js.map +1 -1
- package/dist/esm/image/ImageLoader.js +85 -118
- package/dist/esm/image/ImageLoader.js.map +1 -1
- package/dist/esm/inspector/SceneInspector.js +1 -2
- package/dist/esm/inspector/SceneInspector.js.map +1 -1
- package/dist/esm/instance/InstanceManager.js +18 -31
- package/dist/esm/instance/InstanceManager.js.map +1 -1
- package/dist/esm/model/ModelMerger.js +23 -36
- package/dist/esm/model/ModelMerger.js.map +1 -1
- package/dist/esm/model/block/scene/BlockObject.js +211 -234
- package/dist/esm/model/block/scene/BlockObject.js.map +1 -1
- package/dist/esm/model/multiblock/SchematicParser.js +4 -15
- package/dist/esm/model/multiblock/SchematicParser.js.map +1 -1
- package/dist/esm/model/multiblock/StructureParser.js +28 -40
- package/dist/esm/model/multiblock/StructureParser.js.map +1 -1
- package/dist/esm/model/scene/ModelObject.js +10 -25
- package/dist/esm/model/scene/ModelObject.js.map +1 -1
- package/dist/esm/nbt/NBTHelper.js +4 -15
- package/dist/esm/nbt/NBTHelper.js.map +1 -1
- package/dist/esm/renderer/MineRenderScene.js +53 -75
- package/dist/esm/renderer/MineRenderScene.js.map +1 -1
- package/dist/esm/renderer/Renderer.js +5 -8
- package/dist/esm/renderer/Renderer.js.map +1 -1
- package/dist/esm/renderer/SceneObject.js +3 -15
- package/dist/esm/renderer/SceneObject.js.map +1 -1
- package/dist/esm/skin/SkinTextureCoordinates.js +115 -116
- package/dist/esm/skin/SkinTextureCoordinates.js.map +1 -1
- package/dist/esm/skin/Skins.js +112 -149
- package/dist/esm/skin/Skins.js.map +1 -1
- package/dist/esm/skin/scene/SkinObject.js +3 -14
- package/dist/esm/skin/scene/SkinObject.js.map +1 -1
- package/dist/esm/util/log.js +1 -1
- package/dist/esm/util/log.js.map +1 -1
- package/dist/esm/util/util.js +3 -14
- package/dist/esm/util/util.js.map +1 -1
- package/dist/esm/world/Chunk.js +56 -73
- package/dist/esm/world/Chunk.js.map +1 -1
- package/dist/esm/world/MineRenderWorld.js +34 -49
- package/dist/esm/world/MineRenderWorld.js.map +1 -1
- package/package.json +5 -26
- package/src/model/scene/ModelObject.ts +0 -3
- package/src/nbt/NBTHelper.ts +1 -1
- package/src/renderer/Renderer.ts +2 -2
- package/src/skin/SkinTextureCoordinates.ts +129 -119
- package/src/world/Chunk.ts +0 -2
- package/tsconfig.json +2 -2
|
@@ -1,13 +1,4 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
-
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
-
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
-
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
-
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
-
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
-
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
-
});
|
|
10
|
-
};
|
|
11
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
3
|
exports.MineRenderWorld = void 0;
|
|
13
4
|
const three_1 = require("three");
|
|
@@ -38,50 +29,44 @@ class MineRenderWorld {
|
|
|
38
29
|
this.validatePosBounds(posOrX);
|
|
39
30
|
return chunk.getBlockAt(posOrX);
|
|
40
31
|
}
|
|
41
|
-
setBlockAt(posOrX, yOrBlock, z, block) {
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
return chunk.setBlockAt(posOrX, yOrBlock);
|
|
52
|
-
});
|
|
32
|
+
async setBlockAt(posOrX, yOrBlock, z, block) {
|
|
33
|
+
if (typeof posOrX == "number") {
|
|
34
|
+
return this.setBlockAt(new three_1.Vector3(posOrX, yOrBlock, z), block);
|
|
35
|
+
}
|
|
36
|
+
if ((0, Model_1.isTripleArray)(posOrX)) {
|
|
37
|
+
return this.setBlockAt(new three_1.Vector3(posOrX[0], posOrX[1], posOrX[2]), yOrBlock);
|
|
38
|
+
}
|
|
39
|
+
this.validatePosBounds(posOrX);
|
|
40
|
+
const chunk = this.getOrCreateChunkAt(posOrX);
|
|
41
|
+
return chunk.setBlockAt(posOrX, yOrBlock);
|
|
53
42
|
}
|
|
54
|
-
placeMultiBlock(multiblock, useBatches = true, executor = new BatchedExecutor_1.BatchedExecutor()) {
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
this.setBlockAt(block.position, block).then(resolve).catch(reject);
|
|
64
|
-
});
|
|
43
|
+
async placeMultiBlock(multiblock, useBatches = true, executor = new BatchedExecutor_1.BatchedExecutor()) {
|
|
44
|
+
// preload blockstates
|
|
45
|
+
const keys = new Set(multiblock.blocks.map(block => AssetKey_1.AssetKey.parse("blockstates", block.type)));
|
|
46
|
+
await BlockStates_1.BlockStates.getAll(keys);
|
|
47
|
+
const place = async (block) => {
|
|
48
|
+
if (useBatches && typeof executor !== "undefined") {
|
|
49
|
+
await new Promise((resolve, reject) => {
|
|
50
|
+
executor.submit(() => {
|
|
51
|
+
this.setBlockAt(block.position, block).then(resolve).catch(reject);
|
|
65
52
|
});
|
|
66
|
-
}
|
|
67
|
-
else {
|
|
68
|
-
yield this.setBlockAt(block.position, block);
|
|
69
|
-
}
|
|
70
|
-
});
|
|
71
|
-
for (let block of multiblock.blocks) {
|
|
72
|
-
yield place(block);
|
|
53
|
+
});
|
|
73
54
|
}
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
clear() {
|
|
77
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
78
|
-
console.log("CHUNKS", this._chunks);
|
|
79
|
-
for (let chunk of this._chunks.values()) {
|
|
80
|
-
console.log("dispose chunk", chunk);
|
|
81
|
-
yield (chunk === null || chunk === void 0 ? void 0 : chunk.dispose());
|
|
55
|
+
else {
|
|
56
|
+
await this.setBlockAt(block.position, block);
|
|
82
57
|
}
|
|
83
|
-
|
|
84
|
-
|
|
58
|
+
};
|
|
59
|
+
for (let block of multiblock.blocks) {
|
|
60
|
+
await place(block);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
async clear() {
|
|
64
|
+
console.log("CHUNKS", this._chunks);
|
|
65
|
+
for (let chunk of this._chunks.values()) {
|
|
66
|
+
console.log("dispose chunk", chunk);
|
|
67
|
+
await chunk?.dispose();
|
|
68
|
+
}
|
|
69
|
+
this._chunks.clear();
|
|
85
70
|
}
|
|
86
71
|
getOrCreateChunkAt(pos) {
|
|
87
72
|
const key = this.worldPosToChunkKey(pos);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MineRenderWorld.js","sourceRoot":"src/","sources":["world/MineRenderWorld.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"MineRenderWorld.js","sourceRoot":"src/","sources":["world/MineRenderWorld.ts"],"names":[],"mappings":"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"}
|
package/dist/esm/UVMapper.js
CHANGED
|
@@ -1,12 +1,3 @@
|
|
|
1
|
-
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
2
|
-
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
3
|
-
return new (P || (P = Promise))(function (resolve, reject) {
|
|
4
|
-
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
5
|
-
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
6
|
-
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
7
|
-
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
8
|
-
});
|
|
9
|
-
};
|
|
10
1
|
import { Float32BufferAttribute, Vector2 } from "three";
|
|
11
2
|
import { CUBE_FACES, CubeFace } from "./CubeFace";
|
|
12
3
|
import { ModelTextures } from "./assets/ModelTextures";
|
|
@@ -131,12 +122,10 @@ export class UVMapper {
|
|
|
131
122
|
static facesToUv(faces, originalTextureSize, actualTextureSize) {
|
|
132
123
|
return new Float32BufferAttribute(this.facesToUvArray(faces, originalTextureSize, actualTextureSize), 2);
|
|
133
124
|
}
|
|
134
|
-
static getAtlas(model) {
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
return
|
|
138
|
-
return this.createAtlas(model);
|
|
139
|
-
});
|
|
125
|
+
static async getAtlas(model) {
|
|
126
|
+
const keyStr = model.key.serialize();
|
|
127
|
+
return Caching.modelTextureAtlasCache.get(keyStr, k => {
|
|
128
|
+
return this.createAtlas(model);
|
|
140
129
|
});
|
|
141
130
|
}
|
|
142
131
|
static fillMissingTextureKeys(textures, target) {
|
|
@@ -204,210 +193,206 @@ export class UVMapper {
|
|
|
204
193
|
}
|
|
205
194
|
return [tl, tr, bl, br];
|
|
206
195
|
}
|
|
207
|
-
static createAtlas(originalModel) {
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
196
|
+
static async createAtlas(originalModel) {
|
|
197
|
+
const textureMap = {};
|
|
198
|
+
const metaMap = {};
|
|
199
|
+
const model = { ...originalModel };
|
|
200
|
+
const isItemModel = !("elements" in model);
|
|
201
|
+
console.debug(p, "Creating Atlas for", model.key);
|
|
202
|
+
if (model.textures) {
|
|
203
|
+
const promises = [];
|
|
204
|
+
const uniqueTextureNames = []; // TODO: make these actually unique
|
|
205
|
+
const textureReferences = {};
|
|
206
|
+
for (let textureKey in model.textures) {
|
|
207
|
+
let textureValue = model.textures[textureKey];
|
|
208
|
+
if (textureValue.startsWith("#")) {
|
|
209
|
+
textureReferences[textureKey] = textureValue.substr(1);
|
|
210
|
+
}
|
|
211
|
+
else {
|
|
212
|
+
uniqueTextureNames.push(textureKey);
|
|
213
|
+
const assetKey = AssetKey.parse("textures", textureValue, model.key);
|
|
214
|
+
promises.push(ModelTextures.get(assetKey).then(asset => {
|
|
215
|
+
if (!asset) {
|
|
216
|
+
console.warn(p, "Missing texture", assetKey);
|
|
217
|
+
return;
|
|
218
|
+
}
|
|
219
|
+
textureMap[textureKey] = new WrappedImage(asset);
|
|
220
|
+
}));
|
|
221
|
+
promises.push(ModelTextures.getMeta(assetKey).then(meta => {
|
|
222
|
+
metaMap[textureKey] = meta;
|
|
223
|
+
}));
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
await Promise.all(promises);
|
|
227
|
+
const textureCount = uniqueTextureNames.length;
|
|
228
|
+
console.debug(p, "Creating Atlas for", textureCount, "textures");
|
|
229
|
+
// console.log(model.textures)
|
|
230
|
+
this.fillMissingTextureKeys(model.textures, textureMap);
|
|
231
|
+
this.fillMissingTextureKeys(model.textures, metaMap);
|
|
232
|
+
const sizes = {};
|
|
233
|
+
// Find largest texture dimensions
|
|
234
|
+
let maxWidth = 0;
|
|
235
|
+
let maxHeight = 0;
|
|
236
|
+
for (let textureKey of uniqueTextureNames) {
|
|
237
|
+
let texture = textureMap[textureKey];
|
|
238
|
+
if (!texture)
|
|
239
|
+
continue;
|
|
240
|
+
sizes[textureKey] = [texture.frameWidth, texture.frameHeight];
|
|
241
|
+
if (texture.frameWidth > maxWidth) {
|
|
242
|
+
maxWidth = texture.width;
|
|
243
|
+
}
|
|
244
|
+
if (texture.frameHeight > maxHeight) {
|
|
245
|
+
maxHeight = texture.frameHeight;
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
this.fillMissingTextureKeys(model.textures, sizes);
|
|
249
|
+
// console.log("sizes", sizes);
|
|
250
|
+
const s = (Math.ceil(Math.sqrt(textureCount + 1))); // +1 for transparency
|
|
251
|
+
const size = Math.ceil(s * maxWidth);
|
|
252
|
+
console.debug(p, "Atlas size:", size);
|
|
253
|
+
// console.log("size: " + size);
|
|
254
|
+
const squaredSize = size * size;
|
|
255
|
+
const missing = await ImageLoader.getData("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABAAQMAAACQp+OdAAAABlBMVEX/AP8AAACfphTyAAAAFUlEQVQoz2MIhQKGVVAwKjIqQrwIAHRz/wFI17TEAAAAAElFTkSuQmCC");
|
|
256
|
+
const empty = await ImageLoader.getData("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABAAQMAAACQp+OdAAAAA1BMVEUAAACnej3aAAAAAXRSTlMAQObYZgAAAA5JREFUKM9jGAWjgAIAAAJAAAFSSwuTAAAAAElFTkSuQmCC");
|
|
257
|
+
//TODO: add transparent texture and use as default uv
|
|
258
|
+
// Create image
|
|
259
|
+
const image = new CanvasImage(size, size);
|
|
260
|
+
image.putData(missing, 0, 0); // fill with invalid texture image
|
|
261
|
+
image.putData(empty, 0, 0, 0, 0, maxWidth, maxWidth); // add transparent section in the top-left corner
|
|
262
|
+
const positions = {};
|
|
263
|
+
let hasTransparency = false;
|
|
264
|
+
let hasAnimation = false;
|
|
265
|
+
const animatorFunctions = {};
|
|
266
|
+
// Draw all textures onto a single image
|
|
267
|
+
let tx = 1; // start one over to leave room for the transparent space
|
|
268
|
+
let ty = 0;
|
|
269
|
+
for (let textureIndex = 0; textureIndex < uniqueTextureNames.length; textureIndex++) {
|
|
270
|
+
let textureKey = uniqueTextureNames[textureIndex];
|
|
271
|
+
let texture = textureMap[textureKey];
|
|
272
|
+
let x = tx * maxWidth;
|
|
273
|
+
let y = ty * maxWidth;
|
|
274
|
+
if (texture) {
|
|
275
|
+
console.log(texture);
|
|
276
|
+
positions[textureKey] = [x, y];
|
|
277
|
+
image.putData(texture.data, x, y, 0, 0, maxWidth, maxWidth);
|
|
278
|
+
// console.log(image.toDataURL())
|
|
279
|
+
//TODO: only first frame for animated textures
|
|
280
|
+
if (texture.hasTransparency) {
|
|
281
|
+
hasTransparency = true;
|
|
223
282
|
}
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
283
|
+
console.log("texture", textureKey, "animated", texture.animated);
|
|
284
|
+
if (texture.animated) {
|
|
285
|
+
hasAnimation = true;
|
|
286
|
+
const meta = metaMap[textureKey];
|
|
287
|
+
const frameTime = meta?.animation?.frametime ?? 1;
|
|
288
|
+
console.log(meta);
|
|
289
|
+
console.log(frameTime);
|
|
290
|
+
let t = 0;
|
|
291
|
+
let f = 0;
|
|
292
|
+
animatorFunctions[textureKey] = () => {
|
|
293
|
+
// console.log("animating", textureKey)
|
|
294
|
+
//TODO: use mcmeta for frame count, delays, etc
|
|
295
|
+
//TODO: interpolate?
|
|
296
|
+
if (t++ >= frameTime) {
|
|
297
|
+
t = 0;
|
|
298
|
+
const frames = meta?.animation?.frames;
|
|
299
|
+
const frame = frames ? frames[f] : f; //TODO: frame.time support
|
|
300
|
+
image.putData(texture.getFrameSectionData(frame), x, y, 0, 0, maxWidth, maxWidth);
|
|
301
|
+
f++;
|
|
302
|
+
if (f >= (frames ? frames.length : texture.frameCount)) {
|
|
303
|
+
f = 0;
|
|
304
|
+
}
|
|
231
305
|
}
|
|
232
|
-
|
|
233
|
-
}));
|
|
234
|
-
promises.push(ModelTextures.getMeta(assetKey).then(meta => {
|
|
235
|
-
metaMap[textureKey] = meta;
|
|
236
|
-
}));
|
|
306
|
+
};
|
|
237
307
|
}
|
|
238
308
|
}
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
this.fillMissingTextureKeys(model.textures, textureMap);
|
|
244
|
-
this.fillMissingTextureKeys(model.textures, metaMap);
|
|
245
|
-
const sizes = {};
|
|
246
|
-
// Find largest texture dimensions
|
|
247
|
-
let maxWidth = 0;
|
|
248
|
-
let maxHeight = 0;
|
|
249
|
-
for (let textureKey of uniqueTextureNames) {
|
|
250
|
-
let texture = textureMap[textureKey];
|
|
251
|
-
if (!texture)
|
|
252
|
-
continue;
|
|
253
|
-
sizes[textureKey] = [texture.frameWidth, texture.frameHeight];
|
|
254
|
-
if (texture.frameWidth > maxWidth) {
|
|
255
|
-
maxWidth = texture.width;
|
|
256
|
-
}
|
|
257
|
-
if (texture.frameHeight > maxHeight) {
|
|
258
|
-
maxHeight = texture.frameHeight;
|
|
259
|
-
}
|
|
309
|
+
tx++;
|
|
310
|
+
if (tx >= s) {
|
|
311
|
+
tx = 0;
|
|
312
|
+
ty++;
|
|
260
313
|
}
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
image.putData(missing, 0, 0); // fill with invalid texture image
|
|
274
|
-
image.putData(empty, 0, 0, 0, 0, maxWidth, maxWidth); // add transparent section in the top-left corner
|
|
275
|
-
const positions = {};
|
|
276
|
-
let hasTransparency = false;
|
|
277
|
-
let hasAnimation = false;
|
|
278
|
-
const animatorFunctions = {};
|
|
279
|
-
// Draw all textures onto a single image
|
|
280
|
-
let tx = 1; // start one over to leave room for the transparent space
|
|
281
|
-
let ty = 0;
|
|
282
|
-
for (let textureIndex = 0; textureIndex < uniqueTextureNames.length; textureIndex++) {
|
|
283
|
-
let textureKey = uniqueTextureNames[textureIndex];
|
|
284
|
-
let texture = textureMap[textureKey];
|
|
285
|
-
let x = tx * maxWidth;
|
|
286
|
-
let y = ty * maxWidth;
|
|
287
|
-
if (texture) {
|
|
288
|
-
console.log(texture);
|
|
289
|
-
positions[textureKey] = [x, y];
|
|
290
|
-
image.putData(texture.data, x, y, 0, 0, maxWidth, maxWidth);
|
|
291
|
-
// console.log(image.toDataURL())
|
|
292
|
-
//TODO: only first frame for animated textures
|
|
293
|
-
if (texture.hasTransparency) {
|
|
294
|
-
hasTransparency = true;
|
|
295
|
-
}
|
|
296
|
-
console.log("texture", textureKey, "animated", texture.animated);
|
|
297
|
-
if (texture.animated) {
|
|
298
|
-
hasAnimation = true;
|
|
299
|
-
const meta = metaMap[textureKey];
|
|
300
|
-
const frameTime = (_b = (_a = meta === null || meta === void 0 ? void 0 : meta.animation) === null || _a === void 0 ? void 0 : _a.frametime) !== null && _b !== void 0 ? _b : 1;
|
|
301
|
-
console.log(meta);
|
|
302
|
-
console.log(frameTime);
|
|
303
|
-
let t = 0;
|
|
304
|
-
let f = 0;
|
|
305
|
-
animatorFunctions[textureKey] = () => {
|
|
306
|
-
var _a;
|
|
307
|
-
// console.log("animating", textureKey)
|
|
308
|
-
//TODO: use mcmeta for frame count, delays, etc
|
|
309
|
-
//TODO: interpolate?
|
|
310
|
-
if (t++ >= frameTime) {
|
|
311
|
-
t = 0;
|
|
312
|
-
const frames = (_a = meta === null || meta === void 0 ? void 0 : meta.animation) === null || _a === void 0 ? void 0 : _a.frames;
|
|
313
|
-
const frame = frames ? frames[f] : f; //TODO: frame.time support
|
|
314
|
-
image.putData(texture.getFrameSectionData(frame), x, y, 0, 0, maxWidth, maxWidth);
|
|
315
|
-
f++;
|
|
316
|
-
if (f >= (frames ? frames.length : texture.frameCount)) {
|
|
317
|
-
f = 0;
|
|
318
|
-
}
|
|
319
|
-
}
|
|
320
|
-
};
|
|
321
|
-
}
|
|
322
|
-
}
|
|
323
|
-
tx++;
|
|
324
|
-
if (tx >= s) {
|
|
325
|
-
tx = 0;
|
|
326
|
-
ty++;
|
|
314
|
+
}
|
|
315
|
+
const atlasImageData = image.toDataURL();
|
|
316
|
+
console.log(p, "Atlas Image for", model.key, atlasImageData);
|
|
317
|
+
this.fillMissingTextureKeys(model.textures, positions);
|
|
318
|
+
// console.log("positions", positions);
|
|
319
|
+
if (isItemModel) {
|
|
320
|
+
console.debug(p, "Generating item model for", model);
|
|
321
|
+
model.elements = [];
|
|
322
|
+
for (let layerName of ModelGenerator.ITEM_LAYERS) {
|
|
323
|
+
const textureImage = textureMap[layerName];
|
|
324
|
+
if (textureImage) {
|
|
325
|
+
model.elements.push(...ModelGenerator.generateItemModel(textureImage.data, layerName));
|
|
327
326
|
}
|
|
328
327
|
}
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
//
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
328
|
+
console.debug(p, "Item model elements", model.elements);
|
|
329
|
+
}
|
|
330
|
+
if (!model.elements) {
|
|
331
|
+
//TODO: default elements
|
|
332
|
+
}
|
|
333
|
+
// Adjust UV positions
|
|
334
|
+
if (model.elements) {
|
|
335
|
+
for (let elementIndex = 0; elementIndex < model.elements.length; elementIndex++) {
|
|
336
|
+
let element = model.elements[elementIndex];
|
|
337
|
+
let uv = [];
|
|
338
|
+
// Set default uvs to missing texture
|
|
339
|
+
for (let i = 0; i < CUBE_FACES.length; i++) {
|
|
340
|
+
this.setCubeFaceUvInArray(uv, i * 4, [0, 0, 8 / size, 8 / size]);
|
|
341
341
|
}
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
let element = model.elements[elementIndex];
|
|
351
|
-
let uv = [];
|
|
352
|
-
// Set default uvs to missing texture
|
|
353
|
-
for (let i = 0; i < CUBE_FACES.length; i++) {
|
|
354
|
-
this.setCubeFaceUvInArray(uv, i * 4, [0, 0, 8 / size, 8 / size]);
|
|
342
|
+
for (let faceIndex = 0; faceIndex < CUBE_FACES.length; faceIndex++) {
|
|
343
|
+
let faceName = CUBE_FACES[faceIndex];
|
|
344
|
+
// console.log(faceName)
|
|
345
|
+
let face = element.faces[faceName];
|
|
346
|
+
if (!face) {
|
|
347
|
+
// set uv transparent
|
|
348
|
+
this.setCubeFaceUvInArray(uv, faceIndex * 4, [0, 1, 8 / size, (size - 8) / size]);
|
|
349
|
+
continue;
|
|
355
350
|
}
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
face.uv = this.getFallbackUv(element, faceName);
|
|
367
|
-
}
|
|
368
|
-
let faceTexture = face.texture;
|
|
369
|
-
let texPosition;
|
|
370
|
-
let texSize;
|
|
371
|
-
if (faceTexture) {
|
|
372
|
-
faceTexture = faceTexture.substr(1); // remove #
|
|
373
|
-
texPosition = positions[faceTexture] || [0, 0];
|
|
374
|
-
texSize = sizes[faceTexture] || [16, 16];
|
|
375
|
-
}
|
|
376
|
-
let texPosV = new Vector2(texPosition[0], texPosition[1]);
|
|
377
|
-
const [tl, tr, bl, br] = this.expandAndRotateMcUvs(face.uv, face.rotation, texSize[0], texSize[1]);
|
|
378
|
-
// move to atlas position
|
|
379
|
-
tl.add(texPosV);
|
|
380
|
-
tr.add(texPosV);
|
|
381
|
-
bl.add(texPosV);
|
|
382
|
-
br.add(texPosV);
|
|
383
|
-
// divide to 0-1
|
|
384
|
-
tl.divideScalar(size);
|
|
385
|
-
tr.divideScalar(size);
|
|
386
|
-
bl.divideScalar(size);
|
|
387
|
-
br.divideScalar(size);
|
|
388
|
-
// flip y coordinates
|
|
389
|
-
tl.y = 1 - tl.y;
|
|
390
|
-
tr.y = 1 - tr.y;
|
|
391
|
-
bl.y = 1 - bl.y;
|
|
392
|
-
br.y = 1 - br.y;
|
|
393
|
-
//TODO: figure out how uv lock works
|
|
394
|
-
let uvs = [tl, tr, bl, br];
|
|
395
|
-
// console.log("uvs", uvs);
|
|
396
|
-
this.setFaceUvInArrayV(uv, faceIndex * 4, uvs);
|
|
351
|
+
if (!face.uv) {
|
|
352
|
+
face.uv = this.getFallbackUv(element, faceName);
|
|
353
|
+
}
|
|
354
|
+
let faceTexture = face.texture;
|
|
355
|
+
let texPosition;
|
|
356
|
+
let texSize;
|
|
357
|
+
if (faceTexture) {
|
|
358
|
+
faceTexture = faceTexture.substr(1); // remove #
|
|
359
|
+
texPosition = positions[faceTexture] || [0, 0];
|
|
360
|
+
texSize = sizes[faceTexture] || [16, 16];
|
|
397
361
|
}
|
|
398
|
-
|
|
362
|
+
let texPosV = new Vector2(texPosition[0], texPosition[1]);
|
|
363
|
+
const [tl, tr, bl, br] = this.expandAndRotateMcUvs(face.uv, face.rotation, texSize[0], texSize[1]);
|
|
364
|
+
// move to atlas position
|
|
365
|
+
tl.add(texPosV);
|
|
366
|
+
tr.add(texPosV);
|
|
367
|
+
bl.add(texPosV);
|
|
368
|
+
br.add(texPosV);
|
|
369
|
+
// divide to 0-1
|
|
370
|
+
tl.divideScalar(size);
|
|
371
|
+
tr.divideScalar(size);
|
|
372
|
+
bl.divideScalar(size);
|
|
373
|
+
br.divideScalar(size);
|
|
374
|
+
// flip y coordinates
|
|
375
|
+
tl.y = 1 - tl.y;
|
|
376
|
+
tr.y = 1 - tr.y;
|
|
377
|
+
bl.y = 1 - bl.y;
|
|
378
|
+
br.y = 1 - br.y;
|
|
379
|
+
//TODO: figure out how uv lock works
|
|
380
|
+
let uvs = [tl, tr, bl, br];
|
|
381
|
+
// console.log("uvs", uvs);
|
|
382
|
+
this.setFaceUvInArrayV(uv, faceIndex * 4, uvs);
|
|
399
383
|
}
|
|
384
|
+
element.mappedUv = uv;
|
|
400
385
|
}
|
|
401
|
-
else {
|
|
402
|
-
//TODO: item model
|
|
403
|
-
}
|
|
404
|
-
return new TextureAtlas(model, image, sizes, positions, hasAnimation, animatorFunctions, hasTransparency);
|
|
405
386
|
}
|
|
406
387
|
else {
|
|
407
|
-
|
|
388
|
+
//TODO: item model
|
|
408
389
|
}
|
|
409
|
-
return
|
|
410
|
-
}
|
|
390
|
+
return new TextureAtlas(model, image, sizes, positions, hasAnimation, animatorFunctions, hasTransparency);
|
|
391
|
+
}
|
|
392
|
+
else {
|
|
393
|
+
console.warn(p, "Model does not have any textures", model);
|
|
394
|
+
}
|
|
395
|
+
return undefined;
|
|
411
396
|
}
|
|
412
397
|
}
|
|
413
398
|
// Based on net.minecraft.client.renderer.block.model.BlockFaceUV
|