public void render(List <GameObject> descs) { ObjectController controller = WhiskeyControl.Active.ObjectController; if (controller != null) { GraphicsDevice.SetRenderTarget(layerScreenShader); GraphicsDevice.Clear(XnaColor.Transparent); foreach (CoreLayer layer in Level.Layers) { if (!layer.Visible) { continue; } string shaderMode = layer.ShaderMode; BlendState blendState = BlendModeConverter.getState(layer.BlendMode); if (shaderMode != CoreLayer.DEFAULT_SHADER_MODE && shaderMode != null) { Effect fx = WhiskeyControl.Resources.loadEffect(shaderMode); layer.setEffect(fx); } else { layer.setEffect(null); } string postShaderMode = layer.PostShaderMode; if (postShaderMode != CoreLayer.DEFAULT_SHADER_MODE && postShaderMode != null) { layer.setPostEffect(WhiskeyControl.Resources.loadEffect(postShaderMode)); } else { layer.setPostEffect(null); } if (WhiskeyControl.InputManager != null) { Vector mouse = WhiskeyControl.InputManager.MousePosition; mouse.X /= currentLayerTarget.Width; mouse.Y /= currentLayerTarget.Height; Level.ShaderParameters.setVector(ShaderParameters.PARAM_MOUSE_POS, mouse); Vector3 translation = ActiveCamera.TranformMatrix.Translation; translation.X /= currentLayerTarget.Width; translation.Y /= currentLayerTarget.Height; Level.ShaderParameters.setVector(ShaderParameters.PARAM_CAMERA, new Vector(translation.X, translation.Y)); Level.ShaderParameters.setFloat(ShaderParameters.PARAM_CAMERA_ZOOM, ActiveCamera.Zoom); } Effect layerEffect = layer.getEffect(); Effect post = layer.getPostEffect(); Level.ShaderParameters.updateEffect(layerEffect); Level.ShaderParameters.updateEffect(post); GraphicsDevice.SetRenderTarget(currentLayerTarget); GraphicsDevice.Clear(XnaColor.Transparent); if (layer.ScreenShader) { spriteBatch.Begin(SpriteSortMode.FrontToBack, blendState, SamplerState.LinearClamp, DepthStencilState.Default, RasterizerState.CullNone, layerEffect); spriteBatch.Draw(bloomComponent.SceneTarget, Vector.Zero, XnaColor.White); spriteBatch.End(); } else { spriteBatch.Begin(SpriteSortMode.FrontToBack, blendState, SamplerState.LinearWrap, DepthStencilState.Default, RasterizerState.CullNone, layerEffect, CameraTransform); foreach (GameObject gob in descs.Where(g => (g.Layer == null && layer == Level.DefaultLayer) || layer == g.Layer)) { if (gob == controller)//|| gob == controller.Selected) { continue; } Vector2 alwaysOnPos = gob.Position; spriteBatch.Draw(alwaysOnSprite.getImage(), alwaysOnPos, null, alwaysOnSprite.Color, alwaysOnSprite.Rotation, alwaysOnSprite.Offset, alwaysOnSprite.Scale, SpriteEffects.None, 0); gob.Bounds.draw(RenderInfo, new RenderHints().setColor(Level.BackgroundColorCompliment)); gob.renderImage(RenderInfo); } spriteBatch.End(); } GraphicsDevice.SetRenderTarget(layerScreenShader); spriteBatch.Begin(SpriteSortMode.Immediate, BlendState.NonPremultiplied, SamplerState.LinearClamp, DepthStencilState.Default, RasterizerState.CullNone, post); spriteBatch.Draw(currentLayerTarget, Vector.Zero, XnaColor.White); spriteBatch.End(); } } }
private void renderLayers() { GraphicsDevice.SetRenderTarget(layerScreenShader); GraphicsDevice.Clear(XnaColor.Transparent); foreach (Layer layer in Level.Layers) { if (!layer.Visible) { continue; } string shaderMode = layer.ShaderMode; BlendState blendState = BlendModeConverter.getState(layer.BlendMode); if (shaderMode != Layer.DEFAULT_SHADER_MODE && shaderMode != null) { Effect fx = GameManager.Resources.loadEffect(shaderMode); layer.setEffect(fx); } else { layer.setEffect(null); } string postShaderMode = layer.PostShaderMode; if (postShaderMode != Layer.DEFAULT_SHADER_MODE && postShaderMode != null) { layer.setPostEffect(GameManager.Resources.loadEffect(postShaderMode)); } else { layer.setPostEffect(null); } Effect layerEffect = layer.getEffect(); Effect post = layer.getPostEffect(); Level.ShaderParameters.updateEffect(layerEffect); Level.ShaderParameters.updateEffect(post); GraphicsDevice.SetRenderTarget(currentLayerTarget); GraphicsDevice.Clear(XnaColor.Transparent); if (layer.ScreenShader) { spriteBatch.Begin(SpriteSortMode.FrontToBack, blendState, SamplerState.LinearWrap, DepthStencilState.Default, RasterizerState.CullNone, layerEffect); spriteBatch.Draw(bloomComponent.SceneTarget, Vector.Zero, XnaColor.White); spriteBatch.End(); } else { spriteBatch.Begin(SpriteSortMode.FrontToBack, blendState, SamplerState.LinearWrap, DepthStencilState.Default, RasterizerState.CullNone, layerEffect, CameraTransform); List <GameObject> allGobs = GameManager.Objects.getAllObjects(); Convex.begin(); foreach (GameObject gob in allGobs.Where(g => g.Active && !g.HudObject && g.Layer.Name.Equals(layer.Name))) { gob.renderImage(RenderInfo); } spriteBatch.End(); // RenderTarget2D primTarget = checkRenderTarget(null, GraphicsDevice.PresentationParameters.BackBufferWidth, GraphicsDevice.PresentationParameters.BackBufferHeight); // GraphicsDevice.SetRenderTarget(primTarget); BlendState bs = BlendState.AlphaBlend; GraphicsDevice.BlendState = bs; PrimitiveBatch.getInstance(GraphicsDevice).CurrentLayer = layer; Convex.readyToBeDrawn.ForEach(c => { c.Convex.render(c.GraphcisDevice, c.Transform, c.Hints); }); // GraphicsDevice.SetRenderTarget(currentLayerTarget); // spriteBatch.Begin(SpriteSortMode.Immediate, BlendState.NonPremultiplied, SamplerState.LinearWrap, DepthStencilState.Default, RasterizerState.CullNone, null); // spriteBatch.Draw(primTarget, Vector.Zero, XnaColor.White); // spriteBatch.End(); } GraphicsDevice.SetRenderTarget(layerScreenShader); spriteBatch.Begin(SpriteSortMode.Immediate, BlendState.NonPremultiplied, SamplerState.LinearWrap, DepthStencilState.Default, RasterizerState.CullNone, post); spriteBatch.Draw(currentLayerTarget, Vector.Zero, XnaColor.White); spriteBatch.End(); } }