[WIP] finishing touches
+bunch of renames to bring the 2 version closer
This commit is contained in:
@@ -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
|
||||
}
|
||||
Reference in New Issue
Block a user