package mods.betterfoliage.render.block.vanilla import mods.betterfoliage.BetterFoliage import mods.betterfoliage.render.lighting.withLighting import mods.betterfoliage.render.lighting.grassTuftLighting import mods.betterfoliage.util.Atlas import mods.betterfoliage.resource.discovery.BlockRenderKey import mods.betterfoliage.resource.discovery.ModelDiscoveryBase import mods.betterfoliage.resource.discovery.ModelDiscoveryContext import mods.betterfoliage.resource.discovery.RenderKeyFactory import mods.betterfoliage.resource.model.* import mods.betterfoliage.util.* import net.fabricmc.fabric.api.renderer.v1.render.RenderContext import net.minecraft.block.BlockRenderLayer import net.minecraft.block.BlockState import net.minecraft.block.Blocks import net.minecraft.client.render.model.BakedModel import net.minecraft.util.Identifier import net.minecraft.util.math.BlockPos import net.minecraft.util.math.Direction.DOWN import net.minecraft.world.ExtendedBlockView import java.util.* import java.util.function.Consumer import java.util.function.Supplier object NetherrackKey : BlockRenderKey { override fun replace(model: BakedModel, state: BlockState) = NetherrackModel(meshifyStandard(model, state)) } object NetherrackDiscovery : ModelDiscoveryBase() { override val logger = BetterFoliage.logDetail val netherrackBlocks = listOf(Blocks.NETHERRACK) override fun processModel(ctx: ModelDiscoveryContext, atlas: Consumer) = if (ctx.state.block in netherrackBlocks) NetherrackKey else null } class NetherrackModel(wrapped: BakedModel) : WrappedBakedModel(wrapped) { val tuftLighting = grassTuftLighting(DOWN) override fun emitBlockQuads(blockView: ExtendedBlockView, state: BlockState, pos: BlockPos, randomSupplier: Supplier, context: RenderContext) { super.emitBlockQuads(blockView, state, pos, randomSupplier, context) if (BetterFoliage.config.enabled && BetterFoliage.config.netherrack.enabled && blockView.getBlockState(pos + DOWN.offset).isAir ) { val random = randomSupplier.get() context.withLighting(tuftLighting) { it.accept(netherrackTuftModels[random]) } } } companion object { val netherrackTuftSprites by SpriteSetDelegate(Atlas.BLOCKS) { idx -> Identifier(BetterFoliage.MOD_ID, "blocks/better_netherrack_$idx") } val netherrackTuftModels by LazyInvalidatable(BetterFoliage.modelReplacer) { val shapes = BetterFoliage.config.netherrack.let { tuftShapeSet(it.size, it.heightMin, it.heightMax, it.hOffset) } tuftModelSet(shapes, Color.white.asInt) { netherrackTuftSprites[randomI()] } .transform { rotate(Rotation.fromUp[DOWN.ordinal]).rotateUV(2) } .withOpposites() .build(BlockRenderLayer.CUTOUT_MIPPED, flatLighting = false) } } }