mirror of
https://github.com/MinecraftForge/MinecraftForge.git
synced 2026-11-13 00:37:52 +00:00
Implemented interpolation of TRSR transformations; B3D: added interpolation capabilities to B3DState, animated TESR example in ModelAnimationTest (pure TESR right now, no separation inside the example model between the static and dynamic parts right now).
This commit is contained in:
1 parent
eb73c30b28
commit
13d7530e43
4 files changed
+716
-106
No files matched your search
@@ -0,0 +1,285 @@
|
||||
package net.minecraftforge.debug;
|
||||
|
||||
import net.minecraft.block.Block;
|
||||
import net.minecraft.block.BlockPistonBase;
|
||||
import net.minecraft.block.material.Material;
|
||||
import net.minecraft.block.properties.IProperty;
|
||||
import net.minecraft.block.properties.PropertyDirection;
|
||||
import net.minecraft.block.state.IBlockState;
|
||||
import net.minecraft.client.Minecraft;
|
||||
import net.minecraft.client.renderer.BlockRendererDispatcher;
|
||||
import net.minecraft.client.renderer.GlStateManager;
|
||||
import net.minecraft.client.renderer.RenderHelper;
|
||||
import net.minecraft.client.renderer.Tessellator;
|
||||
import net.minecraft.client.renderer.WorldRenderer;
|
||||
import net.minecraft.client.renderer.texture.TextureMap;
|
||||
import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer;
|
||||
import net.minecraft.client.renderer.vertex.DefaultVertexFormats;
|
||||
import net.minecraft.client.resources.model.IBakedModel;
|
||||
import net.minecraft.client.resources.model.ModelResourceLocation;
|
||||
import net.minecraft.creativetab.CreativeTabs;
|
||||
import net.minecraft.entity.EntityLivingBase;
|
||||
import net.minecraft.entity.player.EntityPlayer;
|
||||
import net.minecraft.item.Item;
|
||||
import net.minecraft.tileentity.TileEntity;
|
||||
import net.minecraft.util.BlockPos;
|
||||
import net.minecraft.util.EnumFacing;
|
||||
import net.minecraft.util.ITickable;
|
||||
import net.minecraft.world.World;
|
||||
import net.minecraftforge.client.model.ISmartBlockModel;
|
||||
import net.minecraftforge.client.model.ModelLoader;
|
||||
import net.minecraftforge.client.model.b3d.B3DLoader;
|
||||
import net.minecraftforge.client.model.b3d.B3DLoader.B3DFrameProperty;
|
||||
import net.minecraftforge.client.model.b3d.B3DLoader.B3DState;
|
||||
import net.minecraftforge.common.property.ExtendedBlockState;
|
||||
import net.minecraftforge.common.property.IExtendedBlockState;
|
||||
import net.minecraftforge.common.property.IUnlistedProperty;
|
||||
import net.minecraftforge.fml.client.registry.ClientRegistry;
|
||||
import net.minecraftforge.fml.common.Mod;
|
||||
import net.minecraftforge.fml.common.Mod.EventHandler;
|
||||
import net.minecraftforge.fml.common.SidedProxy;
|
||||
import net.minecraftforge.fml.common.event.FMLInitializationEvent;
|
||||
import net.minecraftforge.fml.common.event.FMLPreInitializationEvent;
|
||||
import net.minecraftforge.fml.common.registry.GameRegistry;
|
||||
|
||||
import org.lwjgl.opengl.GL11;
|
||||
|
||||
@Mod(modid = ModelAnimationDebug.MODID, version = ModelAnimationDebug.VERSION)
|
||||
public class ModelAnimationDebug
|
||||
{
|
||||
public static final String MODID = "forgedebugmodelanimation";
|
||||
public static final String VERSION = "0.0";
|
||||
|
||||
public static String blockName = "test_animation_block";
|
||||
public static final PropertyDirection FACING = PropertyDirection.create("facing");
|
||||
|
||||
@SidedProxy(serverSide = "net.minecraftforge.debug.ModelAnimationDebug$CommonProxy", clientSide = "net.minecraftforge.debug.ModelAnimationDebug$ClientProxy")
|
||||
public static CommonProxy proxy;
|
||||
|
||||
public static class CommonProxy
|
||||
{
|
||||
public void preInit(FMLPreInitializationEvent event)
|
||||
{
|
||||
B3DLoader.instance.addDomain(MODID);
|
||||
GameRegistry.registerBlock(new Block(Material.wood)
|
||||
{
|
||||
{
|
||||
setCreativeTab(CreativeTabs.tabBlock);
|
||||
setUnlocalizedName(MODID + "." + blockName);
|
||||
}
|
||||
|
||||
@Override
|
||||
public ExtendedBlockState createBlockState()
|
||||
{
|
||||
return new ExtendedBlockState(this, new IProperty[]{ FACING }, new IUnlistedProperty[]{ B3DFrameProperty.instance });
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getRenderType() { return -1; }
|
||||
|
||||
@Override
|
||||
public boolean isOpaqueCube() { return false; }
|
||||
|
||||
@Override
|
||||
public boolean isFullCube() { return false; }
|
||||
|
||||
@Override
|
||||
public IBlockState onBlockPlaced(World world, BlockPos pos, EnumFacing facing, float hitX, float hitY, float hitZ, int meta, EntityLivingBase placer)
|
||||
{
|
||||
return this.getDefaultState().withProperty(FACING, BlockPistonBase.getFacingFromEntity(world, pos, placer));
|
||||
}
|
||||
|
||||
@Override
|
||||
public IBlockState getStateFromMeta(int meta) {
|
||||
return getDefaultState().withProperty(FACING, EnumFacing.getFront(meta));
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getMetaFromState(IBlockState state) {
|
||||
return ((EnumFacing)state.getValue(FACING)).getIndex();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean hasTileEntity(IBlockState state) {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public TileEntity createTileEntity(World world, IBlockState state) {
|
||||
return new Chest(state);
|
||||
}
|
||||
|
||||
/*@Override
|
||||
public IBlockState getExtendedState(IBlockState state, IBlockAccess world, BlockPos pos) {
|
||||
TileEntity te = world.getTileEntity(pos);
|
||||
if(te instanceof Chest && state instanceof IExtendedBlockState)
|
||||
{
|
||||
return ((Chest)te).getState((IExtendedBlockState)state);
|
||||
}
|
||||
return super.getExtendedState(state, world, pos);
|
||||
}*/
|
||||
|
||||
@Override
|
||||
public boolean onBlockActivated(World world, BlockPos pos, IBlockState state, EntityPlayer player, EnumFacing side, float hitX, float hitY, float hitZ)
|
||||
{
|
||||
if(world.isRemote)
|
||||
{
|
||||
TileEntity te = world.getTileEntity(pos);
|
||||
if(te instanceof Chest)
|
||||
{
|
||||
((Chest)te).click();
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
}, blockName);
|
||||
}
|
||||
|
||||
public void init(FMLInitializationEvent event) {}
|
||||
}
|
||||
|
||||
public static class ClientProxy extends CommonProxy
|
||||
{
|
||||
@Override
|
||||
public void preInit(FMLPreInitializationEvent event)
|
||||
{
|
||||
super.preInit(event);
|
||||
ModelLoader.setCustomModelResourceLocation(Item.getItemFromBlock(GameRegistry.findBlock(MODID, blockName)), 0, new ModelResourceLocation(MODID.toLowerCase() + ":" + blockName, "inventory"));
|
||||
}
|
||||
|
||||
@Override
|
||||
public void init(FMLInitializationEvent event)
|
||||
{
|
||||
super.init(event);
|
||||
ClientRegistry.bindTileEntitySpecialRenderer(Chest.class, ChestRenderer.instance);
|
||||
}
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
public void preInit(FMLPreInitializationEvent event) { proxy.preInit(event); }
|
||||
|
||||
@EventHandler
|
||||
public void init(FMLInitializationEvent event) { proxy.init(event); }
|
||||
|
||||
private static class Chest extends TileEntity implements ITickable
|
||||
{
|
||||
private final int minFrame = 1;
|
||||
private final int maxFrame = 10;
|
||||
private int tick = minFrame;
|
||||
private boolean opening = false;
|
||||
private boolean closing = false;
|
||||
|
||||
public Chest(IBlockState state) {
|
||||
}
|
||||
|
||||
/*public IExtendedBlockState getState(IExtendedBlockState state) {
|
||||
return state.withProperty(B3DFrameProperty.instance, curState);
|
||||
}*/
|
||||
|
||||
public void click()
|
||||
{
|
||||
if(opening || tick == maxFrame)
|
||||
{
|
||||
opening = false;
|
||||
closing = true;
|
||||
return;
|
||||
}
|
||||
if(closing || tick == minFrame)
|
||||
{
|
||||
closing = false;
|
||||
opening = true;
|
||||
return;
|
||||
}
|
||||
opening = true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void update()
|
||||
{
|
||||
if(opening)
|
||||
{
|
||||
tick++;
|
||||
if(tick >= maxFrame)
|
||||
{
|
||||
tick = maxFrame;
|
||||
opening = false;
|
||||
}
|
||||
}
|
||||
if(closing)
|
||||
{
|
||||
tick--;
|
||||
if(tick <= minFrame)
|
||||
{
|
||||
tick = minFrame;
|
||||
closing = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public int getCurFrame()
|
||||
{
|
||||
return tick;
|
||||
}
|
||||
|
||||
public int getNextFrame()
|
||||
{
|
||||
if(opening) return Math.min(tick + 1, maxFrame);
|
||||
if(closing) return Math.max(tick - 1, minFrame);
|
||||
return tick;
|
||||
}
|
||||
}
|
||||
|
||||
private static class ChestRenderer extends TileEntitySpecialRenderer<Chest>
|
||||
{
|
||||
public static ChestRenderer instance = new ChestRenderer();
|
||||
private ChestRenderer() {}
|
||||
|
||||
private final BlockRendererDispatcher blockRenderer = Minecraft.getMinecraft().getBlockRendererDispatcher();
|
||||
|
||||
public void renderTileEntityAt(Chest te, double x, double y, double z, float partialTick, int breakStage)
|
||||
{
|
||||
IBlockState state = te.getWorld().getBlockState(te.getPos());
|
||||
IBakedModel model = this.blockRenderer.getModelFromBlockState(state, te.getWorld(), te.getPos());
|
||||
if(state instanceof IExtendedBlockState)
|
||||
{
|
||||
IExtendedBlockState exState = (IExtendedBlockState)state;
|
||||
if(exState.getUnlistedNames().contains(B3DFrameProperty.instance))
|
||||
{
|
||||
exState = exState.withProperty(B3DFrameProperty.instance, new B3DState(null, te.getCurFrame(), te.getNextFrame(), partialTick));
|
||||
if(model instanceof ISmartBlockModel)
|
||||
{
|
||||
model = ((ISmartBlockModel)model).handleBlockState(exState);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Tessellator tessellator = Tessellator.getInstance();
|
||||
WorldRenderer worldrenderer = tessellator.getWorldRenderer();
|
||||
this.bindTexture(TextureMap.locationBlocksTexture);
|
||||
RenderHelper.disableStandardItemLighting();
|
||||
GlStateManager.blendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);
|
||||
GlStateManager.enableBlend();
|
||||
GlStateManager.disableCull();
|
||||
|
||||
if (Minecraft.isAmbientOcclusionEnabled())
|
||||
{
|
||||
GlStateManager.shadeModel(GL11.GL_SMOOTH);
|
||||
}
|
||||
else
|
||||
{
|
||||
GlStateManager.shadeModel(GL11.GL_FLAT);
|
||||
}
|
||||
|
||||
worldrenderer.func_181668_a(7, DefaultVertexFormats.BLOCK);
|
||||
worldrenderer.setTranslation(x - te.getPos().getX(), y - te.getPos().getY(), z - te.getPos().getZ());
|
||||
|
||||
this.blockRenderer.getBlockModelRenderer().renderModel(te.getWorld(), model, state, te.getPos(), worldrenderer, false);
|
||||
|
||||
worldrenderer.setTranslation(0, 0, 0);
|
||||
tessellator.draw();
|
||||
|
||||
RenderHelper.enableStandardItemLighting();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in new issue
Block a user