package mods.betterfoliage.render.block.vanilla import mods.betterfoliage.BetterFoliageMod import mods.betterfoliage.config.Config import mods.betterfoliage.integration.ShadersModIntegration import mods.betterfoliage.model.HalfBakedSpecialWrapper import mods.betterfoliage.model.HalfBakedWrapperKey import mods.betterfoliage.model.SpecialRenderModel import mods.betterfoliage.model.SpriteSetDelegate import mods.betterfoliage.model.buildTufts import mods.betterfoliage.model.transform import mods.betterfoliage.model.tuftModelSet import mods.betterfoliage.model.tuftShapeSet import mods.betterfoliage.render.pipeline.RenderCtxBase import mods.betterfoliage.resource.discovery.AbstractModelDiscovery import mods.betterfoliage.resource.discovery.BakeWrapperManager import mods.betterfoliage.resource.discovery.ModelBakingKey import mods.betterfoliage.util.Atlas import mods.betterfoliage.util.LazyInvalidatable import mods.betterfoliage.util.get import net.minecraft.block.BlockState import net.minecraft.block.Blocks import net.minecraft.client.renderer.model.BlockModel import net.minecraft.client.renderer.model.ModelBakery import net.minecraft.util.Direction.DOWN import net.minecraft.util.ResourceLocation object StandardLilypadDiscovery : AbstractModelDiscovery() { val LILYPAD_BLOCKS = listOf(Blocks.LILY_PAD) override fun processModel( bakery: ModelBakery, state: BlockState, location: ResourceLocation, sprites: MutableSet, replacements: MutableMap ): Boolean { val model = bakery.getUnbakedModel(location) if (model is BlockModel && state.block in LILYPAD_BLOCKS) { replacements[location] = StandardLilypadKey } return super.processModel(bakery, state, location, sprites, replacements) } } object StandardLilypadKey : HalfBakedWrapperKey() { override fun replace(wrapped: SpecialRenderModel) = StandardLilypadModel(wrapped) } class StandardLilypadModel( wrapped: SpecialRenderModel ) : HalfBakedSpecialWrapper(wrapped) { override fun render(ctx: RenderCtxBase, noDecorations: Boolean) { ctx.checkSides = false super.render(ctx, noDecorations) if (!Config.enabled || !Config.lilypad.enabled) return ShadersModIntegration.grass(ctx, Config.lilypad.shaderWind) { ctx.renderQuads(lilypadRootModels[ctx.random]) } if (Config.lilypad.enabled(ctx.random)) ctx.renderQuads(lilypadFlowerModels[ctx.random]) } companion object { val lilypadRootSprites by SpriteSetDelegate(Atlas.BLOCKS) { idx -> ResourceLocation(BetterFoliageMod.MOD_ID, "blocks/better_lilypad_roots_$idx") } val lilypadFlowerSprites by SpriteSetDelegate(Atlas.BLOCKS) { idx -> ResourceLocation(BetterFoliageMod.MOD_ID, "blocks/better_lilypad_flower_$idx") } val lilypadRootModels by LazyInvalidatable(BakeWrapperManager) { val shapes = tuftShapeSet(1.0, 1.0, 1.0, Config.lilypad.hOffset) tuftModelSet(shapes, -1) { lilypadRootSprites[it] } .transform { move(2.0 to DOWN) } .buildTufts() } val lilypadFlowerModels by LazyInvalidatable(BakeWrapperManager) { val shapes = tuftShapeSet(0.5, 0.5, 0.5, Config.lilypad.hOffset) tuftModelSet(shapes, -1) { lilypadFlowerSprites[it] } .transform { move(1.0 to DOWN) } .buildTufts() } } }