[WIP] finishing touches

+bunch of renames to bring the 2 version closer
This commit is contained in:
octarine-noise
2021-05-13 21:11:47 +02:00
parent 9899816029
commit 4174301ff7
25 changed files with 235 additions and 281 deletions

View File

@@ -2,8 +2,6 @@ package mods.betterfoliage.model
import mods.betterfoliage.render.pipeline.RenderCtxBase
import mods.betterfoliage.util.HasLogger
import net.minecraft.block.BlockState
import net.minecraft.client.Minecraft
import net.minecraft.client.renderer.model.IBakedModel
import net.minecraft.client.renderer.model.Material
import net.minecraft.client.renderer.model.ModelBakery
@@ -11,8 +9,6 @@ import net.minecraft.client.renderer.model.VariantList
import net.minecraft.client.renderer.texture.TextureAtlasSprite
import net.minecraft.util.ResourceLocation
import net.minecraft.util.WeightedRandom
import net.minecraft.util.math.BlockPos
import net.minecraft.world.ILightReader
import org.apache.logging.log4j.Level.WARN
import java.util.Random
import java.util.function.Function
@@ -24,7 +20,7 @@ interface SpecialRenderModel : IBakedModel {
fun render(ctx: RenderCtxBase, noDecorations: Boolean = false)
}
class SpecialRenderVariantList(
class WeightedModelWrapper(
val models: List<WeightedModel>, baseModel: SpecialRenderModel
): IBakedModel by baseModel, SpecialRenderModel {
class WeightedModel(val model: SpecialRenderModel, weight: Int) : WeightedRandom.Item(weight)
@@ -35,43 +31,4 @@ class SpecialRenderVariantList(
override fun render(ctx: RenderCtxBase, noDecorations: Boolean) {
getModel(ctx.random).model.render(ctx, noDecorations)
}
companion object : HasLogger() {
/**
* If any of the variants in this [VariantList] bake to [SpecialRenderModel], give back a
* [SpecialRenderVariantList] so that variants can take advantage of extra features.
* Otherwise, give back null.
*/
fun bakeIfSpecial(
location: ResourceLocation,
variantModel: VariantList,
bakery: ModelBakery,
spriteGetter: Function<Material, TextureAtlasSprite>
): SpecialRenderVariantList? {
val bakedModels = variantModel.variantList.map {
it to bakery.getBakedModel(it.modelLocation, it, spriteGetter)
}.filter { it.second != null }
if (bakedModels.all { it.second !is SpecialRenderModel }) return null
val weightedSpecials = bakedModels.mapNotNull { (variant, model) ->
when (model) {
is SpecialRenderModel -> WeightedModel(model, variant.weight)
else -> null
}
}
if (bakedModels.size > weightedSpecials.size) {
detailLogger.log(WARN, "Dropped ${bakedModels.size - weightedSpecials.size} variants from model $location")
}
return SpecialRenderVariantList(weightedSpecials, weightedSpecials[0].model)
}
}
}
fun getActualRenderModel(world: ILightReader, pos: BlockPos, state: BlockState, random: Random): SpecialRenderModel? {
val model = Minecraft.getInstance().blockRendererDispatcher.blockModelShapes.getModel(state) as? SpecialRenderModel ?: return null
if (model is SpecialRenderVariantList) {
random.setSeed(state.getPositionRandom(pos))
return model.getModel(random).model
}
return model
}