private void InitSystems() { _systems = new BaseSystem[] { // Input System must go first to have accurate snapshots new InputSystem(Engine), // TransformResetSystem must go before any system that changes the transform of entities new TransformResetSystem(Engine), // Section below is not dependent on other systems new GravityHolePassiveAnimationSystem(Engine, ProcessManager, Content), new AnimationSystem(Engine), new ParallaxBackgroundSystem(Engine, Camera), new PulseSystem(Engine), new PassiveRotationSystem(Engine), new MenuBackgroundDestructionSystem(Engine, Camera), new ProjectileColorSyncSystem(Engine), // Section below is ordered based on dependency from Top (least dependent) to Bottom (most dependent) new ChasingSpeedIncreaseSystem(Engine), new LaserEnemySystem(Engine), new GravitySystem(Engine), new EnemySeparationSystem(Engine), // Depends on the Quad Tree, however this system needs to go before movement system. It will use the previous frame's quad tree. new MovementSystem(Engine), new PlayerShieldSystem(Engine), new QuadTreeSystem(Engine), new SuperShieldSystem(Engine), // Until Changed, EnemyRotationSystem must go after MovementSystem or enemy ships will not bounce off of walls new EnemyRotationSystem(Engine), // Collision Detection must go last to have accurate collision detection new CollisionDetectionSystem(Engine) }; RenderSystem = new RenderSystem(GameManager.GraphicsDevice, Content, Engine); #if DEBUG CollisionDebugRenderSystem = new CollisionDebugRenderSystem(GameManager.GraphicsDevice, Engine); #endif #if DEBUG RenderCullingDebugRenderSystem = new RenderCullingDebugRenderSystem(GameManager.GraphicsDevice, Engine); #endif #if DEBUG QuadTreeDebugRenderSystem = new QuadTreeDebugRenderSystem(GameManager.GraphicsDevice, Engine); #endif }
protected override void OnRender(float dt, float betweenFrameAlpha) { int enableFrameSmoothing = CVars.Get <bool>("graphics_frame_smoothing") ? 1 : 0; betweenFrameAlpha = betweenFrameAlpha * enableFrameSmoothing + (1 - enableFrameSmoothing); _fxaaPPE.Enabled = CVars.Get <bool>("graphics_fxaa"); _smaaPPE.Enabled = CVars.Get <bool>("graphics_smaa"); GameManager.GraphicsDevice.Clear(Color.Black); Camera camera = Camera; #if DEBUG if (CVars.Get <bool>("debug_force_debug_camera")) { camera = DebugCamera; } #endif PostProcessor.Begin(); { RenderSystem.DrawEntities(Camera, Constants.Render.RENDER_GROUP_GAME_ENTITIES, dt, betweenFrameAlpha, camera); RenderSystem.SpriteBatch.Begin(SpriteSortMode.Deferred, null, null, null, null, null, camera.GetInterpolatedTransformMatrix(betweenFrameAlpha)); if (!CVars.Get <bool>("particle_gpu_accelerated")) { VelocityParticleManager.Draw(RenderSystem.SpriteBatch); } RenderSystem.SpriteBatch.End(); if (CVars.Get <bool>("particle_gpu_accelerated")) { GPUParticleManager.UpdateAndDraw(Camera, dt, betweenFrameAlpha, camera); } } // We have to defer drawing the post-processor results // because of unexpected behavior within MonoGame. RenderTarget2D postProcessingResult = PostProcessor.End(false); // Stars RenderSystem.DrawEntities(Camera, Constants.Render.RENDER_GROUP_STARS, dt, betweenFrameAlpha, camera); // Stars RenderSystem.SpriteBatch.Begin(); RenderSystem.SpriteBatch.Draw(postProcessingResult, postProcessingResult.Bounds, Color.White); // Post-processing results RenderSystem.SpriteBatch.End(); // Shield Resource RenderSystem.DrawEntities(Camera, Constants.Render.RENDER_GROUP_NO_GLOW, dt, betweenFrameAlpha, camera); #if DEBUG if (CVars.Get <bool>("debug_show_collision_shapes")) { CollisionDebugRenderSystem.Draw(camera.GetInterpolatedTransformMatrix(betweenFrameAlpha), dt); } #endif #if DEBUG if (CVars.Get <bool>("debug_show_render_culling")) { Camera debugCamera = CVars.Get <bool>("debug_force_debug_camera") ? DebugCamera : null; RenderCullingDebugRenderSystem.Draw(Camera, dt, debugCamera); } #endif #if DEBUG if (CVars.Get <bool>("debug_show_quad_trees")) { Camera debugCamera = CVars.Get <bool>("debug_force_debug_camera") ? DebugCamera : null; QuadTreeDebugRenderSystem.Draw(Camera, dt, debugCamera); } #endif base.OnRender(dt, betweenFrameAlpha); }