public void AddInstanceGroup(InstanceGroup Group) { Group.Initialize(); lock (InstanceTypes) { InstanceTypes[Group.Name] = Group; } }
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; }