public void RenderInstance( NewInstanceData Instance, GraphicsDevice Device, Shader Effect, Camera Camera, InstanceRenderMode Mode) { if (Instance.Type == null || !InstanceTypes.ContainsKey(Instance.Type)) { return; } InstanceTypes[Instance.Type].RenderInstance(Instance, Device, Effect, Camera, Mode); _instanceCounter += 1; }
public void Flush( GraphicsDevice Device, Shader Effect, Camera Camera, InstanceRenderMode Mode) { foreach (var group in InstanceTypes) { group.Value.Flush(Device, Effect, Camera, Mode); } InstancesDrawn = _instanceCounter; _instanceCounter = 0; }
public void Flush( GraphicsDevice Device, Shader Effect, Camera Camera, InstanceRenderMode Mode) { foreach (var group in InstanceTypes) { group.Value.Flush(Device, Effect, Camera, Mode); } PerformanceMonitor.SetMetric("INSTANCES DRAWN", _instanceCounter); _instanceCounter = 0; }
public override void RenderInstance(NewInstanceData Instance, GraphicsDevice Device, Shader Effect, Camera Camera, InstanceRenderMode Mode) { if (Mode == InstanceRenderMode.SelectionBuffer && !RenderData.RenderInSelectionBuffer) { return; } if (InstanceCount >= InstanceQueueSize) { return; } Instances[InstanceCount] = new TiledInstancedVertex { Transform = Instance.Transform, LightRamp = Instance.LightRamp, SelectionBufferColor = Instance.SelectionBufferColor, VertexColorTint = Instance.VertexColorTint, TileBounds = GetTileBounds(Instance) }; InstanceCount += 1; if (InstanceCount >= InstanceQueueSize) { Flush(Device, Effect, Camera, Mode); } }
public override void Flush(GraphicsDevice Device, Shader Effect, Camera Camera, InstanceRenderMode Mode) { if (InstanceCount == 0) { return; } if (NeedsRendered || (AtlasTexture != null && (AtlasTexture.IsDisposed || AtlasTexture.GraphicsDevice.IsDisposed))) { if (RawAtlas == null || RawAtlas.Textures.Count == 0) { RebuildAtlas(); if (RawAtlas == null || RawAtlas.Textures.Count == 0) { // WTF. InstanceCount = 0; return; } } AtlasTexture = new Texture2D(Device, RawAtlas.Dimensions.Width, RawAtlas.Dimensions.Height); foreach (var texture in RawAtlas.Textures) { var realTexture = texture.RealTexture; if (realTexture == null || realTexture.IsDisposed || realTexture.GraphicsDevice.IsDisposed) { texture.RealTexture = AssetManager.GetContentTexture(texture.Sheet.Texture); realTexture = texture.RealTexture; } var textureData = new Color[realTexture.Width * realTexture.Height]; realTexture.GetData(textureData); // Paste texture data into atlas. AtlasTexture.SetData(0, texture.Rect, textureData, 0, realTexture.Width * realTexture.Height); } NeedsRendered = false; } if (InstanceBuffer == null || InstanceBuffer.IsDisposed || InstanceBuffer.IsContentLost) { InstanceBuffer = new DynamicVertexBuffer(Device, TiledInstancedVertex.VertexDeclaration, InstanceQueueSize, BufferUsage.None); } Device.RasterizerState = new RasterizerState { CullMode = CullMode.None }; if (Mode == InstanceRenderMode.Normal) { Effect.SetTiledInstancedTechnique(); } else { Effect.CurrentTechnique = Effect.Techniques[Shader.Technique.SelectionBufferTiledInstanced]; } Effect.EnableWind = RenderData.EnableWind; 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); } Device.Indices = RenderData.Model.IndexBuffer; BlendState blendState = Device.BlendState; Device.BlendState = Mode == InstanceRenderMode.Normal ? BlendState.NonPremultiplied : BlendState.Opaque; Effect.MainTexture = AtlasTexture; Effect.LightRamp = Color.White; InstanceBuffer.SetData(Instances, 0, InstanceCount, SetDataOptions.Discard); Device.SetVertexBuffers(new VertexBufferBinding(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 RenderBody(DwarfTime gameTime, ChunkManager chunks, Camera camera, SpriteBatch spriteBatch, GraphicsDevice graphicsDevice, Shader effect, bool renderingForWater, InstanceRenderMode Mode) { if (!IsVisible) { return; } if (!AnimPlayer.HasValidAnimation()) { return; } if (AnimPlayer.InstancingPossible) { PrepareInstanceData(camera); Manager.World.Renderer.InstanceRenderer.RenderInstance(InstanceData, graphicsDevice, effect, camera, Mode); } else { if (AnimPlayer.Primitive == null) { return; } Color origTint = effect.VertexColorTint; effect.SelectionBufferColor = this.GetGlobalIDColor().ToVector4(); effect.World = GetWorldMatrix(camera); var tex = AnimPlayer.GetTexture(); if (tex != null && !tex.IsDisposed && !tex.GraphicsDevice.IsDisposed) { effect.MainTexture = AnimPlayer.GetTexture(); } ApplyTintingToEffect(effect); if (DrawSilhouette) { Color oldTint = effect.VertexColorTint; effect.VertexColorTint = SilhouetteColor; graphicsDevice.DepthStencilState = DepthStencilState.None; var oldTechnique = effect.CurrentTechnique; effect.CurrentTechnique = effect.Techniques[Shader.Technique.Silhouette]; foreach (EffectPass pass in effect.CurrentTechnique.Passes) { pass.Apply(); AnimPlayer.Primitive.Render(graphicsDevice); } graphicsDevice.DepthStencilState = DepthStencilState.Default; effect.VertexColorTint = oldTint; effect.CurrentTechnique = oldTechnique; } if (EnableWind) { effect.EnableWind = true; } foreach (EffectPass pass in effect.CurrentTechnique.Passes) { pass.Apply(); AnimPlayer.Primitive.Render(graphicsDevice); } effect.VertexColorTint = origTint; effect.EnableWind = false; EndDraw(effect); } }
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; }
public abstract void Flush(GraphicsDevice Device, Shader Effect, Camera Camera, InstanceRenderMode Mode);
public abstract void RenderInstance(NewInstanceData Instance, GraphicsDevice Device, Shader Effect, Camera Camera, InstanceRenderMode Mode);