OgreShaderParameter.h

Go to the documentation of this file.
00001 /*
00002 -----------------------------------------------------------------------------
00003 This source file is part of OGRE
00004 (Object-oriented Graphics Rendering Engine)
00005 For the latest info, see http://www.ogre3d.org
00006 
00007 Copyright (c) 2000-2012 Torus Knot Software Ltd
00008 Permission is hereby granted, free of charge, to any person obtaining a copy
00009 of this software and associated documentation files (the "Software"), to deal
00010 in the Software without restriction, including without limitation the rights
00011 to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
00012 copies of the Software, and to permit persons to whom the Software is
00013 furnished to do so, subject to the following conditions:
00014 
00015 The above copyright notice and this permission notice shall be included in
00016 all copies or substantial portions of the Software.
00017 
00018 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
00019 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
00020 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
00021 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
00022 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
00023 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
00024 THE SOFTWARE.
00025 -----------------------------------------------------------------------------
00026 */
00027 #ifndef _ShaderParameter_
00028 #define _ShaderParameter_
00029 
00030 #include "OgreShaderPrerequisites.h"
00031 #include "OgreGpuProgram.h"
00032 #include "OgreVector2.h"
00033 #include "OgreVector3.h"
00034 #include "OgreVector4.h"
00035 #include "OgreMatrix4.h"
00036 
00037 namespace Ogre {
00038 namespace RTShader {
00039 
00049 class _OgreRTSSExport Parameter : public RTShaderSystemAlloc
00050 {
00051 public:
00052     // Shader parameter semantic.
00053     enum Semantic
00054     {
00056         SPS_UNKNOWN = 0,
00058         SPS_POSITION = 1,
00060         SPS_BLEND_WEIGHTS = 2,
00062         SPS_BLEND_INDICES = 3,
00064         SPS_NORMAL = 4,
00066         SPS_COLOR = 5,      
00068         SPS_TEXTURE_COORDINATES = 7,
00070         SPS_BINORMAL = 8,
00072         SPS_TANGENT = 9     
00073     };
00074 
00075     // Shader parameter content.
00076     enum Content
00077     {
00079         SPC_UNKNOWN,
00080 
00082         SPC_POSITION_OBJECT_SPACE,
00083 
00085         SPC_POSITION_WORLD_SPACE,
00086 
00088         SPC_POSITION_VIEW_SPACE,
00089 
00091         SPC_POSITION_PROJECTIVE_SPACE,
00092 
00094         SPC_POSITION_LIGHT_SPACE0,
00095         SPC_POSITION_LIGHT_SPACE1,
00096         SPC_POSITION_LIGHT_SPACE2,
00097         SPC_POSITION_LIGHT_SPACE3,
00098         SPC_POSITION_LIGHT_SPACE4,
00099         SPC_POSITION_LIGHT_SPACE5,
00100         SPC_POSITION_LIGHT_SPACE6,
00101         SPC_POSITION_LIGHT_SPACE7,
00102 
00104         SPC_NORMAL_OBJECT_SPACE,
00105 
00107         SPC_NORMAL_WORLD_SPACE,
00108 
00110         SPC_NORMAL_VIEW_SPACE,
00111 
00113         SPC_NORMAL_TANGENT_SPACE,
00114 
00116         SPC_POSTOCAMERA_OBJECT_SPACE,
00117 
00119         SPC_POSTOCAMERA_WORLD_SPACE,
00120 
00122         SPC_POSTOCAMERA_VIEW_SPACE,
00123 
00125         SPC_POSTOCAMERA_TANGENT_SPACE,
00126 
00128         SPC_POSTOLIGHT_OBJECT_SPACE0,
00129         SPC_POSTOLIGHT_OBJECT_SPACE1,
00130         SPC_POSTOLIGHT_OBJECT_SPACE2,
00131         SPC_POSTOLIGHT_OBJECT_SPACE3,
00132         SPC_POSTOLIGHT_OBJECT_SPACE4,
00133         SPC_POSTOLIGHT_OBJECT_SPACE5,
00134         SPC_POSTOLIGHT_OBJECT_SPACE6,
00135         SPC_POSTOLIGHT_OBJECT_SPACE7,
00136 
00138         SPC_POSTOLIGHT_WORLD_SPACE0,
00139         SPC_POSTOLIGHT_WORLD_SPACE1,
00140         SPC_POSTOLIGHT_WORLD_SPACE2,
00141         SPC_POSTOLIGHT_WORLD_SPACE3,
00142         SPC_POSTOLIGHT_WORLD_SPACE4,
00143         SPC_POSTOLIGHT_WORLD_SPACE5,
00144         SPC_POSTOLIGHT_WORLD_SPACE6,
00145         SPC_POSTOLIGHT_WORLD_SPACE7,
00146 
00148         SPC_POSTOLIGHT_VIEW_SPACE0,
00149         SPC_POSTOLIGHT_VIEW_SPACE1,
00150         SPC_POSTOLIGHT_VIEW_SPACE2,
00151         SPC_POSTOLIGHT_VIEW_SPACE3,
00152         SPC_POSTOLIGHT_VIEW_SPACE4,
00153         SPC_POSTOLIGHT_VIEW_SPACE5,
00154         SPC_POSTOLIGHT_VIEW_SPACE6,
00155         SPC_POSTOLIGHT_VIEW_SPACE7,
00156 
00158         SPC_POSTOLIGHT_TANGENT_SPACE0,
00159         SPC_POSTOLIGHT_TANGENT_SPACE1,
00160         SPC_POSTOLIGHT_TANGENT_SPACE2,
00161         SPC_POSTOLIGHT_TANGENT_SPACE3,
00162         SPC_POSTOLIGHT_TANGENT_SPACE4,
00163         SPC_POSTOLIGHT_TANGENT_SPACE5,
00164         SPC_POSTOLIGHT_TANGENT_SPACE6,
00165         SPC_POSTOLIGHT_TANGENT_SPACE7,
00166 
00168         SPC_LIGHTDIRECTION_OBJECT_SPACE0,
00169         SPC_LIGHTDIRECTION_OBJECT_SPACE1,
00170         SPC_LIGHTDIRECTION_OBJECT_SPACE2,
00171         SPC_LIGHTDIRECTION_OBJECT_SPACE3,
00172         SPC_LIGHTDIRECTION_OBJECT_SPACE4,
00173         SPC_LIGHTDIRECTION_OBJECT_SPACE5,
00174         SPC_LIGHTDIRECTION_OBJECT_SPACE6,
00175         SPC_LIGHTDIRECTION_OBJECT_SPACE7,
00176 
00178         SPC_LIGHTDIRECTION_WORLD_SPACE0,
00179         SPC_LIGHTDIRECTION_WORLD_SPACE1,
00180         SPC_LIGHTDIRECTION_WORLD_SPACE2,
00181         SPC_LIGHTDIRECTION_WORLD_SPACE3,
00182         SPC_LIGHTDIRECTION_WORLD_SPACE4,
00183         SPC_LIGHTDIRECTION_WORLD_SPACE5,
00184         SPC_LIGHTDIRECTION_WORLD_SPACE6,
00185         SPC_LIGHTDIRECTION_WORLD_SPACE7,
00186 
00188         SPC_LIGHTDIRECTION_VIEW_SPACE0,
00189         SPC_LIGHTDIRECTION_VIEW_SPACE1,
00190         SPC_LIGHTDIRECTION_VIEW_SPACE2,
00191         SPC_LIGHTDIRECTION_VIEW_SPACE3,
00192         SPC_LIGHTDIRECTION_VIEW_SPACE4,
00193         SPC_LIGHTDIRECTION_VIEW_SPACE5,
00194         SPC_LIGHTDIRECTION_VIEW_SPACE6,
00195         SPC_LIGHTDIRECTION_VIEW_SPACE7,
00196 
00198         SPC_LIGHTDIRECTION_TANGENT_SPACE0,
00199         SPC_LIGHTDIRECTION_TANGENT_SPACE1,
00200         SPC_LIGHTDIRECTION_TANGENT_SPACE2,
00201         SPC_LIGHTDIRECTION_TANGENT_SPACE3,
00202         SPC_LIGHTDIRECTION_TANGENT_SPACE4,
00203         SPC_LIGHTDIRECTION_TANGENT_SPACE5,
00204         SPC_LIGHTDIRECTION_TANGENT_SPACE6,
00205         SPC_LIGHTDIRECTION_TANGENT_SPACE7,
00206 
00208         SPC_LIGHTPOSITION_OBJECT_SPACE0,
00209         SPC_LIGHTPOSITION_OBJECT_SPACE1,
00210         SPC_LIGHTPOSITION_OBJECT_SPACE2,
00211         SPC_LIGHTPOSITION_OBJECT_SPACE3,
00212         SPC_LIGHTPOSITION_OBJECT_SPACE4,
00213         SPC_LIGHTPOSITION_OBJECT_SPACE5,
00214         SPC_LIGHTPOSITION_OBJECT_SPACE6,
00215         SPC_LIGHTPOSITION_OBJECT_SPACE7,
00216 
00218         SPC_LIGHTPOSITION_WORLD_SPACE0,
00219         SPC_LIGHTPOSITION_WORLD_SPACE1,
00220         SPC_LIGHTPOSITION_WORLD_SPACE2,
00221         SPC_LIGHTPOSITION_WORLD_SPACE3,
00222         SPC_LIGHTPOSITION_WORLD_SPACE4,
00223         SPC_LIGHTPOSITION_WORLD_SPACE5,
00224         SPC_LIGHTPOSITION_WORLD_SPACE6,
00225         SPC_LIGHTPOSITION_WORLD_SPACE7,
00226 
00228         SPC_LIGHTPOSITIONVIEW_SPACE0,
00229         SPC_LIGHTPOSITIONVIEW_SPACE1,
00230         SPC_LIGHTPOSITIONVIEW_SPACE2,
00231         SPC_LIGHTPOSITIONVIEW_SPACE3,
00232         SPC_LIGHTPOSITIONVIEW_SPACE4,
00233         SPC_LIGHTPOSITIONVIEW_SPACE5,
00234         SPC_LIGHTPOSITIONVIEW_SPACE6,
00235         SPC_LIGHTPOSITIONVIEW_SPACE7,
00236 
00238         SPC_LIGHTPOSITION_TANGENT_SPACE,
00239 
00241         SPC_BLEND_WEIGHTS,
00242 
00244         SPC_BLEND_INDICES,
00245         
00247         SPC_TANGENT_OBJECT_SPACE,
00248 
00250         SPC_TANGENT_WORLD_SPACE,
00251 
00253         SPC_TANGENT_VIEW_SPACE,
00254 
00256         SPC_TANGENT_TANGENT_SPACE,
00257 
00259         SPC_BINORMAL_OBJECT_SPACE,
00260 
00262         SPC_BINORMAL_WORLD_SPACE,
00263 
00265         SPC_BINORMAL_VIEW_SPACE,
00266 
00268         SPC_BINORMAL_TANGENT_SPACE,
00269 
00271         SPC_COLOR_DIFFUSE,
00272 
00274         SPC_COLOR_SPECULAR,
00275 
00277         SPC_DEPTH_OBJECT_SPACE,
00278 
00280         SPC_DEPTH_WORLD_SPACE,
00281 
00283         SPC_DEPTH_VIEW_SPACE,
00284 
00286         SPC_DEPTH_PROJECTIVE_SPACE,
00287 
00289         SPC_TEXTURE_COORDINATE0,        
00290         SPC_TEXTURE_COORDINATE1,        
00291         SPC_TEXTURE_COORDINATE2,        
00292         SPC_TEXTURE_COORDINATE3,    
00293         SPC_TEXTURE_COORDINATE4,
00294         SPC_TEXTURE_COORDINATE5,
00295         SPC_TEXTURE_COORDINATE6,
00296         SPC_TEXTURE_COORDINATE7,
00297 
00299         SPC_CUSTOM_CONTENT_BEGIN    = 1000,
00300         SPC_CUSTOM_CONTENT_END      = 2000
00301     };
00302 
00303 // Interface.
00304 public:
00306     Parameter() {}
00307 
00316     Parameter(GpuConstantType type, const String& name, 
00317         const Semantic& semantic, int index, 
00318         const Content& content, size_t size = 0);
00319 
00321     virtual ~Parameter() {};
00322 
00324     const String&           getName                         () const { return mName; }
00325 
00327     GpuConstantType         getType                         () const { return mType; }
00328 
00330     const Semantic&         getSemantic                     () const { return mSemantic; }
00331 
00333     int                     getIndex                        () const { return mIndex; } 
00334 
00336     Content                 getContent                          () const { return mContent; }
00337 
00339     virtual bool            isConstParameter                    () const { return false; }
00340 
00342     virtual String          toString                            () const { return mName; }
00343     
00345     bool                    isArray                             () const { return mSize > 0; }
00346 
00348     size_t                  getSize                             () const { return mSize; }
00349     
00351     void                    setSize                             (size_t size) { mSize = size; }
00352 
00353 // Attributes.
00354 protected:
00355     String                                  mName;                  // Name of this parameter.
00356     GpuConstantType                         mType;                  // Type of this parameter.
00357     Semantic                                mSemantic;              // Semantic of this parameter.
00358     int                                     mIndex;                 // Index of this parameter.
00359     Content                                 mContent;               // The content of this parameter.
00360     size_t                                  mSize;                  // Number of elements in the parameter (for arrays)
00361     
00362 };
00363 
00364 typedef SharedPtr<Parameter>                    ParameterPtr; 
00365 typedef vector<ParameterPtr>::type              ShaderParameterList;
00366 typedef ShaderParameterList::iterator           ShaderParameterIterator;
00367 typedef ShaderParameterList::const_iterator     ShaderParameterConstIterator;
00368 
00371 class UniformParameter : public Parameter
00372 {
00373 public:
00374 
00384     UniformParameter(GpuConstantType type, const String& name, 
00385         const Semantic& semantic, int index, 
00386         const Content& content,
00387         uint16 variability, size_t size);
00388 
00394     UniformParameter(GpuProgramParameters::AutoConstantType autoType, Real fAutoConstantData, size_t size);
00395     
00402     UniformParameter(GpuProgramParameters::AutoConstantType autoType, Real fAutoConstantData, size_t size, GpuConstantType type);
00403 
00409     UniformParameter(GpuProgramParameters::AutoConstantType autoType, size_t nAutoConstantData, size_t size);
00410     
00417     UniformParameter(GpuProgramParameters::AutoConstantType autoType, size_t nAutoConstantData, size_t size, GpuConstantType type);
00418 
00419     
00421     size_t                  getAutoConstantIntData          () const { return mAutoConstantIntData; }   
00422 
00424     Real                    getAutoConstantRealData         () const { return mAutoConstantRealData; }  
00425 
00427     bool                    isFloat                         () const;
00428 
00430     bool                    isSampler                       () const;
00431 
00433     bool                    isAutoConstantParameter             () const { return mIsAutoConstantReal || mIsAutoConstantInt; }
00434 
00436     bool                    isAutoConstantIntParameter          () const { return mIsAutoConstantInt; }
00437 
00439     bool                    isAutoConstantRealParameter         () const { return mIsAutoConstantReal; }
00440 
00442     GpuProgramParameters::AutoConstantType getAutoConstantType  () const { return mAutoConstantType; }
00443 
00445     uint16                  getVariability                      () const { return mVariability; }
00446 
00448     void                    bind                                (GpuProgramParametersSharedPtr paramsPtr);
00449 
00450 public:
00451 
00453     void setGpuParameter(int val)
00454     { 
00455         if (mParamsPtr != NULL)
00456         {
00457             mParamsPtr->_writeRawConstant(mPhysicalIndex, val);
00458         }
00459     }
00460 
00462     void setGpuParameter(Real val)  
00463     { 
00464         if (mParamsPtr != NULL)
00465         {
00466             mParamsPtr->_writeRawConstant(mPhysicalIndex, val);
00467         }
00468     }
00469 
00471     void setGpuParameter(const ColourValue& val)  
00472     { 
00473         if (mParamsPtr != NULL)
00474         {
00475             mParamsPtr->_writeRawConstant(mPhysicalIndex, val);
00476         }
00477     }
00478 
00480     void setGpuParameter(const Vector2& val)  
00481     { 
00482         if (mParamsPtr != NULL)
00483         {
00484             mParamsPtr->_writeRawConstants(mPhysicalIndex, val.ptr(), 2);
00485         }
00486     }
00487     
00489     void setGpuParameter(const Vector3& val)  
00490     { 
00491         if (mParamsPtr != NULL)
00492         {
00493             mParamsPtr->_writeRawConstant(mPhysicalIndex, val);
00494         }
00495     }
00496 
00498     void setGpuParameter(const Vector4& val)  
00499     { 
00500         if (mParamsPtr != NULL)
00501         {
00502             mParamsPtr->_writeRawConstant(mPhysicalIndex, val);     
00503         }
00504     }
00505 
00507     void setGpuParameter(const Matrix4& val)  
00508     { 
00509         if (mParamsPtr != NULL)
00510         {
00511             mParamsPtr->_writeRawConstant(mPhysicalIndex, val, 16);
00512         }
00513     }
00514 
00516     void setGpuParameter(const float *val, size_t count, size_t multiple = 4)  
00517     { 
00518         if (mParamsPtr != NULL)
00519         {
00520             mParamsPtr->_writeRawConstants(mPhysicalIndex, val, count * multiple);
00521         }
00522     }
00523 
00525     void setGpuParameter(const double *val, size_t count, size_t multiple = 4)  
00526     { 
00527         if (mParamsPtr != NULL)
00528         {
00529             mParamsPtr->_writeRawConstants(mPhysicalIndex, val, count * multiple);
00530         }
00531     }
00532 
00534     void setGpuParameter(const int *val, size_t count, size_t multiple = 4)  
00535     { 
00536         if (mParamsPtr != NULL)
00537         {
00538             mParamsPtr->_writeRawConstants(mPhysicalIndex, val, count * multiple);
00539         }
00540     }
00541 
00542 protected:
00543     bool                                    mIsAutoConstantReal;    // Is it auto constant real based parameter.
00544     bool                                    mIsAutoConstantInt;     // Is it auto constant int based parameter.
00545     GpuProgramParameters::AutoConstantType  mAutoConstantType;      // The auto constant type of this parameter.
00546     union
00547     {
00548         size_t  mAutoConstantIntData;                               // Auto constant int data.
00549         Real    mAutoConstantRealData;                              // Auto constant real data.
00550     };      
00551     uint16                                  mVariability;           // How this parameter varies (bitwise combination of GpuProgramVariability).
00552     GpuProgramParameters*                   mParamsPtr;             // The actual GPU parameters pointer.
00553     size_t                                  mPhysicalIndex;         // The physical index of this parameter in the GPU program.
00554 };
00555 
00556 typedef SharedPtr<UniformParameter>             UniformParameterPtr; 
00557 typedef vector<UniformParameterPtr>::type       UniformParameterList;
00558 typedef UniformParameterList::iterator          UniformParameterIterator;
00559 typedef UniformParameterList::const_iterator    UniformParameterConstIterator;
00560 
00563 template <class valueType>
00564 class ConstParameter : public Parameter
00565 {
00566 public:
00567 
00568     ConstParameter( valueType val, 
00569         GpuConstantType type, 
00570         const Semantic& semantic,  
00571         const Content& content) 
00572         : Parameter(type, "Constant", semantic, 0, content)
00573     {
00574         mValue = val;
00575     }
00576 
00577     virtual             ~ConstParameter     () {}
00578 
00580     const valueType&    getValue            () const { return mValue; }
00581 
00585     virtual bool        isConstParameter    () const { return true; }
00586 
00590     virtual String      toString            () const = 0;
00591 
00592 protected:
00593     valueType mValue;
00594 };
00595 
00598 class _OgreRTSSExport ParameterFactory
00599 {
00600 
00601     // Interface.
00602 public:
00603 
00604     static ParameterPtr createInPosition        (int index);    
00605     static ParameterPtr createOutPosition       (int index);
00606 
00607     static ParameterPtr createInNormal          (int index);
00608     static ParameterPtr createInWeights         (int index);
00609     static ParameterPtr createInIndices         (int index);
00610     static ParameterPtr createOutNormal         (int index);
00611     static ParameterPtr createInBiNormal        (int index);
00612     static ParameterPtr createOutBiNormal       (int index);
00613     static ParameterPtr createInTangent         (int index);
00614     static ParameterPtr createOutTangent        (int index);
00615     static ParameterPtr createInColor           (int index);
00616     static ParameterPtr createOutColor          (int index);
00617 
00618     static ParameterPtr createInTexcoord        (GpuConstantType type, int index, Parameter::Content content);
00619     static ParameterPtr createOutTexcoord       (GpuConstantType type, int index, Parameter::Content content);
00620     static ParameterPtr createInTexcoord1       (int index, Parameter::Content content);
00621     static ParameterPtr createOutTexcoord1      (int index, Parameter::Content content);
00622     static ParameterPtr createInTexcoord2       (int index, Parameter::Content content);
00623     static ParameterPtr createOutTexcoord2      (int index, Parameter::Content content);
00624     static ParameterPtr createInTexcoord3       (int index, Parameter::Content content);
00625     static ParameterPtr createOutTexcoord3      (int index, Parameter::Content content);
00626     static ParameterPtr createInTexcoord4       (int index, Parameter::Content content);            
00627     static ParameterPtr createOutTexcoord4      (int index, Parameter::Content content);
00628 
00629     static ParameterPtr createConstParamVector2 (Vector2 val);
00630     static ParameterPtr createConstParamVector3 (Vector3 val);
00631     static ParameterPtr createConstParamVector4 (Vector4 val);
00632     static ParameterPtr createConstParamFloat   (float val);    
00633 
00634     static UniformParameterPtr  createSampler           (GpuConstantType type, int index);
00635     static UniformParameterPtr  createSampler1D         (int index);
00636     static UniformParameterPtr  createSampler2D         (int index);
00637     static UniformParameterPtr  createSampler2DArray    (int index);
00638     static UniformParameterPtr  createSampler3D         (int index);
00639     static UniformParameterPtr  createSamplerCUBE       (int index);    
00640 
00641     static UniformParameterPtr  createUniform           (GpuConstantType type,  int index, uint16 variability, const String& suggestedName, size_t size);
00642 };
00643 
00644 
00645 
00649 }
00650 }
00651 
00652 #endif

Copyright © 2012 Torus Knot Software Ltd
Creative Commons License
This work is licensed under a Creative Commons Attribution-ShareAlike 3.0 Unported License.
Last modified Fri May 25 23:36:27 2012