From 18b42ff0197f63ce7b8927f7c093a6d58acbe64f Mon Sep 17 00:00:00 2001 From: Lukas Date: Sat, 3 Apr 2021 12:52:14 +0200 Subject: [PATCH] rendering: fix advanced optimizer in combination with rotated blocks --- .../minosoft/data/entities/entities/Entity.kt | 2 +- .../bixilon/minosoft/gui/rendering/Camera.kt | 2 +- .../chunk/models/renderable/BlockRenderer.kt | 24 ++++++++++++++++--- .../models/renderable/ElementRenderer.kt | 15 +++--------- .../minosoft/gui/rendering/util/VecUtil.kt | 6 ++--- 5 files changed, 29 insertions(+), 20 deletions(-) diff --git a/src/main/java/de/bixilon/minosoft/data/entities/entities/Entity.kt b/src/main/java/de/bixilon/minosoft/data/entities/entities/Entity.kt index aef4a5156..0b9c593b1 100644 --- a/src/main/java/de/bixilon/minosoft/data/entities/entities/Entity.kt +++ b/src/main/java/de/bixilon/minosoft/data/entities/entities/Entity.kt @@ -207,7 +207,7 @@ abstract class Entity( delta.y = collisionsToCheck.computeOffset(aabb, deltaPosition.y, Axes.Y) aabb.offsetAssign(0f, delta.y, 0f) } - val xPriority = delta.x <= delta.z + val xPriority = delta.x > delta.z if (delta.x != 0.0f && xPriority) { delta.x = collisionsToCheck.computeOffset(aabb, deltaPosition.x, Axes.X) aabb.offsetAssign(delta.x, 0f, 0f) diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/Camera.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/Camera.kt index f631d86eb..1d77dcb99 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/Camera.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/Camera.kt @@ -297,6 +297,6 @@ class Camera( companion object { private val CAMERA_UP_VEC3 = Vec3(0.0f, 1.0f, 0.0f) private const val PLAYER_HEIGHT = 1.3 // player is 1.8 blocks high, the camera is normally at 0.5. 1.8 - 0.5 = 1.13 - const val PLAYER_WIDTH = 0.6 + const val PLAYER_WIDTH = 0.60001 } } diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/chunk/models/renderable/BlockRenderer.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/chunk/models/renderable/BlockRenderer.kt index fd985b88b..b8a7807f9 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/chunk/models/renderable/BlockRenderer.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/chunk/models/renderable/BlockRenderer.kt @@ -13,6 +13,7 @@ package de.bixilon.minosoft.gui.rendering.chunk.models.renderable +import com.google.common.collect.HashBiMap import com.google.gson.JsonObject import de.bixilon.minosoft.data.Directions import de.bixilon.minosoft.data.mappings.ResourceLocation @@ -27,6 +28,9 @@ import de.bixilon.minosoft.gui.rendering.chunk.models.loading.BlockModel import de.bixilon.minosoft.gui.rendering.textures.Texture import de.bixilon.minosoft.gui.rendering.textures.TextureTransparencies import de.bixilon.minosoft.gui.rendering.util.VecUtil.plus +import de.bixilon.minosoft.gui.rendering.util.VecUtil.toVec3 +import glm_.Java +import glm_.vec3.Vec3 import glm_.vec3.Vec3i class BlockRenderer : BlockRenderInterface { @@ -36,18 +40,32 @@ class BlockRenderer : BlockRenderInterface { private val textureMapping: MutableMap = mutableMapOf() override val faceBorderSizes: Array?> = arrayOfNulls(Directions.DIRECTIONS.size) override val transparentFaces: BooleanArray = BooleanArray(Directions.DIRECTIONS.size) + private val directionMapping: HashBiMap = HashBiMap.create() constructor(data: JsonObject, parent: BlockModel) { - val newElements = ElementRenderer.createElements(data, parent) + val rotation = Java.glm.radians(data.toVec3()) + createDirectionMapping(rotation) + val newElements = ElementRenderer.createElements(data, parent, rotation, directionMapping) // reverse drawing order (for e.g. grass block side overlays this.elements.addAll(newElements.reversed()) textures.putAll(parent.textures) } + private fun createDirectionMapping(rotation: Vec3) { + for (direction in Directions.DIRECTIONS) { + try { + directionMapping[direction] = ElementRenderer.getRotatedDirection(rotation, direction) + } catch (e: Exception) { + } + } + } + constructor(data: List, models: Map) { for (state in data) { + val rotation = Java.glm.radians(state.toVec3()) + createDirectionMapping(rotation) val parent = models[ResourceLocation(state["model"].asString)]!! - val newElements = ElementRenderer.createElements(state, parent) + val newElements = ElementRenderer.createElements(state, parent, rotation, directionMapping) this.elements.addAll(newElements) textures.putAll(parent.textures) } @@ -104,7 +122,7 @@ class BlockRenderer : BlockRenderInterface { var neighbourFaceSize: Array? = null val neighbourBlock = neighbourBlocks[direction.ordinal] // ToDo: We need to rotate the direction first and then rotate it - neighbourBlock?.getBlockRenderer(blockPosition + direction)?.let { + neighbourBlock?.getBlockRenderer(blockPosition + directionMapping[direction])?.let { if (it.transparentFaces[invertedDirection.ordinal]) { isNeighbourTransparent = true } diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/chunk/models/renderable/ElementRenderer.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/chunk/models/renderable/ElementRenderer.kt index 462892a98..d452f0891 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/chunk/models/renderable/ElementRenderer.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/chunk/models/renderable/ElementRenderer.kt @@ -30,15 +30,13 @@ import de.bixilon.minosoft.gui.rendering.textures.TextureTransparencies import de.bixilon.minosoft.gui.rendering.util.VecUtil import de.bixilon.minosoft.gui.rendering.util.VecUtil.plus import de.bixilon.minosoft.gui.rendering.util.VecUtil.rotate -import glm_.Java.Companion.glm import glm_.vec3.Vec3 import glm_.vec3.Vec3i -class ElementRenderer(parent: BlockModelElement, val rotation: Vec3, uvLock: Boolean, rescale: Boolean) { +class ElementRenderer(parent: BlockModelElement, val rotation: Vec3, uvLock: Boolean, rescale: Boolean, private val directionMapping: HashBiMap) { val faceBorderSize: Array = arrayOfNulls(Directions.DIRECTIONS.size) private val faces: MutableMap = mutableMapOf() private var transformedPositions: Array = parent.transformedPositions.clone() - private val directionMapping: HashBiMap = HashBiMap.create() private val from = parent.from private val to = parent.to @@ -48,8 +46,6 @@ class ElementRenderer(parent: BlockModelElement, val rotation: Vec3, uvLock: Boo direction.getFaceBorderSizes(from, to)?.let { faceBorderSize[direction.ordinal] = it } - - directionMapping[direction] = getRotatedDirection(rotation, direction) parent.faces[direction]?.let { faces[direction] = BlockModelFace(it) } @@ -116,14 +112,13 @@ class ElementRenderer(parent: BlockModelElement, val rotation: Vec3, uvLock: Boo 0 to 1, ) - fun createElements(state: JsonObject, parent: BlockModel): MutableList { - val rotation = glm.radians(state.asVec3()) + fun createElements(state: JsonObject, parent: BlockModel, rotation: Vec3, directionMapping: HashBiMap): MutableList { val uvLock = state["uvlock"]?.asBoolean ?: false val rescale = state["rescale"]?.asBoolean ?: false val parentElements = parent.elements val result: MutableList = mutableListOf() for (parentElement in parentElements) { - result.add(ElementRenderer(parentElement, rotation, uvLock, rescale)) + result.add(ElementRenderer(parentElement, rotation, uvLock, rescale, directionMapping)) } return result } @@ -162,7 +157,3 @@ class ElementRenderer(parent: BlockModelElement, val rotation: Vec3, uvLock: Boo } } } - -private fun JsonObject.asVec3(): Vec3 { - return Vec3(this["x"]?.asFloat ?: 0, this["y"]?.asFloat ?: 0, this["z"]?.asFloat ?: 0) -} diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/util/VecUtil.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/util/VecUtil.kt index d6f459db8..748d0a8d5 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/util/VecUtil.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/util/VecUtil.kt @@ -34,9 +34,9 @@ object VecUtil { val ONES_VEC3 = Vec3(1) fun JsonElement.toVec3(): Vec3 { - when (this) { - is JsonArray -> return Vec3(this[0].asFloat, this[1].asFloat, this[2].asFloat) - is JsonObject -> TODO() + return when (this) { + is JsonArray -> Vec3(this[0].asFloat, this[1].asFloat, this[2].asFloat) + is JsonObject -> Vec3(this["x"]?.asFloat ?: 0, this["y"]?.asFloat ?: 0, this["z"]?.asFloat ?: 0) else -> throw IllegalArgumentException("Not a Vec3!") } }