- 279
- 0
Есть следующий код:
В нем я пробовал делать мерцающую прозрачность, что бы частица имела динамический градиент. Что я делаю не так?
В нем я пробовал делать мерцающую прозрачность, что бы частица имела динамический градиент. Что я делаю не так?
Код:
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;
}
}