//---------------------------------------------------------------------------------------------------------------------------------------------------
// <copyright file="ShaderParameters.cs" company="DarkWynter Studios">
//     Copyright (C)2007 DarkWynter Studios.  All rights reserved.
// </copyright>
//---------------------------------------------------------------------------------------------------------------------------------------------------
// {License Information: Creative Commons}
//---------------------------------------------------------------------------------------------------------------------------------------------------

namespace DarkWynterEngine.Globals
{
    #region Using Statements
    using System;
    using System.Collections.Generic;
    using Microsoft.Xna.Framework;
    using Microsoft.Xna.Framework.Content;
    using Microsoft.Xna.Framework.Graphics;
    #endregion

    /// <summary>
    /// Provides global handles to shader api.
    /// Provides global access bridge to shader Uniform and Texture variables.
    /// </summary>
    public class ShaderParameters
    {

        /// <summary>
        /// Draw effects file (HLSL)
        /// </summary>
        public static Effect effect_draw;
        /// <summary>
        /// Update effects file (HLSL)
        /// </summary>
        public static Effect effect_update;
        /// <summary>
        /// Update effects file (HLSL)
        /// </summary>
        public static Effect effect_aiVision;


        #region Global access bridge to shader Uniform and Texture variables

        /// <summary>
        /// View Projection Matrix of Player.
        /// </summary>
        /// <summary>
        /// ViewxProjection Matrix
        /// </summary>
        public static EffectParameter ViewProj;
        /// <summary>
        /// World Transformation Matrix of object being drawn.
        /// </summary>
        public static EffectParameter World;
        /// <summary>
        /// Eye Position based on the inverse of the View matrix
        /// </summary>
        public static EffectParameter EyePostion;
        /// <summary>
        /// Boolean Player is Dead, indicating playerDead shader should activate.
        /// </summary>
        public static EffectParameter playerIsDead;
        /// <summary>
        /// Position of light 0.
        /// </summary>
        public static EffectParameter lightPosition0;
        /// <summary>
        /// Ambient color of light 0.
        /// </summary>
        public static EffectParameter lightAmbient0;
        /// <summary>
        /// Diffuse color of light 0.
        /// </summary>
        public static EffectParameter lightDiffuse0;
        /// <summary>
        /// Specular color of light 0.
        /// </summary>
        public static EffectParameter lightSpecular0;
        /// <summary>
        /// Position of light 1.
        /// </summary>
        public static EffectParameter lightPosition1;
        /// <summary>
        /// Ambient color of light 1.
        /// </summary>
        public static EffectParameter lightAmbient1;
        /// <summary>
        /// Diffuse color of light 1.
        /// </summary>
        public static EffectParameter lightDiffuse1;
        /// <summary>
        /// Specular color of light 1.
        /// </summary>
        public static EffectParameter lightSpecular1;
        /// <summary>
        /// Shininess of object being drawn.
        /// </summary>
        public static EffectParameter shininess;
        /// <summary>
        /// Energy state of particle being drawn.
        /// </summary>
        public static EffectParameter particleEnergyValue;
        /// <summary>
        /// Diffuse color of object's material.
        /// </summary>
        public static EffectParameter materialDiffuse;
        /// <summary>
        /// Specular color of object's material.
        /// </summary>
        public static EffectParameter materialSpecular;
        /// <summary>
        /// Minimum Y value of the terrain
        /// </summary>
        public static EffectParameter worldMinY;
        /// <summary>
        /// Maximum Y value of the terrain
        /// </summary>
        public static EffectParameter worldMaxY;
        /// <summary>
        /// Time delay for screen saver activation
        /// </summary>
        public static EffectParameter screenSaverTime;
        /// <summary>
        /// Terrain Mod enabled/disabled
        /// </summary>
        public static EffectParameter terrainModEnabled;
        /// <summary>
        /// Intersecting point between terrainMod lookAt ray, and the terrain it intersects.
        /// </summary>
        public static EffectParameter PlaneRayIntersectionPoint;
        /// <summary>
        /// Range at which terrainMod will work.
        /// </summary>
        public static EffectParameter TerrainModRange;
        /// <summary>
        /// Location of Current Player on the board during shader pass.
        /// </summary>
        public static EffectParameter playerPosition;
        /// <summary>
        /// 
        /// </summary>
        public static EffectParameter terrainMapSize;
        /// <summary>
        /// Scaling factor of the terrain
        /// </summary>
        public static EffectParameter terrainScaleFactor;
        /// <summary>
        /// 
        /// </summary>
        public static EffectParameter terrainBarrierWallHeight;
        /// <summary>
        /// First texture to be used in multi-texturing
        /// </summary>
        public static EffectParameter modelTexture1;
        /// <summary>
        /// Model Texture 2 shader location.
        /// </summary>
        public static EffectParameter modelTexture2;
        /// <summary>
        /// Model Texture 3 shader location.
        /// </summary>
        public static EffectParameter modelTexture3;
        /// <summary>
        /// Model Texture 4 shader location.
        /// </summary>        
        public static EffectParameter modelTexture4;
        /// <summary>
        /// Model Texture 5 shader location.
        /// </summary>        
        public static EffectParameter modelTexture5;
        /// <summary>
        /// Model Texture 6 shader location.
        /// </summary>        
        public static EffectParameter modelTexture6;
        /// <summary>
        /// Bump Texture 1 shader location.
        /// </summary>        
        public static EffectParameter bumpTexture1;
        /// <summary>
        /// Bump Texture 2 shader location.
        /// </summary>        
        public static EffectParameter bumpTexture2;
        /// <summary>
        /// Bump Texture 3 shader location.
        /// </summary>        
        public static EffectParameter bumpTexture3;
        /// <summary>
        /// Bump Texture 4 shader location.
        /// </summary>        
        public static EffectParameter bumpTexture4;
        /// <summary>
        /// Bump Texture 5 shader location.
        /// </summary>        
        public static EffectParameter bumpTexture5;
        /// <summary>
        /// Bump Texture 6 shader location.
        /// </summary>        
        public static EffectParameter bumpTexture6;
        /// <summary>
        /// TerrainMod Texture shader location.
        /// </summary>        
        public static EffectParameter terrainModTexture;
        /// <summary>
        /// Terrain HeightMap Texture shader location.
        /// </summary>        
        public static EffectParameter heightMapTexture;
        /// <summary>
        /// Terrain Normal Map Texture shader location.
        /// </summary>        
        public static EffectParameter terrainNormalMapTexture;
        /// <summary>
        /// Number of players in the game.
        /// </summary>        
        public static EffectParameter numberOfPlayers;
        /// <summary>
        /// Range between minimum and maximum numerical values for gpgpu physics.
        /// </summary>        
        /// <summary>
        /// Scale range
        /// </summary>
        public static EffectParameter scaleRange;
        /// <summary>
        /// Minimum value of numerical vavlues for gpgpu physics.
        /// </summary>        
        public static EffectParameter minimumValue;
        /// <summary>
        /// The size of the board.
        /// Calculated as [Terrain Scale Factor * Vertex Map Size]
        /// </summary>
        public static EffectParameter mapSizeXScaleFactor;
        /// <summary>
        /// Fog start distance
        /// </summary>
        public static EffectParameter fogStart;
        /// <summary>
        /// Fog end distance
        /// </summary>
        public static EffectParameter fogEnd;

        #endregion

        /// <summary>
        /// Shader Parameters constructor.
        /// Loads Draw shader file from disk.
        /// Associates all cpu effectparameters with gpu counterpart variables.
        /// </summary>
        /// <summary>
        /// Constructor
        /// </summary>
        public ShaderParameters()
        {
            // Set up Uniform shader connections
            ShaderParameters.effect_draw = Statics.SystemSettings.content.Load<Effect>("Content/_shaders/ElementalGPU");
            ShaderParameters.effect_update = Statics.SystemSettings.content.Load<Effect>("Content/_shaders/GpuCollisionPhysics");

            LoadParameters();
        }

        /// <summary>
        /// Associates all cpu effectparameters with gpu counterpart variables.
        /// </summary>
        private void LoadParameters()
        {
            try
            {
                // Std Matrix
                ViewProj = ShaderParameters.effect_draw.Parameters["ViewProj"];
                World = ShaderParameters.effect_draw.Parameters["World"];

                // Lighting
                lightPosition0 = ShaderParameters.effect_draw.Parameters["lightPosition0"];
                lightAmbient0 = ShaderParameters.effect_draw.Parameters["lightAmbient0"];
                lightDiffuse0 = ShaderParameters.effect_draw.Parameters["lightDiffuse0"];
                lightSpecular0 = ShaderParameters.effect_draw.Parameters["lightSpecular0"];
                lightPosition1 = ShaderParameters.effect_draw.Parameters["lightPosition1"];
                lightAmbient1 = ShaderParameters.effect_draw.Parameters["lightAmbient1"];
                lightDiffuse1 = ShaderParameters.effect_draw.Parameters["lightDiffuse1"];
                lightSpecular1 = ShaderParameters.effect_draw.Parameters["lightSpecular1"];
                shininess = ShaderParameters.effect_draw.Parameters["shininess"];
                materialDiffuse = ShaderParameters.effect_draw.Parameters["materialDiffuse"];
                materialSpecular = ShaderParameters.effect_draw.Parameters["materialSpecular"];

                // Shadow
                EyePostion = ShaderParameters.effect_draw.Parameters["EyePostion"];

                // Particle Shader
                particleEnergyValue = ShaderParameters.effect_draw.Parameters["particleEnergyValue"];

                // Multi- Texturing
                modelTexture1 = ShaderParameters.effect_draw.Parameters["modelTexture1"];
                modelTexture2 = ShaderParameters.effect_draw.Parameters["modelTexture2"];
                modelTexture3 = ShaderParameters.effect_draw.Parameters["modelTexture3"];
                modelTexture4 = ShaderParameters.effect_draw.Parameters["modelTexture4"];
                modelTexture5 = ShaderParameters.effect_draw.Parameters["modelTexture5"];
                modelTexture6 = ShaderParameters.effect_draw.Parameters["modelTexture6"];
                bumpTexture1 = ShaderParameters.effect_draw.Parameters["bumpTexture1"];
                bumpTexture2 = ShaderParameters.effect_draw.Parameters["bumpTexture2"];
                bumpTexture3 = ShaderParameters.effect_draw.Parameters["bumpTexture3"];
                bumpTexture4 = ShaderParameters.effect_draw.Parameters["bumpTexture4"];
                bumpTexture5 = ShaderParameters.effect_draw.Parameters["bumpTexture5"];
                bumpTexture6 = ShaderParameters.effect_draw.Parameters["bumpTexture6"];

                // Terrain
                heightMapTexture = ShaderParameters.effect_draw.Parameters["heightMapTexture"];
                terrainMapSize = ShaderParameters.effect_draw.Parameters["terrainMapSize"];
                terrainScaleFactor = ShaderParameters.effect_draw.Parameters["terrainScaleFactor"];
                terrainNormalMapTexture = ShaderParameters.effect_draw.Parameters["terrainNormalMapTexture"];
                terrainBarrierWallHeight = ShaderParameters.effect_draw.Parameters["terrainBarrierWallHeight"];

                // Terrain Mod Range
                TerrainModRange = ShaderParameters.effect_draw.Parameters["TerrainModRange"];
                terrainModTexture = ShaderParameters.effect_draw.Parameters["terrainModTexture"];
                terrainModEnabled = ShaderParameters.effect_draw.Parameters["terrainModEnabled"];

                playerIsDead = ShaderParameters.effect_draw.Parameters["playerIsDead"];
                screenSaverTime = ShaderParameters.effect_draw.Parameters["screenSaverTime"];

                worldMinY = ShaderParameters.effect_draw.Parameters["worldMinY"];
                worldMaxY = ShaderParameters.effect_draw.Parameters["worldMaxY"];
                PlaneRayIntersectionPoint = ShaderParameters.effect_draw.Parameters["PlaneRayIntersectionPoint"];
                playerPosition = ShaderParameters.effect_draw.Parameters["playerPosition"];

                mapSizeXScaleFactor = ShaderParameters.effect_draw.Parameters["mapSizeXScaleFactor"];

                // AI Vision stuff
                numberOfPlayers = ShaderParameters.effect_draw.Parameters["numberOfPlayers"];

                scaleRange = ShaderParameters.effect_draw.Parameters["scaleRange"];
                minimumValue = ShaderParameters.effect_draw.Parameters["minimumValue"];

                fogStart = ShaderParameters.effect_draw.Parameters["fogStart"];
                fogEnd = ShaderParameters.effect_draw.Parameters["fogEnd"];
            }
            catch
            {
                throw new Exception("missing param");
            }
        }
    }
}