mc-assets 0.2.49 → 0.2.51
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/README.MD +1 -1
- package/dist/assetsParser.d.ts +6 -36
- package/dist/assetsParser.js +11 -5
- package/dist/atlasCreator.d.ts +2 -2
- package/dist/atlasCreator.js +5 -3
- package/dist/atlasParser.d.ts +14 -2
- package/dist/atlasParser.js +9 -2
- package/dist/itemsRenderer.d.ts +2 -14
- package/dist/types.d.ts +8 -0
- package/dist/versionedStore.d.ts +1 -1
- package/dist/worldBlockProvider.d.ts +20 -22
- package/dist/worldBlockProvider.js +49 -43
- package/package.json +4 -3
- package/temp-lib/zardoy-maxrects-packer-2.7.4.tgz +0 -0
package/README.MD
CHANGED
|
@@ -27,7 +27,7 @@ For contributing & building instructions see [building](#building) section.
|
|
|
27
27
|
> Tested on Node.js 18 and above.
|
|
28
28
|
|
|
29
29
|
|
|
30
|
-
All blockstates + models + all atlas textures for all versions bundled with rsbuild (uncompressed):
|
|
30
|
+
All blockstates + models + all atlas textures for all versions bundled with rsbuild (uncompressed): 5 MB.
|
|
31
31
|
|
|
32
32
|
This packages includes versions for: 1.7.10, 1.8, 1.8.1, 1.8.2, 1.8.3, 1.8.4, 1.8.5, 1.8.6, 1.8.7, 1.8.8, 1.8.9, 1.9, 1.9.1, 1.9.2, 1.9.3, 1.9.4, 1.10, 1.10.1, 1.10.2, 1.11, 1.11.1, 1.11.2, 1.12, 1.12.1, 1.12.2, 1.13, 1.13.1, 1.13.2, 1.14, 1.14.1, 1.14.2, 1.14.3, 1.14.4, 1.15, 1.15.1, 1.15.2, 1.16, 1.16.1, 1.16.2, 1.16.3, 1.16.4, 1.16.5, 1.17, 1.17.1, 1.18, 1.18.1, 1.18.2, 1.19, 1.19.1, 1.19.2, 1.19.3, 1.19.4, 1.20, 1.20.1, 1.20.2, 1.20.3, 1.20.4, 1.20.5, 1.20.6, 1.21, 1.21.1, 1.21.2, 1.21.3, 1.21.4, 1.21.5-pre2, 1.21.5-pre3, 1.21.5-rc1, 1.21.5-rc2, 1.21.5.
|
|
33
33
|
|
package/dist/assetsParser.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { BlockModelsStore, BlockStatesStore } from './stores';
|
|
2
|
-
import { BlockElementPos, BlockModel } from './types';
|
|
2
|
+
import { BlockElementPos, BlockModel, ResolvedBlockModel } from './types';
|
|
3
3
|
export interface QueriedBlock {
|
|
4
4
|
stateId: number;
|
|
5
5
|
name: string;
|
|
@@ -24,42 +24,12 @@ export declare class AssetsParser {
|
|
|
24
24
|
private getModelsByBlock;
|
|
25
25
|
private getModelData;
|
|
26
26
|
getResolvedModelsByModel(model: string, debugQueryName?: string, clearModel?: boolean): {
|
|
27
|
-
resolvedModel:
|
|
28
|
-
x?: number;
|
|
29
|
-
y?: number;
|
|
30
|
-
z?: number;
|
|
31
|
-
uvlock?: boolean;
|
|
32
|
-
weight?: number;
|
|
33
|
-
};
|
|
27
|
+
resolvedModel: ResolvedBlockModel;
|
|
34
28
|
} | undefined;
|
|
35
29
|
getResolvedModelsByModelData(modelData: BlockModel, debugQueryName?: string, clearModel?: boolean): {
|
|
36
|
-
resolvedModel:
|
|
37
|
-
x?: number;
|
|
38
|
-
y?: number;
|
|
39
|
-
z?: number;
|
|
40
|
-
uvlock?: boolean;
|
|
41
|
-
weight?: number;
|
|
42
|
-
};
|
|
30
|
+
resolvedModel: ResolvedBlockModel;
|
|
43
31
|
};
|
|
44
|
-
getResolvedModelFirst(queriedBlock: Omit<QueriedBlock, 'stateId'>, fallbackVariant?: boolean):
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
z?: number;
|
|
48
|
-
uvlock?: boolean;
|
|
49
|
-
weight?: number;
|
|
50
|
-
})[] | undefined;
|
|
51
|
-
getResolvedModelRandom(queriedBlock: Omit<QueriedBlock, 'stateId'>, fallbackVariant?: boolean): (Pick<BlockModel, "textures" | "ao" | "elements"> & {
|
|
52
|
-
x?: number;
|
|
53
|
-
y?: number;
|
|
54
|
-
z?: number;
|
|
55
|
-
uvlock?: boolean;
|
|
56
|
-
weight?: number;
|
|
57
|
-
})[] | undefined;
|
|
58
|
-
getAllResolvedModels(queriedBlock: Omit<QueriedBlock, 'stateId'>, fallbackVariant?: boolean): (Pick<BlockModel, "textures" | "ao" | "elements"> & {
|
|
59
|
-
x?: number;
|
|
60
|
-
y?: number;
|
|
61
|
-
z?: number;
|
|
62
|
-
uvlock?: boolean;
|
|
63
|
-
weight?: number;
|
|
64
|
-
})[][] | undefined;
|
|
32
|
+
getResolvedModelFirst(queriedBlock: Omit<QueriedBlock, 'stateId'>, fallbackVariant?: boolean): ResolvedBlockModel[] | undefined;
|
|
33
|
+
getResolvedModelRandom(queriedBlock: Omit<QueriedBlock, 'stateId'>, fallbackVariant?: boolean): ResolvedBlockModel[] | undefined;
|
|
34
|
+
getAllResolvedModels(queriedBlock: Omit<QueriedBlock, 'stateId'>, fallbackVariant?: boolean): ResolvedBlockModel[][] | undefined;
|
|
65
35
|
}
|
package/dist/assetsParser.js
CHANGED
|
@@ -49,8 +49,9 @@ export class AssetsParser {
|
|
|
49
49
|
const elementsOptimized = allElements.length === 1 && arrEq(allElements[0][0], [0, 0, 0]) && arrEq(allElements[0][1], [16, 16, 16]) ? 1 : allElements;
|
|
50
50
|
return elementsOptimized;
|
|
51
51
|
}
|
|
52
|
-
|
|
53
|
-
|
|
52
|
+
resolvedModel = {
|
|
53
|
+
modelName: ''
|
|
54
|
+
};
|
|
54
55
|
issues = [];
|
|
55
56
|
matchedModels = [];
|
|
56
57
|
matchedConditions = [];
|
|
@@ -154,6 +155,7 @@ export class AssetsParser {
|
|
|
154
155
|
for (const varModel of Array.isArray(model) ? model : [model]) {
|
|
155
156
|
variant++;
|
|
156
157
|
this.resolvedModel = {
|
|
158
|
+
modelName: varModel.model ?? queriedBlock.name,
|
|
157
159
|
x: varModel.x,
|
|
158
160
|
y: varModel.y,
|
|
159
161
|
z: varModel.z,
|
|
@@ -169,7 +171,7 @@ export class AssetsParser {
|
|
|
169
171
|
break;
|
|
170
172
|
}
|
|
171
173
|
}
|
|
172
|
-
return modelsResolved;
|
|
174
|
+
return modelsResolved;
|
|
173
175
|
}
|
|
174
176
|
getModelData(model) {
|
|
175
177
|
const modelData = this.blockModelsStore.get(this.version, model.replace('minecraft:', ''));
|
|
@@ -177,7 +179,9 @@ export class AssetsParser {
|
|
|
177
179
|
}
|
|
178
180
|
getResolvedModelsByModel(model, debugQueryName, clearModel = true) {
|
|
179
181
|
if (clearModel) {
|
|
180
|
-
this.resolvedModel = {
|
|
182
|
+
this.resolvedModel = {
|
|
183
|
+
modelName: this.resolvedModel.modelName
|
|
184
|
+
};
|
|
181
185
|
}
|
|
182
186
|
const modelData = this.getModelData(model);
|
|
183
187
|
if (!modelData) {
|
|
@@ -189,7 +193,9 @@ export class AssetsParser {
|
|
|
189
193
|
}
|
|
190
194
|
getResolvedModelsByModelData(modelData, debugQueryName, clearModel = true) {
|
|
191
195
|
if (clearModel) {
|
|
192
|
-
this.resolvedModel = {
|
|
196
|
+
this.resolvedModel = {
|
|
197
|
+
modelName: this.resolvedModel.modelName
|
|
198
|
+
};
|
|
193
199
|
}
|
|
194
200
|
const collectedParentModels = [];
|
|
195
201
|
const collectModels = (model) => {
|
package/dist/atlasCreator.d.ts
CHANGED
|
@@ -29,11 +29,11 @@ export type AtlasCreatorOptions = {
|
|
|
29
29
|
renderSourceWidth?: number;
|
|
30
30
|
renderSourceHeight?: number;
|
|
31
31
|
};
|
|
32
|
-
|
|
32
|
+
needHorizontalIndexes?: boolean;
|
|
33
33
|
tileSize?: number;
|
|
34
34
|
getCanvas?: (imgSize: number) => HTMLCanvasElement;
|
|
35
35
|
};
|
|
36
|
-
export declare const makeTextureAtlas: ({ input, getLoadedImage, tileSize, getCanvas, }: AtlasCreatorOptions) => {
|
|
36
|
+
export declare const makeTextureAtlas: ({ input, getLoadedImage, tileSize, getCanvas, needHorizontalIndexes, }: AtlasCreatorOptions) => {
|
|
37
37
|
json: JsonAtlas;
|
|
38
38
|
canvas: HTMLCanvasElement;
|
|
39
39
|
};
|
package/dist/atlasCreator.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
//@ts-ignore
|
|
1
2
|
import { MaxRectsPacker, PACKING_LOGIC, Rectangle } from 'maxrects-packer';
|
|
2
3
|
export const MAX_CANVAS_SIZE = 16_384;
|
|
3
4
|
function nextPowerOfTwo(n) {
|
|
@@ -18,7 +19,7 @@ export const getAtlasSize = (numberOfTiles, tileSize) => {
|
|
|
18
19
|
height: size * tileSize
|
|
19
20
|
};
|
|
20
21
|
};
|
|
21
|
-
export const makeTextureAtlas = ({ input, getLoadedImage, tileSize = 16, getCanvas = (imgSize) => typeof document !== 'undefined' && document.createElement ? document.createElement('canvas') : new globalThis.Canvas(imgSize, imgSize, 'png'), }) => {
|
|
22
|
+
export const makeTextureAtlas = ({ input, getLoadedImage, tileSize = 16, getCanvas = (imgSize) => typeof document !== 'undefined' && document.createElement ? document.createElement('canvas') : new globalThis.Canvas(imgSize, imgSize, 'png'), needHorizontalIndexes = false, }) => {
|
|
22
23
|
// Pre-calculate all texture dimensions and prepare images
|
|
23
24
|
const texturesWithDimensions = [...new Set(input)].map(keyValue => {
|
|
24
25
|
const inputData = getLoadedImage(keyValue);
|
|
@@ -56,9 +57,10 @@ export const makeTextureAtlas = ({ input, getLoadedImage, tileSize = 16, getCanv
|
|
|
56
57
|
// Use MaxRectsPacker to calculate optimal positions
|
|
57
58
|
const packer = new MaxRectsPacker(undefined, undefined, 0, {
|
|
58
59
|
square: true,
|
|
59
|
-
smart: true,
|
|
60
60
|
pot: true,
|
|
61
|
-
|
|
61
|
+
...needHorizontalIndexes ? {} : { smart: true },
|
|
62
|
+
logic: needHorizontalIndexes ? PACKING_LOGIC.FILL_WIDTH : PACKING_LOGIC.MAX_AREA,
|
|
63
|
+
// logic: PACKING_LOGIC.FILL_WIDTH,
|
|
62
64
|
});
|
|
63
65
|
// Add all textures as rectangles
|
|
64
66
|
const rectangles = texturesWithDimensions.map(tex => {
|
package/dist/atlasParser.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { VersionedStore } from './versionedStore';
|
|
2
|
+
import { AtlasCreatorOptions } from './atlasCreator';
|
|
2
3
|
type Texture = {
|
|
3
4
|
u: number;
|
|
4
5
|
v: number;
|
|
@@ -33,8 +34,19 @@ export declare class AtlasParser {
|
|
|
33
34
|
atlasHasLegacyImage: boolean;
|
|
34
35
|
constructor(atlasJson: any, latestImage: string, legacyImage?: string | undefined);
|
|
35
36
|
get atlas(): ItemsAtlases;
|
|
36
|
-
getTextureInfo(itemName: string, version?: string):
|
|
37
|
-
|
|
37
|
+
getTextureInfo(itemName: string, version?: string): {
|
|
38
|
+
su: number;
|
|
39
|
+
sv: number;
|
|
40
|
+
/** @deprecated */
|
|
41
|
+
getLoadedImage: () => Promise<HTMLImageElement>;
|
|
42
|
+
getLoadedAtlasImage: () => Promise<HTMLImageElement>;
|
|
43
|
+
u: number;
|
|
44
|
+
v: number;
|
|
45
|
+
tileIndex: number;
|
|
46
|
+
imageType: "latest" | "legacy";
|
|
47
|
+
version: string;
|
|
48
|
+
} | undefined;
|
|
49
|
+
makeNewAtlas(version: string, getCustomImage?: (itemName: string) => DataUrl | HTMLImageElement | boolean | void, _unusedTileSize?: number, getTextureSortRankOrTopTextures?: string[] | ((key: string) => number), addTextures?: string[], options?: Pick<AtlasCreatorOptions, 'needHorizontalIndexes' | 'getCanvas'>): Promise<{
|
|
38
50
|
canvas: HTMLCanvasElement;
|
|
39
51
|
atlas: import("./atlasCreator").JsonAtlas;
|
|
40
52
|
readonly newAtlasParser: AtlasParser;
|
package/dist/atlasParser.js
CHANGED
|
@@ -40,12 +40,18 @@ export class AtlasParser {
|
|
|
40
40
|
...info,
|
|
41
41
|
su: info?.su ?? defaultSuSv,
|
|
42
42
|
sv: info?.sv ?? defaultSuSv,
|
|
43
|
+
/** @deprecated */
|
|
43
44
|
getLoadedImage: async () => {
|
|
44
45
|
return await getLoadedImage(info.imageType === 'latest' ? this.latestImage : this.legacyImage);
|
|
45
|
-
}
|
|
46
|
+
},
|
|
47
|
+
getLoadedAtlasImage: async () => {
|
|
48
|
+
return await getLoadedImage(info.imageType === 'latest' ? this.latestImage : this.legacyImage);
|
|
49
|
+
},
|
|
46
50
|
};
|
|
47
51
|
}
|
|
48
|
-
|
|
52
|
+
// getRenderedFullBlockSide(resolvedModel: ResolvedBlockModel, side: 'top' | 'bottom' | 'north' | 'south' | 'east' | 'west') {
|
|
53
|
+
// }
|
|
54
|
+
async makeNewAtlas(version, getCustomImage, _unusedTileSize = this.atlas.latest.tileSize, getTextureSortRankOrTopTextures, addTextures = [], options = {}) {
|
|
49
55
|
const itemsAtlases = this.atlasJson;
|
|
50
56
|
const newTextures = {};
|
|
51
57
|
const legacyImg = this.atlasHasLegacyImage ? await getLoadedImage(this.legacyImage) : null;
|
|
@@ -106,6 +112,7 @@ export class AtlasParser {
|
|
|
106
112
|
};
|
|
107
113
|
},
|
|
108
114
|
tileSize: this.atlas.latest.tileSize,
|
|
115
|
+
...options,
|
|
109
116
|
});
|
|
110
117
|
let _newAtlasParser;
|
|
111
118
|
return {
|
package/dist/itemsRenderer.d.ts
CHANGED
|
@@ -17,13 +17,7 @@ export declare class ItemsRenderer {
|
|
|
17
17
|
path: string;
|
|
18
18
|
} | undefined;
|
|
19
19
|
resolveBlockModel(model: any, blockName: string): {
|
|
20
|
-
resolvedModel:
|
|
21
|
-
x?: number;
|
|
22
|
-
y?: number;
|
|
23
|
-
z?: number;
|
|
24
|
-
uvlock?: boolean;
|
|
25
|
-
weight?: number;
|
|
26
|
-
};
|
|
20
|
+
resolvedModel: import("./types").ResolvedBlockModel;
|
|
27
21
|
readonly top: string;
|
|
28
22
|
readonly left: string;
|
|
29
23
|
readonly right: string;
|
|
@@ -55,13 +49,7 @@ export declare class ItemsRenderer {
|
|
|
55
49
|
/** @deprecated */
|
|
56
50
|
path: string;
|
|
57
51
|
} | {
|
|
58
|
-
resolvedModel:
|
|
59
|
-
x?: number;
|
|
60
|
-
y?: number;
|
|
61
|
-
z?: number;
|
|
62
|
-
uvlock?: boolean;
|
|
63
|
-
weight?: number;
|
|
64
|
-
};
|
|
52
|
+
resolvedModel: import("./types").ResolvedBlockModel;
|
|
65
53
|
readonly top: string;
|
|
66
54
|
readonly left: string;
|
|
67
55
|
readonly right: string;
|
package/dist/types.d.ts
CHANGED
|
@@ -58,6 +58,14 @@ export type BlockModel = {
|
|
|
58
58
|
ambientocclusion?: boolean;
|
|
59
59
|
ao?: boolean;
|
|
60
60
|
};
|
|
61
|
+
export type ResolvedBlockModel = Pick<BlockModel, 'textures' | 'elements' | 'ao'> & {
|
|
62
|
+
modelName: string;
|
|
63
|
+
x?: number;
|
|
64
|
+
y?: number;
|
|
65
|
+
z?: number;
|
|
66
|
+
uvlock?: boolean;
|
|
67
|
+
weight?: number;
|
|
68
|
+
};
|
|
61
69
|
type DisplayPresentation = {
|
|
62
70
|
rotation?: [number, number, number];
|
|
63
71
|
translation?: [number, number, number];
|
package/dist/versionedStore.d.ts
CHANGED
|
@@ -11,7 +11,7 @@ export declare class VersionedStore<T = string> {
|
|
|
11
11
|
get versionsSorted(): string[];
|
|
12
12
|
/** The order is important: from newest to oldest */
|
|
13
13
|
push(version: string, key: string, data: T): void;
|
|
14
|
-
get(version: string, key: string, inclusive?: boolean):
|
|
14
|
+
get(version: string, key: string, inclusive?: boolean): T | undefined;
|
|
15
15
|
semverToNumber(version: string): number;
|
|
16
16
|
loadData(data: typeof this.data): void;
|
|
17
17
|
}
|
|
@@ -1,16 +1,16 @@
|
|
|
1
1
|
import { QueriedBlock } from './assetsParser';
|
|
2
2
|
import { BlockModel } from './types';
|
|
3
3
|
export default function worldBlockProvider(blockstatesModels: any, blocksAtlas: any, version: string): {
|
|
4
|
-
getAllResolvedModels0_1(block: Omit<QueriedBlock, "stateId">, fallbackVariant?: boolean, possibleIssues?: string[], matchedModels?: string[], matchedConditions?: string[]): ({
|
|
4
|
+
getAllResolvedModels0_1(block: Omit<QueriedBlock, "stateId">, fallbackVariant?: boolean, possibleIssues?: string[], matchedModels?: string[], matchedConditions?: string[], partialElementsProcessing?: boolean): ({
|
|
5
5
|
elements: {
|
|
6
6
|
faces: {
|
|
7
7
|
[k: string]: {
|
|
8
8
|
texture: {
|
|
9
|
-
u:
|
|
10
|
-
v:
|
|
9
|
+
u: number;
|
|
10
|
+
v: number;
|
|
11
11
|
su: number;
|
|
12
12
|
sv: number;
|
|
13
|
-
tileIndex:
|
|
13
|
+
tileIndex: number;
|
|
14
14
|
debugName: string;
|
|
15
15
|
};
|
|
16
16
|
uv?: number[];
|
|
@@ -28,29 +28,17 @@ export default function worldBlockProvider(blockstatesModels: any, blocksAtlas:
|
|
|
28
28
|
rescale?: boolean;
|
|
29
29
|
};
|
|
30
30
|
}[];
|
|
31
|
-
} & Omit<
|
|
32
|
-
|
|
33
|
-
y?: number;
|
|
34
|
-
z?: number;
|
|
35
|
-
uvlock?: boolean;
|
|
36
|
-
weight?: number;
|
|
37
|
-
}, "textures" | "elements">)[][];
|
|
38
|
-
transformModel: <T extends BlockModel | (Pick<BlockModel, "textures" | "ao" | "elements"> & {
|
|
39
|
-
x?: number;
|
|
40
|
-
y?: number;
|
|
41
|
-
z?: number;
|
|
42
|
-
uvlock?: boolean;
|
|
43
|
-
weight?: number;
|
|
44
|
-
})>(model: T, block: Omit<QueriedBlock, "stateId">) => {
|
|
31
|
+
} & Omit<import("./types").ResolvedBlockModel, "textures" | "elements">)[][];
|
|
32
|
+
transformModel: <T extends BlockModel | import("./types").ResolvedBlockModel>(model: T, block: Omit<QueriedBlock, "stateId">, elementsProcessingIssues?: string[]) => {
|
|
45
33
|
elements: {
|
|
46
34
|
faces: {
|
|
47
35
|
[k: string]: {
|
|
48
36
|
texture: {
|
|
49
|
-
u:
|
|
50
|
-
v:
|
|
37
|
+
u: number;
|
|
38
|
+
v: number;
|
|
51
39
|
su: number;
|
|
52
40
|
sv: number;
|
|
53
|
-
tileIndex:
|
|
41
|
+
tileIndex: number;
|
|
54
42
|
debugName: string;
|
|
55
43
|
};
|
|
56
44
|
uv?: number[];
|
|
@@ -69,6 +57,16 @@ export default function worldBlockProvider(blockstatesModels: any, blocksAtlas:
|
|
|
69
57
|
};
|
|
70
58
|
}[];
|
|
71
59
|
} & Omit<T, "textures" | "elements">;
|
|
72
|
-
getTextureInfo: (textureName: string) =>
|
|
60
|
+
getTextureInfo: (textureName: string) => {
|
|
61
|
+
su: number;
|
|
62
|
+
sv: number;
|
|
63
|
+
getLoadedImage: () => Promise<HTMLImageElement>;
|
|
64
|
+
getLoadedAtlasImage: () => Promise<HTMLImageElement>;
|
|
65
|
+
u: number;
|
|
66
|
+
v: number;
|
|
67
|
+
tileIndex: number;
|
|
68
|
+
imageType: "latest" | "legacy";
|
|
69
|
+
version: string;
|
|
70
|
+
} | undefined;
|
|
73
71
|
};
|
|
74
72
|
export type WorldBlockProvider = ReturnType<typeof worldBlockProvider>;
|
|
@@ -9,55 +9,61 @@ export default function worldBlockProvider(blockstatesModels, blocksAtlas, versi
|
|
|
9
9
|
const getTextureInfo = (textureName) => {
|
|
10
10
|
return atlasParser.getTextureInfo(textureName.replace('block/', '').replace('blocks/', ''), version);
|
|
11
11
|
};
|
|
12
|
-
const transformModel = (model, block) => {
|
|
12
|
+
const transformModel = (model, block, elementsProcessingIssues) => {
|
|
13
13
|
const { elements, textures, ...rest } = model;
|
|
14
14
|
return {
|
|
15
15
|
// todo validate elements
|
|
16
|
-
elements: elements?.map((elem) => {
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
16
|
+
elements: elements?.map((elem, i) => {
|
|
17
|
+
try {
|
|
18
|
+
return {
|
|
19
|
+
...elem,
|
|
20
|
+
faces: Object.fromEntries(Object.entries(elem.faces).map(([faceName, face]) => {
|
|
21
|
+
const texture = face.texture;
|
|
22
|
+
if (!texture)
|
|
23
|
+
throw new Error(`Missing resolved texture ${texture} for face ${faceName} of ${block.name}`);
|
|
24
|
+
const finalTexture = getTextureInfo(texture);
|
|
25
|
+
if (!finalTexture)
|
|
26
|
+
throw new Error(`Missing texture data ${texture} for ${block.name}`);
|
|
27
|
+
const _from = elem.from;
|
|
28
|
+
const _to = elem.to;
|
|
29
|
+
// taken from https://github.com/DragonDev1906/Minecraft-Overviewer/
|
|
30
|
+
const COORDINATE_MAX = 16;
|
|
31
|
+
const uv = (face.uv || {
|
|
32
|
+
// default UVs
|
|
33
|
+
// format: [u1, v1, u2, v2] (u = x, v = y)
|
|
34
|
+
north: [_to[0], COORDINATE_MAX - _to[1], _from[0], COORDINATE_MAX - _from[1]],
|
|
35
|
+
east: [_from[2], COORDINATE_MAX - _to[1], _to[2], COORDINATE_MAX - _from[1]],
|
|
36
|
+
south: [_from[0], COORDINATE_MAX - _to[1], _to[0], COORDINATE_MAX - _from[1]],
|
|
37
|
+
west: [_from[2], COORDINATE_MAX - _to[1], _to[2], COORDINATE_MAX - _from[1]],
|
|
38
|
+
up: [_from[0], _from[2], _to[0], _to[2]],
|
|
39
|
+
down: [_to[0], _from[2], _from[0], _to[2]]
|
|
40
|
+
}[faceName]);
|
|
41
|
+
const su = (uv[2] - uv[0]) / COORDINATE_MAX * finalTexture.su;
|
|
42
|
+
const sv = (uv[3] - uv[1]) / COORDINATE_MAX * finalTexture.sv;
|
|
43
|
+
return [faceName, {
|
|
44
|
+
...face,
|
|
45
|
+
texture: {
|
|
46
|
+
u: finalTexture.u + uv[0] / 16 * finalTexture.su,
|
|
47
|
+
v: finalTexture.v + uv[1] / 16 * finalTexture.sv,
|
|
48
|
+
su,
|
|
49
|
+
sv,
|
|
50
|
+
tileIndex: finalTexture.tileIndex,
|
|
51
|
+
debugName: texture,
|
|
52
|
+
},
|
|
53
|
+
}];
|
|
54
|
+
}))
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
catch (e) {
|
|
58
|
+
elementsProcessingIssues?.push(`Error processing element ${i} in ${block.name}: ${e.message}`);
|
|
59
|
+
return null;
|
|
60
|
+
}
|
|
61
|
+
}).filter(a => a !== null),
|
|
56
62
|
...rest
|
|
57
63
|
};
|
|
58
64
|
};
|
|
59
65
|
return {
|
|
60
|
-
getAllResolvedModels0_1(block, fallbackVariant = false, possibleIssues = [], matchedModels = [], matchedConditions = []) {
|
|
66
|
+
getAllResolvedModels0_1(block, fallbackVariant = false, possibleIssues = [], matchedModels = [], matchedConditions = [], partialElementsProcessing = false) {
|
|
61
67
|
assetsParser.issues = [];
|
|
62
68
|
assetsParser.matchedModels = [];
|
|
63
69
|
assetsParser.matchedConditions = [];
|
|
@@ -74,7 +80,7 @@ export default function worldBlockProvider(blockstatesModels, blocksAtlas, versi
|
|
|
74
80
|
const result = modelsParts.map(modelVariants => {
|
|
75
81
|
return modelVariants.map(model => {
|
|
76
82
|
try {
|
|
77
|
-
return transformModel(model, block);
|
|
83
|
+
return transformModel(model, block, partialElementsProcessing ? possibleIssues : undefined);
|
|
78
84
|
}
|
|
79
85
|
catch (e) {
|
|
80
86
|
possibleIssues.push(`Error transforming model for ${block.name}: ${e.message}`);
|
package/package.json
CHANGED
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "mc-assets",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.51",
|
|
4
4
|
"author": "Vitaly Turovsky <vital2580@icloud.com>",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"files": [
|
|
7
7
|
"dist",
|
|
8
|
-
"docs-assets"
|
|
8
|
+
"docs-assets",
|
|
9
|
+
"temp-lib"
|
|
9
10
|
],
|
|
10
11
|
"main": "./dist/index.js",
|
|
11
12
|
"types": "./dist/index.d.ts",
|
|
@@ -53,7 +54,7 @@
|
|
|
53
54
|
"minecraft block entity"
|
|
54
55
|
],
|
|
55
56
|
"dependencies": {
|
|
56
|
-
"maxrects-packer": "
|
|
57
|
+
"maxrects-packer": "file:./temp-lib/zardoy-maxrects-packer-2.7.4.tgz",
|
|
57
58
|
"zod": "^3.24.1"
|
|
58
59
|
},
|
|
59
60
|
"repository": "https://github.com/zardoy/mc-assets",
|
|
Binary file
|