ISimpleBlockRenderingHandler как отрендерить блок

svk

1,185
3
Чёт я вообще не понимаю, как отрендерить обычный блок с нужной мне текстуркой?
Помогите пожалуйста.
 
Agravaine написал(а):
RenderBlocks смотри, там же есть методы.
Легко сказать, я там вообще ничего не понял, какая-то каша.

Вот что я осилил:
Код:
@Override
    public boolean renderWorldBlock(IBlockAccess world, int x, int y, int z, Block block, int modelId, RenderBlocks renderer)
    {
        GL11.glPushMatrix();
        Tessellator tessellator = Tessellator.instance;
        
        IIcon c = Blocks.diamond_block.getIcon(1, 0);

        float u = c.getMinU();
        float v = c.getMinV();
        float U = c.getMaxU();
        float V = c.getMaxV();

        tessellator.addTranslation(x, y, z);
        tessellator.addVertex(0, 1, 1);
        tessellator.addVertex(1, 1, 1);
        tessellator.addVertex(1, 1, 0);
        tessellator.addVertex(0, 1, 0);
        
        tessellator.addVertex(1, 0, 0);
        tessellator.addVertex(1, 0, 1);
        tessellator.addVertex(0, 0, 1);
        tessellator.addVertex(0, 0, 0);
        
        tessellator.addVertex(0, 1, 0);
        tessellator.addVertex(1, 1, 0);
        tessellator.addVertex(1, 0, 0);
        tessellator.addVertex(0, 0, 0);
        
        tessellator.addVertex(0, 0, 0);
        tessellator.addVertex(0, 0, 1);
        tessellator.addVertex(0, 1, 1);
        tessellator.addVertex(0, 1, 0);
        
        tessellator.addVertex(0, 0, 1);
        tessellator.addVertex(1, 0, 1);
        tessellator.addVertex(1, 1, 1);
        tessellator.addVertex(0, 1, 1);
        
        tessellator.addVertex(1, 1, 0);
        tessellator.addVertex(1, 1, 1);
        tessellator.addVertex(1, 0, 1);
        tessellator.addVertex(1, 0, 0);
        tessellator.addTranslation(-x, -y, -z);
        
        tessellator.addTranslation(x, y, z);
        tessellator.addVertexWithUV(0, 1, 1, u, v);
        tessellator.addVertexWithUV(1, 1, 1, u, V);
        tessellator.addVertexWithUV(1, 1, 0, U, V);
        tessellator.addVertexWithUV(0, 1, 0, U, v);
        
        tessellator.addVertexWithUV(1, 0, 0, u, v);
        tessellator.addVertexWithUV(1, 0, 1, u, V);
        tessellator.addVertexWithUV(0, 0, 1, U, V);
        tessellator.addVertexWithUV(0, 0, 0, U, v);
        
        tessellator.addVertexWithUV(0, 1, 0, u, v);
        tessellator.addVertexWithUV(1, 1, 0, u, V);
        tessellator.addVertexWithUV(1, 0, 0, U, V);
        tessellator.addVertexWithUV(0, 0, 0, U, v);
        
        tessellator.addVertexWithUV(0, 0, 0, u, v);
        tessellator.addVertexWithUV(0, 0, 1, u, V);
        tessellator.addVertexWithUV(0, 1, 1, U, V);
        tessellator.addVertexWithUV(0, 1, 0, U, v);
        
        tessellator.addVertexWithUV(0, 0, 1, u, v);
        tessellator.addVertexWithUV(1, 0, 1, u, V);
        tessellator.addVertexWithUV(1, 1, 1, U, V);
        tessellator.addVertexWithUV(0, 1, 1, U, v);
        
        tessellator.addVertexWithUV(1, 1, 0, u, v);
        tessellator.addVertexWithUV(1, 1, 1, u, V);
        tessellator.addVertexWithUV(1, 0, 1, U, V);
        tessellator.addVertexWithUV(1, 0, 0, U, v);
        tessellator.addTranslation(-x, -y, -z);
        GL11.glPopMatrix();
        
        return false;
    }

Вот только освещения нету :(
[merge_posts_bbcode]Добавлено: 06.01.2016 22:57:14[/merge_posts_bbcode]

Освещение так и не осилил.

[merge_posts_bbcode]Добавлено: 06.01.2016 23:03:28[/merge_posts_bbcode]

Пытался через setColorOpaque_F(r, g, b) но всеравно бред какой-то выходил.
 
svk написал(а):
Освещение так и не осилил.
Эм... Что? Т.е. ты пытаешься дать освещение, как-бы делаешь что-то вроде лампы, через Tessellator? Если да, то было давно обсуждение на счёт этого, как-бы был ответ что-то вроде: "По-простому не как.".
Я когда-то подобное тоже делал, разные варианты попробовал: и через Tessellator, и через OpenGL, ни чего не вышло.
Только знаю что, что-то подобное использовалось, но делалось через ASM, так как нужно было манипулировать со стандартным освещением (вроде как оно находилось в рендере мира).
 
Нет, я хочу наложить текстуру руды на камень, но с определённым цветом.
[merge_posts_bbcode]Добавлено: 06.01.2016 23:16:08[/merge_posts_bbcode]

Сделал костылём, щас тестить буду.
 
Код:
@Override
    public boolean renderWorldBlock(IBlockAccess world, int x, int y, int z, Block block, int modelId, RenderBlocks renderer)
    {
        GL11.glPushMatrix();
        Tessellator tessellator = Tessellator.instance;
        
        IIcon c = block.getIcon(1, 0);

        float u = c.getMinU();
        float v = c.getMinV();
        float U = c.getMaxU();
        float V = c.getMaxV();
                
        renderer.renderStandardBlock(Blocks.stone, x, y, z);
        
        tessellator.addTranslation(x, y, z);
        tessellator.addVertexWithUV(0, 1.00005F, 1, u, v);
        tessellator.addVertexWithUV(1, 1.00005F, 1, u, V);
        tessellator.addVertexWithUV(1, 1.00005F, 0, U, V);
        tessellator.addVertexWithUV(0, 1.00005F, 0, U, v);
        
        tessellator.addVertexWithUV(1, -0.00005F, 0, u, v);
        tessellator.addVertexWithUV(1, -0.00005F, 1, u, V);
        tessellator.addVertexWithUV(0, -0.00005F, 1, U, V);
        tessellator.addVertexWithUV(0, -0.00005F, 0, U, v);
        
        tessellator.addVertexWithUV(0, 1, -0.00005F, u, v);
        tessellator.addVertexWithUV(1, 1, -0.00005F, u, V);
        tessellator.addVertexWithUV(1, 0, -0.00005F, U, V);
        tessellator.addVertexWithUV(0, 0, -0.00005F, U, v);
        
        tessellator.addVertexWithUV(-0.00005F, 0, 0, u, v);
        tessellator.addVertexWithUV(-0.00005F, 0, 1, u, V);
        tessellator.addVertexWithUV(-0.00005F, 1, 1, U, V);
        tessellator.addVertexWithUV(-0.00005F, 1, 0, U, v);
        
        tessellator.addVertexWithUV(0, 0, 1.00005F, u, v);
        tessellator.addVertexWithUV(1, 0, 1.00005F, u, V);
        tessellator.addVertexWithUV(1, 1, 1.00005F, U, V);
        tessellator.addVertexWithUV(0, 1, 1.00005F, U, v);
        
        tessellator.addVertexWithUV(1.00005F, 1, 0, u, v);
        tessellator.addVertexWithUV(1.00005F, 1, 1, u, V);
        tessellator.addVertexWithUV(1.00005F, 0, 1, U, V);
        tessellator.addVertexWithUV(1.00005F, 0, 0, U, v);

        tessellator.addTranslation(-x, -y, -z);
        GL11.glPopMatrix();
        
        return false;
    }
 
svk написал(а):
Пытался через setColorOpaque_F(r, g, b) но всеравно бред какой-то выходил.
Это окраска геометрии.
Но оно не всегда срабатывает, у меня почти срабатывал от GL11.
[merge_posts_bbcode]Добавлено: 06.01.2016 23:18:31[/merge_posts_bbcode]

Код:
GL11.glColor3f(1F, 1F, 1F);
 
GL11 срабатывает только на весь тесселятор от startDraw до draw

Если я так сделаю, то окрасится весь чанк.
 
Тогда под конец нужно белым цветом красить.
Где-то в начале:
Код:
GL11.glPushMatrix();
GL11.glColor3f(0.75F, 0.25F, 0.25F);
Где-то в конце:
Код:
GL11.glColor3f(1F, 1F, 1F);
GL11.glPopMatrix();
 
svk, в этом коде GL11.glPushMatrix(); по моему бессмысленно.
За год отсутствия практики я немного подзабыл что к чему, да и не знал толком.
Многие, похоже не понимают, что такое тесселятор.
Тесселятор всего лишь создает массив вершин всех рисуемых полигонов для передачи (целиком) в видеокарту. В старых версиях OpenGL каждая вершина передавалась отдельной командой, что было весьма медленно.
Для всех блоков, кроме рисуемых через TileEntitySpecialRenderer, этот массив создается сразу для целого чанка.
ISimpleBlockRenderingHandler позволяет рисовать блок вместе со всеми блоками, что существенно снижает нагрузку по сравнению с TileEntitySpecialRenderer.
glPushMatrix() - это команда OpenGL, не влияющее на тесселятор, поэтому тут она бессмысленна, т.к. она изменит состояние OpenGL для всего чанка.
Команды OpenGL имеет смысл вызывать до tesselator.startDrawingQuads() и после tesselator.draw()

Советую использовать CodeChikenLib, по причинам: ISimpleBlockRenderingHandler и obj-модели.

Конечно, я могу ошибаться...
 
Я всё это знаю как бы :)

Просто я копипастил из туториала и забыл убрать.
Вот какой код у меня получился в итоге:
Код:
@Override
    public boolean renderWorldBlock(IBlockAccess world, int x, int y, int z, Block block, int modelId, RenderBlocks renderer)
    {
        BlockCrystalOre ore = (BlockCrystalOre) block;
        Tessellator tessellator = Tessellator.instance;
        
        IIcon c = block.getIcon(1, 0);
        float u = c.getMinU();
        float v = c.getMinV();
        float U = c.getMaxU();
        float V = c.getMaxV();
                
        renderer.renderStandardBlock(Blocks.stone, x, y, z);
        
        tessellator.setColorOpaque_F(ore.color[0]/255.0F, ore.color[1]/255.0F, ore.color[2]/255.0F);
        tessellator.addTranslation(x, y, z);
        tessellator.addVertexWithUV(0, 1.00005F, 1, u, v);
        tessellator.addVertexWithUV(1, 1.00005F, 1, u, V);
        tessellator.addVertexWithUV(1, 1.00005F, 0, U, V);
        tessellator.addVertexWithUV(0, 1.00005F, 0, U, v);
        
        tessellator.addVertexWithUV(1, -0.00005F, 0, u, v);
        tessellator.addVertexWithUV(1, -0.00005F, 1, u, V);
        tessellator.addVertexWithUV(0, -0.00005F, 1, U, V);
        tessellator.addVertexWithUV(0, -0.00005F, 0, U, v);
        
        tessellator.addVertexWithUV(0, 1, -0.00005F, u, v);
        tessellator.addVertexWithUV(1, 1, -0.00005F, u, V);
        tessellator.addVertexWithUV(1, 0, -0.00005F, U, V);
        tessellator.addVertexWithUV(0, 0, -0.00005F, U, v);
        
        tessellator.addVertexWithUV(-0.00005F, 0, 0, u, v);
        tessellator.addVertexWithUV(-0.00005F, 0, 1, u, V);
        tessellator.addVertexWithUV(-0.00005F, 1, 1, U, V);
        tessellator.addVertexWithUV(-0.00005F, 1, 0, U, v);
        
        tessellator.addVertexWithUV(0, 0, 1.00005F, u, v);
        tessellator.addVertexWithUV(1, 0, 1.00005F, u, V);
        tessellator.addVertexWithUV(1, 1, 1.00005F, U, V);
        tessellator.addVertexWithUV(0, 1, 1.00005F, U, v);
        
        tessellator.addVertexWithUV(1.00005F, 1, 0, u, v);
        tessellator.addVertexWithUV(1.00005F, 1, 1, u, V);
        tessellator.addVertexWithUV(1.00005F, 0, 1, U, V);
        tessellator.addVertexWithUV(1.00005F, 0, 0, U, v);
        tessellator.addTranslation(-x, -y, -z);
        
        return false;
    }
 
Назад
Сверху