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-2006 Torus Knot Software Ltd 00008 Also see acknowledgements in Readme.html 00009 00010 This program is free software; you can redistribute it and/or modify it under 00011 the terms of the GNU Lesser General Public License as published by the Free Software 00012 Foundation; either version 2 of the License, or (at your option) any later 00013 version. 00014 00015 This program is distributed in the hope that it will be useful, but WITHOUT 00016 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS 00017 FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. 00018 00019 You should have received a copy of the GNU Lesser General Public License along with 00020 this program; if not, write to the Free Software Foundation, Inc., 59 Temple 00021 Place - Suite 330, Boston, MA 02111-1307, USA, or go to 00022 http://www.gnu.org/copyleft/lesser.txt. 00023 00024 You may alternatively use this source under the terms of a specific version of 00025 the OGRE Unrestricted License provided you have obtained such a license from 00026 Torus Knot Software Ltd. 00027 ----------------------------------------------------------------------------- 00028 */ 00029 #ifndef __Pass_H__ 00030 #define __Pass_H__ 00031 00032 #include "OgrePrerequisites.h" 00033 #include "OgreGpuProgram.h" 00034 #include "OgreColourValue.h" 00035 #include "OgreBlendMode.h" 00036 #include "OgreCommon.h" 00037 #include "OgreLight.h" 00038 #include "OgreTextureUnitState.h" 00039 00040 namespace Ogre { 00041 00043 enum IlluminationStage 00044 { 00046 IS_AMBIENT, 00048 IS_PER_LIGHT, 00050 IS_DECAL, 00052 IS_UNKNOWN 00053 }; 00054 00074 class _OgreExport Pass : public PassAlloc 00075 { 00076 public: 00087 struct HashFunc 00088 { 00089 virtual uint32 operator()(const Pass* p) const = 0; 00091 virtual ~HashFunc() {} 00092 }; 00093 protected: 00094 Technique* mParent; 00095 unsigned short mIndex; // pass index 00096 String mName; // optional name for the pass 00097 uint32 mHash; // pass hash 00098 bool mHashDirtyQueued; // needs to be dirtied when next loaded 00099 //------------------------------------------------------------------------- 00100 // Colour properties, only applicable in fixed-function passes 00101 ColourValue mAmbient; 00102 ColourValue mDiffuse; 00103 ColourValue mSpecular; 00104 ColourValue mEmissive; 00105 Real mShininess; 00106 TrackVertexColourType mTracking; 00107 //------------------------------------------------------------------------- 00108 00109 //------------------------------------------------------------------------- 00110 // Blending factors 00111 SceneBlendFactor mSourceBlendFactor; 00112 SceneBlendFactor mDestBlendFactor; 00113 SceneBlendFactor mSourceBlendFactorAlpha; 00114 SceneBlendFactor mDestBlendFactorAlpha; 00115 00116 // Used to determine if separate alpha blending should be used for color and alpha channels 00117 bool mSeparateBlend; 00118 //------------------------------------------------------------------------- 00119 00120 //------------------------------------------------------------------------- 00121 // Depth buffer settings 00122 bool mDepthCheck; 00123 bool mDepthWrite; 00124 CompareFunction mDepthFunc; 00125 float mDepthBiasConstant; 00126 float mDepthBiasSlopeScale; 00127 float mDepthBiasPerIteration; 00128 00129 // Colour buffer settings 00130 bool mColourWrite; 00131 00132 // Alpha reject settings 00133 CompareFunction mAlphaRejectFunc; 00134 unsigned char mAlphaRejectVal; 00135 bool mAlphaToCoverageEnabled; 00136 00137 // Transparent depth sorting 00138 bool mTransparentSorting; 00139 //------------------------------------------------------------------------- 00140 00141 //------------------------------------------------------------------------- 00142 // Culling mode 00143 CullingMode mCullMode; 00144 ManualCullingMode mManualCullMode; 00145 //------------------------------------------------------------------------- 00146 00148 bool mLightingEnabled; 00150 unsigned short mMaxSimultaneousLights; 00152 unsigned short mStartLight; 00154 bool mIteratePerLight; 00156 unsigned short mLightsPerIteration; 00157 // Should it only be run for a certain light type? 00158 bool mRunOnlyForOneLightType; 00159 Light::LightTypes mOnlyLightType; 00160 00162 ShadeOptions mShadeOptions; 00164 PolygonMode mPolygonMode; 00166 bool mNormaliseNormals; 00167 bool mPolygonModeOverrideable; 00168 //------------------------------------------------------------------------- 00169 // Fog 00170 bool mFogOverride; 00171 FogMode mFogMode; 00172 ColourValue mFogColour; 00173 Real mFogStart; 00174 Real mFogEnd; 00175 Real mFogDensity; 00176 //------------------------------------------------------------------------- 00177 00179 typedef std::vector<TextureUnitState*> TextureUnitStates; 00180 TextureUnitStates mTextureUnitStates; 00181 00182 // Vertex program details 00183 GpuProgramUsage *mVertexProgramUsage; 00184 // Vertex program details 00185 GpuProgramUsage *mShadowCasterVertexProgramUsage; 00186 // Vertex program details 00187 GpuProgramUsage *mShadowReceiverVertexProgramUsage; 00188 // Fragment program details 00189 GpuProgramUsage *mFragmentProgramUsage; 00190 // Fragment program details 00191 GpuProgramUsage *mShadowReceiverFragmentProgramUsage; 00192 // Geometry program details 00193 GpuProgramUsage *mGeometryProgramUsage; 00194 // Is this pass queued for deletion? 00195 bool mQueuedForDeletion; 00196 // number of pass iterations to perform 00197 size_t mPassIterationCount; 00198 // point size, applies when not using per-vertex point size 00199 Real mPointSize; 00200 Real mPointMinSize; 00201 Real mPointMaxSize; 00202 bool mPointSpritesEnabled; 00203 bool mPointAttenuationEnabled; 00204 // constant, linear, quadratic coeffs 00205 Real mPointAttenuationCoeffs[3]; 00206 // TU Content type lookups 00207 typedef std::vector<unsigned short> ContentTypeLookup; 00208 mutable ContentTypeLookup mShadowContentTypeLookup; 00209 mutable bool mContentTypeLookupBuilt; 00211 bool mLightScissoring; 00213 bool mLightClipPlanes; 00215 IlluminationStage mIlluminationStage; 00216 00217 // Used to get scene blending flags from a blending type 00218 void _getBlendFlags(SceneBlendType type, SceneBlendFactor& source, SceneBlendFactor& dest); 00219 00220 public: 00221 typedef std::set<Pass*> PassSet; 00222 protected: 00224 static PassSet msDirtyHashList; 00226 static PassSet msPassGraveyard; 00228 static HashFunc* msHashFunc; 00229 public: 00230 OGRE_STATIC_MUTEX(msDirtyHashListMutex) 00231 OGRE_STATIC_MUTEX(msPassGraveyardMutex) 00232 OGRE_MUTEX(mTexUnitChangeMutex) 00233 OGRE_MUTEX(mGpuProgramChangeMutex) 00235 Pass(Technique* parent, unsigned short index); 00237 Pass(Technique* parent, unsigned short index, const Pass& oth ); 00239 Pass& operator=(const Pass& oth); 00240 virtual ~Pass(); 00241 00243 bool isProgrammable(void) const { return mVertexProgramUsage || mFragmentProgramUsage || mGeometryProgramUsage; } 00245 bool hasVertexProgram(void) const { return mVertexProgramUsage != NULL; } 00247 bool hasFragmentProgram(void) const { return mFragmentProgramUsage != NULL; } 00249 bool hasGeometryProgram(void) const { return mGeometryProgramUsage != NULL; } 00251 bool hasShadowCasterVertexProgram(void) const { return mShadowCasterVertexProgramUsage != NULL; } 00253 bool hasShadowReceiverVertexProgram(void) const { return mShadowReceiverVertexProgramUsage != NULL; } 00255 bool hasShadowReceiverFragmentProgram(void) const { return mShadowReceiverFragmentProgramUsage != NULL; } 00256 00257 00259 unsigned short getIndex(void) const { return mIndex; } 00260 /* Set the name of the pass 00261 @remarks 00262 The name of the pass is optional. Its useful in material scripts where a material could inherit 00263 from another material and only want to modify a particular pass. 00264 */ 00265 void setName(const String& name); 00267 const String& getName(void) const { return mName; } 00268 00280 void setAmbient(Real red, Real green, Real blue); 00281 00294 void setAmbient(const ColourValue& ambient); 00295 00306 void setDiffuse(Real red, Real green, Real blue, Real alpha); 00307 00318 void setDiffuse(const ColourValue& diffuse); 00319 00332 void setSpecular(Real red, Real green, Real blue, Real alpha); 00333 00346 void setSpecular(const ColourValue& specular); 00347 00353 void setShininess(Real val); 00354 00364 void setSelfIllumination(Real red, Real green, Real blue); 00365 00375 void setSelfIllumination(const ColourValue& selfIllum); 00376 00379 void setVertexColourTracking(TrackVertexColourType tracking); 00380 00386 Real getPointSize(void) const; 00387 00403 void setPointSize(Real ps); 00404 00410 void setPointSpritesEnabled(bool enabled); 00411 00415 bool getPointSpritesEnabled(void) const; 00416 00433 void setPointAttenuation(bool enabled, 00434 Real constant = 0.0f, Real linear = 1.0f, Real quadratic = 0.0f); 00435 00437 bool isPointAttenuationEnabled(void) const; 00438 00440 Real getPointAttenuationConstant(void) const; 00442 Real getPointAttenuationLinear(void) const; 00444 Real getPointAttenuationQuadratic(void) const; 00445 00447 void setPointMinSize(Real min); 00449 Real getPointMinSize(void) const; 00453 void setPointMaxSize(Real max); 00457 Real getPointMaxSize(void) const; 00458 00461 const ColourValue& getAmbient(void) const; 00462 00465 const ColourValue& getDiffuse(void) const; 00466 00469 const ColourValue& getSpecular(void) const; 00470 00473 const ColourValue& getSelfIllumination(void) const; 00474 00477 Real getShininess(void) const; 00478 00481 TrackVertexColourType getVertexColourTracking(void) const; 00482 00487 TextureUnitState* createTextureUnitState(void); 00498 TextureUnitState* createTextureUnitState( const String& textureName, unsigned short texCoordSet = 0); 00504 void addTextureUnitState(TextureUnitState* state); 00507 TextureUnitState* getTextureUnitState(unsigned short index); 00511 TextureUnitState* getTextureUnitState(const String& name); 00514 const TextureUnitState* getTextureUnitState(unsigned short index) const; 00518 const TextureUnitState* getTextureUnitState(const String& name) const; 00519 00526 unsigned short getTextureUnitStateIndex(const TextureUnitState* state) const; 00527 00528 typedef VectorIterator<TextureUnitStates> TextureUnitStateIterator; 00530 TextureUnitStateIterator getTextureUnitStateIterator(void); 00531 00532 typedef ConstVectorIterator<TextureUnitStates> ConstTextureUnitStateIterator; 00534 ConstTextureUnitStateIterator getTextureUnitStateIterator(void) const; 00535 00540 void removeTextureUnitState(unsigned short index); 00541 00544 void removeAllTextureUnitStates(void); 00545 00548 unsigned short getNumTextureUnitStates(void) const 00549 { 00550 return static_cast<unsigned short>(mTextureUnitStates.size()); 00551 } 00552 00569 void setSceneBlending( const SceneBlendType sbt ); 00570 00589 void setSeparateSceneBlending( const SceneBlendType sbt, const SceneBlendType sbta ); 00590 00613 void setSceneBlending( const SceneBlendFactor sourceFactor, const SceneBlendFactor destFactor); 00614 00641 void setSeparateSceneBlending( const SceneBlendFactor sourceFactor, const SceneBlendFactor destFactor, const SceneBlendFactor sourceFactorAlpha, const SceneBlendFactor destFactorAlpha ); 00642 00644 bool hasSeparateSceneBlending() const; 00645 00648 SceneBlendFactor getSourceBlendFactor() const; 00649 00652 SceneBlendFactor getDestBlendFactor() const; 00653 00656 SceneBlendFactor getSourceBlendFactorAlpha() const; 00657 00660 SceneBlendFactor getDestBlendFactorAlpha() const; 00661 00663 bool isTransparent(void) const; 00664 00676 void setDepthCheckEnabled(bool enabled); 00677 00682 bool getDepthCheckEnabled(void) const; 00683 00694 void setDepthWriteEnabled(bool enabled); 00695 00700 bool getDepthWriteEnabled(void) const; 00701 00709 void setDepthFunction( CompareFunction func ); 00714 CompareFunction getDepthFunction(void) const; 00715 00726 void setColourWriteEnabled(bool enabled); 00728 bool getColourWriteEnabled(void) const; 00729 00743 void setCullingMode( CullingMode mode ); 00744 00747 CullingMode getCullingMode(void) const; 00748 00762 void setManualCullingMode( ManualCullingMode mode ); 00763 00768 ManualCullingMode getManualCullingMode(void) const; 00769 00778 void setLightingEnabled(bool enabled); 00779 00782 bool getLightingEnabled(void) const; 00783 00792 void setMaxSimultaneousLights(unsigned short maxLights); 00794 unsigned short getMaxSimultaneousLights(void) const; 00795 00806 void setStartLight(unsigned short startLight); 00808 unsigned short getStartLight(void) const; 00809 00814 void setShadingMode( ShadeOptions mode ); 00815 00818 ShadeOptions getShadingMode(void) const; 00819 00824 void setPolygonMode( PolygonMode mode ); 00825 00828 PolygonMode getPolygonMode(void) const; 00829 00835 virtual void setPolygonModeOverrideable(bool override) 00836 { 00837 mPolygonModeOverrideable = override; 00838 } 00839 00843 virtual bool getPolygonModeOverrideable(void) const 00844 { 00845 return mPolygonModeOverrideable; 00846 } 00876 void setFog( 00877 bool overrideScene, 00878 FogMode mode = FOG_NONE, 00879 const ColourValue& colour = ColourValue::White, 00880 Real expDensity = 0.001, Real linearStart = 0.0, Real linearEnd = 1.0 ); 00881 00884 bool getFogOverride(void) const; 00885 00890 FogMode getFogMode(void) const; 00891 00894 const ColourValue& getFogColour(void) const; 00895 00900 Real getFogStart(void) const; 00901 00906 Real getFogEnd(void) const; 00907 00912 Real getFogDensity(void) const; 00913 00933 void setDepthBias(float constantBias, float slopeScaleBias = 0.0f); 00934 00936 float getDepthBiasConstant(void) const; 00938 float getDepthBiasSlopeScale(void) const; 00945 void setIterationDepthBias(float biasPerIteration); 00949 float getIterationDepthBias() const; 00950 00960 void setAlphaRejectSettings(CompareFunction func, unsigned char value, bool alphaToCoverageEnabled = false); 00961 00964 void setAlphaRejectFunction(CompareFunction func); 00965 00968 void setAlphaRejectValue(unsigned char val); 00969 00972 CompareFunction getAlphaRejectFunction(void) const { return mAlphaRejectFunc; } 00973 00976 unsigned char getAlphaRejectValue(void) const { return mAlphaRejectVal; } 00977 00985 void setAlphaToCoverageEnabled(bool enabled); 00986 00989 bool isAlphaToCoverageEnabled() const { return mAlphaToCoverageEnabled; } 00990 01003 void setTransparentSortingEnabled(bool enabled); 01004 01007 bool getTransparentSortingEnabled(void) const; 01008 01051 void setIteratePerLight(bool enabled, 01052 bool onlyForOneLightType = true, Light::LightTypes lightType = Light::LT_POINT); 01053 01055 bool getIteratePerLight(void) const { return mIteratePerLight; } 01057 bool getRunOnlyForOneLightType(void) const { return mRunOnlyForOneLightType; } 01060 Light::LightTypes getOnlyLightType() const { return mOnlyLightType; } 01061 01071 void setLightCountPerIteration(unsigned short c); 01075 unsigned short getLightCountPerIteration(void) const; 01076 01078 Technique* getParent(void) const { return mParent; } 01079 01081 const String& getResourceGroup(void) const; 01082 01099 void setVertexProgram(const String& name, bool resetParams = true); 01106 void setVertexProgramParameters(GpuProgramParametersSharedPtr params); 01108 const String& getVertexProgramName(void) const; 01110 GpuProgramParametersSharedPtr getVertexProgramParameters(void) const; 01112 const GpuProgramPtr& getVertexProgram(void) const; 01113 01114 01144 void setShadowCasterVertexProgram(const String& name); 01151 void setShadowCasterVertexProgramParameters(GpuProgramParametersSharedPtr params); 01153 const String& getShadowCasterVertexProgramName(void) const; 01155 GpuProgramParametersSharedPtr getShadowCasterVertexProgramParameters(void) const; 01158 const GpuProgramPtr& getShadowCasterVertexProgram(void) const; 01159 01185 void setShadowReceiverVertexProgram(const String& name); 01192 void setShadowReceiverVertexProgramParameters(GpuProgramParametersSharedPtr params); 01193 01214 void setShadowReceiverFragmentProgram(const String& name); 01221 void setShadowReceiverFragmentProgramParameters(GpuProgramParametersSharedPtr params); 01222 01224 const String& getShadowReceiverVertexProgramName(void) const; 01226 GpuProgramParametersSharedPtr getShadowReceiverVertexProgramParameters(void) const; 01229 const GpuProgramPtr& getShadowReceiverVertexProgram(void) const; 01230 01232 const String& getShadowReceiverFragmentProgramName(void) const; 01234 GpuProgramParametersSharedPtr getShadowReceiverFragmentProgramParameters(void) const; 01237 const GpuProgramPtr& getShadowReceiverFragmentProgram(void) const; 01238 01255 void setFragmentProgram(const String& name, bool resetParams = true); 01260 void setFragmentProgramParameters(GpuProgramParametersSharedPtr params); 01262 const String& getFragmentProgramName(void) const; 01264 GpuProgramParametersSharedPtr getFragmentProgramParameters(void) const; 01266 const GpuProgramPtr& getFragmentProgram(void) const; 01267 01284 void setGeometryProgram(const String& name, bool resetParams = true); 01289 void setGeometryProgramParameters(GpuProgramParametersSharedPtr params); 01291 const String& getGeometryProgramName(void) const; 01293 GpuProgramParametersSharedPtr getGeometryProgramParameters(void) const; 01295 const GpuProgramPtr& getGeometryProgram(void) const; 01296 01308 Pass* _split(unsigned short numUnits); 01309 01311 void _notifyIndex(unsigned short index); 01312 01314 void _prepare(void); 01316 void _unprepare(void); 01318 void _load(void); 01320 void _unload(void); 01321 // Is this loaded? 01322 bool isLoaded(void) const; 01323 01330 uint32 getHash(void) const { return mHash; } 01332 void _dirtyHash(void); 01339 void _recalculateHash(void); 01341 void _notifyNeedsRecompile(void); 01342 01344 void _updateAutoParamsNoLights(const AutoParamDataSource* source) const; 01346 void _updateAutoParamsLightsOnly(const AutoParamDataSource* source) const; 01347 01354 unsigned short _getTextureUnitWithContentTypeIndex( 01355 TextureUnitState::ContentType contentType, unsigned short index) const; 01356 01365 void setTextureFiltering(TextureFilterOptions filterType); 01374 void setTextureAnisotropy(unsigned int maxAniso); 01386 void setNormaliseNormals(bool normalise) { mNormaliseNormals = normalise; } 01387 01389 bool getNormaliseNormals(void) const {return mNormaliseNormals; } 01390 01394 static const PassSet& getDirtyHashList(void) 01395 { return msDirtyHashList; } 01398 static const PassSet& getPassGraveyard(void) 01399 { return msPassGraveyard; } 01407 static void clearDirtyHashList(void); 01408 01410 static void processPendingPassUpdates(void); 01411 01413 void queueForDeletion(void); 01414 01417 bool isAmbientOnly(void) const; 01418 01432 void setPassIterationCount(const size_t count) { mPassIterationCount = count; } 01433 01436 size_t getPassIterationCount(void) const { return mPassIterationCount; } 01437 01449 bool applyTextureAliases(const AliasTextureNamePairList& aliasList, const bool apply = true) const; 01450 01471 void setLightScissoringEnabled(bool enabled) { mLightScissoring = enabled; } 01475 bool getLightScissoringEnabled() const { return mLightScissoring; } 01476 01500 void setLightClipPlanesEnabled(bool enabled) { mLightClipPlanes = enabled; } 01504 bool getLightClipPlanesEnabled() const { return mLightClipPlanes; } 01505 01527 void setIlluminationStage(IlluminationStage is) { mIlluminationStage = is; } 01529 IlluminationStage getIlluminationStage() const { return mIlluminationStage; } 01533 enum BuiltinHashFunction 01534 { 01536 MIN_TEXTURE_CHANGE, 01541 MIN_GPU_PROGRAM_CHANGE 01542 }; 01555 static void setHashFunction(BuiltinHashFunction builtin); 01556 01568 static void setHashFunction(HashFunc* hashFunc) { msHashFunc = hashFunc; } 01569 01572 static HashFunc* getHashFunction(void) { return msHashFunc; } 01573 01574 }; 01575 01585 struct IlluminationPass : public PassAlloc 01586 { 01587 IlluminationStage stage; 01589 Pass* pass; 01591 bool destroyOnShutdown; 01593 Pass* originalPass; 01594 01595 IlluminationPass() {} 01596 }; 01597 01598 typedef std::vector<IlluminationPass*> IlluminationPassList; 01599 01600 01601 } 01602 01603 #endif
Copyright © 2008 Torus Knot Software Ltd
This work is licensed under a Creative Commons Attribution-ShareAlike 2.5 License.
Last modified Sun Sep 27 22:02:24 2009