74 lines
2.8 KiB
Kotlin
74 lines
2.8 KiB
Kotlin
package mods.betterfoliage.render.pipeline
|
|
|
|
import com.mojang.blaze3d.matrix.MatrixStack
|
|
import mods.betterfoliage.model.SpecialRenderModel
|
|
import mods.betterfoliage.render.lighting.ForgeVertexLighter
|
|
import mods.betterfoliage.render.lighting.ForgeVertexLighterAccess
|
|
import mods.betterfoliage.model.HalfBakedQuad
|
|
import net.minecraft.block.BlockState
|
|
import net.minecraft.client.renderer.LightTexture
|
|
import net.minecraft.util.math.BlockPos
|
|
import net.minecraft.world.ILightReader
|
|
import net.minecraftforge.client.model.data.IModelData
|
|
import net.minecraftforge.client.model.pipeline.VertexLighterFlat
|
|
import java.util.Random
|
|
|
|
class RenderCtxForge(
|
|
world: ILightReader,
|
|
pos: BlockPos,
|
|
val lighter: VertexLighterFlat,
|
|
matrixStack: MatrixStack,
|
|
checkSides: Boolean,
|
|
random: Random,
|
|
modelData: IModelData
|
|
): RenderCtxBase(world, pos, matrixStack, checkSides, random, modelData), ForgeVertexLighter {
|
|
|
|
override fun renderQuad(quad: HalfBakedQuad) {
|
|
// set Forge lighter AO calculator to us
|
|
vertexLighter.updateLightmapAndColor(quad, lightingData)
|
|
quad.baked.pipe(lighter)
|
|
}
|
|
|
|
// somewhat ugly hack to pipe lighting values into the Forge pipeline
|
|
var vIdx = 0
|
|
override fun updateVertexLightmap(normal: FloatArray, lightmap: FloatArray, x: Float, y: Float, z: Float) {
|
|
lightingData.packedLight[vIdx].let { packedLight ->
|
|
lightmap[0] = LightTexture.getLightBlock(packedLight) / 0xF.toFloat()
|
|
lightmap[1] = LightTexture.getLightSky(packedLight) / 0xF.toFloat()
|
|
}
|
|
}
|
|
|
|
override fun updateVertexColor(normal: FloatArray, color: FloatArray, x: Float, y: Float, z: Float, tint: Float, multiplier: Int) {
|
|
color[0] = lightingData.tint[0] * lightingData.colorMultiplier[vIdx]
|
|
color[1] = lightingData.tint[1] * lightingData.colorMultiplier[vIdx]
|
|
color[2] = lightingData.tint[2] * lightingData.colorMultiplier[vIdx]
|
|
vIdx++
|
|
}
|
|
|
|
companion object {
|
|
@JvmStatic
|
|
fun render(
|
|
lighter: VertexLighterFlat,
|
|
world: ILightReader,
|
|
model: SpecialRenderModel,
|
|
state: BlockState,
|
|
pos: BlockPos,
|
|
matrixStack: MatrixStack,
|
|
checkSides: Boolean,
|
|
rand: Random, seed: Long,
|
|
modelData: IModelData
|
|
): Boolean {
|
|
lighter.setWorld(world)
|
|
lighter.setState(state)
|
|
lighter.setBlockPos(pos)
|
|
rand.setSeed(seed)
|
|
lighter.updateBlockInfo()
|
|
return RenderCtxForge(world, pos, lighter, matrixStack, checkSides, rand, modelData).let {
|
|
(lighter as ForgeVertexLighterAccess).vertexLighter = it
|
|
model.render(it, false)
|
|
lighter.resetBlockInfo()
|
|
it.hasRendered
|
|
}
|
|
}
|
|
}
|
|
} |