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;
            }
        }
Beispiel #2
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;
            }
        }