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-2013 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 #include "Threading/OgreThreadHeaders.h" 00039 #include "OgreHeaderPrefix.h" 00040 00041 namespace Ogre { 00042 00054 enum GpuConstantType 00055 { 00056 GCT_FLOAT1 = 1, 00057 GCT_FLOAT2 = 2, 00058 GCT_FLOAT3 = 3, 00059 GCT_FLOAT4 = 4, 00060 GCT_SAMPLER1D = 5, 00061 GCT_SAMPLER2D = 6, 00062 GCT_SAMPLER3D = 7, 00063 GCT_SAMPLERCUBE = 8, 00064 GCT_SAMPLERRECT = 9, 00065 GCT_SAMPLER1DSHADOW = 10, 00066 GCT_SAMPLER2DSHADOW = 11, 00067 GCT_SAMPLER2DARRAY = 12, 00068 GCT_MATRIX_2X2 = 13, 00069 GCT_MATRIX_2X3 = 14, 00070 GCT_MATRIX_2X4 = 15, 00071 GCT_MATRIX_3X2 = 16, 00072 GCT_MATRIX_3X3 = 17, 00073 GCT_MATRIX_3X4 = 18, 00074 GCT_MATRIX_4X2 = 19, 00075 GCT_MATRIX_4X3 = 20, 00076 GCT_MATRIX_4X4 = 21, 00077 GCT_INT1 = 22, 00078 GCT_INT2 = 23, 00079 GCT_INT3 = 24, 00080 GCT_INT4 = 25, 00081 GCT_SUBROUTINE = 26, 00082 GCT_DOUBLE1 = 27, 00083 GCT_DOUBLE2 = 28, 00084 GCT_DOUBLE3 = 29, 00085 GCT_DOUBLE4 = 30, 00086 GCT_MATRIX_DOUBLE_2X2 = 31, 00087 GCT_MATRIX_DOUBLE_2X3 = 32, 00088 GCT_MATRIX_DOUBLE_2X4 = 33, 00089 GCT_MATRIX_DOUBLE_3X2 = 34, 00090 GCT_MATRIX_DOUBLE_3X3 = 35, 00091 GCT_MATRIX_DOUBLE_3X4 = 36, 00092 GCT_MATRIX_DOUBLE_4X2 = 37, 00093 GCT_MATRIX_DOUBLE_4X3 = 38, 00094 GCT_MATRIX_DOUBLE_4X4 = 39, 00095 GCT_UNKNOWN = 99 00096 }; 00097 00101 enum GpuParamVariability 00102 { 00104 GPV_GLOBAL = 1, 00106 GPV_PER_OBJECT = 2, 00108 GPV_LIGHTS = 4, 00110 GPV_PASS_ITERATION_NUMBER = 8, 00111 00112 00114 GPV_ALL = 0xFFFF 00115 00116 }; 00117 00122 struct _OgreExport GpuConstantDefinition 00123 { 00125 GpuConstantType constType; 00127 size_t physicalIndex; 00129 size_t logicalIndex; 00132 size_t elementSize; 00134 size_t arraySize; 00136 mutable uint16 variability; 00137 00138 bool isFloat() const 00139 { 00140 return isFloat(constType); 00141 } 00142 00143 static bool isFloat(GpuConstantType c) 00144 { 00145 switch(c) 00146 { 00147 case GCT_INT1: 00148 case GCT_INT2: 00149 case GCT_INT3: 00150 case GCT_INT4: 00151 case GCT_SAMPLER1D: 00152 case GCT_SAMPLER2D: 00153 case GCT_SAMPLER2DARRAY: 00154 case GCT_SAMPLER3D: 00155 case GCT_SAMPLERCUBE: 00156 case GCT_SAMPLER1DSHADOW: 00157 case GCT_SAMPLER2DSHADOW: 00158 return false; 00159 default: 00160 return true; 00161 }; 00162 00163 } 00164 00165 bool isDouble() const 00166 { 00167 return isDouble(constType); 00168 } 00169 00170 static bool isDouble(GpuConstantType c) 00171 { 00172 switch(c) 00173 { 00174 case GCT_INT1: 00175 case GCT_INT2: 00176 case GCT_INT3: 00177 case GCT_INT4: 00178 case GCT_FLOAT1: 00179 case GCT_FLOAT2: 00180 case GCT_FLOAT3: 00181 case GCT_FLOAT4: 00182 case GCT_SAMPLER1D: 00183 case GCT_SAMPLER2D: 00184 case GCT_SAMPLER2DARRAY: 00185 case GCT_SAMPLER3D: 00186 case GCT_SAMPLERCUBE: 00187 case GCT_SAMPLER1DSHADOW: 00188 case GCT_SAMPLER2DSHADOW: 00189 return false; 00190 default: 00191 return true; 00192 }; 00193 00194 } 00195 00196 bool isSampler() const 00197 { 00198 return isSampler(constType); 00199 } 00200 00201 static bool isSampler(GpuConstantType c) 00202 { 00203 switch(c) 00204 { 00205 case GCT_SAMPLER1D: 00206 case GCT_SAMPLER2D: 00207 case GCT_SAMPLER2DARRAY: 00208 case GCT_SAMPLER3D: 00209 case GCT_SAMPLERCUBE: 00210 case GCT_SAMPLER1DSHADOW: 00211 case GCT_SAMPLER2DSHADOW: 00212 return true; 00213 default: 00214 return false; 00215 }; 00216 00217 } 00218 00219 bool isSubroutine() const 00220 { 00221 return isSubroutine(constType); 00222 } 00223 00224 static bool isSubroutine(GpuConstantType c) 00225 { 00226 return c == GCT_SUBROUTINE; 00227 } 00228 00232 static size_t getElementSize(GpuConstantType ctype, bool padToMultiplesOf4) 00233 { 00234 if (padToMultiplesOf4) 00235 { 00236 switch(ctype) 00237 { 00238 case GCT_FLOAT1: 00239 case GCT_INT1: 00240 case GCT_SAMPLER1D: 00241 case GCT_SAMPLER2D: 00242 case GCT_SAMPLER2DARRAY: 00243 case GCT_SAMPLER3D: 00244 case GCT_SAMPLERCUBE: 00245 case GCT_SAMPLER1DSHADOW: 00246 case GCT_SAMPLER2DSHADOW: 00247 case GCT_FLOAT2: 00248 case GCT_INT2: 00249 case GCT_FLOAT3: 00250 case GCT_INT3: 00251 case GCT_FLOAT4: 00252 case GCT_INT4: 00253 return 4; 00254 case GCT_MATRIX_2X2: 00255 case GCT_MATRIX_2X3: 00256 case GCT_MATRIX_2X4: 00257 case GCT_DOUBLE1: 00258 case GCT_DOUBLE2: 00259 case GCT_DOUBLE3: 00260 case GCT_DOUBLE4: 00261 return 8; // 2 float4s 00262 case GCT_MATRIX_3X2: 00263 case GCT_MATRIX_3X3: 00264 case GCT_MATRIX_3X4: 00265 return 12; // 3 float4s 00266 case GCT_MATRIX_4X2: 00267 case GCT_MATRIX_4X3: 00268 case GCT_MATRIX_4X4: 00269 case GCT_MATRIX_DOUBLE_2X2: 00270 case GCT_MATRIX_DOUBLE_2X3: 00271 case GCT_MATRIX_DOUBLE_2X4: 00272 return 16; // 4 float4s 00273 case GCT_MATRIX_DOUBLE_3X2: 00274 case GCT_MATRIX_DOUBLE_3X3: 00275 case GCT_MATRIX_DOUBLE_3X4: 00276 return 24; 00277 case GCT_MATRIX_DOUBLE_4X2: 00278 case GCT_MATRIX_DOUBLE_4X3: 00279 case GCT_MATRIX_DOUBLE_4X4: 00280 return 32; 00281 default: 00282 return 4; 00283 }; 00284 } 00285 else 00286 { 00287 switch(ctype) 00288 { 00289 case GCT_FLOAT1: 00290 case GCT_DOUBLE1: 00291 case GCT_INT1: 00292 case GCT_SAMPLER1D: 00293 case GCT_SAMPLER2D: 00294 case GCT_SAMPLER2DARRAY: 00295 case GCT_SAMPLER3D: 00296 case GCT_SAMPLERCUBE: 00297 case GCT_SAMPLER1DSHADOW: 00298 case GCT_SAMPLER2DSHADOW: 00299 return 1; 00300 case GCT_FLOAT2: 00301 case GCT_INT2: 00302 case GCT_DOUBLE2: 00303 return 2; 00304 case GCT_FLOAT3: 00305 case GCT_INT3: 00306 case GCT_DOUBLE3: 00307 return 3; 00308 case GCT_FLOAT4: 00309 case GCT_INT4: 00310 case GCT_DOUBLE4: 00311 return 4; 00312 case GCT_MATRIX_2X2: 00313 case GCT_MATRIX_DOUBLE_2X2: 00314 return 4; 00315 case GCT_MATRIX_2X3: 00316 case GCT_MATRIX_3X2: 00317 case GCT_MATRIX_DOUBLE_2X3: 00318 case GCT_MATRIX_DOUBLE_3X2: 00319 return 6; 00320 case GCT_MATRIX_2X4: 00321 case GCT_MATRIX_4X2: 00322 case GCT_MATRIX_DOUBLE_2X4: 00323 case GCT_MATRIX_DOUBLE_4X2: 00324 return 8; 00325 case GCT_MATRIX_3X3: 00326 case GCT_MATRIX_DOUBLE_3X3: 00327 return 9; 00328 case GCT_MATRIX_3X4: 00329 case GCT_MATRIX_4X3: 00330 case GCT_MATRIX_DOUBLE_3X4: 00331 case GCT_MATRIX_DOUBLE_4X3: 00332 return 12; 00333 case GCT_MATRIX_4X4: 00334 case GCT_MATRIX_DOUBLE_4X4: 00335 return 16; 00336 default: 00337 return 4; 00338 }; 00339 00340 } 00341 } 00342 00343 GpuConstantDefinition() 00344 : constType(GCT_UNKNOWN) 00345 , physicalIndex((std::numeric_limits<size_t>::max)()) 00346 , logicalIndex(0) 00347 , elementSize(0) 00348 , arraySize(1) 00349 , variability(GPV_GLOBAL) {} 00350 }; 00351 typedef map<String, GpuConstantDefinition>::type GpuConstantDefinitionMap; 00352 typedef ConstMapIterator<GpuConstantDefinitionMap> GpuConstantDefinitionIterator; 00353 00355 struct _OgreExport GpuNamedConstants : public GpuParamsAlloc 00356 { 00358 size_t floatBufferSize; 00360 size_t doubleBufferSize; 00362 size_t intBufferSize; 00364 GpuConstantDefinitionMap map; 00365 00366 GpuNamedConstants() : floatBufferSize(0), doubleBufferSize(0), intBufferSize(0) {} 00367 00379 void generateConstantDefinitionArrayEntries(const String& paramName, 00380 const GpuConstantDefinition& baseDef); 00381 00383 static bool getGenerateAllConstantDefinitionArrayEntries(); 00384 00391 static void setGenerateAllConstantDefinitionArrayEntries(bool generateAll); 00392 00396 void save(const String& filename) const; 00400 void load(DataStreamPtr& stream); 00401 00402 size_t calculateSize(void) const; 00403 00404 protected: 00411 static bool msGenerateAllConstantDefinitionArrayEntries; 00412 }; 00413 typedef SharedPtr<GpuNamedConstants> GpuNamedConstantsPtr; 00414 00416 class _OgreExport GpuNamedConstantsSerializer : public Serializer 00417 { 00418 public: 00419 GpuNamedConstantsSerializer(); 00420 virtual ~GpuNamedConstantsSerializer(); 00421 void exportNamedConstants(const GpuNamedConstants* pConsts, const String& filename, 00422 Endian endianMode = ENDIAN_NATIVE); 00423 void exportNamedConstants(const GpuNamedConstants* pConsts, DataStreamPtr stream, 00424 Endian endianMode = ENDIAN_NATIVE); 00425 void importNamedConstants(DataStreamPtr& stream, GpuNamedConstants* pDest); 00426 }; 00427 00431 struct _OgreExport GpuLogicalIndexUse 00432 { 00434 size_t physicalIndex; 00436 size_t currentSize; 00438 mutable uint16 variability; 00439 00440 GpuLogicalIndexUse() 00441 : physicalIndex(99999), currentSize(0), variability(GPV_GLOBAL) {} 00442 GpuLogicalIndexUse(size_t bufIdx, size_t curSz, uint16 v) 00443 : physicalIndex(bufIdx), currentSize(curSz), variability(v) {} 00444 }; 00445 typedef map<size_t, GpuLogicalIndexUse>::type GpuLogicalIndexUseMap; 00447 struct _OgreExport GpuLogicalBufferStruct : public GpuParamsAlloc 00448 { 00449 OGRE_MUTEX(mutex); 00450 00452 GpuLogicalIndexUseMap map; 00454 size_t bufferSize; 00455 GpuLogicalBufferStruct() : bufferSize(0) {} 00456 }; 00457 typedef SharedPtr<GpuLogicalBufferStruct> GpuLogicalBufferStructPtr; 00458 00463 typedef vector<float>::type FloatConstantList; 00468 typedef vector<double>::type DoubleConstantList; 00473 typedef vector<int>::type IntConstantList; 00474 00490 class _OgreExport GpuSharedParameters : public GpuParamsAlloc 00491 { 00492 protected: 00493 GpuNamedConstants mNamedConstants; 00494 FloatConstantList mFloatConstants; 00495 DoubleConstantList mDoubleConstants; 00496 IntConstantList mIntConstants; 00497 String mName; 00498 00499 // Optional data the rendersystem might want to store 00500 mutable Any mRenderSystemData; 00501 00503 size_t mFrameLastUpdated; 00504 00506 unsigned long mVersion; 00507 00508 public: 00509 GpuSharedParameters(const String& name); 00510 virtual ~GpuSharedParameters(); 00511 00513 const String& getName() { return mName; } 00514 00522 void addConstantDefinition(const String& name, GpuConstantType constType, size_t arraySize = 1); 00523 00526 void removeConstantDefinition(const String& name); 00527 00530 void removeAllConstantDefinitions(); 00531 00535 unsigned long getVersion() const { return mVersion; } 00536 00537 size_t calculateSize(void) const; 00538 00544 void _markDirty(); 00546 size_t getFrameLastUpdated() const { return mFrameLastUpdated; } 00547 00551 GpuConstantDefinitionIterator getConstantDefinitionIterator(void) const; 00552 00555 const GpuConstantDefinition& getConstantDefinition(const String& name) const; 00556 00559 const GpuNamedConstants& getConstantDefinitions() const; 00560 00562 void setNamedConstant(const String& name, Real val); 00564 void setNamedConstant(const String& name, int val); 00566 void setNamedConstant(const String& name, const Vector4& vec); 00568 void setNamedConstant(const String& name, const Vector3& vec); 00570 void setNamedConstant(const String& name, const Vector2& vec); 00572 void setNamedConstant(const String& name, const Matrix4& m); 00574 void setNamedConstant(const String& name, const Matrix4* m, size_t numEntries); 00576 void setNamedConstant(const String& name, const float *val, size_t count); 00578 void setNamedConstant(const String& name, const double *val, size_t count); 00580 void setNamedConstant(const String& name, const ColourValue& colour); 00582 void setNamedConstant(const String& name, const int *val, size_t count); 00583 00585 float* getFloatPointer(size_t pos) { _markDirty(); return &mFloatConstants[pos]; } 00587 const float* getFloatPointer(size_t pos) const { return &mFloatConstants[pos]; } 00589 double* getDoublePointer(size_t pos) { _markDirty(); return &mDoubleConstants[pos]; } 00591 const double* getDoublePointer(size_t pos) const { return &mDoubleConstants[pos]; } 00593 int* getIntPointer(size_t pos) { _markDirty(); return &mIntConstants[pos]; } 00595 const int* getIntPointer(size_t pos) const { return &mIntConstants[pos]; } 00596 00598 const FloatConstantList& getFloatConstantList() const { return mFloatConstants; } 00600 const DoubleConstantList& getDoubleConstantList() const { return mDoubleConstants; } 00602 const IntConstantList& getIntConstantList() const { return mIntConstants; } 00603 00605 void _setRenderSystemData(const Any& data) const { mRenderSystemData = data; } 00607 const Any& _getRenderSystemData() const { return mRenderSystemData; } 00608 00609 }; 00610 00612 typedef SharedPtr<GpuSharedParameters> GpuSharedParametersPtr; 00613 00614 class GpuProgramParameters; 00615 00619 class _OgreExport GpuSharedParametersUsage : public GpuParamsAlloc 00620 { 00621 protected: 00622 GpuSharedParametersPtr mSharedParams; 00623 // Not a shared pointer since this is also parent 00624 GpuProgramParameters* mParams; 00625 // list of physical mappings that we are going to bring in 00626 struct CopyDataEntry 00627 { 00628 const GpuConstantDefinition* srcDefinition; 00629 const GpuConstantDefinition* dstDefinition; 00630 }; 00631 typedef vector<CopyDataEntry>::type CopyDataList; 00632 00633 CopyDataList mCopyDataList; 00634 00635 // Optional data the rendersystem might want to store 00636 mutable Any mRenderSystemData; 00637 00639 unsigned long mCopyDataVersion; 00640 00641 void initCopyData(); 00642 00643 00644 public: 00646 GpuSharedParametersUsage(GpuSharedParametersPtr sharedParams, 00647 GpuProgramParameters* params); 00648 00656 void _copySharedParamsToTargetParams(); 00657 00659 const String& getName() const { return mSharedParams->getName(); } 00660 00661 GpuSharedParametersPtr getSharedParams() const { return mSharedParams; } 00662 GpuProgramParameters* getTargetParams() const { return mParams; } 00663 00665 void _setRenderSystemData(const Any& data) const { mRenderSystemData = data; } 00667 const Any& _getRenderSystemData() const { return mRenderSystemData; } 00668 00669 00670 }; 00671 00702 class _OgreExport GpuProgramParameters : public GpuParamsAlloc 00703 { 00704 public: 00708 enum AutoConstantType 00709 { 00711 ACT_WORLD_MATRIX, 00713 ACT_INVERSE_WORLD_MATRIX, 00717 ACT_TRANSPOSE_WORLD_MATRIX, 00719 ACT_INVERSE_TRANSPOSE_WORLD_MATRIX, 00720 00722 ACT_WORLD_MATRIX_ARRAY_3x4, 00724 ACT_WORLD_MATRIX_ARRAY, 00726 ACT_WORLD_DUALQUATERNION_ARRAY_2x4, 00728 ACT_WORLD_SCALE_SHEAR_MATRIX_ARRAY_3x4, 00729 00731 ACT_VIEW_MATRIX, 00733 ACT_INVERSE_VIEW_MATRIX, 00737 ACT_TRANSPOSE_VIEW_MATRIX, 00741 ACT_INVERSE_TRANSPOSE_VIEW_MATRIX, 00742 00743 00745 ACT_PROJECTION_MATRIX, 00749 ACT_INVERSE_PROJECTION_MATRIX, 00753 ACT_TRANSPOSE_PROJECTION_MATRIX, 00757 ACT_INVERSE_TRANSPOSE_PROJECTION_MATRIX, 00758 00759 00761 ACT_VIEWPROJ_MATRIX, 00765 ACT_INVERSE_VIEWPROJ_MATRIX, 00769 ACT_TRANSPOSE_VIEWPROJ_MATRIX, 00773 ACT_INVERSE_TRANSPOSE_VIEWPROJ_MATRIX, 00774 00775 00777 ACT_WORLDVIEW_MATRIX, 00779 ACT_INVERSE_WORLDVIEW_MATRIX, 00783 ACT_TRANSPOSE_WORLDVIEW_MATRIX, 00785 ACT_INVERSE_TRANSPOSE_WORLDVIEW_MATRIX, 00787 00788 00790 ACT_WORLDVIEWPROJ_MATRIX, 00794 ACT_INVERSE_WORLDVIEWPROJ_MATRIX, 00798 ACT_TRANSPOSE_WORLDVIEWPROJ_MATRIX, 00802 ACT_INVERSE_TRANSPOSE_WORLDVIEWPROJ_MATRIX, 00803 00804 00806 00809 ACT_RENDER_TARGET_FLIPPING, 00810 00813 ACT_VERTEX_WINDING, 00814 00816 ACT_FOG_COLOUR, 00818 ACT_FOG_PARAMS, 00819 00820 00822 ACT_SURFACE_AMBIENT_COLOUR, 00824 ACT_SURFACE_DIFFUSE_COLOUR, 00826 ACT_SURFACE_SPECULAR_COLOUR, 00828 ACT_SURFACE_EMISSIVE_COLOUR, 00830 ACT_SURFACE_SHININESS, 00832 ACT_SURFACE_ALPHA_REJECTION_VALUE, 00833 00834 00836 ACT_LIGHT_COUNT, 00837 00838 00840 ACT_AMBIENT_LIGHT_COLOUR, 00841 00843 ACT_LIGHT_DIFFUSE_COLOUR, 00845 ACT_LIGHT_SPECULAR_COLOUR, 00847 ACT_LIGHT_ATTENUATION, 00853 ACT_SPOTLIGHT_PARAMS, 00855 ACT_LIGHT_POSITION, 00857 ACT_LIGHT_POSITION_OBJECT_SPACE, 00859 ACT_LIGHT_POSITION_VIEW_SPACE, 00861 ACT_LIGHT_DIRECTION, 00863 ACT_LIGHT_DIRECTION_OBJECT_SPACE, 00865 ACT_LIGHT_DIRECTION_VIEW_SPACE, 00870 ACT_LIGHT_DISTANCE_OBJECT_SPACE, 00872 ACT_LIGHT_POWER_SCALE, 00874 ACT_LIGHT_DIFFUSE_COLOUR_POWER_SCALED, 00876 ACT_LIGHT_SPECULAR_COLOUR_POWER_SCALED, 00878 ACT_LIGHT_DIFFUSE_COLOUR_ARRAY, 00880 ACT_LIGHT_SPECULAR_COLOUR_ARRAY, 00882 ACT_LIGHT_DIFFUSE_COLOUR_POWER_SCALED_ARRAY, 00884 ACT_LIGHT_SPECULAR_COLOUR_POWER_SCALED_ARRAY, 00886 ACT_LIGHT_ATTENUATION_ARRAY, 00888 ACT_LIGHT_POSITION_ARRAY, 00890 ACT_LIGHT_POSITION_OBJECT_SPACE_ARRAY, 00892 ACT_LIGHT_POSITION_VIEW_SPACE_ARRAY, 00894 ACT_LIGHT_DIRECTION_ARRAY, 00896 ACT_LIGHT_DIRECTION_OBJECT_SPACE_ARRAY, 00898 ACT_LIGHT_DIRECTION_VIEW_SPACE_ARRAY, 00903 ACT_LIGHT_DISTANCE_OBJECT_SPACE_ARRAY, 00907 ACT_LIGHT_POWER_SCALE_ARRAY, 00914 ACT_SPOTLIGHT_PARAMS_ARRAY, 00915 00920 ACT_DERIVED_AMBIENT_LIGHT_COLOUR, 00925 ACT_DERIVED_SCENE_COLOUR, 00926 00932 ACT_DERIVED_LIGHT_DIFFUSE_COLOUR, 00938 ACT_DERIVED_LIGHT_SPECULAR_COLOUR, 00939 00941 ACT_DERIVED_LIGHT_DIFFUSE_COLOUR_ARRAY, 00943 ACT_DERIVED_LIGHT_SPECULAR_COLOUR_ARRAY, 00950 ACT_LIGHT_NUMBER, 00952 ACT_LIGHT_CASTS_SHADOWS, 00954 ACT_LIGHT_CASTS_SHADOWS_ARRAY, 00955 00956 00960 ACT_SHADOW_EXTRUSION_DISTANCE, 00962 ACT_CAMERA_POSITION, 00964 ACT_CAMERA_POSITION_OBJECT_SPACE, 00966 ACT_TEXTURE_VIEWPROJ_MATRIX, 00968 ACT_TEXTURE_VIEWPROJ_MATRIX_ARRAY, 00972 ACT_TEXTURE_WORLDVIEWPROJ_MATRIX, 00974 ACT_TEXTURE_WORLDVIEWPROJ_MATRIX_ARRAY, 00976 ACT_SPOTLIGHT_VIEWPROJ_MATRIX, 00978 ACT_SPOTLIGHT_VIEWPROJ_MATRIX_ARRAY, 00982 ACT_SPOTLIGHT_WORLDVIEWPROJ_MATRIX, 00986 ACT_SPOTLIGHT_WORLDVIEWPROJ_MATRIX_ARRAY, 00988 ACT_CUSTOM, 00991 ACT_TIME, 00995 ACT_TIME_0_X, 00997 ACT_COSTIME_0_X, 00999 ACT_SINTIME_0_X, 01001 ACT_TANTIME_0_X, 01005 ACT_TIME_0_X_PACKED, 01010 ACT_TIME_0_1, 01012 ACT_COSTIME_0_1, 01014 ACT_SINTIME_0_1, 01016 ACT_TANTIME_0_1, 01020 ACT_TIME_0_1_PACKED, 01025 ACT_TIME_0_2PI, 01027 ACT_COSTIME_0_2PI, 01029 ACT_SINTIME_0_2PI, 01031 ACT_TANTIME_0_2PI, 01035 ACT_TIME_0_2PI_PACKED, 01037 ACT_FRAME_TIME, 01039 ACT_FPS, 01041 01044 ACT_VIEWPORT_WIDTH, 01048 ACT_VIEWPORT_HEIGHT, 01052 ACT_INVERSE_VIEWPORT_WIDTH, 01056 ACT_INVERSE_VIEWPORT_HEIGHT, 01060 ACT_VIEWPORT_SIZE, 01061 01063 01066 ACT_VIEW_DIRECTION, 01070 ACT_VIEW_SIDE_VECTOR, 01074 ACT_VIEW_UP_VECTOR, 01078 ACT_FOV, 01082 ACT_NEAR_CLIP_DISTANCE, 01086 ACT_FAR_CLIP_DISTANCE, 01087 01091 ACT_PASS_NUMBER, 01092 01097 ACT_PASS_ITERATION_NUMBER, 01098 01099 01103 ACT_ANIMATION_PARAMETRIC, 01104 01110 ACT_TEXEL_OFFSETS, 01111 01116 ACT_SCENE_DEPTH_RANGE, 01117 01123 ACT_SHADOW_SCENE_DEPTH_RANGE, 01124 01130 ACT_SHADOW_SCENE_DEPTH_RANGE_ARRAY, 01131 01135 ACT_SHADOW_COLOUR, 01139 ACT_TEXTURE_SIZE, 01143 ACT_INVERSE_TEXTURE_SIZE, 01147 ACT_PACKED_TEXTURE_SIZE, 01148 01152 ACT_TEXTURE_MATRIX, 01153 01159 ACT_LOD_CAMERA_POSITION, 01165 ACT_LOD_CAMERA_POSITION_OBJECT_SPACE, 01167 ACT_LIGHT_CUSTOM, 01168 01169 ACT_UNKNOWN = 999 01170 }; 01171 01175 enum ACDataType { 01177 ACDT_NONE, 01179 ACDT_INT, 01181 ACDT_REAL 01182 }; 01183 01186 enum ElementType { 01187 ET_INT, 01188 ET_REAL 01189 }; 01190 01194 struct AutoConstantDefinition 01195 { 01196 AutoConstantType acType; 01197 String name; 01198 size_t elementCount; 01200 ElementType elementType; 01202 ACDataType dataType; 01203 01204 AutoConstantDefinition(AutoConstantType _acType, const String& _name, 01205 size_t _elementCount, ElementType _elementType, 01206 ACDataType _dataType) 01207 :acType(_acType), name(_name), elementCount(_elementCount), 01208 elementType(_elementType), dataType(_dataType) 01209 { 01210 01211 } 01212 }; 01213 01215 class AutoConstantEntry 01216 { 01217 public: 01219 AutoConstantType paramType; 01221 size_t physicalIndex; 01225 size_t elementCount; 01227 union{ 01228 size_t data; 01229 Real fData; 01230 }; 01232 uint16 variability; 01233 01234 AutoConstantEntry(AutoConstantType theType, size_t theIndex, size_t theData, 01235 uint16 theVariability, size_t theElemCount = 4) 01236 : paramType(theType), physicalIndex(theIndex), elementCount(theElemCount), 01237 data(theData), variability(theVariability) {} 01238 01239 AutoConstantEntry(AutoConstantType theType, size_t theIndex, Real theData, 01240 uint16 theVariability, size_t theElemCount = 4) 01241 : paramType(theType), physicalIndex(theIndex), elementCount(theElemCount), 01242 fData(theData), variability(theVariability) {} 01243 01244 }; 01245 // Auto parameter storage 01246 typedef vector<AutoConstantEntry>::type AutoConstantList; 01247 01248 typedef vector<GpuSharedParametersUsage>::type GpuSharedParamUsageList; 01249 01250 // Map that store subroutines associated with slots 01251 typedef HashMap<unsigned int, String> SubroutineMap; 01252 typedef HashMap<unsigned int, String>::const_iterator SubroutineIterator; 01253 01254 protected: 01255 SubroutineMap mSubroutineMap; 01256 01257 static AutoConstantDefinition AutoConstantDictionary[]; 01259 FloatConstantList mFloatConstants; 01261 DoubleConstantList mDoubleConstants; 01263 IntConstantList mIntConstants; 01266 GpuLogicalBufferStructPtr mFloatLogicalToPhysical; 01269 GpuLogicalBufferStructPtr mDoubleLogicalToPhysical; 01272 GpuLogicalBufferStructPtr mIntLogicalToPhysical; 01274 GpuNamedConstantsPtr mNamedConstants; 01276 AutoConstantList mAutoConstants; 01278 uint16 mCombinedVariability; 01280 bool mTransposeMatrices; 01282 bool mIgnoreMissingParams; 01284 size_t mActivePassIterationIndex; 01285 01288 GpuLogicalIndexUse* _getFloatConstantLogicalIndexUse(size_t logicalIndex, size_t requestedSize, uint16 variability); 01291 GpuLogicalIndexUse* _getDoubleConstantLogicalIndexUse(size_t logicalIndex, size_t requestedSize, uint16 variability); 01294 GpuLogicalIndexUse* _getIntConstantLogicalIndexUse(size_t logicalIndex, size_t requestedSize, uint16 variability); 01295 01297 uint16 deriveVariability(AutoConstantType act); 01298 01299 void copySharedParamSetUsage(const GpuSharedParamUsageList& srcList); 01300 01301 GpuSharedParamUsageList mSharedParamSets; 01302 01303 // Optional data the rendersystem might want to store 01304 mutable Any mRenderSystemData; 01305 01306 01307 01308 public: 01309 GpuProgramParameters(); 01310 ~GpuProgramParameters() {} 01311 01313 GpuProgramParameters(const GpuProgramParameters& oth); 01315 GpuProgramParameters& operator=(const GpuProgramParameters& oth); 01316 01318 void _setNamedConstants(const GpuNamedConstantsPtr& constantmap); 01319 01321 void _setLogicalIndexes(const GpuLogicalBufferStructPtr& floatIndexMap, const GpuLogicalBufferStructPtr& doubleIndexMap, 01322 const GpuLogicalBufferStructPtr& intIndexMap); 01323 01324 01326 bool hasNamedParameters() const { return !mNamedConstants.isNull(); } 01332 bool hasLogicalIndexedParameters() const { return !mFloatLogicalToPhysical.isNull(); } 01333 01339 void setConstant(size_t index, const Vector4& vec); 01347 void setConstant(size_t index, Real val); 01355 void setConstant(size_t index, const Vector3& vec); 01363 void setConstant(size_t index, const Vector2& vec); 01370 void setConstant(size_t index, const Matrix4& m); 01378 void setConstant(size_t index, const Matrix4* m, size_t numEntries); 01385 void setConstant(size_t index, const float *val, size_t count); 01392 void setConstant(size_t index, const double *val, size_t count); 01398 void setConstant(size_t index, const ColourValue& colour); 01399 01414 void setConstant(size_t index, const int *val, size_t count); 01415 01422 void _writeRawConstants(size_t physicalIndex, const float* val, size_t count); 01429 void _writeRawConstants(size_t physicalIndex, const double* val, size_t count); 01436 void _writeRawConstants(size_t physicalIndex, const int* val, size_t count); 01443 void _readRawConstants(size_t physicalIndex, size_t count, float* dest); 01450 void _readRawConstants(size_t physicalIndex, size_t count, int* dest); 01451 01462 void _writeRawConstant(size_t physicalIndex, const Vector4& vec, 01463 size_t count = 4); 01471 void _writeRawConstant(size_t physicalIndex, Real val); 01479 void _writeRawConstant(size_t physicalIndex, Real val, size_t count); 01487 void _writeRawConstant(size_t physicalIndex, int val); 01495 void _writeRawConstant(size_t physicalIndex, const Vector3& vec); 01503 void _writeRawConstant(size_t physicalIndex, const Vector2& vec); 01512 void _writeRawConstant(size_t physicalIndex, const Matrix4& m, size_t elementCount); 01520 void _writeRawConstant(size_t physicalIndex, const Matrix4* m, size_t numEntries); 01530 void _writeRawConstant(size_t physicalIndex, const ColourValue& colour, 01531 size_t count = 4); 01532 01533 01539 GpuConstantDefinitionIterator getConstantDefinitionIterator(void) const; 01540 01545 const GpuConstantDefinition& getConstantDefinition(const String& name) const; 01546 01551 const GpuNamedConstants& getConstantDefinitions() const; 01552 01558 const GpuLogicalBufferStructPtr& getFloatLogicalBufferStruct() const { return mFloatLogicalToPhysical; } 01559 01565 size_t getFloatLogicalIndexForPhysicalIndex(size_t physicalIndex); 01576 const GpuLogicalBufferStructPtr& getDoubleLogicalBufferStruct() const { return mDoubleLogicalToPhysical; } 01577 01583 size_t getDoubleLogicalIndexForPhysicalIndex(size_t physicalIndex); 01589 size_t getIntLogicalIndexForPhysicalIndex(size_t physicalIndex); 01590 01596 const GpuLogicalBufferStructPtr& getIntLogicalBufferStruct() const { return mIntLogicalToPhysical; } 01598 const FloatConstantList& getFloatConstantList() const { return mFloatConstants; } 01600 float* getFloatPointer(size_t pos) { return &mFloatConstants[pos]; } 01602 const float* getFloatPointer(size_t pos) const { return &mFloatConstants[pos]; } 01604 const DoubleConstantList& getDoubleConstantList() const { return mDoubleConstants; } 01606 double* getDoublePointer(size_t pos) { return &mDoubleConstants[pos]; } 01608 const double* getDoublePointer(size_t pos) const { return &mDoubleConstants[pos]; } 01610 const IntConstantList& getIntConstantList() const { return mIntConstants; } 01612 int* getIntPointer(size_t pos) { return &mIntConstants[pos]; } 01614 const int* getIntPointer(size_t pos) const { return &mIntConstants[pos]; } 01616 const AutoConstantList& getAutoConstantList() const { return mAutoConstants; } 01617 01631 void setAutoConstant(size_t index, AutoConstantType acType, size_t extraInfo = 0); 01632 void setAutoConstantReal(size_t index, AutoConstantType acType, Real rData); 01633 01648 void setAutoConstant(size_t index, AutoConstantType acType, uint16 extraInfo1, uint16 extraInfo2); 01649 01653 void _setRawAutoConstant(size_t physicalIndex, AutoConstantType acType, size_t extraInfo, 01654 uint16 variability, size_t elementSize = 4); 01658 void _setRawAutoConstantReal(size_t physicalIndex, AutoConstantType acType, Real rData, 01659 uint16 variability, size_t elementSize = 4); 01660 01661 01663 void clearAutoConstant(size_t index); 01664 01669 void setConstantFromTime(size_t index, Real factor); 01670 01672 void clearAutoConstants(void); 01673 typedef ConstVectorIterator<AutoConstantList> AutoConstantIterator; 01675 AutoConstantIterator getAutoConstantIterator(void) const; 01677 size_t getAutoConstantCount(void) const { return mAutoConstants.size(); } 01682 AutoConstantEntry* getAutoConstantEntry(const size_t index); 01684 bool hasAutoConstants(void) const { return !(mAutoConstants.empty()); } 01689 const AutoConstantEntry* findFloatAutoConstantEntry(size_t logicalIndex); 01694 const AutoConstantEntry* findDoubleAutoConstantEntry(size_t logicalIndex); 01699 const AutoConstantEntry* findIntAutoConstantEntry(size_t logicalIndex); 01703 const AutoConstantEntry* findAutoConstantEntry(const String& paramName); 01707 const AutoConstantEntry* _findRawAutoConstantEntryFloat(size_t physicalIndex); 01711 const AutoConstantEntry* _findRawAutoConstantEntryDouble(size_t physicalIndex); 01715 const AutoConstantEntry* _findRawAutoConstantEntryInt(size_t physicalIndex); 01716 01721 void _updateAutoParams(const AutoParamDataSource* source, uint16 variabilityMask); 01722 01725 void setIgnoreMissingParams(bool state) { mIgnoreMissingParams = state; } 01726 01746 void setNamedConstant(const String& name, Real val); 01766 void setNamedConstant(const String& name, int val); 01771 void setNamedConstant(const String& name, const Vector4& vec); 01779 void setNamedConstant(const String& name, const Vector3& vec); 01784 void setNamedConstant(const String& name, const Vector2& vec); 01789 void setNamedConstant(const String& name, const Matrix4& m); 01797 void setNamedConstant(const String& name, const Matrix4* m, size_t numEntries); 01814 void setNamedConstant(const String& name, const float *val, size_t count, 01815 size_t multiple = 4); 01832 void setNamedConstant(const String& name, const double *val, size_t count, 01833 size_t multiple = 4); 01838 void setNamedConstant(const String& name, const ColourValue& colour); 01839 01856 void setNamedConstant(const String& name, const int *val, size_t count, 01857 size_t multiple = 4); 01858 01873 void setNamedAutoConstant(const String& name, AutoConstantType acType, size_t extraInfo = 0); 01874 void setNamedAutoConstantReal(const String& name, AutoConstantType acType, Real rData); 01875 01891 void setNamedAutoConstant(const String& name, AutoConstantType acType, uint16 extraInfo1, uint16 extraInfo2); 01892 01900 void setNamedConstantFromTime(const String& name, Real factor); 01901 01903 void clearNamedAutoConstant(const String& name); 01904 01914 const GpuConstantDefinition* _findNamedConstantDefinition( 01915 const String& name, bool throwExceptionIfMissing = false) const; 01922 size_t _getFloatConstantPhysicalIndex(size_t logicalIndex, size_t requestedSize, uint16 variability); 01929 size_t _getDoubleConstantPhysicalIndex(size_t logicalIndex, size_t requestedSize, uint16 variability); 01936 size_t _getIntConstantPhysicalIndex(size_t logicalIndex, size_t requestedSize, uint16 variability); 01937 01945 void setTransposeMatrices(bool val) { mTransposeMatrices = val; } 01947 bool getTransposeMatrices(void) const { return mTransposeMatrices; } 01948 01955 void copyConstantsFrom(const GpuProgramParameters& source); 01956 01965 void copyMatchingNamedConstantsFrom(const GpuProgramParameters& source); 01966 01970 static const AutoConstantDefinition* getAutoConstantDefinition(const String& name); 01975 static const AutoConstantDefinition* getAutoConstantDefinition(const size_t idx); 01978 static size_t getNumAutoConstantDefinitions(void); 01979 01980 01983 void incPassIterationNumber(void); 01985 bool hasPassIterationNumber() const 01986 { return mActivePassIterationIndex != (std::numeric_limits<size_t>::max)(); } 01988 size_t getPassIterationNumberIndex() const 01989 { return mActivePassIterationIndex; } 01990 01991 01997 void addSharedParameters(GpuSharedParametersPtr sharedParams); 01998 02006 void addSharedParameters(const String& sharedParamsName); 02007 02009 bool isUsingSharedParameters(const String& sharedParamsName) const; 02010 02012 void removeSharedParameters(const String& sharedParamsName); 02013 02015 void removeAllSharedParameters(); 02016 02018 const GpuSharedParamUsageList& getSharedParameters() const; 02019 02021 void _setRenderSystemData(const Any& data) const { mRenderSystemData = data; } 02023 const Any& _getRenderSystemData() const { return mRenderSystemData; } 02024 02032 void _copySharedParams(); 02033 02034 size_t calculateSize(void) const; 02035 02038 void setNamedSubroutine(const String& subroutineSlot, const String& subroutine); 02039 02042 void setSubroutine(size_t index, const String& subroutine); 02043 02046 const SubroutineMap& getSubroutineMap() const { return mSubroutineMap; } 02047 }; 02048 02050 typedef SharedPtr<GpuProgramParameters> GpuProgramParametersSharedPtr; 02051 02054 } 02055 02056 #include "OgreHeaderSuffix.h" 02057 02058 #endif 02059
Copyright © 2012 Torus Knot Software Ltd

This work is licensed under a Creative Commons Attribution-ShareAlike 3.0 Unported License.
Last modified Mon Jul 27 2020 13:40:43