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