From 3d78ecce22efe882dda72bbd547f0da40fae72e4 Mon Sep 17 00:00:00 2001 From: octarine-noise Date: Sun, 16 May 2021 11:48:34 +0200 Subject: [PATCH 1/4] fix unbaked block model coords not being zero-centered --- src/main/kotlin/mods/betterfoliage/model/HalfBaked.kt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/kotlin/mods/betterfoliage/model/HalfBaked.kt b/src/main/kotlin/mods/betterfoliage/model/HalfBaked.kt index 631cf0b..fad97fb 100644 --- a/src/main/kotlin/mods/betterfoliage/model/HalfBaked.kt +++ b/src/main/kotlin/mods/betterfoliage/model/HalfBaked.kt @@ -96,9 +96,9 @@ fun Array>.bake(applyDiffuseLighting: Boolean) = mapArray { it.bake(a fun BakedQuad.unbake(): HalfBakedQuad { val size = DefaultVertexFormats.BLOCK.integerSize val verts = Array(4) { vIdx -> - val x = java.lang.Float.intBitsToFloat(vertexData[vIdx * size + 0]) - val y = java.lang.Float.intBitsToFloat(vertexData[vIdx * size + 1]) - val z = java.lang.Float.intBitsToFloat(vertexData[vIdx * size + 2]) + val x = java.lang.Float.intBitsToFloat(vertexData[vIdx * size + 0]) - 0.5f + val y = java.lang.Float.intBitsToFloat(vertexData[vIdx * size + 1]) - 0.5f + val z = java.lang.Float.intBitsToFloat(vertexData[vIdx * size + 2]) - 0.5f val color = vertexData[vIdx * size + 3] val u = java.lang.Float.intBitsToFloat(vertexData[vIdx * size + 4]) val v = java.lang.Float.intBitsToFloat(vertexData[vIdx * size + 5]) From b96a17fdb999637758ab9aec33533cdaea0429fd Mon Sep 17 00:00:00 2001 From: octarine-noise Date: Sun, 16 May 2021 11:49:04 +0200 Subject: [PATCH 2/4] clean up access transformer --- src/main/resources/META-INF/accesstransformer.cfg | 11 +---------- 1 file changed, 1 insertion(+), 10 deletions(-) diff --git a/src/main/resources/META-INF/accesstransformer.cfg b/src/main/resources/META-INF/accesstransformer.cfg index 24046b0..4352c1c 100644 --- a/src/main/resources/META-INF/accesstransformer.cfg +++ b/src/main/resources/META-INF/accesstransformer.cfg @@ -1,14 +1,5 @@ -#public net.minecraft.client.renderer.BlockModelRenderer$AmbientOcclusionFace -#public net.minecraft.client.renderer.BlockModelRenderer$AmbientOcclusionFace -#public net.minecraft.client.renderer.BlockModelRenderer$AmbientOcclusionFace field_178206_b #vertexColorMultiplier -#public net.minecraft.client.renderer.BlockModelRenderer$AmbientOcclusionFace field_178207_c #vertexBrightness - -#public net.minecraft.block.BlockState$Cache - public net.minecraft.client.renderer.chunk.ChunkRenderCache field_212408_i #world -#public net.minecraft.client.renderer.texture.AtlasTexture$SheetData field_217808_d # sprites - public net.minecraft.client.renderer.BlockModelRenderer$Cache public net.minecraft.client.renderer.BlockModelRenderer field_210267_b -public net.minecraft.client.renderer.BlockModelRenderer field_187499_a \ No newline at end of file +public net.minecraft.client.renderer.BlockModelRenderer field_187499_a From 512cd786f75cb5108c916c1319b97071b2bf9d62 Mon Sep 17 00:00:00 2001 From: octarine-noise Date: Sun, 16 May 2021 12:01:59 +0200 Subject: [PATCH 3/4] fix diffuse shading being too dark with shaders --- .../kotlin/mods/betterfoliage/CommonRefs.kt | 7 ++++ .../integration/ShadersModIntegration.kt | 41 +++++++++++++++---- .../render/lighting/VanillaVertexLighter.kt | 6 +-- 3 files changed, 44 insertions(+), 10 deletions(-) diff --git a/src/main/kotlin/mods/betterfoliage/CommonRefs.kt b/src/main/kotlin/mods/betterfoliage/CommonRefs.kt index a3344c1..451b6ba 100644 --- a/src/main/kotlin/mods/betterfoliage/CommonRefs.kt +++ b/src/main/kotlin/mods/betterfoliage/CommonRefs.kt @@ -77,6 +77,13 @@ object CustomColors : ClassRef("net.optifine.CustomColors") { } // Optifine shaders +object Shaders : ClassRef("net.optifine.shaders.Shaders") { + val shaderPackLoaded = FieldRef(this, "shaderPackLoaded", boolean) + val blockLightLevel05 = FieldRef(this, "blockLightLevel05", float) + val blockLightLevel06 = FieldRef(this, "blockLightLevel06", float) + val blockLightLevel08 = FieldRef(this, "blockLightLevel08", float) +} + object SVertexBuilder : ClassRef("net.optifine.shaders.SVertexBuilder") { val pushState = MethodRef(this, "pushEntity", void, long) val popState = MethodRef(this, "popEntity", void) diff --git a/src/main/kotlin/mods/betterfoliage/integration/ShadersModIntegration.kt b/src/main/kotlin/mods/betterfoliage/integration/ShadersModIntegration.kt index 7b7a050..3d5f2a7 100644 --- a/src/main/kotlin/mods/betterfoliage/integration/ShadersModIntegration.kt +++ b/src/main/kotlin/mods/betterfoliage/integration/ShadersModIntegration.kt @@ -1,30 +1,40 @@ package mods.betterfoliage.integration -import mods.betterfoliage.config.BlockConfig import mods.betterfoliage.render.pipeline.RenderCtxBase -import mods.betterfoliage.render.pipeline.RenderCtxForge import mods.betterfoliage.render.pipeline.RenderCtxVanilla +import mods.betterfoliage.resource.discovery.BakeWrapperManager import mods.betterfoliage.util.HasLogger import mods.betterfoliage.util.allAvailable import mods.betterfoliage.util.get +import mods.betterfoliage.util.mapArray import mods.octarinecore.* import net.minecraft.block.BlockRenderType import net.minecraft.block.BlockRenderType.MODEL import net.minecraft.block.BlockState import net.minecraft.block.Blocks import net.minecraft.client.renderer.BufferBuilder +import net.minecraft.util.Direction +import net.minecraft.util.Direction.DOWN +import net.minecraft.util.Direction.EAST +import net.minecraft.util.Direction.NORTH +import net.minecraft.util.Direction.SOUTH +import net.minecraft.util.Direction.WEST import net.minecraft.util.math.BlockPos import net.minecraft.world.ILightReader +import net.minecraftforge.client.model.pipeline.LightUtil import org.apache.logging.log4j.Level.INFO /** * Integration for ShadersMod. */ object ShadersModIntegration : HasLogger() { - @JvmStatic val isAvailable = allAvailable(SVertexBuilder, SVertexBuilder.pushState, SVertexBuilder.popState, BlockAliases.getAliasBlockId) + @JvmStatic val isEffectsAvailable = allAvailable(SVertexBuilder.pushState, SVertexBuilder.popState, BlockAliases.getAliasBlockId) + @JvmStatic val isDiffuseAvailable = allAvailable(Shaders.shaderPackLoaded, Shaders.blockLightLevel05, Shaders.blockLightLevel06, Shaders.blockLightLevel08) - val defaultLeaves = Blocks.OAK_LEAVES.defaultState - val defaultGrass = Blocks.GRASS.defaultState + @JvmStatic val defaultLeaves = Blocks.OAK_LEAVES.defaultState!! + @JvmStatic val defaultGrass = Blocks.GRASS.defaultState!! + + @JvmStatic var diffuseShades = Direction.values().mapArray { LightUtil.diffuseLight(it) } /** * Called from transformed ShadersMod code. @@ -37,12 +47,29 @@ object ShadersModIntegration : HasLogger() { } init { - logger.log(INFO, "ShadersMod integration is ${if (isAvailable) "enabled" else "disabled" }") + logger.log(INFO, "ShadersMod diffuse shading integration is ${if (isDiffuseAvailable) "enabled" else "disabled" }") + logger.log(INFO, "ShadersMod vertex shader integration is ${if (isEffectsAvailable) "enabled" else "disabled" }") + + // Recalculate the diffsuse shading values used when resources are reloaded + if (isDiffuseAvailable) BakeWrapperManager.onInvalidate { + if (Shaders.shaderPackLoaded.getStatic()) { + diffuseShades = Direction.values().mapArray { face -> + when(face) { + DOWN -> Shaders.blockLightLevel05.getStatic() + WEST, EAST -> Shaders.blockLightLevel06.getStatic() + NORTH, SOUTH -> Shaders.blockLightLevel08.getStatic() + else -> LightUtil.diffuseLight(face) + } + } + } else { + diffuseShades = Direction.values().mapArray { LightUtil.diffuseLight(it) } + } + } } /** Quads rendered inside this block will use the given block entity data in shader programs. */ inline fun renderAs(buffer: BufferBuilder, state: BlockState, renderType: BlockRenderType, enabled: Boolean = true, func: ()->Unit) { - if (isAvailable && enabled) { + if (isEffectsAvailable && enabled) { val aliasBlockId = BlockAliases.getAliasBlockId.invokeStatic(state) val sVertexBuilder = buffer[BufferBuilder_sVertexBuilder] SVertexBuilder.pushState.invoke(sVertexBuilder, aliasBlockId) diff --git a/src/main/kotlin/mods/betterfoliage/render/lighting/VanillaVertexLighter.kt b/src/main/kotlin/mods/betterfoliage/render/lighting/VanillaVertexLighter.kt index 69435c4..53264ed 100644 --- a/src/main/kotlin/mods/betterfoliage/render/lighting/VanillaVertexLighter.kt +++ b/src/main/kotlin/mods/betterfoliage/render/lighting/VanillaVertexLighter.kt @@ -1,15 +1,15 @@ package mods.betterfoliage.render.lighting +import mods.betterfoliage.integration.ShadersModIntegration import mods.betterfoliage.model.HalfBakedQuad import mods.betterfoliage.util.Double3 import mods.betterfoliage.util.EPSILON_ONE import mods.betterfoliage.util.EPSILON_ZERO +import mods.betterfoliage.util.get import mods.betterfoliage.util.minBy import net.minecraft.client.renderer.color.BlockColors import net.minecraft.util.Direction import net.minecraft.util.Direction.* -import net.minecraft.util.Direction.Axis -import net.minecraftforge.client.model.pipeline.LightUtil import kotlin.math.abs class VanillaQuadLighting { @@ -34,7 +34,7 @@ class VanillaQuadLighting { } fun applyDiffuseLighting(face: Direction) { - val factor = LightUtil.diffuseLight(face) + val factor = ShadersModIntegration.diffuseShades[face] tint[0] *= factor; tint[1] *= factor; tint[2] *= factor } } From fae9e9dfa9ae73fe1846a3fa3634ec8aa16d7fde Mon Sep 17 00:00:00 2001 From: octarine-noise Date: Sun, 16 May 2021 12:02:42 +0200 Subject: [PATCH 4/4] adopt AO calculation tweak from Indigo --- gradle.properties | 2 +- .../render/lighting/VanillaAoCalculation.kt | 10 +++++++--- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/gradle.properties b/gradle.properties index 260aca7..78e6629 100644 --- a/gradle.properties +++ b/gradle.properties @@ -4,7 +4,7 @@ org.gradle.daemon=false group = com.github.octarine-noise jarName = BetterFoliage-Forge -version = 2.6.1 +version = 2.6.3 mcVersion = 1.15.2 forgeVersion = 31.2.44 diff --git a/src/main/kotlin/mods/betterfoliage/render/lighting/VanillaAoCalculation.kt b/src/main/kotlin/mods/betterfoliage/render/lighting/VanillaAoCalculation.kt index d2eb5e7..f0987a1 100644 --- a/src/main/kotlin/mods/betterfoliage/render/lighting/VanillaAoCalculation.kt +++ b/src/main/kotlin/mods/betterfoliage/render/lighting/VanillaAoCalculation.kt @@ -23,6 +23,10 @@ data class LightingData( } } +// Vanilla has a very suspicious-looking offset here, which Indigo gets rid of and calls it a fix +// Naturally, we're going to believe Indigo, it's a hardcoded option for now +const val OCCLUSION_OFFSET_FIX = true + /** * Replacement for [BlockModelRenderer.AmbientOcclusionFace] * This gets called on a LOT, so object instantiation is avoided. @@ -87,9 +91,9 @@ class VanillaAoCalculator { sideHelper.sides.forEachIndexed { sideIdx, sideDir -> // record light data in the block 1 step to the side probe.position { setPos(lightOrigin).move(sideDir) }.writeTo(sideAo[sideIdx]) - // side is considered occluded if the block 1 step to that side and - // 1 step forward (in the lightface direction) is not fully transparent - isOccluded[sideIdx] = probe.position { move(lightFace) }.isNonTransparent + // side is considered occluded if the block 1 step to that side is not fully transparent + if (!OCCLUSION_OFFSET_FIX) probe.position { move(lightFace) } + isOccluded[sideIdx] = probe.isNonTransparent } // AO Calculation for the 4 corners