add OptiFine custom color support

This commit is contained in:
octarine-noise
2017-08-12 17:58:24 +02:00
parent 9685971fd4
commit 32bf60492d
4 changed files with 34 additions and 6 deletions

View File

@@ -4,10 +4,15 @@ import mods.betterfoliage.client.Client
import mods.betterfoliage.loader.Refs import mods.betterfoliage.loader.Refs
import mods.octarinecore.ThreadLocalDelegate import mods.octarinecore.ThreadLocalDelegate
import mods.octarinecore.client.render.BlockContext import mods.octarinecore.client.render.BlockContext
import mods.octarinecore.common.Int3
import mods.octarinecore.metaprog.allAvailable import mods.octarinecore.metaprog.allAvailable
import mods.octarinecore.metaprog.reflectField
import net.minecraft.block.state.BlockStateBase import net.minecraft.block.state.BlockStateBase
import net.minecraft.block.state.IBlockState import net.minecraft.block.state.IBlockState
import net.minecraft.client.Minecraft
import net.minecraft.client.renderer.block.model.BakedQuad
import net.minecraft.client.renderer.texture.TextureAtlasSprite import net.minecraft.client.renderer.texture.TextureAtlasSprite
import net.minecraft.client.renderer.vertex.DefaultVertexFormats
import net.minecraft.util.EnumFacing import net.minecraft.util.EnumFacing
import net.minecraft.util.math.BlockPos import net.minecraft.util.math.BlockPos
import net.minecraft.world.IBlockAccess import net.minecraft.world.IBlockAccess
@@ -22,18 +27,24 @@ import org.apache.logging.log4j.Level.INFO
@SideOnly(Side.CLIENT) @SideOnly(Side.CLIENT)
object OptifineCTM { object OptifineCTM {
val isAvailable = allAvailable( val isCTMAvailable = allAvailable(
Refs.ConnectedTextures, Refs.ConnectedProperties, Refs.ConnectedTextures, Refs.ConnectedProperties,
Refs.getConnectedTexture, Refs.getConnectedTexture,
Refs.CTblockProperties, Refs.CTtileProperties, Refs.CTblockProperties, Refs.CTtileProperties,
Refs.CPtileIcons, Refs.CPmatchesIcon Refs.CPtileIcons, Refs.CPmatchesIcon
) )
val isColorAvailable = allAvailable(
Refs.CustomColors, Refs.getColorMultiplier
)
init { init {
Client.log(INFO, "Optifine CTM support is ${if (isAvailable) "enabled" else "disabled" }") Client.log(INFO, "Optifine CTM support is ${if (isCTMAvailable) "enabled" else "disabled" }")
Client.log(INFO, "Optifine custom color support is ${if (isColorAvailable) "enabled" else "disabled" }")
} }
val renderEnv by ThreadLocalDelegate { OptifineRenderEnv() } val renderEnv by ThreadLocalDelegate { OptifineRenderEnv() }
val fakeQuad = BakedQuad(IntArray(0), 1, EnumFacing.UP, null, true, DefaultVertexFormats.BLOCK)
val isCustomColors: Boolean get() = if (!isCTMAvailable) false else Minecraft.getMinecraft().gameSettings.reflectField<Boolean>("ofCustomColors") ?: false
val connectedProperties: Iterable<Any> get() { val connectedProperties: Iterable<Any> get() {
val result = hashSetOf<Any>() val result = hashSetOf<Any>()
@@ -49,7 +60,7 @@ object OptifineCTM {
/** Get all the CTM [TextureAtlasSprite]s that could possibly be used for this block. */ /** Get all the CTM [TextureAtlasSprite]s that could possibly be used for this block. */
fun getAllCTM(state: IBlockState, icon: TextureAtlasSprite): Collection<TextureAtlasSprite> { fun getAllCTM(state: IBlockState, icon: TextureAtlasSprite): Collection<TextureAtlasSprite> {
val result = hashSetOf<TextureAtlasSprite>() val result = hashSetOf<TextureAtlasSprite>()
if (state !is BlockStateBase || !isAvailable) return result if (state !is BlockStateBase || !isCTMAvailable) return result
connectedProperties.forEach { cp -> connectedProperties.forEach { cp ->
if (Refs.CPmatchesBlock.invoke(cp, Refs.getBlockId.invoke(state), Refs.getMetadata.invoke(state)) as Boolean && if (Refs.CPmatchesBlock.invoke(cp, Refs.getBlockId.invoke(state), Refs.getMetadata.invoke(state)) as Boolean &&
@@ -68,7 +79,7 @@ object OptifineCTM {
override(texture, ctx.world!!, ctx.pos, face) override(texture, ctx.world!!, ctx.pos, face)
fun override(texture: TextureAtlasSprite, world: IBlockAccess, pos: BlockPos, face: EnumFacing): TextureAtlasSprite { fun override(texture: TextureAtlasSprite, world: IBlockAccess, pos: BlockPos, face: EnumFacing): TextureAtlasSprite {
if (!isAvailable) return texture if (!isCTMAvailable) return texture
val state = world.getBlockState(pos) val state = world.getBlockState(pos)
return renderEnv.let { return renderEnv.let {
@@ -76,6 +87,14 @@ object OptifineCTM {
Refs.getConnectedTexture.invokeStatic(world, state, pos, face, texture, it.wrapped) as TextureAtlasSprite Refs.getConnectedTexture.invokeStatic(world, state, pos, face, texture, it.wrapped) as TextureAtlasSprite
} }
} }
fun getBlockColor(ctx: BlockContext): Int {
val ofColor = if (isColorAvailable && Minecraft.getMinecraft().gameSettings.reflectField<Boolean>("ofCustomColors") == true) {
renderEnv.reset(ctx.world!!, ctx.blockState(Int3.zero), ctx.pos)
Refs.getColorMultiplier.invokeStatic(fakeQuad, ctx.blockState(Int3.zero), ctx.world!!, ctx.pos, renderEnv.wrapped) as? Int
} else null
return ofColor ?: ctx.blockData(Int3.zero).color
}
} }
@SideOnly(Side.CLIENT) @SideOnly(Side.CLIENT)

View File

@@ -3,6 +3,7 @@ package mods.betterfoliage.client.render
import mods.betterfoliage.BetterFoliageMod import mods.betterfoliage.BetterFoliageMod
import mods.betterfoliage.client.Client import mods.betterfoliage.client.Client
import mods.betterfoliage.client.config.Config import mods.betterfoliage.client.config.Config
import mods.betterfoliage.client.integration.OptifineCTM
import mods.betterfoliage.client.integration.ShadersModIntegration import mods.betterfoliage.client.integration.ShadersModIntegration
import mods.betterfoliage.client.texture.GrassRegistry import mods.betterfoliage.client.texture.GrassRegistry
import mods.octarinecore.client.render.* import mods.octarinecore.client.render.*
@@ -68,7 +69,7 @@ class RenderGrass : AbstractBlockRenderingHandler(BetterFoliageMod.MOD_ID) {
Client.logRenderError(ctx.blockState(Int3.zero), ctx.pos) Client.logRenderError(ctx.blockState(Int3.zero), ctx.pos)
return renderWorldBlockBase(ctx, dispatcher, renderer, null) return renderWorldBlockBase(ctx, dispatcher, renderer, null)
} }
val blockColor = ctx.blockData(Int3.zero).color val blockColor = OptifineCTM.getBlockColor(ctx)
if (connectedGrass) { if (connectedGrass) {
// get full AO data // get full AO data

View File

@@ -3,6 +3,7 @@ package mods.betterfoliage.client.render
import mods.betterfoliage.BetterFoliageMod import mods.betterfoliage.BetterFoliageMod
import mods.betterfoliage.client.Client import mods.betterfoliage.client.Client
import mods.betterfoliage.client.config.Config import mods.betterfoliage.client.config.Config
import mods.betterfoliage.client.integration.OptifineCTM
import mods.betterfoliage.client.integration.ShadersModIntegration import mods.betterfoliage.client.integration.ShadersModIntegration
import mods.betterfoliage.client.texture.LeafRegistry import mods.betterfoliage.client.texture.LeafRegistry
import mods.octarinecore.PI2 import mods.octarinecore.PI2
@@ -57,7 +58,7 @@ class RenderLeaves : AbstractBlockRenderingHandler(BetterFoliageMod.MOD_ID) {
Client.logRenderError(ctx.blockState(Int3.zero), ctx.pos) Client.logRenderError(ctx.blockState(Int3.zero), ctx.pos)
return renderWorldBlockBase(ctx, dispatcher, renderer, layer) return renderWorldBlockBase(ctx, dispatcher, renderer, layer)
} }
val blockColor = ctx.blockData(Int3.zero).color val blockColor = OptifineCTM.getBlockColor(ctx)
renderWorldBlockBase(ctx, dispatcher, renderer, layer) renderWorldBlockBase(ctx, dispatcher, renderer, layer)
if (!layer.isCutout) return true if (!layer.isCutout) return true

View File

@@ -70,8 +70,11 @@ object Refs {
val MultipartModel = ClassRef("net.minecraftforge.client.model.ModelLoader\$MultipartModel") val MultipartModel = ClassRef("net.minecraftforge.client.model.ModelLoader\$MultipartModel")
val partModels_MPM = FieldRef(MultipartModel, "partModels", List) val partModels_MPM = FieldRef(MultipartModel, "partModels", List)
val BakedQuad = ClassRef("net.minecraft.client.renderer.block.model.BakedQuad")
val resetChangedState = MethodRef(ClassRef("net.minecraftforge.common.config.Configuration"), "resetChangedState", ClassRef.void) val resetChangedState = MethodRef(ClassRef("net.minecraftforge.common.config.Configuration"), "resetChangedState", ClassRef.void)
// Better Foliage // Better Foliage
val BetterFoliageHooks = ClassRef("mods.betterfoliage.client.Hooks") val BetterFoliageHooks = ClassRef("mods.betterfoliage.client.Hooks")
val getAmbientOcclusionLightValueOverride = MethodRef(BetterFoliageHooks, "getAmbientOcclusionLightValueOverride", ClassRef.float, ClassRef.float, IBlockState) val getAmbientOcclusionLightValueOverride = MethodRef(BetterFoliageHooks, "getAmbientOcclusionLightValueOverride", ClassRef.float, ClassRef.float, IBlockState)
@@ -104,6 +107,10 @@ object Refs {
val quadSprite = FieldRef(VertexBuffer, "quadSprite", TextureAtlasSprite) val quadSprite = FieldRef(VertexBuffer, "quadSprite", TextureAtlasSprite)
val CustomColors = ClassRef("CustomColors")
val getColorMultiplier = MethodRef(CustomColors, "getColorMultiplier", ClassRef.int, BakedQuad, IBlockState, IBlockAccess, BlockPos, RenderEnv)
// ShadersMod // ShadersMod
val SVertexBuilder = ClassRef("shadersmod.client.SVertexBuilder") val SVertexBuilder = ClassRef("shadersmod.client.SVertexBuilder")
val sVertexBuilder = FieldRef(VertexBuffer, "sVertexBuilder", SVertexBuilder) val sVertexBuilder = FieldRef(VertexBuffer, "sVertexBuilder", SVertexBuilder)