From f5ae8978b931e1a2141184d76f94886d24f3359a Mon Sep 17 00:00:00 2001 From: Moritz Zwerger Date: Tue, 1 Aug 2023 01:07:18 +0200 Subject: [PATCH] wip fluid culling --- .../data/registries/blocks/types/wood/LeavesBlock.kt | 8 ++------ .../rendering/chunk/preparer/FluidSectionMesher.kt | 10 ++-------- .../rendering/models/block/element/ElementRotation.kt | 4 ++++ .../rendering/models/block/element/ModelElement.kt | 5 ++--- .../block/state/baked/cull/CustomBlockCulling.kt | 4 ++-- .../models/block/state/baked/cull/FaceCulling.kt | 11 +++++++---- .../minosoft/gui/rendering/models/fluid/FluidModel.kt | 2 ++ .../rendering/models/fluid/fluids/LavaFluidModel.kt | 5 +++++ .../rendering/models/fluid/fluids/WaterFluidModel.kt | 5 +++++ 9 files changed, 31 insertions(+), 23 deletions(-) diff --git a/src/main/java/de/bixilon/minosoft/data/registries/blocks/types/wood/LeavesBlock.kt b/src/main/java/de/bixilon/minosoft/data/registries/blocks/types/wood/LeavesBlock.kt index b4c497f3b..12364f628 100644 --- a/src/main/java/de/bixilon/minosoft/data/registries/blocks/types/wood/LeavesBlock.kt +++ b/src/main/java/de/bixilon/minosoft/data/registries/blocks/types/wood/LeavesBlock.kt @@ -15,7 +15,6 @@ package de.bixilon.minosoft.data.registries.blocks.types.wood import de.bixilon.minosoft.data.direction.Directions import de.bixilon.minosoft.data.registries.blocks.light.CustomLightProperties -import de.bixilon.minosoft.data.registries.blocks.light.LightProperties import de.bixilon.minosoft.data.registries.blocks.settings.BlockSettings import de.bixilon.minosoft.data.registries.blocks.state.BlockState import de.bixilon.minosoft.data.registries.blocks.state.PropertyBlockState @@ -26,16 +25,13 @@ import de.bixilon.minosoft.data.registries.blocks.types.fluid.water.Waterloggabl import de.bixilon.minosoft.data.registries.blocks.types.properties.LightedBlock import de.bixilon.minosoft.data.registries.blocks.types.properties.item.BlockWithItem import de.bixilon.minosoft.data.registries.blocks.types.properties.shape.special.FullBlock -import de.bixilon.minosoft.data.registries.blocks.types.properties.transparency.TransparentBlock import de.bixilon.minosoft.data.registries.identified.ResourceLocation import de.bixilon.minosoft.data.registries.item.items.Item import de.bixilon.minosoft.data.registries.item.items.tool.properties.requirement.ToolRequirement import de.bixilon.minosoft.data.registries.item.items.tool.shears.ShearsItem -import de.bixilon.minosoft.data.registries.item.items.tool.shears.ShearsRequirement import de.bixilon.minosoft.data.registries.item.items.tool.sword.SwordItem -import de.bixilon.minosoft.data.registries.item.items.tool.sword.SwordRequirement -import de.bixilon.minosoft.gui.rendering.models.block.state.baked.BakedFace import de.bixilon.minosoft.gui.rendering.models.block.state.baked.cull.CustomBlockCulling +import de.bixilon.minosoft.gui.rendering.models.block.state.baked.cull.side.FaceProperties abstract class LeavesBlock(identifier: ResourceLocation, settings: BlockSettings) : Block(identifier, settings), CustomBlockCulling, FullBlock, BlockStateBuilder, ToolRequirement, WaterloggableBlock, BlockWithItem, LightedBlock { override val hardness get() = 0.2f @@ -47,7 +43,7 @@ abstract class LeavesBlock(identifier: ResourceLocation, settings: BlockSettings override fun getLightProperties(blockState: BlockState) = LIGHT_PROPERTIES - override fun shouldCull(state: BlockState, face: BakedFace, directions: Directions, neighbour: BlockState): Boolean { + override fun shouldCull(state: BlockState, properties: FaceProperties, directions: Directions, neighbour: BlockState): Boolean { return neighbour.block != this } diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/chunk/preparer/FluidSectionMesher.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/chunk/preparer/FluidSectionMesher.kt index c8cbc260d..33df93b58 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/chunk/preparer/FluidSectionMesher.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/chunk/preparer/FluidSectionMesher.kt @@ -31,10 +31,10 @@ import de.bixilon.minosoft.data.registries.shapes.voxel.AbstractVoxelShape import de.bixilon.minosoft.data.text.formatting.color.Colors import de.bixilon.minosoft.data.world.chunk.ChunkSection import de.bixilon.minosoft.data.world.chunk.chunk.Chunk -import de.bixilon.minosoft.data.world.positions.BlockPositionUtil.positionHash import de.bixilon.minosoft.gui.rendering.RenderContext import de.bixilon.minosoft.gui.rendering.chunk.mesh.ChunkMesh import de.bixilon.minosoft.gui.rendering.chunk.mesh.SingleChunkMesh +import de.bixilon.minosoft.gui.rendering.models.block.state.baked.cull.FaceCulling 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 @@ -96,14 +96,8 @@ class FluidSectionMesher( if (fluid.matches(neighbour)) { return true } - val model = neighbour.model ?: return false - random.setSeed(neighbourPosition.positionHash) - /* - val size = model.getTouchingFaceProperties(random, direction.inverted) - return size?.canCull(FLUID_FACE_PROPERTY, false) ?: false - */ - return false + return FaceCulling.canCull(blockState, model.properties, direction, neighbour) } val topBlock = if (y == ProtocolDefinition.SECTION_MAX_Y) { diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/models/block/element/ElementRotation.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/models/block/element/ElementRotation.kt index 8707a78ff..ce03ed74e 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/models/block/element/ElementRotation.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/models/block/element/ElementRotation.kt @@ -28,6 +28,10 @@ data class ElementRotation( val rescale: Boolean = false, ) { + fun apply(positions: FloatArray) { +// TODO("Can not rotate yet!") + } + companion object { private val ORIGIN = Vec3(0.5f) diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/models/block/element/ModelElement.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/models/block/element/ModelElement.kt index 46bf1fc57..7af4f75b4 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/models/block/element/ModelElement.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/models/block/element/ModelElement.kt @@ -33,10 +33,9 @@ data class ModelElement( fun positions(direction: Directions): FloatArray { val positions = BakingUtil.positions(direction, from, to) - if (rotation == null) return positions + rotation?.apply(positions) - - TODO("Can not rotate positions yet!") + return positions } companion object { diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/models/block/state/baked/cull/CustomBlockCulling.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/models/block/state/baked/cull/CustomBlockCulling.kt index 639ffe020..18ea8e8b2 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/models/block/state/baked/cull/CustomBlockCulling.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/models/block/state/baked/cull/CustomBlockCulling.kt @@ -15,9 +15,9 @@ package de.bixilon.minosoft.gui.rendering.models.block.state.baked.cull import de.bixilon.minosoft.data.direction.Directions import de.bixilon.minosoft.data.registries.blocks.state.BlockState -import de.bixilon.minosoft.gui.rendering.models.block.state.baked.BakedFace +import de.bixilon.minosoft.gui.rendering.models.block.state.baked.cull.side.FaceProperties interface CustomBlockCulling { - fun shouldCull(state: BlockState, face: BakedFace, directions: Directions, neighbour: BlockState): Boolean + fun shouldCull(state: BlockState, properties: FaceProperties, directions: Directions, neighbour: BlockState): Boolean } diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/models/block/state/baked/cull/FaceCulling.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/models/block/state/baked/cull/FaceCulling.kt index 4ec49000f..ad070e4a6 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/models/block/state/baked/cull/FaceCulling.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/models/block/state/baked/cull/FaceCulling.kt @@ -22,14 +22,17 @@ import de.bixilon.minosoft.gui.rendering.system.base.texture.TextureTransparenci object FaceCulling { - fun canCull(state: BlockState, face: BakedFace, direction: Directions, neighbour: BlockState?): Boolean { + inline fun canCull(state: BlockState, face: BakedFace, direction: Directions, neighbour: BlockState?): Boolean { + return canCull(state, face.properties, direction, neighbour) + } + + fun canCull(state: BlockState, properties: FaceProperties?, direction: Directions, neighbour: BlockState?): Boolean { if (neighbour == null) return false - if (!face.touchingSide) return false + if (properties == null) return false val model = neighbour.model ?: return false val neighbourProperties = model.getProperties(direction) ?: return false // not touching side - val properties = face.properties ?: return false if (!properties.isCoveredBy(neighbourProperties)) return false @@ -39,7 +42,7 @@ object FaceCulling { } if (state.block is CustomBlockCulling) { - return state.block.shouldCull(state, face, direction, neighbour) + return state.block.shouldCull(state, properties, direction, neighbour) } if (neighbourProperties.transparency == null) return false // can not determinate it 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 e93bb75c3..4f29703eb 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.texture.Texture import de.bixilon.minosoft.gui.rendering.tint.TintProvider @@ -21,6 +22,7 @@ interface FluidModel { val tint: TintProvider? get() = null val still: Texture? val flowing: Texture? + 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 c3447c3fb..a1433824e 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,15 +13,20 @@ package de.bixilon.minosoft.gui.rendering.models.fluid.fluids +import de.bixilon.kotlinglm.vec2.Vec2 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? = null override var flowing: Texture? = null + override var properties = FaceProperties(Vec2.EMPTY, Vec2(1.0f), TextureTransparencies.OPAQUE) // TODO: determinate by texture override fun load(context: RenderContext) { still = context.textures.staticTextures.createTexture(STILL) 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 63edbe1c1..113283579 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,19 +13,24 @@ package de.bixilon.minosoft.gui.rendering.models.fluid.fluids +import de.bixilon.kotlinglm.vec2.Vec2 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.WaterTintProvider +import de.bixilon.minosoft.gui.rendering.util.vec.vec2.Vec2Util.EMPTY class WaterFluidModel : FluidModel { override val tint: TintProvider = WaterTintProvider override var still: Texture? = null override var flowing: Texture? = null + override var properties = FaceProperties(Vec2.EMPTY, Vec2(1.0f), TextureTransparencies.TRANSLUCENT) // TODO: determinate by texture override fun load(context: RenderContext) { still = context.textures.staticTextures.createTexture(STILL)