Работа с частицами, графическая часть

Есть следующий код:
В нем я пробовал делать мерцающую прозрачность, что бы частица имела динамический градиент. Что я делаю не так?
Код:
package ru.steevenrichard.lastdays.common.blocks;

import org.lwjgl.opengl.GL11;

import net.minecraft.client.Minecraft;
import net.minecraft.client.particle.EntityFX;
import net.minecraft.client.renderer.Tessellator;
import net.minecraft.util.ResourceLocation;
import net.minecraft.world.World;

public class BlockParticleTest extends EntityFX{
    
    private static ResourceLocation particle = new ResourceLocation("lastdays:particles/power.png");
    private static float alpha;
       private static boolean faze;

    public BlockParticleTest(World wrd, double x, double y, double z){
        super(wrd, x, y, z);
    }
        //Этот метод скопипастен полностью, кроме того, что помечено.
    @Override
    public void renderParticle(Tessellator tess, float partialTicks, float par3, float par4, float par5, float par6, float par7){
        Minecraft.getMinecraft().renderEngine.bindTexture(getIconLoc());
        /*GL11.glDepthMask(false);
        GL11.glEnable(GL11.GL_BLEND);
        GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);
        GL11.glAlphaFunc(GL11.GL_GREATER, 0.003921569F);
        tess.startDrawingQuads();
        tess.setBrightness(getBrightnessForRender(partialTicks));
        float scale = 0.1F * particleScale;
        float x = (float)(prevPosX + (posX - prevPosX) * partialTicks - interpPosX);
        float y = (float)(prevPosY + (posY - prevPosY) * partialTicks - interpPosY);
        float z = (float)(prevPosZ + (posZ - prevPosZ) * partialTicks - interpPosZ);
        GL11.glRotatef((float) Math.random(), scale, scale, scale);
        tess.addVertexWithUV(x - par3 * scale - par6 * scale, y - par4 * scale, z - par5 * scale - par7 * scale, 0.0, 0.0);
        tess.addVertexWithUV(x - par3 * scale + par6 * scale, y + par4 * scale, z - par5 * scale + par7 * scale, 1.0, 0.0);
        tess.addVertexWithUV(x + par3 * scale + par6 * scale, y + par4 * scale, z + par5 * scale + par7 * scale, 1.0, 1.0);
        tess.addVertexWithUV(x + par3 * scale - par6 * scale, y - par4 * scale, z + par5 * scale - par7 * scale, 0.0, 1.0);
        tess.draw();
        GL11.glDisable(GL11.GL_BLEND);
        GL11.glDepthMask(true);
        GL11.glAlphaFunc(GL11.GL_GREATER, 0.1F);*/
        
        GL11.glDepthMask(false);
        GL11.glDisable(GL11.GL_ALPHA_TEST);
        GL11.glEnable(GL11.GL_BLEND);
        GL11.glBlendFunc(GL11.GL_ONE, GL11.GL_ONE);

//НАЧАЛО ПУЛЬСА

        if(faze) {
            if(alpha < 1.0F) {
               alpha += 0.025F;
            } else {
               faze = false;
               alpha = 1.0F;
            }
         } else if(alpha > 0.0F) {
            alpha -= 0.05F;
         } else {
            faze = true;
            alpha = 0.0F;
         }
         GL11.glColor4f(1.0F, 1.0F, 1.0F, alpha);

//КОНЕЦ ПУЛЬСА
        
        tess.startDrawingQuads();
        tess.setBrightness(700);
        float scale = 0.1F*particleScale;
        float x = (float)(prevPosX + (posX - prevPosX) * partialTicks - interpPosX);
        float y = (float)(prevPosY + (posY - prevPosY) * partialTicks - interpPosY);
        float z = (float)(prevPosZ + (posZ - prevPosZ) * partialTicks - interpPosZ);
        tess.addVertexWithUV(x - par3 * scale - par6 * scale, y - par4 * scale, z - par5 * scale - par7 * scale, 0, 0);
        tess.addVertexWithUV(x - par3 * scale + par6 * scale, y + par4 * scale, z - par5 * scale + par7 * scale, 1, 0);
        tess.addVertexWithUV(x + par3 * scale + par6 * scale, y + par4 * scale, z + par5 * scale + par7 * scale, 1, 1);
        tess.addVertexWithUV(x + par3 * scale - par6 * scale, y - par4 * scale, z + par5 * scale - par7 * scale, 0, 1);
        tess.draw();
        GL11.glDisable(GL11.GL_BLEND);
        GL11.glEnable(GL11.GL_ALPHA_TEST);
        GL11.glDepthMask(true);
 
    }

    protected ResourceLocation getIconLoc() {
        return particle;
    }
    
    @Override
    public int getFXLayer(){
        return 3;//Корень зла, если это - 3, то при рендере он без твоего согласия не вызывает заранее tess.startDrawingQuads(); и tess.draw(); , что позволяет иметь свою текстуру.
    }
        //Те три метода, что ниже, для удобства
    public BlockParticleTest setMaxAge(int maxAge){
        particleMaxAge = 20000;
        return this;
    }

    public int setGravity(double gravity){
        particleGravity = 1;
        //return this;
        return 5;
    }
}
 
В каком месте? Там просто закоментированый кусок кода.
 

necauqua

когда-то был anti344
Администратор
1,216
27
172
Да не в рисовании переменную менять надо, а в апдейте!
Рисование-то от фпс зависит, а апдейты постоянные - 20 раз в секунду, алло.
 
onUpdate в партикле или в блоке? :D
[merge_posts_bbcode]Добавлено: 20.05.2015 12:02:52[/merge_posts_bbcode]

Положил код мерцамия в онапдейт и получилось не пойми что. Сфера с частицами начала телепортироваться в разные случайные места и мерцать на доли секунды.

[merge_posts_bbcode]Добавлено: 20.05.2015 12:04:46[/merge_posts_bbcode]

После разрушения блока-спавнера частиц, они продолжают спавнится.
 

necauqua

когда-то был anti344
Администратор
1,216
27
172
В партикле, лул
 
В партикле и сделал. Вот код.
Бредовое метание частиц пофиксилось добавлением стандартного кода из онАпдейт из particleFx
Код:
package ru.steevenrichard.lastdays.common.blocks;

import org.lwjgl.opengl.GL11;

import net.minecraft.client.Minecraft;
import net.minecraft.client.particle.EntityFX;
import net.minecraft.client.renderer.Tessellator;
import net.minecraft.util.ResourceLocation;
import net.minecraft.world.World;

public class BlockParticleTest extends EntityFX{
    
    private static ResourceLocation particle = new ResourceLocation("lastdays:particles/power.png");
    private static float alpha;
       private static boolean faze;

    public BlockParticleTest(World wrd, double x, double y, double z){
        super(wrd, x, y, z);
    }
        //Этот метод скопипастен полностью, кроме того, что помечено.
    @Override
    public void renderParticle(Tessellator tess, float partialTicks, float par3, float par4, float par5, float par6, float par7){
        Minecraft.getMinecraft().renderEngine.bindTexture(getIconLoc());
        /*GL11.glDepthMask(false);
        GL11.glEnable(GL11.GL_BLEND);
        GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);
        GL11.glAlphaFunc(GL11.GL_GREATER, 0.003921569F);
        tess.startDrawingQuads();
        tess.setBrightness(getBrightnessForRender(partialTicks));
        float scale = 0.1F * particleScale;
        float x = (float)(prevPosX + (posX - prevPosX) * partialTicks - interpPosX);
        float y = (float)(prevPosY + (posY - prevPosY) * partialTicks - interpPosY);
        float z = (float)(prevPosZ + (posZ - prevPosZ) * partialTicks - interpPosZ);
        GL11.glRotatef((float) Math.random(), scale, scale, scale);
        tess.addVertexWithUV(x - par3 * scale - par6 * scale, y - par4 * scale, z - par5 * scale - par7 * scale, 0.0, 0.0);
        tess.addVertexWithUV(x - par3 * scale + par6 * scale, y + par4 * scale, z - par5 * scale + par7 * scale, 1.0, 0.0);
        tess.addVertexWithUV(x + par3 * scale + par6 * scale, y + par4 * scale, z + par5 * scale + par7 * scale, 1.0, 1.0);
        tess.addVertexWithUV(x + par3 * scale - par6 * scale, y - par4 * scale, z + par5 * scale - par7 * scale, 0.0, 1.0);
        tess.draw();
        GL11.glDisable(GL11.GL_BLEND);
        GL11.glDepthMask(true);
        GL11.glAlphaFunc(GL11.GL_GREATER, 0.1F);*/
        
        GL11.glDepthMask(false);
        GL11.glDisable(GL11.GL_ALPHA_TEST);
        GL11.glEnable(GL11.GL_BLEND);
        GL11.glBlendFunc(GL11.GL_ONE, GL11.GL_ONE);
        tess.startDrawingQuads();
        tess.setBrightness(700);
        float scale = 0.1F*particleScale;
        float x = (float)(prevPosX + (posX - prevPosX) * partialTicks - interpPosX);
        float y = (float)(prevPosY + (posY - prevPosY) * partialTicks - interpPosY);
        float z = (float)(prevPosZ + (posZ - prevPosZ) * partialTicks - interpPosZ);
        tess.addVertexWithUV(x - par3 * scale - par6 * scale, y - par4 * scale, z - par5 * scale - par7 * scale, 0, 0);
        tess.addVertexWithUV(x - par3 * scale + par6 * scale, y + par4 * scale, z - par5 * scale + par7 * scale, 1, 0);
        tess.addVertexWithUV(x + par3 * scale + par6 * scale, y + par4 * scale, z + par5 * scale + par7 * scale, 1, 1);
        tess.addVertexWithUV(x + par3 * scale - par6 * scale, y - par4 * scale, z + par5 * scale - par7 * scale, 0, 1);
        tess.draw();
        GL11.glDisable(GL11.GL_BLEND);
        GL11.glEnable(GL11.GL_ALPHA_TEST);
        GL11.glDepthMask(true);
 
    }
    
    public void onUpdate()
    {
         this.prevPosX = this.posX;
         this.prevPosY = this.posY;
         this.prevPosZ = this.posZ;

         if (this.particleAge++ >= this.particleMaxAge)
         {
             this.setDead();
         }

         this.motionY -= 0.04D * (double)this.particleGravity;
         this.moveEntity(this.motionX, this.motionY, this.motionZ);
         this.motionX *= 0.9800000190734863D;
         this.motionY *= 0.9800000190734863D;
         this.motionZ *= 0.9800000190734863D;

         if (this.onGround)
         {
             this.motionX *= 0.699999988079071D;
             this.motionZ *= 0.699999988079071D;
         }
        
        if(faze) {
            if(alpha < 1.0F) {
               alpha += 0.025F;
            } else {
               faze = false;
               alpha = 1.0F;
            }
         } else if(alpha > 0.0F) {
            alpha -= 0.05F;
         } else {
            faze = true;
            alpha = 0.0F;
         }
         GL11.glColor4f(1.0F, 1.0F, 1.0F, alpha);
    }

    protected ResourceLocation getIconLoc() {
        return particle;
    }
    
    @Override
    public int getFXLayer(){
        return 3;//Корень зла, если это - 3, то при рендере он без твоего согласия не вызывает заранее tess.startDrawingQuads(); и tess.draw(); , что позволяет иметь свою текстуру.
    }
        //Те три метода, что ниже, для удобства
    public BlockParticleTest setMaxAge(int maxAge){
        particleMaxAge = 20000;
        return this;
    }

    public int setGravity(double gravity){
        particleGravity = 1;
        //return this;
        return 5;
    }
}
 
Нормально обьяснить в чем проблема и как ее решить не бывает?
 
Отвечу: действительно чушь, которая не работает. Я вообще хз как обращаться с частицами.
 
Сверху