//---------------------------------------------------------------------------------------------------------------------------------------------------
//
// 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");
}
}
}
}