minimal code cleanup

This commit is contained in:
Bixilon 2021-02-06 22:57:14 +01:00
parent 26ffc2894e
commit c31a24135a
No known key found for this signature in database
GPG Key ID: 5CAD791931B09AC4
7 changed files with 43 additions and 53 deletions

View File

@ -71,19 +71,17 @@ object ChunkPreparer {
} }
} }
} }
// if(block.fullIdentifier != "minecraft:dispenser"){
// continue
// }
fun drawFace() { fun drawFace() {
block.blockModel?.render(position, direction)?.let { data.addAll(it) } block.blockModel.render(position, direction, data)
} }
if (blockToCheck == null) { if (blockToCheck == null) {
blockToCheck = section.getBlock(position.getLocationByDirection(direction)) blockToCheck = section.getBlock(position.getLocationByDirection(direction))
} }
if (blockToCheck != null) { if (blockToCheck != null) {
val blockTransparent = block.blockModel?.isTransparent(direction) ?: false val blockTransparent = block.blockModel.isTransparent(direction)
val checkTransparent = blockToCheck!!.blockModel?.isTransparent(direction) ?: false val checkTransparent = blockToCheck!!.blockModel.isTransparent(direction)
if (blockTransparent && checkTransparent) { if (blockTransparent && checkTransparent) {
continue continue
} }
@ -91,9 +89,10 @@ object ChunkPreparer {
drawFace() drawFace()
continue continue
} }
if (block.blockModel?.isCullFace(direction) == true && blockToCheck!!.blockModel?.isCullFace(direction.inverse()) == true) { if (block.blockModel.isCullFace(direction) && blockToCheck!!.blockModel.isCullFace(direction.inverse())) {
continue continue
} }
// ToDo: Block rotations (this is buggy)
} }
drawFace() drawFace()

View File

@ -1,6 +1,5 @@
package de.bixilon.minosoft.gui.rendering; package de.bixilon.minosoft.gui.rendering;
import de.bixilon.minosoft.data.world.ChunkLocation;
import de.bixilon.minosoft.gui.rendering.shader.Shader; import de.bixilon.minosoft.gui.rendering.shader.Shader;
import glm_.vec3.Vec3; import glm_.vec3.Vec3;
import org.lwjgl.opengl.GL11; import org.lwjgl.opengl.GL11;
@ -16,11 +15,11 @@ import static org.lwjgl.opengl.GL30.*;
public class Mesh { public class Mesh {
int vAO; int vAO;
int vBO; int vBO;
Vec3 chunkPosition; Vec3 worldPosition;
int trianglesCount; int trianglesCount;
public Mesh(float[] data, ChunkLocation location, int sectionHeight) { public Mesh(float[] data, Vec3 worldPosition) {
this.chunkPosition = new Vec3(location.getX(), sectionHeight, location.getZ()); this.worldPosition = worldPosition;
this.trianglesCount = data.length / 6; // <- bytes per vertex this.trianglesCount = data.length / 6; // <- bytes per vertex
this.vAO = glGenVertexArrays(); this.vAO = glGenVertexArrays();
this.vBO = glGenBuffers(); this.vBO = glGenBuffers();
@ -41,7 +40,7 @@ public class Mesh {
} }
public void draw(Shader chunkShader) { public void draw(Shader chunkShader) {
chunkShader.setVec3("chunkPosition", this.chunkPosition); chunkShader.setVec3("worldPosition", this.worldPosition);
glBindVertexArray(this.vAO); glBindVertexArray(this.vAO);
glDrawArrays(GL_TRIANGLES, 0, this.trianglesCount); glDrawArrays(GL_TRIANGLES, 0, this.trianglesCount);
} }

View File

@ -89,8 +89,8 @@ class RenderWindow(private val connection: Connection) {
glfwSetInputMode(windowId, GLFW_CURSOR, GLFW_CURSOR_DISABLED) glfwSetInputMode(windowId, GLFW_CURSOR, GLFW_CURSOR_DISABLED)
glfwSetCursorPosCallback(windowId) { windowId: Long, xPos: Double, yPos: Double -> camera.mouseCallback(xPos, yPos) } glfwSetCursorPosCallback(windowId) { windowId: Long, xPos: Double, yPos: Double -> camera.mouseCallback(xPos, yPos) }
MemoryStack.stackPush().let { stack -> MemoryStack.stackPush().let { stack ->
val pWidth = stack.mallocInt(1) // int* val pWidth = stack.mallocInt(1)
val pHeight = stack.mallocInt(1) // int* val pHeight = stack.mallocInt(1)
// Get the window size passed to glfwCreateWindow // Get the window size passed to glfwCreateWindow
glfwGetWindowSize(windowId, pWidth, pHeight) glfwGetWindowSize(windowId, pWidth, pHeight)
@ -111,7 +111,7 @@ class RenderWindow(private val connection: Connection) {
// Make the window visible // Make the window visible
glfwShowWindow(windowId) glfwShowWindow(windowId)
GL.createCapabilities() GL.createCapabilities()
glClearColor(0.2f, 0.3f, 0.3f, 1.0f) glClearColor(137 / 256f, 207 / 256f, 240 / 256f, 1.0f)
glEnable(GL_DEPTH_TEST) glEnable(GL_DEPTH_TEST)
glEnable(GL_BLEND) glEnable(GL_BLEND)
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA) glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA)
@ -129,7 +129,7 @@ class RenderWindow(private val connection: Connection) {
latch?.countDown() latch?.countDown()
} }
fun startLoop() { fun startRenderLoop() {
var framesLastSecond = 0 var framesLastSecond = 0
var lastCalcTime = glfwGetTime() var lastCalcTime = glfwGetTime()
var frameTimeLastCalc = 0.0 var frameTimeLastCalc = 0.0
@ -154,28 +154,27 @@ class RenderWindow(private val connection: Connection) {
} }
} }
glfwSwapBuffers(windowId) // swap the color buffers glfwSwapBuffers(windowId)
// Poll for window events. The key callback above will only be
// invoked during this call.
glfwPollEvents() glfwPollEvents()
for (renderQueueElement in renderQueue) {
renderQueueElement.run()
renderQueue.remove(renderQueueElement)
}
camera.handleInput(deltaTime) camera.handleInput(deltaTime)
frameTimeLastCalc += glfwGetTime() - currentFrame frameTimeLastCalc += glfwGetTime() - currentFrame
if (glfwGetTime() - lastCalcTime >= 0.5) { if (glfwGetTime() - lastCalcTime >= 0.5) {
glfwSetWindowTitle(windowId, "FPS: ${framesLastSecond * 2} (${(0.5 * framesLastSecond / (frameTimeLastCalc)).roundToInt()})") glfwSetWindowTitle(windowId, "Minosoft | FPS: ${framesLastSecond * 2} (${(0.5 * framesLastSecond / (frameTimeLastCalc)).roundToInt()})")
lastCalcTime = glfwGetTime() lastCalcTime = glfwGetTime()
framesLastSecond = 0 framesLastSecond = 0
frameTimeLastCalc = 0.0 frameTimeLastCalc = 0.0
} }
framesLastSecond++ framesLastSecond++
for (renderQueueElement in renderQueue) {
renderQueueElement.run()
renderQueue.remove(renderQueueElement)
}
} }
} }

View File

@ -24,7 +24,7 @@ class Renderer(private val connection: Connection) {
Thread({ Thread({
Log.info("Hello LWJGL " + Version.getVersion() + "!") Log.info("Hello LWJGL " + Version.getVersion() + "!")
renderWindow.init(latch) renderWindow.init(latch)
renderWindow.startLoop() renderWindow.startRenderLoop()
renderWindow.exit() renderWindow.exit()
}, "Rendering").start() }, "Rendering").start()
} }
@ -38,13 +38,13 @@ class Renderer(private val connection: Connection) {
fun prepareChunkSection(chunkLocation: ChunkLocation, sectionHeight: Int, section: ChunkSection) { fun prepareChunkSection(chunkLocation: ChunkLocation, sectionHeight: Int, section: ChunkSection) {
executor.execute { executor.execute {
latch.waitUntilZero() latch.waitUntilZero() // Wait until rendering is started
val data = prepareChunk(connection.player.world, chunkLocation, sectionHeight, section) val data = prepareChunk(connection.player.world, chunkLocation, sectionHeight, section)
val sectionMap = renderWindow.chunkSectionsToDraw[chunkLocation]!! val sectionMap = renderWindow.chunkSectionsToDraw[chunkLocation]!!
renderWindow.renderQueue.add { renderWindow.renderQueue.add {
sectionMap[sectionHeight]?.unload() sectionMap[sectionHeight]?.unload()
sectionMap.remove(sectionHeight) sectionMap.remove(sectionHeight)
sectionMap[sectionHeight] = Mesh(data, chunkLocation, sectionHeight) sectionMap[sectionHeight] = Mesh(data, Vec3(chunkLocation.x, sectionHeight, chunkLocation.z))
} }
} }
} }

View File

@ -13,7 +13,7 @@ open class BlockModel(val parent: BlockModel? = null, json: JsonObject) {
private val textureMapping: MutableMap<String, Texture> = mutableMapOf() private val textureMapping: MutableMap<String, Texture> = mutableMapOf()
private var elements: MutableList<BlockModelElement> = parent?.elements?.toMutableList() ?: mutableListOf() private var elements: MutableList<BlockModelElement> = parent?.elements?.toMutableList() ?: mutableListOf()
private var rotation: Vec3 private var rotation: Vec3
private var uvLock = false private var uvLock = false // ToDo
init { init {
json["textures"]?.asJsonObject?.let { json["textures"]?.asJsonObject?.let {
@ -51,24 +51,19 @@ open class BlockModel(val parent: BlockModel? = null, json: JsonObject) {
} }
open fun render(position: InChunkSectionLocation, direction: Directions): List<Float> { open fun render(position: InChunkSectionLocation, direction: Directions, data: MutableList<Float>) {
// if (rotation.x == 0f && rotation.y == 0f && rotation.z == 0f) {
// return emptyList() // ToDo
// }
val data: MutableList<Float> = mutableListOf()
var model = Mat4().translate(Vec3(position.x, position.y, position.z)) var model = Mat4().translate(Vec3(position.x, position.y, position.z))
if (rotation.x > 0 || rotation.y > 0 || rotation.z > 0) { if (rotation.x > 0 || rotation.y > 0 || rotation.z > 0) {
model = model.rotate(glm.radians(rotation.x), Vec3(-1, 0, 0)) model = model.rotate(glm.radians(rotation.x), Vec3(-1, 0, 0))
.rotate(glm.radians(rotation.y), Vec3(0, -1, 0)) .rotate(glm.radians(rotation.y), Vec3(0, -1, 0))
.rotate(glm.radians(rotation.z), Vec3(0, 0, -1)) .rotate(glm.radians(rotation.z), Vec3(0, 0, -1))
// ToDo: this should be made easier/effizienter
} }
for (element in elements) { for (element in elements) {
data.addAll(element.render(textureMapping, model, direction, rotation)) element.render(textureMapping, model, direction, rotation, data)
} }
return data
} }

View File

@ -40,9 +40,9 @@ open class BlockModelElement(data: JsonObject) {
private val positionDownRightFront = Vec3(BlockModel.positionToFloat(to.x), BlockModel.positionToFloat(from.y), BlockModel.positionToFloat(from.z)) private val positionDownRightFront = Vec3(BlockModel.positionToFloat(to.x), BlockModel.positionToFloat(from.y), BlockModel.positionToFloat(from.z))
private val positionDownRightBack = Vec3(BlockModel.positionToFloat(to.x), BlockModel.positionToFloat(from.y), BlockModel.positionToFloat(to.z)) private val positionDownRightBack = Vec3(BlockModel.positionToFloat(to.x), BlockModel.positionToFloat(from.y), BlockModel.positionToFloat(to.z))
open fun render(textureMapping: MutableMap<String, Texture>, model: Mat4, direction: Directions, rotation: Vec3): List<Float> { open fun render(textureMapping: MutableMap<String, Texture>, model: Mat4, direction: Directions, rotation: Vec3, data: MutableList<Float>) {
val face = faces[direction] ?: return emptyList() val face = faces[direction] ?: return // Not our face
val data: MutableList<Float> = mutableListOf()
val texture = textureMapping[face.textureName]?.id ?: TextureArray.DEBUG_TEXTURE.id val texture = textureMapping[face.textureName]?.id ?: TextureArray.DEBUG_TEXTURE.id
fun addToData(vec3: Vec3, textureCoordinates: Vec2) { fun addToData(vec3: Vec3, textureCoordinates: Vec2) {
@ -56,25 +56,23 @@ open class BlockModelElement(data: JsonObject) {
data.add(texture.toFloat()) // ToDo: Compact this data.add(texture.toFloat()) // ToDo: Compact this
} }
fun createQuad(first: Vec3, second: Vec3, third: Vec3, fourth: Vec3, fifth: Vec2 = face.texturLeftDown, sixth: Vec2 = face.texturRightDown, seventh: Vec2 = face.texturRightUp, eighth: Vec2 = face.texturLeftUp) { fun createQuad(vertexPosition1: Vec3, vertexPosition2: Vec3, vertexPosition3: Vec3, vertexPosition4: Vec3, texturePosition1: Vec2, texturePosition2: Vec2, texturePosition3: Vec2, texturePosition4: Vec2) {
addToData(first, sixth) addToData(vertexPosition1, texturePosition2)
addToData(fourth, seventh) addToData(vertexPosition4, texturePosition3)
addToData(third, eighth) addToData(vertexPosition3, texturePosition4)
addToData(third, eighth) addToData(vertexPosition3, texturePosition4)
addToData(second, fifth) addToData(vertexPosition2, texturePosition1)
addToData(first, sixth) addToData(vertexPosition1, texturePosition2)
} }
when (direction) { when (direction) {
Directions.DOWN -> createQuad(positionDownLeftFront, positionDownLeftBack, positionDownRightBack, positionDownRightFront) Directions.DOWN -> createQuad(positionDownLeftFront, positionDownLeftBack, positionDownRightBack, positionDownRightFront, face.texturLeftDown, face.texturLeftUp, face.texturRightUp, face.texturRightDown)
Directions.UP -> createQuad(positionUpLeftFront, positionUpLeftBack, positionUpRightBack, positionUpRightFront) // ToDo Directions.UP -> createQuad(positionUpLeftFront, positionUpLeftBack, positionUpRightBack, positionUpRightFront, face.texturLeftDown, face.texturLeftUp, face.texturRightUp, face.texturRightDown)
Directions.NORTH -> createQuad(positionDownLeftFront, positionUpLeftFront, positionUpRightFront, positionDownRightFront, face.texturRightDown, face.texturRightUp, face.texturLeftUp, face.texturLeftDown) Directions.NORTH -> createQuad(positionDownLeftFront, positionUpLeftFront, positionUpRightFront, positionDownRightFront, face.texturRightDown, face.texturRightUp, face.texturLeftUp, face.texturLeftDown)
Directions.SOUTH -> createQuad(positionDownLeftBack, positionUpLeftBack, positionUpRightBack, positionDownRightBack, face.texturLeftDown, face.texturLeftUp, face.texturRightUp, face.texturRightDown) Directions.SOUTH -> createQuad(positionDownLeftBack, positionUpLeftBack, positionUpRightBack, positionDownRightBack, face.texturLeftDown, face.texturLeftUp, face.texturRightUp, face.texturRightDown)
Directions.WEST -> createQuad(positionUpLeftBack, positionDownLeftBack, positionDownLeftFront, positionUpLeftFront, face.texturRightUp, face.texturRightDown, face.texturLeftDown, face.texturLeftUp) Directions.WEST -> createQuad(positionUpLeftBack, positionDownLeftBack, positionDownLeftFront, positionUpLeftFront, face.texturRightUp, face.texturRightDown, face.texturLeftDown, face.texturLeftUp)
Directions.EAST -> createQuad(positionUpRightBack, positionDownRightBack, positionDownRightFront, positionUpRightFront, face.texturLeftUp, face.texturLeftDown, face.texturRightDown, face.texturRightUp) Directions.EAST -> createQuad(positionUpRightBack, positionDownRightBack, positionDownRightFront, positionUpRightFront, face.texturLeftUp, face.texturLeftDown, face.texturRightDown, face.texturRightUp)
} }
return data
} }
fun isCullFace(direction: Directions): Boolean { fun isCullFace(direction: Directions): Boolean {

View File

@ -9,9 +9,9 @@ out vec3 passTextureCoordinates;
uniform mat4 viewMatrix; uniform mat4 viewMatrix;
uniform mat4 projectionMatrix; uniform mat4 projectionMatrix;
uniform vec3 chunkPosition; uniform vec3 worldPosition;
void main() { void main() {
gl_Position = projectionMatrix * viewMatrix * vec4(inPosition + vec3(chunkPosition.x * 16u, chunkPosition.y * 16u, chunkPosition.z * 16u), 1.0f); gl_Position = projectionMatrix * viewMatrix * vec4(inPosition + vec3(worldPosition.x * 16u, worldPosition.y * 16u, worldPosition.z * 16u), 1.0f);
passTextureCoordinates = vec3(textureIndex, textureLayer); passTextureCoordinates = vec3(textureIndex, textureLayer);
} }