fix some particle async bugs

This commit is contained in:
Bixilon 2021-09-26 23:32:42 +02:00
parent 7c33e3c2be
commit d3f53e3b8f
No known key found for this signature in database
GPG Key ID: 5CAD791931B09AC4

View File

@ -26,7 +26,9 @@ 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.PlayConnection
import de.bixilon.minosoft.protocol.network.connection.play.PlayConnectionStates.Companion.disconnected import de.bixilon.minosoft.protocol.network.connection.play.PlayConnectionStates.Companion.disconnected
import de.bixilon.minosoft.protocol.protocol.ProtocolDefinition import de.bixilon.minosoft.protocol.protocol.ProtocolDefinition
import de.bixilon.minosoft.util.KUtil.toSynchronizedSet import de.bixilon.minosoft.util.logging.Log
import de.bixilon.minosoft.util.logging.LogLevels
import de.bixilon.minosoft.util.logging.LogMessageType
import de.bixilon.minosoft.util.task.time.TimeWorker import de.bixilon.minosoft.util.task.time.TimeWorker
import de.bixilon.minosoft.util.task.time.TimeWorkerTask import de.bixilon.minosoft.util.task.time.TimeWorkerTask
import glm_.mat4x4.Mat4 import glm_.mat4x4.Mat4
@ -77,9 +79,11 @@ class ParticleRenderer(
connection.world.particleRenderer = this connection.world.particleRenderer = this
particleTask = TimeWorker.addTask(TimeWorkerTask(ProtocolDefinition.TICK_TIME, maxDelayTime = ProtocolDefinition.TICK_TIME / 2) { particleTask = TimeWorker.addTask(TimeWorkerTask(ProtocolDefinition.TICK_TIME, maxDelayTime = ProtocolDefinition.TICK_TIME / 2) {
for (particle in particles.toSynchronizedSet()) { synchronized(particles) {
for (particle in particles) {
particle.tryTick() particle.tryTick()
} }
}
}) })
connection.registerEvent(CallbackEventInvoker.of<PlayConnectionStateChangeEvent> { connection.registerEvent(CallbackEventInvoker.of<PlayConnectionStateChangeEvent> {
@ -92,7 +96,10 @@ class ParticleRenderer(
fun add(particle: Particle) { fun add(particle: Particle) {
val particleCount = particles.size + particleQueue.size val particleCount = particles.size + particleQueue.size
check(particleCount < RenderConstants.MAXIMUM_PARTICLE_AMOUNT) { "Can not add particle: Limit reached (${particleCount} > ${RenderConstants.MAXIMUM_PARTICLE_AMOUNT}" } if (particleCount >= RenderConstants.MAXIMUM_PARTICLE_AMOUNT) {
Log.log(LogMessageType.RENDERING_GENERAL, LogLevels.WARN) { "Can not add particle: Limit reached (${particleCount} > ${RenderConstants.MAXIMUM_PARTICLE_AMOUNT}" }
return
}
synchronized(particleQueue) { synchronized(particleQueue) {
particleQueue += particle particleQueue += particle
} }
@ -109,14 +116,15 @@ class ParticleRenderer(
val toRemove: MutableSet<Particle> = mutableSetOf() val toRemove: MutableSet<Particle> = mutableSetOf()
particleMesh = ParticleMesh(renderWindow, particles.size + particleQueue.size)
transparentParticleMesh = ParticleMesh(renderWindow, 500)
synchronized(particles) {
synchronized(particleQueue) { synchronized(particleQueue) {
particles += particleQueue particles += particleQueue
particleQueue.clear() particleQueue.clear()
} }
particleMesh = ParticleMesh(renderWindow, particles.size)
transparentParticleMesh = ParticleMesh(renderWindow, 500)
for (particle in particles) { for (particle in particles) {
if (particle.dead) { if (particle.dead) {
toRemove += particle toRemove += particle
@ -125,6 +133,7 @@ class ParticleRenderer(
particle.addVertex(transparentParticleMesh, particleMesh) particle.addVertex(transparentParticleMesh, particleMesh)
} }
particles -= toRemove particles -= toRemove
}
particleMesh.load() particleMesh.load()
transparentParticleMesh.load() transparentParticleMesh.load()