- 1,159
- 38
- 544
Снова здарова! У меня есть особый блок, в какой-то степени объединяющий функционал наковальни и сундука. Для его рендера я юзал TESR, но хочу изменить его на
Но во в чем проблема! В руке, в качестве EntityItem, в картинной рамке... рендер выдает каждый раз разный результат:
Вот мой рендерер:
При TESR'е такой херни не было. Инфа сотка что не включен/не отключен какой-то GL флаг, но я не знаю какой. Что вы думаете?
UPD:
Попытка выполнить
ISimpleBlockRenderingHandler
, т.к. моя модель по большому счету статична и не имеет анимаций. Я читал что использование ISimpleBlockRenderingHandler
'а в этом случае положительно скажется на производительности.Но во в чем проблема! В руке, в качестве EntityItem, в картинной рамке... рендер выдает каждый раз разный результат:
Вот мой рендерер:
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
в ситуации когда мне нужно учитывать направление блока?