From cf0a6a4927e952b0a499f97d31905fe821cbbe9a Mon Sep 17 00:00:00 2001 From: Bixilon Date: Thu, 10 Jun 2021 19:09:39 +0200 Subject: [PATCH] rendering: fix crashes, remove particle delta ticking --- .../entities/EntityHitBoxRenderer.kt | 3 +- .../rendering/particle/ParticleRenderer.kt | 2 +- .../gui/rendering/particle/types/Particle.kt | 64 +++++++++---------- .../norender/ExplosionEmitterParticle.kt | 4 +- .../types/render/texture/TextureParticle.kt | 2 +- .../advanced/AdvancedTextureParticle.kt | 2 +- .../render/texture/simple/PortalParticle.kt | 6 +- .../texture/simple/SimpleTextureParticle.kt | 4 +- .../simple/campfire/CampfireSmokeParticle.kt | 11 ++-- .../texture/simple/cloud/CloudParticle.kt | 4 +- .../texture/simple/damage/DamageParticle.kt | 6 +- .../simple/dust/AbstractDustParticle.kt | 6 +- .../simple/enchant/EnchantedGlyphParticle.kt | 5 +- .../texture/simple/lava/LavaParticle.kt | 4 +- .../texture/simple/slowing/FlameParticle.kt | 2 +- .../texture/simple/slowing/SlowingParticle.kt | 3 +- .../texture/simple/spell/SpellParticle.kt | 4 +- .../texture/simple/suspend/SuspendParticle.kt | 6 +- 18 files changed, 67 insertions(+), 71 deletions(-) diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/entities/EntityHitBoxRenderer.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/entities/EntityHitBoxRenderer.kt index 635319439..513f9d094 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/entities/EntityHitBoxRenderer.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/entities/EntityHitBoxRenderer.kt @@ -21,6 +21,7 @@ import de.bixilon.minosoft.gui.rendering.Renderer import de.bixilon.minosoft.gui.rendering.RendererBuilder import de.bixilon.minosoft.gui.rendering.chunk.models.AABB import de.bixilon.minosoft.gui.rendering.modding.events.FrustumChangeEvent +import de.bixilon.minosoft.gui.rendering.util.mesh.Mesh import de.bixilon.minosoft.modding.event.CallbackEventInvoker import de.bixilon.minosoft.modding.event.events.EntityDestroyEvent import de.bixilon.minosoft.modding.event.events.EntitySpawnEvent @@ -49,7 +50,7 @@ class EntityHitBoxRenderer( if (aabb != mesh?.aabb) { this.meshes.remove(entity) - if (mesh?.needsUpdate == true) { + if (mesh?.state == Mesh.MeshStates.LOADED) { mesh.unload() } nextMesh = createMesh(entity, aabb, visible) 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 9df4175cd..71b2ff085 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 @@ -89,7 +89,7 @@ class ParticleRenderer( for (particle in particles.toSynchronizedSet()) { - particle.tick() + particle.tryTick() if (particle.dead) { this.particles -= particle continue 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 27e86a950..92da7189f 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 @@ -18,9 +18,9 @@ import de.bixilon.minosoft.data.physics.PhysicsEntity import de.bixilon.minosoft.gui.rendering.chunk.models.AABB import de.bixilon.minosoft.gui.rendering.particle.ParticleFactory import de.bixilon.minosoft.gui.rendering.particle.ParticleMesh +import de.bixilon.minosoft.gui.rendering.util.VecUtil import de.bixilon.minosoft.gui.rendering.util.VecUtil.EMPTY import de.bixilon.minosoft.gui.rendering.util.VecUtil.assign -import de.bixilon.minosoft.gui.rendering.util.VecUtil.millis import de.bixilon.minosoft.gui.rendering.util.VecUtil.plusAssign import de.bixilon.minosoft.protocol.network.connection.PlayConnection import de.bixilon.minosoft.protocol.protocol.ProtocolDefinition @@ -41,7 +41,7 @@ abstract class Particle( connection.registries.particleTypeRegistry[resourceLocation]!!.default() } protected val random = Random - var lastTickTime = -1L + private var lastTickTime = -1L // ageing var dead = false @@ -52,6 +52,9 @@ abstract class Particle( var maxAge: Int = (4.0f / (random.nextFloat() * 0.9f + 0.1f)).toInt() // moving + val cameraPosition: Vec3d + get() = VecUtil.lerp((System.currentTimeMillis() - lastTickTime) / ProtocolDefinition.TICK_TIMEd, previousPosition, position) + final override val velocity: Vec3d = Vec3d(velocity) var previousPosition = position var movement: Boolean = true @@ -79,9 +82,6 @@ abstract class Particle( } - private var lastRealTickTime = -1L - - init { this.velocity += { (random.nextDouble() * 2.0 - 1.0) * MAGIC_VELOCITY_CONSTANT } val modifier = (random.nextFloat() + random.nextFloat() + 1.0f) * 0.15000000596046448 @@ -93,6 +93,16 @@ abstract class Particle( spacing = Vec3(0.2) } + fun forceMove(delta: Vec3d) { + this.previousPosition = Vec3d(position) + position += delta + } + + fun forceMove(move: () -> Double) { + this.previousPosition = Vec3d(position) + position += move + } + open fun move(velocity: Vec3d) { if (alreadyCollided) { return @@ -104,7 +114,7 @@ abstract class Particle( } if (newVelocity != Vec3d.EMPTY) { - position += newVelocity + forceMove(newVelocity) } if (abs(newVelocity.y) >= Y_VELOCITY_TO_CHECK && abs(velocity.y) < Y_VELOCITY_TO_CHECK) { @@ -112,38 +122,31 @@ abstract class Particle( } } - private fun move(deltaTime: Int) { + private fun move() { if (!movement) { return } - previousPosition = Vec3d(position) - move(velocity.millis * (deltaTime / 1000.0f)) + forceMove(velocity) } - fun tick() { + fun tryTick() { val currentTime = System.currentTimeMillis() - if (lastTickTime == -1L) { - // never ticked before, skip - lastTickTime = currentTime - return - } - val deltaTime = (currentTime - lastTickTime).toInt() - - tick(deltaTime) if (dead) { return } - if (lastRealTickTime == -1L) { - lastRealTickTime = System.currentTimeMillis() - } else if (currentTime - lastRealTickTime >= ProtocolDefinition.TICK_TIME) { - realTick() - lastRealTickTime = currentTime + if (lastTickTime == -1L) { + lastTickTime = System.currentTimeMillis() + return } - - postTick(deltaTime) + if (currentTime - lastTickTime < ProtocolDefinition.TICK_TIME) { + return + } + tick() + move() + postTick() lastTickTime = currentTime } @@ -153,16 +156,9 @@ abstract class Particle( } } - open fun tick(deltaTime: Int) { - check(!dead) { "Cannot tick dead particle!" } - check(deltaTime >= 0) - } + open fun postTick() {} - open fun postTick(deltaTime: Int) { - move(deltaTime) - } - - open fun realTick() { + open fun tick() { age() if (dead) { return diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/particle/types/norender/ExplosionEmitterParticle.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/particle/types/norender/ExplosionEmitterParticle.kt index 15481006a..db63daa73 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/particle/types/norender/ExplosionEmitterParticle.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/particle/types/norender/ExplosionEmitterParticle.kt @@ -31,8 +31,8 @@ class ExplosionEmitterParticle(connection: PlayConnection, position: Vec3d, data movement = false } - override fun realTick() { - super.realTick() + override fun tick() { + super.tick() explosionParticleType ?: let { dead = true return 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 acc015f2a..651e177cb 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 @@ -26,7 +26,7 @@ abstract class TextureParticle(connection: PlayConnection, position: Vec3d, velo override fun addVertex(particleMesh: ParticleMesh) { texture?.let { - particleMesh.addVertex(position, scale, it, color) + particleMesh.addVertex(cameraPosition, 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 fff09abe1..3eb50ab0f 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 @@ -26,7 +26,7 @@ abstract class AdvancedTextureParticle(connection: PlayConnection, position: Vec override fun addVertex(particleMesh: ParticleMesh) { texture?.let { - particleMesh.addVertex(position, scale, it, color, minUV, maxUV) + particleMesh.addVertex(cameraPosition, scale, it, color, minUV, maxUV) } } } diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/particle/types/render/texture/simple/PortalParticle.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/particle/types/render/texture/simple/PortalParticle.kt index 45c547779..acadf67ac 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/particle/types/render/texture/simple/PortalParticle.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/particle/types/render/texture/simple/PortalParticle.kt @@ -48,11 +48,11 @@ class PortalParticle(connection: PlayConnection, position: Vec3d, velocity: Vec3 } override fun move(velocity: Vec3d) { - this.position += velocity + forceMove(velocity) } - override fun realTick() { - super.realTick() + override fun tick() { + super.tick() if (dead) { return } diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/particle/types/render/texture/simple/SimpleTextureParticle.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/particle/types/render/texture/simple/SimpleTextureParticle.kt index eb8efe66e..0e924008a 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/particle/types/render/texture/simple/SimpleTextureParticle.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/particle/types/render/texture/simple/SimpleTextureParticle.kt @@ -40,8 +40,8 @@ abstract class SimpleTextureParticle(connection: PlayConnection, position: Vec3d texture = connection.rendering?.renderWindow?.textures?.allTextures?.get(data.type.textures.random(random)) } - override fun tick(deltaTime: Int) { - super.tick(deltaTime) + override fun tick() { + super.tick() if (dead) { return } diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/particle/types/render/texture/simple/campfire/CampfireSmokeParticle.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/particle/types/render/texture/simple/campfire/CampfireSmokeParticle.kt index 8376816f0..b92676d99 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/particle/types/render/texture/simple/campfire/CampfireSmokeParticle.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/particle/types/render/texture/simple/campfire/CampfireSmokeParticle.kt @@ -19,7 +19,6 @@ import de.bixilon.minosoft.gui.rendering.particle.ParticleFactory import de.bixilon.minosoft.gui.rendering.particle.types.render.texture.simple.SimpleTextureParticle import de.bixilon.minosoft.gui.rendering.util.VecUtil.EMPTY import de.bixilon.minosoft.gui.rendering.util.VecUtil.assign -import de.bixilon.minosoft.gui.rendering.util.VecUtil.millis import de.bixilon.minosoft.protocol.network.connection.PlayConnection import de.bixilon.minosoft.util.KUtil.asResourceLocation import glm_.vec3.Vec3 @@ -47,8 +46,8 @@ class CampfireSmokeParticle(connection: PlayConnection, position: Vec3d, velocit setRandomSprite() } - override fun realTick() { - super.realTick() + override fun tick() { + super.tick() val horizontal = { (random.nextDouble() / 5000.0f * (if (random.nextBoolean()) 1.0f else -1.0f)) } velocity.x += horizontal() velocity.y -= gravityStrength @@ -62,9 +61,9 @@ class CampfireSmokeParticle(connection: PlayConnection, position: Vec3d, velocit } } - override fun postTick(deltaTime: Int) { - super.postTick(deltaTime) - move(velocity.millis * (deltaTime / 1000.0f)) + override fun postTick() { + super.postTick() + move(velocity) } diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/particle/types/render/texture/simple/cloud/CloudParticle.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/particle/types/render/texture/simple/cloud/CloudParticle.kt index a69003264..7225d4b9c 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/particle/types/render/texture/simple/cloud/CloudParticle.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/particle/types/render/texture/simple/cloud/CloudParticle.kt @@ -40,8 +40,8 @@ open class CloudParticle(connection: PlayConnection, position: Vec3d, velocity: physics = false } - override fun realTick() { - super.realTick() + override fun tick() { + super.tick() if (dead) { return } diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/particle/types/render/texture/simple/damage/DamageParticle.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/particle/types/render/texture/simple/damage/DamageParticle.kt index b4adf761f..e011c2cbf 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/particle/types/render/texture/simple/damage/DamageParticle.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/particle/types/render/texture/simple/damage/DamageParticle.kt @@ -38,11 +38,11 @@ abstract class DamageParticle(connection: PlayConnection, position: Vec3d, veloc super.scale *= 0.75f maxAge = (6.0f / (random.nextFloat() * 0.8f + 0.6f)).toInt().coerceAtLeast(1) physics = false - realTick() + tick() } - final override fun realTick() { - super.realTick() + final override fun tick() { + super.tick() color = color.with(green = this.color.floatGreen * 0.96f, blue = this.color.floatBlue * 0.96f) } } diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/particle/types/render/texture/simple/dust/AbstractDustParticle.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/particle/types/render/texture/simple/dust/AbstractDustParticle.kt index 23cc229fb..e2b7f3565 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/particle/types/render/texture/simple/dust/AbstractDustParticle.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/particle/types/render/texture/simple/dust/AbstractDustParticle.kt @@ -49,9 +49,9 @@ abstract class AbstractDustParticle(connection: PlayConnection, position: Vec3d, return (random.nextFloat() * 0.2f + 0.8f) * color * brightness } - override fun realTick() { - super.realTick() - position += velocity + override fun tick() { + super.tick() + forceMove(velocity) velocity *= 0.99f } diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/particle/types/render/texture/simple/enchant/EnchantedGlyphParticle.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/particle/types/render/texture/simple/enchant/EnchantedGlyphParticle.kt index 0e492a1e5..fe811f418 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/particle/types/render/texture/simple/enchant/EnchantedGlyphParticle.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/particle/types/render/texture/simple/enchant/EnchantedGlyphParticle.kt @@ -41,11 +41,12 @@ abstract class EnchantedGlyphParticle(connection: PlayConnection, position: Vec3 setRandomSprite() } - override fun postTick(deltaTime: Int) { - super.postTick(deltaTime) + override fun postTick() { + super.postTick() if (dead) { return } + val ageDivisor = 1.0 - floatAge / maxAge val ageDivisor2 = (1.0 - ageDivisor).pow(3) this.position assign (startPosition + velocity * ageDivisor) diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/particle/types/render/texture/simple/lava/LavaParticle.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/particle/types/render/texture/simple/lava/LavaParticle.kt index ffb352aed..72a5ae2c9 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/particle/types/render/texture/simple/lava/LavaParticle.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/particle/types/render/texture/simple/lava/LavaParticle.kt @@ -42,8 +42,8 @@ class LavaParticle(connection: PlayConnection, position: Vec3d, data: ParticleDa maxAge = (16.0f / (random.nextFloat() * 0.8f + 0.2f)).toInt() } - override fun realTick() { - super.realTick() + override fun tick() { + super.tick() if (random.nextFloat() > (floatAge / maxAge)) { connection.world += SmokeParticle(connection, Vec3d(position), Vec3d(velocity)) diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/particle/types/render/texture/simple/slowing/FlameParticle.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/particle/types/render/texture/simple/slowing/FlameParticle.kt index 552d93595..5a3c256f2 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/particle/types/render/texture/simple/slowing/FlameParticle.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/particle/types/render/texture/simple/slowing/FlameParticle.kt @@ -30,7 +30,7 @@ open class FlameParticle(connection: PlayConnection, position: Vec3d, velocity: } override fun move(velocity: Vec3d) { - position += velocity + forceMove(velocity) } companion object : ParticleFactory { diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/particle/types/render/texture/simple/slowing/SlowingParticle.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/particle/types/render/texture/simple/slowing/SlowingParticle.kt index e1109f649..46eb37b4b 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/particle/types/render/texture/simple/slowing/SlowingParticle.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/particle/types/render/texture/simple/slowing/SlowingParticle.kt @@ -16,7 +16,6 @@ package de.bixilon.minosoft.gui.rendering.particle.types.render.texture.simple.s import de.bixilon.minosoft.data.mappings.particle.data.ParticleData import de.bixilon.minosoft.gui.rendering.particle.types.render.texture.simple.SimpleTextureParticle import de.bixilon.minosoft.gui.rendering.util.VecUtil.assign -import de.bixilon.minosoft.gui.rendering.util.VecUtil.plusAssign import de.bixilon.minosoft.protocol.network.connection.PlayConnection import glm_.vec3.Vec3d @@ -25,7 +24,7 @@ abstract class SlowingParticle(connection: PlayConnection, position: Vec3d, velo init { friction = 0.96f this.velocity assign (this.velocity * 0.009999999776482582 + velocity) - this.position += { (random.nextDouble() - random.nextDouble()) * 0.05 } + forceMove { (random.nextDouble() - random.nextDouble()) * 0.05 } maxAge = (8.0 / (random.nextDouble() * 0.8 + 0.2)).toInt() + 4 } } diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/particle/types/render/texture/simple/spell/SpellParticle.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/particle/types/render/texture/simple/spell/SpellParticle.kt index 99baa776a..d4986413e 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/particle/types/render/texture/simple/spell/SpellParticle.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/particle/types/render/texture/simple/spell/SpellParticle.kt @@ -38,8 +38,8 @@ abstract class SpellParticle(connection: PlayConnection, position: Vec3d, veloci // ToDo: Toggle if using spyglass } - override fun realTick() { - super.realTick() + override fun tick() { + super.tick() color = color.with(alpha = VecUtil.lerp(0.05f, color.floatAlpha, 1.0f)) } diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/particle/types/render/texture/simple/suspend/SuspendParticle.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/particle/types/render/texture/simple/suspend/SuspendParticle.kt index e601b32da..eaf2c349b 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/particle/types/render/texture/simple/suspend/SuspendParticle.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/particle/types/render/texture/simple/suspend/SuspendParticle.kt @@ -31,12 +31,12 @@ abstract class SuspendParticle(connection: PlayConnection, position: Vec3d, velo movement = false } - override fun realTick() { - super.realTick() + override fun tick() { + super.tick() if (dead) { return } - position += velocity + forceMove(velocity) velocity *= 0.99f }