@@ -299,6 +299,62 @@ function piglinHead(atlas: TextureAtlasProvider) {
299
299
] ) . withUvEpsilon ( 1 / 128 ) )
300
300
}
301
301
302
+ function signRenderer ( woodType : string ) {
303
+ return ( atlas : TextureAtlasProvider ) => {
304
+ const id = Identifier . create ( 'sign' )
305
+ return dummy ( id , atlas , { } , new BlockModel ( id , undefined , {
306
+ 0 : `entity/signs/${ woodType } ` ,
307
+ } , [
308
+ {
309
+ from : [ - 4 , 8 , 7 ] ,
310
+ to : [ 20 , 20 , 9 ] ,
311
+ faces : {
312
+ north : { uv : [ 0.5 , 1 , 6.5 , 7 ] , texture : '#0' } ,
313
+ east : { uv : [ 0 , 1 , 0.5 , 7 ] , texture : '#0' } ,
314
+ south : { uv : [ 7 , 1 , 13 , 7 ] , texture : '#0' } ,
315
+ west : { uv : [ 6.5 , 1 , 7 , 7 ] , texture : '#0' } ,
316
+ up : { uv : [ 6.5 , 1 , 0.5 , 0 ] , texture : '#0' } ,
317
+ down : { uv : [ 12.5 , 0 , 6.5 , 1 ] , texture : '#0' } ,
318
+ } ,
319
+ } ,
320
+ {
321
+ from : [ 7 , - 6 , 7 ] ,
322
+ to : [ 9 , 8 , 9 ] ,
323
+ faces : {
324
+ north : { uv : [ 0.5 , 8 , 1 , 15 ] , texture : '#0' } ,
325
+ east : { uv : [ 0 , 8 , 0.5 , 15 ] , texture : '#0' } ,
326
+ south : { uv : [ 1.5 , 8 , 2 , 15 ] , texture : '#0' } ,
327
+ west : { uv : [ 1 , 8 , 1.5 , 15 ] , texture : '#0' } ,
328
+ up : { uv : [ 1 , 8 , 0.5 , 7 ] , texture : '#0' } ,
329
+ down : { uv : [ 1.5 , 7 , 1 , 8 ] , texture : '#0' } ,
330
+ } ,
331
+ } ,
332
+ ] ) . withUvEpsilon ( 1 / 128 ) )
333
+ }
334
+ }
335
+
336
+ function wallSignRenderer ( woodType : string ) {
337
+ return ( atlas : TextureAtlasProvider ) => {
338
+ const id = Identifier . create ( 'sign' )
339
+ return dummy ( id , atlas , { } , new BlockModel ( id , undefined , {
340
+ 0 : `entity/signs/${ woodType } ` ,
341
+ } , [
342
+ {
343
+ from : [ - 4 , 4 , 17 ] ,
344
+ to : [ 20 , 16 , 19 ] ,
345
+ faces : {
346
+ north : { uv : [ 0.5 , 1 , 6.5 , 7 ] , texture : '#0' } ,
347
+ east : { uv : [ 0 , 1 , 0.5 , 7 ] , texture : '#0' } ,
348
+ south : { uv : [ 7 , 1 , 13 , 7 ] , texture : '#0' } ,
349
+ west : { uv : [ 6.5 , 1 , 7 , 7 ] , texture : '#0' } ,
350
+ up : { uv : [ 6.5 , 1 , 0.5 , 0 ] , texture : '#0' } ,
351
+ down : { uv : [ 12.5 , 0 , 6.5 , 1 ] , texture : '#0' } ,
352
+ } ,
353
+ } ,
354
+ ] ) . withUvEpsilon ( 1 / 128 ) )
355
+ }
356
+ }
357
+
302
358
function getStr ( block : BlockState , key : string , fallback = '' ) {
303
359
return block . getProperty ( key ) ?? fallback
304
360
}
@@ -323,6 +379,34 @@ const SkullRenderers = new Map(Object.entries({
323
379
'minecraft:player_head' : skullRenderer ( 'player/wide/steve' , 1 ) , // TODO: fix texture
324
380
} ) )
325
381
382
+ const SignRenderers = new Map ( Object . entries ( {
383
+ 'minecraft:oak_sign' : signRenderer ( 'oak' ) ,
384
+ 'minecraft:spruce_sign' : signRenderer ( 'spruce' ) ,
385
+ 'minecraft:birch_sign' : signRenderer ( 'birch' ) ,
386
+ 'minecraft:jungle_sign' : signRenderer ( 'jungle' ) ,
387
+ 'minecraft:acacia_sign' : signRenderer ( 'acacia' ) ,
388
+ 'minecraft:dark_oak_sign' : signRenderer ( 'dark_oak' ) ,
389
+ 'minecraft:mangrove_sign' : signRenderer ( 'mangrove' ) ,
390
+ 'minecraft:cherry_sign' : signRenderer ( 'cherry' ) ,
391
+ 'minecraft:bamboo_sign' : signRenderer ( 'bamboo' ) ,
392
+ 'minecraft:crimson_sign' : signRenderer ( 'crimson' ) ,
393
+ 'minecraft:warped_sign' : signRenderer ( 'warped' ) ,
394
+ } ) )
395
+
396
+ const WallSignRenderers = new Map ( Object . entries ( {
397
+ 'minecraft:oak_wall_sign' : wallSignRenderer ( 'oak' ) ,
398
+ 'minecraft:spruce_wall_sign' : wallSignRenderer ( 'spruce' ) ,
399
+ 'minecraft:birch_wall_sign' : wallSignRenderer ( 'birch' ) ,
400
+ 'minecraft:jungle_wall_sign' : wallSignRenderer ( 'jungle' ) ,
401
+ 'minecraft:acacia_wall_sign' : wallSignRenderer ( 'acacia' ) ,
402
+ 'minecraft:dark_oak_wall_sign' : wallSignRenderer ( 'dark_oak' ) ,
403
+ 'minecraft:mangrove_wall_sign' : wallSignRenderer ( 'mangrove' ) ,
404
+ 'minecraft:cherry_wall_sign' : wallSignRenderer ( 'cherry' ) ,
405
+ 'minecraft:bamboo_wall_sign' : wallSignRenderer ( 'bamboo' ) ,
406
+ 'minecraft:crimson_wall_sign' : wallSignRenderer ( 'crimson' ) ,
407
+ 'minecraft:warped_wall_sign' : wallSignRenderer ( 'warped' ) ,
408
+ } ) )
409
+
326
410
export namespace SpecialRenderers {
327
411
export function getBlockMesh ( block : BlockState , atlas : TextureAtlasProvider , cull : Cull ) : Mesh {
328
412
if ( block . is ( 'water' ) ) {
@@ -355,6 +439,28 @@ export namespace SpecialRenderers {
355
439
mat4 . translate ( t , t , [ - 0.5 , - 0.5 , - 0.5 ] )
356
440
mesh . merge ( skullMesh . transform ( t ) )
357
441
}
442
+ const signRenderer = SignRenderers . get ( block . getName ( ) . toString ( ) )
443
+ if ( signRenderer !== undefined ) {
444
+ const signMesh = signRenderer ( atlas )
445
+ const rotation = getInt ( block , 'rotation' ) / 16 * Math . PI * 2
446
+ const t = mat4 . create ( )
447
+ mat4 . translate ( t , t , [ 0.5 , 0.5 , 0.5 ] )
448
+ mat4 . rotateY ( t , t , rotation )
449
+ mat4 . scale ( t , t , [ 2 / 3 , 2 / 3 , 2 / 3 ] )
450
+ mat4 . translate ( t , t , [ - 0.5 , - 0.5 , - 0.5 ] )
451
+ mesh . merge ( signMesh . transform ( t ) )
452
+ }
453
+ const wallSignRenderer = WallSignRenderers . get ( block . getName ( ) . toString ( ) )
454
+ if ( wallSignRenderer !== undefined ) {
455
+ const wallSignMesh = wallSignRenderer ( atlas )
456
+ const facing = getStr ( block , 'facing' , 'south' )
457
+ const t = mat4 . create ( )
458
+ mat4 . translate ( t , t , [ 0.5 , 0.5 , 0.5 ] )
459
+ mat4 . rotateY ( t , t , facing === 'west' ? Math . PI / 2 : facing === 'south' ? Math . PI : facing === 'east' ? Math . PI * 3 / 2 : 0 )
460
+ mat4 . scale ( t , t , [ 2 / 3 , 2 / 3 , 2 / 3 ] )
461
+ mat4 . translate ( t , t , [ - 0.5 , - 0.5 , - 0.5 ] )
462
+ mesh . merge ( wallSignMesh . transform ( t ) )
463
+ }
358
464
359
465
if ( block . getProperties ( ) [ 'waterlogged' ] === 'true' ) {
360
466
mesh . merge ( liquidRenderer ( 'water' , 0 , atlas , cull , 0 ) )
0 commit comments