reuse particle data, improve particle performance

This commit is contained in:
Bixilon 2021-11-28 15:50:26 +01:00
parent 653322637f
commit 4c94ae5ffb
No known key found for this signature in database
GPG Key ID: 5CAD791931B09AC4
2 changed files with 9 additions and 5 deletions

View File

@ -20,11 +20,12 @@ import de.bixilon.minosoft.gui.rendering.system.base.buffer.vertex.PrimitiveType
import de.bixilon.minosoft.gui.rendering.system.base.texture.texture.AbstractTexture
import de.bixilon.minosoft.gui.rendering.util.mesh.Mesh
import de.bixilon.minosoft.gui.rendering.util.mesh.MeshStruct
import de.bixilon.minosoft.util.collections.floats.DirectArrayFloatList
import glm_.vec2.Vec2
import glm_.vec3.Vec3
import glm_.vec3.Vec3d
class ParticleMesh(renderWindow: RenderWindow, initialCacheSize: Int) : Mesh(renderWindow, ParticleMeshStruct, PrimitiveTypes.POINT, initialCacheSize) {
class ParticleMesh(renderWindow: RenderWindow, data: DirectArrayFloatList) : Mesh(renderWindow, ParticleMeshStruct, PrimitiveTypes.POINT, -1, clearOnLoad = false, data = data) {
fun addVertex(position: Vec3d, scale: Float, texture: AbstractTexture, tintColor: RGBColor, uvMin: Vec2 = Vec2(0.0f, 0.0f), uvMax: Vec2 = Vec2(1.0f, 1.0f)) {
val minTransformedUV = texture.renderData?.transformUV(uvMin) ?: uvMin

View File

@ -30,6 +30,7 @@ import de.bixilon.minosoft.modding.event.invoker.CallbackEventInvoker
import de.bixilon.minosoft.protocol.network.connection.play.PlayConnection
import de.bixilon.minosoft.protocol.network.connection.play.PlayConnectionStates.Companion.disconnected
import de.bixilon.minosoft.protocol.protocol.ProtocolDefinition
import de.bixilon.minosoft.util.collections.floats.DirectArrayFloatList
import de.bixilon.minosoft.util.logging.Log
import de.bixilon.minosoft.util.logging.LogLevels
import de.bixilon.minosoft.util.logging.LogMessageType
@ -48,8 +49,8 @@ class ParticleRenderer(
private val translucentShader: Shader = renderSystem.createShader(ResourceLocation(ProtocolDefinition.MINOSOFT_NAMESPACE, "particle"))
// There is no opaque mesh because it is simply not needed (every particle has transparency)
private var transparentMesh = ParticleMesh(renderWindow, 0)
private var translucentMesh = ParticleMesh(renderWindow, 0)
private var transparentMesh = ParticleMesh(renderWindow, DirectArrayFloatList(RenderConstants.MAXIMUM_PARTICLE_AMOUNT * ParticleMesh.ParticleMeshStruct.FLOATS_PER_VERTEX))
private var translucentMesh = ParticleMesh(renderWindow, DirectArrayFloatList(RenderConstants.MAXIMUM_PARTICLE_AMOUNT * ParticleMesh.ParticleMeshStruct.FLOATS_PER_VERTEX))
private var particles: MutableSet<Particle> = mutableSetOf()
private var particleQueue: MutableSet<Particle> = mutableSetOf()
@ -150,8 +151,10 @@ class ParticleRenderer(
val toRemove: MutableSet<Particle> = mutableSetOf()
transparentMesh = ParticleMesh(renderWindow, particles.size + particleQueue.size * ParticleMesh.ParticleMeshStruct.FLOATS_PER_VERTEX)
translucentMesh = ParticleMesh(renderWindow, particles.size + particleQueue.size * ParticleMesh.ParticleMeshStruct.FLOATS_PER_VERTEX)
transparentMesh.data.clear()
translucentMesh.data.clear()
transparentMesh = ParticleMesh(renderWindow, transparentMesh.data)
translucentMesh = ParticleMesh(renderWindow, translucentMesh.data)
synchronized(particles) {