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-2011 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 __TextureUnitState_H__ 00029 #define __TextureUnitState_H__ 00030 00031 #include "OgrePrerequisites.h" 00032 #include "OgreCommon.h" 00033 #include "OgreBlendMode.h" 00034 #include "OgreMatrix4.h" 00035 #include "OgreIteratorWrappers.h" 00036 #include "OgreString.h" 00037 #include "OgreTexture.h" 00038 00039 namespace Ogre { 00061 class _OgreExport TextureUnitState : public TextureUnitStateAlloc 00062 { 00063 friend class RenderSystem; 00064 public: 00070 enum TextureEffectType 00071 { 00073 ET_ENVIRONMENT_MAP, 00075 ET_PROJECTIVE_TEXTURE, 00077 ET_UVSCROLL, 00079 ET_USCROLL, 00081 ET_VSCROLL, 00083 ET_ROTATE, 00085 ET_TRANSFORM 00086 00087 }; 00088 00094 enum EnvMapType 00095 { 00097 ENV_PLANAR, 00099 ENV_CURVED, 00101 ENV_REFLECTION, 00103 ENV_NORMAL 00104 }; 00105 00111 enum TextureTransformType 00112 { 00113 TT_TRANSLATE_U, 00114 TT_TRANSLATE_V, 00115 TT_SCALE_U, 00116 TT_SCALE_V, 00117 TT_ROTATE 00118 }; 00119 00125 enum TextureAddressingMode 00126 { 00128 TAM_WRAP, 00130 TAM_MIRROR, 00132 TAM_CLAMP, 00134 TAM_BORDER 00135 }; 00136 00138 struct UVWAddressingMode 00139 { 00140 TextureAddressingMode u, v, w; 00141 }; 00142 00145 enum TextureCubeFace 00146 { 00147 CUBE_FRONT = 0, 00148 CUBE_BACK = 1, 00149 CUBE_LEFT = 2, 00150 CUBE_RIGHT = 3, 00151 CUBE_UP = 4, 00152 CUBE_DOWN = 5 00153 }; 00154 00157 struct TextureEffect { 00158 TextureEffectType type; 00159 int subtype; 00160 Real arg1, arg2; 00161 WaveformType waveType; 00162 Real base; 00163 Real frequency; 00164 Real phase; 00165 Real amplitude; 00166 Controller<Real>* controller; 00167 const Frustum* frustum; 00168 }; 00169 00172 typedef multimap<TextureEffectType, TextureEffect>::type EffectMap; 00173 00176 TextureUnitState(Pass* parent); 00177 00178 TextureUnitState(Pass* parent, const TextureUnitState& oth ); 00179 00180 TextureUnitState & operator = ( const TextureUnitState& oth ); 00181 00184 ~TextureUnitState(); 00185 00192 TextureUnitState( Pass* parent, const String& texName, unsigned int texCoordSet = 0); 00193 00202 const String& getTextureName(void) const; 00203 00209 void setTextureName( const String& name, TextureType ttype = TEX_TYPE_2D); 00210 00257 void setCubicTextureName( const String& name, bool forUVW = false ); 00258 00305 void setCubicTextureName( const String* const names, bool forUVW = false ); 00306 00328 void setAnimatedTextureName( const String& name, unsigned int numFrames, Real duration = 0 ); 00329 00351 void setAnimatedTextureName( const String* const names, unsigned int numFrames, Real duration = 0 ); 00352 00355 std::pair< size_t, size_t > getTextureDimensions( unsigned int frame = 0 ) const; 00356 00364 void setCurrentFrame( unsigned int frameNumber ); 00365 00370 unsigned int getCurrentFrame(void) const; 00371 00377 const String& getFrameTextureName(unsigned int frameNumber) const; 00378 00386 void setFrameTextureName(const String& name, unsigned int frameNumber); 00387 00393 void addFrameTextureName(const String& name); 00401 void deleteFrameTextureName(const size_t frameNumber); 00406 unsigned int getNumFrames(void) const; 00407 00408 00410 enum BindingType 00411 { 00413 BT_FRAGMENT = 0, 00417 BT_VERTEX = 1 00418 }; 00421 enum ContentType 00422 { 00424 CONTENT_NAMED = 0, 00426 CONTENT_SHADOW = 1, 00428 CONTENT_COMPOSITOR = 2 00429 }; 00430 00440 void setBindingType(BindingType bt); 00441 00444 BindingType getBindingType(void) const; 00445 00451 void setContentType(ContentType ct); 00453 ContentType getContentType(void) const; 00454 00461 bool isCubic(void) const; 00462 00467 bool is3D(void) const; 00468 00473 TextureType getTextureType(void) const; 00474 00477 void setDesiredFormat(PixelFormat desiredFormat); 00478 00481 PixelFormat getDesiredFormat(void) const; 00482 00485 void setNumMipmaps(int numMipmaps); 00486 00489 int getNumMipmaps(void) const; 00490 00493 void setIsAlpha(bool isAlpha); 00494 00497 bool getIsAlpha(void) const; 00498 00500 void setHardwareGammaEnabled(bool enabled); 00502 bool isHardwareGammaEnabled() const; 00503 00508 unsigned int getTextureCoordSet(void) const; 00509 00517 void setTextureCoordSet(unsigned int set); 00518 00534 void setTextureTransform(const Matrix4& xform); 00535 00543 const Matrix4& getTextureTransform(void) const; 00544 00557 void setTextureScroll(Real u, Real v); 00558 00563 void setTextureUScroll(Real value); 00564 // get texture uscroll value 00565 Real getTextureUScroll(void) const; 00566 00571 void setTextureVScroll(Real value); 00572 // get texture vscroll value 00573 Real getTextureVScroll(void) const; 00574 00579 void setTextureUScale(Real value); 00580 // get texture uscale value 00581 Real getTextureUScale(void) const; 00582 00587 void setTextureVScale(Real value); 00588 // get texture vscale value 00589 Real getTextureVScale(void) const; 00590 00604 void setTextureScale(Real uScale, Real vScale); 00605 00615 void setTextureRotate(const Radian& angle); 00616 // get texture rotation effects angle value 00617 const Radian& getTextureRotate(void) const; 00618 00624 const UVWAddressingMode& getTextureAddressingMode(void) const; 00625 00635 void setTextureAddressingMode( TextureAddressingMode tam); 00636 00643 void setTextureAddressingMode( TextureAddressingMode u, 00644 TextureAddressingMode v, TextureAddressingMode w); 00645 00652 void setTextureAddressingMode( const UVWAddressingMode& uvw); 00653 00661 void setTextureBorderColour(const ColourValue& colour); 00662 00668 const ColourValue& getTextureBorderColour(void) const; 00669 00734 void setColourOperationEx( 00735 LayerBlendOperationEx op, 00736 LayerBlendSource source1 = LBS_TEXTURE, 00737 LayerBlendSource source2 = LBS_CURRENT, 00738 00739 const ColourValue& arg1 = ColourValue::White, 00740 const ColourValue& arg2 = ColourValue::White, 00741 00742 Real manualBlend = 0.0); 00743 00762 void setColourOperation( const LayerBlendOperation op); 00763 00783 void setColourOpMultipassFallback( const SceneBlendFactor sourceFactor, const SceneBlendFactor destFactor); 00784 00787 const LayerBlendModeEx& getColourBlendMode(void) const; 00788 00791 const LayerBlendModeEx& getAlphaBlendMode(void) const; 00792 00795 SceneBlendFactor getColourBlendFallbackSrc(void) const; 00796 00799 SceneBlendFactor getColourBlendFallbackDest(void) const; 00800 00826 void setAlphaOperation(LayerBlendOperationEx op, 00827 LayerBlendSource source1 = LBS_TEXTURE, 00828 LayerBlendSource source2 = LBS_CURRENT, 00829 Real arg1 = 1.0, 00830 Real arg2 = 1.0, 00831 Real manualBlend = 0.0); 00832 00844 void addEffect(TextureEffect& effect); 00845 00873 void setEnvironmentMap(bool enable, EnvMapType envMapType = ENV_CURVED); 00874 00885 void setScrollAnimation(Real uSpeed, Real vSpeed); 00886 00895 void setRotateAnimation(Real speed); 00896 00916 void setTransformAnimation( const TextureTransformType ttype, 00917 const WaveformType waveType, Real base = 0, Real frequency = 1, Real phase = 0, Real amplitude = 1 ); 00918 00919 00938 void setProjectiveTexturing(bool enabled, const Frustum* projectionSettings = 0); 00939 00942 void removeAllEffects(void); 00943 00949 void removeEffect( const TextureEffectType type ); 00950 00956 bool isBlank(void) const; 00957 00960 void setBlank(void); 00961 00964 bool isTextureLoadFailing() const { return mTextureLoadFailed; } 00965 00968 void retryTextureLoad() { mTextureLoadFailed = false; } 00969 00970 // get texture effects in a multimap paired array 00971 const EffectMap& getEffects(void) const; 00972 // get the animated-texture animation duration 00973 Real getAnimationDuration(void) const; 00974 00984 void setTextureFiltering(TextureFilterOptions filterType); 00989 void setTextureFiltering(FilterType ftype, FilterOptions opts); 00998 void setTextureFiltering(FilterOptions minFilter, FilterOptions magFilter, FilterOptions mipFilter); 00999 // get the texture filtering for the given type 01000 FilterOptions getTextureFiltering(FilterType ftpye) const; 01001 01007 void setTextureAnisotropy(unsigned int maxAniso); 01008 // get this layer texture anisotropy level 01009 unsigned int getTextureAnisotropy() const; 01010 01023 void setTextureMipmapBias(float bias) { mMipmapBias = bias; } 01027 float getTextureMipmapBias(void) const { return mMipmapBias; } 01028 01036 void setCompositorReference(const String& compositorName, const String& textureName, size_t mrtIndex = 0); 01037 01039 const String& getReferencedCompositorName() const { return mCompositorRefName; } 01041 const String& getReferencedTextureName() const { return mCompositorRefTexName; } 01043 size_t getReferencedMRTIndex() const { return mCompositorRefMrtIndex; } 01044 01046 Pass* getParent(void) const { return mParent; } 01047 01049 void _prepare(void); 01051 void _unprepare(void); 01053 void _load(void); 01055 void _unload(void); 01057 bool hasViewRelativeTextureCoordinateGeneration(void) const; 01058 01059 // Is this loaded? 01060 bool isLoaded(void) const; 01062 void _notifyNeedsRecompile(void); 01063 01069 void setName(const String& name); 01071 const String& getName(void) const { return mName; } 01072 01076 void setTextureNameAlias(const String& name); 01079 const String& getTextureNameAlias(void) const { return mTextureNameAlias;} 01080 01095 bool applyTextureAliases(const AliasTextureNamePairList& aliasList, const bool apply = true); 01096 01098 void _notifyParent(Pass* parent); 01099 01101 const TexturePtr& _getTexturePtr(void) const; 01103 const TexturePtr& _getTexturePtr(size_t frame) const; 01104 01106 void _setTexturePtr(const TexturePtr& texptr); 01108 void _setTexturePtr(const TexturePtr& texptr, size_t frame); 01109 01113 Controller<Real>* _getAnimController() const { return mAnimController; } 01114 protected: 01115 // State 01117 unsigned int mCurrentFrame; 01118 01120 Real mAnimDuration; 01121 bool mCubic; // is this a series of 6 2D textures to make up a cube? 01122 01123 TextureType mTextureType; 01124 PixelFormat mDesiredFormat; 01125 int mTextureSrcMipmaps; // Request number of mipmaps 01126 01127 unsigned int mTextureCoordSetIndex; 01128 UVWAddressingMode mAddressMode; 01129 ColourValue mBorderColour; 01130 01131 LayerBlendModeEx mColourBlendMode; 01132 SceneBlendFactor mColourBlendFallbackSrc; 01133 SceneBlendFactor mColourBlendFallbackDest; 01134 01135 LayerBlendModeEx mAlphaBlendMode; 01136 mutable bool mTextureLoadFailed; 01137 bool mIsAlpha; 01138 bool mHwGamma; 01139 01140 mutable bool mRecalcTexMatrix; 01141 Real mUMod, mVMod; 01142 Real mUScale, mVScale; 01143 Radian mRotate; 01144 mutable Matrix4 mTexModMatrix; 01145 01147 FilterOptions mMinFilter; 01149 FilterOptions mMagFilter; 01151 FilterOptions mMipFilter; 01153 unsigned int mMaxAniso; 01155 float mMipmapBias; 01156 01157 bool mIsDefaultAniso; 01158 bool mIsDefaultFiltering; 01160 BindingType mBindingType; 01162 ContentType mContentType; 01164 size_t mCompositorRefMrtIndex; 01165 01166 //----------------------------------------------------------------------------- 01167 // Complex members (those that can't be copied using memcpy) are at the end to 01168 // allow for fast copying of the basic members. 01169 // 01170 vector<String>::type mFrames; 01171 mutable vector<TexturePtr>::type mFramePtrs; 01172 String mName; // optional name for the TUS 01173 String mTextureNameAlias; // optional alias for texture frames 01174 EffectMap mEffects; 01176 String mCompositorRefName; 01177 String mCompositorRefTexName; 01178 //----------------------------------------------------------------------------- 01179 01180 //----------------------------------------------------------------------------- 01181 // Pointer members (those that can't be copied using memcpy), and MUST 01182 // preserving even if assign from others 01183 // 01184 Pass* mParent; 01185 Controller<Real>* mAnimController; 01186 //----------------------------------------------------------------------------- 01187 01188 01191 void recalcTextureMatrix(void) const; 01192 01195 void createAnimController(void); 01196 01199 void createEffectController(TextureEffect& effect); 01200 01202 void ensurePrepared(size_t frame) const; 01204 void ensureLoaded(size_t frame) const; 01205 01206 01207 }; 01208 01212 } 01213 01214 #endif
Copyright © 2008 Torus Knot Software Ltd
This work is licensed under a Creative Commons Attribution-ShareAlike 3.0 Unported License.
Last modified Sat Jan 14 2012 18:40:44