[1809] | 1 | /*
|
---|
| 2 | -----------------------------------------------------------------------------
|
---|
| 3 | This source file is part of OGRE
|
---|
| 4 | (Object-oriented Graphics Rendering Engine)
|
---|
| 5 | For the latest info, see http://www.ogre3d.org/
|
---|
| 6 |
|
---|
| 7 | Copyright (c) 2000-2005 The OGRE Team
|
---|
| 8 | Also see acknowledgements in Readme.html
|
---|
| 9 |
|
---|
| 10 | This program is free software; you can redistribute it and/or modify it under
|
---|
| 11 | the terms of the GNU Lesser General Public License as published by the Free Software
|
---|
| 12 | Foundation; either version 2 of the License, or (at your option) any later
|
---|
| 13 | version.
|
---|
| 14 |
|
---|
| 15 | This program is distributed in the hope that it will be useful, but WITHOUT
|
---|
| 16 | ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
|
---|
| 17 | FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
|
---|
| 18 |
|
---|
| 19 | You should have received a copy of the GNU Lesser General Public License along with
|
---|
| 20 | this program; if not, write to the Free Software Foundation, Inc., 59 Temple
|
---|
| 21 | Place - Suite 330, Boston, MA 02111-1307, USA, or go to
|
---|
| 22 | http://www.gnu.org/copyleft/lesser.txt.
|
---|
| 23 | -----------------------------------------------------------------------------
|
---|
| 24 | */
|
---|
| 25 | #ifndef __HardwareVertexBuffer__
|
---|
| 26 | #define __HardwareVertexBuffer__
|
---|
| 27 |
|
---|
| 28 | // Precompiler options
|
---|
| 29 | #include "OgrePrerequisites.h"
|
---|
| 30 | #include "OgreHardwareBuffer.h"
|
---|
| 31 | #include "OgreSharedPtr.h"
|
---|
| 32 | #include "OgreColourValue.h"
|
---|
| 33 |
|
---|
| 34 | namespace Ogre {
|
---|
| 35 | /** Specialisation of HardwareBuffer for a vertex buffer. */
|
---|
| 36 | class _OgreExport HardwareVertexBuffer : public HardwareBuffer
|
---|
| 37 | {
|
---|
| 38 | protected:
|
---|
| 39 |
|
---|
| 40 | size_t mNumVertices;
|
---|
| 41 | size_t mVertexSize;
|
---|
| 42 |
|
---|
| 43 | public:
|
---|
| 44 | /// Should be called by HardwareBufferManager
|
---|
| 45 | HardwareVertexBuffer(size_t vertexSize, size_t numVertices,
|
---|
| 46 | HardwareBuffer::Usage usage, bool useSystemMemory, bool useShadowBuffer);
|
---|
| 47 | ~HardwareVertexBuffer();
|
---|
| 48 | /// Gets the size in bytes of a single vertex in this buffer
|
---|
| 49 | size_t getVertexSize(void) const { return mVertexSize; }
|
---|
| 50 | /// Get the number of vertices in this buffer
|
---|
| 51 | size_t getNumVertices(void) const { return mNumVertices; }
|
---|
| 52 |
|
---|
| 53 |
|
---|
| 54 |
|
---|
| 55 | // NB subclasses should override lock, unlock, readData, writeData
|
---|
| 56 |
|
---|
| 57 | };
|
---|
| 58 |
|
---|
| 59 | /** Shared pointer implementation used to share index buffers. */
|
---|
| 60 | class _OgreExport HardwareVertexBufferSharedPtr : public SharedPtr<HardwareVertexBuffer>
|
---|
| 61 | {
|
---|
| 62 | public:
|
---|
| 63 | HardwareVertexBufferSharedPtr() : SharedPtr<HardwareVertexBuffer>() {}
|
---|
| 64 | explicit HardwareVertexBufferSharedPtr(HardwareVertexBuffer* buf);
|
---|
| 65 |
|
---|
| 66 |
|
---|
| 67 | };
|
---|
| 68 |
|
---|
| 69 | /// Vertex element semantics, used to identify the meaning of vertex buffer contents
|
---|
| 70 | enum VertexElementSemantic {
|
---|
| 71 | /// Position, 3 reals per vertex
|
---|
| 72 | VES_POSITION = 1,
|
---|
| 73 | /// Blending weights
|
---|
| 74 | VES_BLEND_WEIGHTS = 2,
|
---|
| 75 | /// Blending indices
|
---|
| 76 | VES_BLEND_INDICES = 3,
|
---|
| 77 | /// Normal, 3 reals per vertex
|
---|
| 78 | VES_NORMAL = 4,
|
---|
| 79 | /// Diffuse colours
|
---|
| 80 | VES_DIFFUSE = 5,
|
---|
| 81 | /// Specular colours
|
---|
| 82 | VES_SPECULAR = 6,
|
---|
| 83 | /// Texture coordinates
|
---|
| 84 | VES_TEXTURE_COORDINATES = 7,
|
---|
| 85 | /// Binormal (Y axis if normal is Z)
|
---|
| 86 | VES_BINORMAL = 8,
|
---|
| 87 | /// Tangent (X axis if normal is Z)
|
---|
| 88 | VES_TANGENT = 9
|
---|
| 89 |
|
---|
| 90 | };
|
---|
| 91 |
|
---|
| 92 | /// Vertex element type, used to identify the base types of the vertex contents
|
---|
| 93 | enum VertexElementType
|
---|
| 94 | {
|
---|
| 95 | VET_FLOAT1 = 0,
|
---|
| 96 | VET_FLOAT2 = 1,
|
---|
| 97 | VET_FLOAT3 = 2,
|
---|
| 98 | VET_FLOAT4 = 3,
|
---|
| 99 | /// alias to more specific colour type - use the current rendersystem's colour packing
|
---|
| 100 | VET_COLOUR = 4,
|
---|
| 101 | VET_SHORT1 = 5,
|
---|
| 102 | VET_SHORT2 = 6,
|
---|
| 103 | VET_SHORT3 = 7,
|
---|
| 104 | VET_SHORT4 = 8,
|
---|
| 105 | VET_UBYTE4 = 9,
|
---|
| 106 | /// D3D style compact colour
|
---|
| 107 | VET_COLOUR_ARGB = 10,
|
---|
| 108 | /// GL style compact colour
|
---|
| 109 | VET_COLOUR_ABGR = 11
|
---|
| 110 | };
|
---|
| 111 |
|
---|
| 112 | /** This class declares the usage of a single vertex buffer as a component
|
---|
| 113 | of a complete VertexDeclaration.
|
---|
| 114 | @remarks
|
---|
| 115 | Several vertex buffers can be used to supply the input geometry for a
|
---|
| 116 | rendering operation, and in each case a vertex buffer can be used in
|
---|
| 117 | different ways for different operations; the buffer itself does not
|
---|
| 118 | define the semantics (position, normal etc), the VertexElement
|
---|
| 119 | class does.
|
---|
| 120 | */
|
---|
| 121 | class _OgreExport VertexElement
|
---|
| 122 | {
|
---|
| 123 | protected:
|
---|
| 124 | /// The source vertex buffer, as bound to an index using VertexBufferBinding
|
---|
| 125 | unsigned short mSource;
|
---|
| 126 | /// The offset in the buffer that this element starts at
|
---|
| 127 | size_t mOffset;
|
---|
| 128 | /// The type of element
|
---|
| 129 | VertexElementType mType;
|
---|
| 130 | /// The meaning of the element
|
---|
| 131 | VertexElementSemantic mSemantic;
|
---|
| 132 | /// Index of the item, only applicable for some elements like texture coords
|
---|
| 133 | unsigned short mIndex;
|
---|
| 134 | public:
|
---|
| 135 | /// Constructor, should not be called directly, call VertexDeclaration::addElement
|
---|
| 136 | VertexElement(unsigned short source, size_t offset, VertexElementType theType,
|
---|
| 137 | VertexElementSemantic semantic, unsigned short index = 0);
|
---|
| 138 | /// Gets the vertex buffer index from where this element draws it's values
|
---|
| 139 | unsigned short getSource(void) const { return mSource; }
|
---|
| 140 | /// Gets the offset into the buffer where this element starts
|
---|
| 141 | size_t getOffset(void) const { return mOffset; }
|
---|
| 142 | /// Gets the data format of this element
|
---|
| 143 | VertexElementType getType(void) const { return mType; }
|
---|
| 144 | /// Gets the meaning of this element
|
---|
| 145 | VertexElementSemantic getSemantic(void) const { return mSemantic; }
|
---|
| 146 | /// Gets the index of this element, only applicable for repeating elements
|
---|
| 147 | unsigned short getIndex(void) const { return mIndex; }
|
---|
| 148 | /// Gets the size of this element in bytes
|
---|
| 149 | size_t getSize(void) const;
|
---|
| 150 | /// Utility method for helping to calculate offsets
|
---|
| 151 | static size_t getTypeSize(VertexElementType etype);
|
---|
| 152 | /// Utility method which returns the count of values in a given type
|
---|
| 153 | static unsigned short getTypeCount(VertexElementType etype);
|
---|
| 154 | /** Simple converter function which will turn a single-value type into a
|
---|
| 155 | multi-value type based on a parameter.
|
---|
| 156 | */
|
---|
| 157 | static VertexElementType multiplyTypeCount(VertexElementType baseType, unsigned short count);
|
---|
| 158 | /** Simple converter function which will a type into it's single-value
|
---|
| 159 | equivalent - makes switches on type easier.
|
---|
| 160 | */
|
---|
| 161 | static VertexElementType getBaseType(VertexElementType multiType);
|
---|
| 162 |
|
---|
| 163 | /** Utility method for converting colour from
|
---|
| 164 | one packed 32-bit colour type to another.
|
---|
| 165 | @param srcType The source type
|
---|
| 166 | @param dstType The destination type
|
---|
| 167 | @param ptr Read / write value to change
|
---|
| 168 | */
|
---|
| 169 | static void convertColourValue(VertexElementType srcType,
|
---|
| 170 | VertexElementType dstType, uint32* ptr);
|
---|
| 171 |
|
---|
| 172 | /** Utility method for converting colour to
|
---|
| 173 | a packed 32-bit colour type.
|
---|
| 174 | @param src source colour
|
---|
| 175 | @param dst The destination type
|
---|
| 176 | */
|
---|
| 177 | static uint32 convertColourValue(const ColourValue& src,
|
---|
| 178 | VertexElementType dst);
|
---|
| 179 |
|
---|
| 180 | /** Utility method to get the most appropriate packed colour vertex element format. */
|
---|
| 181 | static VertexElementType getBestColourVertexElementType(void);
|
---|
| 182 |
|
---|
| 183 | inline bool operator== (const VertexElement& rhs) const
|
---|
| 184 | {
|
---|
| 185 | if (mType != rhs.mType ||
|
---|
| 186 | mIndex != rhs.mIndex ||
|
---|
| 187 | mOffset != rhs.mOffset ||
|
---|
| 188 | mSemantic != rhs.mSemantic ||
|
---|
| 189 | mSource != rhs.mSource)
|
---|
| 190 | return false;
|
---|
| 191 | else
|
---|
| 192 | return true;
|
---|
| 193 |
|
---|
| 194 | }
|
---|
| 195 | /** Adjusts a pointer to the base of a vertex to point at this element.
|
---|
| 196 | @remarks
|
---|
| 197 | This variant is for void pointers, passed as a parameter because we can't
|
---|
| 198 | rely on covariant return types.
|
---|
| 199 | @param pBase Pointer to the start of a vertex in this buffer.
|
---|
| 200 | @param pElem Pointer to a pointer which will be set to the start of this element.
|
---|
| 201 | */
|
---|
| 202 | inline void baseVertexPointerToElement(void* pBase, void** pElem) const
|
---|
| 203 | {
|
---|
| 204 | // The only way we can do this is to cast to char* in order to use byte offset
|
---|
| 205 | // then cast back to void*.
|
---|
| 206 | *pElem = static_cast<void*>(
|
---|
| 207 | static_cast<unsigned char*>(pBase) + mOffset);
|
---|
| 208 | }
|
---|
| 209 | /** Adjusts a pointer to the base of a vertex to point at this element.
|
---|
| 210 | @remarks
|
---|
| 211 | This variant is for float pointers, passed as a parameter because we can't
|
---|
| 212 | rely on covariant return types.
|
---|
| 213 | @param pBase Pointer to the start of a vertex in this buffer.
|
---|
| 214 | @param pElem Pointer to a pointer which will be set to the start of this element.
|
---|
| 215 | */
|
---|
| 216 | inline void baseVertexPointerToElement(void* pBase, float** pElem) const
|
---|
| 217 | {
|
---|
| 218 | // The only way we can do this is to cast to char* in order to use byte offset
|
---|
| 219 | // then cast back to float*. However we have to go via void* because casting
|
---|
| 220 | // directly is not allowed
|
---|
| 221 | *pElem = static_cast<float*>(
|
---|
| 222 | static_cast<void*>(
|
---|
| 223 | static_cast<unsigned char*>(pBase) + mOffset));
|
---|
| 224 | }
|
---|
| 225 |
|
---|
| 226 | /** Adjusts a pointer to the base of a vertex to point at this element.
|
---|
| 227 | @remarks
|
---|
| 228 | This variant is for RGBA pointers, passed as a parameter because we can't
|
---|
| 229 | rely on covariant return types.
|
---|
| 230 | @param pBase Pointer to the start of a vertex in this buffer.
|
---|
| 231 | @param pElem Pointer to a pointer which will be set to the start of this element.
|
---|
| 232 | */
|
---|
| 233 | inline void baseVertexPointerToElement(void* pBase, RGBA** pElem) const
|
---|
| 234 | {
|
---|
| 235 | *pElem = static_cast<RGBA*>(
|
---|
| 236 | static_cast<void*>(
|
---|
| 237 | static_cast<unsigned char*>(pBase) + mOffset));
|
---|
| 238 | }
|
---|
| 239 | /** Adjusts a pointer to the base of a vertex to point at this element.
|
---|
| 240 | @remarks
|
---|
| 241 | This variant is for char pointers, passed as a parameter because we can't
|
---|
| 242 | rely on covariant return types.
|
---|
| 243 | @param pBase Pointer to the start of a vertex in this buffer.
|
---|
| 244 | @param pElem Pointer to a pointer which will be set to the start of this element.
|
---|
| 245 | */
|
---|
| 246 | inline void baseVertexPointerToElement(void* pBase, unsigned char** pElem) const
|
---|
| 247 | {
|
---|
| 248 | *pElem = static_cast<unsigned char*>(pBase) + mOffset;
|
---|
| 249 | }
|
---|
| 250 |
|
---|
| 251 | /** Adjusts a pointer to the base of a vertex to point at this element.
|
---|
| 252 | @remarks
|
---|
| 253 | This variant is for ushort pointers, passed as a parameter because we can't
|
---|
| 254 | rely on covariant return types.
|
---|
| 255 | @param pBase Pointer to the start of a vertex in this buffer.
|
---|
| 256 | @param pElem Pointer to a pointer which will be set to the start of this element.
|
---|
| 257 | */
|
---|
| 258 | inline void baseVertexPointerToElement(void* pBase, unsigned short** pElem) const
|
---|
| 259 | {
|
---|
| 260 | *pElem = static_cast<unsigned short*>(pBase) + mOffset;
|
---|
| 261 | }
|
---|
| 262 |
|
---|
| 263 |
|
---|
| 264 | };
|
---|
| 265 | /** This class declares the format of a set of vertex inputs, which
|
---|
| 266 | can be issued to the rendering API through a RenderOperation.
|
---|
| 267 | @remarks
|
---|
| 268 | You should be aware that the ordering and structure of the
|
---|
| 269 | VertexDeclaration can be very important on DirectX with older
|
---|
| 270 | cards,so if you want to maintain maximum compatibility with
|
---|
| 271 | all render systems and all cards you should be careful to follow these
|
---|
| 272 | rules:<ol>
|
---|
| 273 | <li>VertexElements should be added in the following order, and the order of the
|
---|
| 274 | elements within a shared buffer should be as follows:
|
---|
| 275 | position, blending weights, normals, diffuse colours, specular colours,
|
---|
| 276 | texture coordinates (in order, with no gaps)</li>
|
---|
| 277 | <li>You must not have unused gaps in your buffers which are not referenced
|
---|
| 278 | by any VertexElement</li>
|
---|
| 279 | <li>You must not cause the buffer & offset settings of 2 VertexElements to overlap</li>
|
---|
| 280 | </ol>
|
---|
| 281 | Whilst GL and more modern graphics cards in D3D will allow you to defy these rules,
|
---|
| 282 | sticking to them will ensure that your buffers have the maximum compatibility.
|
---|
| 283 | @par
|
---|
| 284 | Like the other classes in this functional area, these declarations should be created and
|
---|
| 285 | destroyed using the HardwareBufferManager.
|
---|
| 286 | */
|
---|
| 287 | class _OgreExport VertexDeclaration
|
---|
| 288 | {
|
---|
| 289 | public:
|
---|
| 290 | /// Defines the list of vertex elements that makes up this declaration
|
---|
| 291 | typedef std::list<VertexElement> VertexElementList;
|
---|
| 292 | /// Sort routine for vertex elements
|
---|
| 293 | static bool vertexElementLess(const VertexElement& e1, const VertexElement& e2);
|
---|
| 294 | protected:
|
---|
| 295 | VertexElementList mElementList;
|
---|
| 296 | public:
|
---|
| 297 | /// Standard constructor, not you should use HardwareBufferManager::createVertexDeclaration
|
---|
| 298 | VertexDeclaration();
|
---|
| 299 | virtual ~VertexDeclaration();
|
---|
| 300 |
|
---|
| 301 | /** Get the number of elements in the declaration. */
|
---|
| 302 | size_t getElementCount(void) { return mElementList.size(); }
|
---|
| 303 | /** Gets read-only access to the list of vertex elements. */
|
---|
| 304 | const VertexElementList& getElements(void) const;
|
---|
| 305 | /** Get a single element. */
|
---|
| 306 | const VertexElement* getElement(unsigned short index);
|
---|
| 307 |
|
---|
| 308 | /** Sorts the elements in this list to be compatible with the maximum
|
---|
| 309 | number of rendering APIs / graphics cards.
|
---|
| 310 | @remarks
|
---|
| 311 | Older graphics cards require vertex data to be presented in a more
|
---|
| 312 | rigid way, as defined in the main documentation for this class. As well
|
---|
| 313 | as the ordering being important, where shared source buffers are used, the
|
---|
| 314 | declaration must list all the elements for each source in turn.
|
---|
| 315 | */
|
---|
| 316 | void sort(void);
|
---|
| 317 |
|
---|
| 318 | /** Remove any gaps in the source buffer list used by this declaration.
|
---|
| 319 | @remarks
|
---|
| 320 | This is useful if you've modified a declaration and want to remove
|
---|
| 321 | any gaps in the list of buffers being used. Note, however, that if this
|
---|
| 322 | declaration is already being used with a VertexBufferBinding, you will
|
---|
| 323 | need to alter that too. This method is mainly useful when reorganising
|
---|
| 324 | buffers based on an altered declaration.
|
---|
| 325 | @note
|
---|
| 326 | This will cause the vertex declaration to be re-sorted.
|
---|
| 327 | */
|
---|
| 328 | void closeGapsInSource(void);
|
---|
| 329 |
|
---|
| 330 | /** Generates a new VertexDeclaration for optimal usage based on the current
|
---|
| 331 | vertex declaration, which can be used with VertexData::reorganiseBuffers later
|
---|
| 332 | if you wish, or simply used as a template.
|
---|
| 333 | @remarks
|
---|
| 334 | Different buffer organisations and buffer usages will be returned
|
---|
| 335 | depending on the parameters passed to this method.
|
---|
| 336 | @param skeletalAnimation Whether this vertex data is going to be
|
---|
| 337 | skeletally animated
|
---|
| 338 | @param vertexAnimation Whether this vertex data is going to be vertex animated
|
---|
| 339 | */
|
---|
| 340 | VertexDeclaration* getAutoOrganisedDeclaration(bool skeletalAnimation,
|
---|
| 341 | bool vertexAnimation);
|
---|
| 342 |
|
---|
| 343 | /** Gets the indeex of the highest source value referenced by this declaration. */
|
---|
| 344 | unsigned short getMaxSource(void) const;
|
---|
| 345 |
|
---|
| 346 |
|
---|
| 347 |
|
---|
| 348 | /** Adds a new VertexElement to this declaration.
|
---|
| 349 | @remarks
|
---|
| 350 | This method adds a single element (positions, normals etc) to the end of the
|
---|
| 351 | vertex declaration. <b>Please read the information in VertexDeclaration about
|
---|
| 352 | the importance of ordering and structure for compatibility with older D3D drivers</b>.
|
---|
| 353 | @param source The binding index of HardwareVertexBuffer which will provide the source for this element.
|
---|
| 354 | See VertexBufferBindingState for full information.
|
---|
| 355 | @param offset The offset in bytes where this element is located in the buffer
|
---|
| 356 | @param theType The data format of the element (3 floats, a colour etc)
|
---|
| 357 | @param semantic The meaning of the data (position, normal, diffuse colour etc)
|
---|
| 358 | @param index Optional index for multi-input elements like texture coordinates
|
---|
| 359 | @returns A reference to the VertexElement added.
|
---|
| 360 | */
|
---|
| 361 | virtual const VertexElement& addElement(unsigned short source, size_t offset, VertexElementType theType,
|
---|
| 362 | VertexElementSemantic semantic, unsigned short index = 0);
|
---|
| 363 | /** Inserts a new VertexElement at a given position in this declaration.
|
---|
| 364 | @remarks
|
---|
| 365 | This method adds a single element (positions, normals etc) at a given position in this
|
---|
| 366 | vertex declaration. <b>Please read the information in VertexDeclaration about
|
---|
| 367 | the importance of ordering and structure for compatibility with older D3D drivers</b>.
|
---|
| 368 | @param source The binding index of HardwareVertexBuffer which will provide the source for this element.
|
---|
| 369 | See VertexBufferBindingState for full information.
|
---|
| 370 | @param offset The offset in bytes where this element is located in the buffer
|
---|
| 371 | @param theType The data format of the element (3 floats, a colour etc)
|
---|
| 372 | @param semantic The meaning of the data (position, normal, diffuse colour etc)
|
---|
| 373 | @param index Optional index for multi-input elements like texture coordinates
|
---|
| 374 | @returns A reference to the VertexElement added.
|
---|
| 375 | */
|
---|
| 376 | virtual const VertexElement& insertElement(unsigned short atPosition,
|
---|
| 377 | unsigned short source, size_t offset, VertexElementType theType,
|
---|
| 378 | VertexElementSemantic semantic, unsigned short index = 0);
|
---|
| 379 |
|
---|
| 380 | /** Remove the element at the given index from this declaration. */
|
---|
| 381 | virtual void removeElement(unsigned short elem_index);
|
---|
| 382 |
|
---|
| 383 | /** Remove the element with the given semantic and usage index.
|
---|
| 384 | @remarks
|
---|
| 385 | In this case 'index' means the usage index for repeating elements such
|
---|
| 386 | as texture coordinates. For other elements this will always be 0 and does
|
---|
| 387 | not refer to the index in the vector.
|
---|
| 388 | */
|
---|
| 389 | virtual void removeElement(VertexElementSemantic semantic, unsigned short index = 0);
|
---|
| 390 |
|
---|
| 391 | /** Remove all elements. */
|
---|
| 392 | virtual void removeAllElements(void);
|
---|
| 393 |
|
---|
| 394 | /** Modify an element in-place, params as addElement.
|
---|
| 395 | @remarks
|
---|
| 396 | <b>Please read the information in VertexDeclaration about
|
---|
| 397 | the importance of ordering and structure for compatibility with older D3D drivers</b>.
|
---|
| 398 | */
|
---|
| 399 | virtual void modifyElement(unsigned short elem_index, unsigned short source, size_t offset, VertexElementType theType,
|
---|
| 400 | VertexElementSemantic semantic, unsigned short index = 0);
|
---|
| 401 |
|
---|
| 402 | /** Finds a VertexElement with the given semantic, and index if there is more than
|
---|
| 403 | one element with the same semantic.
|
---|
| 404 | @remarks
|
---|
| 405 | If the element is not found, this method returns null.
|
---|
| 406 | */
|
---|
| 407 | virtual const VertexElement* findElementBySemantic(VertexElementSemantic sem, unsigned short index = 0);
|
---|
| 408 | /** Based on the current elements, gets the size of the vertex for a given buffer source.
|
---|
| 409 | @param source The buffer binding index for which to get the vertex size.
|
---|
| 410 | */
|
---|
| 411 |
|
---|
| 412 | /** Gets a list of elements which use a given source.
|
---|
| 413 | @remarks
|
---|
| 414 | Note that the list of elements is returned by value therefore is separate from
|
---|
| 415 | the declaration as soon as this method returns.
|
---|
| 416 | */
|
---|
| 417 | virtual VertexElementList findElementsBySource(unsigned short source);
|
---|
| 418 |
|
---|
| 419 | /** Gets the vertex size defined by this declaration for a given source. */
|
---|
| 420 | virtual size_t getVertexSize(unsigned short source);
|
---|
| 421 |
|
---|
| 422 | /** Clones this declaration. */
|
---|
| 423 | virtual VertexDeclaration* clone(void);
|
---|
| 424 |
|
---|
| 425 | inline bool operator== (const VertexDeclaration& rhs) const
|
---|
| 426 | {
|
---|
| 427 | if (mElementList.size() != rhs.mElementList.size())
|
---|
| 428 | return false;
|
---|
| 429 |
|
---|
| 430 | VertexElementList::const_iterator i, iend, rhsi, rhsiend;
|
---|
| 431 | iend = mElementList.end();
|
---|
| 432 | rhsiend = rhs.mElementList.end();
|
---|
| 433 | rhsi = rhs.mElementList.begin();
|
---|
| 434 | for (i = mElementList.begin(); i != iend && rhsi != rhsiend; ++i, ++rhsi)
|
---|
| 435 | {
|
---|
| 436 | if ( !(*i == *rhsi) )
|
---|
| 437 | return false;
|
---|
| 438 | }
|
---|
| 439 |
|
---|
| 440 | return true;
|
---|
| 441 | }
|
---|
| 442 | inline bool operator!= (const VertexDeclaration& rhs) const
|
---|
| 443 | {
|
---|
| 444 | return !(*this == rhs);
|
---|
| 445 | }
|
---|
| 446 |
|
---|
| 447 | };
|
---|
| 448 |
|
---|
| 449 | /** Records the state of all the vertex buffer bindings required to provide a vertex declaration
|
---|
| 450 | with the input data it needs for the vertex elements.
|
---|
| 451 | @remarks
|
---|
| 452 | Why do we have this binding list rather than just have VertexElement referring to the
|
---|
| 453 | vertex buffers direct? Well, in the underlying APIs, binding the vertex buffers to an
|
---|
| 454 | index (or 'stream') is the way that vertex data is linked, so this structure better
|
---|
| 455 | reflects the realities of that. In addition, by separating the vertex declaration from
|
---|
| 456 | the list of vertex buffer bindings, it becomes possible to reuse bindings between declarations
|
---|
| 457 | and vice versa, giving opportunities to reduce the state changes required to perform rendering.
|
---|
| 458 | @par
|
---|
| 459 | Like the other classes in this functional area, these binding maps should be created and
|
---|
| 460 | destroyed using the HardwareBufferManager.
|
---|
| 461 | */
|
---|
| 462 | class _OgreExport VertexBufferBinding
|
---|
| 463 | {
|
---|
| 464 | public:
|
---|
| 465 | /// Defines the vertex buffer bindings used as source for vertex declarations
|
---|
| 466 | typedef std::map<unsigned short, HardwareVertexBufferSharedPtr> VertexBufferBindingMap;
|
---|
| 467 | protected:
|
---|
| 468 | VertexBufferBindingMap mBindingMap;
|
---|
| 469 | mutable unsigned short mHighIndex;
|
---|
| 470 | public:
|
---|
| 471 | /// Constructor, should not be called direct, use HardwareBufferManager::createVertexBufferBinding
|
---|
| 472 | VertexBufferBinding();
|
---|
| 473 | virtual ~VertexBufferBinding();
|
---|
| 474 | /** Set a binding, associating a vertex buffer with a given index.
|
---|
| 475 | @remarks
|
---|
| 476 | If the index is already associated with a vertex buffer,
|
---|
| 477 | the association will be replaced. This may cause the old buffer
|
---|
| 478 | to be destroyed if nothing else is referring to it.
|
---|
| 479 | You should assign bindings from 0 and not leave gaps, although you can
|
---|
| 480 | bind them in any order.
|
---|
| 481 | */
|
---|
| 482 | virtual void setBinding(unsigned short index, HardwareVertexBufferSharedPtr buffer);
|
---|
| 483 | /** Removes an existing binding. */
|
---|
| 484 | virtual void unsetBinding(unsigned short index);
|
---|
| 485 |
|
---|
| 486 | /** Removes all the bindings. */
|
---|
| 487 | virtual void unsetAllBindings(void);
|
---|
| 488 |
|
---|
| 489 | /// Gets a read-only version of the buffer bindings
|
---|
| 490 | virtual const VertexBufferBindingMap& getBindings(void) const;
|
---|
| 491 |
|
---|
| 492 | /// Gets the buffer bound to the given source index
|
---|
| 493 | virtual HardwareVertexBufferSharedPtr getBuffer(unsigned short index);
|
---|
| 494 | /// Gets whether a buffer is bound to the given source index
|
---|
| 495 | virtual bool isBufferBound(unsigned short index);
|
---|
| 496 |
|
---|
| 497 | virtual size_t getBufferCount(void) const { return mBindingMap.size(); }
|
---|
| 498 |
|
---|
| 499 | /** Gets the highest index which has already been set, plus 1.
|
---|
| 500 | @remarks
|
---|
| 501 | This is to assist in binding the vertex buffers such that there are
|
---|
| 502 | not gaps in the list.
|
---|
| 503 | */
|
---|
| 504 | virtual unsigned short getNextIndex(void) const { return mHighIndex++; }
|
---|
| 505 |
|
---|
| 506 |
|
---|
| 507 |
|
---|
| 508 |
|
---|
| 509 | };
|
---|
| 510 |
|
---|
| 511 |
|
---|
| 512 |
|
---|
| 513 | }
|
---|
| 514 | #endif
|
---|
| 515 |
|
---|