mc-assets 0.1.0 → 0.1.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/README.MD +130 -2
- package/dist/{parser.d.ts → assetsParser.d.ts} +15 -3
- package/dist/{parser.js → assetsParser.js} +26 -13
- package/dist/atlasCreator.js +4 -0
- package/dist/atlasParser.d.ts +8 -3
- package/dist/atlasParser.js +20 -7
- package/dist/blockStatesModels.json +803 -2522
- package/dist/blocksAtlasLatest.png +0 -0
- package/dist/blocksAtlases.json +1353 -1348
- package/dist/index.d.ts +1 -1
- package/dist/index.js +1 -1
- package/dist/itemsRenderer.d.ts +63 -0
- package/dist/itemsRenderer.js +78 -0
- package/dist/types.d.ts +8 -0
- package/dist/worldBlockProvider.d.ts +22 -11
- package/dist/worldBlockProvider.js +11 -14
- package/docs-assets/mc-assets.png +0 -0
- package/package.json +8 -6
- package/dist/itemsProvider.d.ts +0 -6
- package/dist/itemsProvider.js +0 -12
package/dist/index.d.ts
CHANGED
|
@@ -2,4 +2,4 @@ export * from './stores';
|
|
|
2
2
|
export { AtlasParser } from './atlasParser';
|
|
3
3
|
export { makeTextureAtlas, JsonAtlas } from './atlasCreator';
|
|
4
4
|
export * from './types';
|
|
5
|
-
export { AssetsParser, BlockElement, QueriedBlock } from './
|
|
5
|
+
export { AssetsParser, BlockElement, QueriedBlock } from './assetsParser';
|
package/dist/index.js
CHANGED
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { AtlasParser } from './atlasParser';
|
|
2
|
+
import { AssetsParser } from './assetsParser';
|
|
3
|
+
import { BlockModelsStore, BlockStatesStore } from './stores';
|
|
4
|
+
export declare class ItemsRenderer {
|
|
5
|
+
version: string;
|
|
6
|
+
itemsAtlasParser: AtlasParser;
|
|
7
|
+
blocksAtlasParser?: AtlasParser | undefined;
|
|
8
|
+
blockStatesStore: BlockStatesStore;
|
|
9
|
+
modelsStore: BlockModelsStore;
|
|
10
|
+
assetsParser: AssetsParser;
|
|
11
|
+
constructor(version: string, blockstatesModels: any, itemsAtlasParser: AtlasParser, blocksAtlasParser?: AtlasParser | undefined);
|
|
12
|
+
resolveTexture(texture: string): {
|
|
13
|
+
slice: [number, number, number, number];
|
|
14
|
+
/** @deprecated */
|
|
15
|
+
path: string;
|
|
16
|
+
type: string;
|
|
17
|
+
};
|
|
18
|
+
tryGetFullBlock(blockName: string, properties?: Record<string, string | boolean>): {
|
|
19
|
+
top: {
|
|
20
|
+
slice: [number, number, number, number];
|
|
21
|
+
/** @deprecated */
|
|
22
|
+
path: string;
|
|
23
|
+
type: string;
|
|
24
|
+
};
|
|
25
|
+
left: {
|
|
26
|
+
slice: [number, number, number, number];
|
|
27
|
+
/** @deprecated */
|
|
28
|
+
path: string;
|
|
29
|
+
type: string;
|
|
30
|
+
};
|
|
31
|
+
right: {
|
|
32
|
+
slice: [number, number, number, number];
|
|
33
|
+
/** @deprecated */
|
|
34
|
+
path: string;
|
|
35
|
+
type: string;
|
|
36
|
+
};
|
|
37
|
+
} | undefined;
|
|
38
|
+
getItemTexture(itemName: string, properties?: Record<string, string | boolean>): {
|
|
39
|
+
slice: [number, number, number, number];
|
|
40
|
+
/** @deprecated */
|
|
41
|
+
path: string;
|
|
42
|
+
type: string;
|
|
43
|
+
} | {
|
|
44
|
+
top: {
|
|
45
|
+
slice: [number, number, number, number];
|
|
46
|
+
/** @deprecated */
|
|
47
|
+
path: string;
|
|
48
|
+
type: string;
|
|
49
|
+
};
|
|
50
|
+
left: {
|
|
51
|
+
slice: [number, number, number, number];
|
|
52
|
+
/** @deprecated */
|
|
53
|
+
path: string;
|
|
54
|
+
type: string;
|
|
55
|
+
};
|
|
56
|
+
right: {
|
|
57
|
+
slice: [number, number, number, number];
|
|
58
|
+
/** @deprecated */
|
|
59
|
+
path: string;
|
|
60
|
+
type: string;
|
|
61
|
+
};
|
|
62
|
+
} | undefined;
|
|
63
|
+
}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import { AssetsParser } from './assetsParser';
|
|
2
|
+
import { getLoadedBlockstatesStore, getLoadedModelsStore } from './stores';
|
|
3
|
+
export class ItemsRenderer {
|
|
4
|
+
version;
|
|
5
|
+
itemsAtlasParser;
|
|
6
|
+
blocksAtlasParser;
|
|
7
|
+
blockStatesStore;
|
|
8
|
+
modelsStore;
|
|
9
|
+
assetsParser;
|
|
10
|
+
constructor(version, blockstatesModels, itemsAtlasParser, blocksAtlasParser) {
|
|
11
|
+
this.version = version;
|
|
12
|
+
this.itemsAtlasParser = itemsAtlasParser;
|
|
13
|
+
this.blocksAtlasParser = blocksAtlasParser;
|
|
14
|
+
this.blockStatesStore = getLoadedBlockstatesStore(blockstatesModels);
|
|
15
|
+
this.modelsStore = getLoadedModelsStore(blockstatesModels);
|
|
16
|
+
this.assetsParser = new AssetsParser(version, this.blockStatesStore, this.modelsStore);
|
|
17
|
+
}
|
|
18
|
+
resolveTexture(texture) {
|
|
19
|
+
const atlasParser = texture.startsWith('block/') ? this.blocksAtlasParser : this.itemsAtlasParser;
|
|
20
|
+
const type = texture.startsWith('block/') ? 'blocks' : 'items';
|
|
21
|
+
const textureInfo = atlasParser.getTextureInfo(texture.replace('block/', '').replace('item/', ''), this.version);
|
|
22
|
+
const atlas = atlasParser.atlas[textureInfo.imageType];
|
|
23
|
+
return {
|
|
24
|
+
slice: [
|
|
25
|
+
textureInfo.u * atlas.width,
|
|
26
|
+
textureInfo.v * atlas.height,
|
|
27
|
+
textureInfo.su * atlas.width,
|
|
28
|
+
textureInfo.sv * atlas.height
|
|
29
|
+
],
|
|
30
|
+
/** @deprecated */
|
|
31
|
+
path: type,
|
|
32
|
+
type: type
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
tryGetFullBlock(blockName, properties = {}) {
|
|
36
|
+
if (!this.blocksAtlasParser)
|
|
37
|
+
return;
|
|
38
|
+
const resolvedModel = this.assetsParser.getResolvedModel({
|
|
39
|
+
name: blockName,
|
|
40
|
+
properties,
|
|
41
|
+
}, true);
|
|
42
|
+
if (resolvedModel.elements?.length !== 1)
|
|
43
|
+
return;
|
|
44
|
+
const elem = resolvedModel.elements[0];
|
|
45
|
+
if (elem.from[0] !== 0 || elem.from[1] !== 0 || elem.from[2] !== 0)
|
|
46
|
+
return;
|
|
47
|
+
if (elem.to[0] !== 16 || elem.to[1] !== 16 || elem.to[2] !== 16)
|
|
48
|
+
return;
|
|
49
|
+
const topTexture = elem.faces.up?.texture ?? elem.faces.top?.texture;
|
|
50
|
+
const leftTexture = elem.faces.east?.texture ?? elem.faces.left?.texture ?? elem.faces.side?.texture;
|
|
51
|
+
const rightTexture = elem.faces.north?.texture ?? elem.faces.right?.texture ?? elem.faces.side?.texture;
|
|
52
|
+
return {
|
|
53
|
+
top: this.resolveTexture(topTexture),
|
|
54
|
+
left: this.resolveTexture(leftTexture),
|
|
55
|
+
right: this.resolveTexture(rightTexture),
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
getItemTexture(itemName, properties = {}) {
|
|
59
|
+
let model;
|
|
60
|
+
if (itemName.includes('/')) {
|
|
61
|
+
model = this.modelsStore.get(this.version, itemName);
|
|
62
|
+
}
|
|
63
|
+
else {
|
|
64
|
+
model = this.modelsStore.get(this.version, `item/${itemName}`);
|
|
65
|
+
if (!model || model.parent?.startsWith('block/')) {
|
|
66
|
+
return this.tryGetFullBlock(itemName, properties);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
if (!model)
|
|
70
|
+
return;
|
|
71
|
+
const layer0 = model.textures?.layer0;
|
|
72
|
+
if (!layer0)
|
|
73
|
+
return;
|
|
74
|
+
return this.resolveTexture(layer0);
|
|
75
|
+
// const {resolvedModel} = this.assetsParser.getResolvedModelByModelName('item/' + itemName, itemName) ?? {}
|
|
76
|
+
// resolvedModel?.textures['layer0']
|
|
77
|
+
}
|
|
78
|
+
}
|
package/dist/types.d.ts
CHANGED
|
@@ -34,11 +34,19 @@ export type BlockModel = {
|
|
|
34
34
|
elements?: {
|
|
35
35
|
from: BlockElementPos;
|
|
36
36
|
to: BlockElementPos;
|
|
37
|
+
rotation?: {
|
|
38
|
+
origin: [number, number, number];
|
|
39
|
+
axis: string;
|
|
40
|
+
angle: number;
|
|
41
|
+
rescale?: boolean;
|
|
42
|
+
};
|
|
37
43
|
faces: {
|
|
38
44
|
[name: string]: {
|
|
39
45
|
texture: string;
|
|
40
46
|
uv?: number[];
|
|
41
47
|
cullface?: string;
|
|
48
|
+
rotation?: number;
|
|
49
|
+
tintindex?: number;
|
|
42
50
|
};
|
|
43
51
|
};
|
|
44
52
|
}[];
|
|
@@ -1,9 +1,11 @@
|
|
|
1
|
-
import { QueriedBlock } from './
|
|
1
|
+
import { QueriedBlock } from './assetsParser';
|
|
2
2
|
export default function worldBlockProvider(blockstatesModels: any, blocksAtlas: any, version: string): {
|
|
3
3
|
getResolvedModel0_1(block: Omit<QueriedBlock, "stateId">, fallbackVariant?: boolean): {
|
|
4
|
+
x?: number;
|
|
5
|
+
y?: number;
|
|
6
|
+
z?: number;
|
|
7
|
+
ao?: boolean;
|
|
4
8
|
elements: {
|
|
5
|
-
from: import("./types").BlockElementPos;
|
|
6
|
-
to: import("./types").BlockElementPos;
|
|
7
9
|
faces: {
|
|
8
10
|
[k: string]: {
|
|
9
11
|
texture: {
|
|
@@ -11,24 +13,33 @@ export default function worldBlockProvider(blockstatesModels: any, blocksAtlas:
|
|
|
11
13
|
v: number;
|
|
12
14
|
su: number;
|
|
13
15
|
sv: number;
|
|
14
|
-
|
|
15
|
-
|
|
16
|
+
tileIndex: number;
|
|
17
|
+
debugName: string;
|
|
16
18
|
};
|
|
17
|
-
|
|
19
|
+
uv?: number[];
|
|
20
|
+
cullface?: string;
|
|
21
|
+
rotation?: number;
|
|
22
|
+
tintindex?: number;
|
|
18
23
|
};
|
|
19
24
|
};
|
|
25
|
+
from: import("./types").BlockElementPos;
|
|
26
|
+
to: import("./types").BlockElementPos;
|
|
27
|
+
rotation?: {
|
|
28
|
+
origin: [number, number, number];
|
|
29
|
+
axis: string;
|
|
30
|
+
angle: number;
|
|
31
|
+
rescale?: boolean;
|
|
32
|
+
};
|
|
20
33
|
}[] | undefined;
|
|
21
|
-
ao: boolean | undefined;
|
|
22
|
-
x: number | undefined;
|
|
23
|
-
y: number | undefined;
|
|
24
|
-
z: number | undefined;
|
|
25
34
|
};
|
|
26
35
|
getTextureInfo(textureName: string): {
|
|
27
36
|
su: number;
|
|
28
37
|
sv: number;
|
|
38
|
+
getLoadedImage: () => Promise<HTMLImageElement>;
|
|
29
39
|
u: number;
|
|
30
40
|
v: number;
|
|
31
|
-
|
|
41
|
+
tileIndex: number;
|
|
42
|
+
imageType: "latest" | "legacy";
|
|
32
43
|
version: string;
|
|
33
44
|
} | undefined;
|
|
34
45
|
};
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { AtlasParser } from './atlasParser';
|
|
2
|
-
import { AssetsParser } from './
|
|
2
|
+
import { AssetsParser } from './assetsParser';
|
|
3
3
|
import { getLoadedBlockstatesStore, getLoadedModelsStore } from './stores';
|
|
4
4
|
export default function worldBlockProvider(blockstatesModels, blocksAtlas, version) {
|
|
5
5
|
const blockStatesStore = getLoadedBlockstatesStore(blockstatesModels);
|
|
@@ -10,15 +10,14 @@ export default function worldBlockProvider(blockstatesModels, blocksAtlas, versi
|
|
|
10
10
|
getResolvedModel0_1(block, fallbackVariant = false) {
|
|
11
11
|
const model = assetsParser.getResolvedModel(block, fallbackVariant);
|
|
12
12
|
const interestedFaces = ['north', 'east', 'south', 'west', 'up', 'down'];
|
|
13
|
+
const { elements, textures, ...rest } = model;
|
|
13
14
|
return {
|
|
14
15
|
// todo validate elements
|
|
15
|
-
elements:
|
|
16
|
+
elements: elements?.map((elem) => {
|
|
16
17
|
return {
|
|
17
|
-
|
|
18
|
-
to: elem.to,
|
|
18
|
+
...elem,
|
|
19
19
|
faces: Object.fromEntries(Object.entries(elem.faces).map(([faceName, face]) => {
|
|
20
|
-
const texture =
|
|
21
|
-
// TODO validate at the validation stage
|
|
20
|
+
const texture = face.texture;
|
|
22
21
|
if (!texture)
|
|
23
22
|
throw new Error(`Missing resolved texture ${texture} for face ${faceName} of ${block.name}`);
|
|
24
23
|
const finalTexture = this.getTextureInfo(texture);
|
|
@@ -41,26 +40,24 @@ export default function worldBlockProvider(blockstatesModels, blocksAtlas, versi
|
|
|
41
40
|
const su = (uv[2] - uv[0]) / COORDINATE_MAX * finalTexture.su;
|
|
42
41
|
const sv = (uv[3] - uv[1]) / COORDINATE_MAX * finalTexture.sv;
|
|
43
42
|
return [faceName, {
|
|
43
|
+
...face,
|
|
44
44
|
texture: {
|
|
45
|
-
...finalTexture,
|
|
46
45
|
u: finalTexture.u + uv[0] / 16 * finalTexture.su,
|
|
47
46
|
v: finalTexture.v + uv[1] / 16 * finalTexture.sv,
|
|
48
47
|
su,
|
|
49
|
-
sv
|
|
48
|
+
sv,
|
|
49
|
+
tileIndex: finalTexture.tileIndex,
|
|
50
|
+
debugName: texture,
|
|
50
51
|
},
|
|
51
|
-
cullface: face.cullface
|
|
52
52
|
}];
|
|
53
53
|
}))
|
|
54
54
|
};
|
|
55
55
|
}),
|
|
56
|
-
|
|
57
|
-
x: model.x,
|
|
58
|
-
y: model.y,
|
|
59
|
-
z: model.z,
|
|
56
|
+
...rest
|
|
60
57
|
};
|
|
61
58
|
},
|
|
62
59
|
getTextureInfo(textureName) {
|
|
63
|
-
return atlasParser.getTextureInfo(
|
|
60
|
+
return atlasParser.getTextureInfo(textureName.replace('block/', ''), version);
|
|
64
61
|
}
|
|
65
62
|
};
|
|
66
63
|
}
|
|
Binary file
|
package/package.json
CHANGED
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "mc-assets",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.2",
|
|
4
4
|
"author": "Vitaly Turovsky <vital2580@icloud.com>",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"files": [
|
|
7
|
-
"dist"
|
|
7
|
+
"dist",
|
|
8
|
+
"docs-assets"
|
|
8
9
|
],
|
|
9
10
|
"main": "./dist/index.js",
|
|
10
11
|
"types": "./dist/index.d.ts",
|
|
@@ -31,6 +32,9 @@
|
|
|
31
32
|
"version": "0.1.0"
|
|
32
33
|
}
|
|
33
34
|
},
|
|
35
|
+
"engines": {
|
|
36
|
+
"node": ">=18.0.0"
|
|
37
|
+
},
|
|
34
38
|
"keywords": [
|
|
35
39
|
"minecraft",
|
|
36
40
|
"assets",
|
|
@@ -47,13 +51,11 @@
|
|
|
47
51
|
"minecraft extracter"
|
|
48
52
|
],
|
|
49
53
|
"repository": "https://github.com/zardoy/mc-assets",
|
|
50
|
-
"engines": {
|
|
51
|
-
"node": "^12.20.0 || ^14.13.1 || >=16.0.0"
|
|
52
|
-
},
|
|
53
54
|
"scripts": {
|
|
54
|
-
"build": "tsx src/datapaths-builder.ts && tsx src/newAssetsBuilder.ts && tsx src/genItems.ts && tsx src/genParticles.ts && tsx src/genBlocks.ts && tsx src/copyOtherTextures.ts && tsx src/compressImages.ts && pnpm type-check && pnpm build-consumer && pnpm build-web && tsx src/buildEndChecks.ts",
|
|
55
|
+
"build": "tsx src/datapaths-builder.ts && tsx src/newAssetsBuilder.ts && tsx src/genItems.ts && tsx src/genParticles.ts && tsx src/genBlocks.ts && tsx src/copyOtherTextures.ts && tsx src/compressImages.ts && pnpm type-check && pnpm build-consumer && pnpm build-web && tsx src/buildEndChecks.ts && tsx src/changeReadme.ts",
|
|
55
56
|
"type-check": "tsc --noEmit",
|
|
56
57
|
"build-consumer": "tsc -p tsconfig.consumer.json",
|
|
58
|
+
"watch-dist": "tsc -p tsconfig.consumer.json -w",
|
|
57
59
|
"build-web": "cd web-demo/ && pnpm build"
|
|
58
60
|
}
|
|
59
61
|
}
|
package/dist/itemsProvider.d.ts
DELETED
package/dist/itemsProvider.js
DELETED
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
// todo
|
|
2
|
-
export class ItemsProvider {
|
|
3
|
-
version;
|
|
4
|
-
itemsModelsLatest;
|
|
5
|
-
constructor(version, itemsModelsLatest) {
|
|
6
|
-
this.version = version;
|
|
7
|
-
this.itemsModelsLatest = itemsModelsLatest;
|
|
8
|
-
}
|
|
9
|
-
getItemTexture(itemName) {
|
|
10
|
-
// return this.itemsAtlases[this.version][itemName]
|
|
11
|
-
}
|
|
12
|
-
}
|