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 00009 Permission is hereby granted, free of charge, to any person obtaining a copy 00010 of this software and associated documentation files (the "Software"), to deal 00011 in the Software without restriction, including without limitation the rights 00012 to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 00013 copies of the Software, and to permit persons to whom the Software is 00014 furnished to do so, subject to the following conditions: 00015 00016 The above copyright notice and this permission notice shall be included in 00017 all copies or substantial portions of the Software. 00018 00019 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 00020 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 00021 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 00022 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 00023 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 00024 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 00025 THE SOFTWARE. 00026 ----------------------------------------------------------------------------- 00027 */ 00028 #ifndef __GpuProgramParams_H_ 00029 #define __GpuProgramParams_H_ 00030 00031 // Precompiler options 00032 #include "OgrePrerequisites.h" 00033 #include "OgreSharedPtr.h" 00034 #include "OgreIteratorWrappers.h" 00035 #include "OgreSerializer.h" 00036 #include "OgreRenderOperation.h" 00037 #include "OgreAny.h" 00038 00039 namespace Ogre { 00040 00052 enum GpuConstantType 00053 { 00054 GCT_FLOAT1 = 1, 00055 GCT_FLOAT2 = 2, 00056 GCT_FLOAT3 = 3, 00057 GCT_FLOAT4 = 4, 00058 GCT_SAMPLER1D = 5, 00059 GCT_SAMPLER2D = 6, 00060 GCT_SAMPLER3D = 7, 00061 GCT_SAMPLERCUBE = 8, 00062 GCT_SAMPLER1DSHADOW = 9, 00063 GCT_SAMPLER2DSHADOW = 10, 00064 GCT_SAMPLER2DARRAY = 11, 00065 GCT_MATRIX_2X2 = 12, 00066 GCT_MATRIX_2X3 = 13, 00067 GCT_MATRIX_2X4 = 14, 00068 GCT_MATRIX_3X2 = 15, 00069 GCT_MATRIX_3X3 = 16, 00070 GCT_MATRIX_3X4 = 17, 00071 GCT_MATRIX_4X2 = 18, 00072 GCT_MATRIX_4X3 = 19, 00073 GCT_MATRIX_4X4 = 20, 00074 GCT_INT1 = 21, 00075 GCT_INT2 = 22, 00076 GCT_INT3 = 23, 00077 GCT_INT4 = 24, 00078 GCT_UNKNOWN = 99 00079 }; 00080 00084 enum GpuParamVariability 00085 { 00087 GPV_GLOBAL = 1, 00089 GPV_PER_OBJECT = 2, 00091 GPV_LIGHTS = 4, 00093 GPV_PASS_ITERATION_NUMBER = 8, 00094 00095 00097 GPV_ALL = 0xFFFF 00098 00099 }; 00100 00105 struct _OgreExport GpuConstantDefinition 00106 { 00108 GpuConstantType constType; 00110 size_t physicalIndex; 00112 size_t logicalIndex; 00115 size_t elementSize; 00117 size_t arraySize; 00119 mutable uint16 variability; 00120 00121 bool isFloat() const 00122 { 00123 return isFloat(constType); 00124 } 00125 00126 static bool isFloat(GpuConstantType c) 00127 { 00128 switch(c) 00129 { 00130 case GCT_INT1: 00131 case GCT_INT2: 00132 case GCT_INT3: 00133 case GCT_INT4: 00134 case GCT_SAMPLER1D: 00135 case GCT_SAMPLER2D: 00136 case GCT_SAMPLER2DARRAY: 00137 case GCT_SAMPLER3D: 00138 case GCT_SAMPLERCUBE: 00139 case GCT_SAMPLER1DSHADOW: 00140 case GCT_SAMPLER2DSHADOW: 00141 return false; 00142 default: 00143 return true; 00144 }; 00145 00146 } 00147 00148 bool isSampler() const 00149 { 00150 return isSampler(constType); 00151 } 00152 00153 static bool isSampler(GpuConstantType c) 00154 { 00155 switch(c) 00156 { 00157 case GCT_SAMPLER1D: 00158 case GCT_SAMPLER2D: 00159 case GCT_SAMPLER2DARRAY: 00160 case GCT_SAMPLER3D: 00161 case GCT_SAMPLERCUBE: 00162 case GCT_SAMPLER1DSHADOW: 00163 case GCT_SAMPLER2DSHADOW: 00164 return true; 00165 default: 00166 return false; 00167 }; 00168 00169 } 00170 00171 00175 static size_t getElementSize(GpuConstantType ctype, bool padToMultiplesOf4) 00176 { 00177 if (padToMultiplesOf4) 00178 { 00179 switch(ctype) 00180 { 00181 case GCT_FLOAT1: 00182 case GCT_INT1: 00183 case GCT_SAMPLER1D: 00184 case GCT_SAMPLER2D: 00185 case GCT_SAMPLER2DARRAY: 00186 case GCT_SAMPLER3D: 00187 case GCT_SAMPLERCUBE: 00188 case GCT_SAMPLER1DSHADOW: 00189 case GCT_SAMPLER2DSHADOW: 00190 case GCT_FLOAT2: 00191 case GCT_INT2: 00192 case GCT_FLOAT3: 00193 case GCT_INT3: 00194 case GCT_FLOAT4: 00195 case GCT_INT4: 00196 return 4; 00197 case GCT_MATRIX_2X2: 00198 case GCT_MATRIX_2X3: 00199 case GCT_MATRIX_2X4: 00200 return 8; // 2 float4s 00201 case GCT_MATRIX_3X2: 00202 case GCT_MATRIX_3X3: 00203 case GCT_MATRIX_3X4: 00204 return 12; // 3 float4s 00205 case GCT_MATRIX_4X2: 00206 case GCT_MATRIX_4X3: 00207 case GCT_MATRIX_4X4: 00208 return 16; // 4 float4s 00209 default: 00210 return 4; 00211 }; 00212 } 00213 else 00214 { 00215 switch(ctype) 00216 { 00217 case GCT_FLOAT1: 00218 case GCT_INT1: 00219 case GCT_SAMPLER1D: 00220 case GCT_SAMPLER2D: 00221 case GCT_SAMPLER2DARRAY: 00222 case GCT_SAMPLER3D: 00223 case GCT_SAMPLERCUBE: 00224 case GCT_SAMPLER1DSHADOW: 00225 case GCT_SAMPLER2DSHADOW: 00226 return 1; 00227 case GCT_FLOAT2: 00228 case GCT_INT2: 00229 return 2; 00230 case GCT_FLOAT3: 00231 case GCT_INT3: 00232 return 3; 00233 case GCT_FLOAT4: 00234 case GCT_INT4: 00235 return 4; 00236 case GCT_MATRIX_2X2: 00237 return 4; 00238 case GCT_MATRIX_2X3: 00239 case GCT_MATRIX_3X2: 00240 return 6; 00241 case GCT_MATRIX_2X4: 00242 case GCT_MATRIX_4X2: 00243 return 8; 00244 case GCT_MATRIX_3X3: 00245 return 9; 00246 case GCT_MATRIX_3X4: 00247 case GCT_MATRIX_4X3: 00248 return 12; 00249 case GCT_MATRIX_4X4: 00250 return 16; 00251 default: 00252 return 4; 00253 }; 00254 00255 } 00256 } 00257 00258 GpuConstantDefinition() 00259 : constType(GCT_UNKNOWN) 00260 , physicalIndex((std::numeric_limits<size_t>::max)()) 00261 , logicalIndex(0) 00262 , elementSize(0) 00263 , arraySize(1) 00264 , variability(GPV_GLOBAL) {} 00265 }; 00266 typedef map<String, GpuConstantDefinition>::type GpuConstantDefinitionMap; 00267 typedef ConstMapIterator<GpuConstantDefinitionMap> GpuConstantDefinitionIterator; 00268 00270 struct _OgreExport GpuNamedConstants : public GpuParamsAlloc 00271 { 00273 size_t floatBufferSize; 00275 size_t intBufferSize; 00277 GpuConstantDefinitionMap map; 00278 00279 GpuNamedConstants() : floatBufferSize(0), intBufferSize(0) {} 00280 00292 void generateConstantDefinitionArrayEntries(const String& paramName, 00293 const GpuConstantDefinition& baseDef); 00294 00296 static bool getGenerateAllConstantDefinitionArrayEntries(); 00297 00304 static void setGenerateAllConstantDefinitionArrayEntries(bool generateAll); 00305 00309 void save(const String& filename) const; 00313 void load(DataStreamPtr& stream); 00314 00315 protected: 00322 static bool msGenerateAllConstantDefinitionArrayEntries; 00323 }; 00324 typedef SharedPtr<GpuNamedConstants> GpuNamedConstantsPtr; 00325 00327 class _OgreExport GpuNamedConstantsSerializer : public Serializer 00328 { 00329 public: 00330 GpuNamedConstantsSerializer(); 00331 virtual ~GpuNamedConstantsSerializer(); 00332 void exportNamedConstants(const GpuNamedConstants* pConsts, const String& filename, 00333 Endian endianMode = ENDIAN_NATIVE); 00334 void exportNamedConstants(const GpuNamedConstants* pConsts, DataStreamPtr stream, 00335 Endian endianMode = ENDIAN_NATIVE); 00336 void importNamedConstants(DataStreamPtr& stream, GpuNamedConstants* pDest); 00337 }; 00338 00342 struct _OgreExport GpuLogicalIndexUse 00343 { 00345 size_t physicalIndex; 00347 size_t currentSize; 00349 mutable uint16 variability; 00350 00351 GpuLogicalIndexUse() 00352 : physicalIndex(99999), currentSize(0), variability(GPV_GLOBAL) {} 00353 GpuLogicalIndexUse(size_t bufIdx, size_t curSz, uint16 v) 00354 : physicalIndex(bufIdx), currentSize(curSz), variability(v) {} 00355 }; 00356 typedef map<size_t, GpuLogicalIndexUse>::type GpuLogicalIndexUseMap; 00358 struct _OgreExport GpuLogicalBufferStruct : public GpuParamsAlloc 00359 { 00360 OGRE_MUTEX(mutex) 00362 GpuLogicalIndexUseMap map; 00364 size_t bufferSize; 00365 GpuLogicalBufferStruct() : bufferSize(0) {} 00366 }; 00367 typedef SharedPtr<GpuLogicalBufferStruct> GpuLogicalBufferStructPtr; 00368 00373 typedef vector<float>::type FloatConstantList; 00378 typedef vector<int>::type IntConstantList; 00379 00395 class _OgreExport GpuSharedParameters : public GpuParamsAlloc 00396 { 00397 protected: 00398 GpuNamedConstants mNamedConstants; 00399 FloatConstantList mFloatConstants; 00400 IntConstantList mIntConstants; 00401 String mName; 00402 00403 // Optional data the rendersystem might want to store 00404 mutable Any mRenderSystemData; 00405 00407 size_t mFrameLastUpdated; 00408 00410 unsigned long mVersion; 00411 00412 public: 00413 GpuSharedParameters(const String& name); 00414 virtual ~GpuSharedParameters(); 00415 00417 const String& getName() { return mName; } 00418 00426 void addConstantDefinition(const String& name, GpuConstantType constType, size_t arraySize = 1); 00427 00430 void removeConstantDefinition(const String& name); 00431 00434 void removeAllConstantDefinitions(); 00435 00439 unsigned long getVersion() const { return mVersion; } 00440 00446 void _markDirty(); 00448 size_t getFrameLastUpdated() const { return mFrameLastUpdated; } 00449 00453 GpuConstantDefinitionIterator getConstantDefinitionIterator(void) const; 00454 00457 const GpuConstantDefinition& getConstantDefinition(const String& name) const; 00458 00461 const GpuNamedConstants& getConstantDefinitions() const; 00462 00464 void setNamedConstant(const String& name, Real val); 00466 void setNamedConstant(const String& name, int val); 00468 void setNamedConstant(const String& name, const Vector4& vec); 00470 void setNamedConstant(const String& name, const Vector3& vec); 00472 void setNamedConstant(const String& name, const Matrix4& m); 00474 void setNamedConstant(const String& name, const Matrix4* m, size_t numEntries); 00476 void setNamedConstant(const String& name, const float *val, size_t count); 00478 void setNamedConstant(const String& name, const double *val, size_t count); 00480 void setNamedConstant(const String& name, const ColourValue& colour); 00482 void setNamedConstant(const String& name, const int *val, size_t count); 00483 00485 float* getFloatPointer(size_t pos) { _markDirty(); return &mFloatConstants[pos]; } 00487 const float* getFloatPointer(size_t pos) const { return &mFloatConstants[pos]; } 00489 int* getIntPointer(size_t pos) { _markDirty(); return &mIntConstants[pos]; } 00491 const int* getIntPointer(size_t pos) const { return &mIntConstants[pos]; } 00492 00493 00495 void _setRenderSystemData(const Any& data) const { mRenderSystemData = data; } 00497 const Any& _getRenderSystemData() const { return mRenderSystemData; } 00498 00499 }; 00500 00502 typedef SharedPtr<GpuSharedParameters> GpuSharedParametersPtr; 00503 00504 class GpuProgramParameters; 00505 00509 class _OgreExport GpuSharedParametersUsage : public GpuParamsAlloc 00510 { 00511 protected: 00512 GpuSharedParametersPtr mSharedParams; 00513 // Not a shared pointer since this is also parent 00514 GpuProgramParameters* mParams; 00515 // list of physical mappings that we are going to bring in 00516 struct CopyDataEntry 00517 { 00518 const GpuConstantDefinition* srcDefinition; 00519 const GpuConstantDefinition* dstDefinition; 00520 }; 00521 typedef vector<CopyDataEntry>::type CopyDataList; 00522 00523 CopyDataList mCopyDataList; 00524 00525 // Optional data the rendersystem might want to store 00526 mutable Any mRenderSystemData; 00527 00529 unsigned long mCopyDataVersion; 00530 00531 void initCopyData(); 00532 00533 00534 public: 00536 GpuSharedParametersUsage(GpuSharedParametersPtr sharedParams, 00537 GpuProgramParameters* params); 00538 00546 void _copySharedParamsToTargetParams(); 00547 00549 const String& getName() const { return mSharedParams->getName(); } 00550 00551 GpuSharedParametersPtr getSharedParams() const { return mSharedParams; } 00552 GpuProgramParameters* getTargetParams() const { return mParams; } 00553 00555 void _setRenderSystemData(const Any& data) const { mRenderSystemData = data; } 00557 const Any& _getRenderSystemData() const { return mRenderSystemData; } 00558 00559 00560 }; 00561 00592 class _OgreExport GpuProgramParameters : public GpuParamsAlloc 00593 { 00594 public: 00598 enum AutoConstantType 00599 { 00601 ACT_WORLD_MATRIX, 00603 ACT_INVERSE_WORLD_MATRIX, 00607 ACT_TRANSPOSE_WORLD_MATRIX, 00609 ACT_INVERSE_TRANSPOSE_WORLD_MATRIX, 00610 00612 ACT_WORLD_MATRIX_ARRAY_3x4, 00614 ACT_WORLD_MATRIX_ARRAY, 00616 ACT_WORLD_DUALQUATERNION_ARRAY_2x4, 00618 ACT_WORLD_SCALE_SHEAR_MATRIX_ARRAY_3x4, 00619 00621 ACT_VIEW_MATRIX, 00623 ACT_INVERSE_VIEW_MATRIX, 00627 ACT_TRANSPOSE_VIEW_MATRIX, 00631 ACT_INVERSE_TRANSPOSE_VIEW_MATRIX, 00632 00633 00635 ACT_PROJECTION_MATRIX, 00639 ACT_INVERSE_PROJECTION_MATRIX, 00643 ACT_TRANSPOSE_PROJECTION_MATRIX, 00647 ACT_INVERSE_TRANSPOSE_PROJECTION_MATRIX, 00648 00649 00651 ACT_VIEWPROJ_MATRIX, 00655 ACT_INVERSE_VIEWPROJ_MATRIX, 00659 ACT_TRANSPOSE_VIEWPROJ_MATRIX, 00663 ACT_INVERSE_TRANSPOSE_VIEWPROJ_MATRIX, 00664 00665 00667 ACT_WORLDVIEW_MATRIX, 00669 ACT_INVERSE_WORLDVIEW_MATRIX, 00673 ACT_TRANSPOSE_WORLDVIEW_MATRIX, 00675 ACT_INVERSE_TRANSPOSE_WORLDVIEW_MATRIX, 00677 00678 00680 ACT_WORLDVIEWPROJ_MATRIX, 00684 ACT_INVERSE_WORLDVIEWPROJ_MATRIX, 00688 ACT_TRANSPOSE_WORLDVIEWPROJ_MATRIX, 00692 ACT_INVERSE_TRANSPOSE_WORLDVIEWPROJ_MATRIX, 00693 00694 00696 00699 ACT_RENDER_TARGET_FLIPPING, 00700 00703 ACT_VERTEX_WINDING, 00704 00706 ACT_FOG_COLOUR, 00708 ACT_FOG_PARAMS, 00709 00710 00712 ACT_SURFACE_AMBIENT_COLOUR, 00714 ACT_SURFACE_DIFFUSE_COLOUR, 00716 ACT_SURFACE_SPECULAR_COLOUR, 00718 ACT_SURFACE_EMISSIVE_COLOUR, 00720 ACT_SURFACE_SHININESS, 00721 00722 00724 ACT_LIGHT_COUNT, 00725 00726 00728 ACT_AMBIENT_LIGHT_COLOUR, 00729 00731 ACT_LIGHT_DIFFUSE_COLOUR, 00733 ACT_LIGHT_SPECULAR_COLOUR, 00735 ACT_LIGHT_ATTENUATION, 00741 ACT_SPOTLIGHT_PARAMS, 00743 ACT_LIGHT_POSITION, 00745 ACT_LIGHT_POSITION_OBJECT_SPACE, 00747 ACT_LIGHT_POSITION_VIEW_SPACE, 00749 ACT_LIGHT_DIRECTION, 00751 ACT_LIGHT_DIRECTION_OBJECT_SPACE, 00753 ACT_LIGHT_DIRECTION_VIEW_SPACE, 00758 ACT_LIGHT_DISTANCE_OBJECT_SPACE, 00760 ACT_LIGHT_POWER_SCALE, 00762 ACT_LIGHT_DIFFUSE_COLOUR_POWER_SCALED, 00764 ACT_LIGHT_SPECULAR_COLOUR_POWER_SCALED, 00766 ACT_LIGHT_DIFFUSE_COLOUR_ARRAY, 00768 ACT_LIGHT_SPECULAR_COLOUR_ARRAY, 00770 ACT_LIGHT_DIFFUSE_COLOUR_POWER_SCALED_ARRAY, 00772 ACT_LIGHT_SPECULAR_COLOUR_POWER_SCALED_ARRAY, 00774 ACT_LIGHT_ATTENUATION_ARRAY, 00776 ACT_LIGHT_POSITION_ARRAY, 00778 ACT_LIGHT_POSITION_OBJECT_SPACE_ARRAY, 00780 ACT_LIGHT_POSITION_VIEW_SPACE_ARRAY, 00782 ACT_LIGHT_DIRECTION_ARRAY, 00784 ACT_LIGHT_DIRECTION_OBJECT_SPACE_ARRAY, 00786 ACT_LIGHT_DIRECTION_VIEW_SPACE_ARRAY, 00791 ACT_LIGHT_DISTANCE_OBJECT_SPACE_ARRAY, 00795 ACT_LIGHT_POWER_SCALE_ARRAY, 00802 ACT_SPOTLIGHT_PARAMS_ARRAY, 00803 00808 ACT_DERIVED_AMBIENT_LIGHT_COLOUR, 00813 ACT_DERIVED_SCENE_COLOUR, 00814 00820 ACT_DERIVED_LIGHT_DIFFUSE_COLOUR, 00826 ACT_DERIVED_LIGHT_SPECULAR_COLOUR, 00827 00829 ACT_DERIVED_LIGHT_DIFFUSE_COLOUR_ARRAY, 00831 ACT_DERIVED_LIGHT_SPECULAR_COLOUR_ARRAY, 00838 ACT_LIGHT_NUMBER, 00840 ACT_LIGHT_CASTS_SHADOWS, 00841 00842 00846 ACT_SHADOW_EXTRUSION_DISTANCE, 00848 ACT_CAMERA_POSITION, 00850 ACT_CAMERA_POSITION_OBJECT_SPACE, 00852 ACT_TEXTURE_VIEWPROJ_MATRIX, 00854 ACT_TEXTURE_VIEWPROJ_MATRIX_ARRAY, 00858 ACT_TEXTURE_WORLDVIEWPROJ_MATRIX, 00860 ACT_TEXTURE_WORLDVIEWPROJ_MATRIX_ARRAY, 00862 ACT_SPOTLIGHT_VIEWPROJ_MATRIX, 00864 ACT_SPOTLIGHT_VIEWPROJ_MATRIX_ARRAY, 00868 ACT_SPOTLIGHT_WORLDVIEWPROJ_MATRIX, 00870 ACT_CUSTOM, 00873 ACT_TIME, 00877 ACT_TIME_0_X, 00879 ACT_COSTIME_0_X, 00881 ACT_SINTIME_0_X, 00883 ACT_TANTIME_0_X, 00887 ACT_TIME_0_X_PACKED, 00892 ACT_TIME_0_1, 00894 ACT_COSTIME_0_1, 00896 ACT_SINTIME_0_1, 00898 ACT_TANTIME_0_1, 00902 ACT_TIME_0_1_PACKED, 00907 ACT_TIME_0_2PI, 00909 ACT_COSTIME_0_2PI, 00911 ACT_SINTIME_0_2PI, 00913 ACT_TANTIME_0_2PI, 00917 ACT_TIME_0_2PI_PACKED, 00919 ACT_FRAME_TIME, 00921 ACT_FPS, 00923 00926 ACT_VIEWPORT_WIDTH, 00930 ACT_VIEWPORT_HEIGHT, 00934 ACT_INVERSE_VIEWPORT_WIDTH, 00938 ACT_INVERSE_VIEWPORT_HEIGHT, 00942 ACT_VIEWPORT_SIZE, 00943 00945 00948 ACT_VIEW_DIRECTION, 00952 ACT_VIEW_SIDE_VECTOR, 00956 ACT_VIEW_UP_VECTOR, 00960 ACT_FOV, 00964 ACT_NEAR_CLIP_DISTANCE, 00968 ACT_FAR_CLIP_DISTANCE, 00969 00973 ACT_PASS_NUMBER, 00974 00979 ACT_PASS_ITERATION_NUMBER, 00980 00981 00985 ACT_ANIMATION_PARAMETRIC, 00986 00992 ACT_TEXEL_OFFSETS, 00993 00998 ACT_SCENE_DEPTH_RANGE, 00999 01005 ACT_SHADOW_SCENE_DEPTH_RANGE, 01006 01010 ACT_SHADOW_COLOUR, 01014 ACT_TEXTURE_SIZE, 01018 ACT_INVERSE_TEXTURE_SIZE, 01022 ACT_PACKED_TEXTURE_SIZE, 01023 01027 ACT_TEXTURE_MATRIX, 01028 01034 ACT_LOD_CAMERA_POSITION, 01040 ACT_LOD_CAMERA_POSITION_OBJECT_SPACE, 01042 ACT_LIGHT_CUSTOM 01043 }; 01044 01048 enum ACDataType { 01050 ACDT_NONE, 01052 ACDT_INT, 01054 ACDT_REAL 01055 }; 01056 01059 enum ElementType { 01060 ET_INT, 01061 ET_REAL 01062 }; 01063 01067 struct AutoConstantDefinition 01068 { 01069 AutoConstantType acType; 01070 String name; 01071 size_t elementCount; 01073 ElementType elementType; 01075 ACDataType dataType; 01076 01077 AutoConstantDefinition(AutoConstantType _acType, const String& _name, 01078 size_t _elementCount, ElementType _elementType, 01079 ACDataType _dataType) 01080 :acType(_acType), name(_name), elementCount(_elementCount), 01081 elementType(_elementType), dataType(_dataType) 01082 { 01083 01084 } 01085 }; 01086 01088 class AutoConstantEntry 01089 { 01090 public: 01092 AutoConstantType paramType; 01094 size_t physicalIndex; 01098 size_t elementCount; 01100 union{ 01101 size_t data; 01102 Real fData; 01103 }; 01105 uint16 variability; 01106 01107 AutoConstantEntry(AutoConstantType theType, size_t theIndex, size_t theData, 01108 uint16 theVariability, size_t theElemCount = 4) 01109 : paramType(theType), physicalIndex(theIndex), elementCount(theElemCount), 01110 data(theData), variability(theVariability) {} 01111 01112 AutoConstantEntry(AutoConstantType theType, size_t theIndex, Real theData, 01113 uint16 theVariability, size_t theElemCount = 4) 01114 : paramType(theType), physicalIndex(theIndex), elementCount(theElemCount), 01115 fData(theData), variability(theVariability) {} 01116 01117 }; 01118 // Auto parameter storage 01119 typedef vector<AutoConstantEntry>::type AutoConstantList; 01120 01121 typedef vector<GpuSharedParametersUsage>::type GpuSharedParamUsageList; 01122 01123 protected: 01124 static AutoConstantDefinition AutoConstantDictionary[]; 01126 FloatConstantList mFloatConstants; 01128 IntConstantList mIntConstants; 01131 GpuLogicalBufferStructPtr mFloatLogicalToPhysical; 01134 GpuLogicalBufferStructPtr mIntLogicalToPhysical; 01136 GpuNamedConstantsPtr mNamedConstants; 01138 AutoConstantList mAutoConstants; 01140 uint16 mCombinedVariability; 01142 bool mTransposeMatrices; 01144 bool mIgnoreMissingParams; 01146 size_t mActivePassIterationIndex; 01147 01150 GpuLogicalIndexUse* _getFloatConstantLogicalIndexUse(size_t logicalIndex, size_t requestedSize, uint16 variability); 01153 GpuLogicalIndexUse* _getIntConstantLogicalIndexUse(size_t logicalIndex, size_t requestedSize, uint16 variability); 01154 01156 uint16 deriveVariability(AutoConstantType act); 01157 01158 void copySharedParamSetUsage(const GpuSharedParamUsageList& srcList); 01159 01160 GpuSharedParamUsageList mSharedParamSets; 01161 01162 // Optional data the rendersystem might want to store 01163 mutable Any mRenderSystemData; 01164 01165 01166 01167 public: 01168 GpuProgramParameters(); 01169 ~GpuProgramParameters() {} 01170 01172 GpuProgramParameters(const GpuProgramParameters& oth); 01174 GpuProgramParameters& operator=(const GpuProgramParameters& oth); 01175 01177 void _setNamedConstants(const GpuNamedConstantsPtr& constantmap); 01178 01180 void _setLogicalIndexes(const GpuLogicalBufferStructPtr& floatIndexMap, 01181 const GpuLogicalBufferStructPtr& intIndexMap); 01182 01183 01185 bool hasNamedParameters() const { return !mNamedConstants.isNull(); } 01191 bool hasLogicalIndexedParameters() const { return !mFloatLogicalToPhysical.isNull(); } 01192 01198 void setConstant(size_t index, const Vector4& vec); 01206 void setConstant(size_t index, Real val); 01214 void setConstant(size_t index, const Vector3& vec); 01221 void setConstant(size_t index, const Matrix4& m); 01229 void setConstant(size_t index, const Matrix4* m, size_t numEntries); 01236 void setConstant(size_t index, const float *val, size_t count); 01243 void setConstant(size_t index, const double *val, size_t count); 01249 void setConstant(size_t index, const ColourValue& colour); 01250 01265 void setConstant(size_t index, const int *val, size_t count); 01266 01273 void _writeRawConstants(size_t physicalIndex, const float* val, size_t count); 01280 void _writeRawConstants(size_t physicalIndex, const double* val, size_t count); 01287 void _writeRawConstants(size_t physicalIndex, const int* val, size_t count); 01294 void _readRawConstants(size_t physicalIndex, size_t count, float* dest); 01301 void _readRawConstants(size_t physicalIndex, size_t count, int* dest); 01302 01313 void _writeRawConstant(size_t physicalIndex, const Vector4& vec, 01314 size_t count = 4); 01322 void _writeRawConstant(size_t physicalIndex, Real val); 01330 void _writeRawConstant(size_t physicalIndex, int val); 01338 void _writeRawConstant(size_t physicalIndex, const Vector3& vec); 01347 void _writeRawConstant(size_t physicalIndex, const Matrix4& m, size_t elementCount); 01355 void _writeRawConstant(size_t physicalIndex, const Matrix4* m, size_t numEntries); 01365 void _writeRawConstant(size_t physicalIndex, const ColourValue& colour, 01366 size_t count = 4); 01367 01368 01374 GpuConstantDefinitionIterator getConstantDefinitionIterator(void) const; 01375 01380 const GpuConstantDefinition& getConstantDefinition(const String& name) const; 01381 01386 const GpuNamedConstants& getConstantDefinitions() const; 01387 01393 const GpuLogicalBufferStructPtr& getFloatLogicalBufferStruct() const { return mFloatLogicalToPhysical; } 01394 01400 size_t getFloatLogicalIndexForPhysicalIndex(size_t physicalIndex); 01406 size_t getIntLogicalIndexForPhysicalIndex(size_t physicalIndex); 01407 01413 const GpuLogicalBufferStructPtr& getIntLogicalBufferStruct() const { return mIntLogicalToPhysical; } 01415 const FloatConstantList& getFloatConstantList() const { return mFloatConstants; } 01417 float* getFloatPointer(size_t pos) { return &mFloatConstants[pos]; } 01419 const float* getFloatPointer(size_t pos) const { return &mFloatConstants[pos]; } 01421 const IntConstantList& getIntConstantList() const { return mIntConstants; } 01423 int* getIntPointer(size_t pos) { return &mIntConstants[pos]; } 01425 const int* getIntPointer(size_t pos) const { return &mIntConstants[pos]; } 01427 const AutoConstantList& getAutoConstantList() const { return mAutoConstants; } 01428 01442 void setAutoConstant(size_t index, AutoConstantType acType, size_t extraInfo = 0); 01443 void setAutoConstantReal(size_t index, AutoConstantType acType, Real rData); 01444 01459 void setAutoConstant(size_t index, AutoConstantType acType, uint16 extraInfo1, uint16 extraInfo2); 01460 01464 void _setRawAutoConstant(size_t physicalIndex, AutoConstantType acType, size_t extraInfo, 01465 uint16 variability, size_t elementSize = 4); 01469 void _setRawAutoConstantReal(size_t physicalIndex, AutoConstantType acType, Real rData, 01470 uint16 variability, size_t elementSize = 4); 01471 01472 01474 void clearAutoConstant(size_t index); 01475 01480 void setConstantFromTime(size_t index, Real factor); 01481 01483 void clearAutoConstants(void); 01484 typedef ConstVectorIterator<AutoConstantList> AutoConstantIterator; 01486 AutoConstantIterator getAutoConstantIterator(void) const; 01488 size_t getAutoConstantCount(void) const { return mAutoConstants.size(); } 01493 AutoConstantEntry* getAutoConstantEntry(const size_t index); 01495 bool hasAutoConstants(void) const { return !(mAutoConstants.empty()); } 01500 const AutoConstantEntry* findFloatAutoConstantEntry(size_t logicalIndex); 01505 const AutoConstantEntry* findIntAutoConstantEntry(size_t logicalIndex); 01509 const AutoConstantEntry* findAutoConstantEntry(const String& paramName); 01513 const AutoConstantEntry* _findRawAutoConstantEntryFloat(size_t physicalIndex); 01517 const AutoConstantEntry* _findRawAutoConstantEntryInt(size_t physicalIndex); 01518 01523 void _updateAutoParams(const AutoParamDataSource* source, uint16 variabilityMask); 01524 01527 void setIgnoreMissingParams(bool state) { mIgnoreMissingParams = state; } 01528 01548 void setNamedConstant(const String& name, Real val); 01568 void setNamedConstant(const String& name, int val); 01573 void setNamedConstant(const String& name, const Vector4& vec); 01586 void setNamedConstant(const String& name, const Vector3& vec); 01591 void setNamedConstant(const String& name, const Matrix4& m); 01599 void setNamedConstant(const String& name, const Matrix4* m, size_t numEntries); 01616 void setNamedConstant(const String& name, const float *val, size_t count, 01617 size_t multiple = 4); 01634 void setNamedConstant(const String& name, const double *val, size_t count, 01635 size_t multiple = 4); 01640 void setNamedConstant(const String& name, const ColourValue& colour); 01641 01658 void setNamedConstant(const String& name, const int *val, size_t count, 01659 size_t multiple = 4); 01660 01675 void setNamedAutoConstant(const String& name, AutoConstantType acType, size_t extraInfo = 0); 01676 void setNamedAutoConstantReal(const String& name, AutoConstantType acType, Real rData); 01677 01693 void setNamedAutoConstant(const String& name, AutoConstantType acType, uint16 extraInfo1, uint16 extraInfo2); 01694 01702 void setNamedConstantFromTime(const String& name, Real factor); 01703 01705 void clearNamedAutoConstant(const String& name); 01706 01716 const GpuConstantDefinition* _findNamedConstantDefinition( 01717 const String& name, bool throwExceptionIfMissing = false) const; 01724 size_t _getFloatConstantPhysicalIndex(size_t logicalIndex, size_t requestedSize, uint16 variability); 01731 size_t _getIntConstantPhysicalIndex(size_t logicalIndex, size_t requestedSize, uint16 variability); 01732 01740 void setTransposeMatrices(bool val) { mTransposeMatrices = val; } 01742 bool getTransposeMatrices(void) const { return mTransposeMatrices; } 01743 01750 void copyConstantsFrom(const GpuProgramParameters& source); 01751 01760 void copyMatchingNamedConstantsFrom(const GpuProgramParameters& source); 01761 01765 static const AutoConstantDefinition* getAutoConstantDefinition(const String& name); 01770 static const AutoConstantDefinition* getAutoConstantDefinition(const size_t idx); 01773 static size_t getNumAutoConstantDefinitions(void); 01774 01775 01778 void incPassIterationNumber(void); 01780 bool hasPassIterationNumber() const 01781 { return mActivePassIterationIndex != (std::numeric_limits<size_t>::max)(); } 01783 size_t getPassIterationNumberIndex() const 01784 { return mActivePassIterationIndex; } 01785 01786 01792 void addSharedParameters(GpuSharedParametersPtr sharedParams); 01793 01801 void addSharedParameters(const String& sharedParamsName); 01802 01804 bool isUsingSharedParameters(const String& sharedParamsName) const; 01805 01807 void removeSharedParameters(const String& sharedParamsName); 01808 01810 void removeAllSharedParameters(); 01811 01813 const GpuSharedParamUsageList& getSharedParameters() const; 01814 01816 void _setRenderSystemData(const Any& data) const { mRenderSystemData = data; } 01818 const Any& _getRenderSystemData() const { return mRenderSystemData; } 01819 01827 void _copySharedParams(); 01828 01829 01830 01831 }; 01832 01834 typedef SharedPtr<GpuProgramParameters> GpuProgramParametersSharedPtr; 01835 01838 } 01839 #endif 01840
Copyright © 2012 Torus Knot Software Ltd
This work is licensed under a Creative Commons Attribution-ShareAlike 3.0 Unported License.
Last modified Fri May 25 23:36:24 2012