Skip to content

Commit 190af96

Browse files
committed
Add signs
1 parent 8ab8c1b commit 190af96

File tree

1 file changed

+106
-0
lines changed

1 file changed

+106
-0
lines changed

src/render/SpecialRenderer.ts

+106
Original file line numberDiff line numberDiff line change
@@ -299,6 +299,62 @@ function piglinHead(atlas: TextureAtlasProvider) {
299299
]).withUvEpsilon(1/128))
300300
}
301301

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+
302358
function getStr(block: BlockState, key: string, fallback = '') {
303359
return block.getProperty(key) ?? fallback
304360
}
@@ -323,6 +379,34 @@ const SkullRenderers = new Map(Object.entries({
323379
'minecraft:player_head': skullRenderer('player/wide/steve', 1), // TODO: fix texture
324380
}))
325381

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+
326410
export namespace SpecialRenderers {
327411
export function getBlockMesh(block: BlockState, atlas: TextureAtlasProvider, cull: Cull): Mesh {
328412
if (block.is('water')) {
@@ -355,6 +439,28 @@ export namespace SpecialRenderers {
355439
mat4.translate(t, t, [-0.5, -0.5, -0.5])
356440
mesh.merge(skullMesh.transform(t))
357441
}
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+
}
358464

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

0 commit comments

Comments
 (0)