-----------------------------------------------------------------------------------
| 197 | } |
| 198 | //----------------------------------------------------------------------------------- |
| 199 | VertexArrayObject *VertexArrayObject::clone( VaoManager *vaoManager, |
| 200 | SharedVertexBufferMap *sharedBuffers, |
| 201 | int vertexBufferType, int indexBufferType ) const |
| 202 | { |
| 203 | assert( vertexBufferType < 0 || ( vertexBufferType >= BT_IMMUTABLE && |
| 204 | vertexBufferType <= BT_DYNAMIC_PERSISTENT_COHERENT ) ); |
| 205 | assert( indexBufferType < 0 || ( indexBufferType >= BT_IMMUTABLE && |
| 206 | indexBufferType <= BT_DYNAMIC_PERSISTENT_COHERENT ) ); |
| 207 | |
| 208 | VertexBufferPackedVec newVertexBuffers; |
| 209 | newVertexBuffers.reserve( mVertexBuffers.size() ); |
| 210 | |
| 211 | VertexBufferPackedVec::const_iterator itBuffers = mVertexBuffers.begin(); |
| 212 | VertexBufferPackedVec::const_iterator enBuffers = mVertexBuffers.end(); |
| 213 | |
| 214 | while( itBuffers != enBuffers ) |
| 215 | { |
| 216 | if( sharedBuffers ) |
| 217 | { |
| 218 | SharedVertexBufferMap::const_iterator itShared = sharedBuffers->find( *itBuffers ); |
| 219 | if( itShared != sharedBuffers->end() ) |
| 220 | { |
| 221 | // This buffer is shared. Reuse the one we created in a previous call. |
| 222 | newVertexBuffers.push_back( itShared->second ); |
| 223 | ++itBuffers; |
| 224 | continue; |
| 225 | } |
| 226 | } |
| 227 | |
| 228 | void *dstData = |
| 229 | OGRE_MALLOC_SIMD( ( *itBuffers )->getTotalSizeBytes(), MEMCATEGORY_GEOMETRY ); |
| 230 | FreeOnDestructor dataPtrContainer( dstData ); |
| 231 | |
| 232 | // only map if there is no shadow buffer |
| 233 | if( ( *itBuffers )->getShadowCopy() ) |
| 234 | { |
| 235 | const void *shadowBuff = ( *itBuffers )->getShadowCopy(); |
| 236 | memcpy( dstData, shadowBuff, ( *itBuffers )->getTotalSizeBytes() ); |
| 237 | } |
| 238 | else |
| 239 | { |
| 240 | AsyncTicketPtr asyncTicket = |
| 241 | ( *itBuffers )->readRequest( 0, ( *itBuffers )->getNumElements() ); |
| 242 | const void *srcData = asyncTicket->map(); |
| 243 | memcpy( dstData, srcData, ( *itBuffers )->getTotalSizeBytes() ); |
| 244 | asyncTicket->unmap(); |
| 245 | } |
| 246 | |
| 247 | const BufferType bufferType = vertexBufferType < 0 |
| 248 | ? ( *itBuffers )->getBufferType() |
| 249 | : static_cast<BufferType>( vertexBufferType ); |
| 250 | |
| 251 | const bool keepAsShadow = ( *itBuffers )->getShadowCopy() != 0; |
| 252 | VertexBufferPacked *newVertexBuffer = vaoManager->createVertexBuffer( |
| 253 | ( *itBuffers )->getVertexElements(), ( *itBuffers )->getNumElements(), bufferType, |
| 254 | dstData, keepAsShadow ); |
| 255 | |
| 256 | if( keepAsShadow ) // Don't free the pointer ourselves |