// Project: XnaGraphicEngine, File: PreScreenSkyCubeMapping.cs // Namespace: XnaGraphicEngine.Shaders, Class: PreScreenSkyCubeMapping // Path: C:\code\XnaGraphicEngine\Shaders, Author: Abi // Code lines: 217, Size of file: 5,51 KB // Creation date: 08.09.2006 06:06 // Last modified: 05.11.2006 00:52 // Generated with Commenter by abi.exDream.com #region Using directives using XnaGraphicEngine.Graphics; using XnaGraphicEngine.Helpers; using System; using System.Collections.Generic; using System.IO; using System.Text; using System.Threading; using Microsoft.Xna.Framework.Graphics; using Microsoft.Xna.Framework; using XnaGraphicEngine.Game; #endregion namespace XnaGraphicEngine.Shaders { /// /// Pre screen sky cube mapping, if shaders are not supported a special /// fallback to fixed function pipeline rendering is provided also! /// public class PreScreenSkyCubeMapping : ShaderEffect { #region Variables /// /// Shader effect filename. /// const string Filename = "PreScreenSkyCubeMapping.fx"; /// /// Sky cube map texture filename. /// const string SkyCubeMapFilename = //"Textures\\SkyCubeMap.dds"; "SpaceSkyCubeMap"; // content name // Use same content name as used by models: //"SkyCubeMap~0"; // content name /// /// Default sky color /// static readonly Color DefaultSkyColor = new Color(232, 232, 232); /// /// The Cube Map texture for the sky! /// private TextureCube skyCubeMapTexture = null; /// /// Sky cube map texture /// /// Texture cube public TextureCube SkyCubeMapTexture { get { return skyCubeMapTexture; } // get } // SkyCubeMapTexture #endregion #region Constructor /// /// Create pre screen sky cube mapping /// public PreScreenSkyCubeMapping() : base(Filename) { // All loading is done in the ShaderEffect class. BaseGame.RegisterGraphicContentObject(this); } // PreScreenSkyCubeMapping() #endregion #region Dispose /// /// Dispose /// public override void Dispose() { if (skyCubeMapTexture != null) skyCubeMapTexture.Dispose(); skyCubeMapTexture = null; base.Dispose(); } // Dispose() #endregion #region Get parameters /// /// Reload /// protected override void GetParameters() { base.GetParameters(); // Load and set cube map texture /*obs skyCubeMapTexture = TextureCube.FromFile( BaseGame.Device, SkyCubeMapFilename); */ skyCubeMapTexture = BaseGame.Content.Load( Path.Combine(Directories.ContentDirectory, SkyCubeMapFilename)); diffuseTexture.SetValue(skyCubeMapTexture); // Set sky color to nearly white and scale to 1 AmbientColor = DefaultSkyColor; // Select SkyCubeMap technique //unused: effect.te.Technique = "SkyCubeMap"; } // GetParameters() #endregion #region Render sky /// /// Render sky with help of shader. /// public void RenderSky(Color setSkyColor) { // Can't render with shader if shader is not valid! if (this.Valid == false) return; try { // Don't use or write to the z buffer BaseGame.Device.RenderState.DepthBufferEnable = false; BaseGame.Device.RenderState.DepthBufferWriteEnable = false; // Also don't use any kind of blending. BaseGame.Device.RenderState.AlphaBlendEnable = false; AmbientColor = setSkyColor; // Rotate view matrix by level number, this way we look to a different // direction depending on which level we are in. Matrix invViewMatrix = BaseGame.InverseViewMatrix;// * //TODO: Matrix.RotationY(-Level.currentLevelNumber * (float)Math.PI / 2.0f); InverseViewMatrix = invViewMatrix; // Start shader try { // Remember old state because we will use clamp texturing here effect.Begin(SaveStateMode.SaveState); // Render with specific pass //foreach (EffectPass pass in effect.Techniques[0].Passes) for (int num = 0; num < effect.CurrentTechnique.Passes.Count; num++) { EffectPass pass = effect.CurrentTechnique.Passes[num]; // Render each pass pass.Begin(); VBScreenHelper.Render(); pass.End(); } // foreach (pass) } // try finally { // End shader effect.End(); } // finally } // try catch (Exception ex) { Log.Write("Failed to render " + Filename + " shader: " + ex.ToString()); // Make shader invalid, so we don't call it anymore effect = null; } // catch finally { // Enable z buffer again BaseGame.Device.RenderState.DepthBufferEnable = true; BaseGame.Device.RenderState.DepthBufferWriteEnable = true; } // finally } // RenderSky(setWrappingScale, setSkyColor) /// /// Render sky /// public void RenderSky() { RenderSky(lastUsedAmbientColor); } // RenderSky() #endregion #region Unit testing #if DEBUG /// /// Test sky cube mapping /// //[Test] public static void TestSkyCubeMapping() { PreScreenSkyCubeMapping skyCube = null; TestGame.Start("TestSkyCubeMapping", delegate { skyCube = new PreScreenSkyCubeMapping(); }, delegate { skyCube.RenderSky(); }); } // TestSkyCubeMapping() #endif #endregion } // class PreScreenSkyCubeMapping } // namespace XnaGraphicEngine.Shaders