Already tesselating! при рендере своих частиц

Версия Minecraft
1.7.10
API
Forge
52
1
1
Решил создать свою частицу (с гл и tesselator работаю впервые). Для тестов я создал блок (тайл), который генерирует частицу. При установке блока майн выбрасывает исключение "Already tesselating!"

Java:
java.lang.IllegalStateException: Already tesselating!
    at net.minecraft.client.renderer.Tessellator.startDrawing(Tessellator.java:257)
    at net.minecraft.client.renderer.Tessellator.startDrawingQuads(Tessellator.java:247)
    at ensorcellcraft.client.fx.FxWisp.renderParticle(FxWisp.java:49)
    at net.minecraft.client.particle.EffectRenderer.renderParticles(EffectRenderer.java:162)
    at net.minecraft.client.renderer.EntityRenderer.renderWorld(EntityRenderer.java:1351)
    at net.minecraft.client.renderer.EntityRenderer.updateCameraAndRender(EntityRenderer.java:1087)
    at net.minecraft.client.Minecraft.runGameLoop(Minecraft.java:1067)
    at net.minecraft.client.Minecraft.run(Minecraft.java:962)
    at net.minecraft.client.main.Main.main(Main.java:164)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at net.minecraft.launchwrapper.Launch.launch(Launch.java:135)
    at net.minecraft.launchwrapper.Launch.main(Launch.java:28)
    at net.minecraftforge.gradle.GradleStartCommon.launch(Unknown Source)
    at GradleStart.main(Unknown Source)

Вот рендер частицы:
Java:
@Override
    public void renderParticle(Tessellator t, float partialTicks, float par3, float par4, float par5, float par6, float par7) {
        
        Minecraft.getMinecraft().renderEngine.bindTexture(rl);
                
        GL11.glEnable(GL11.GL_BLEND);
        GL11.glDisable(GL11.GL_DEPTH_TEST);
        GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); 
        
        
        float scale = moteParticleScale * (1 - particleAge/particleMaxAge);
        float x = (float)(prevPosX + (posX - prevPosX) * partialTicks - interpPosX);
        float y = (float)(prevPosY + (posY - prevPosY) * partialTicks - interpPosY);
        float z = (float)(prevPosZ + (posZ - prevPosZ) * partialTicks - interpPosZ);
        
        t.startDrawingQuads();
        
        t.setBrightness(240);
        t.setColorRGBA_I(color, 128);
        t.addVertexWithUV(x - par3 * scale - par6 * scale, y - par4 * scale, z - par5 * scale - par7 * scale, 0.0, 0.0);
        t.addVertexWithUV(x - par3 * scale + par6 * scale, y + par4 * scale, z - par5 * scale + par7 * scale, 1.0, 0.0);
        t.addVertexWithUV(x + par3 * scale + par6 * scale, y + par4 * scale, z + par5 * scale + par7 * scale,1.0, 1.0);
        t.addVertexWithUV(x + par3 * scale - par6 * scale, y - par4 * scale, z + par5 * scale - par7 * scale, 0.0, 1.0);
        t.draw();
        
        GL11.glDisable(GL11.GL_BLEND);
        GL11.glEnable(GL11.GL_DEPTH_TEST);
    }

Вот вызов метод, который создает частицы:
Java:
public void updateEntity() {
        EnsorcellCraft.proxy.wispFX(this.worldObj, (double)this.xCoord, (double)this.yCoord + 1, (double)this.zCoord,
                0.5d, 0d, 0d, 3, 100, 5910527);
    }

Сам метод:
Java:
public void wispFX(World world, double x, double y, double z, double motionX, double motionY, double motionZ,
            float size, int maxAge, int color) {

        FxWisp wisp = new FxWisp(world, x, y, z, size, motionX, motionY, size, maxAge, color);

        Minecraft.getMinecraft().effectRenderer.addEffect(wisp);
    }
 
345
14
113
В буфере тесселятора где-то вызывается begin без draw. ("Уже тесселируется.")
Иногда такое может оптифайн провоцировать, особенно - его мультикор-режим рендера.
Точное лечение неизвестно, попробуй перед рендером tessellator.draw(), после него - tessellator.startDrawingQuads().
Как костыль - можно отрисовать полигон 3D-модели с помощью IModelCustom, здесь есть своя специфика, но вызовы майновского тесслятора будут проведены корректно.
 

tox1cozZ

aka Agravaine
8,456
598
2,893
У майна все частицы рисуются одним драв коллом тесселятора.
То есть в методе renderParticle уже запущено рисование и его прерывать не стоит.
Лучше сделать "свою" систему частиц, скопировав майновскую и рисовать частицы со своего атласа.
Использовать целый драв колл на отрисовку одной частицы слишком накладно, всего тысяча частиц будет жутко садить фпс.
 
52
1
1
Хм... Возьмем для примера ботанию, как я понимаю, это то, что надо:
Java:
public final class ParticleRenderDispatcher {

    public static int wispFxCount = 0;
    public static int depthIgnoringWispFxCount = 0;
    public static int sparkleFxCount = 0;
    public static int fakeSparkleFxCount = 0;
    public static int lightningCount = 0;

    // Called from LightningHandler.onRenderWorldLast since that was
    // already registered. /shrug
    public static void dispatch() {
        Tessellator tessellator = Tessellator.instance;

        Profiler profiler = Minecraft.getMinecraft().mcProfiler;

        GL11.glPushAttrib(GL11.GL_LIGHTING);
        GL11.glDepthMask(false);
        GL11.glEnable(GL11.GL_BLEND);
        GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE);
        GL11.glAlphaFunc(GL11.GL_GREATER, 0.003921569F);
        GL11.glDisable(GL11.GL_LIGHTING);

        profiler.startSection("sparkle");
        FXSparkle.dispatchQueuedRenders(tessellator);
        profiler.endStartSection("wisp");
        FXWisp.dispatchQueuedRenders(tessellator);
        profiler.endSection();

        GL11.glAlphaFunc(GL11.GL_GREATER, 0.1F);
        GL11.glDisable(GL11.GL_BLEND);
        GL11.glDepthMask(true);
        GL11.glPopAttrib();
    }

}

В таком случае можно, пожалуйста, класс майна, который отвечает за это? :3
(Мне пока не хватает опыта, чтобы разобраться написанное выше)
 
Сверху