1 | ;
|
2 | Object.defineProperty(exports, "__esModule", { value: true });
|
3 | const resourcepack_1 = require("@xmcl/resourcepack");
|
4 | const common_1 = require("@xmcl/common");
|
5 | /**
|
6 | * The model loader load the resource
|
7 | */
|
8 | class 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 | }
|
85 | exports.ModelLoader = ModelLoader;
|
86 | //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kZWwtbG9hZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsibW9kZWwtbG9hZGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEscURBQTRFO0FBRTVFLHlDQUFzQztBQUV0Qzs7R0FFRztBQUNILE1BQWEsV0FBVztJQW9CcEI7O09BRUc7SUFDSCxZQUFxQixPQUF3QjtRQUF4QixZQUFPLEdBQVAsT0FBTyxDQUFpQjtRQVo3Qzs7V0FFRztRQUNNLGFBQVEsR0FBNkIsRUFBRSxDQUFDO1FBQ2pEOztXQUVHO1FBQ00sV0FBTSxHQUF3QyxFQUFFLENBQUM7SUFLVCxDQUFDO0lBdEJsRCxNQUFNLENBQUMsbUJBQW1CLENBQUMsS0FBMEIsRUFBRSxVQUFrQjtRQUNyRSxJQUFJLFdBQVcsR0FBRyxLQUFLLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBVyxDQUFDO1FBQ3ZELE9BQU8sV0FBVyxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsRUFBRTtZQUNoQyxNQUFNLElBQUksR0FBRyxLQUFLLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLFdBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO1lBQzFFLElBQUksQ0FBQyxJQUFJLEVBQUU7Z0JBQUUsT0FBTyxTQUFTLENBQUM7YUFBRTtZQUNoQyxXQUFXLEdBQUcsSUFBSSxDQUFDO1NBQ3RCO1FBQ0QsT0FBTyxXQUFXLENBQUM7SUFDdkIsQ0FBQztJQWdCRDs7T0FFRztJQUNILEtBQUssQ0FBQyxTQUFTLENBQUMsU0FBaUI7UUFDN0IsTUFBTSxHQUFHLEdBQUcsTUFBTSxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQywrQkFBZ0IsQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQztRQUM3RSxJQUFJLENBQUMsR0FBRyxFQUFFO1lBQUUsTUFBTSxJQUFJLEtBQUssQ0FBQyxTQUFTLFNBQVMsS0FBSywrQkFBZ0IsQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLGFBQWEsQ0FBQyxDQUFDO1NBQUU7UUFDM0csTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxlQUFNLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBZSxDQUFDO1FBRXZFLElBQUksQ0FBQyxHQUFHLENBQUMsUUFBUSxFQUFFO1lBQUUsR0FBRyxDQUFDLFFBQVEsR0FBRyxFQUFFLENBQUM7U0FBRTtRQUV6QyxJQUFJLEdBQUcsQ0FBQyxNQUFNLEVBQUU7WUFDWixNQUFNLFdBQVcsR0FBRyxNQUFNLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ3JELElBQUksQ0FBQyxXQUFXLEVBQUU7Z0JBQUUsTUFBTSxJQUFJLEtBQUssQ0FBQyx3QkFBd0IsR0FBRyxDQUFDLE1BQU0sUUFBUSxRQUFRLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQyxDQUFDO2FBQUU7WUFDdkcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxRQUFRLEVBQUU7Z0JBQUUsR0FBRyxDQUFDLFFBQVEsR0FBRyxXQUFXLENBQUMsUUFBUSxDQUFDO2FBQUU7WUFDM0QsSUFBSSxDQUFDLEdBQUcsQ0FBQyxnQkFBZ0IsRUFBRTtnQkFBRSxHQUFHLENBQUMsZ0JBQWdCLEdBQUcsV0FBVyxDQUFDLGdCQUFnQixDQUFDO2FBQUU7WUFDbkYsSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLEVBQUU7Z0JBQUUsR0FBRyxDQUFDLE9BQU8sR0FBRyxXQUFXLENBQUMsT0FBTyxDQUFDO2FBQUU7WUFDeEQsSUFBSSxDQUFDLEdBQUcsQ0FBQyxTQUFTLEVBQUU7Z0JBQUUsR0FBRyxDQUFDLFNBQVMsR0FBRyxXQUFXLENBQUMsU0FBUyxDQUFDO2FBQUU7WUFFOUQsSUFBSSxXQUFXLENBQUMsUUFBUSxFQUFFO2dCQUFFLE1BQU0sQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLFFBQVEsRUFBRSxXQUFXLENBQUMsUUFBUSxDQUFDLENBQUM7YUFBRTtTQUNuRjtRQUVELEdBQUcsQ0FBQyxnQkFBZ0IsR0FBRyxHQUFHLENBQUMsZ0JBQWdCLElBQUksS0FBSyxDQUFDO1FBQ3JELEdBQUcsQ0FBQyxTQUFTLEdBQUcsR0FBRyxDQUFDLFNBQVMsSUFBSSxFQUFFLENBQUM7UUFFcEMsT0FBTyxHQUFHLENBQUMsTUFBTSxDQUFDO1FBRWxCLE1BQU0sS0FBSyxHQUF3QixHQUFVLENBQUM7UUFDOUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsR0FBRyxLQUFLLENBQUM7UUFFL0IsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQztRQUMxQixLQUFLLE1BQU0sT0FBTyxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxFQUFFO1lBQy9DLE1BQU0sT0FBTyxHQUFHLFdBQVcsQ0FBQyxtQkFBbUIsQ0FBQyxLQUFLLEVBQUUsT0FBTyxDQUFDLENBQUM7WUFDaEUsSUFBSSxPQUFPLEVBQUU7Z0JBQ1QsTUFBTSxJQUFJLEdBQUcsTUFBTSxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQywrQkFBZ0IsQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztnQkFDOUUsSUFBSSxJQUFJLEVBQUU7b0JBQ04sR0FBRyxDQUFDLE9BQU8sQ0FBQyxHQUFHLElBQUksQ0FBQztpQkFDdkI7YUFDSjtTQUNKO1FBQ0QsT0FBTyxLQUFLLENBQUM7SUFDakIsQ0FBQztDQUNKO0FBbEVELGtDQWtFQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEJsb2NrTW9kZWwsIFJlc291cmNlLCBSZXNvdXJjZUxvY2F0aW9uIH0gZnJvbSBcIkB4bWNsL3Jlc291cmNlcGFja1wiO1xuaW1wb3J0IHsgUmVzb3VyY2VNYW5hZ2VyIH0gZnJvbSBcIi4vaW5kZXhcIjtcbmltcG9ydCB7IFN5c3RlbSB9IGZyb20gXCJAeG1jbC9jb21tb25cIjtcblxuLyoqXG4gKiBUaGUgbW9kZWwgbG9hZGVyIGxvYWQgdGhlIHJlc291cmNlXG4gKi9cbmV4cG9ydCBjbGFzcyBNb2RlbExvYWRlciB7XG4gICAgc3RhdGljIGZpbmRSZWFsVGV4dHVyZVBhdGgobW9kZWw6IEJsb2NrTW9kZWwuUmVzb2x2ZWQsIHZhcmlhbnRLZXk6IHN0cmluZykge1xuICAgICAgICBsZXQgdGV4dHVyZVBhdGggPSBtb2RlbC50ZXh0dXJlc1t2YXJpYW50S2V5XSBhcyBzdHJpbmc7XG4gICAgICAgIHdoaWxlICh0ZXh0dXJlUGF0aC5zdGFydHNXaXRoKFwiI1wiKSkge1xuICAgICAgICAgICAgY29uc3QgbmV4dCA9IG1vZGVsLnRleHR1cmVzW3RleHR1cmVQYXRoLnN1YnN0cmluZygxLCB0ZXh0dXJlUGF0aC5sZW5ndGgpXTtcbiAgICAgICAgICAgIGlmICghbmV4dCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gICAgICAgICAgICB0ZXh0dXJlUGF0aCA9IG5leHQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRleHR1cmVQYXRoO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFsbCByZXF1aXJlZCB0ZXh0dXJlIHJhdyByZXNvdXJjZXNcbiAgICAgKi9cbiAgICByZWFkb25seSB0ZXh0dXJlczogUmVjb3JkPHN0cmluZywgUmVzb3VyY2U+ID0ge307XG4gICAgLyoqXG4gICAgICogQWxsIHRoZSByZXNvbHZlZCBtb2RlbFxuICAgICAqL1xuICAgIHJlYWRvbmx5IG1vZGVsczogUmVjb3JkPHN0cmluZywgQmxvY2tNb2RlbC5SZXNvbHZlZD4gPSB7fTtcblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSBtYW5hZ2VyIFRoZSByZXNvdXJjZSBtYW5hZ2VyXG4gICAgICovXG4gICAgY29uc3RydWN0b3IocmVhZG9ubHkgbWFuYWdlcjogUmVzb3VyY2VNYW5hZ2VyKSB7IH1cblxuICAgIC8qKlxuICAgICAqIExvYWQgYSBtb2RlbCBieSBzZWFyY2ggaXRzIHBhcmVudC4gSXQgd2lsbCB0aHJvdyBhbiBlcnJvciBpZiB0aGUgbW9kZWwgaXMgbm90IGZvdW5kLlxuICAgICAqL1xuICAgIGFzeW5jIGxvYWRNb2RlbChtb2RlbFBhdGg6IHN0cmluZyk6IFByb21pc2U8QmxvY2tNb2RlbC5SZXNvbHZlZD4ge1xuICAgICAgICBjb25zdCByZXMgPSBhd2FpdCB0aGlzLm1hbmFnZXIubG9hZChSZXNvdXJjZUxvY2F0aW9uLm9mTW9kZWxQYXRoKG1vZGVsUGF0aCkpO1xuICAgICAgICBpZiAoIXJlcykgeyB0aHJvdyBuZXcgRXJyb3IoYE1vZGVsICR7bW9kZWxQYXRofSAoJHtSZXNvdXJjZUxvY2F0aW9uLm9mTW9kZWxQYXRoKG1vZGVsUGF0aCl9KSBub3QgZm91bmRgKTsgfVxuICAgICAgICBjb25zdCByYXcgPSBKU09OLnBhcnNlKFN5c3RlbS5idWZmZXJUb1RleHQocmVzLmNvbnRlbnQpKSBhcyBCbG9ja01vZGVsO1xuXG4gICAgICAgIGlmICghcmF3LnRleHR1cmVzKSB7IHJhdy50ZXh0dXJlcyA9IHt9OyB9XG5cbiAgICAgICAgaWYgKHJhdy5wYXJlbnQpIHtcbiAgICAgICAgICAgIGNvbnN0IHBhcmVudE1vZGVsID0gYXdhaXQgdGhpcy5sb2FkTW9kZWwocmF3LnBhcmVudCk7XG4gICAgICAgICAgICBpZiAoIXBhcmVudE1vZGVsKSB7IHRocm93IG5ldyBFcnJvcihgTWlzc2luZyBwYXJlbnQgbW9kZWwgJHtyYXcucGFyZW50fSBmb3IgJHtsb2NhdGlvbi50b1N0cmluZygpfWApOyB9XG4gICAgICAgICAgICBpZiAoIXJhdy5lbGVtZW50cykgeyByYXcuZWxlbWVudHMgPSBwYXJlbnRNb2RlbC5lbGVtZW50czsgfVxuICAgICAgICAgICAgaWYgKCFyYXcuYW1iaWVudG9jY2x1c2lvbikgeyByYXcuYW1iaWVudG9jY2x1c2lvbiA9IHBhcmVudE1vZGVsLmFtYmllbnRvY2NsdXNpb247IH1cbiAgICAgICAgICAgIGlmICghcmF3LmRpc3BsYXkpIHsgcmF3LmRpc3BsYXkgPSBwYXJlbnRNb2RlbC5kaXNwbGF5OyB9XG4gICAgICAgICAgICBpZiAoIXJhdy5vdmVycmlkZXMpIHsgcmF3Lm92ZXJyaWRlcyA9IHBhcmVudE1vZGVsLm92ZXJyaWRlczsgfVxuXG4gICAgICAgICAgICBpZiAocGFyZW50TW9kZWwudGV4dHVyZXMpIHsgT2JqZWN0LmFzc2lnbihyYXcudGV4dHVyZXMsIHBhcmVudE1vZGVsLnRleHR1cmVzKTsgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmF3LmFtYmllbnRvY2NsdXNpb24gPSByYXcuYW1iaWVudG9jY2x1c2lvbiB8fCBmYWxzZTtcbiAgICAgICAgcmF3Lm92ZXJyaWRlcyA9IHJhdy5vdmVycmlkZXMgfHwgW107XG5cbiAgICAgICAgZGVsZXRlIHJhdy5wYXJlbnQ7XG5cbiAgICAgICAgY29uc3QgbW9kZWw6IEJsb2NrTW9kZWwuUmVzb2x2ZWQgPSByYXcgYXMgYW55O1xuICAgICAgICB0aGlzLm1vZGVsc1ttb2RlbFBhdGhdID0gbW9kZWw7XG5cbiAgICAgICAgY29uc3QgcmVnID0gdGhpcy50ZXh0dXJlcztcbiAgICAgICAgZm9yIChjb25zdCB2YXJpYW50IG9mIE9iamVjdC5rZXlzKG1vZGVsLnRleHR1cmVzKSkge1xuICAgICAgICAgICAgY29uc3QgdGV4UGF0aCA9IE1vZGVsTG9hZGVyLmZpbmRSZWFsVGV4dHVyZVBhdGgobW9kZWwsIHZhcmlhbnQpO1xuICAgICAgICAgICAgaWYgKHRleFBhdGgpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBsb2FkID0gYXdhaXQgdGhpcy5tYW5hZ2VyLmxvYWQoUmVzb3VyY2VMb2NhdGlvbi5vZlRleHR1cmVQYXRoKHRleFBhdGgpKTtcbiAgICAgICAgICAgICAgICBpZiAobG9hZCkge1xuICAgICAgICAgICAgICAgICAgICByZWdbdGV4UGF0aF0gPSBsb2FkO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbW9kZWw7XG4gICAgfVxufVxuIl19 |
\ | No newline at end of file |