far better fog, improvements

This commit is contained in:
Bixilon 2022-01-04 01:52:34 +01:00
parent 5f93c19690
commit 99febe97be
No known key found for this signature in database
GPG Key ID: 5CAD791931B09AC4
11 changed files with 108 additions and 31 deletions

View File

@ -55,6 +55,10 @@ class Chunk(
val isFullyLoaded: Boolean
get() = isLoaded && neighboursLoaded
init {
// connection.world.view.updateServerViewDistance(chunkPosition, true)
}
operator fun get(sectionHeight: Int): ChunkSection? = sections?.getOrNull(sectionHeight - lowestSection)
fun unsafeGet(x: Int, y: Int, z: Int): BlockState? {

View File

@ -128,6 +128,7 @@ class World(
neighbour.neighboursLoaded = false
connection.fireEvent(ChunkDataChangeEvent(connection, EventInitiators.UNKNOWN, neighbourPosition, neighbour))
}
// connection.world.view.updateServerViewDistance(chunkPosition, false)
connection.fireEvent(ChunkUnloadEvent(connection, EventInitiators.UNKNOWN, chunkPosition, chunk))
}

View File

@ -1,51 +1,88 @@
package de.bixilon.minosoft.gui.rendering.camera
import de.bixilon.kutil.cast.CastUtil.nullCast
import de.bixilon.minosoft.data.registries.effects.DefaultStatusEffects
import de.bixilon.minosoft.data.registries.fluid.water.WaterFluid
import de.bixilon.minosoft.data.text.ChatColors
import de.bixilon.minosoft.data.text.RGBColor
import de.bixilon.minosoft.gui.rendering.RenderWindow
import de.bixilon.minosoft.gui.rendering.sky.SkyRenderer
import de.bixilon.minosoft.protocol.protocol.ProtocolDefinition
import de.bixilon.minosoft.util.delegate.watcher.SimpleDelegateWatcher.Companion.watchRendering
@Deprecated("Needs some refactoring and improvements")
class FogManager(
private val renderWindow: RenderWindow,
) {
private var upToDate = false
private val blindness = renderWindow.connection.registries.statusEffectRegistry[DefaultStatusEffects.BLINDNESS]
private val player = renderWindow.connection.player
var fogColor: RGBColor = ChatColors.GREEN
var fogColor: RGBColor? = null
set(value) {
if (field == value) {
return
}
field = value
upToDate = false
updateShaders = true
}
private var fogStart = 0.0f
set(value) {
if (field == value) {
return
}
field = value
updateShaders = true
}
private var fogEnd = 0.0f
set(value) {
if (field == value) {
return
}
field = value
updateShaders = true
}
private var updateShaders = true
fun init() {
renderWindow.connection.world.view::viewDistance.watchRendering(this, true) { calculateFog() }
}
fun draw() {
if (upToDate) {
calculateFog()
if (!updateShaders) {
return
}
calculateFog()
updateShaders()
}
private fun calculateFog() {
if (!renderWindow.connection.profiles.rendering.fog.enabled) {
// ToDo: This is not improving performance
fogStart = Float.MAX_VALUE
fogEnd = Float.MAX_VALUE
var fogStart = if (!renderWindow.connection.profiles.rendering.fog.enabled) {
Float.MAX_VALUE
} else {
fogStart = renderWindow.connection.world.view.viewDistance * 16.0f - 8.0f // ToDo
fogEnd = fogStart + 10.0f
renderWindow.connection.world.view.viewDistance * ProtocolDefinition.SECTION_WIDTH_X - (ProtocolDefinition.SECTION_WIDTH_X / 2.0f) // could be improved? basically view distance in blocks and then the center of that chunk
}
renderWindow.renderer[SkyRenderer]?.let { fogColor = it.baseColor }
var fogEnd = fogStart + 15.0f
var color: RGBColor? = null
player.submergedFluid?.nullCast<WaterFluid>()?.let {
color = player.positionInfo.biome?.waterFogColor
fogStart = 5.0f
fogEnd = 10.0f
} ?: player.activeStatusEffects[blindness]?.let {
color = ChatColors.BLACK
fogStart = 3.0f
fogEnd = 5.0f
}
this.fogStart = fogStart
this.fogEnd = fogEnd
this.fogColor = color
}
private fun updateShaders() {
val start = fogStart
val end = fogEnd
val color = fogColor
for (shader in renderWindow.renderSystem.shaders) {
if (!shader.uniforms.contains("uFogColor")) {
continue
@ -53,9 +90,15 @@ class FogManager(
shader.use()
shader.setFloat("uFogStart", fogStart)
shader.setFloat("uFogEnd", fogEnd)
shader["uFogColor"] = fogColor
shader["uFogStart"] = start
shader["uFogEnd"] = end
if (color == null) {
shader["uUseFogColor"] = false
} else {
shader["uFogColor"] = color
shader["uUseFogColor"] = true
}
}
updateShaders = false
}
}

View File

@ -22,7 +22,7 @@ interface IntegratedFramebuffer : Drawable {
shader.load()
shader.use()
shader.setInt("uColor", 0)
shader.setInt("uDepth", 1)
// shader.setInt("uDepth", 1)
mesh.load()
}

View File

@ -45,7 +45,7 @@ class SkyRenderer(
private var skySunMesh = SimpleTextureMesh(renderWindow)
private lateinit var sunTexture: AbstractTexture
private var updateSun: Boolean = true
var baseColor = RenderConstants.DEFAULT_SKY_COLOR
private var baseColor = RenderConstants.DEFAULT_SKY_COLOR
override val framebuffer: Framebuffer? = null
override val polygonMode: PolygonModes = PolygonModes.DEFAULT

View File

@ -49,6 +49,7 @@ interface Shader {
fun setVec4(uniformName: String, vec4: Vec4)
fun setArray(uniformName: String, array: Array<*>)
fun setRGBColor(uniformName: String, color: RGBColor)
fun setBoolean(uniformName: String, boolean: Boolean)
fun setTexture(uniformName: String, textureId: Int)
fun setUniformBuffer(uniformName: String, uniformBuffer: OpenGLUniformBuffer)
@ -70,6 +71,7 @@ interface Shader {
is RGBColor -> setRGBColor(uniformName, data)
is OpenGLUniformBuffer -> setUniformBuffer(uniformName, data)
// ToDo: PNGTexture
is Boolean -> setBoolean(uniformName, data)
else -> error("Don't know what todo with uniform type ${data::class.simpleName}!")
}
}

View File

@ -117,6 +117,10 @@ class OpenGLShader(
glUniform1i(getUniformLocation(uniformName), value)
}
override fun setBoolean(uniformName: String, boolean: Boolean) {
setInt(uniformName, if (boolean) 1 else 0)
}
override fun setMat4(uniformName: String, mat4: Mat4) {
glUniformMatrix4fv(getUniformLocation(uniformName), false, mat4 to BufferUtils.createFloatBuffer(16))
}

View File

@ -4,6 +4,7 @@ import de.bixilon.minosoft.gui.rendering.system.base.buffer.frame.Framebuffer
import de.bixilon.minosoft.gui.rendering.system.base.buffer.frame.FramebufferState
import de.bixilon.minosoft.gui.rendering.system.base.buffer.frame.texture.FramebufferTexture
import de.bixilon.minosoft.gui.rendering.system.base.buffer.render.Renderbuffer
import de.bixilon.minosoft.gui.rendering.system.base.buffer.render.RenderbufferModes
import de.bixilon.minosoft.gui.rendering.system.opengl.buffer.frame.texture.OpenGLFramebufferColorTexture
import de.bixilon.minosoft.gui.rendering.system.opengl.buffer.frame.texture.OpenGLFramebufferDepthTexture
import de.bixilon.minosoft.gui.rendering.system.opengl.buffer.render.OpenGLRenderbuffer
@ -31,13 +32,13 @@ class OpenGLFramebuffer(var size: Vec2i) : Framebuffer {
colorTexture.init()
attach(colorTexture)
//renderbuffer = OpenGLRenderbuffer(RenderbufferModes.DEPTH_COMPONENT24, size)
//renderbuffer.init()
//attach(renderbuffer)
renderbuffer = OpenGLRenderbuffer(RenderbufferModes.DEPTH_COMPONENT24, size)
renderbuffer.init()
attach(renderbuffer)
depthTexture = OpenGLFramebufferDepthTexture(size)
depthTexture.init()
attach(depthTexture)
//depthTexture = OpenGLFramebufferDepthTexture(size)
//depthTexture.init()
//attach(depthTexture)
glDrawBuffers(intArrayOf(GL_COLOR_ATTACHMENT0, GL_DEPTH_ATTACHMENT))
@ -77,7 +78,9 @@ class OpenGLFramebuffer(var size: Vec2i) : Framebuffer {
override fun bindTexture() {
check(state == FramebufferState.COMPLETE) { "Framebuffer is incomplete!" }
colorTexture.bind(0)
depthTexture.bind(1)
if (this::depthTexture.isInitialized) {
depthTexture.bind(1)
}
}
override fun resize(size: Vec2i) {

View File

@ -96,6 +96,8 @@ class RespawnS2CP(buffer: PlayInByteBuffer) : PlayS2CPacket() {
connection.player.tabListItem.gamemode = gamemode
connection.player.velocity = Vec3d.EMPTY
// connection.world.view.serverViewDistance = 0
connection.fireEvent(RespawnEvent(connection, this))
}

View File

@ -17,23 +17,41 @@ in vec3 finFragmentPosition;
uniform vec3 uCameraPosition;
uniform float uFogStart = 60.0f;
uniform float uFogEnd = 75.0f;
uniform vec4 uFogColor;
uniform bool uUseFogColor = false;
float calulate_fog_alpha(float distance) {
if (distance < uFogStart) {
return 1.0f;
}
if (distance > uFogEnd) {
discard;
return 0.0f;
}
return pow(1.0f - (distance - uFogStart) / (uFogEnd - uFogStart), 2);
}
float calculate_fog() {
if (uFogStart > 100000.0f) {
return 1.0f;
};
#ifdef FOG_SPHERE
float distance = length(finFragmentPosition.xyz - uCameraPosition.xyz);
#else
float distance = length(finFragmentPosition.xz - uCameraPosition.xz);
#endif
return calulate_fog_alpha(distance);
}
void set_fog_alpha() {
foutColor.a = calculate_fog();
void set_fog() {
float alpha = calculate_fog();
if (uUseFogColor) {
foutColor.rgb = mix(uFogColor.rgb, foutColor.rgb, alpha);
foutColor.a = 1.0f;
} else {
if (alpha <= 0.0f) {
discard;
}
foutColor.a = alpha;
}
}

View File

@ -36,7 +36,7 @@ void main() {
#ifdef TRANSPARENT
set_alpha_transparent();
#endif
set_fog_alpha();
set_fog();
return;
}
@ -49,5 +49,5 @@ void main() {
#ifdef TRANSPARENT
set_alpha_transparent();
#endif
set_fog_alpha();
set_fog();
}