예제 #1
0
        public void Render()
        {
            Camera cam = Camera.cam;

            List <SortedList_Particles> slist = new List <SortedList_Particles>();

            GL.Enable(EnableCap.Texture2D);

            GL.Enable(EnableCap.AlphaTest);
            GL.AlphaFunc(AlphaFunction.Greater, AlphaMin);

            GL.Enable(EnableCap.Blend);
            GL.BlendFunc(BlendingFactorSrc.SrcAlpha, BlendingFactorDest.OneMinusDstAlpha);

            // järjestetään taulukko kauimmaisesta lähimpään. pitää rendata siinä järjestyksessä.
            // vain läpikuultavat pitää järjestää. läpikuultamattomat renderoidaan samantien.
            for (int q = 0; q < part.Count; q++)
            {
                GL.PushMatrix();
                Particles curpar = part[q];
                GL.Translate(curpar.Position);

                for (int w = 0; w < curpar.NumOfParticles; w++)
                {
                    Particle p = curpar.GetParticle(w);

                    if (p.isTranslucent == true) // listaan renderoitavaks myöhemmin
                    {
                        Vector3 rp  = p.pos + curpar.Position;
                        float   len = (cam.Position - rp).LengthSquared;
                        slist.Add(new SortedList_Particles(len, p));
                    }
                    else // rendataan se nyt, ei lisätä sortattavaks
                    {
                        Billboard.BillboardBegin(p.obj.Texture2D, p.pos.X, p.pos.Y, p.pos.Z, p.size);
                        GL.Color4(p.color);
                        if (p.callBack != null)
                        {
                            p.callBack(p);
                        }
                        Billboard.BillboardRender(p.obj);
                        Billboard.BillboardEnd();
                    }
                }
                GL.PopMatrix();
            }
            GL.Disable(EnableCap.AlphaTest);

            slist.Sort(delegate(SortedList_Particles z1, SortedList_Particles z2) { return(z2.Len.CompareTo(z1.Len)); });

            GL.Enable(EnableCap.Blend);
            GL.BlendFunc(BlendingFactorSrc.SrcAlpha, BlendingFactorDest.One);

            // rendataan läpikuultavat
            GL.DepthMask(false); // ei kirjoiteta zbufferiin
            for (int q = 0; q < slist.Count; q++)
            {
                Particle p = slist[q].Part;
                GL.Color4(p.color);
                Billboard.BillboardBegin(p.obj.Texture2D, p.pos.X, p.pos.Y, p.pos.Z, p.size);
                if (p.callBack != null)
                {
                    p.callBack(p);
                }
                Billboard.BillboardRender(p.obj);
                Billboard.BillboardEnd();
            }
            GL.DepthMask(true);

            GL.Disable(EnableCap.Blend);
            GL.Color4(1, 1, 1, 1f);
        }
예제 #2
0
 public void Add(Particles particles, ParticleCallback particleCallback)
 {
     part.Add(particles);
     particles.callBack = particleCallback;
 }
예제 #3
0
 public void Add(Particles particles, ParticleCallback particleCallback)
 {
     part.Add(particles);
     particles.callBack = particleCallback;
 }