correctly apply smooth shading multipliers for AO data
This commit is contained in:
@@ -25,7 +25,7 @@ class RenderLeaves : AbstractBlockRenderingHandler(BetterFoliageMod.MOD_ID) {
|
|||||||
|
|
||||||
val leavesModel = model {
|
val leavesModel = model {
|
||||||
verticalRectangle(x1 = -0.5, z1 = 0.5, x2 = 0.5, z2 = -0.5, yBottom = -0.5 * 1.41, yTop = 0.5 * 1.41)
|
verticalRectangle(x1 = -0.5, z1 = 0.5, x2 = 0.5, z2 = -0.5, yBottom = -0.5 * 1.41, yTop = 0.5 * 1.41)
|
||||||
.setAoShader(edgeOrientedAuto(corner = cornerAo(Axis.Y)))
|
.setAoShader(edgeOrientedAuto(corner = cornerAoMaxGreen))
|
||||||
.setFlatShader(FlatOffset(Int3.zero))
|
.setFlatShader(FlatOffset(Int3.zero))
|
||||||
.scale(Config.leaves.size)
|
.scale(Config.leaves.size)
|
||||||
.toCross(UP).addAll()
|
.toCross(UP).addAll()
|
||||||
|
|||||||
@@ -71,8 +71,15 @@ open class ShadingContext {
|
|||||||
var aoEnabled = Minecraft.isAmbientOcclusionEnabled()
|
var aoEnabled = Minecraft.isAmbientOcclusionEnabled()
|
||||||
val aoFaces = Array(6) { AoFaceData(forgeDirs[it]) }
|
val aoFaces = Array(6) { AoFaceData(forgeDirs[it]) }
|
||||||
|
|
||||||
|
val EnumFacing.aoMultiplier: Float get() = when(this) {
|
||||||
|
UP -> 1.0f
|
||||||
|
DOWN -> 0.5f
|
||||||
|
NORTH, SOUTH -> 0.8f
|
||||||
|
EAST, WEST -> 0.6f
|
||||||
|
}
|
||||||
|
|
||||||
fun updateShading(offset: Int3, predicate: (EnumFacing) -> Boolean = { true }) {
|
fun updateShading(offset: Int3, predicate: (EnumFacing) -> Boolean = { true }) {
|
||||||
forgeDirs.forEach { if (predicate(it)) aoFaces[it.ordinal].update(offset) }
|
forgeDirs.forEach { if (predicate(it)) aoFaces[it.ordinal].update(offset, multiplier = it.aoMultiplier) }
|
||||||
}
|
}
|
||||||
|
|
||||||
fun aoShading(face: EnumFacing, corner1: EnumFacing, corner2: EnumFacing) =
|
fun aoShading(face: EnumFacing, corner1: EnumFacing, corner2: EnumFacing) =
|
||||||
|
|||||||
@@ -57,14 +57,14 @@ class AoFaceData(val face: EnumFacing) {
|
|||||||
EAST -> listOf(topRight, topLeft, bottomLeft, bottomRight)
|
EAST -> listOf(topRight, topLeft, bottomLeft, bottomRight)
|
||||||
}
|
}
|
||||||
|
|
||||||
fun update(offset: Int3, useBounds: Boolean = false) {
|
fun update(offset: Int3, useBounds: Boolean = false, multiplier: Float = 1.0f) {
|
||||||
val ctx = blockContext
|
val ctx = blockContext
|
||||||
val blockState = ctx.blockState(offset)
|
val blockState = ctx.blockState(offset)
|
||||||
val quadBounds: FloatArray = FloatArray(12)
|
val quadBounds: FloatArray = FloatArray(12)
|
||||||
val flags = BitSet(3).apply { set(0) }
|
val flags = BitSet(3).apply { set(0) }
|
||||||
|
|
||||||
ao.updateVertexBrightness(ctx.world, blockState.block, ctx.pos + offset, face, quadBounds, flags)
|
ao.updateVertexBrightness(ctx.world, blockState.block, ctx.pos + offset, face, quadBounds, flags)
|
||||||
ordered.forEachIndexed { idx, aoData -> aoData.set(ao.vertexBrightness[idx], ao.vertexColorMultiplier[idx]) }
|
ordered.forEachIndexed { idx, aoData -> aoData.set(ao.vertexBrightness[idx], ao.vertexColorMultiplier[idx] * multiplier) }
|
||||||
}
|
}
|
||||||
|
|
||||||
operator fun get(dir1: EnumFacing, dir2: EnumFacing): AoData {
|
operator fun get(dir1: EnumFacing, dir2: EnumFacing): AoData {
|
||||||
|
|||||||
Reference in New Issue
Block a user