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-2009 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 __Pass_H__ 00029 #define __Pass_H__ 00030 00031 #include "OgrePrerequisites.h" 00032 #include "OgreGpuProgram.h" 00033 #include "OgreColourValue.h" 00034 #include "OgreBlendMode.h" 00035 #include "OgreCommon.h" 00036 #include "OgreLight.h" 00037 #include "OgreTextureUnitState.h" 00038 #include "OgreUserObjectBindings.h" 00039 00040 namespace Ogre { 00041 00048 00049 enum IlluminationStage 00050 { 00052 IS_AMBIENT, 00054 IS_PER_LIGHT, 00056 IS_DECAL, 00058 IS_UNKNOWN 00059 }; 00060 00080 class _OgreExport Pass : public PassAlloc 00081 { 00082 public: 00093 struct HashFunc 00094 { 00095 virtual uint32 operator()(const Pass* p) const = 0; 00097 virtual ~HashFunc() {} 00098 }; 00099 protected: 00100 Technique* mParent; 00101 unsigned short mIndex; // pass index 00102 String mName; // optional name for the pass 00103 uint32 mHash; // pass hash 00104 bool mHashDirtyQueued; // needs to be dirtied when next loaded 00105 //------------------------------------------------------------------------- 00106 // Colour properties, only applicable in fixed-function passes 00107 ColourValue mAmbient; 00108 ColourValue mDiffuse; 00109 ColourValue mSpecular; 00110 ColourValue mEmissive; 00111 Real mShininess; 00112 TrackVertexColourType mTracking; 00113 //------------------------------------------------------------------------- 00114 00115 //------------------------------------------------------------------------- 00116 // Blending factors 00117 SceneBlendFactor mSourceBlendFactor; 00118 SceneBlendFactor mDestBlendFactor; 00119 SceneBlendFactor mSourceBlendFactorAlpha; 00120 SceneBlendFactor mDestBlendFactorAlpha; 00121 00122 // Used to determine if separate alpha blending should be used for color and alpha channels 00123 bool mSeparateBlend; 00124 00125 //------------------------------------------------------------------------- 00126 // Blending operations 00127 SceneBlendOperation mBlendOperation; 00128 SceneBlendOperation mAlphaBlendOperation; 00129 00130 // Determines if we should use separate blending operations for color and alpha channels 00131 bool mSeparateBlendOperation; 00132 00133 //------------------------------------------------------------------------- 00134 00135 //------------------------------------------------------------------------- 00136 // Depth buffer settings 00137 bool mDepthCheck; 00138 bool mDepthWrite; 00139 CompareFunction mDepthFunc; 00140 float mDepthBiasConstant; 00141 float mDepthBiasSlopeScale; 00142 float mDepthBiasPerIteration; 00143 00144 // Colour buffer settings 00145 bool mColourWrite; 00146 00147 // Alpha reject settings 00148 CompareFunction mAlphaRejectFunc; 00149 unsigned char mAlphaRejectVal; 00150 bool mAlphaToCoverageEnabled; 00151 00152 // Transparent depth sorting 00153 bool mTransparentSorting; 00154 // Transparent depth sorting forced 00155 bool mTransparentSortingForced; 00156 //------------------------------------------------------------------------- 00157 00158 //------------------------------------------------------------------------- 00159 // Culling mode 00160 CullingMode mCullMode; 00161 ManualCullingMode mManualCullMode; 00162 //------------------------------------------------------------------------- 00163 00165 bool mLightingEnabled; 00167 unsigned short mMaxSimultaneousLights; 00169 unsigned short mStartLight; 00171 bool mIteratePerLight; 00173 unsigned short mLightsPerIteration; 00174 // Should it only be run for a certain light type? 00175 bool mRunOnlyForOneLightType; 00176 Light::LightTypes mOnlyLightType; 00177 00179 ShadeOptions mShadeOptions; 00181 PolygonMode mPolygonMode; 00183 bool mNormaliseNormals; 00184 bool mPolygonModeOverrideable; 00185 //------------------------------------------------------------------------- 00186 // Fog 00187 bool mFogOverride; 00188 FogMode mFogMode; 00189 ColourValue mFogColour; 00190 Real mFogStart; 00191 Real mFogEnd; 00192 Real mFogDensity; 00193 //------------------------------------------------------------------------- 00194 00196 typedef vector<TextureUnitState*>::type TextureUnitStates; 00197 TextureUnitStates mTextureUnitStates; 00198 00199 // Vertex program details 00200 GpuProgramUsage *mVertexProgramUsage; 00201 // Vertex program details 00202 GpuProgramUsage *mShadowCasterVertexProgramUsage; 00203 // Vertex program details 00204 GpuProgramUsage *mShadowReceiverVertexProgramUsage; 00205 // Fragment program details 00206 GpuProgramUsage *mFragmentProgramUsage; 00207 // Fragment program details 00208 GpuProgramUsage *mShadowReceiverFragmentProgramUsage; 00209 // Geometry program details 00210 GpuProgramUsage *mGeometryProgramUsage; 00211 // Is this pass queued for deletion? 00212 bool mQueuedForDeletion; 00213 // number of pass iterations to perform 00214 size_t mPassIterationCount; 00215 // point size, applies when not using per-vertex point size 00216 Real mPointSize; 00217 Real mPointMinSize; 00218 Real mPointMaxSize; 00219 bool mPointSpritesEnabled; 00220 bool mPointAttenuationEnabled; 00221 // constant, linear, quadratic coeffs 00222 Real mPointAttenuationCoeffs[3]; 00223 // TU Content type lookups 00224 typedef vector<unsigned short>::type ContentTypeLookup; 00225 mutable ContentTypeLookup mShadowContentTypeLookup; 00226 mutable bool mContentTypeLookupBuilt; 00228 bool mLightScissoring; 00230 bool mLightClipPlanes; 00232 IlluminationStage mIlluminationStage; 00233 // User objects binding. 00234 UserObjectBindings mUserObjectBindings; 00235 00236 00237 // Used to get scene blending flags from a blending type 00238 void _getBlendFlags(SceneBlendType type, SceneBlendFactor& source, SceneBlendFactor& dest); 00239 00240 public: 00241 typedef set<Pass*>::type PassSet; 00242 protected: 00244 static PassSet msDirtyHashList; 00246 static PassSet msPassGraveyard; 00248 static HashFunc* msHashFunc; 00249 public: 00250 OGRE_STATIC_MUTEX(msDirtyHashListMutex) 00251 OGRE_STATIC_MUTEX(msPassGraveyardMutex) 00252 OGRE_MUTEX(mTexUnitChangeMutex) 00253 OGRE_MUTEX(mGpuProgramChangeMutex) 00255 Pass(Technique* parent, unsigned short index); 00257 Pass(Technique* parent, unsigned short index, const Pass& oth ); 00259 Pass& operator=(const Pass& oth); 00260 virtual ~Pass(); 00261 00263 bool isProgrammable(void) const { return mVertexProgramUsage || mFragmentProgramUsage || mGeometryProgramUsage; } 00265 bool hasVertexProgram(void) const { return mVertexProgramUsage != NULL; } 00267 bool hasFragmentProgram(void) const { return mFragmentProgramUsage != NULL; } 00269 bool hasGeometryProgram(void) const { return mGeometryProgramUsage != NULL; } 00271 bool hasShadowCasterVertexProgram(void) const { return mShadowCasterVertexProgramUsage != NULL; } 00273 bool hasShadowReceiverVertexProgram(void) const { return mShadowReceiverVertexProgramUsage != NULL; } 00275 bool hasShadowReceiverFragmentProgram(void) const { return mShadowReceiverFragmentProgramUsage != NULL; } 00276 00277 00279 unsigned short getIndex(void) const { return mIndex; } 00280 /* Set the name of the pass 00281 @remarks 00282 The name of the pass is optional. Its useful in material scripts where a material could inherit 00283 from another material and only want to modify a particular pass. 00284 */ 00285 void setName(const String& name); 00287 const String& getName(void) const { return mName; } 00288 00300 void setAmbient(Real red, Real green, Real blue); 00301 00314 void setAmbient(const ColourValue& ambient); 00315 00326 void setDiffuse(Real red, Real green, Real blue, Real alpha); 00327 00338 void setDiffuse(const ColourValue& diffuse); 00339 00352 void setSpecular(Real red, Real green, Real blue, Real alpha); 00353 00366 void setSpecular(const ColourValue& specular); 00367 00373 void setShininess(Real val); 00374 00384 void setSelfIllumination(Real red, Real green, Real blue); 00385 00395 void setSelfIllumination(const ColourValue& selfIllum); 00396 00399 void setVertexColourTracking(TrackVertexColourType tracking); 00400 00406 Real getPointSize(void) const; 00407 00423 void setPointSize(Real ps); 00424 00430 void setPointSpritesEnabled(bool enabled); 00431 00435 bool getPointSpritesEnabled(void) const; 00436 00453 void setPointAttenuation(bool enabled, 00454 Real constant = 0.0f, Real linear = 1.0f, Real quadratic = 0.0f); 00455 00457 bool isPointAttenuationEnabled(void) const; 00458 00460 Real getPointAttenuationConstant(void) const; 00462 Real getPointAttenuationLinear(void) const; 00464 Real getPointAttenuationQuadratic(void) const; 00465 00467 void setPointMinSize(Real min); 00469 Real getPointMinSize(void) const; 00473 void setPointMaxSize(Real max); 00477 Real getPointMaxSize(void) const; 00478 00481 const ColourValue& getAmbient(void) const; 00482 00485 const ColourValue& getDiffuse(void) const; 00486 00489 const ColourValue& getSpecular(void) const; 00490 00493 const ColourValue& getSelfIllumination(void) const; 00494 00497 Real getShininess(void) const; 00498 00501 TrackVertexColourType getVertexColourTracking(void) const; 00502 00507 TextureUnitState* createTextureUnitState(void); 00518 TextureUnitState* createTextureUnitState( const String& textureName, unsigned short texCoordSet = 0); 00524 void addTextureUnitState(TextureUnitState* state); 00527 TextureUnitState* getTextureUnitState(unsigned short index); 00531 TextureUnitState* getTextureUnitState(const String& name); 00534 const TextureUnitState* getTextureUnitState(unsigned short index) const; 00538 const TextureUnitState* getTextureUnitState(const String& name) const; 00539 00546 unsigned short getTextureUnitStateIndex(const TextureUnitState* state) const; 00547 00548 typedef VectorIterator<TextureUnitStates> TextureUnitStateIterator; 00550 TextureUnitStateIterator getTextureUnitStateIterator(void); 00551 00552 typedef ConstVectorIterator<TextureUnitStates> ConstTextureUnitStateIterator; 00554 ConstTextureUnitStateIterator getTextureUnitStateIterator(void) const; 00555 00560 void removeTextureUnitState(unsigned short index); 00561 00564 void removeAllTextureUnitStates(void); 00565 00568 unsigned short getNumTextureUnitStates(void) const 00569 { 00570 return static_cast<unsigned short>(mTextureUnitStates.size()); 00571 } 00572 00589 void setSceneBlending( const SceneBlendType sbt ); 00590 00609 void setSeparateSceneBlending( const SceneBlendType sbt, const SceneBlendType sbta ); 00610 00633 void setSceneBlending( const SceneBlendFactor sourceFactor, const SceneBlendFactor destFactor); 00634 00661 void setSeparateSceneBlending( const SceneBlendFactor sourceFactor, const SceneBlendFactor destFactor, const SceneBlendFactor sourceFactorAlpha, const SceneBlendFactor destFactorAlpha ); 00662 00664 bool hasSeparateSceneBlending() const; 00665 00668 SceneBlendFactor getSourceBlendFactor() const; 00669 00672 SceneBlendFactor getDestBlendFactor() const; 00673 00676 SceneBlendFactor getSourceBlendFactorAlpha() const; 00677 00680 SceneBlendFactor getDestBlendFactorAlpha() const; 00681 00692 void setSceneBlendingOperation(SceneBlendOperation op); 00693 00707 void setSeparateSceneBlendingOperation(SceneBlendOperation op, SceneBlendOperation alphaOp); 00708 00710 bool hasSeparateSceneBlendingOperations() const; 00711 00713 SceneBlendOperation getSceneBlendingOperation() const; 00714 00716 SceneBlendOperation getSceneBlendingOperationAlpha() const; 00717 00719 bool isTransparent(void) const; 00720 00732 void setDepthCheckEnabled(bool enabled); 00733 00738 bool getDepthCheckEnabled(void) const; 00739 00750 void setDepthWriteEnabled(bool enabled); 00751 00756 bool getDepthWriteEnabled(void) const; 00757 00765 void setDepthFunction( CompareFunction func ); 00770 CompareFunction getDepthFunction(void) const; 00771 00782 void setColourWriteEnabled(bool enabled); 00784 bool getColourWriteEnabled(void) const; 00785 00799 void setCullingMode( CullingMode mode ); 00800 00803 CullingMode getCullingMode(void) const; 00804 00818 void setManualCullingMode( ManualCullingMode mode ); 00819 00824 ManualCullingMode getManualCullingMode(void) const; 00825 00834 void setLightingEnabled(bool enabled); 00835 00838 bool getLightingEnabled(void) const; 00839 00848 void setMaxSimultaneousLights(unsigned short maxLights); 00850 unsigned short getMaxSimultaneousLights(void) const; 00851 00862 void setStartLight(unsigned short startLight); 00864 unsigned short getStartLight(void) const; 00865 00870 void setShadingMode( ShadeOptions mode ); 00871 00874 ShadeOptions getShadingMode(void) const; 00875 00880 void setPolygonMode( PolygonMode mode ); 00881 00884 PolygonMode getPolygonMode(void) const; 00885 00891 virtual void setPolygonModeOverrideable(bool override) 00892 { 00893 mPolygonModeOverrideable = override; 00894 } 00895 00899 virtual bool getPolygonModeOverrideable(void) const 00900 { 00901 return mPolygonModeOverrideable; 00902 } 00932 void setFog( 00933 bool overrideScene, 00934 FogMode mode = FOG_NONE, 00935 const ColourValue& colour = ColourValue::White, 00936 Real expDensity = 0.001, Real linearStart = 0.0, Real linearEnd = 1.0 ); 00937 00940 bool getFogOverride(void) const; 00941 00946 FogMode getFogMode(void) const; 00947 00950 const ColourValue& getFogColour(void) const; 00951 00956 Real getFogStart(void) const; 00957 00962 Real getFogEnd(void) const; 00963 00968 Real getFogDensity(void) const; 00969 00989 void setDepthBias(float constantBias, float slopeScaleBias = 0.0f); 00990 00992 float getDepthBiasConstant(void) const; 00994 float getDepthBiasSlopeScale(void) const; 01001 void setIterationDepthBias(float biasPerIteration); 01005 float getIterationDepthBias() const; 01006 01016 void setAlphaRejectSettings(CompareFunction func, unsigned char value, bool alphaToCoverageEnabled = false); 01017 01020 void setAlphaRejectFunction(CompareFunction func); 01021 01024 void setAlphaRejectValue(unsigned char val); 01025 01028 CompareFunction getAlphaRejectFunction(void) const { return mAlphaRejectFunc; } 01029 01032 unsigned char getAlphaRejectValue(void) const { return mAlphaRejectVal; } 01033 01041 void setAlphaToCoverageEnabled(bool enabled); 01042 01045 bool isAlphaToCoverageEnabled() const { return mAlphaToCoverageEnabled; } 01046 01059 void setTransparentSortingEnabled(bool enabled); 01060 01063 bool getTransparentSortingEnabled(void) const; 01064 01074 void setTransparentSortingForced(bool enabled); 01075 01078 bool getTransparentSortingForced(void) const; 01079 01122 void setIteratePerLight(bool enabled, 01123 bool onlyForOneLightType = true, Light::LightTypes lightType = Light::LT_POINT); 01124 01126 bool getIteratePerLight(void) const { return mIteratePerLight; } 01128 bool getRunOnlyForOneLightType(void) const { return mRunOnlyForOneLightType; } 01131 Light::LightTypes getOnlyLightType() const { return mOnlyLightType; } 01132 01142 void setLightCountPerIteration(unsigned short c); 01146 unsigned short getLightCountPerIteration(void) const; 01147 01149 Technique* getParent(void) const { return mParent; } 01150 01152 const String& getResourceGroup(void) const; 01153 01170 void setVertexProgram(const String& name, bool resetParams = true); 01177 void setVertexProgramParameters(GpuProgramParametersSharedPtr params); 01179 const String& getVertexProgramName(void) const; 01181 GpuProgramParametersSharedPtr getVertexProgramParameters(void) const; 01183 const GpuProgramPtr& getVertexProgram(void) const; 01184 01185 01215 void setShadowCasterVertexProgram(const String& name); 01222 void setShadowCasterVertexProgramParameters(GpuProgramParametersSharedPtr params); 01224 const String& getShadowCasterVertexProgramName(void) const; 01226 GpuProgramParametersSharedPtr getShadowCasterVertexProgramParameters(void) const; 01229 const GpuProgramPtr& getShadowCasterVertexProgram(void) const; 01230 01256 void setShadowReceiverVertexProgram(const String& name); 01263 void setShadowReceiverVertexProgramParameters(GpuProgramParametersSharedPtr params); 01264 01285 void setShadowReceiverFragmentProgram(const String& name); 01292 void setShadowReceiverFragmentProgramParameters(GpuProgramParametersSharedPtr params); 01293 01295 const String& getShadowReceiverVertexProgramName(void) const; 01297 GpuProgramParametersSharedPtr getShadowReceiverVertexProgramParameters(void) const; 01300 const GpuProgramPtr& getShadowReceiverVertexProgram(void) const; 01301 01303 const String& getShadowReceiverFragmentProgramName(void) const; 01305 GpuProgramParametersSharedPtr getShadowReceiverFragmentProgramParameters(void) const; 01308 const GpuProgramPtr& getShadowReceiverFragmentProgram(void) const; 01309 01326 void setFragmentProgram(const String& name, bool resetParams = true); 01331 void setFragmentProgramParameters(GpuProgramParametersSharedPtr params); 01333 const String& getFragmentProgramName(void) const; 01335 GpuProgramParametersSharedPtr getFragmentProgramParameters(void) const; 01337 const GpuProgramPtr& getFragmentProgram(void) const; 01338 01355 void setGeometryProgram(const String& name, bool resetParams = true); 01360 void setGeometryProgramParameters(GpuProgramParametersSharedPtr params); 01362 const String& getGeometryProgramName(void) const; 01364 GpuProgramParametersSharedPtr getGeometryProgramParameters(void) const; 01366 const GpuProgramPtr& getGeometryProgram(void) const; 01367 01379 Pass* _split(unsigned short numUnits); 01380 01382 void _notifyIndex(unsigned short index); 01383 01385 void _prepare(void); 01387 void _unprepare(void); 01389 void _load(void); 01391 void _unload(void); 01392 // Is this loaded? 01393 bool isLoaded(void) const; 01394 01401 uint32 getHash(void) const { return mHash; } 01403 void _dirtyHash(void); 01410 void _recalculateHash(void); 01412 void _notifyNeedsRecompile(void); 01413 01418 void _updateAutoParams(const AutoParamDataSource* source, uint16 variabilityMask) const; 01419 01426 unsigned short _getTextureUnitWithContentTypeIndex( 01427 TextureUnitState::ContentType contentType, unsigned short index) const; 01428 01437 void setTextureFiltering(TextureFilterOptions filterType); 01446 void setTextureAnisotropy(unsigned int maxAniso); 01458 void setNormaliseNormals(bool normalise) { mNormaliseNormals = normalise; } 01459 01461 bool getNormaliseNormals(void) const {return mNormaliseNormals; } 01462 01466 static const PassSet& getDirtyHashList(void) 01467 { return msDirtyHashList; } 01470 static const PassSet& getPassGraveyard(void) 01471 { return msPassGraveyard; } 01479 static void clearDirtyHashList(void); 01480 01482 static void processPendingPassUpdates(void); 01483 01485 void queueForDeletion(void); 01486 01489 bool isAmbientOnly(void) const; 01490 01504 void setPassIterationCount(const size_t count) { mPassIterationCount = count; } 01505 01508 size_t getPassIterationCount(void) const { return mPassIterationCount; } 01509 01521 bool applyTextureAliases(const AliasTextureNamePairList& aliasList, const bool apply = true) const; 01522 01543 void setLightScissoringEnabled(bool enabled) { mLightScissoring = enabled; } 01547 bool getLightScissoringEnabled() const { return mLightScissoring; } 01548 01572 void setLightClipPlanesEnabled(bool enabled) { mLightClipPlanes = enabled; } 01576 bool getLightClipPlanesEnabled() const { return mLightClipPlanes; } 01577 01599 void setIlluminationStage(IlluminationStage is) { mIlluminationStage = is; } 01601 IlluminationStage getIlluminationStage() const { return mIlluminationStage; } 01605 enum BuiltinHashFunction 01606 { 01608 MIN_TEXTURE_CHANGE, 01613 MIN_GPU_PROGRAM_CHANGE 01614 }; 01627 static void setHashFunction(BuiltinHashFunction builtin); 01628 01640 static void setHashFunction(HashFunc* hashFunc) { msHashFunc = hashFunc; } 01641 01644 static HashFunc* getHashFunction(void) { return msHashFunc; } 01645 01648 static HashFunc* getBuiltinHashFunction(BuiltinHashFunction builtin); 01649 01654 UserObjectBindings& getUserObjectBindings() { return mUserObjectBindings; } 01655 01660 const UserObjectBindings& getUserObjectBindings() const { return mUserObjectBindings; } 01661 }; 01662 01672 struct IlluminationPass : public PassAlloc 01673 { 01674 IlluminationStage stage; 01676 Pass* pass; 01678 bool destroyOnShutdown; 01680 Pass* originalPass; 01681 01682 IlluminationPass() {} 01683 }; 01684 01685 typedef vector<IlluminationPass*>::type IlluminationPassList; 01686 01690 } 01691 01692 #endif
Copyright © 2008 Torus Knot Software Ltd
This work is licensed under a Creative Commons Attribution-ShareAlike 3.0 Unported License.
Last modified Wed Nov 3 2010 19:24:52