ISimpleBlockRenderingHandler выдает разные состояния рендера

Версия Minecraft
1.7.10
1,159
38
544
Снова здарова! У меня есть особый блок, в какой-то степени объединяющий функционал наковальни и сундука. Для его рендера я юзал TESR, но хочу изменить его на ISimpleBlockRenderingHandler, т.к. моя модель по большому счету статична и не имеет анимаций. Я читал что использование ISimpleBlockRenderingHandler'а в этом случае положительно скажется на производительности.

Но во в чем проблема! В руке, в качестве EntityItem, в картинной рамке... рендер выдает каждый раз разный результат:
2020-01-01_23.48.09.png

Вот мой рендерер:
UpgradeStationRenderer.java:
public class UpgradeStationRenderer implements ISimpleBlockRenderingHandler {
    public static final int RENDER_ID = RenderingRegistry.getNextAvailableRenderId();

    private IModelCustom model = AdvancedModelLoader.loadModel(new ResourceLocation(RSStats.MODID, "obj/upgrade_station.obj"));
    private ResourceLocation texture = new ResourceLocation(RSStats.MODID, "textures/blocks/upgrade_station.png");

    @Override
    public void renderInventoryBlock(Block block, int metadata, int modelId, RenderBlocks renderer) {
        Minecraft.getMinecraft().renderEngine.bindTexture(texture);
        GL11.glPushMatrix();
        GL11.glTranslatef(0.0F, -0.5F, 0.0F);
        model.renderAll();
        GL11.glPopMatrix();
    }

    @Override
    public boolean renderWorldBlock(IBlockAccess world, int x, int y, int z, Block block, int modelId, RenderBlocks renderer) {
        Tessellator tessellator = Tessellator.instance;
        tessellator.draw(); // Да тут мы завершаем стандартный рендер квадратов
        Minecraft.getMinecraft().renderEngine.bindTexture(texture);

        GL11.glPushMatrix();
        GL11.glEnable(GL12.GL_RESCALE_NORMAL);
        GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
        GL11.glTranslatef((float) x/* + 0.5F*/, (float) y, (float) z/* + 0.5F*/); // Позиционируем в центре блока
        int dir = world.getBlockMetadata(x, y, z); // Достаем направление блока из метадаты
        switch (dir) { // Преобразуем в угол поворота (прямо как в вальнильном коде)
            case 2: dir = 180; break;
            case 3: dir = 0; break;
            case 4: dir = -90; break; // TODO: Тут должно быть 90
            case 5: dir = 90; break; // TODO: а тут -90, прямо как в ванильном коде. Но почему тогда 2 из 4 направлений рисуются не туда?
        }
        GL11.glRotatef(0.1F, 0.0F, 1.0F, 0.0F); // ПОВОРОТ МОДЕЛИ НЕ РАБОТАЕТ!
        model.renderAll(); // Рендерим блок
        GL11.glPopMatrix();

        tessellator.startDrawingQuads(); // А тут мы начинаем, чтобы дальнейшие квадраты тоже рендерились
        Minecraft.getMinecraft().renderEngine.bindTexture(TextureMap.locationBlocksTexture);//Если не применить это, то дальнейшие квадраты примут текстуру от нашей модели
        return true;
    }

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

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

При TESR'е такой херни не было. Инфа сотка что не включен/не отключен какой-то GL флаг, но я не знаю какой. Что вы думаете?

UPD:
Попытка выполнить glRotatef() поворачивает блок относительно всего чанка. Но что еще прикольнее - походу нельзя динамически поворачивать модель на основе метадаты, как это принято в TESR'е. Причина тому то, что ISimpleBlockRenderingHandler компилится в DisplayList (подробнее в этой теме). Как я могу использовать ISimpleBlockRenderingHandler в ситуации когда мне нужно учитывать направление блока?
 
Решение
Никакого прироста в производительности ты не получишь с таким рендером.
Основная идея такого метода - это отрисовать весь чанк за один вызов рендера. Ты же мало того что прирываешь майновский, так ещё и делаешь дорогущие push/popMatrix.
Чем тебе TESR не угодил? Скомпиль свой дисплей лист и вызывай его, фпс вырастет в разы и этого будет достаточно.

tox1cozZ

aka Agravaine
8,454
598
2,890
Никакого прироста в производительности ты не получишь с таким рендером.
Основная идея такого метода - это отрисовать весь чанк за один вызов рендера. Ты же мало того что прирываешь майновский, так ещё и делаешь дорогущие push/popMatrix.
Чем тебе TESR не угодил? Скомпиль свой дисплей лист и вызывай его, фпс вырастет в разы и этого будет достаточно.
 
1,159
38
544
Ты же мало того что прирываешь майновский, так ещё и делаешь дорогущие push/popMatrix.
Спасибо вань. Я не силен в рендере, а потому твои замечания крайне ценны. Не знал что push/popMatrix есть дорогие операции
Чем тебе TESR не угодил?
Просто пытаюсь сделать свой код лучше. Дай думаю опробую ISBRH...
Скомпиль свой дисплей лист и вызывай его, фпс вырастет в разы и этого будет достаточно.
Можно мануал какой-нибудь? Али может своими словами расскажешь как это делается. И посоветуй плз когда вообще ISBRH может быть полезен?
 
Сверху