# OgreHardwareVertexBuffer.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-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 __HardwareVertexBuffer__
    00029 #define __HardwareVertexBuffer__
    00030
    00031 // Precompiler options
    00032 #include "OgrePrerequisites.h"
    00033 #include "OgreHardwareBuffer.h"
    00034 #include "OgreSharedPtr.h"
    00035 #include "OgreColourValue.h"
    00036
    00037 namespace Ogre {
    00038     class HardwareBufferManagerBase;
    00039
    00047     class _OgreExport HardwareVertexBuffer : public HardwareBuffer
    00048     {
    00049         protected:
    00050
    00051             HardwareBufferManagerBase* mMgr;
    00052             size_t mNumVertices;
    00053             size_t mVertexSize;
    00054
    00055         public:
    00057             HardwareVertexBuffer(HardwareBufferManagerBase* mgr, size_t vertexSize, size_t numVertices,
    00058                 HardwareBuffer::Usage usage, bool useSystemMemory, bool useShadowBuffer);
    00059             ~HardwareVertexBuffer();
    00061             HardwareBufferManagerBase* getManager() const { return mMgr; }
    00063             size_t getVertexSize(void) const { return mVertexSize; }
    00065             size_t getNumVertices(void) const { return mNumVertices; }
    00066
    00067
    00068
    00069             // NB subclasses should override lock, unlock, readData, writeData
    00070
    00071     };
    00072
    00074     class _OgreExport HardwareVertexBufferSharedPtr : public SharedPtr<HardwareVertexBuffer>
    00075     {
    00076     public:
    00077         HardwareVertexBufferSharedPtr() : SharedPtr<HardwareVertexBuffer>() {}
    00078         explicit HardwareVertexBufferSharedPtr(HardwareVertexBuffer* buf);
    00079
    00080
    00081     };
    00082
    00084     enum VertexElementSemantic {
    00086         VES_POSITION = 1,
    00088         VES_BLEND_WEIGHTS = 2,
    00090         VES_BLEND_INDICES = 3,
    00092         VES_NORMAL = 4,
    00094         VES_DIFFUSE = 5,
    00096         VES_SPECULAR = 6,
    00098         VES_TEXTURE_COORDINATES = 7,
    00100         VES_BINORMAL = 8,
    00102         VES_TANGENT = 9
    00103
    00104     };
    00105
    00107     enum VertexElementType
    00108     {
    00109         VET_FLOAT1 = 0,
    00110         VET_FLOAT2 = 1,
    00111         VET_FLOAT3 = 2,
    00112         VET_FLOAT4 = 3,
    00114         VET_COLOUR = 4,
    00115         VET_SHORT1 = 5,
    00116         VET_SHORT2 = 6,
    00117         VET_SHORT3 = 7,
    00118         VET_SHORT4 = 8,
    00119         VET_UBYTE4 = 9,
    00121         VET_COLOUR_ARGB = 10,
    00123         VET_COLOUR_ABGR = 11
    00124     };
    00125
    00135     class _OgreExport VertexElement : public VertexDataAlloc
    00136     {
    00137     protected:
    00139         unsigned short mSource;
    00141         size_t mOffset;
    00143         VertexElementType mType;
    00145         VertexElementSemantic mSemantic;
    00147         unsigned short mIndex;
    00148     public:
    00150         VertexElement() {}
    00152         VertexElement(unsigned short source, size_t offset, VertexElementType theType,
    00153             VertexElementSemantic semantic, unsigned short index = 0);
    00155         unsigned short getSource(void) const { return mSource; }
    00157         size_t getOffset(void) const { return mOffset; }
    00159         VertexElementType getType(void) const { return mType; }
    00161         VertexElementSemantic getSemantic(void) const { return mSemantic; }
    00163         unsigned short getIndex(void) const { return mIndex; }
    00165         size_t getSize(void) const;
    00167         static size_t getTypeSize(VertexElementType etype);
    00169         static unsigned short getTypeCount(VertexElementType etype);
    00173         static VertexElementType multiplyTypeCount(VertexElementType baseType, unsigned short count);
    00177         static VertexElementType getBaseType(VertexElementType multiType);
    00178
    00185         static void convertColourValue(VertexElementType srcType,
    00186             VertexElementType dstType, uint32* ptr);
    00187
    00193         static uint32 convertColourValue(const ColourValue& src,
    00194             VertexElementType dst);
    00195
    00197         static VertexElementType getBestColourVertexElementType(void);
    00198
    00199         inline bool operator== (const VertexElement& rhs) const
    00200         {
    00201             if (mType != rhs.mType ||
    00202                 mIndex != rhs.mIndex ||
    00203                 mOffset != rhs.mOffset ||
    00204                 mSemantic != rhs.mSemantic ||
    00205                 mSource != rhs.mSource)
    00206                 return false;
    00207             else
    00208                 return true;
    00209
    00210         }
    00218         inline void baseVertexPointerToElement(void* pBase, void** pElem) const
    00219         {
    00220             // The only way we can do this is to cast to char* in order to use byte offset
    00221             // then cast back to void*.
    00222             *pElem = static_cast<void*>(
    00223                 static_cast<unsigned char*>(pBase) + mOffset);
    00224         }
    00232         inline void baseVertexPointerToElement(void* pBase, float** pElem) const
    00233         {
    00234             // The only way we can do this is to cast to char* in order to use byte offset
    00235             // then cast back to float*. However we have to go via void* because casting
    00236             // directly is not allowed
    00237             *pElem = static_cast<float*>(
    00238                 static_cast<void*>(
    00239                     static_cast<unsigned char*>(pBase) + mOffset));
    00240         }
    00241
    00249         inline void baseVertexPointerToElement(void* pBase, RGBA** pElem) const
    00250         {
    00251             *pElem = static_cast<RGBA*>(
    00252                 static_cast<void*>(
    00253                     static_cast<unsigned char*>(pBase) + mOffset));
    00254         }
    00262         inline void baseVertexPointerToElement(void* pBase, unsigned char** pElem) const
    00263         {
    00264             *pElem = static_cast<unsigned char*>(pBase) + mOffset;
    00265         }
    00266
    00274         inline void baseVertexPointerToElement(void* pBase, unsigned short** pElem) const
    00275         {
    00276             *pElem = static_cast<unsigned short*>(
    00277                 static_cast<void*>(
    00278                     static_cast<unsigned char*>(pBase) + mOffset));
    00279         }
    00280
    00281
    00282     };
    00305     class _OgreExport VertexDeclaration : public VertexDataAlloc
    00306     {
    00307     public:
    00309         typedef list<VertexElement>::type VertexElementList;
    00311         static bool vertexElementLess(const VertexElement& e1, const VertexElement& e2);
    00312     protected:
    00313         VertexElementList mElementList;
    00314     public:
    00316         VertexDeclaration();
    00317         virtual ~VertexDeclaration();
    00318
    00320         size_t getElementCount(void) { return mElementList.size(); }
    00322         const VertexElementList& getElements(void) const;
    00324         const VertexElement* getElement(unsigned short index);
    00325
    00334         void sort(void);
    00335
    00346         void closeGapsInSource(void);
    00347
    00358         VertexDeclaration* getAutoOrganisedDeclaration(bool skeletalAnimation,
    00359             bool vertexAnimation);
    00360
    00362         unsigned short getMaxSource(void) const;
    00363
    00364
    00365
    00379         virtual const VertexElement& addElement(unsigned short source, size_t offset, VertexElementType theType,
    00380             VertexElementSemantic semantic, unsigned short index = 0);
    00394         virtual const VertexElement& insertElement(unsigned short atPosition,
    00395             unsigned short source, size_t offset, VertexElementType theType,
    00396             VertexElementSemantic semantic, unsigned short index = 0);
    00397
    00399         virtual void removeElement(unsigned short elem_index);
    00400
    00407         virtual void removeElement(VertexElementSemantic semantic, unsigned short index = 0);
    00408
    00410         virtual void removeAllElements(void);
    00411
    00417         virtual void modifyElement(unsigned short elem_index, unsigned short source, size_t offset, VertexElementType theType,
    00418             VertexElementSemantic semantic, unsigned short index = 0);
    00419
    00425         virtual const VertexElement* findElementBySemantic(VertexElementSemantic sem, unsigned short index = 0);
    00435         virtual VertexElementList findElementsBySource(unsigned short source);
    00436
    00438         virtual size_t getVertexSize(unsigned short source);
    00439
    00444         virtual VertexDeclaration* clone(HardwareBufferManagerBase* mgr = 0);
    00445
    00446         inline bool operator== (const VertexDeclaration& rhs) const
    00447         {
    00448             if (mElementList.size() != rhs.mElementList.size())
    00449                 return false;
    00450
    00451             VertexElementList::const_iterator i, iend, rhsi, rhsiend;
    00452             iend = mElementList.end();
    00453             rhsiend = rhs.mElementList.end();
    00454             rhsi = rhs.mElementList.begin();
    00455             for (i = mElementList.begin(); i != iend && rhsi != rhsiend; ++i, ++rhsi)
    00456             {
    00457                 if ( !(*i == *rhsi) )
    00458                     return false;
    00459             }
    00460
    00461             return true;
    00462         }
    00463         inline bool operator!= (const VertexDeclaration& rhs) const
    00464         {
    00465             return !(*this == rhs);
    00466         }
    00467
    00468     };
    00469
    00483     class _OgreExport VertexBufferBinding : public VertexDataAlloc
    00484     {
    00485     public:
    00487         typedef map<unsigned short, HardwareVertexBufferSharedPtr>::type VertexBufferBindingMap;
    00488     protected:
    00489         VertexBufferBindingMap mBindingMap;
    00490         mutable unsigned short mHighIndex;
    00491     public:
    00493         VertexBufferBinding();
    00494         virtual ~VertexBufferBinding();
    00503         virtual void setBinding(unsigned short index, const HardwareVertexBufferSharedPtr& buffer);
    00505         virtual void unsetBinding(unsigned short index);
    00506
    00508         virtual void unsetAllBindings(void);
    00509
    00511         virtual const VertexBufferBindingMap& getBindings(void) const;
    00512
    00514         virtual const HardwareVertexBufferSharedPtr& getBuffer(unsigned short index) const;
    00516         virtual bool isBufferBound(unsigned short index) const;
    00517
    00518         virtual size_t getBufferCount(void) const { return mBindingMap.size(); }
    00519
    00525         virtual unsigned short getNextIndex(void) const { return mHighIndex++; }
    00526
    00529         virtual unsigned short getLastBoundIndex(void) const;
    00530
    00531         typedef map<ushort, ushort>::type BindingIndexMap;
    00532
    00535         virtual bool hasGaps(void) const;
    00536
    00549         virtual void closeGaps(BindingIndexMap& bindingIndexMap);
    00550
    00551
    00552     };
    00558 }
    00559 #endif
    00560

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:51