예제 #1
0
        public void Draw(
            Texture2D texture,
            Vector3 Position,
            Vector2 size,
            Color4 color,
            Vector2 topleft,
            Vector2 topright,
            Vector2 bottomleft,
            Vector2 bottomright,
            float angle,
            int layer,
            BlendMode blend = BlendMode.Normal
            )
        {
            rendat[billboardCount] = new RenderData(
                texture,
                blend,
                (ushort)vertexCountBasic
                );
            CreateBillboard(
                Position,
                size,
                color,
                angle,
                topleft,
                topright,
                bottomleft,
                bottomright
                );
            var z = RenderHelpers.GetZ(camera.Position, Position);

            buffer.AddCommand(
                this,
                rendat[billboardCount].GetHashCode(),
                billboardCount,
                layer,
                z
                );
            billboardCount++;
        }
예제 #2
0
        public void DrawTri(
            Texture2D texture,
            Vector3 Position,
            float radius,
            Color4 color,
            Vector2 texa,
            Vector2 texb,
            Vector2 texc,
            float angle,
            int layer,
            BlendMode blend = BlendMode.Normal
            )
        {
            rendat[billboardCount] = RenderData.CreateTri(
                texture,
                blend,
                (ushort)vertexCountBasic
                );
            CreateTriBillboard(
                Position,
                radius,
                color,
                angle,
                texa,
                texb,
                texc,
                camera.View.GetRight(),
                camera.View.GetUp()
                );
            var z = RenderHelpers.GetZ(camera.Position, Position);

            buffer.AddCommand(
                this,
                rendat[billboardCount].GetHashCode(),
                billboardCount,
                layer,
                z
                );
            billboardCount++;
        }
예제 #3
0
        public void DrawCustomShader(
            Shader shader,
            ShaderAction setup,
            RenderUserData userData,
            Vector3 Position,
            Vector2 size,
            Color4 color,
            Vector2 topleft,
            Vector2 topright,
            Vector2 bottomleft,
            Vector2 bottomright,
            float angle,
            int layer,
            float z = float.NegativeInfinity
            )
        {
            currentTexture = null;
            int vc = vertexCount;

            CreateBillboard(
                Position,
                size,
                color,
                angle,
                topleft,
                topright,
                bottomleft,
                bottomright
                );
            buffer.AddCommand(
                this,
                shader,
                setup,
                userData,
                vc,
                layer,
                float.IsNegativeInfinity(z) ? RenderHelpers.GetZ(Matrix4.Identity, camera.Position, Position) : z
                );
        }
예제 #4
0
        public void Draw(CommandBuffer buffer, ICamera camera, Texture texture, Color4 color, Matrix4 world, bool inside)
        {
            var z = RenderHelpers.GetZ(world, camera.Position, Vector3.Zero);

            buffer.AddCommand(
                shader,
                shaderDelegate,
                resetDelegate,
                world,
                new RenderUserData()
            {
                Color = color, Camera = camera, Texture = texture
            },
                vbo,
                PrimitiveTypes.TriangleList,
                0,
                lastIndex,
                (currentIndex - lastIndex) / 3,
                true,
                inside ? SortLayers.NEBULA_INSIDE : SortLayers.NEBULA_NORMAL,
                z
                );
            lastIndex = currentIndex;
        }
예제 #5
0
        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 = ShaderCache.Get("sun.vs", "sun_radial.frag");
                radialTex0   = radialShader.Shader.GetLocation("tex0");
                radialSize   = radialShader.Shader.GetLocation("SizeMultiplier");
                radialAlpha  = radialShader.Shader.GetLocation("outerAlpha");
            }
            if (spineShader == null)
            {
                spineShader = ShaderCache.Get("sun.vs", "sun_spine.frag");
                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);
            }
        }
예제 #6
0
        public void Draw(ResourceManager res, SystemLighting lighting, CommandBuffer buffer, NebulaRenderer nr)
        {
            //Null check
            if (_camera == null)
            {
                return;
            }
            //Asteroids!
            if (VectorMath.DistanceSquared(cameraPos, field.Zone.Position) <= renderDistSq)
            {
                float fadeNear = field.FillDist * 0.9f;
                float fadeFar  = field.FillDist;
                if (field.Cube.Count > 0)
                {
                    if (cubeCount == -1)
                    {
                        return;
                    }
                    for (int i = 0; i < cubeDrawCalls.Count; i++)
                    {
                        cubeDrawCalls[i].Material.Update(_camera);
                    }
                    var lt = RenderHelpers.ApplyLights(lighting, 0, cameraPos, field.FillDist, nr);
                    while (!_asteroidsCalculated)
                    {
                    }
                    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 (VectorMath.DistanceSquared(center, cameraPos) < (fadeNear * fadeNear))
                            { //TODO: Accurately determine whether or not a cube has fading
                            }
                            buffer.AddCommandFade(
                                dc.Material.Render,
                                cubes[j].tr,
                                lt,
                                cube_vbo,
                                PrimitiveTypes.TriangleList,
                                dc.StartIndex,
                                dc.Count / 3,
                                SortLayers.OBJECT,
                                new Vector2(fadeNear, fadeFar),
                                z
                                );
                        }
                    }
                }
                if (field.BillboardCount != -1 || false)
                {
                    var cameraLights = RenderHelpers.ApplyLights(lighting, 0, cameraPos, 1, nr);
                    if (billboardTex == null || billboardTex.IsDisposed)
                    {
                        billboardTex = (Texture2D)res.FindTexture(field.BillboardShape.Texture);
                    }

                    for (int i = 0; i < astbillboards.Length; i++)
                    {
                        if (!astbillboards [i].Inited)
                        {
                            astbillboards [i].Spawn(this);
                        }
                        var d = VectorMath.DistanceSquared(cameraPos, astbillboards [i].Position);
                        if (d < (field.BillboardDistance * field.BillboardDistance) || d > (field.FillDist * field.FillDist))
                        {
                            astbillboards [i].Spawn(this);
                        }
                        if (astbillboards [i].Visible)
                        {
                            var alpha  = 1f;
                            var coords = billboardCoords [astbillboards [i].Texture];
                            sys.Game.Billboards.DrawTri(
                                billboardTex,
                                astbillboards [i].Position,
                                astbillboards[i].Size,
                                new Color4(field.BillboardTint * cameraLights.Ambient.Rgb, 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);
                for (int i = 0; i < SIDES; i++)
                {
                    var p      = bandCylinder.GetSidePosition(i);
                    var zcoord = RenderHelpers.GetZ(bandTransform, cameraPos, p);
                    p = bandTransform.Transform(p);
                    var lt = RenderHelpers.ApplyLights(lighting, 0, p, lightingRadius, nr);
                    if (lt.FogMode != FogModes.Linear || VectorMath.DistanceSquared(cameraPos, p) <= (lightingRadius + lt.FogRange.Y) * (lightingRadius + lt.FogRange.Y))
                    {
                        buffer.AddCommand(
                            bandShader.Shader,
                            bandShaderDelegate,
                            bandShaderCleanup,
                            bandTransform,
                            lt,
                            new RenderUserData()
                        {
                            Float   = field.Band.TextureAspect,
                            Color   = field.Band.ColorShift,
                            Camera  = _camera,
                            Texture = tex,
                            Matrix2 = bandNormal
                        },
                            bandCylinder.VertexBuffer,
                            PrimitiveTypes.TriangleList,
                            0,
                            i * 6,
                            2,
                            true,
                            SortLayers.OBJECT,
                            zcoord
                            );
                    }
                }
            }
        }
예제 #7
0
        public void DrawPerspective(
            Texture2D texture,
            Vector3 pos,
            Matrix4 world,
            Vector2 size,
            Color4 color,
            Vector2 topleft,
            Vector2 topright,
            Vector2 bottomleft,
            Vector2 bottomright,
            Vector3 normal,
            float angle,
            int layer,
            BlendMode blend = BlendMode.Normal
            )
        {
            var upref = Vector3.UnitY;

            if ((Vector3.UnitY - normal).Length < float.Epsilon)
            {
                upref = Vector3.UnitZ;
            }
            var srcright = Vector3.Cross(normal, upref);
            var srcup    = Vector3.Cross(srcright, normal);

            srcup.Normalize();
            srcright.Normalize();
            Vector3 up, right;

            if (Math.Abs(angle) < float.Epsilon)
            {
                up    = srcup;
                right = srcright;
            }
            else
            {
                var s = (float)Math.Sin(angle);
                var c = (float)Math.Cos(angle);
                up    = c * srcright - s * srcup;
                right = s * srcright + c * srcup;
            }
            rendat[billboardCount] = new RenderData(
                texture,
                blend,
                RenderKind.Rect,
                (ushort)vertexCountRect
                );
            //
            var sz = 0.5f * size;

            verticesRect[vertexCountRect++] = new VertexPositionColorTexture(
                VectorMath.Transform(
                    pos - right * sz.X - up * sz.Y, world
                    ),
                color,
                bottomleft
                );
            verticesRect[vertexCountRect++] = new VertexPositionColorTexture(
                VectorMath.Transform(
                    pos + right * sz.X - up * sz.Y, world
                    ),
                color,
                topleft
                );
            verticesRect[vertexCountRect++] = new VertexPositionColorTexture(
                VectorMath.Transform(
                    pos - right * sz.X + up * sz.Y, world
                    ),
                color,
                bottomright
                );
            verticesRect[vertexCountRect++] = new VertexPositionColorTexture(
                VectorMath.Transform(
                    pos + right * sz.X + up * sz.Y, world
                    ),
                color,
                topright
                );
            //
            var z = RenderHelpers.GetZ(camera.Position, pos);

            buffer.AddCommand(
                this,
                rendat[billboardCount].GetHashCode(),
                billboardCount,
                layer,
                z
                );
            billboardCount++;
        }
        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
                            );
                    }
                }
            }
        }