Рендер модели без TileEntity

Версия Minecraft
1.7.10
1,015
9
102
Как зарендрить модель сундука без использования TileEntitySpecialRenderer? В 1.12.2 так точно можно, ибо там есть блокстейты, а тут нет. Это делаю в целях оптимизации, ибо на карте таких блоков будет ~100 штук
 
Решение
Такое чувство, что тут никто такое не делал, так что пришлось разбираться самому. Начальная трансформация равна положению чанка, в котором находится блок, причем по Y тоже есть деление на чанки. Поэтому перед прорисовкой надо сделать такую трансформацию:
GL11.glTranslatef(x % 16, y % 16, z % 16);

Блок черный, потому что мы влезаем в рендер мира, и перед началом своего рендера, надо закончить тот. Для этого перед рендером пишем это:
Java:
        int previousGLRenderType = 0;
        try {
            previousGLRenderType = (int) drawModeField.get(Tessellator.instance); // Вот тут получаем значение поля net.minecraft.client.renderer.Tessellator.drawMode
        } catch (IllegalAccessException e) {
            e.printStackTrace()...
7,099
324
1,510
ISimpleBlockRenderingHandler. Можно посмотреть в тауме пример юза
 
1,015
9
102
Кароч написал вот это

Java:
package ru.minebot.lootingchestsmod.chest;

import cpw.mods.fml.client.registry.ISimpleBlockRenderingHandler;
import cpw.mods.fml.common.FMLLog;
import net.minecraft.block.Block;
import net.minecraft.block.BlockChest;
import net.minecraft.client.Minecraft;
import net.minecraft.client.model.ModelChest;
import net.minecraft.client.renderer.RenderBlocks;
import net.minecraft.client.renderer.texture.TextureAtlasSprite;
import net.minecraft.client.renderer.texture.TextureManager;
import net.minecraft.client.renderer.texture.TextureMap;
import net.minecraft.util.ResourceLocation;
import net.minecraft.world.IBlockAccess;
import org.lwjgl.opengl.GL11;
import org.lwjgl.opengl.GL12;

public class RenderChest implements ISimpleBlockRenderingHandler {
    public static int renderID;
    private static final ResourceLocation field_147504_g = new ResourceLocation("textures/entity/chest/normal.png");
    private ModelChest field_147510_h = new ModelChest();

    public RenderChest(){

    }

    @Override
    public void renderInventoryBlock(Block block, int metadata, int modelId, RenderBlocks renderer) {
        Minecraft.getMinecraft().getTextureManager().bindTexture(field_147504_g);
        GL11.glPushMatrix();
        GL11.glEnable(GL12.GL_RESCALE_NORMAL);
        GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
        GL11.glScalef(1.0F, -1.0F, -1.0F);
        GL11.glTranslatef(-0.5F, -0.5F, -0.5F);
        field_147510_h.renderAll();
        GL11.glDisable(GL12.GL_RESCALE_NORMAL);
        GL11.glPopMatrix();
        GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
    }

    @Override
    public boolean renderWorldBlock(IBlockAccess world, int x, int y, int z, Block block, int modelId, RenderBlocks renderer) {
        Minecraft.getMinecraft().getTextureManager().bindTexture(field_147504_g);
        GL11.glPushMatrix();
        GL11.glEnable(GL12.GL_RESCALE_NORMAL);
        GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
        GL11.glTranslatef((float)x, (float)y + 1.0F, (float)z + 1.0F);
        GL11.glScalef(1.0F, -1.0F, -1.0F);
        field_147510_h.renderAll();
        GL11.glDisable(GL12.GL_RESCALE_NORMAL);
        GL11.glPopMatrix();
        GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
        Minecraft.getMinecraft().getTextureManager().bindTexture(TextureMap.locationBlocksTexture);
        return true;
    }

    @Override
    public boolean shouldRender3DInInventory(int modelId) {
        return true;
    }

    @Override
    public int getRenderId() {
        return renderID;
    }
}

Моделька в инвентаре и в руке рендрится нормально, но вот в мире она то ли не рендрится, то ли прозрачная. Я так и не догнал почему так
Безымянный.png
 
7,099
324
1,510
field_147510_h
???

Попробуй поставить его высоко в воздухе, может, он рисуется под землей щас
 
1,015
9
102
Стырил с исходников майна)

Эээ, как он там оказался? Еще он черный. Чет с освещением. И если я рядом ставлю блоки, то они не рендрятся. Рисуется ток первый :unsure:
Безымянный.png
 
1,015
9
102
Такое чувство, что тут никто такое не делал, так что пришлось разбираться самому. Начальная трансформация равна положению чанка, в котором находится блок, причем по Y тоже есть деление на чанки. Поэтому перед прорисовкой надо сделать такую трансформацию:
GL11.glTranslatef(x % 16, y % 16, z % 16);

Блок черный, потому что мы влезаем в рендер мира, и перед началом своего рендера, надо закончить тот. Для этого перед рендером пишем это:
Java:
        int previousGLRenderType = 0;
        try {
            previousGLRenderType = (int) drawModeField.get(Tessellator.instance); // Вот тут получаем значение поля net.minecraft.client.renderer.Tessellator.drawMode
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }
        Tessellator.instance.draw();

А после рендера вот это:
Код:
        Minecraft.getMinecraft().getTextureManager().bindTexture(TextureMap.locationBlocksTexture);
        Tessellator.instance.startDrawing(previousGLRenderType);
 
7,099
324
1,510
Сверху