From 32263656bb5a89f56a14650455a1eebdef25e09d Mon Sep 17 00:00:00 2001 From: Moritz Zwerger Date: Fri, 8 Dec 2023 19:32:13 +0100 Subject: [PATCH] fluid renderer: cache face properties Reduces memory allocations, dirty hack --- .../gui/rendering/chunk/mesher/FluidSectionMesher.kt | 9 +-------- .../minosoft/gui/rendering/models/fluid/FluidModel.kt | 4 ++++ .../gui/rendering/models/fluid/fluids/LavaFluidModel.kt | 8 +++++++- .../gui/rendering/models/fluid/fluids/WaterFluidModel.kt | 8 +++++++- 4 files changed, 19 insertions(+), 10 deletions(-) diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/chunk/mesher/FluidSectionMesher.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/chunk/mesher/FluidSectionMesher.kt index 01dcfa37b..b262030b2 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/chunk/mesher/FluidSectionMesher.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/chunk/mesher/FluidSectionMesher.kt @@ -35,7 +35,6 @@ import de.bixilon.minosoft.gui.rendering.RenderContext import de.bixilon.minosoft.gui.rendering.chunk.mesh.ChunkMesh import de.bixilon.minosoft.gui.rendering.chunk.mesh.ChunkMeshes import de.bixilon.minosoft.gui.rendering.models.block.state.baked.cull.FaceCulling -import de.bixilon.minosoft.gui.rendering.models.block.state.baked.cull.side.FaceProperties import de.bixilon.minosoft.gui.rendering.system.base.texture.texture.Texture import de.bixilon.minosoft.gui.rendering.textures.TextureUtil.getMesh import de.bixilon.minosoft.gui.rendering.util.VecUtil.plus @@ -93,13 +92,7 @@ class FluidSectionMesher( return true } - return FaceCulling.canCull(state, FaceProperties(Vec2.EMPTY, Vec2(1.0f), model.transparency), direction, neighbour) - } - - val topBlock = if (y == ProtocolDefinition.SECTION_MAX_Y) { - neighbours[Directions.O_UP]?.blocks?.let { it[x, 0, z] } - } else { - section.blocks[x, y + 1, z] + return FaceCulling.canCull(state, model.properties, direction, neighbour) } val skip = booleanArrayOf( diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/models/fluid/FluidModel.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/models/fluid/FluidModel.kt index db37c4944..e9b87dd6d 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/models/fluid/FluidModel.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/models/fluid/FluidModel.kt @@ -14,6 +14,7 @@ package de.bixilon.minosoft.gui.rendering.models.fluid import de.bixilon.minosoft.gui.rendering.RenderContext +import de.bixilon.minosoft.gui.rendering.models.block.state.baked.cull.side.FaceProperties import de.bixilon.minosoft.gui.rendering.system.base.texture.TextureTransparencies import de.bixilon.minosoft.gui.rendering.system.base.texture.texture.Texture import de.bixilon.minosoft.gui.rendering.tint.TintProvider @@ -24,5 +25,8 @@ interface FluidModel { val flowing: Texture val transparency: TextureTransparencies + @Deprecated("dirty workaround") + val properties: FaceProperties + fun load(context: RenderContext) } diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/models/fluid/fluids/LavaFluidModel.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/models/fluid/fluids/LavaFluidModel.kt index 985e63213..efc387f71 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/models/fluid/fluids/LavaFluidModel.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/models/fluid/fluids/LavaFluidModel.kt @@ -13,22 +13,28 @@ package de.bixilon.minosoft.gui.rendering.models.fluid.fluids +import de.bixilon.kotlinglm.vec2.Vec2 import de.bixilon.kutil.cast.CastUtil.unsafeNull import de.bixilon.minosoft.data.registries.identified.Namespaces.minecraft import de.bixilon.minosoft.gui.rendering.RenderContext +import de.bixilon.minosoft.gui.rendering.models.block.state.baked.cull.side.FaceProperties import de.bixilon.minosoft.gui.rendering.models.fluid.FluidModel import de.bixilon.minosoft.gui.rendering.system.base.texture.TextureTransparencies import de.bixilon.minosoft.gui.rendering.system.base.texture.texture.Texture import de.bixilon.minosoft.gui.rendering.textures.TextureUtil.texture +import de.bixilon.minosoft.gui.rendering.util.vec.vec2.Vec2Util.EMPTY class LavaFluidModel : FluidModel { override var still: Texture = unsafeNull() override var flowing: Texture = unsafeNull() - override val transparency = TextureTransparencies.OPAQUE// TODO: from texture + override var transparency = TextureTransparencies.OPAQUE + override var properties: FaceProperties = unsafeNull() override fun load(context: RenderContext) { still = context.textures.static.create(context.models.block.fixTexturePath(STILL).texture()) flowing = context.textures.static.create(context.models.block.fixTexturePath(FLOWING).texture()) + transparency = still.transparency// TODO: flowing? + properties = FaceProperties(Vec2.EMPTY, Vec2(1.0f), transparency) } companion object { diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/models/fluid/fluids/WaterFluidModel.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/models/fluid/fluids/WaterFluidModel.kt index ab52e52af..ecf72fccc 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/models/fluid/fluids/WaterFluidModel.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/models/fluid/fluids/WaterFluidModel.kt @@ -13,26 +13,32 @@ package de.bixilon.minosoft.gui.rendering.models.fluid.fluids +import de.bixilon.kotlinglm.vec2.Vec2 import de.bixilon.kutil.cast.CastUtil.unsafeNull import de.bixilon.minosoft.data.registries.identified.Namespaces.minecraft import de.bixilon.minosoft.gui.rendering.RenderContext +import de.bixilon.minosoft.gui.rendering.models.block.state.baked.cull.side.FaceProperties import de.bixilon.minosoft.gui.rendering.models.fluid.FluidModel import de.bixilon.minosoft.gui.rendering.system.base.texture.TextureTransparencies import de.bixilon.minosoft.gui.rendering.system.base.texture.texture.Texture import de.bixilon.minosoft.gui.rendering.textures.TextureUtil.texture import de.bixilon.minosoft.gui.rendering.tint.TintProvider import de.bixilon.minosoft.gui.rendering.tint.tints.fluid.WaterTintProvider +import de.bixilon.minosoft.gui.rendering.util.vec.vec2.Vec2Util.EMPTY class WaterFluidModel : FluidModel { override val tint: TintProvider = WaterTintProvider override var still: Texture = unsafeNull() override var flowing: Texture = unsafeNull() - override val transparency = TextureTransparencies.TRANSLUCENT// TODO: from texture + override var transparency = TextureTransparencies.TRANSLUCENT + override var properties: FaceProperties = unsafeNull() override fun load(context: RenderContext) { still = context.textures.static.create(context.models.block.fixTexturePath(STILL).texture()) flowing = context.textures.static.create(context.models.block.fixTexturePath(FLOWING).texture()) + transparency = still.transparency// TODO: flowing? + properties = FaceProperties(Vec2.EMPTY, Vec2(1.0f), transparency) } companion object {