@@ -375,6 +375,40 @@ function conduitRenderer(atlas: TextureAtlasProvider) {
375
375
] ) . withUvEpsilon ( 1 / 128 ) )
376
376
}
377
377
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
+
378
412
function getStr ( block : BlockState , key : string , fallback = '' ) {
379
413
return block . getProperty ( key ) ?? fallback
380
414
}
@@ -427,6 +461,25 @@ const WallSignRenderers = new Map(Object.entries({
427
461
'minecraft:warped_wall_sign' : wallSignRenderer ( 'warped' ) ,
428
462
} ) )
429
463
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
+
430
483
export namespace SpecialRenderers {
431
484
export function getBlockMesh ( block : BlockState , atlas : TextureAtlasProvider , cull : Cull ) : Mesh {
432
485
if ( block . is ( 'water' ) ) {
@@ -438,52 +491,62 @@ export namespace SpecialRenderers {
438
491
const mesh = new Mesh ( )
439
492
const chestRenderer = ChestRenderers . get ( block . getName ( ) . toString ( ) )
440
493
if ( chestRenderer !== undefined ) {
441
- const chestMesh = chestRenderer ( atlas )
442
494
const facing = getStr ( block , 'facing' , 'south' )
443
495
const t = mat4 . create ( )
444
496
mat4 . translate ( t , t , [ 0.5 , 0.5 , 0.5 ] )
445
497
mat4 . rotateY ( t , t , facing === 'west' ? Math . PI / 2 : facing === 'south' ? Math . PI : facing === 'east' ? Math . PI * 3 / 2 : 0 )
446
498
mat4 . translate ( t , t , [ - 0.5 , - 0.5 , - 0.5 ] )
447
- mesh . merge ( chestMesh . transform ( t ) )
499
+ mesh . merge ( chestRenderer ( atlas ) . transform ( t ) )
448
500
}
449
501
if ( block . is ( 'decorated_pot' ) ) {
450
502
mesh . merge ( decoratedPotRenderer ( atlas ) )
451
503
}
452
504
const skullRenderer = SkullRenderers . get ( block . getName ( ) . toString ( ) )
453
505
if ( skullRenderer !== undefined ) {
454
- const skullMesh = skullRenderer ( atlas )
455
506
const rotation = getInt ( block , 'rotation' ) / 16 * Math . PI * 2
456
507
const t = mat4 . create ( )
457
508
mat4 . translate ( t , t , [ 0.5 , 0.5 , 0.5 ] )
458
509
mat4 . rotateY ( t , t , rotation )
459
510
mat4 . translate ( t , t , [ - 0.5 , - 0.5 , - 0.5 ] )
460
- mesh . merge ( skullMesh . transform ( t ) )
511
+ mesh . merge ( skullRenderer ( atlas ) . transform ( t ) )
461
512
}
462
513
const signRenderer = SignRenderers . get ( block . getName ( ) . toString ( ) )
463
514
if ( signRenderer !== undefined ) {
464
- const signMesh = signRenderer ( atlas )
465
515
const rotation = getInt ( block , 'rotation' ) / 16 * Math . PI * 2
466
516
const t = mat4 . create ( )
467
517
mat4 . translate ( t , t , [ 0.5 , 0.5 , 0.5 ] )
468
518
mat4 . rotateY ( t , t , rotation )
469
519
mat4 . scale ( t , t , [ 2 / 3 , 2 / 3 , 2 / 3 ] )
470
520
mat4 . translate ( t , t , [ - 0.5 , - 0.5 , - 0.5 ] )
471
- mesh . merge ( signMesh . transform ( t ) )
521
+ mesh . merge ( signRenderer ( atlas ) . transform ( t ) )
472
522
}
473
523
const wallSignRenderer = WallSignRenderers . get ( block . getName ( ) . toString ( ) )
474
524
if ( wallSignRenderer !== undefined ) {
475
- const wallSignMesh = wallSignRenderer ( atlas )
476
525
const facing = getStr ( block , 'facing' , 'south' )
477
526
const t = mat4 . create ( )
478
527
mat4 . translate ( t , t , [ 0.5 , 0.5 , 0.5 ] )
479
528
mat4 . rotateY ( t , t , facing === 'west' ? Math . PI / 2 : facing === 'south' ? Math . PI : facing === 'east' ? Math . PI * 3 / 2 : 0 )
480
529
mat4 . scale ( t , t , [ 2 / 3 , 2 / 3 , 2 / 3 ] )
481
530
mat4 . translate ( t , t , [ - 0.5 , - 0.5 , - 0.5 ] )
482
- mesh . merge ( wallSignMesh . transform ( t ) )
531
+ mesh . merge ( wallSignRenderer ( atlas ) . transform ( t ) )
483
532
}
484
533
if ( block . is ( 'conduit' ) ) {
485
534
mesh . merge ( conduitRenderer ( atlas ) )
486
535
}
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
+ }
487
550
488
551
if ( block . getProperties ( ) [ 'waterlogged' ] === 'true' ) {
489
552
mesh . merge ( liquidRenderer ( 'water' , 0 , atlas , cull , 0 ) )
0 commit comments