public static void Render( IEnumerable <IRenderableComponent> Renderables, DwarfTime gameTime, ChunkManager chunks, Camera Camera, SpriteBatch spriteBatch, GraphicsDevice graphicsDevice, Shader effect, WaterRenderType waterRenderMode, float waterLevel) { effect.EnableLighting = GameSettings.Default.CursorLightEnabled; graphicsDevice.RasterizerState = RasterizerState.CullNone; if (waterRenderMode == WaterRenderType.Reflective) { foreach (IRenderableComponent bodyToDraw in Renderables) { if (!(bodyToDraw.GetBoundingBox().Min.Y > waterLevel - 2)) { continue; } bodyToDraw.Render(gameTime, chunks, Camera, spriteBatch, graphicsDevice, effect, true); } } else { foreach (IRenderableComponent bodyToDraw in Renderables) { GamePerformance.Instance.StartTrackPerformance("Component Render - " + bodyToDraw.GetType().Name); bodyToDraw.Render(gameTime, chunks, Camera, spriteBatch, graphicsDevice, effect, false); GamePerformance.Instance.StopTrackPerformance("Component Render - " + bodyToDraw.GetType().Name); } } effect.EnableLighting = false; }
public void Render(DwarfTime gameTime, ChunkManager chunks, Camera camera, SpriteBatch spriteBatch, GraphicsDevice graphicsDevice, Effect effect, WaterRenderType waterRenderMode, float waterLevel) { bool renderForWater = (waterRenderMode != WaterRenderType.None); if (!renderForWater) { visibleComponents.Clear(); componentsToDraw.Clear(); List <Body> list = FrustrumCullLocatableComponents(camera); foreach (Body component in list) { visibleComponents.Add(component); } ComponentManager.Camera = camera; foreach (GameComponent component in Components.Values) { bool isLocatable = component is Body; if (isLocatable) { Body loc = (Body)component; if (((loc.GlobalTransform.Translation - camera.Position).LengthSquared() < chunks.DrawDistanceSquared && visibleComponents.Contains(loc) || !(loc.FrustrumCull) || !(loc.WasAddedToOctree) && !loc.IsAboveCullPlane) ) { componentsToDraw.Add(component); } } else { componentsToDraw.Add(component); } } } effect.Parameters["xEnableLighting"].SetValue(GameSettings.Default.CursorLightEnabled ? 1 : 0); graphicsDevice.RasterizerState = RasterizerState.CullNone; foreach (GameComponent component in componentsToDraw) { if (waterRenderMode == WaterRenderType.Reflective && !RenderReflective(component, waterLevel)) { continue; } else if (waterRenderMode == WaterRenderType.Refractive && !RenderRefractive(component, waterLevel)) { continue; } component.Render(gameTime, chunks, camera, spriteBatch, graphicsDevice, effect, renderForWater); } effect.Parameters["xEnableLighting"].SetValue(0); }
public void Render(DwarfTime gameTime, ChunkManager chunks, Camera camera, SpriteBatch spriteBatch, GraphicsDevice graphicsDevice, Shader effect, WaterRenderType waterRenderMode, float waterLevel) { bool renderForWater = (waterRenderMode != WaterRenderType.None); if (!renderForWater) { visibleComponents.Clear(); BoundingFrustum frustrum = camera.GetFrustrum(); foreach (IRenderableComponent b in RenderableComponents) { if (!b.IsVisible) { continue; } if (b.IsAboveCullPlane) { continue; } if (b.FrustrumCull) { if ((b.GlobalTransform.Translation - camera.Position).LengthSquared() >= chunks.DrawDistanceSquared) { continue; } if (!(b.GetBoundingBox().Intersects(frustrum))) { continue; } } System.Diagnostics.Debug.Assert(!visibleComponents.Contains(b)); visibleComponents.Add(b); } Camera = camera; } effect.EnableLighting = GameSettings.Default.CursorLightEnabled; graphicsDevice.RasterizerState = RasterizerState.CullNone; visibleComponents.Sort(CompareZDepth); foreach (IRenderableComponent bodyToDraw in visibleComponents) { if (waterRenderMode == WaterRenderType.Reflective && !(bodyToDraw.GetBoundingBox().Min.Y > waterLevel - 2)) { continue; } bodyToDraw.Render(gameTime, chunks, camera, spriteBatch, graphicsDevice, effect, renderForWater); } effect.EnableLighting = false; }