public void Draw(ResourceManager res, SystemLighting lighting, CommandBuffer buffer, NebulaRenderer nr) { //Null check if (_camera == null) { return; } //Asteroids! if (Vector3.DistanceSquared(cameraPos, field.Zone.Position) <= renderDistSq) { float fadeNear = field.FillDist - 100f; float fadeFar = field.FillDist; if (field.Cube.Count > 0) { if (cubeCount == -1) { return; } asteroidsTask.Wait(); for (int i = 0; i < cubeDrawCalls.Count; i++) { cubeDrawCalls[i].Material.Update(_camera); } var lt = RenderHelpers.ApplyLights(lighting, 0, cameraPos, field.FillDist, nr); if (lt.FogMode == FogModes.Linear) { lastFog = lt.FogRange.Y; } else { lastFog = float.MaxValue; } int fadeCount = 0; int regCount = 0; for (int j = 0; j < cubeCount; j++) { var center = cubes[j].pos; var z = RenderHelpers.GetZ(cameraPos, center); for (int i = 0; i < cubeDrawCalls.Count; i++) { var dc = cubeDrawCalls[i]; if ((Vector3.Distance(center, cameraPos) + cubeRadius) < fadeNear) { buffer.AddCommand( dc.Material.Render, null, buffer.WorldBuffer.SubmitMatrix(ref cubes[j].tr), lt, cube_vbo, PrimitiveTypes.TriangleList, 0, dc.StartIndex, dc.Count / 3, SortLayers.OBJECT ); regCount++; } else { buffer.AddCommandFade( dc.Material.Render, buffer.WorldBuffer.SubmitMatrix(ref cubes[j].tr), lt, cube_vbo, PrimitiveTypes.TriangleList, dc.StartIndex, dc.Count / 3, SortLayers.OBJECT, new Vector2(fadeNear, fadeFar), z ); fadeCount++; } } } } if (field.BillboardCount != -1) { var cameraLights = RenderHelpers.ApplyLights(lighting, 0, cameraPos, 1, nr); if (billboardTex == null || billboardTex.IsDisposed) { billboardTex = (Texture2D)res.FindTexture(field.BillboardShape.Texture); } billboardTask.Wait(); for (int i = 0; i < billboardCount; i++) { var alpha = BillboardAlpha(Vector3.Distance(calculatedBillboards[i].Position, cameraPos)); if (alpha <= 0) { continue; } var coords = billboardCoords [calculatedBillboards [i].Texture]; sys.Billboards.DrawTri( billboardTex, calculatedBillboards [i].Position, calculatedBillboards[i].Size, new Color4(field.BillboardTint * cameraLights.Ambient, alpha), coords[0], coords[2], coords[1], 0, SortLayers.OBJECT ); } } } //Band is last if (renderBand) { if (!_camera.Frustum.Intersects(new BoundingSphere(field.Zone.Position, lightingRadius))) { return; } var tex = (Texture2D)res.FindTexture(field.Band.Shape); var bandHandle = buffer.WorldBuffer.SubmitMatrix(ref bandTransform); for (int i = 0; i < SIDES; i++) { var p = bandCylinder.GetSidePosition(i); var zcoord = RenderHelpers.GetZ(bandTransform, cameraPos, p); p = Vector3.Transform(p, bandTransform); var lt = RenderHelpers.ApplyLights(lighting, 0, p, lightingRadius, nr); if (lt.FogMode != FogModes.Linear || Vector3.DistanceSquared(cameraPos, p) <= (lightingRadius + lt.FogRange.Y) * (lightingRadius + lt.FogRange.Y)) { buffer.AddCommand( bandShader.Shader, bandShaderDelegate, bandShaderCleanup, bandHandle, lt, new RenderUserData() { Float = field.Band.TextureAspect, Color = field.Band.ColorShift, Camera = _camera, Texture = tex, }, bandCylinder.VertexBuffer, PrimitiveTypes.TriangleList, 0, i * 6, 2, true, SortLayers.OBJECT, zcoord ); } } } }
public abstract void Draw(ICamera camera, CommandBuffer commands, SystemLighting lights, NebulaRenderer nr);
void RenderFill(CommandBuffer buffer, bool inside) { if (Nebula.ExteriorFill == null) { return; } Vector3 sz = Vector3.Zero; //Only render ellipsoid and sphere exteriors 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 p = Nebula.Zone.Position; var sph = new BoundingSphere(p, Math.Max(sz.X, Math.Max(sz.Y, sz.Z)) * 1.2f); if (camera.Frustum.Contains(sph) == ContainmentType.Disjoint) { return; } var tex = (Texture2D)resman.FindTexture(Nebula.ExteriorFill); //X axis { var tl = new VertexPositionTexture( new Vector3(-1, -1, 0), new Vector2(0, 1) ); var tr = new VertexPositionTexture( new Vector3(+1, -1, 0), new Vector2(1, 1) ); var bl = new VertexPositionTexture( new Vector3(-1, +1, 0), new Vector2(0, 0) ); var br = new VertexPositionTexture( new Vector3(+1, +1, 0), new Vector2(1, 0) ); nverts.SubmitQuad( tl, tr, bl, br ); } //Z Axis { var tl = new VertexPositionTexture( new Vector3(0, -1, -1), new Vector2(0, 1) ); var tr = new VertexPositionTexture( new Vector3(0, -1, +1), new Vector2(1, 1) ); var bl = new VertexPositionTexture( new Vector3(0, +1, -1), new Vector2(0, 0) ); var br = new VertexPositionTexture( new Vector3(0, +1, +1), new Vector2(0, 1) ); nverts.SubmitQuad( tl, tr, bl, br ); } //Y Axis { var tl = new VertexPositionTexture( new Vector3(-1, 0, -1), new Vector2(0, 1) ); var tr = new VertexPositionTexture( new Vector3(-1, 0, 1), new Vector2(1, 1) ); var bl = new VertexPositionTexture( new Vector3(+1, 0, -1), new Vector2(0, 0) ); var br = new VertexPositionTexture( new Vector3(+1, 0, 1), new Vector2(0, 1) ); nverts.SubmitQuad( tl, tr, bl, br ); } var transform = Matrix4x4.CreateScale(sz) * Nebula.Zone.RotationMatrix * Matrix4x4.CreateTranslation(p); nverts.Draw( buffer, camera, tex, Nebula.FogColor, transform, inside ); }