コード例 #1
0
        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;
        }
コード例 #2
0
        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;
        }
コード例 #3
0
ファイル: InstanceRenderer.cs プロジェクト: hhy5277/dwarfcorp
        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;
        }
コード例 #4
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);
            }
        }
コード例 #5
0
        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;
        }
コード例 #6
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);
            }
        }
コード例 #7
0
        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;
        }
コード例 #8
0
 public abstract void Flush(GraphicsDevice Device, Shader Effect, Camera Camera, InstanceRenderMode Mode);
コード例 #9
0
 public abstract void RenderInstance(NewInstanceData Instance, GraphicsDevice Device, Shader Effect, Camera Camera, InstanceRenderMode Mode);