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
                            );
                    }
                }
            }
        }
示例#2
0
 public abstract void Draw(ICamera camera, CommandBuffer commands, SystemLighting lights, NebulaRenderer nr);
示例#3
0
        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
                );
        }