Skip to content

Commit a5ed494

Browse files
committed
Add shulker box
1 parent ac90d00 commit a5ed494

File tree

1 file changed

+71
-8
lines changed

1 file changed

+71
-8
lines changed

src/render/SpecialRenderer.ts

+71-8
Original file line numberDiff line numberDiff line change
@@ -375,6 +375,40 @@ function conduitRenderer(atlas: TextureAtlasProvider) {
375375
]).withUvEpsilon(1/128))
376376
}
377377

378+
function shulkerBoxRenderer(color: string) {
379+
return (atlas: TextureAtlasProvider) => {
380+
const id = Identifier.create('shulker_box')
381+
return dummy(id, atlas, {}, new BlockModel(id, undefined, {
382+
0: `entity/shulker/shulker_${color}`,
383+
}, [
384+
{
385+
from: [0, 0, 0],
386+
to: [16, 8, 16],
387+
faces: {
388+
north: {uv: [4, 11, 8, 13], texture: '#0'},
389+
east: {uv: [0, 11, 4, 13], texture: '#0'},
390+
south: {uv: [12, 11, 16, 13], texture: '#0'},
391+
west: {uv: [8, 11, 12, 13], texture: '#0'},
392+
up: {uv: [8, 11, 4, 7], texture: '#0'},
393+
down: {uv: [12, 7, 8, 11], texture: '#0'},
394+
},
395+
},
396+
{
397+
from: [0, 4, 0],
398+
to: [16, 16, 16],
399+
faces: {
400+
north: {uv: [4, 4, 8, 7], texture: '#0'},
401+
east: {uv: [0, 4, 4, 7], texture: '#0'},
402+
south: {uv: [12, 4, 16, 7], texture: '#0'},
403+
west: {uv: [8, 4, 12, 7], texture: '#0'},
404+
up: {uv: [8, 4, 4, 0], texture: '#0'},
405+
down: {uv: [12, 0, 8, 4], texture: '#0'},
406+
},
407+
},
408+
]).withUvEpsilon(1/128))
409+
}
410+
}
411+
378412
function getStr(block: BlockState, key: string, fallback = '') {
379413
return block.getProperty(key) ?? fallback
380414
}
@@ -427,6 +461,25 @@ const WallSignRenderers = new Map(Object.entries({
427461
'minecraft:warped_wall_sign': wallSignRenderer('warped'),
428462
}))
429463

464+
const ShulkerBoxRenderers = new Map(Object.entries({
465+
'minecraft:white_shulker_box': shulkerBoxRenderer('white'),
466+
'minecraft:orange_shulker_box': shulkerBoxRenderer('orange'),
467+
'minecraft:magenta_shulker_box': shulkerBoxRenderer('magenta'),
468+
'minecraft:light_blue_shulker_box': shulkerBoxRenderer('light_blue'),
469+
'minecraft:yellow_shulker_box': shulkerBoxRenderer('yellow'),
470+
'minecraft:lime_shulker_box': shulkerBoxRenderer('lime'),
471+
'minecraft:pink_shulker_box': shulkerBoxRenderer('pink'),
472+
'minecraft:gray_shulker_box': shulkerBoxRenderer('gray'),
473+
'minecraft:light_gray_shulker_box': shulkerBoxRenderer('light_gray'),
474+
'minecraft:cyan_shulker_box': shulkerBoxRenderer('cyan'),
475+
'minecraft:purple_shulker_box': shulkerBoxRenderer('purple'),
476+
'minecraft:blue_shulker_box': shulkerBoxRenderer('blue'),
477+
'minecraft:brown_shulker_box': shulkerBoxRenderer('brown'),
478+
'minecraft:green_shulker_box': shulkerBoxRenderer('green'),
479+
'minecraft:red_shulker_box': shulkerBoxRenderer('red'),
480+
'minecraft:black_shulker_box': shulkerBoxRenderer('black'),
481+
}))
482+
430483
export namespace SpecialRenderers {
431484
export function getBlockMesh(block: BlockState, atlas: TextureAtlasProvider, cull: Cull): Mesh {
432485
if (block.is('water')) {
@@ -438,52 +491,62 @@ export namespace SpecialRenderers {
438491
const mesh = new Mesh()
439492
const chestRenderer = ChestRenderers.get(block.getName().toString())
440493
if (chestRenderer !== undefined) {
441-
const chestMesh = chestRenderer(atlas)
442494
const facing = getStr(block, 'facing', 'south')
443495
const t = mat4.create()
444496
mat4.translate(t, t, [0.5, 0.5, 0.5])
445497
mat4.rotateY(t, t, facing === 'west' ? Math.PI / 2 : facing === 'south' ? Math.PI : facing === 'east' ? Math.PI * 3 / 2 : 0)
446498
mat4.translate(t, t, [-0.5, -0.5, -0.5])
447-
mesh.merge(chestMesh.transform(t))
499+
mesh.merge(chestRenderer(atlas).transform(t))
448500
}
449501
if (block.is('decorated_pot')) {
450502
mesh.merge(decoratedPotRenderer(atlas))
451503
}
452504
const skullRenderer = SkullRenderers.get(block.getName().toString())
453505
if (skullRenderer !== undefined) {
454-
const skullMesh = skullRenderer(atlas)
455506
const rotation = getInt(block, 'rotation') / 16 * Math.PI * 2
456507
const t = mat4.create()
457508
mat4.translate(t, t, [0.5, 0.5, 0.5])
458509
mat4.rotateY(t, t, rotation)
459510
mat4.translate(t, t, [-0.5, -0.5, -0.5])
460-
mesh.merge(skullMesh.transform(t))
511+
mesh.merge(skullRenderer(atlas).transform(t))
461512
}
462513
const signRenderer = SignRenderers.get(block.getName().toString())
463514
if (signRenderer !== undefined) {
464-
const signMesh = signRenderer(atlas)
465515
const rotation = getInt(block, 'rotation') / 16 * Math.PI * 2
466516
const t = mat4.create()
467517
mat4.translate(t, t, [0.5, 0.5, 0.5])
468518
mat4.rotateY(t, t, rotation)
469519
mat4.scale(t, t, [2/3, 2/3, 2/3])
470520
mat4.translate(t, t, [-0.5, -0.5, -0.5])
471-
mesh.merge(signMesh.transform(t))
521+
mesh.merge(signRenderer(atlas).transform(t))
472522
}
473523
const wallSignRenderer = WallSignRenderers.get(block.getName().toString())
474524
if (wallSignRenderer !== undefined) {
475-
const wallSignMesh = wallSignRenderer(atlas)
476525
const facing = getStr(block, 'facing', 'south')
477526
const t = mat4.create()
478527
mat4.translate(t, t, [0.5, 0.5, 0.5])
479528
mat4.rotateY(t, t, facing === 'west' ? Math.PI / 2 : facing === 'south' ? Math.PI : facing === 'east' ? Math.PI * 3 / 2 : 0)
480529
mat4.scale(t, t, [2/3, 2/3, 2/3])
481530
mat4.translate(t, t, [-0.5, -0.5, -0.5])
482-
mesh.merge(wallSignMesh.transform(t))
531+
mesh.merge(wallSignRenderer(atlas).transform(t))
483532
}
484533
if (block.is('conduit')) {
485534
mesh.merge(conduitRenderer(atlas))
486535
}
536+
const shulkerBoxRenderer = ShulkerBoxRenderers.get(block.getName().toString())
537+
if (shulkerBoxRenderer !== undefined) {
538+
const facing = getStr(block, 'facing', 'up')
539+
const t = mat4.create()
540+
mat4.translate(t, t, [0.5, 0.5, 0.5])
541+
if (facing === 'down') {
542+
mat4.rotateX(t, t, Math.PI)
543+
} else if (facing !== 'up') {
544+
mat4.rotateY(t, t, facing === 'east' ? Math.PI / 2 : facing === 'north' ? Math.PI : facing === 'west' ? Math.PI * 3 / 2 : 0)
545+
mat4.rotateX(t, t, Math.PI/2)
546+
}
547+
mat4.translate(t, t, [-0.5, -0.5, -0.5])
548+
mesh.merge(shulkerBoxRenderer(atlas).transform(t))
549+
}
487550

488551
if (block.getProperties()['waterlogged'] === 'true') {
489552
mesh.merge(liquidRenderer('water', 0, atlas, cull, 0))

0 commit comments

Comments
 (0)