UNPKG

10.1 kBJavaScriptView Raw
1"use strict";
2Object.defineProperty(exports, "__esModule", { value: true });
3const resourcepack_1 = require("@xmcl/resourcepack");
4const common_1 = require("@xmcl/common");
5/**
6 * The model loader load the resource
7 */
8class ModelLoader {
9 /**
10 * @param manager The resource manager
11 */
12 constructor(manager) {
13 this.manager = manager;
14 /**
15 * All required texture raw resources
16 */
17 this.textures = {};
18 /**
19 * All the resolved model
20 */
21 this.models = {};
22 }
23 static findRealTexturePath(model, variantKey) {
24 let texturePath = model.textures[variantKey];
25 while (texturePath.startsWith("#")) {
26 const next = model.textures[texturePath.substring(1, texturePath.length)];
27 if (!next) {
28 return undefined;
29 }
30 texturePath = next;
31 }
32 return texturePath;
33 }
34 /**
35 * Load a model by search its parent. It will throw an error if the model is not found.
36 */
37 async loadModel(modelPath) {
38 const res = await this.manager.load(resourcepack_1.ResourceLocation.ofModelPath(modelPath));
39 if (!res) {
40 throw new Error(`Model ${modelPath} (${resourcepack_1.ResourceLocation.ofModelPath(modelPath)}) not found`);
41 }
42 const raw = JSON.parse(common_1.System.bufferToText(res.content));
43 if (!raw.textures) {
44 raw.textures = {};
45 }
46 if (raw.parent) {
47 const parentModel = await this.loadModel(raw.parent);
48 if (!parentModel) {
49 throw new Error(`Missing parent model ${raw.parent} for ${location.toString()}`);
50 }
51 if (!raw.elements) {
52 raw.elements = parentModel.elements;
53 }
54 if (!raw.ambientocclusion) {
55 raw.ambientocclusion = parentModel.ambientocclusion;
56 }
57 if (!raw.display) {
58 raw.display = parentModel.display;
59 }
60 if (!raw.overrides) {
61 raw.overrides = parentModel.overrides;
62 }
63 if (parentModel.textures) {
64 Object.assign(raw.textures, parentModel.textures);
65 }
66 }
67 raw.ambientocclusion = raw.ambientocclusion || false;
68 raw.overrides = raw.overrides || [];
69 delete raw.parent;
70 const model = raw;
71 this.models[modelPath] = model;
72 const reg = this.textures;
73 for (const variant of Object.keys(model.textures)) {
74 const texPath = ModelLoader.findRealTexturePath(model, variant);
75 if (texPath) {
76 const load = await this.manager.load(resourcepack_1.ResourceLocation.ofTexturePath(texPath));
77 if (load) {
78 reg[texPath] = load;
79 }
80 }
81 }
82 return model;
83 }
84}
85exports.ModelLoader = ModelLoader;
86//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kZWwtbG9hZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsibW9kZWwtbG9hZGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEscURBQTRFO0FBRTVFLHlDQUFzQztBQUV0Qzs7R0FFRztBQUNILE1BQWEsV0FBVztJQW9CcEI7O09BRUc7SUFDSCxZQUFxQixPQUF3QjtRQUF4QixZQUFPLEdBQVAsT0FBTyxDQUFpQjtRQVo3Qzs7V0FFRztRQUNNLGFBQVEsR0FBNkIsRUFBRSxDQUFDO1FBQ2pEOztXQUVHO1FBQ00sV0FBTSxHQUF3QyxFQUFFLENBQUM7SUFLVCxDQUFDO0lBdEJsRCxNQUFNLENBQUMsbUJBQW1CLENBQUMsS0FBMEIsRUFBRSxVQUFrQjtRQUNyRSxJQUFJLFdBQVcsR0FBRyxLQUFLLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBVyxDQUFDO1FBQ3ZELE9BQU8sV0FBVyxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsRUFBRTtZQUNoQyxNQUFNLElBQUksR0FBRyxLQUFLLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLFdBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO1lBQzFFLElBQUksQ0FBQyxJQUFJLEVBQUU7Z0JBQUUsT0FBTyxTQUFTLENBQUM7YUFBRTtZQUNoQyxXQUFXLEdBQUcsSUFBSSxDQUFDO1NBQ3RCO1FBQ0QsT0FBTyxXQUFXLENBQUM7SUFDdkIsQ0FBQztJQWdCRDs7T0FFRztJQUNILEtBQUssQ0FBQyxTQUFTLENBQUMsU0FBaUI7UUFDN0IsTUFBTSxHQUFHLEdBQUcsTUFBTSxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQywrQkFBZ0IsQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQztRQUM3RSxJQUFJLENBQUMsR0FBRyxFQUFFO1lBQUUsTUFBTSxJQUFJLEtBQUssQ0FBQyxTQUFTLFNBQVMsS0FBSywrQkFBZ0IsQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLGFBQWEsQ0FBQyxDQUFDO1NBQUU7UUFDM0csTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxlQUFNLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBZSxDQUFDO1FBRXZFLElBQUksQ0FBQyxHQUFHLENBQUMsUUFBUSxFQUFFO1lBQUUsR0FBRyxDQUFDLFFBQVEsR0FBRyxFQUFFLENBQUM7U0FBRTtRQUV6QyxJQUFJLEdBQUcsQ0FBQyxNQUFNLEVBQUU7WUFDWixNQUFNLFdBQVcsR0FBRyxNQUFNLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ3JELElBQUksQ0FBQyxXQUFXLEVBQUU7Z0JBQUUsTUFBTSxJQUFJLEtBQUssQ0FBQyx3QkFBd0IsR0FBRyxDQUFDLE1BQU0sUUFBUSxRQUFRLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQyxDQUFDO2FBQUU7WUFDdkcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxRQUFRLEVBQUU7Z0JBQUUsR0FBRyxDQUFDLFFBQVEsR0FBRyxXQUFXLENBQUMsUUFBUSxDQUFDO2FBQUU7WUFDM0QsSUFBSSxDQUFDLEdBQUcsQ0FBQyxnQkFBZ0IsRUFBRTtnQkFBRSxHQUFHLENBQUMsZ0JBQWdCLEdBQUcsV0FBVyxDQUFDLGdCQUFnQixDQUFDO2FBQUU7WUFDbkYsSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLEVBQUU7Z0JBQUUsR0FBRyxDQUFDLE9BQU8sR0FBRyxXQUFXLENBQUMsT0FBTyxDQUFDO2FBQUU7WUFDeEQsSUFBSSxDQUFDLEdBQUcsQ0FBQyxTQUFTLEVBQUU7Z0JBQUUsR0FBRyxDQUFDLFNBQVMsR0FBRyxXQUFXLENBQUMsU0FBUyxDQUFDO2FBQUU7WUFFOUQsSUFBSSxXQUFXLENBQUMsUUFBUSxFQUFFO2dCQUFFLE1BQU0sQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLFFBQVEsRUFBRSxXQUFXLENBQUMsUUFBUSxDQUFDLENBQUM7YUFBRTtTQUNuRjtRQUVELEdBQUcsQ0FBQyxnQkFBZ0IsR0FBRyxHQUFHLENBQUMsZ0JBQWdCLElBQUksS0FBSyxDQUFDO1FBQ3JELEdBQUcsQ0FBQyxTQUFTLEdBQUcsR0FBRyxDQUFDLFNBQVMsSUFBSSxFQUFFLENBQUM7UUFFcEMsT0FBTyxHQUFHLENBQUMsTUFBTSxDQUFDO1FBRWxCLE1BQU0sS0FBSyxHQUF3QixHQUFVLENBQUM7UUFDOUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsR0FBRyxLQUFLLENBQUM7UUFFL0IsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQztRQUMxQixLQUFLLE1BQU0sT0FBTyxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxFQUFFO1lBQy9DLE1BQU0sT0FBTyxHQUFHLFdBQVcsQ0FBQyxtQkFBbUIsQ0FBQyxLQUFLLEVBQUUsT0FBTyxDQUFDLENBQUM7WUFDaEUsSUFBSSxPQUFPLEVBQUU7Z0JBQ1QsTUFBTSxJQUFJLEdBQUcsTUFBTSxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQywrQkFBZ0IsQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztnQkFDOUUsSUFBSSxJQUFJLEVBQUU7b0JBQ04sR0FBRyxDQUFDLE9BQU8sQ0FBQyxHQUFHLElBQUksQ0FBQztpQkFDdkI7YUFDSjtTQUNKO1FBQ0QsT0FBTyxLQUFLLENBQUM7SUFDakIsQ0FBQztDQUNKO0FBbEVELGtDQWtFQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEJsb2NrTW9kZWwsIFJlc291cmNlLCBSZXNvdXJjZUxvY2F0aW9uIH0gZnJvbSBcIkB4bWNsL3Jlc291cmNlcGFja1wiO1xuaW1wb3J0IHsgUmVzb3VyY2VNYW5hZ2VyIH0gZnJvbSBcIi4vaW5kZXhcIjtcbmltcG9ydCB7IFN5c3RlbSB9IGZyb20gXCJAeG1jbC9jb21tb25cIjtcblxuLyoqXG4gKiBUaGUgbW9kZWwgbG9hZGVyIGxvYWQgdGhlIHJlc291cmNlXG4gKi9cbmV4cG9ydCBjbGFzcyBNb2RlbExvYWRlciB7XG4gICAgc3RhdGljIGZpbmRSZWFsVGV4dHVyZVBhdGgobW9kZWw6IEJsb2NrTW9kZWwuUmVzb2x2ZWQsIHZhcmlhbnRLZXk6IHN0cmluZykge1xuICAgICAgICBsZXQgdGV4dHVyZVBhdGggPSBtb2RlbC50ZXh0dXJlc1t2YXJpYW50S2V5XSBhcyBzdHJpbmc7XG4gICAgICAgIHdoaWxlICh0ZXh0dXJlUGF0aC5zdGFydHNXaXRoKFwiI1wiKSkge1xuICAgICAgICAgICAgY29uc3QgbmV4dCA9IG1vZGVsLnRleHR1cmVzW3RleHR1cmVQYXRoLnN1YnN0cmluZygxLCB0ZXh0dXJlUGF0aC5sZW5ndGgpXTtcbiAgICAgICAgICAgIGlmICghbmV4dCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gICAgICAgICAgICB0ZXh0dXJlUGF0aCA9IG5leHQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRleHR1cmVQYXRoO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFsbCByZXF1aXJlZCB0ZXh0dXJlIHJhdyByZXNvdXJjZXNcbiAgICAgKi9cbiAgICByZWFkb25seSB0ZXh0dXJlczogUmVjb3JkPHN0cmluZywgUmVzb3VyY2U+ID0ge307XG4gICAgLyoqXG4gICAgICogQWxsIHRoZSByZXNvbHZlZCBtb2RlbFxuICAgICAqL1xuICAgIHJlYWRvbmx5IG1vZGVsczogUmVjb3JkPHN0cmluZywgQmxvY2tNb2RlbC5SZXNvbHZlZD4gPSB7fTtcblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSBtYW5hZ2VyIFRoZSByZXNvdXJjZSBtYW5hZ2VyXG4gICAgICovXG4gICAgY29uc3RydWN0b3IocmVhZG9ubHkgbWFuYWdlcjogUmVzb3VyY2VNYW5hZ2VyKSB7IH1cblxuICAgIC8qKlxuICAgICAqIExvYWQgYSBtb2RlbCBieSBzZWFyY2ggaXRzIHBhcmVudC4gSXQgd2lsbCB0aHJvdyBhbiBlcnJvciBpZiB0aGUgbW9kZWwgaXMgbm90IGZvdW5kLlxuICAgICAqL1xuICAgIGFzeW5jIGxvYWRNb2RlbChtb2RlbFBhdGg6IHN0cmluZyk6IFByb21pc2U8QmxvY2tNb2RlbC5SZXNvbHZlZD4ge1xuICAgICAgICBjb25zdCByZXMgPSBhd2FpdCB0aGlzLm1hbmFnZXIubG9hZChSZXNvdXJjZUxvY2F0aW9uLm9mTW9kZWxQYXRoKG1vZGVsUGF0aCkpO1xuICAgICAgICBpZiAoIXJlcykgeyB0aHJvdyBuZXcgRXJyb3IoYE1vZGVsICR7bW9kZWxQYXRofSAoJHtSZXNvdXJjZUxvY2F0aW9uLm9mTW9kZWxQYXRoKG1vZGVsUGF0aCl9KSBub3QgZm91bmRgKTsgfVxuICAgICAgICBjb25zdCByYXcgPSBKU09OLnBhcnNlKFN5c3RlbS5idWZmZXJUb1RleHQocmVzLmNvbnRlbnQpKSBhcyBCbG9ja01vZGVsO1xuXG4gICAgICAgIGlmICghcmF3LnRleHR1cmVzKSB7IHJhdy50ZXh0dXJlcyA9IHt9OyB9XG5cbiAgICAgICAgaWYgKHJhdy5wYXJlbnQpIHtcbiAgICAgICAgICAgIGNvbnN0IHBhcmVudE1vZGVsID0gYXdhaXQgdGhpcy5sb2FkTW9kZWwocmF3LnBhcmVudCk7XG4gICAgICAgICAgICBpZiAoIXBhcmVudE1vZGVsKSB7IHRocm93IG5ldyBFcnJvcihgTWlzc2luZyBwYXJlbnQgbW9kZWwgJHtyYXcucGFyZW50fSBmb3IgJHtsb2NhdGlvbi50b1N0cmluZygpfWApOyB9XG4gICAgICAgICAgICBpZiAoIXJhdy5lbGVtZW50cykgeyByYXcuZWxlbWVudHMgPSBwYXJlbnRNb2RlbC5lbGVtZW50czsgfVxuICAgICAgICAgICAgaWYgKCFyYXcuYW1iaWVudG9jY2x1c2lvbikgeyByYXcuYW1iaWVudG9jY2x1c2lvbiA9IHBhcmVudE1vZGVsLmFtYmllbnRvY2NsdXNpb247IH1cbiAgICAgICAgICAgIGlmICghcmF3LmRpc3BsYXkpIHsgcmF3LmRpc3BsYXkgPSBwYXJlbnRNb2RlbC5kaXNwbGF5OyB9XG4gICAgICAgICAgICBpZiAoIXJhdy5vdmVycmlkZXMpIHsgcmF3Lm92ZXJyaWRlcyA9IHBhcmVudE1vZGVsLm92ZXJyaWRlczsgfVxuXG4gICAgICAgICAgICBpZiAocGFyZW50TW9kZWwudGV4dHVyZXMpIHsgT2JqZWN0LmFzc2lnbihyYXcudGV4dHVyZXMsIHBhcmVudE1vZGVsLnRleHR1cmVzKTsgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmF3LmFtYmllbnRvY2NsdXNpb24gPSByYXcuYW1iaWVudG9jY2x1c2lvbiB8fCBmYWxzZTtcbiAgICAgICAgcmF3Lm92ZXJyaWRlcyA9IHJhdy5vdmVycmlkZXMgfHwgW107XG5cbiAgICAgICAgZGVsZXRlIHJhdy5wYXJlbnQ7XG5cbiAgICAgICAgY29uc3QgbW9kZWw6IEJsb2NrTW9kZWwuUmVzb2x2ZWQgPSByYXcgYXMgYW55O1xuICAgICAgICB0aGlzLm1vZGVsc1ttb2RlbFBhdGhdID0gbW9kZWw7XG5cbiAgICAgICAgY29uc3QgcmVnID0gdGhpcy50ZXh0dXJlcztcbiAgICAgICAgZm9yIChjb25zdCB2YXJpYW50IG9mIE9iamVjdC5rZXlzKG1vZGVsLnRleHR1cmVzKSkge1xuICAgICAgICAgICAgY29uc3QgdGV4UGF0aCA9IE1vZGVsTG9hZGVyLmZpbmRSZWFsVGV4dHVyZVBhdGgobW9kZWwsIHZhcmlhbnQpO1xuICAgICAgICAgICAgaWYgKHRleFBhdGgpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBsb2FkID0gYXdhaXQgdGhpcy5tYW5hZ2VyLmxvYWQoUmVzb3VyY2VMb2NhdGlvbi5vZlRleHR1cmVQYXRoKHRleFBhdGgpKTtcbiAgICAgICAgICAgICAgICBpZiAobG9hZCkge1xuICAgICAgICAgICAgICAgICAgICByZWdbdGV4UGF0aF0gPSBsb2FkO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbW9kZWw7XG4gICAgfVxufVxuIl19
\No newline at end of file