mirror of
https://gitlab.bixilon.de/bixilon/minosoft.git
synced 2025-09-17 11:24:56 -04:00
render system, skeletal performance improvements
This commit is contained in:
parent
ba9dfa1688
commit
b8140dbe4e
@ -19,10 +19,25 @@ Entity rendering is a quite hard topic.
|
|||||||
|
|
||||||
## Model designing
|
## Model designing
|
||||||
|
|
||||||
### Block entities
|
|
||||||
|
|
||||||
Block entity models (e.g. chests) are always `facing`=`north` by default.
|
|
||||||
|
|
||||||
### Entities
|
### Entities
|
||||||
|
|
||||||
Entities are always designed without any rotation (i.e. `yaw`=`0`)
|
Entities are always designed without any rotation (i.e. `yaw`=`0`)
|
||||||
|
|
||||||
|
## Things to consider
|
||||||
|
|
||||||
|
- name rendering (without culling and visible through walls) (and scoreboard objective)
|
||||||
|
- hitbox rendering
|
||||||
|
- entity model itself
|
||||||
|
- player with arms, legs, ...
|
||||||
|
- has animations, ...
|
||||||
|
- different poses (sneaking, etc)
|
||||||
|
- yaw vs head yaw
|
||||||
|
- "features"
|
||||||
|
- armor (and armor trims)
|
||||||
|
- elytra
|
||||||
|
- stuck arrows (and bee stingers)
|
||||||
|
- cape
|
||||||
|
- shoulder entities (parrots)
|
||||||
|
- held item
|
||||||
|
- light (shade and lightmap)
|
||||||
|
-
|
||||||
|
@ -36,7 +36,7 @@ class SkeletalManager(
|
|||||||
}
|
}
|
||||||
|
|
||||||
fun upload(instance: SkeletalInstance) {
|
fun upload(instance: SkeletalInstance) {
|
||||||
instance.transform.pack(uniformBuffer.buffer, instance.position)
|
instance.transform.pack(uniformBuffer.buffer, instance.position, Mat4())
|
||||||
uniformBuffer.upload(0 until instance.model.transformCount * Mat4.length)
|
uniformBuffer.upload(0 until instance.model.transformCount * Mat4.length)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -61,6 +61,7 @@ class AnimationManager(val instance: SkeletalInstance) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fun draw(delta: Float) {
|
fun draw(delta: Float) {
|
||||||
|
if (playing.isEmpty()) return
|
||||||
lock.lock()
|
lock.lock()
|
||||||
val iterator = playing.iterator()
|
val iterator = playing.iterator()
|
||||||
|
|
||||||
|
@ -15,7 +15,7 @@ package de.bixilon.minosoft.gui.rendering.skeletal.instance
|
|||||||
|
|
||||||
import de.bixilon.kotlinglm.mat4x4.Mat4
|
import de.bixilon.kotlinglm.mat4x4.Mat4
|
||||||
import de.bixilon.kotlinglm.vec3.Vec3
|
import de.bixilon.kotlinglm.vec3.Vec3
|
||||||
import de.bixilon.minosoft.gui.rendering.util.mat.mat4.Mat4Util.EMPTY_INSTANCE
|
import de.bixilon.minosoft.gui.rendering.util.mat.mat4.Mat4Util.reset
|
||||||
import java.nio.FloatBuffer
|
import java.nio.FloatBuffer
|
||||||
|
|
||||||
class TransformInstance(
|
class TransformInstance(
|
||||||
@ -27,21 +27,21 @@ class TransformInstance(
|
|||||||
|
|
||||||
|
|
||||||
fun reset() {
|
fun reset() {
|
||||||
this.value(Mat4.EMPTY_INSTANCE)
|
this.value.reset()
|
||||||
|
|
||||||
for ((name, child) in children) {
|
for ((name, child) in children) {
|
||||||
child.reset()
|
child.reset()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fun pack(buffer: FloatBuffer, parent: Mat4) {
|
fun pack(buffer: FloatBuffer, parent: Mat4, temp: Mat4) {
|
||||||
val value = parent * value
|
parent.times(value, temp)
|
||||||
val offset = this.id * Mat4.length
|
val offset = this.id * Mat4.length
|
||||||
for (index in 0 until Mat4.length) {
|
for (index in 0 until Mat4.length) {
|
||||||
buffer.put(offset + index, value.array[index])
|
buffer.put(offset + index, temp.array[index])
|
||||||
}
|
}
|
||||||
for ((name, child) in children) {
|
for ((name, child) in children) {
|
||||||
child.pack(buffer, value)
|
child.pack(buffer, temp, temp)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -72,7 +72,7 @@ interface RenderSystem {
|
|||||||
this.depth = settings.depth
|
this.depth = settings.depth
|
||||||
this.depthMask = settings.depthMask
|
this.depthMask = settings.depthMask
|
||||||
this.clearColor = settings.clearColor
|
this.clearColor = settings.clearColor
|
||||||
shader = null
|
// shader = null
|
||||||
polygonOffset(settings.polygonOffsetFactor, settings.polygonOffsetUnit)
|
polygonOffset(settings.polygonOffsetFactor, settings.polygonOffsetUnit)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -14,7 +14,6 @@
|
|||||||
package de.bixilon.minosoft.gui.rendering.system.opengl
|
package de.bixilon.minosoft.gui.rendering.system.opengl
|
||||||
|
|
||||||
import de.bixilon.kotlinglm.vec2.Vec2i
|
import de.bixilon.kotlinglm.vec2.Vec2i
|
||||||
import de.bixilon.kutil.collections.CollectionUtil.synchronizedSetOf
|
|
||||||
import de.bixilon.kutil.concurrent.lock.thread.ThreadMissmatchException
|
import de.bixilon.kutil.concurrent.lock.thread.ThreadMissmatchException
|
||||||
import de.bixilon.minosoft.data.registries.identified.ResourceLocation
|
import de.bixilon.minosoft.data.registries.identified.ResourceLocation
|
||||||
import de.bixilon.minosoft.data.text.formatting.color.Colors
|
import de.bixilon.minosoft.data.text.formatting.color.Colors
|
||||||
@ -47,6 +46,7 @@ import org.lwjgl.opengl.GL43.GL_DEBUG_OUTPUT
|
|||||||
import org.lwjgl.opengl.GL43.glDebugMessageCallback
|
import org.lwjgl.opengl.GL43.glDebugMessageCallback
|
||||||
import java.nio.ByteBuffer
|
import java.nio.ByteBuffer
|
||||||
import java.nio.FloatBuffer
|
import java.nio.FloatBuffer
|
||||||
|
import java.util.*
|
||||||
|
|
||||||
class OpenGLRenderSystem(
|
class OpenGLRenderSystem(
|
||||||
private val context: RenderContext,
|
private val context: RenderContext,
|
||||||
@ -54,7 +54,7 @@ class OpenGLRenderSystem(
|
|||||||
private var thread: Thread? = null
|
private var thread: Thread? = null
|
||||||
override val nativeShaders: MutableSet<NativeShader> = mutableSetOf()
|
override val nativeShaders: MutableSet<NativeShader> = mutableSetOf()
|
||||||
override val shaders: MutableSet<Shader> = mutableSetOf()
|
override val shaders: MutableSet<Shader> = mutableSetOf()
|
||||||
private val capabilities: MutableSet<RenderingCapabilities> = synchronizedSetOf()
|
private val capabilities: EnumSet<RenderingCapabilities> = EnumSet.noneOf(RenderingCapabilities::class.java)
|
||||||
override lateinit var vendor: OpenGLVendor
|
override lateinit var vendor: OpenGLVendor
|
||||||
private set
|
private set
|
||||||
override var active: Boolean = false
|
override var active: Boolean = false
|
||||||
|
@ -50,4 +50,12 @@ object Mat4Util {
|
|||||||
res[2] = this[0, 2] * array[0] + this[1, 2] * array[1] + this[2, 2] * array[2] + this[3, 2]
|
res[2] = this[0, 2] * array[0] + this[1, 2] * array[1] + this[2, 2] * array[2] + this[3, 2]
|
||||||
return res
|
return res
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fun Mat4.reset() {
|
||||||
|
val array = this.array
|
||||||
|
array[0] = 1.0f; array[1] = 0.0f;array[2] = 0.0f;array[3] = 0.0f
|
||||||
|
array[4] = 0.0f; array[5] = 1.0f;array[6] = 0.0f;array[7] = 0.0f
|
||||||
|
array[8] = 0.0f; array[9] = 0.0f;array[10] = 1.0f;array[11] = 0.0f
|
||||||
|
array[12] = 0.0f; array[13] = 0.0f;array[14] = 0.0f;array[15] = 1.0f
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,42 @@
|
|||||||
|
{
|
||||||
|
"elements": {
|
||||||
|
"body": {
|
||||||
|
"from": [-4, 12, -2],
|
||||||
|
"to": [4, 24, 2],
|
||||||
|
"texture": "minecraft:skin",
|
||||||
|
"uv": [16, 16],
|
||||||
|
"faces": "all",
|
||||||
|
"children": {
|
||||||
|
"head": {
|
||||||
|
"offset": [0, 24, 0],
|
||||||
|
"from": [-4, 0, -4],
|
||||||
|
"to": [4, 8, 4],
|
||||||
|
"uv": [0, 0],
|
||||||
|
"transform": "head",
|
||||||
|
"faces": "all",
|
||||||
|
"children": {
|
||||||
|
"hat": {
|
||||||
|
"from": [-4, 0, -4],
|
||||||
|
"to": [4, 8, 4],
|
||||||
|
"inflate": 0.5,
|
||||||
|
"uv": [32, 0],
|
||||||
|
"faces": "all"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"transforms": {
|
||||||
|
"head": {},
|
||||||
|
"right_arm": {},
|
||||||
|
"left_arm": {},
|
||||||
|
"right_leg": {},
|
||||||
|
"left_leg": {}
|
||||||
|
},
|
||||||
|
"textures": {
|
||||||
|
"minecraft:skin": {
|
||||||
|
"resolution": [64, 64]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user