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 } }