protected override void DrawAllPrimitives(GameTime time) { Profiler.Values ["Diff. Inst."] = cacheInstancedPrimitives.Count; foreach (string key in cacheInstancedPrimitives.Keys) { InstancedPrimitive instancedPrimitive = cacheInstancedPrimitives [key]; // Setze den Viewport auf den der aktuellen Spielwelt Viewport original = Screen.Viewport; Screen.Viewport = instancedPrimitive.World.Viewport; Profiler.ProfileDelegate ["Instancing.Param"] = () => { Camera camera = instancedPrimitive.World.Camera; effect.Parameters ["xView"].SetValue (instancedPrimitive.IsSkyObject ? SkyViewMatrix (camera.ViewMatrix) : camera.ViewMatrix); effect.Parameters ["xProjection"].SetValue (camera.ProjectionMatrix); effect.Parameters ["xModelTexture"].SetValue (instancedPrimitive.Texture); effect.Parameters ["xLightDirection"].SetValue (camera.LightDirection); effect.Parameters ["xCameraPosition"].SetValue (camera.Position); }; InstancedBuffer buffer = null; Profiler.ProfileDelegate ["Instancing.1"] = () => { if (!cachePrimitivesBuffers.ContainsKey (key)) { buffer = cachePrimitivesBuffers [key] = new InstancedBuffer (); buffer.InstanceBuffer = new VertexBuffer (Screen.GraphicsDevice, instanceVertexDeclaration, instancedPrimitive.InstanceCapacity, BufferUsage.WriteOnly); buffer.InstanceCount = 0; Log.Debug ("new VertexBuffer"); } else { buffer = cachePrimitivesBuffers [key]; } }; Profiler.ProfileDelegate ["Instancing.2"] = () => { if (buffer.InstanceCapacity < instancedPrimitive.InstanceCapacity) { Profiler.ProfileDelegate ["NewVertexBuffer"] = () => { buffer.InstanceBuffer.Dispose (); buffer.InstanceBuffer = new VertexBuffer (Screen.GraphicsDevice, instanceVertexDeclaration, instancedPrimitive.InstanceCapacity, BufferUsage.WriteOnly); Log.Debug ("Dispose -> new VertexBuffer"); }; } }; Profiler.ProfileDelegate ["Instancing.3"] = () => { if (buffer.InstanceCount != instancedPrimitive.InstanceCount || buffer.InstanceUniqueHash != instancedPrimitive.InstanceUniqueHash) { buffer.InstanceBuffer.SetData (instancedPrimitive.Instances); buffer.InstanceCount = instancedPrimitive.InstanceCount; buffer.InstanceUniqueHash = instancedPrimitive.InstanceUniqueHash; } }; Profiler.ProfileDelegate ["Instancing.Draw"] = () => { instancedPrimitive.Primitive.DrawInstances (effect: effect, instanceBuffer: ref buffer.InstanceBuffer, instanceCount: instancedPrimitive.InstanceCount); }; // Setze den Viewport wieder auf den ganzen Screen Screen.Viewport = original; instancedPrimitive.InstanceCount = 0; } }
protected override void DrawAllPrimitives(GameTime time) { foreach (string key in cacheInstancedPrimitives.Keys) { InstancedPrimitive instancedPrimitive = cacheInstancedPrimitives [key]; // Setze den Viewport auf den der aktuellen Spielwelt Viewport original = Screen.Viewport; Screen.Viewport = instancedPrimitive.World.Viewport; Camera camera = instancedPrimitive.World.Camera; //effect.Parameters ["World"].SetValue (primitive.WorldMatrix * camera.WorldMatrix); effect.Parameters ["xLightDirection"].SetValue (new Vector4 (-1.0f, -2.0f, -1.0f, 0)); effect.Parameters ["xWorldTime"].SetValue (new Vector4 ((float)time.TotalGameTime.TotalSeconds, 0, 0, 0)); effect.Parameters ["xView"].SetValue (camera.ViewMatrix); effect.Parameters ["xProjection"].SetValue (camera.ProjectionMatrix); //effect.Parameters ["WorldInverseTranspose"].SetValue (Matrix.Transpose (Matrix.Invert (primitive.WorldMatrix * camera.WorldMatrix))); effect.Parameters ["xModelTexture"].SetValue (instancedPrimitive.Texture); InstancedBuffer buffer; if (!cachePrimitivesBuffers.ContainsKey (key)) { buffer = cachePrimitivesBuffers [key] = new InstancedBuffer (); buffer.InstanceBuffer = new VertexBuffer (Screen.GraphicsDevice, instanceVertexDeclaration, instancedPrimitive.InstanceCapacity, BufferUsage.WriteOnly); buffer.InstanceCount = 0; } else { buffer = cachePrimitivesBuffers [key]; } if (buffer.InstanceCapacity < instancedPrimitive.InstanceCapacity) { Profiler.ProfileDelegate ["NewVertexBuffer"] = () => { buffer.InstanceBuffer.Dispose (); buffer.InstanceBuffer = new VertexBuffer (Screen.GraphicsDevice, instanceVertexDeclaration, instancedPrimitive.InstanceCapacity, BufferUsage.WriteOnly); }; } if (buffer.InstanceCount != instancedPrimitive.InstanceCount || buffer.InstanceUniqueHash != instancedPrimitive.InstanceUniqueHash) { buffer.InstanceBuffer.SetData (instancedPrimitive.Instances); buffer.InstanceCount = instancedPrimitive.InstanceCount; buffer.InstanceUniqueHash = instancedPrimitive.InstanceUniqueHash; } instancedPrimitive.Primitive.DrawInstances (effect: effect, instanceBuffer: ref buffer.InstanceBuffer, instanceCount: instancedPrimitive.InstanceCount); // Setze den Viewport wieder auf den ganzen Screen Screen.Viewport = original; instancedPrimitive.InstanceCount = 0; } }