[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 __VertexIndexData_H__
|
---|
| 26 | #define __VertexIndexData_H__
|
---|
| 27 |
|
---|
| 28 | #include "OgrePrerequisites.h"
|
---|
| 29 | #include "OgreHardwareVertexBuffer.h"
|
---|
| 30 | #include "OgreHardwareIndexBuffer.h"
|
---|
| 31 |
|
---|
| 32 | namespace Ogre {
|
---|
| 33 |
|
---|
| 34 | /// Define a list of usage flags
|
---|
| 35 | typedef std::vector<HardwareBuffer::Usage> BufferUsageList;
|
---|
| 36 |
|
---|
| 37 |
|
---|
| 38 | /** Summary class collecting together vertex source information. */
|
---|
| 39 | class _OgreExport VertexData
|
---|
| 40 | {
|
---|
| 41 | private:
|
---|
| 42 | /// Protected copy constructor, to prevent misuse
|
---|
| 43 | VertexData(const VertexData& rhs); /* do nothing, should not use */
|
---|
| 44 | /// Protected operator=, to prevent misuse
|
---|
| 45 | VertexData& operator=(const VertexData& rhs); /* do not use */
|
---|
| 46 | public:
|
---|
| 47 | VertexData();
|
---|
| 48 | ~VertexData();
|
---|
| 49 |
|
---|
| 50 | /** Declaration of the vertex to be used in this operation.
|
---|
| 51 | @remarks Note that this is created for you on construction.
|
---|
| 52 | */
|
---|
| 53 | VertexDeclaration* vertexDeclaration;
|
---|
| 54 | /** The vertex buffer bindings to be used.
|
---|
| 55 | @remarks Note that this is created for you on construction.
|
---|
| 56 | */
|
---|
| 57 | VertexBufferBinding* vertexBufferBinding;
|
---|
| 58 | /// The base vertex index to start from
|
---|
| 59 | size_t vertexStart;
|
---|
| 60 | /// The number of vertices used in this operation
|
---|
| 61 | size_t vertexCount;
|
---|
| 62 |
|
---|
| 63 |
|
---|
| 64 | /// Struct used to hold hardware morph / pose vertex data information
|
---|
| 65 | struct HardwareAnimationData
|
---|
| 66 | {
|
---|
| 67 | const VertexElement* targetVertexElement;
|
---|
| 68 | Real parametric;
|
---|
| 69 | };
|
---|
| 70 | typedef std::vector<HardwareAnimationData> HardwareAnimationDataList;
|
---|
| 71 | /// VertexElements used for hardware morph / pose animation
|
---|
| 72 | HardwareAnimationDataList hwAnimationDataList;
|
---|
| 73 | /// Number of hardware animation data items used
|
---|
| 74 | size_t hwAnimDataItemsUsed;
|
---|
| 75 |
|
---|
| 76 | /** Clones this vertex data, potentially including replicating any vertex buffers.
|
---|
| 77 | @remarks The caller is expected to delete the returned pointer when ready
|
---|
| 78 | */
|
---|
| 79 | VertexData* clone(bool copyData = true) const;
|
---|
| 80 |
|
---|
| 81 | /** Modifies the vertex data to be suitable for use for rendering shadow geometry.
|
---|
| 82 | @remarks
|
---|
| 83 | Preparing vertex data to generate a shadow volume involves firstly ensuring that the
|
---|
| 84 | vertex buffer containing the positions is a standalone vertex buffer,
|
---|
| 85 | with no other components in it. This method will therefore break apart any existing
|
---|
| 86 | vertex buffers if position is sharing a vertex buffer.
|
---|
| 87 | Secondly, it will double the size of this vertex buffer so that there are 2 copies of
|
---|
| 88 | the position data for the mesh. The first half is used for the original, and the second
|
---|
| 89 | half is used for the 'extruded' version. The vertex count used to render will remain
|
---|
| 90 | the same though, so as not to add any overhead to regular rendering of the object.
|
---|
| 91 | Both copies of the position are required in one buffer because shadow volumes stretch
|
---|
| 92 | from the original mesh to the extruded version.
|
---|
| 93 | @par
|
---|
| 94 | It's important to appreciate that this method can fundamentally change the structure of your
|
---|
| 95 | vertex buffers, although in reality they will be new buffers. As it happens, if other
|
---|
| 96 | objects are using the original buffers then they will be unaffected because the reference
|
---|
| 97 | counting will keep them intact. However, if you have made any assumptions about the
|
---|
| 98 | structure of the vertex data in the buffers of this object, you may have to rethink them.
|
---|
| 99 | */
|
---|
| 100 | void prepareForShadowVolume(void);
|
---|
| 101 |
|
---|
| 102 | /** Additional shadow volume vertex buffer storage.
|
---|
| 103 | @remarks
|
---|
| 104 | This additional buffer is only used where we have prepared this VertexData for
|
---|
| 105 | use in shadow volume contruction, and where the current render system supports
|
---|
| 106 | vertex programs. This buffer contains the 'w' vertex position component which will
|
---|
| 107 | be used by that program to differentiate between extruded and non-extruded vertices.
|
---|
| 108 | This 'w' component cannot be included in the original position buffer because
|
---|
| 109 | DirectX does not allow 4-component positions in the fixed-function pipeline, and the original
|
---|
| 110 | position buffer must still be usable for fixed-function rendering.
|
---|
| 111 | @par
|
---|
| 112 | Note that we don't store any vertex declaration or vertex buffer binding here becuase this
|
---|
| 113 | can be reused in the shadow algorithm.
|
---|
| 114 | */
|
---|
| 115 | HardwareVertexBufferSharedPtr hardwareShadowVolWBuffer;
|
---|
| 116 |
|
---|
| 117 |
|
---|
| 118 | /** Reorganises the data in the vertex buffers according to the
|
---|
| 119 | new vertex declaration passed in. Note that new vertex buffers
|
---|
| 120 | are created and written to, so if the buffers being referenced
|
---|
| 121 | by this vertex data object are also used by others, then the
|
---|
| 122 | original buffers will not be damaged by this operation.
|
---|
| 123 | Once this operation has completed, the new declaration
|
---|
| 124 | passed in will overwrite the current one.
|
---|
| 125 | @param newDeclaration The vertex declaration which will be used
|
---|
| 126 | for the reorganised buffer state. Note that the new delcaration
|
---|
| 127 | must not include any elements which do not already exist in the
|
---|
| 128 | current declaration; you can drop elements by
|
---|
| 129 | excluding them from the declaration if you wish, however.
|
---|
| 130 | @param bufferUsages Vector of usage flags which indicate the usage options
|
---|
| 131 | for each new vertex buffer created. The indexes of the entries must correspond
|
---|
| 132 | to the buffer binding values referenced in the declaration.
|
---|
| 133 | */
|
---|
| 134 | void reorganiseBuffers(VertexDeclaration* newDeclaration, const BufferUsageList& bufferUsage);
|
---|
| 135 |
|
---|
| 136 | /** Reorganises the data in the vertex buffers according to the
|
---|
| 137 | new vertex declaration passed in. Note that new vertex buffers
|
---|
| 138 | are created and written to, so if the buffers being referenced
|
---|
| 139 | by this vertex data object are also used by others, then the
|
---|
| 140 | original buffers will not be damaged by this operation.
|
---|
| 141 | Once this operation has completed, the new declaration
|
---|
| 142 | passed in will overwrite the current one.
|
---|
| 143 | This version of the method derives the buffer usages from the existing
|
---|
| 144 | buffers, by using the 'most flexible' usage from the equivalent sources.
|
---|
| 145 | @param newDeclaration The vertex declaration which will be used
|
---|
| 146 | for the reorganised buffer state. Note that the new delcaration
|
---|
| 147 | must not include any elements which do not already exist in the
|
---|
| 148 | current declaration; you can drop elements by
|
---|
| 149 | excluding them from the declaration if you wish, however.
|
---|
| 150 | */
|
---|
| 151 | void reorganiseBuffers(VertexDeclaration* newDeclaration);
|
---|
| 152 |
|
---|
| 153 | /** Convert all packed colour values (VET_COLOUR_*) in buffers used to
|
---|
| 154 | another type.
|
---|
| 155 | @param srcType The source colour type to assume if the ambiguous VET_COLOUR
|
---|
| 156 | is encountered.
|
---|
| 157 | @param destType The destination colour type, must be VET_COLOUR_ABGR or
|
---|
| 158 | VET_COLOUR_ARGB.
|
---|
| 159 | */
|
---|
| 160 | void convertPackedColour(VertexElementType srcType, VertexElementType destType);
|
---|
| 161 |
|
---|
| 162 |
|
---|
| 163 | /** Allocate elements to serve a holder of morph / pose target data
|
---|
| 164 | for hardware morphing / pose blending.
|
---|
| 165 | @remarks
|
---|
| 166 | This method will allocate the given number of 3D texture coordinate
|
---|
| 167 | sets for use as a morph target or target pose offset (3D position).
|
---|
| 168 | These elements will be saved in hwAnimationDataList.
|
---|
| 169 | It will also assume that the source of these new elements will be new
|
---|
| 170 | buffers which are not bound at this time, so will start the sources to
|
---|
| 171 | 1 higher than the current highest binding source. The caller is
|
---|
| 172 | expected to bind these new buffers when appropriate. For morph animation
|
---|
| 173 | the original position buffer will be the 'from' keyframe data, whilst
|
---|
| 174 | for pose animation it will be the original vertex data.
|
---|
| 175 | */
|
---|
| 176 | void allocateHardwareAnimationElements(ushort count);
|
---|
| 177 |
|
---|
| 178 |
|
---|
| 179 |
|
---|
| 180 | };
|
---|
| 181 |
|
---|
| 182 | /** Summary class collecting together index data source information. */
|
---|
| 183 | class _OgreExport IndexData
|
---|
| 184 | {
|
---|
| 185 | protected:
|
---|
| 186 | /// Protected copy constructor, to prevent misuse
|
---|
| 187 | IndexData(const IndexData& rhs); /* do nothing, should not use */
|
---|
| 188 | /// Protected operator=, to prevent misuse
|
---|
| 189 | IndexData& operator=(const IndexData& rhs); /* do not use */
|
---|
| 190 | public:
|
---|
| 191 | IndexData();
|
---|
| 192 | ~IndexData();
|
---|
| 193 | /// pointer to the HardwareIndexBuffer to use, must be specified if useIndexes = true
|
---|
| 194 | HardwareIndexBufferSharedPtr indexBuffer;
|
---|
| 195 |
|
---|
| 196 | /// index in the buffer to start from for this operation
|
---|
| 197 | size_t indexStart;
|
---|
| 198 |
|
---|
| 199 | /// The number of indexes to use from the buffer
|
---|
| 200 | size_t indexCount;
|
---|
| 201 |
|
---|
| 202 | /** Clones this index data, potentially including replicating the index buffer.
|
---|
| 203 | @remarks The caller is expected to delete the returned pointer when finished
|
---|
| 204 | */
|
---|
| 205 | IndexData* clone(bool copyData = true) const;
|
---|
| 206 |
|
---|
| 207 | /** Re-order the indexes in this index data structure to be more
|
---|
| 208 | vertex cache friendly; that is to re-use the same vertices as close
|
---|
| 209 | together as possible.
|
---|
| 210 | @remarks
|
---|
| 211 | Can only be used for index data which consists of triangle lists.
|
---|
| 212 | It would in fact be pointless to use it on triangle strips or fans
|
---|
| 213 | in any case.
|
---|
| 214 | */
|
---|
| 215 | void optimiseVertexCacheTriList(void);
|
---|
| 216 |
|
---|
| 217 | };
|
---|
| 218 |
|
---|
| 219 | /** Vertex cache profiler.
|
---|
| 220 | @remarks
|
---|
| 221 | Utility class for evaluating the effectiveness of the use of the vertex
|
---|
| 222 | cache by a given index buffer.
|
---|
| 223 | */
|
---|
| 224 | class _OgreExport VertexCacheProfiler
|
---|
| 225 | {
|
---|
| 226 | public:
|
---|
| 227 | enum CacheType {
|
---|
| 228 | FIFO, LRU
|
---|
| 229 | };
|
---|
| 230 |
|
---|
| 231 | VertexCacheProfiler(unsigned int cachesize = 16, CacheType cachetype = FIFO )
|
---|
| 232 | : size ( cachesize ), type ( cachetype ), tail (0), buffersize (0), hit (0), miss (0)
|
---|
| 233 | {
|
---|
| 234 | cache = new uint32[size];
|
---|
| 235 | };
|
---|
| 236 |
|
---|
| 237 | ~VertexCacheProfiler()
|
---|
| 238 | {
|
---|
| 239 | delete[] cache;
|
---|
| 240 | }
|
---|
| 241 |
|
---|
| 242 | void profile(const HardwareIndexBufferSharedPtr indexBuffer);
|
---|
| 243 | void reset() { hit = 0; miss = 0; tail = 0; buffersize = 0; };
|
---|
| 244 | void flush() { tail = 0; buffersize = 0; };
|
---|
| 245 |
|
---|
| 246 | unsigned int getHits() { return hit; };
|
---|
| 247 | unsigned int getMisses() { return miss; };
|
---|
| 248 | unsigned int getSize() { return size; };
|
---|
| 249 | private:
|
---|
| 250 | unsigned int size;
|
---|
| 251 | uint32 *cache;
|
---|
| 252 | CacheType type;
|
---|
| 253 |
|
---|
| 254 | unsigned int tail, buffersize;
|
---|
| 255 | unsigned int hit, miss;
|
---|
| 256 |
|
---|
| 257 | bool inCache(unsigned int index);
|
---|
| 258 | };
|
---|
| 259 | }
|
---|
| 260 | #endif
|
---|
| 261 |
|
---|