示例#1
0
        public void Render(GraphicsDevice gd, CommandList cl, SceneContext sc, RenderPasses renderPass, BSPModelResourceContainer modelResource, ref BrushModelRenderData renderData)
        {
            var wai = new WorldAndInverse(renderData.Shared.Origin, renderData.Shared.Angles, renderData.Shared.Scale);

            sc.UpdateWorldAndInverseBuffer(cl, ref wai);

            var renderArguments = new BSPRenderArguments
            {
                RenderColor = GetBrushColor(ref renderData.Shared) / 255.0f,
                RenderMode  = renderData.Shared.RenderMode
            };

            cl.UpdateBuffer(RenderArgumentsBuffer, 0, ref renderArguments);

            var pipeline = Pipelines[renderData.Shared.RenderMode];

            cl.SetPipeline(pipeline);
            cl.SetGraphicsResourceSet(0, _sharedResourceSet);

            cl.SetVertexBuffer(0, modelResource.VertexBuffer);
            cl.SetIndexBuffer(modelResource.IndexBuffer, IndexFormat.UInt32);

            for (var lightmapIndex = 0; lightmapIndex < modelResource.Lightmaps.Length; ++lightmapIndex)
            {
                ref var lightmap = ref modelResource.Lightmaps[lightmapIndex];

                cl.SetGraphicsResourceSet(2, lightmap.Lightmap);

                for (var textureIndex = 0; textureIndex < lightmap.Textures.Length; ++textureIndex)
                {
                    ref var texture = ref lightmap.Textures[textureIndex];

                    cl.SetGraphicsResourceSet(1, texture.Texture);

                    cl.DrawIndexed(texture.IndicesCount, 1, texture.FirstIndex, 0, 0);
                }
示例#2
0
 public void UpdateWorldAndInverseBuffer(CommandList cl, ref WorldAndInverse wai)
 {
     cl.UpdateBuffer(WorldAndInverseBuffer, 0, ref wai);
 }
        public void Render(GraphicsDevice gd, CommandList cl, SceneContext sc, RenderPasses renderPass, SpriteModelResourceContainer modelResource, ref SpriteModelRenderData renderData)
        {
            if (renderData.Shared.RenderMode == RenderMode.Glow)
            {
                renderData.Shared.RenderAmount = GlowBlend(ref renderData.Shared, sc.ViewState);
            }

            //Don't render if blend is 0 (even if blend were ignored below)
            if (renderData.Shared.RenderAmount == 0)
            {
                return;
            }

            var blend = renderData.Shared.RenderMode != RenderMode.Normal ? renderData.Shared.RenderAmount : 255;

            //TODO: glow sprite visibility testing
            var angles = GetSpriteAngles(ref renderData.Shared, modelResource.SpriteModel.SpriteFile.Type, sc.ViewState);

            angles = VectorUtils.ToRadians(angles);

            var wai = new WorldAndInverse();

            var anglesWithoutYaw = angles;

            anglesWithoutYaw.Y = 0;

            wai.World = Matrix4x4.CreateScale(renderData.Shared.Scale)
                * WorldAndInverse.CreateRotationMatrix(anglesWithoutYaw)
                * WorldAndInverse.CreateRotationMatrix(new Vector3(0, angles.Y, 0))
                * Matrix4x4.CreateTranslation(renderData.Shared.Origin);

            wai.InverseWorld = VdUtilities.CalculateInverseTranspose(ref wai.World);

            //var wai = new WorldAndInverse(renderData.Origin, angles, renderData.Scale);

            sc.UpdateWorldAndInverseBuffer(cl, ref wai);

            var alpha = 255;

            switch (renderData.Shared.RenderMode)
            {
                case RenderMode.Normal:
                case RenderMode.TransTexture:
                case RenderMode.TransAlpha:
                    alpha = blend;
                    break;
            }

            var renderColor = new Vector4(CalculateSpriteColor(ref renderData.Shared, blend), alpha) / 255.0f;

            cl.UpdateBuffer(modelResource.RenderColorBuffer, 0, ref renderColor);

            renderData.Frame = Math.Clamp((int)renderData.Frame, 0, modelResource.VertexBuffers.Length - 1);

            var frameBuffer = modelResource.VertexBuffers[(int)renderData.Frame];

            var pipeline = Pipelines[renderData.Shared.RenderMode];

            cl.SetVertexBuffer(0, frameBuffer);
            cl.SetIndexBuffer(modelResource.IndexBuffer, IndexFormat.UInt16);
            cl.SetPipeline(pipeline);
            cl.SetGraphicsResourceSet(0, modelResource.ResourceSet);
            cl.DrawIndexed((uint)SPRResourceUtils.Indices.Length, 1, 0, 0, 0);
        }