void DrawPuffRing(bool inside, CommandBuffer buffer) { /* Skip rendering puff rings */ if (!inside) { Vector3 sz; if (Nebula.Zone.Shape is ZoneEllipsoid) { sz = ((ZoneEllipsoid)Nebula.Zone.Shape).Size / 2; //we want radius instead of diameter } else if (Nebula.Zone.Shape is ZoneSphere) { sz = new Vector3(((ZoneSphere)Nebula.Zone.Shape).Radius); } else { return; } var bitRadius = Nebula.ExteriorBitRadius * (1 + Nebula.ExteriorBitRandomVariation); var szR = Math.Max(sz.X, Math.Max(sz.Y, sz.Z)); var sph = new BoundingSphere(Nebula.Zone.Position, (szR + bitRadius) * 1.2f); if (camera.Frustum.Contains(sph) == ContainmentType.Disjoint) { return; } } /* Actually Render */ var sd = 1 - MathHelper.Clamp(Nebula.Zone.Shape.ScaledDistance(camera.Position), 0f, 1f); var factor = MathHelper.Clamp(sd / Nebula.Zone.EdgeFraction, 0, 1); int idx = GetPuffsIdx(); string lastTex = null; Texture2D tex = null; var sh = GetPuffShader(); _puffringsh.SetView(camera); _puffringsh.SetViewProjection(camera); for (int i = 0; i < Exterior.Count; i++) { var p = Exterior[i]; if (p.Texture == null) { lastTex = null; tex = resman.NullTexture; } else if (lastTex != p.Texture) { tex = (Texture2D)resman.FindTexture(p.Texture); lastTex = p.Texture; } buffer.AddCommand(sh, puffSetup, puffCleanup, buffer.WorldBuffer.Identity, new RenderUserData() { Texture = tex, Float = factor }, sysr.StaticBillboards.VertexBuffer, PrimitiveTypes.TriangleList, idx, 2, true, inside ? SortLayers.NEBULA_INSIDE : SortLayers.NEBULA_NORMAL, RenderHelpers.GetZ(camera.Position, p.Position)); idx += 6; } }
void DrawCommands(RenderContext rs, int start, int count) { shaderBasic.UseProgram(); rs.Cull = false; rs.BlendMode = rendat[datindex].BlendMode; if (_frameStart) { var v = camera.View; var vp = camera.ViewProjection; shaderBasic.SetView(ref v); shaderBasic.SetViewProjection(ref vp); _frameStart = false; } rendat[datindex].Texture.BindTo(0); vboBasic.Draw(PrimitiveTypes.TriangleList, 0, start, count / 3); rs.Cull = true; lastDatHash = -1; }
public override void Draw(ICamera camera, CommandBuffer commands, SystemLighting lights, NebulaRenderer nr) { if (sysr == null || vertices == null) { return; } float z = RenderHelpers.GetZ(Matrix4x4.Identity, camera.Position, pos); if (z > 900000) // Reduce artefacts from fast Z-sort calculation. This'll probably cause issues somewhere else { z = 900000; } var dist_scale = nr != null ? nr.Nebula.SunBurnthroughScale : 1; var alpha = nr != null ? nr.Nebula.SunBurnthroughIntensity : 1; if (radialShader == null) { radialShader = Shaders.SunRadial.Get(); radialTex0 = radialShader.Shader.GetLocation("tex0"); radialSize = radialShader.Shader.GetLocation("SizeMultiplier"); radialAlpha = radialShader.Shader.GetLocation("outerAlpha"); } if (spineShader == null) { spineShader = Shaders.SunSpine.Get(); spineTex0 = spineShader.Shader.GetLocation("tex0"); spineSize = spineShader.Shader.GetLocation("SizeMultiplier"); } radialShader.SetViewProjection(camera); radialShader.SetView(camera); spineShader.SetViewProjection(camera); spineShader.SetView(camera); int idx = sysr.StaticBillboards.DoVertices(ref ID, vertices); if (Sun.CenterSprite != null) { //draw center var cr = (Texture2D)sysr.ResourceManager.FindTexture(Sun.CenterSprite); commands.AddCommand(radialShader.Shader, RadialSetup, Cleanup, commands.WorldBuffer.Identity, new RenderUserData() { Float = 0, Color = new Color4(dist_scale, alpha, 0, 0), Texture = cr }, sysr.StaticBillboards.VertexBuffer, PrimitiveTypes.TriangleList, idx, 2, true, SortLayers.SUN, z); //next idx += 6; } //draw glow var gr = (Texture2D)sysr.ResourceManager.FindTexture(Sun.GlowSprite); commands.AddCommand(radialShader.Shader, RadialSetup, Cleanup, commands.WorldBuffer.Identity, new RenderUserData() { Float = 1, Color = new Color4(dist_scale, alpha, 0, 0), Texture = gr }, sysr.StaticBillboards.VertexBuffer, PrimitiveTypes.TriangleList, idx, 2, true, SortLayers.SUN, z + 108f); //next idx += 6; //draw spines if (Sun.SpinesSprite != null && nr == null) { var spinetex = (Texture2D)sysr.ResourceManager.FindTexture(Sun.SpinesSprite); commands.AddCommand(spineShader.Shader, SpineSetup, Cleanup, commands.WorldBuffer.Identity, new RenderUserData() { Texture = spinetex }, sysr.StaticBillboards.VertexBuffer, PrimitiveTypes.TriangleList, idx, 2 * Sun.Spines.Count, true, SortLayers.SUN, z + 1112f); } }