From c05ba789f5557e2ce346e0989669e667940ee34f Mon Sep 17 00:00:00 2001 From: Adubbz Date: Sat, 3 Dec 2016 13:06:21 +1100 Subject: [PATCH] Flowering leaves no longer render as white boxes. Closes #696 --- .../client/model/ModelBiomeFinder.java | 87 ------------------ .../client/model/ModelFlowerBasket.java | 51 ---------- .../common/handler/LeavesModelHandler.java | 75 +++++++++++++++ .../common/init/ModHandlers.java | 1 + .../models/block/flowering_leaves_fast.json | 6 ++ .../textures/blocks/leaves_flowering_fast.png | Bin 0 -> 632 bytes 6 files changed, 82 insertions(+), 138 deletions(-) delete mode 100644 src/main/java/biomesoplenty/client/model/ModelBiomeFinder.java delete mode 100644 src/main/java/biomesoplenty/client/model/ModelFlowerBasket.java create mode 100644 src/main/java/biomesoplenty/common/handler/LeavesModelHandler.java create mode 100644 src/main/resources/assets/biomesoplenty/models/block/flowering_leaves_fast.json create mode 100644 src/main/resources/assets/biomesoplenty/textures/blocks/leaves_flowering_fast.png diff --git a/src/main/java/biomesoplenty/client/model/ModelBiomeFinder.java b/src/main/java/biomesoplenty/client/model/ModelBiomeFinder.java deleted file mode 100644 index 6471503eb..000000000 --- a/src/main/java/biomesoplenty/client/model/ModelBiomeFinder.java +++ /dev/null @@ -1,87 +0,0 @@ -/******************************************************************************* - * Copyright 2014-2016, the Biomes O' Plenty Team - * - * This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International Public License. - * - * To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/4.0/. - ******************************************************************************/ - -package biomesoplenty.client.model; - -import com.google.common.collect.ImmutableList; - -import biomesoplenty.client.util.ModelUtils; -import net.minecraft.client.Minecraft; -import net.minecraft.client.entity.EntityPlayerSP; -import net.minecraft.client.renderer.block.model.IBakedModel; -import net.minecraft.client.renderer.block.model.ItemOverride; -import net.minecraft.client.renderer.block.model.ItemOverrideList; -import net.minecraft.client.renderer.texture.TextureAtlasSprite; -import net.minecraft.entity.EntityLivingBase; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.world.World; -import net.minecraftforge.client.model.IModel; - -public class ModelBiomeFinder extends ItemOverrideList -{ - private IBakedModel[] frames; - - public ModelBiomeFinder(IModel defaultModel, TextureAtlasSprite[] frameTextures) - { - super(ImmutableList.of()); - - this.frames = ModelUtils.generateModelsForTextures(defaultModel, frameTextures); - } - - @Override - public IBakedModel handleItemState(IBakedModel originalModel, ItemStack stack, World world, EntityLivingBase entity) - { - EntityPlayerSP player = Minecraft.getMinecraft().player; - if (player == null) {return this.frames[0];} - - NBTTagCompound nbt = stack.getTagCompound(); - if (nbt != null && nbt.hasKey("biomeIDToFind")) - { - if (nbt.hasKey("searchStarted")) - { - // searching for biome, but not yet found indicate searching by flashing - return this.getFlashingFrame(player); - } - else if (nbt.getBoolean("found")) - { - // if the biome has been found, point at it - int posX = nbt.getInteger("posX"); - int posZ = nbt.getInteger("posZ"); - return getFrameForPositionRelativeToPlayer(player, posX, posZ); - } - else - { - // the search has not yet been started, show all sectors lit - return this.frames[9]; - } - } - else - { - // if we've got here, the biome finder has not been bound to a biome yet - show no sectors lit - return this.frames[8]; - } - } - - public IBakedModel getFlashingFrame(EntityPlayerSP player) - { - return (player.getRNG().nextInt(2) == 0 ? this.frames[10] : this.frames[11]); - } - - public IBakedModel getFrameForPositionRelativeToPlayer(EntityPlayer player, int biomePosX, int biomePosZ) - { - double xDiff = (double)biomePosX - player.posX; - double zDiff = (double)biomePosZ - player.posZ; - // angle (in degrees) of direction from player to biome (relative to player rotation) - double angleDiff = (Math.atan2(zDiff, xDiff) * 180.0D / Math.PI) + 270.0D - player.rotationYaw; - // there are 8 sectors on the biome finder, so 45 degrees each (offset by 22.5 to center the angle in the middle of the sector) - int sector = (int)Math.floor((angleDiff + 22.5D) / 45.0D); - return this.frames[((sector % 8) + 8) % 8]; - } -} diff --git a/src/main/java/biomesoplenty/client/model/ModelFlowerBasket.java b/src/main/java/biomesoplenty/client/model/ModelFlowerBasket.java deleted file mode 100644 index c07ebc80e..000000000 --- a/src/main/java/biomesoplenty/client/model/ModelFlowerBasket.java +++ /dev/null @@ -1,51 +0,0 @@ -/******************************************************************************* - * Copyright 2016, the Biomes O' Plenty Team - * - * This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International Public License. - * - * To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/4.0/. - ******************************************************************************/ - -package biomesoplenty.client.model; - -import com.google.common.collect.ImmutableList; - -import biomesoplenty.common.inventory.InventoryFlowerBasket; -import net.minecraft.client.renderer.block.model.IBakedModel; -import net.minecraft.client.renderer.block.model.ItemOverride; -import net.minecraft.client.renderer.block.model.ItemOverrideList; -import net.minecraft.entity.EntityLivingBase; -import net.minecraft.item.ItemStack; -import net.minecraft.world.World; - -public class ModelFlowerBasket extends ItemOverrideList -{ - private IBakedModel emptyBakedModel; - private IBakedModel filledBakedModel; - - public ModelFlowerBasket(IBakedModel emptyModel, IBakedModel filledModel) - { - super(ImmutableList.of()); - - this.emptyBakedModel = emptyModel; - this.filledBakedModel = filledModel; - } - - @Override - public IBakedModel handleItemState(IBakedModel originalModel, ItemStack stack, World world, EntityLivingBase entity) - { - InventoryFlowerBasket inventory = new InventoryFlowerBasket(stack, null); - boolean filled = false; - - for (int index = 0; index < inventory.getSizeInventory(); ++index) - { - if (inventory.getStackInSlot(index) != null) - { - filled = true; - break; - } - } - - return filled ? this.filledBakedModel : this.emptyBakedModel; - } -} diff --git a/src/main/java/biomesoplenty/common/handler/LeavesModelHandler.java b/src/main/java/biomesoplenty/common/handler/LeavesModelHandler.java new file mode 100644 index 000000000..69b9e923b --- /dev/null +++ b/src/main/java/biomesoplenty/common/handler/LeavesModelHandler.java @@ -0,0 +1,75 @@ +/******************************************************************************* + * Copyright 2016, the Biomes O' Plenty Team + * + * This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International Public License. + * + * To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/4.0/. + ******************************************************************************/ +package biomesoplenty.common.handler; + +import com.google.common.collect.Maps; +import net.minecraft.block.state.IBlockState; +import net.minecraft.client.renderer.block.model.BakedQuad; +import net.minecraft.client.renderer.block.model.IBakedModel; +import net.minecraft.client.renderer.block.model.ModelResourceLocation; +import net.minecraft.client.renderer.block.model.SimpleBakedModel; +import net.minecraft.client.renderer.vertex.DefaultVertexFormats; +import net.minecraft.init.Blocks; +import net.minecraft.util.EnumFacing; +import net.minecraft.util.ResourceLocation; +import net.minecraft.util.registry.IRegistry; +import net.minecraftforge.client.event.ModelBakeEvent; +import net.minecraftforge.client.model.IModel; +import net.minecraftforge.client.model.ModelLoader; +import net.minecraftforge.client.model.ModelLoaderRegistry; +import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; + +import javax.annotation.Nullable; +import java.util.List; +import java.util.Map; + +public class LeavesModelHandler +{ + private static final ModelResourceLocation LEAVES_LOC = new ModelResourceLocation("biomesoplenty:leaves_3", "variant=flowering"); + + @SubscribeEvent + public void onModelBake(ModelBakeEvent event) throws Exception + { + ModelLoader loader = event.getModelLoader(); + IRegistry registry = event.getModelRegistry(); + IBakedModel originalBakedModel = registry.getObject(LEAVES_LOC); + + // Load and bake the fast flowering leaves model + IModel fastModel = ModelLoaderRegistry.getModel(new ResourceLocation("biomesoplenty:block/flowering_leaves_fast")); + IBakedModel bakedFastModel = fastModel.bake(fastModel.getDefaultState(), DefaultVertexFormats.BLOCK, ModelLoader.defaultTextureGetter()); + + registry.putObject(LEAVES_LOC, new ModelLeaves(originalBakedModel, bakedFastModel)); + } + + public class ModelLeaves extends SimpleBakedModel + { + private IBakedModel fastModel; + + public ModelLeaves(IBakedModel fancyModel, IBakedModel fastModel) + { + super(fancyModel.getQuads(null, null, 0), generateFacingQuads(fancyModel), fancyModel.isAmbientOcclusion(), fancyModel.isGui3d(), fancyModel.getParticleTexture(), fancyModel.getItemCameraTransforms(), fancyModel.getOverrides()); + this.fastModel = fastModel; + } + + @Override + public List getQuads(@Nullable IBlockState state, @Nullable EnumFacing side, long rand) + { + return Blocks.LEAVES.isOpaqueCube(null) ? fastModel.getQuads(state, side, rand) : super.getQuads(state, side, rand); + } + } + + private static Map> generateFacingQuads(IBakedModel model) + { + Map> faceQuads = Maps.newEnumMap(EnumFacing.class); + for (EnumFacing facing : EnumFacing.values()) + { + faceQuads.put(facing, model.getQuads(null, facing, 0)); + } + return faceQuads; + } +} diff --git a/src/main/java/biomesoplenty/common/init/ModHandlers.java b/src/main/java/biomesoplenty/common/init/ModHandlers.java index 3481717a2..4cf5eb57f 100644 --- a/src/main/java/biomesoplenty/common/init/ModHandlers.java +++ b/src/main/java/biomesoplenty/common/init/ModHandlers.java @@ -53,5 +53,6 @@ public class ModHandlers { MinecraftForge.EVENT_BUS.register(new GuiEventHandler()); MinecraftForge.EVENT_BUS.register(new TrailsEventHandler()); + MinecraftForge.EVENT_BUS.register(new LeavesModelHandler()); } } diff --git a/src/main/resources/assets/biomesoplenty/models/block/flowering_leaves_fast.json b/src/main/resources/assets/biomesoplenty/models/block/flowering_leaves_fast.json new file mode 100644 index 000000000..7be9e986f --- /dev/null +++ b/src/main/resources/assets/biomesoplenty/models/block/flowering_leaves_fast.json @@ -0,0 +1,6 @@ +{ + "parent": "block/leaves", + "textures": { + "all": "biomesoplenty:blocks/leaves_flowering_fast" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/biomesoplenty/textures/blocks/leaves_flowering_fast.png b/src/main/resources/assets/biomesoplenty/textures/blocks/leaves_flowering_fast.png new file mode 100644 index 0000000000000000000000000000000000000000..beb28909ec517d2c1df64c2add7d90c50f870484 GIT binary patch literal 632 zcmV-;0*C#HP)<{98FWQhbW?9;ba!ELWdLwtX>N2bZe?^J zG%heMF)*zP3cvsW0rg2lK~y+TWmDOzB0&u8{}bGC7eUmAnUC;A6cur4MO1L#w-z@9 z|HUU2+`b{VPcEssm&r>dr_!k;=d@O@*GV&NwOUc9)1g2hz_C~|nfw*QJRT2Yi^YPp zOeVv@`Fy5Eqrtx0?N%Ql*=n_NyxZ+)zu%MHZvQV&D;A6Ne!t1#aFAgb)bIECvfXae zd_Jd0B*ORAYL)TLW<%V8*yHgaU60Z2b|Z|F%jNhINzG=HY&IJg&gb)tBL_Hqt=H>O zx7(%b^~%6#G$NkE;$*)bICGC=?=2JRXmHF&>ZUa5!)gEUa8EGd`V8 z>G^z`o&2Ty{jSD~Mx&&iPA38b09vgUcLRE$4=Df)K0Zba%E1on0rLvaXiJtPbBkzd zwVH~T%OzDR6^=FV%gzt8SS)H6v)Swy-@rw1Y~WK)sEolM23$TsAyF;_hvJ%Wx!rD6 zB3guOU#}O(*=&|i?4ndEv5&Eb!y&OC0N^K*xgey^=VKQ9!;8afz)=7?S+Cds#!4g- z-;QZ00&YcAm&=9ESS-drkSr42f@a>+U@%Yx#DoEe3@_my5bj~19jY`8gT4T7zP^&- S5}tej0000