00001 #ifndef __NYTRO_Shader_H
00002 #define __NYTRO_Shader_H
00003
00004
00005
00006
00007
00008
00009
00010
00011 #include "system/nyCommon.h"
00012 #include "system/nyBase.h"
00013 #include "system/nyResource.h"
00014 #include "system/nyVariant.h"
00015 #include "math/nyMath.h"
00016
00017 namespace Nytro
00018 {
00019 namespace Graphics
00020 {
00021 using namespace Core;
00022
00023 class Shader;
00024
00029 class NYTRO_API RenderLayer
00030 {
00031 public:
00032
00034 enum ERenderLayerPriority
00035 {
00037 eRenderLayerPriority_Opaque = 0,
00039 eRenderLayerPriority_Additive,
00041 eRenderLayerPriority_Transparent
00042 };
00043
00044 RenderLayer()
00045 {
00046 m_renderPriority = eRenderLayerPriority_Opaque;
00047 }
00048
00050 string m_name;
00052 int32 m_renderPriority;
00053 };
00054
00056 class NYTRO_API RenderState
00057 {
00058 public:
00059
00061 enum ERenderState
00062 {
00063 eRenderState_None = 0,
00064 eRenderState_AlphaBlendEnable,
00065 eRenderState_AlphaFunc,
00066 eRenderState_AlphaRef,
00067 eRenderState_AlphaTestEnable,
00068 eRenderState_ColorWriteEnable,
00069 eRenderState_DepthBias,
00070 eRenderState_DestBlend,
00071 eRenderState_FillMode,
00072 eRenderState_SlopeScaleDepthBias,
00073 eRenderState_SrcBlend,
00074 eRenderState_StencilEnable,
00075 eRenderState_StencilFail,
00076 eRenderState_StencilFunc,
00077 eRenderState_StencilMask,
00078 eRenderState_StencilPass,
00079 eRenderState_StencilRef,
00080 eRenderState_StencilWriteMask,
00081 eRenderState_StencilZFail,
00082 eRenderState_ZEnable,
00083 eRenderState_ZFunc,
00084 eRenderState_ZWriteEnable,
00085 eRenderState_CullMode
00086 };
00087
00088 RenderState( ERenderState aType = eRenderState_None, const Core::Variant& aValue = (int32)0 );
00089 ~RenderState();
00090
00092 ERenderState m_type;
00094 Core::Variant m_value;
00095 };
00096
00099 class NYTRO_API ShaderConstant
00100 {
00101 public:
00102
00104 enum EShaderConstant
00105 {
00106 eShaderConstant_Unknown,
00107 eShaderConstant_WorldMatrix,
00108 eShaderConstant_WorldInverseMatrix,
00109 eShaderConstant_WorldInverseTransposeMatrix,
00110 eShaderConstant_ViewMatrix,
00111 eShaderConstant_ViewInverseMatrix,
00112 eShaderConstant_ViewInverseTransposeMatrix,
00113 eShaderConstant_ViewRotationMatrix,
00114 eShaderConstant_WorldViewMatrix,
00115 eShaderConstant_WorldViewInverseMatrix,
00116 eShaderConstant_WorldViewInverseTransposeMatrix,
00117 eShaderConstant_ProjectionMatrix,
00118 eShaderConstant_WorldProjectionMatrix,
00119 eShaderConstant_ViewProjectionMatrix,
00120 eShaderConstant_WorldViewProjectionMatrix,
00121 eShaderConstant_EngineTime,
00122 eShaderConstant_EngineFrameDeltaTime,
00123 eShaderConstant_EngineFps,
00124 eShaderConstant_RenderTargetSize,
00125 eShaderConstant_ViewportSize,
00126 eShaderConstant_CameraFov,
00127 eShaderConstant_CameraNearPlane,
00128 eShaderConstant_CameraFarPlane,
00129 eShaderConstant_CameraUpAxis,
00130 eShaderConstant_ColorBuffer,
00131 eShaderConstant_DepthBuffer,
00132 eShaderConstant_SystemTexture,
00133 eShaderConstant_Texture0,
00134 eShaderConstant_Texture1,
00135 eShaderConstant_Texture2,
00136 eShaderConstant_Texture3,
00137 eShaderConstant_Texture4,
00138 eShaderConstant_Texture5,
00139 eShaderConstant_Texture6,
00140 eShaderConstant_Texture7,
00141 eShaderConstant_Texture8,
00142 eShaderConstant_Texture9,
00143 eShaderConstant_Texture10,
00144 eShaderConstant_Texture11,
00145 eShaderConstant_Texture12,
00146 eShaderConstant_Texture13,
00147 eShaderConstant_Texture14,
00148 eShaderConstant_Texture15,
00149 eShaderConstant_Float,
00150 eShaderConstant_Integer,
00151 eShaderConstant_Matrix,
00152 eShaderConstant_Vector,
00153 eShaderConstant_Bool
00154 };
00155
00156 ShaderConstant();
00157 ~ShaderConstant();
00158
00167 void set( EShaderConstant aType, const char* pName, voidptr pData = NULL,
00168 bool bIsArray = false, uint32 aCount = 0 );
00169
00171 void setDataValue( voidptr pData, uint32 aCount = 1 );
00172
00173 ShaderConstant& operator = ( const ShaderConstant& crCopy );
00174
00176 EShaderConstant m_type;
00178 string m_name,
00180 m_value,
00182 m_displayName,
00184 m_comment;
00186 bool m_bIsArray, m_bAutoDeleteData;
00188 uint32 m_count;
00190 voidptr m_pData;
00191 };
00192
00195 class NYTRO_API ShaderPreset
00196 {
00197 friend class Shader;
00198
00199 public:
00200
00201 ShaderPreset();
00202 ~ShaderPreset();
00203
00205 void addConstant( const char* pName, const char* pDisplayName,
00206 const char* pComment, ShaderConstant::EShaderConstant aType,
00207 voidptr pData = NULL, bool bIsArray = false, uint32 aCount = 0 );
00209 void removeConstant( const char* pName );
00211 ShaderConstant* getConstantByName( const char* pName );
00213 void setConstantValue( const char* pConstName, voidptr pValue, uint32 aCount = 1 );
00215 void free();
00217 string getName();
00219 vector<ShaderConstant>& getConstants();
00221 vector<RenderState>& getRenderStates();
00223 string getDescription();
00225 string getTechniqueName();
00227 string getRenderLayer();
00229 RenderLayer* getRenderLayerPtr();
00230
00232 void setDescription( const char* pDesc );
00234 void setRenderLayer( const char* pLayerName );
00236 void setTechniqueName( const char* pName );
00237
00239 void loadFromXml( XmlElement* pShaderPresetElem );
00241 void saveToXml( XmlDocument* pDoc );
00242
00243 protected:
00244
00246 void buildValues();
00247
00249 vector<ShaderConstant> m_constants;
00251 string m_name,
00253 m_description,
00255 m_techniqueName;
00257 string m_renderLayer;
00259 RenderLayer* m_pRenderLayer;
00261 vector<RenderState> m_renderStates;
00262 };
00263
00265 class NYTRO_API ShaderUserConstant
00266 {
00267 public:
00268
00271 ShaderUserConstant( voidptr* ppData = 0, voidptr pUserVar = 0 );
00272
00274 voidptr* m_ppData;
00275
00277 voidptr m_pUserVariable;
00278 };
00279
00282 class NYTRO_API ShaderUserConstants
00283 {
00284 public:
00285
00287 void addUserVariableFor( voidptr* ppData, voidptr pVariable );
00289 void applyUserConstants();
00291 vector<ShaderUserConstant>& getUserConstants();
00292
00293 protected:
00294
00296 vector<ShaderUserConstant> m_userConstants;
00297 };
00298
00301 class NYTRO_API ShaderController : public Base
00302 {
00303 public:
00304
00305 ShaderController();
00306 virtual ~ShaderController();
00307
00309 virtual EResult controlShader( Shader* pShader );
00310 };
00311
00318 class NYTRO_API ShaderQualityLevel
00319 {
00320 public:
00321
00323 string m_name,
00325 m_technique;
00326 };
00327
00330 class NYTRO_API Shader : public Resource
00331 {
00332 protected:
00333
00338 Shader();
00339
00340 public:
00341
00342 enum EShaderOption
00343 {
00344 eShaderOption_UsingColorBuffer = NYTRO_BIT(0),
00345 eShaderOption_UsingShadowBuffer = NYTRO_BIT(1)
00346 };
00347
00348 virtual ~Shader();
00349
00351 virtual EResult load( const char* pFilename = NULL );
00353 virtual EResult unload();
00355 virtual void begin();
00357 virtual void end();
00358
00360 const string& getShaderSource() const;
00362 vector<ShaderQualityLevel>& getQualityLevels();
00364 ShaderPreset* getPreset();
00366 ShaderPreset& getDefaultPreset();
00368 virtual uint32 getTechniqueCount();
00370 virtual const string& getDescription() const;
00372 virtual const string& getControllerClassName() const;
00374 virtual const string& getShaderFileName() const;
00376 virtual ShaderController* getController() const;
00378 string getTechniqueName( int32 aIndex );
00380 uint32 getActiveTechniqueIndex();
00382 string getActiveTechniqueName();
00384 uint32 getOptions();
00386 bool isOptionEnabled( EShaderOption aOption );
00388 virtual bool isUsingFile( const char* pFile );
00390 ShaderUserConstants* getShaderUserConstants();
00391
00393 virtual void setShaderSource( const char* pSrc );
00395 virtual void setActiveTechnique( uint32 aIndex );
00397 virtual void setActiveTechnique( const char* pName );
00399 virtual void setActiveTechniqueByQualityLevel( const char* pLevelName );
00401 virtual void setDescription( const char* pValue );
00403 virtual void setShaderFileName( const char* pValue );
00405 virtual void setControllerClassName( const char* pValue );
00407 virtual void setController( ShaderController* pCtrl );
00409 virtual void setPreset( ShaderPreset* pPreset );
00411 virtual void setOptions( uint32 aOptions );
00414 virtual void setShaderUserConstants( ShaderUserConstants* pConsts );
00415 NYTRO_CLASS_HAS_PROPERTIES;
00416
00417 protected:
00418
00420 string m_shaderSource;
00422 ShaderPreset* m_pPreset;
00424 ShaderPreset m_defaultPreset;
00426 ShaderUserConstants* m_pShaderUserConstants;
00428 string m_description,
00430 m_shaderFileName,
00432 m_controllerClassName;
00434 ShaderController* m_pShaderCtrl;
00436 vector<ShaderQualityLevel> m_qualityLevels;
00438 uint32 m_options;
00440 map<string,int32> m_techniques;
00442 uint32 m_techniqueIndex;
00443 };
00444 };
00445 };
00446
00447 #endif