Аномальная работа BufferBuilder

Статус
В этой теме нельзя размещать новые ответы.
56
2
4
Написал следующий ниже код, хотел протестировать возможность добавления геометрических фигур в майнкрафт (начал с квадрата). Все делал по образцу класса ModelBox. В итоге получил (при прогрузке этой модели) мигающий белый экран/местами на всем экране окна текстуры. Он, почему-то постоянно перерисовывает модель
Java:
Minecraft.getMinecraft().getRenderManager().getSkinMap().get("default").getMainModel().bipedHead.cubeList.clear();
Minecraft.getMinecraft().getRenderManager().getSkinMap().get("default").getMainModel().bipedHead.addChild(new NewPlayerHead().head);
Java:
<...>
public newModelRenderer head=new newModelRenderer(this);
@Override
    public void render(Entity entityIn, float limbSwing, float limbSwingAmount, float ageInTicks, float netHeadYaw, float headPitch, float scale)
    {
        head
                .addKvadrat(0,0,  0,0,0,  10,0,0,  10,0,10,   0,0,10)
                .render(scale);
    }
<...>
Java:
<...>
public ModelKvadrat(ModelRenderer renderer, int texX, int texY, float x, float y, float z, float dx, float dy, float dz,float cx, float cy, float cz,float fx, float fy, float fz)
    {
        this.posX1 = x; //public final float
        this.posY1 = y;
        this.posZ1 = z;
        this.posX2 = dx;
        this.posY2 = dy;
        this.posZ2 = dz;
        this.posX3 = cx;
        this.posY3 = cy;
        this.posZ3 = cz;
        this.posX4 = fx;
        this.posY4 = fy;
        this.posZ4 = fz;
        this.textureX=texX;
        this.textureY=texY;
    }
<...>
Java:
<...>
public newModelRenderer addKvadrat(int textureOffsetX, int textureOffsetY,float offX1, float offY1, float offZ1, float offX2, float offY2, float offZ2,float offX3, float offY3, float offZ3, float offX4, float offY4, float offZ4)
    {
        this.kvadrList.add(new ModelKvadrat(this, textureOffsetX, textureOffsetY, offX1, offY1, offZ1,offX2, offY2, offZ2, offX3, offY3, offZ3, offX4, offY4, offZ4));
        return this;
    }
    public void render(float scale){
        this.compileDisplayList(scale);
    }
    private void compileDisplayList(float scale)
    {
        this.displayList = GLAllocation.generateDisplayLists(1);
        GlStateManager.glNewList(this.displayList, 4864);
        BufferBuilder bufferbuilder = Tessellator.getInstance().getBuffer();

        for (int i = 0; i < this.trigonList.size(); ++i)
        {
            ((ModelTKvadrat)this.kvadrList.get(i)).render(bufferbuilder, scale);
        }
        for (int i = 0; i < this.kvadrList.size(); ++i)
        {
            ((ModelKvadrat)this.kvadrList.get(i)).render(bufferbuilder, scale);
        }

        GlStateManager.glEndList();
        this.compiled = true;
    }
<...>
Java:
<...>
@SideOnly(Side.CLIENT)
    public void render(BufferBuilder renderer, float scale)
    {
        //BufferBuilder renderer = Tessellator.getInstance().getBuffer();
        renderer.begin(7, DefaultVertexFormats.OLDMODEL_POSITION_TEX_NORMAL);//GL11.GL_LINE_STRIP, DefaultVertexFormats.POSITION
        renderer.pos(this.posX1,this.posY1,this.posZ1).tex(this.textureX+this.posX1,this.textureY+this.posY1).endVertex();
        renderer.pos(this.posX2,this.posY2,this.posZ2).tex(this.textureX+this.posX2,this.textureY+this.posY2).endVertex();
        renderer.pos(this.posX3,this.posY3,this.posZ3).tex(this.textureX+this.posX3,this.textureY+this.posY3).endVertex();
        renderer.pos(this.posX4,this.posY4,this.posZ4).tex(this.textureX+this.posX4,this.textureY+this.posY4).endVertex();
        Tessellator.getInstance().draw();
    }
<...>
Java:
<...>
    at com.falsher.learn.renderer.newModelRenderer.compileDisplayList(newModelRenderer.java:44) ~[newModelRenderer.class:?]
    at com.falsher.learn.renderer.newModelRenderer.render(newModelRenderer.java:36) ~[newModelRenderer.class:?]
    at net.minecraft.client.model.ModelRenderer.render(ModelRenderer.java:146) ~[ModelRenderer.class:?]
    at net.minecraft.client.model.ModelBiped.render(ModelBiped.java:105) ~[ModelBiped.class:?]
    at net.minecraft.client.model.ModelPlayer.render(ModelPlayer.java:78) ~[ModelPlayer.class:?]
    at net.minecraft.client.renderer.entity.RenderLivingBase.renderModel(RenderLivingBase.java:261) ~[RenderLivingBase.class:?]
    at net.minecraft.client.renderer.entity.RenderLivingBase.doRender(RenderLivingBase.java:183) [RenderLivingBase.class:?]
    at net.minecraft.client.renderer.entity.RenderPlayer.doRender(RenderPlayer.java:75) [RenderPlayer.class:?]
    at net.minecraft.client.renderer.entity.RenderPlayer.doRender(RenderPlayer.java:28) [RenderPlayer.class:?]
    at net.minecraft.client.renderer.entity.RenderManager.doRenderEntity(RenderManager.java:390) [RenderManager.class:?]
    at net.minecraft.client.gui.inventory.GuiInventory.drawEntityOnScreen(GuiInventory.java:153) [GuiInventory.class:?]
    at net.minecraft.client.gui.inventory.GuiContainerCreative.drawGuiContainerBackgroundLayer(GuiContainerCreative.java:848) [GuiContainerCreative.class:?]
    at net.minecraft.client.gui.inventory.GuiContainer.drawScreen(GuiContainer.java:93) [GuiContainer.class:?]
    at net.minecraft.client.renderer.InventoryEffectRenderer.drawScreen(InventoryEffectRenderer.java:59) [InventoryEffectRenderer.class:?]
    at net.minecraft.client.gui.inventory.GuiContainerCreative.drawScreen(GuiContainerCreative.java:687) [GuiContainerCreative.class:?]
    at net.minecraftforge.client.ForgeHooksClient.drawScreen(ForgeHooksClient.java:349) [ForgeHooksClient.class:?]
    at net.minecraft.client.renderer.EntityRenderer.updateCameraAndRender(EntityRenderer.java:1168) [EntityRenderer.class:?]
    at net.minecraft.client.Minecraft.runGameLoop(Minecraft.java:1192) [Minecraft.class:?]
    at net.minecraft.client.Minecraft.run(Minecraft.java:436) [Minecraft.class:?]
    at net.minecraft.client.main.Main.main(Main.java:118) [Main.class:?]
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:1.8.0_221]
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[?:1.8.0_221]
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:1.8.0_221]
    at java.lang.reflect.Method.invoke(Method.java:498) ~[?:1.8.0_221]
    at net.minecraft.launchwrapper.Launch.launch(Launch.java:135) [launchwrapper-1.12.jar:?]
    at net.minecraft.launchwrapper.Launch.main(Launch.java:28) [launchwrapper-1.12.jar:?]
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:1.8.0_221]
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[?:1.8.0_221]
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:1.8.0_221]
    at java.lang.reflect.Method.invoke(Method.java:498) ~[?:1.8.0_221]
    at net.minecraftforge.gradle.GradleStartCommon.launch(GradleStartCommon.java:97) [start/:?]
    at GradleStart.main(GradleStart.java:25) [start/:?]
[16:09:59] [main/ERROR]: ########## GL ERROR ##########
[16:09:59] [main/ERROR]: @ Post render
[16:09:59] [main/ERROR]: 1282: Invalid operation
[16:09:59] [main/ERROR]: Couldn't render entity
<...>
 
Последнее редактирование:
7,099
324
1,510
/time set day /gamerule doDayCycle false - чтобы темнота не мешала
 
1,038
57
229
а где ?
glPushMatrix()
//рисование
glPopMatrix()
 
56
2
4
а где ?
glPushMatrix()
//рисование
glPopMatrix()
Это "завтра" наступило сегодня. Не могу спать, когда за код волнуюсь. Ошибку признаю, но пока не помогает, нужно что-то ещё сделать. Не умею я с чужим кодом работать
 
56
2
4
Я один не пойму что он за дичь делает? Квадраты изи рисуются тесселатором в 24 строчки, а он нагородил туда дисплейлисты еще и прочее
Я делал по аналогии с ModelBox. Я, конечно, не попращайка, но вот от примера кода бы не отказался. Надеюсь, так можно не только квадраты рисовать
 
1,038
57
229
Java:
public void darwFaceFront(double minX, double minY, double maxX, double maxY, double minZ ) {
        GL11.glBegin(GL11.GL_QUADS);
        GL11.glVertex3d(maxX, minY, minZ);
        GL11.glVertex3d(maxX, maxY, minZ);
        GL11.glVertex3d(minX, maxY, minZ);
        GL11.glVertex3d(minX, minY, minZ);
        GL11.glEnd();
    }

    public void darwFaceBack(double minX, double minY, double maxX, double maxY, double maxZ ) {
        GL11.glBegin(GL11.GL_QUADS);
        GL11.glVertex3d(maxX, minY, maxZ);
        GL11.glVertex3d(maxX, maxY, maxZ);
        GL11.glVertex3d(minX, maxY, maxZ);
        GL11.glVertex3d(minX, minY, maxZ);
        GL11.glEnd();
    }

    public void darwFaceLeft(double minZ, double minY, double maxZ, double maxY, double minX ) {
        GL11.glBegin(GL11.GL_QUADS);
        GL11.glVertex3d(minX, minY, maxZ);
        GL11.glVertex3d(minX, maxY, maxZ);
        GL11.glVertex3d(minX, maxY, minZ);
        GL11.glVertex3d(minX, minY, minZ);
        GL11.glEnd();
    }

    public void darwFaceRight(double minZ, double minY, double maxZ, double maxY, double maxX ) {
        GL11.glBegin(GL11.GL_QUADS);
        GL11.glVertex3d(maxX, minY, maxZ);
        GL11.glVertex3d(maxX, maxY, maxZ);
        GL11.glVertex3d(maxX, maxY, minZ);
        GL11.glVertex3d(maxX, minY, minZ);
        GL11.glEnd();
    }

    public void drawBox(double minX, double minY, double minZ, double maxX, double maxY, double maxZ) {
        //front
        darwFaceFront( minX, minY, maxX, maxY, minZ );
        //left
        darwFaceLeft( minZ, minY, maxZ, maxY, minX );
        //right
        darwFaceRight( minZ, minY, maxZ, maxY, maxX );
        //back
        darwFaceBack( minX, minY, maxX, maxY, maxZ );
    }

...
GL11.glPushMatrix();
GL11.glTranslatef(...);
drawBox(0,0,0, 1,1,1);
GL11.glPopMatrix();
 
56
2
4
В glBegin передай нужный тип и рисуй что хочешь 🌚
Как мне кажется, ответ с ссылкой на статью - и есть, то что нужно мне. Исследовать, начиная с использованных утилит - лучших спосоп изучения API
 
56
2
4
Может хотя бы немного теории почитать? Ты лезешь "по перед батька в пекло"
Просто не хочу я на майнкрафте долго застревать. Планирую опыту в программировании набраться, да модельки качественные делать. А уж со своим кодом работаю прекрасно, прочих проблем не будет. Может, если будет вдохновение, напишу на движке майнкрафта проектик, который в будущем будет источником капитала для написания уже своего приложения
 
Последнее редактирование:
1,038
57
229
рендер выполняется в рендере
 
Статус
В этой теме нельзя размещать новые ответы.
Сверху