public override void Flush(GraphicsDevice Device, Shader Effect, Camera Camera, InstanceRenderMode Mode) { if (InstanceCount == 0) { return; } if (InstanceBuffer == null || InstanceBuffer.IsDisposed || InstanceBuffer.IsContentLost || InstanceBuffer.GraphicsDevice.IsDisposed) { InstanceBuffer = new DynamicVertexBuffer(Device, InstancedVertex.VertexDeclaration, InstanceQueueSize, BufferUsage.None); } Effect.EnableWind = RenderData.EnableWind; Device.RasterizerState = new RasterizerState { CullMode = CullMode.None }; if (Mode == InstanceRenderMode.Normal) { Effect.SetInstancedTechnique(); } else { Effect.CurrentTechnique = Effect.Techniques[Shader.Technique.SelectionBufferInstanced]; } Effect.EnableLighting = true; Effect.VertexColorTint = Color.White; if (RenderData.Model.VertexBuffer == null || RenderData.Model.IndexBuffer == null || (RenderData.Model.VertexBuffer != null && RenderData.Model.VertexBuffer.IsContentLost) || (RenderData.Model.IndexBuffer != null && RenderData.Model.IndexBuffer.IsContentLost)) { RenderData.Model.ResetBuffer(Device); } bool hasIndex = RenderData.Model.IndexBuffer != null; Device.Indices = RenderData.Model.IndexBuffer; BlendState blendState = Device.BlendState; Device.BlendState = Mode == InstanceRenderMode.Normal ? BlendState.NonPremultiplied : BlendState.Opaque; Effect.MainTexture = RenderData.Model.Texture.SafeGetImage(); Effect.LightRamp = Color.White; InstanceBuffer.SetData(Instances, 0, InstanceCount, SetDataOptions.Discard); Device.SetVertexBuffers(RenderData.Model.VertexBuffer, new VertexBufferBinding(InstanceBuffer, 0, 1)); var ghostEnabled = Effect.GhostClippingEnabled; Effect.GhostClippingEnabled = RenderData.EnableGhostClipping && ghostEnabled; foreach (EffectPass pass in Effect.CurrentTechnique.Passes) { pass.Apply(); Device.DrawInstancedPrimitives(PrimitiveType.TriangleList, 0, 0, RenderData.Model.VertexCount, 0, RenderData.Model.Indexes.Length / 3, InstanceCount); } Effect.GhostClippingEnabled = ghostEnabled; Effect.SetTexturedTechnique(); Effect.World = Matrix.Identity; Device.BlendState = blendState; Effect.EnableWind = false; InstanceCount = 0; }
private void Flush( InstanceGroup Group, GraphicsDevice Device, Shader Effect, Camera Camera, RenderMode Mode) { if (InstanceBuffer == null) { InstanceBuffer = new DynamicVertexBuffer(Device, InstancedVertex.VertexDeclaration, InstanceQueueSize, BufferUsage.None); } Effect.EnableWind = Group.RenderData.EnableWind; Device.RasterizerState = new RasterizerState { CullMode = CullMode.None }; if (Mode == RenderMode.Normal) { Effect.SetInstancedTechnique(); } else { Effect.CurrentTechnique = Effect.Techniques[Shader.Technique.SelectionBufferInstanced]; } Effect.EnableLighting = true; Effect.VertexColorTint = Color.White; if (Group.RenderData.Model.VertexBuffer == null || Group.RenderData.Model.IndexBuffer == null) { Group.RenderData.Model.ResetBuffer(Device); } bool hasIndex = Group.RenderData.Model.IndexBuffer != null; Device.Indices = Group.RenderData.Model.IndexBuffer; BlendState blendState = Device.BlendState; Device.BlendState = Mode == RenderMode.Normal ? Group.RenderData.BlendMode : BlendState.Opaque; Effect.MainTexture = Group.RenderData.Model.Texture; Effect.LightRampTint = Color.White; InstanceBuffer.SetData(Group.Instances, 0, Group.InstanceCount, SetDataOptions.Discard); Device.SetVertexBuffers(Group.RenderData.Model.VertexBuffer, new VertexBufferBinding( InstanceBuffer, 0, 1)); foreach (EffectPass pass in Effect.CurrentTechnique.Passes) { pass.Apply(); Device.DrawInstancedPrimitives(PrimitiveType.TriangleList, 0, 0, Group.RenderData.Model.VertexCount, 0, Group.RenderData.Model.Indexes.Length / 3, Group.InstanceCount); } Effect.SetTexturedTechnique(); Effect.World = Matrix.Identity; Device.BlendState = blendState; Effect.EnableWind = false; Group.InstanceCount = 0; }