OgreShaderExTextureAtlasSampler.h
Go to the documentation of this file.
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 Permission is hereby granted, free of charge, to any person obtaining a copy
00009 of this software and associated documentation files (the "Software"), to deal
00010 in the Software without restriction, including without limitation the rights
00011 to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
00012 copies of the Software, and to permit persons to whom the Software is
00013 furnished to do so, subject to the following conditions:
00014 
00015 The above copyright notice and this permission notice shall be included in
00016 all copies or substantial portions of the Software.
00017 
00018 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
00019 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
00020 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
00021 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
00022 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
00023 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
00024 THE SOFTWARE.
00025 -----------------------------------------------------------------------------
00026 */
00027 #ifndef _ShaderSGXAtlasTexture_
00028 #define _ShaderSGXAtlasTexture_
00029 
00030 #include "OgreShaderPrerequisites.h"
00031 #ifdef RTSHADER_SYSTEM_BUILD_EXT_SHADERS
00032 #include "OgreShaderSubRenderState.h"
00033 #include "OgreShaderParameter.h"
00034 
00035 #define TAS_MAX_TEXTURES 4
00036 namespace Ogre {
00037 namespace RTShader {
00038 
00045 struct _OgreRTSSExport TextureAtlasRecord
00046 {
00047     TextureAtlasRecord(const String & texOriginalName, const String & texAtlasName, 
00048                        const float texPosU, const float texPosV, const float texWidth, const float texHeight,
00049                        const size_t texIndexInAtlas) :
00050                   posU(texPosU)
00051                 , posV(texPosV)
00052                 , width(texWidth)
00053                 , height(texHeight)
00054                 , originalTextureName(texOriginalName)
00055                 , atlasTextureName(texAtlasName)
00056                 , indexInAtlas(texIndexInAtlas)
00057     { }
00058 
00059     float posU;
00060     float posV;
00061     float width;
00062     float height;
00063     String originalTextureName;
00064     String atlasTextureName;
00065     size_t indexInAtlas;
00066 };
00067 
00068 typedef vector<TextureAtlasRecord>::type TextureAtlasTable;
00069 typedef SharedPtr<TextureAtlasTable> TextureAtlasTablePtr;
00070 typedef map<String, TextureAtlasTablePtr>::type TextureAtlasMap;
00071 
00072 
00073 
00130 class _OgreRTSSExport TextureAtlasSampler : public SubRenderState
00131 {
00132 public:
00133 
00134 // Interface.
00135 public:
00136 
00138     TextureAtlasSampler();
00139 
00143     virtual const String& getType() const;
00144 
00148     virtual int getExecutionOrder() const;
00149 
00153     virtual void copyFrom(const SubRenderState& rhs);
00154 
00158     virtual void updateGpuProgramsParams(Renderable* rend, Pass* pass,  const AutoParamDataSource* source,  const LightList* pLightList);
00159 
00163     virtual bool preAddToRenderState(const RenderState* renderState, Pass* srcPass, Pass* dstPass);
00164 
00165     static String Type;
00166 
00167 // Protected methods
00168 protected:  
00169     virtual bool resolveParameters(ProgramSet* programSet); 
00170     virtual bool resolveDependencies(ProgramSet* programSet);
00171     virtual bool addFunctionInvocations(ProgramSet* programSet);
00172 
00176     const char* getAdressingFunctionName(TextureUnitState::TextureAddressingMode mode);
00177 
00178 
00179 // Attributes.
00180 protected:
00181     // The index of the information on the texture in the table
00182     ParameterPtr mVSInpTextureTableIndex;
00183     
00184     TextureUnitState::UVWAddressingMode mTextureAddressings[TAS_MAX_TEXTURES]; // The addressing mode for each texture
00185     // The position and size of the texture in the atlas 
00186     ParameterPtr mVSOutTextureDatas[TAS_MAX_TEXTURES];
00187     // The position and size of the texture in the atlas
00188     ParameterPtr mPSInpTextureDatas[TAS_MAX_TEXTURES];
00189     //A parameter carrying the sizes of the atlas textures
00190     UniformParameterPtr mPSTextureSizes[TAS_MAX_TEXTURES];
00191     // The table containing information on the textures in the atlas
00192     UniformParameterPtr mVSTextureTable[TAS_MAX_TEXTURES];
00193 
00194     //The position of the texture coordinates containing the index information 
00195     ushort mAtlasTexcoordPos; 
00196     //The texture atlas table data
00197     TextureAtlasTablePtr mAtlasTableDatas[TAS_MAX_TEXTURES];
00198     //For each texture unit in the pass tells if it uses atlas texture
00199     bool mIsAtlasTextureUnits[TAS_MAX_TEXTURES];
00200     //Tells if the data in mAtlasTableData has been uploaded to the corresponding mVSTextureTable parameter
00201     bool mIsTableDataUpdated;
00202     //Tells whether border issue handling uses auto adjust polling position.
00203     bool mAutoAdjustPollPosition;
00204 };
00205 
00206 
00207 
00212 class _OgreRTSSExport TextureAtlasSamplerFactory : public SubRenderStateFactory, public Singleton<TextureAtlasSamplerFactory>
00213 {
00214 public:
00215     enum IndexPositionMode
00216     {
00217         ipmRelative,
00218         ipmAbsolute
00219     };
00220 
00221     struct TextureAtlasAttib
00222     {
00223         TextureAtlasAttib(IndexPositionMode _posMode = ipmRelative, ushort _posOffset = 1,
00224             bool _autoBorderAdjust = true) : positionMode(_posMode), positionOffset(_posOffset),
00225              autoBorderAdjust(_autoBorderAdjust) {}
00226 
00227         IndexPositionMode positionMode;
00228         ushort positionOffset;
00229         bool autoBorderAdjust;
00230     };
00231 
00232 public:
00233 
00234     //TextureAtlasSamplerFactory c_tor
00235     TextureAtlasSamplerFactory();
00236 
00237     //Singleton implementation
00238     static TextureAtlasSamplerFactory* getSingletonPtr(void);
00239     static TextureAtlasSamplerFactory& getSingleton(void);
00240     
00241 
00242 
00246     virtual const String& getType() const;
00247 
00251     virtual SubRenderState* createInstance(ScriptCompiler* compiler, PropertyAbstractNode* prop, Pass* pass, SGScriptTranslator* translator);
00252 
00256     virtual void writeInstance(MaterialSerializer* ser, SubRenderState* subRenderState, Pass* srcPass, Pass* dstPass);
00257     
00276     bool addTexutreAtlasDefinition( const Ogre::String& filename, TextureAtlasTablePtr textureAtlasTable = TextureAtlasTablePtr());
00277     bool addTexutreAtlasDefinition( DataStreamPtr stream, TextureAtlasTablePtr textureAtlasTable = TextureAtlasTablePtr());
00278 
00287     void setTextureAtlasTable(const String& textureName, const TextureAtlasTablePtr& atlasData, bool autoBorderAdjust = true);
00288     
00293     void removeTextureAtlasTable(const String& textureName);
00294 
00298     void removeAllTextureAtlasTables();
00299 
00304     const TextureAtlasTablePtr& getTextureAtlasTable(const String& textureName) const;
00305 
00316     void setDefaultAtlasingAttributes(IndexPositionMode mode, ushort offset, bool autoAdjustBorders);
00317 
00322     const TextureAtlasAttib& getDefaultAtlasingAttributes() const;
00323 
00335     void setMaterialAtlasingAttributes(Ogre::Material* material, 
00336         IndexPositionMode mode, ushort offset, bool autoAdjustBorders);
00337 
00338 
00344     bool hasMaterialAtlasingAttributes(Ogre::Material* material, TextureAtlasAttib* attrib = NULL) const;
00345     
00346 protected:
00347 
00348     
00349 
00353     virtual SubRenderState* createInstanceImpl();
00354 
00355 private:
00356 
00357     //Holds a mapping of texture names and the atlas table information associated with them
00358     TextureAtlasMap mAtlases;
00359 
00360     TextureAtlasAttib mDefaultAtlasAttrib;
00361 };
00362 
00363 _OgreRTSSExport void operator<<(std::ostream& o, const TextureAtlasSamplerFactory::TextureAtlasAttib& tai);
00364 
00368 }
00369 }
00370 
00371 #endif
00372 #endif

Copyright © 2012 Torus Knot Software Ltd
Creative Commons License
This work is licensed under a Creative Commons Attribution-ShareAlike 3.0 Unported License.
Last modified Sun Sep 2 2012 07:27:23