From aae044827c60f2b515be9bddccf345201f0eed0d Mon Sep 17 00:00:00 2001 From: Misode Date: Mon, 22 Apr 2024 18:58:56 +0200 Subject: [PATCH] Refactor item renderer to transform display seperately --- src/render/BlockModel.ts | 12 +++--------- src/render/ItemRenderer.ts | 11 ++++++----- src/render/SpecialRenderer.ts | 3 ++- 3 files changed, 11 insertions(+), 15 deletions(-) diff --git a/src/render/BlockModel.ts b/src/render/BlockModel.ts index 34b9919..fc635f6 100644 --- a/src/render/BlockModel.ts +++ b/src/render/BlockModel.ts @@ -4,7 +4,7 @@ import type { Direction } from '../core/index.js' import { Identifier } from '../core/index.js' import { Vector } from '../math/index.js' import type { Color } from '../util/index.js' -import { Cull } from './Cull.js' +import type { Cull } from './Cull.js' import { Mesh } from './Mesh.js' import { Quad } from './Quad.js' import type { TextureAtlasProvider, UV } from './TextureAtlas.js' @@ -84,11 +84,7 @@ export class BlockModel { private guiLight?: BlockModelGuiLight | undefined, ) {} - public getDisplayMesh(display: Display, uvProvider: TextureAtlasProvider, tint?: Color | ((index: number) => Color), additionalMesh?: Mesh) { - const mesh = this.getMesh(uvProvider, Cull.none(), tint) - if (additionalMesh){ - mesh.merge(additionalMesh) - } + public getDisplayTransform(display: Display) { const transform = this.display?.[display] const t = mat4.create() mat4.identity(t) @@ -105,9 +101,7 @@ export class BlockModel { mat4.scale(t, t, transform.scale) } mat4.translate(t, t, [-8, -8, -8]) - mesh.transform(t) - - return mesh + return t } public getMesh(uvProvider: TextureAtlasProvider, cull: Cull, tint?: Color | ((index: number) => Color)) { diff --git a/src/render/ItemRenderer.ts b/src/render/ItemRenderer.ts index f0bce51..79cc27e 100644 --- a/src/render/ItemRenderer.ts +++ b/src/render/ItemRenderer.ts @@ -1,6 +1,6 @@ import { mat4 } from 'gl-matrix' -import { ItemStack } from '../core/ItemStack.js' import { Identifier } from '../core/index.js' +import { ItemStack } from '../core/ItemStack.js' import { Cull, SpecialRenderer, SpecialRenderers, type Color } from '../index.js' import type { BlockModelProvider } from './BlockModel.js' import { getItemColor } from './ItemColors.js' @@ -48,16 +48,17 @@ export class ItemRenderer extends Renderer { if (!tint && this.item.id.namespace === Identifier.DEFAULT_NAMESPACE) { tint = getItemColor(this.item) } - var additionalMesh = undefined + const mesh = model.getMesh(this.resources, Cull.none(), tint) if (SpecialRenderers.has(this.item.id.toString())){ - additionalMesh = SpecialRenderer[this.item.id.toString()]({}, this.resources, Cull.none()) + const specialMesh = SpecialRenderer[this.item.id.toString()]({}, this.resources, Cull.none()) // undo the scaling done by the special renderer const t = mat4.create() mat4.identity(t) mat4.scale(t, t, [16, 16, 16]) - additionalMesh.transform(t) + specialMesh.transform(t) + mesh.merge(specialMesh) } - const mesh = model.getDisplayMesh('gui', this.resources, tint, additionalMesh) + mesh.transform(model.getDisplayTransform('gui')) mesh.quads.forEach(q => { const normal = q.normal() q.forEach(v => v.normal = normal) diff --git a/src/render/SpecialRenderer.ts b/src/render/SpecialRenderer.ts index 1b35ff1..8ff93f6 100644 --- a/src/render/SpecialRenderer.ts +++ b/src/render/SpecialRenderer.ts @@ -3,6 +3,7 @@ import { Direction, Identifier } from '../core/index.js' import { BlockDefinition } from './BlockDefinition.js' import { BlockModel } from './BlockModel.js' import type { Cull } from './Cull.js' +import type { Mesh } from './Mesh.js' import type { TextureAtlasProvider } from './TextureAtlas.js' function dummy(id: Identifier, uvProvider: TextureAtlasProvider, cull: Cull, model: BlockModel) { @@ -124,7 +125,7 @@ function decoratedPotRenderer(uvProvider: TextureAtlasProvider){ } export const SpecialRenderer: { - [key: string]: (props: { [key: string]: string }, uvProvider: TextureAtlasProvider, cull: Cull) => any, + [key: string]: (props: { [key: string]: string }, uvProvider: TextureAtlasProvider, cull: Cull) => Mesh, } = { 'minecraft:water': (props, uvProvider, cull) => liquidRenderer('water', parseInt(props.level), uvProvider, cull, 0),