From f46f702920b8d8b60e3fcdb90f870253108b1d79 Mon Sep 17 00:00:00 2001 From: Bixilon Date: Mon, 1 Nov 2021 17:37:02 +0100 Subject: [PATCH] improve particle render performance --- .../minosoft/gui/rendering/particle/ParticleRenderer.kt | 3 ++- .../minosoft/gui/rendering/particle/types/Particle.kt | 8 ++++++-- .../rendering/particle/types/norender/NoRenderParticle.kt | 2 +- .../particle/types/render/texture/TextureParticle.kt | 4 ++-- .../render/texture/advanced/AdvancedTextureParticle.kt | 4 ++-- 5 files changed, 13 insertions(+), 8 deletions(-) diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/particle/ParticleRenderer.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/particle/ParticleRenderer.kt index 07d25545a..e9c4754a9 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/particle/ParticleRenderer.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/particle/ParticleRenderer.kt @@ -125,12 +125,13 @@ class ParticleRenderer( particleQueue.clear() } + val time = System.currentTimeMillis() for (particle in particles) { if (particle.dead) { toRemove += particle continue } - particle.addVertex(transparentParticleMesh, particleMesh) + particle.addVertex(transparentParticleMesh, particleMesh, time) } particles -= toRemove } diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/particle/types/Particle.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/particle/types/Particle.kt index 77067aad9..ae0d0c2b4 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/particle/types/Particle.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/particle/types/Particle.kt @@ -53,7 +53,7 @@ abstract class Particle( // moving val cameraPosition: Vec3d - get() = VecUtil.lerp((System.currentTimeMillis() - lastTickTime) / ProtocolDefinition.TICK_TIMEd, previousPosition, position) + get() = getCameraPosition(System.currentTimeMillis()) final override val velocity: Vec3d = Vec3d(velocity) var previousPosition = position @@ -93,6 +93,10 @@ abstract class Particle( spacing = Vec3(0.2) } + fun getCameraPosition(time: Long): Vec3d { + return VecUtil.lerp((time - lastTickTime) / ProtocolDefinition.TICK_TIMEd, previousPosition, position) + } + fun forceMove(delta: Vec3d) { this.previousPosition = Vec3d(position) position += delta @@ -186,7 +190,7 @@ abstract class Particle( } } - abstract fun addVertex(transparentMesh: ParticleMesh, particleMesh: ParticleMesh) + abstract fun addVertex(transparentMesh: ParticleMesh, particleMesh: ParticleMesh, time: Long) companion object { private const val MAGIC_VELOCITY_CONSTANT = 0.4 diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/particle/types/norender/NoRenderParticle.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/particle/types/norender/NoRenderParticle.kt index 2c9c5b9d5..58f18371c 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/particle/types/norender/NoRenderParticle.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/particle/types/norender/NoRenderParticle.kt @@ -21,5 +21,5 @@ import glm_.vec3.Vec3d abstract class NoRenderParticle(connection: PlayConnection, position: Vec3d, velocity: Vec3d, data: ParticleData?) : Particle(connection, position, velocity, data) { - override fun addVertex(transparentMesh: ParticleMesh, particleMesh: ParticleMesh) = Unit + override fun addVertex(transparentMesh: ParticleMesh, particleMesh: ParticleMesh, time: Long) = Unit } diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/particle/types/render/texture/TextureParticle.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/particle/types/render/texture/TextureParticle.kt index a6c5b2d1f..54502e936 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/particle/types/render/texture/TextureParticle.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/particle/types/render/texture/TextureParticle.kt @@ -25,13 +25,13 @@ abstract class TextureParticle(connection: PlayConnection, position: Vec3d, velo abstract val texture: AbstractTexture? - override fun addVertex(transparentMesh: ParticleMesh, particleMesh: ParticleMesh) { + override fun addVertex(transparentMesh: ParticleMesh, particleMesh: ParticleMesh, time: Long) { texture?.let { if (it.transparency == TextureTransparencies.TRANSLUCENT || color.alpha != 255) { transparentMesh } else { particleMesh - }.addVertex(cameraPosition, scale, it, color) + }.addVertex(getCameraPosition(time), scale, it, color) } } } diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/particle/types/render/texture/advanced/AdvancedTextureParticle.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/particle/types/render/texture/advanced/AdvancedTextureParticle.kt index ed024d0a1..118f35468 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/particle/types/render/texture/advanced/AdvancedTextureParticle.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/particle/types/render/texture/advanced/AdvancedTextureParticle.kt @@ -25,13 +25,13 @@ abstract class AdvancedTextureParticle(connection: PlayConnection, position: Vec var minUV: Vec2 = Vec2(0.0f, 0.0f) var maxUV: Vec2 = Vec2(1.0f, 1.0f) - override fun addVertex(transparentMesh: ParticleMesh, particleMesh: ParticleMesh) { + override fun addVertex(transparentMesh: ParticleMesh, particleMesh: ParticleMesh, time: Long) { texture?.let { if (it.transparency == TextureTransparencies.TRANSLUCENT || color.alpha != 255) { transparentMesh } else { particleMesh - }.addVertex(cameraPosition, scale, it, color, minUV, maxUV) + }.addVertex(getCameraPosition(time), scale, it, color, minUV, maxUV) } } }