Как добавить блоку плавное вращение вокруг Y оси?

Версия Minecraft
1.12.2
API
Forge
30
2
0
Ищу способ добавить заставить obj модель блока плавно вращаться вокруг Y оси при определённом условии.
 
30
2
0
Мне бы сначала разобраться в самом механизме вращения.
Не получается даже статично повернуть модель по оси Y.


Java:
public class RenderTestAnim extends TileEntitySpecialRenderer<TileEntityTestAnim> {
   
    @Override
    public void render(TileEntityTestAnim te, double x, double y, double z, float partialTicks, int destroyStage, float alpha)
    {
        GL11.glPushMatrix();
        GL11.glRotated(45, 0, 1, 0);
    }

}
 
Последнее редактирование:
30
2
0
помогло. только вместо поворота модели визуально двигается только хитбокс.


ClientProxy:
public class ClientProxy extends CommonProxy
{
    @Override
    public void preInit(FMLPreInitializationEvent event)
    {
        super.preInit(event);
        OBJLoader.INSTANCE.addDomain(Reference.MODID);
        ClientRegistry.bindTileEntitySpecialRenderer(TileEntityTestAnim.class, new RenderTestAnim());
    }

    @Override
    public void init(FMLInitializationEvent event)
    {
        super.init(event);
  
    }

    @Override
    public void postInit(FMLPostInitializationEvent event)
    {

        super.postInit(event);
    }
}


RenderTestAnim:
public class RenderTestAnim extends TileEntitySpecialRenderer<TileEntityTestAnim> {
 
    @Override
    public void render(TileEntityTestAnim te, double x, double y, double z, float partialTicks, int destroyStage, float alpha)
    {
        GL11.glRotated(45, 0, 1, 0);
        GL11.glPushMatrix();
    }

}


BlockTestAnim:
public class BlockTestAnim extends BlockTileEntity<TileEntityTestAnim> {

    public BlockTestAnim(String name, Material material, float hardness, float resistanse, CreativeTabs creativetab) {

        super(name, material, hardness, resistanse, creativetab);

        this.setHarvestLevel("pickaxe", 3);
    }
 
    @Override
    public boolean isOpaqueCube(IBlockState state) {
        return false;
    }
 
    @SideOnly(Side.CLIENT)
    public void initModel() {
        ModelLoader.setCustomModelResourceLocation(Item.getItemFromBlock(this), 0, new ModelResourceLocation(getRegistryName(), "inventory"));
    }

    @Override
    public boolean isFullCube(IBlockState state) {
        return false;
    }
 


        @Override
        public boolean onBlockActivated(World world, BlockPos position, IBlockState blockState, EntityPlayer player, EnumHand hand, EnumFacing side, float hitX, float hitY, float hitZ) {

            if (!world.isRemote) {

                TileEntityTestAnim tileEntity = getTileEntity(world, position);

                if (side == EnumFacing.DOWN) {

                    tileEntity.decrementCount();

                }

                else if (side == EnumFacing.UP) {

                    tileEntity.incrementCount();
                }

                player.sendMessage(new TextComponentString("Count: " + tileEntity.getCount()));
            }

            return true;
        }

        @Override
        public Class<TileEntityTestAnim> getTileEntityClass() {

            return TileEntityTestAnim.class;
        }

        @Override
        public TileEntityTestAnim createTileEntity(World world, IBlockState blockState) {

            return new TileEntityTestAnim();
        }
    }

TileEntityTestAnim:
public class TileEntityTestAnim extends TileEntity {

 private int count;

 @Override
 public NBTTagCompound writeToNBT(NBTTagCompound tagCompound) {

     tagCompound.setInteger("count", this.count);

     return super.writeToNBT(tagCompound);
 }

 @Override
 public void readFromNBT(NBTTagCompound tagCompound) {

     this.count = tagCompound.getInteger("count");

     super.readFromNBT(tagCompound);
 }

 public int getCount() {

     return this.count;
 }

 public void incrementCount() {

     this.count++;

     this.markDirty();
 }

 public void decrementCount() {

     this.count--;

     this.markDirty();
 }
}

Screenshot_6.jpg
 
Последнее редактирование:
30
2
0
и в консоли выдаёт ошибку:
[12:51:00] [Client thread/ERROR] [minecraft/Minecraft]: ########## GL ERROR ##########
[12:51:00] [Client thread/ERROR] [minecraft/Minecraft]: @ Post render
[12:51:00] [Client thread/ERROR] [minecraft/Minecraft]: 1283: Stack overflow
если добавляю GL11.glPopMatrix(); то ошибка пропадает но и GL11.glrotated() перестаёт работать
 
Последнее редактирование:
173
13
25
[12:51:00] [Client thread/ERROR] [minecraft/Minecraft]: ########## GL ERROR ##########
[12:51:00] [Client thread/ERROR] [minecraft/Minecraft]: @ Post render
[12:51:00] [Client thread/ERROR] [minecraft/Minecraft]: 1283: Stack overflow

Если добавляю GL11.glPopMatrix()
GL11.glPushMatrix();
GL11.glRotated(45, 0, 1, 0);

GL11.glPopMatrix();
 
30
2
0
Покапался я в интернете и в итоге вышло что то такое:
Screenshot_7.jpg

RenderTestAnim:
public class RenderTestAnim extends TileEntitySpecialRenderer<TileEntityTestAnim>
{
    private static List<BakedQuad> quads;

    @Override
    public void render(TileEntityTestAnim tile, double x, double y, double z, float partialTicks, int destroyStage, float alpha)
    {
        Tessellator tessellator = Tessellator.getInstance();
        GlStateManager.pushMatrix();
        GlStateManager.translate(x+.5, y+.5, z+.5);
        GlStateManager.rotate(45, 0, 1, 0);
        GlStateManager.scale(1, 1, 1);
        BufferBuilder worldRenderer = tessellator.getBuffer();
        worldRenderer.begin(GL11.GL_QUADS, DefaultVertexFormats.BLOCK);
        worldRenderer.setTranslation(-.5, -.5, -.5);
        ClientUtils.renderModelTESRFast(quads, worldRenderer, tile.getWorld(), tile.getPos());
        worldRenderer.setTranslation(0, 0, 0);
        tessellator.draw();
        GlStateManager.popMatrix();
    }
}

ClientUtils:
public class ClientUtils
{
    public static void renderModelTESRFast(List<BakedQuad> quads, BufferBuilder renderer, World world, BlockPos pos)
    {
        int brightness = world.getCombinedLight(pos, 0);
        int l1 = (brightness >> 0x10)&0xFFFF;
        int l2 = brightness&0xFFFF;
        for(BakedQuad quad : quads)
        {
            int[] vData = quad.getVertexData();
            VertexFormat format = quad.getFormat();
            int size = format.getIntegerSize();
            int uv = format.getUvOffsetById(0)/4;
            for(int i = 0; i < 4; ++i)
            {
                renderer
                        .pos(Float.intBitsToFloat(vData[size*i]),
                                Float.intBitsToFloat(vData[size*i+1]),
                                Float.intBitsToFloat(vData[size*i+2]))
                        .color(255, 255, 255, 255)
                        .tex(Float.intBitsToFloat(vData[size*i+uv]), Float.intBitsToFloat(vData[size*i+uv+1]))
                        .lightmap(l1, l2)
                        .endVertex();
            }
        }
    }
}
 
Последнее редактирование:
Сверху