Skip to content

Extract special renderer models into json model files #50

@zardoy

Description

@zardoy

Hi! I'm using a very similar to your mcmeta lib for rendering blocks in my client that also provides assets but is published to npm (mc-assets). I also have these special render models but extracted into json instead (mainly copied from bluemap) but of course I would be happy to not maintain them and instead copy from some other source instead like yours. I wonder if it would be possible to extract model definitions from

import { mat4 } from 'gl-matrix'
import type { BlockState } from '../core/index.js'
import { Direction, Identifier } from '../core/index.js'
import { BlockColors } from './BlockColors.js'
import { BlockModel } from './BlockModel.js'
import { Cull } from './Cull.js'
import { Mesh } from './Mesh.js'
import type { TextureAtlasProvider } from './TextureAtlas.js'
function liquidRenderer(type: string, level: number, atlas: TextureAtlasProvider, cull: Cull, tintindex?: number) {
const y = cull['up'] ? 16 : [14.2, 12.5, 10.5, 9, 7, 5.3, 3.7, 1.9, 16, 16, 16, 16, 16, 16, 16, 16][level]
return new BlockModel(undefined, {
still: `block/${type}_still`,
flow: `block/${type}_flow`,
}, [{
from: [0, 0, 0],
to: [16, y, 16],
faces: {
up: { texture: '#still', tintindex, cullface: Direction.UP },
down: { texture: '#still', tintindex, cullface: Direction.DOWN },
north: { texture: '#flow', tintindex, cullface: Direction.NORTH },
east: { texture: '#flow', tintindex, cullface: Direction.EAST },
south: { texture: '#flow', tintindex, cullface: Direction.SOUTH },
west: { texture: '#flow', tintindex, cullface: Direction.WEST },
},
}]).getMesh(atlas, cull, BlockColors[type]?.({}))
}
export namespace SpecialRenderers {
export function chestRenderer(texture: Identifier) {
return (atlas: TextureAtlasProvider) => {
return new BlockModel(undefined, {
0: texture.withPrefix('entity/chest/').toString(),
}, [
{
from: [1, 0, 1],
to: [15, 10, 15],
faces: {
north: {uv: [10.5, 8.25, 14, 10.75], rotation: 180, texture: '#0'},
east: {uv: [7, 8.25, 10.5, 10.75], rotation: 180, texture: '#0'},
south: {uv: [3.5, 8.25, 7, 10.75], rotation: 180, texture: '#0'},
west: {uv: [0, 8.25, 3.5, 10.75], rotation: 180, texture: '#0'},
up: {uv: [7, 4.75, 10.5, 8.25], texture: '#0'},
down: {uv: [3.5, 4.75, 7, 8.25], texture: '#0'},
},
},
{
from: [1, 10, 1],
to: [15, 14, 15],
faces: {
north: {uv: [10.5, 3.75, 14, 4.75], rotation: 180, texture: '#0'},
east: {uv: [7, 3.75, 10.5, 4.75], rotation: 180, texture: '#0'},
south: {uv: [3.5, 3.75, 7, 4.75], rotation: 180, texture: '#0'},
west: {uv: [0, 3.75, 3.5, 4.75], rotation: 180, texture: '#0'},
up: {uv: [7, 0, 10.5, 3.5], texture: '#0'},
down: {uv: [3.5, 0, 7, 3.5], texture: '#0'},
},
},
{
from: [7, 7, 0],
to: [9, 11, 2],
faces: {
north: {uv: [0.25, 0.25, 0.75, 1.25], rotation: 180, texture: '#0'},
east: {uv: [0, 0.25, 0.25, 1.25], rotation: 180, texture: '#0'},
south: {uv: [1, 0.25, 1.5, 1.25], rotation: 180, texture: '#0'},
west: {uv: [0.75, 0.25, 1, 1.25], rotation: 180, texture: '#0'},
up: {uv: [0.25, 0, 0.75, 0.25], rotation: 180, texture: '#0'},
down: {uv: [0.75, 0, 1.25, 0.25], rotation: 180, texture: '#0'},
},
},
]).getMesh(atlas, Cull.none())
}
}
export function decoratedPotRenderer(atlas: TextureAtlasProvider) {
return new BlockModel(undefined, {
0: 'entity/decorated_pot/decorated_pot_side',
1: 'entity/decorated_pot/decorated_pot_base',
}, [
{
from: [1, 0, 1],
to: [15, 16, 15],
faces: {
north: {uv: [1, 0, 15, 16], texture: '#0'},
east: {uv: [1, 0, 15, 16], texture: '#0'},
south: {uv: [1, 0, 15, 16], texture: '#0'},
west: {uv: [1, 0, 15, 16], texture: '#0'},
up: {uv: [0, 6.5, 7, 13.5], texture: '#1'},
down: {uv: [7, 6.5, 14, 13.5], texture: '#1'},
},
},
{
from: [5, 16, 5],
to: [11, 17, 11],
faces: {
north: {uv: [0, 5.5, 3, 6], texture: '#1'},
east: {uv: [3, 5.5, 6, 6], texture: '#1'},
south: {uv: [6, 5.5, 9, 6], texture: '#1'},
west: {uv: [9, 5.5, 12, 6], texture: '#1'},
into json model files to align the renderer pipeline with other block models? I can imagine making a generator for them and storing them in mcmeta. Then I'd be happy to help with making blocks like end portal/gateway once I figure out how to use it with Three.js;)

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions