ParticleEngine.java 文件源码

java
阅读 20 收藏 0 点赞 0 评论 0

项目:magistics 作者:
@SubscribeEvent
public static void onPostRender(RenderWorldLastEvent event) {
    Minecraft mc = Minecraft.getMinecraft();
    TextureManager renderer = mc.renderEngine;
    int dim = mc.world.provider.getDimension();
    EntityPlayerSP player = mc.player;
    float frame = event.getPartialTicks();

    renderer.bindTexture(SPRITE_SHEET_ALT);

    GL11.glPushMatrix();
    GL11.glColor4f(1F, 1F, 1F, 1F);
    GlStateManager.enableBlend();
    GL11.glEnable(GL11.GL_BLEND); // 3042 = 0xBE2 = GL_BLEND (redundant?)
    GL11.glAlphaFunc(GL11.GL_GREATER, 0.004F);
    GlStateManager.depthMask(false); // isTransparent (therefore calls unnecessary in particle classes)

    boolean rebound = false;

    for (int layer = 3; layer >= 0; --layer) {
        if (particles[layer].containsKey(dim)) {
            ArrayList<Particle> fx = (ArrayList) particles[layer].get(dim);

            if (!fx.isEmpty()) {
                if (!rebound && layer < 2) {
                    renderer.bindTexture(SPRITE_SHEET);
                    rebound = true;
                }

                GL11.glPushMatrix();

                switch (layer) {
                case 0: case 2:
                    GlStateManager.blendFunc(GL11.GL_SRC_ALPHA, GL11.GL_CURRENT_BIT);
                    break;
                case 1: case 3:
                    GlStateManager.blendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);
                    break;
                }

                float f1 = ActiveRenderInfo.getRotationX();
                float f2 = ActiveRenderInfo.getRotationZ();
                float f3 = ActiveRenderInfo.getRotationYZ();
                float f4 = ActiveRenderInfo.getRotationXY();
                float f5 = ActiveRenderInfo.getRotationXZ();

                Particle.interpPosX = player.lastTickPosX + (player.posX - player.lastTickPosX) * frame;
                Particle.interpPosY = player.lastTickPosY + (player.posY - player.lastTickPosY) * frame;
                Particle.interpPosZ = player.lastTickPosZ + (player.posZ - player.lastTickPosZ) * frame;

                Tessellator tessellator = Tessellator.getInstance();
                BufferBuilder worldRenderer = tessellator.getBuffer();

                worldRenderer.begin(GL11.GL_QUADS, DefaultVertexFormats.PARTICLE_POSITION_TEX_COLOR_LMAP);

                for (final Particle effect : fx) {
                    if (effect != null) {
                        try {
                            effect.renderParticle(worldRenderer, player, frame, f1, f5, f2, f3, f4);
                        } catch (Exception err) {
                            crashParticle(err, effect);
                        }
                    }
                }

                tessellator.draw();
                GL11.glPopMatrix();
            }
        }
    }

    GlStateManager.depthMask(true);
    GlStateManager.blendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);
    GlStateManager.disableBlend();
    GlStateManager.alphaFunc(GL11.GL_GREATER, 0.1F);
    GL11.glPopMatrix();
}
评论列表
文章目录


问题


面经


文章

微信
公众号

扫码关注公众号