flashing block renderer

This commit is contained in:
Moritz Zwerger 2023-11-10 21:28:49 +01:00
parent ddcb339999
commit 57eac06abf
No known key found for this signature in database
GPG Key ID: 5CAD791931B09AC4
8 changed files with 185 additions and 4 deletions

View File

@ -27,7 +27,7 @@ import de.bixilon.minosoft.gui.rendering.util.mesh.Mesh
open class BlockFeature(
renderer: EntityRenderer<*>,
state: BlockState?,
var scale: Vec3 = Vec3(0.99f),
var scale: Vec3 = DEFAULT_SCALE,
) : EntityRenderFeature(renderer) {
private var mesh: BlockMesh? = null
private var matrix = Mat4()
@ -82,6 +82,10 @@ open class BlockFeature(
if (mesh.state != Mesh.MeshStates.LOADED) mesh.load()
renderer.renderer.context.system.reset(faceCulling = false)
val shader = renderer.renderer.features.block.shader
draw(mesh, shader)
}
protected open fun draw(mesh: BlockMesh, shader: BlockShader) {
shader.use()
shader.matrix = matrix
shader.tint = renderer.light.value
@ -93,4 +97,8 @@ open class BlockFeature(
this.mesh = null
renderer.renderer.queue += { mesh.unload() }
}
companion object {
val DEFAULT_SCALE = Vec3(0.99f)
}
}

View File

@ -15,12 +15,15 @@ package de.bixilon.minosoft.gui.rendering.entities.feature.block
import de.bixilon.minosoft.data.registries.identified.Namespaces.minosoft
import de.bixilon.minosoft.gui.rendering.entities.EntitiesRenderer
import de.bixilon.minosoft.gui.rendering.entities.feature.block.flashing.FlashingBlockShader
import de.bixilon.minosoft.gui.rendering.entities.feature.register.FeatureRegister
class BlockRegister(renderer: EntitiesRenderer) : FeatureRegister {
val shader = renderer.context.system.createShader(minosoft("entities/features/block"), ::BlockShader)
val flashing = renderer.context.system.createShader(minosoft("entities/features/block/flashing"), ::FlashingBlockShader)
override fun postInit() {
shader.load()
flashing.load()
}
}

View File

@ -25,7 +25,7 @@ import de.bixilon.minosoft.gui.rendering.shader.types.ViewProjectionShader
import de.bixilon.minosoft.gui.rendering.system.base.shader.NativeShader
import de.bixilon.minosoft.gui.rendering.system.base.texture.TextureManager
class BlockShader(
open class BlockShader(
override val native: NativeShader,
) : Shader(), TextureShader, ViewProjectionShader, FogShader, TintedShader {
override var textures: TextureManager by textureManager()

View File

@ -0,0 +1,58 @@
/*
* Minosoft
* Copyright (C) 2020-2023 Moritz Zwerger
*
* This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along with this program. If not, see <https://www.gnu.org/licenses/>.
*
* This software is not affiliated with Mojang AB, the original developer of Minecraft.
*/
package de.bixilon.minosoft.gui.rendering.entities.feature.block.flashing
import de.bixilon.kotlinglm.vec3.Vec3
import de.bixilon.minosoft.data.registries.blocks.state.BlockState
import de.bixilon.minosoft.data.text.formatting.color.ChatColors
import de.bixilon.minosoft.data.text.formatting.color.RGBColor
import de.bixilon.minosoft.gui.rendering.entities.feature.block.BlockFeature
import de.bixilon.minosoft.gui.rendering.entities.feature.block.BlockMesh
import de.bixilon.minosoft.gui.rendering.entities.feature.block.BlockShader
import de.bixilon.minosoft.gui.rendering.entities.renderer.EntityRenderer
import kotlin.math.abs
open class FlashingBlockFeature(
renderer: EntityRenderer<*>,
state: BlockState?,
scale: Vec3 = DEFAULT_SCALE,
var flashColor: RGBColor = ChatColors.WHITE,
var flashInterval: Float = 0.2f,
var maxFlash: Float = 0.5f
) : BlockFeature(renderer, state, scale) {
private var progress = 0.0f
override fun update(millis: Long, delta: Float) {
super.update(millis, delta)
updateFlashing(delta)
}
private fun updateFlashing(delta: Float) {
if (delta > flashInterval) return
progress += (delta / flashInterval)
if (progress > maxFlash) {
progress -= maxFlash * 2.0f
}
}
override fun draw(mesh: BlockMesh, shader: BlockShader) {
val shader = renderer.renderer.features.block.flashing
shader.use()
shader.flashColor = flashColor
shader.flashProgress = abs(progress)
super.draw(mesh, shader)
}
}

View File

@ -0,0 +1,25 @@
/*
* Minosoft
* Copyright (C) 2020-2023 Moritz Zwerger
*
* This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along with this program. If not, see <https://www.gnu.org/licenses/>.
*
* This software is not affiliated with Mojang AB, the original developer of Minecraft.
*/
package de.bixilon.minosoft.gui.rendering.entities.feature.block.flashing
import de.bixilon.minosoft.data.text.formatting.color.ChatColors
import de.bixilon.minosoft.gui.rendering.entities.feature.block.BlockShader
import de.bixilon.minosoft.gui.rendering.system.base.shader.NativeShader
class FlashingBlockShader(
native: NativeShader,
) : BlockShader(native) {
var flashColor by uniform("uFlashColor", ChatColors.WHITE) { shader, name, value -> shader.setUInt(name, value.rgb) }
var flashProgress by uniform("uFlashProgress", 0.0f)
}

View File

@ -18,10 +18,10 @@ import de.bixilon.minosoft.data.registries.blocks.MinecraftBlocks
import de.bixilon.minosoft.data.registries.identified.Identified
import de.bixilon.minosoft.gui.rendering.entities.EntitiesRenderer
import de.bixilon.minosoft.gui.rendering.entities.factory.RegisteredEntityModelFactory
import de.bixilon.minosoft.gui.rendering.entities.feature.block.BlockFeature
import de.bixilon.minosoft.gui.rendering.entities.feature.block.flashing.FlashingBlockFeature
class PrimedTNTEntityRenderer(renderer: EntitiesRenderer, entity: PrimedTNT) : EntityRenderer<PrimedTNT>(renderer, entity) {
val block = BlockFeature(this, renderer.connection.registries.block[MinecraftBlocks.TNT]?.states?.default).register()
val block = FlashingBlockFeature(this, renderer.connection.registries.block[MinecraftBlocks.TNT]?.states?.default).register()
companion object : RegisteredEntityModelFactory<PrimedTNT>, Identified {

View File

@ -0,0 +1,40 @@
/*
* Minosoft
* Copyright (C) 2020 Moritz Zwerger
*
* This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along with this program. If not, see <https://www.gnu.org/licenses/>.
*
* This software is not affiliated with Mojang AB, the original developer of Minecraft.
*/
#version 330 core
out vec4 foutColor;
uniform float uFlashProgress;
flat in uint finTextureIndex;
in vec3 finTextureCoordinates;
in vec4 finTintColor;
in vec4 finFlashColor;
#define TRANSPARENT
#include "minosoft:texture"
#include "minosoft:alpha"
#include "minosoft:fog"
void main() {
vec4 texelColor = getTexture(finTextureIndex, finTextureCoordinates, 0.0f);
discard_if_0(texelColor.a);
foutColor = texelColor * finTintColor;
foutColor = mix(foutColor, finFlashColor, uFlashProgress);
set_fog();
}

View File

@ -0,0 +1,47 @@
/*
* Minosoft
* Copyright (C) 2020 Moritz Zwerger
*
* This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along with this program. If not, see <https://www.gnu.org/licenses/>.
*
* This software is not affiliated with Mojang AB, the original developer of Minecraft.
*/
#version 330 core
layout (location = 0) in vec3 vinPosition;
layout (location = 1) in vec2 vinUV;
layout (location = 2) in float vinIndexLayerAnimation;// texture index (0xF0000000), texture layer (0x0FFFF000)
layout (location = 3) in float vinTint;
uniform mat4 uViewProjectionMatrix;
uniform mat4 uMatrix;
uniform uint uTintColor;
uniform uint uFlashColor;
flat out uint finTextureIndex;
out vec3 finTextureCoordinates;
out vec3 finFragmentPosition;
out vec4 finTintColor;
out vec4 finFlashColor;
#include "minosoft:color"
void main() {
vec4 position = uMatrix * vec4(vinPosition, 1.0f);
gl_Position = uViewProjectionMatrix * position;
finTintColor = getRGBColor(floatBitsToUint(vinTint)) * getRGBColor(uTintColor);
finFragmentPosition = position.xyz;
uint indexLayerAnimation = floatBitsToUint(vinIndexLayerAnimation);
finTextureIndex = indexLayerAnimation >> 28u;
finTextureCoordinates = vec3(vinUV, ((indexLayerAnimation >> 12) & 0xFFFFu));
finFlashColor = getRGBColor(uFlashColor);
}