//--------------------------------------------------------------------------------------------------------------------------------------------------- // // Copyright (C)2007 DarkWynter Studios. All rights reserved. // //--------------------------------------------------------------------------------------------------------------------------------------------------- // {License Information: Creative Commons} //--------------------------------------------------------------------------------------------------------------------------------------------------- namespace DarkWynter.Stream { #region Using Statements using System; using System.Collections.Generic; using Microsoft.Xna.Framework; using Microsoft.Xna.Framework.Content; using Microsoft.Xna.Framework.Graphics; #endregion /// /// Provides global handles to shader api. /// Provides global access bridge to shader Uniform and Texture variables. /// public class ShaderParameters : FXSourceCode { private FXSourceCode fxSourceCode; /// /// Draw Effect struct /// public struct DrawFX { /// /// Draw effects file (HLSL) /// public static Effect effect; #region Global access bridge to shader Uniform and Texture variables /// /// View Projection Matrix of Player. /// /// /// ViewxProjection Matrix /// public static EffectParameter ViewProj; /// /// World Transformation Matrix of object being drawn. /// public static EffectParameter World; /// /// Eye Position based on the inverse of the View matrix /// public static EffectParameter EyePostion; /// /// Boolean Player is Dead, indicating playerDead shader should activate. /// public static EffectParameter playerIsDead; /// /// Position of light 0. /// public static EffectParameter lightPosition0; /// /// Ambient color of light 0. /// public static EffectParameter lightAmbient0; /// /// Diffuse color of light 0. /// public static EffectParameter lightDiffuse0; /// /// Specular color of light 0. /// public static EffectParameter lightSpecular0; /// /// Position of light 1. /// public static EffectParameter lightPosition1; /// /// Ambient color of light 1. /// public static EffectParameter lightAmbient1; /// /// Diffuse color of light 1. /// public static EffectParameter lightDiffuse1; /// /// Specular color of light 1. /// public static EffectParameter lightSpecular1; /// /// Shininess of object being drawn. /// public static EffectParameter shininess; /// /// Energy state of particle being drawn. /// public static EffectParameter particleEnergyValue; /// /// Diffuse color of object's material. /// public static EffectParameter materialDiffuse; /// /// Specular color of object's material. /// public static EffectParameter materialSpecular; /// /// Minimum Y value of the terrain /// public static EffectParameter worldMinY; /// /// Maximum Y value of the terrain /// public static EffectParameter worldMaxY; /// /// Time delay for screen saver activation /// public static EffectParameter screenSaverTime; /// /// Terrain Mod enabled/disabled /// public static EffectParameter terrainModEnabled; /// /// Intersecting point between terrainMod lookAt ray, and the terrain it intersects. /// public static EffectParameter PlaneRayIntersectionPoint; /// /// Range at which terrainMod will work. /// public static EffectParameter TerrainModRange; /// /// Location of Current Player on the board during shader pass. /// public static EffectParameter playerPosition; /// /// /// public static EffectParameter terrainMapSize; /// /// Scaling factor of the terrain /// public static EffectParameter terrainScaleFactor; /// /// /// public static EffectParameter terrainBarrierWallHeight; /// /// First texture to be used in multi-texturing /// public static EffectParameter modelTexture1; /// /// Model Texture 2 shader location. /// public static EffectParameter modelTexture2; /// /// Model Texture 3 shader location. /// public static EffectParameter modelTexture3; /// /// Model Texture 4 shader location. /// public static EffectParameter modelTexture4; /// /// Model Texture 5 shader location. /// public static EffectParameter modelTexture5; /// /// Model Texture 6 shader location. /// public static EffectParameter modelTexture6; /// /// Bump Texture 1 shader location. /// public static EffectParameter bumpTexture1; /// /// Bump Texture 2 shader location. /// public static EffectParameter bumpTexture2; /// /// Bump Texture 3 shader location. /// public static EffectParameter bumpTexture3; /// /// Bump Texture 4 shader location. /// public static EffectParameter bumpTexture4; /// /// Bump Texture 5 shader location. /// public static EffectParameter bumpTexture5; /// /// Bump Texture 6 shader location. /// public static EffectParameter bumpTexture6; /// /// TerrainMod Texture shader location. /// public static EffectParameter terrainModTexture; /// /// Terrain HeightMap Texture shader location. /// public static EffectParameter heightMapTexture; /// /// Terrain Normal Map Texture shader location. /// public static EffectParameter terrainNormalMapTexture; /// /// Number of players in the game. /// public static EffectParameter numberOfPlayers; /// /// Range between minimum and maximum numerical values for gpgpu physics. /// /// /// Scale range /// public static EffectParameter scaleRange; /// /// Minimum value of numerical vavlues for gpgpu physics. /// public static EffectParameter minimumValue; /// /// The size of the board. /// Calculated as [Terrain Scale Factor * Vertex Map Size] /// public static EffectParameter mapSizeXScaleFactor; /// /// Fog start distance /// public static EffectParameter fogStart; /// /// Fog end distance /// public static EffectParameter fogEnd; /// /// Stores the current player's index for AI vision /// public static EffectParameter playerIndex; /// /// Current Position shader location /// public static EffectParameter CurrentPosition; /// /// X spinner used in FlickerFlame Technique /// public static EffectParameter blendTexturePosition1; /// /// Z spinner used in FlickerFlame Technique /// public static EffectParameter blendTexturePosition2; #endregion } /// /// Update Effect struct /// public struct UpdateFX { /// /// Update effects file (HLSL) /// public static Effect effect; #region Global access bridge to shader Uniform and Texture variables /// /// Time elapsed between frames /// public static EffectParameter dt; /// /// ViewProjection Matrix /// public static EffectParameter ViewProj; /// /// World Matrix /// public static EffectParameter World; /// /// Inverse Transpose of the World matrix /// public static EffectParameter WorldInverseTranspose; /// /// Scale used on GPU objects /// public static EffectParameter gpuObjectScale; /// /// Amount of Gravity on current level /// public static EffectParameter gravity; /// /// Minimum Y value for terrain /// public static EffectParameter scaleMinY; /// /// Y range for terrain /// public static EffectParameter scaleRangeY; /// /// Minimum Y value in current position /// public static EffectParameter cpScaleMinY; /// /// Y range in current position /// public static EffectParameter cpScaleRangeY; /// /// Current player's position /// public static EffectParameter playerPosition; /// /// Inverse of the Spatial Map height /// public static EffectParameter invSpatMapHeight; /// /// Inverse of the Spatial Map Width /// public static EffectParameter invSpatMapWidth; /// /// Index value of the current Indexed Pass /// public static EffectParameter IndexedPass; /// /// Normal component for collision calculations /// public static EffectParameter normalComponent; /// /// Normal force after collision /// public static EffectParameter normalForce; /// /// Object 1's velocity /// public static EffectParameter mass1Velocity; /// /// Object 1's current positiong /// public static EffectParameter mass1CurrentPosition; /// /// Object 1's mass value /// public static EffectParameter mass; /// /// - LocationMap - /// public static EffectParameter LocationMap; /// /// - TerrainHeightMap - /// public static EffectParameter TerrainHeightMap; /// /// - TerrainNormalMap - /// public static EffectParameter TerrainNormalMap; /// /// - Position - /// public static EffectParameter CurrentPosition; /// /// - Rotation - /// public static EffectParameter Rotation; /// /// - Scale - /// public static EffectParameter Scale; /// /// - Mass - /// public static EffectParameter Mass; /// /// - Velocity - /// public static EffectParameter Velocity; /// /// - Acceleration - /// public static EffectParameter Acceleration; /// /// - LastPosition - /// public static EffectParameter LastPosition; /// /// - TotalForce - /// public static EffectParameter TotalForce; /// /// - WindMap - /// public static EffectParameter WindMap; /// /// - Radius - /// public static EffectParameter Radius; /// /// - Dummy - /// public static EffectParameter Dummy; #endregion } /// /// AI Vision Effect struct /// public struct AIVisionFX { /// /// Update effects file (HLSL) /// public static Effect effect; #region Global access bridge to shader Uniform and Texture variables /// /// View Projection Matrix /// public static EffectParameter ViewProj; /// /// Inverse Of the View Projection matrix /// public static EffectParameter inverseViewProj; /// /// Number of players in-game /// public static EffectParameter numberOfPlayers; /// /// -- aiVisionTexture -- /// public static EffectParameter aiVisionTexture; #endregion } /// /// Terrain Normal stuff Effect struct /// public struct TerrainNormalFX { /// /// Update effects file (HLSL) /// public static Effect effect; #region Global access bridge to shader Uniform and Texture variables /// /// View Projection Matrix /// public static EffectParameter ViewProj; /// /// World Matrix /// public static EffectParameter World; /// /// Inverse of the map width /// public static EffectParameter invMapWidth; /// /// Terrain height scale value /// public static EffectParameter terrainHeightScale; /// /// Terrain height scaling minimum Y value /// public static EffectParameter terrainScaleMinY; /// /// -- heightMapTexture -- /// public static EffectParameter heightMapTexture; #endregion } /// /// Shader Parameters constructor. /// Loads Draw shader file from disk. /// Associates all cpu effectparameters with gpu counterpart variables. /// /// /// Constructor /// public ShaderParameters(ContentManager content) { // Set up Uniform shader connections ShaderParameters.DrawFX.effect = content.Load("Content/_shaders/ElementalGPU"); ShaderParameters.UpdateFX.effect = content.Load("Content/_shaders/GpuCollisionPhysics"); //ShaderParameters.AIVisionFX.effect = content.Load("Content/_shaders/AIVision"); //ShaderParameters.TerrainNormalFX.effect = content.Load("Content/_shaders/TerrainNormals"); fxSourceCode = new FXSourceCode(); LoadDrawParameters(); LoadUpdateParameters(); LoadAIVisionParameters(); LoadTerrainNormalsParameters(); } /// /// Associates all Draw-based cpu effectparameters with gpu counterpart variables. /// private void LoadDrawParameters() { if (ShaderParameters.DrawFX.effect == null) ShaderParameters.DrawFX.effect = fxSourceCode.LoadElementalGPUFX(); try { // Std Matrix ShaderParameters.DrawFX.ViewProj = ShaderParameters.DrawFX.effect.Parameters["ViewProj"]; ShaderParameters.DrawFX.World = ShaderParameters.DrawFX.effect.Parameters["World"]; // Lighting ShaderParameters.DrawFX.lightPosition0 = ShaderParameters.DrawFX.effect.Parameters["lightPosition0"]; ShaderParameters.DrawFX.lightAmbient0 = ShaderParameters.DrawFX.effect.Parameters["lightAmbient0"]; ShaderParameters.DrawFX.lightDiffuse0 = ShaderParameters.DrawFX.effect.Parameters["lightDiffuse0"]; ShaderParameters.DrawFX.lightSpecular0 = ShaderParameters.DrawFX.effect.Parameters["lightSpecular0"]; ShaderParameters.DrawFX.lightPosition1 = ShaderParameters.DrawFX.effect.Parameters["lightPosition1"]; ShaderParameters.DrawFX.lightAmbient1 = ShaderParameters.DrawFX.effect.Parameters["lightAmbient1"]; ShaderParameters.DrawFX.lightDiffuse1 = ShaderParameters.DrawFX.effect.Parameters["lightDiffuse1"]; ShaderParameters.DrawFX.lightSpecular1 = ShaderParameters.DrawFX.effect.Parameters["lightSpecular1"]; ShaderParameters.DrawFX.shininess = ShaderParameters.DrawFX.effect.Parameters["shininess"]; ShaderParameters.DrawFX.materialDiffuse = ShaderParameters.DrawFX.effect.Parameters["materialDiffuse"]; ShaderParameters.DrawFX.materialSpecular = ShaderParameters.DrawFX.effect.Parameters["materialSpecular"]; // Shadow ShaderParameters.DrawFX.EyePostion = ShaderParameters.DrawFX.effect.Parameters["EyePostion"]; // Particle Shader ShaderParameters.DrawFX.particleEnergyValue = ShaderParameters.DrawFX.effect.Parameters["particleEnergyValue"]; // Multi- Texturing ShaderParameters.DrawFX.modelTexture1 = ShaderParameters.DrawFX.effect.Parameters["modelTexture1"]; ShaderParameters.DrawFX.modelTexture2 = ShaderParameters.DrawFX.effect.Parameters["modelTexture2"]; ShaderParameters.DrawFX.modelTexture3 = ShaderParameters.DrawFX.effect.Parameters["modelTexture3"]; ShaderParameters.DrawFX.modelTexture4 = ShaderParameters.DrawFX.effect.Parameters["modelTexture4"]; ShaderParameters.DrawFX.modelTexture5 = ShaderParameters.DrawFX.effect.Parameters["modelTexture5"]; ShaderParameters.DrawFX.modelTexture6 = ShaderParameters.DrawFX.effect.Parameters["modelTexture6"]; ShaderParameters.DrawFX.bumpTexture1 = ShaderParameters.DrawFX.effect.Parameters["bumpTexture1"]; ShaderParameters.DrawFX.bumpTexture2 = ShaderParameters.DrawFX.effect.Parameters["bumpTexture2"]; ShaderParameters.DrawFX.bumpTexture3 = ShaderParameters.DrawFX.effect.Parameters["bumpTexture3"]; ShaderParameters.DrawFX.bumpTexture4 = ShaderParameters.DrawFX.effect.Parameters["bumpTexture4"]; ShaderParameters.DrawFX.bumpTexture5 = ShaderParameters.DrawFX.effect.Parameters["bumpTexture5"]; ShaderParameters.DrawFX.bumpTexture6 = ShaderParameters.DrawFX.effect.Parameters["bumpTexture6"]; // Terrain ShaderParameters.DrawFX.heightMapTexture = ShaderParameters.DrawFX.effect.Parameters["heightMapTexture"]; ShaderParameters.DrawFX.terrainMapSize = ShaderParameters.DrawFX.effect.Parameters["terrainMapSize"]; ShaderParameters.DrawFX.terrainScaleFactor = ShaderParameters.DrawFX.effect.Parameters["terrainScaleFactor"]; ShaderParameters.DrawFX.terrainNormalMapTexture = ShaderParameters.DrawFX.effect.Parameters["terrainNormalMapTexture"]; ShaderParameters.DrawFX.terrainBarrierWallHeight = ShaderParameters.DrawFX.effect.Parameters["terrainBarrierWallHeight"]; // Terrain Mod Range ShaderParameters.DrawFX.TerrainModRange = ShaderParameters.DrawFX.effect.Parameters["TerrainModRange"]; ShaderParameters.DrawFX.terrainModTexture = ShaderParameters.DrawFX.effect.Parameters["terrainModTexture"]; ShaderParameters.DrawFX.terrainModEnabled = ShaderParameters.DrawFX.effect.Parameters["terrainModEnabled"]; ShaderParameters.DrawFX.playerIsDead = ShaderParameters.DrawFX.effect.Parameters["playerIsDead"]; ShaderParameters.DrawFX.screenSaverTime = ShaderParameters.DrawFX.effect.Parameters["screenSaverTime"]; ShaderParameters.DrawFX.worldMinY = ShaderParameters.DrawFX.effect.Parameters["worldMinY"]; ShaderParameters.DrawFX.worldMaxY = ShaderParameters.DrawFX.effect.Parameters["worldMaxY"]; ShaderParameters.DrawFX.PlaneRayIntersectionPoint = ShaderParameters.DrawFX.effect.Parameters["PlaneRayIntersectionPoint"]; ShaderParameters.DrawFX.playerPosition = ShaderParameters.DrawFX.effect.Parameters["playerPosition"]; ShaderParameters.DrawFX.mapSizeXScaleFactor = ShaderParameters.DrawFX.effect.Parameters["mapSizeXScaleFactor"]; // AI Vision stuff ShaderParameters.DrawFX.numberOfPlayers = ShaderParameters.DrawFX.effect.Parameters["numberOfPlayers"]; ShaderParameters.DrawFX.scaleRange = ShaderParameters.DrawFX.effect.Parameters["scaleRange"]; ShaderParameters.DrawFX.minimumValue = ShaderParameters.DrawFX.effect.Parameters["minimumValue"]; ShaderParameters.DrawFX.fogStart = ShaderParameters.DrawFX.effect.Parameters["fogStart"]; ShaderParameters.DrawFX.fogEnd = ShaderParameters.DrawFX.effect.Parameters["fogEnd"]; ShaderParameters.DrawFX.playerIndex = ShaderParameters.DrawFX.effect.Parameters["playerIndex"]; ShaderParameters.DrawFX.CurrentPosition = ShaderParameters.DrawFX.effect.Parameters["CurrentPosition"]; ShaderParameters.DrawFX.blendTexturePosition1 = ShaderParameters.DrawFX.effect.Parameters["blendTexturePosition1"]; ShaderParameters.DrawFX.blendTexturePosition2 = ShaderParameters.DrawFX.effect.Parameters["blendTexturePosition2"]; } catch { throw new Exception("missing param"); } } /// /// Associates all Update-based cpu effectparameters with gpu counterpart variables. /// private void LoadUpdateParameters() { if (ShaderParameters.UpdateFX.effect == null) ShaderParameters.UpdateFX.effect = fxSourceCode.LoadGPUPhysicsFX(); try { ShaderParameters.UpdateFX.dt = ShaderParameters.UpdateFX.effect.Parameters["dt"]; ShaderParameters.UpdateFX.ViewProj = ShaderParameters.UpdateFX.effect.Parameters["ViewProj"]; ShaderParameters.UpdateFX.World = ShaderParameters.UpdateFX.effect.Parameters["World"]; ShaderParameters.UpdateFX.WorldInverseTranspose = ShaderParameters.UpdateFX.effect.Parameters["WorldInverseTranspose"]; ShaderParameters.UpdateFX.gpuObjectScale = ShaderParameters.UpdateFX.effect.Parameters["gpuObjectScale"]; ShaderParameters.UpdateFX.gravity = ShaderParameters.UpdateFX.effect.Parameters["gravity"]; ShaderParameters.UpdateFX.scaleMinY = ShaderParameters.UpdateFX.effect.Parameters["scaleMinY"]; ShaderParameters.UpdateFX.scaleRangeY = ShaderParameters.UpdateFX.effect.Parameters["scaleRangeY"]; ShaderParameters.UpdateFX.cpScaleMinY = ShaderParameters.UpdateFX.effect.Parameters["cpScaleMinY"]; ShaderParameters.UpdateFX.cpScaleRangeY = ShaderParameters.UpdateFX.effect.Parameters["cpScaleRangeY"]; ShaderParameters.UpdateFX.playerPosition = ShaderParameters.UpdateFX.effect.Parameters["playerPosition"]; ShaderParameters.UpdateFX.invSpatMapHeight = ShaderParameters.UpdateFX.effect.Parameters["invSpatMapHeight"]; ShaderParameters.UpdateFX.invSpatMapWidth = ShaderParameters.UpdateFX.effect.Parameters["invSpatMapWidth"]; ShaderParameters.UpdateFX.IndexedPass = ShaderParameters.UpdateFX.effect.Parameters["IndexedPass"]; ShaderParameters.UpdateFX.normalComponent = ShaderParameters.UpdateFX.effect.Parameters["normalComponent"]; ShaderParameters.UpdateFX.normalForce = ShaderParameters.UpdateFX.effect.Parameters["normalForce"]; ShaderParameters.UpdateFX.mass1Velocity = ShaderParameters.UpdateFX.effect.Parameters["mass1Velocity"]; ShaderParameters.UpdateFX.mass1CurrentPosition = ShaderParameters.UpdateFX.effect.Parameters["mass1CurrentPosition"]; ShaderParameters.UpdateFX.mass = ShaderParameters.UpdateFX.effect.Parameters["mass"]; ShaderParameters.UpdateFX.LocationMap = ShaderParameters.UpdateFX.effect.Parameters["LocationMap"]; ShaderParameters.UpdateFX.TerrainHeightMap = ShaderParameters.UpdateFX.effect.Parameters["TerrainHeightMap"]; ShaderParameters.UpdateFX.TerrainNormalMap = ShaderParameters.UpdateFX.effect.Parameters["TerrainNormalMap"]; ShaderParameters.UpdateFX.CurrentPosition = ShaderParameters.UpdateFX.effect.Parameters["CurrentPosition"]; ShaderParameters.UpdateFX.Rotation = ShaderParameters.UpdateFX.effect.Parameters["Rotation"]; ShaderParameters.UpdateFX.Scale = ShaderParameters.UpdateFX.effect.Parameters["Scale"]; ShaderParameters.UpdateFX.Mass = ShaderParameters.UpdateFX.effect.Parameters["Mass"]; ShaderParameters.UpdateFX.Velocity = ShaderParameters.UpdateFX.effect.Parameters["Velocity"]; ShaderParameters.UpdateFX.Acceleration = ShaderParameters.UpdateFX.effect.Parameters["Acceleration"]; ShaderParameters.UpdateFX.LastPosition = ShaderParameters.UpdateFX.effect.Parameters["LastPosition"]; ShaderParameters.UpdateFX.TotalForce = ShaderParameters.UpdateFX.effect.Parameters["TotalForce"]; ShaderParameters.UpdateFX.WindMap = ShaderParameters.UpdateFX.effect.Parameters["WindMap"]; ShaderParameters.UpdateFX.Radius = ShaderParameters.UpdateFX.effect.Parameters["Radius"]; ShaderParameters.UpdateFX.Dummy = ShaderParameters.UpdateFX.effect.Parameters["Dummy"]; } catch { throw new Exception("missing param"); } } /// /// Associates all AIVision-based cpu effectparameters with gpu counterpart variables. /// private void LoadAIVisionParameters() { if (ShaderParameters.AIVisionFX.effect == null) ShaderParameters.AIVisionFX.effect = fxSourceCode.LoadAIVisionFX(); try { ShaderParameters.AIVisionFX.ViewProj = ShaderParameters.AIVisionFX.effect.Parameters["ViewProj"]; ShaderParameters.AIVisionFX.inverseViewProj = ShaderParameters.AIVisionFX.effect.Parameters["inverseViewProj"]; ShaderParameters.AIVisionFX.numberOfPlayers = ShaderParameters.AIVisionFX.effect.Parameters["numberOfPlayers"]; ShaderParameters.AIVisionFX.aiVisionTexture = ShaderParameters.AIVisionFX.effect.Parameters["aiVisionTexture"]; } catch { throw new Exception("missing param"); } } /// /// Associates all TerrainNormals-based cpu effectparameters with gpu counterpart variables. /// private void LoadTerrainNormalsParameters() { if (ShaderParameters.TerrainNormalFX.effect == null) ShaderParameters.TerrainNormalFX.effect = fxSourceCode.LoadTerrainNormalsFX(); try { ShaderParameters.TerrainNormalFX.ViewProj = ShaderParameters.TerrainNormalFX.effect.Parameters["ViewProj"]; ShaderParameters.TerrainNormalFX.World = ShaderParameters.TerrainNormalFX.effect.Parameters["World"]; ShaderParameters.TerrainNormalFX.invMapWidth = ShaderParameters.TerrainNormalFX.effect.Parameters["invMapWidth"]; ShaderParameters.TerrainNormalFX.terrainHeightScale = ShaderParameters.TerrainNormalFX.effect.Parameters["terrainHeightScale"]; ShaderParameters.TerrainNormalFX.terrainScaleMinY = ShaderParameters.TerrainNormalFX.effect.Parameters["terrainScaleMinY"]; ShaderParameters.TerrainNormalFX.heightMapTexture = ShaderParameters.TerrainNormalFX.effect.Parameters["heightMapTexture"]; } catch { throw new Exception("missing param"); } } } }