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); }
public void Add(Particles particles, ParticleCallback particleCallback) { part.Add(particles); particles.callBack = particleCallback; }