particles: add second mesh to improve transparency

This commit is contained in:
Bixilon 2021-06-10 21:49:41 +02:00 committed by Lukas
parent 38297daf21
commit ada390bd4d
5 changed files with 25 additions and 8 deletions

View File

@ -39,6 +39,7 @@ class ParticleRenderer(
) : Renderer {
private lateinit var particleShader: Shader
private var particleMesh = ParticleMesh()
private var transparentParticleMesh = ParticleMesh()
private var particles: MutableSet<Particle> = synchronizedSetOf()
@ -51,6 +52,7 @@ class ParticleRenderer(
}
})
particleMesh.load()
transparentParticleMesh.load()
connection.registries.particleTypeRegistry.forEachItem {
for (resourceLocation in it.textures) {
renderWindow.textures.allTextures[resourceLocation] = Texture(resourceLocation)
@ -85,7 +87,9 @@ class ParticleRenderer(
particleShader.use()
particleMesh.unload()
transparentParticleMesh.unload()
particleMesh = ParticleMesh()
transparentParticleMesh = ParticleMesh()
for (particle in particles.toSynchronizedSet()) {
@ -94,13 +98,16 @@ class ParticleRenderer(
this.particles -= particle
continue
}
particle.addVertex(particleMesh)
particle.addVertex(transparentParticleMesh, particleMesh)
}
particleMesh.load()
transparentParticleMesh.load()
particleMesh.draw()
glDepthMask(false)
particleMesh.draw()
transparentParticleMesh.draw()
glDepthMask(true)
}

View File

@ -181,7 +181,7 @@ abstract class Particle(
}
}
abstract fun addVertex(particleMesh: ParticleMesh)
abstract fun addVertex(transparentMesh: ParticleMesh, particleMesh: ParticleMesh)
companion object {
private const val MAGIC_VELOCITY_CONSTANT = 0.4000000059604645

View File

@ -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(particleMesh: ParticleMesh) {}
override fun addVertex(transparentMesh: ParticleMesh, particleMesh: ParticleMesh) {}
}

View File

@ -17,6 +17,7 @@ import de.bixilon.minosoft.data.mappings.particle.data.ParticleData
import de.bixilon.minosoft.gui.rendering.particle.ParticleMesh
import de.bixilon.minosoft.gui.rendering.particle.types.render.RenderParticle
import de.bixilon.minosoft.gui.rendering.textures.Texture
import de.bixilon.minosoft.gui.rendering.textures.TextureTransparencies
import de.bixilon.minosoft.protocol.network.connection.PlayConnection
import glm_.vec3.Vec3d
@ -24,9 +25,13 @@ abstract class TextureParticle(connection: PlayConnection, position: Vec3d, velo
abstract val texture: Texture?
override fun addVertex(particleMesh: ParticleMesh) {
override fun addVertex(transparentMesh: ParticleMesh, particleMesh: ParticleMesh) {
texture?.let {
particleMesh.addVertex(cameraPosition, scale, it, color)
if (it.transparency == TextureTransparencies.TRANSLUCENT || color.alpha != 255) {
transparentMesh
} else {
particleMesh
}.addVertex(cameraPosition, scale, it, color)
}
}
}

View File

@ -16,6 +16,7 @@ package de.bixilon.minosoft.gui.rendering.particle.types.render.texture.advanced
import de.bixilon.minosoft.data.mappings.particle.data.ParticleData
import de.bixilon.minosoft.gui.rendering.particle.ParticleMesh
import de.bixilon.minosoft.gui.rendering.particle.types.render.texture.simple.SimpleTextureParticle
import de.bixilon.minosoft.gui.rendering.textures.TextureTransparencies
import de.bixilon.minosoft.protocol.network.connection.PlayConnection
import glm_.vec2.Vec2
import glm_.vec3.Vec3d
@ -24,9 +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(particleMesh: ParticleMesh) {
override fun addVertex(transparentMesh: ParticleMesh, particleMesh: ParticleMesh) {
texture?.let {
particleMesh.addVertex(cameraPosition, scale, it, color, minUV, maxUV)
if (it.transparency == TextureTransparencies.TRANSLUCENT || color.alpha != 255) {
transparentMesh
} else {
particleMesh
}.addVertex(cameraPosition, scale, it, color, minUV, maxUV)
}
}
}