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); }
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); }