Main Page   Namespace List   Class Hierarchy   Alphabetical List   Compound List   File List   Namespace Members   Compound Members   File Members   Related Pages  

OgreVertexIndexData.cpp

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 © 2000-2003 The OGRE Team
00008 Also see acknowledgements in Readme.html
00009 
00010 This program is free software; you can redistribute it and/or modify it under
00011 the terms of the GNU Lesser General Public License as published by the Free Software
00012 Foundation; either version 2 of the License, or (at your option) any later
00013 version.
00014 
00015 This program is distributed in the hope that it will be useful, but WITHOUT
00016 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
00017 FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
00018 
00019 You should have received a copy of the GNU Lesser General Public License along with
00020 this program; if not, write to the Free Software Foundation, Inc., 59 Temple
00021 Place - Suite 330, Boston, MA 02111-1307, USA, or go to
00022 http://www.gnu.org/copyleft/lesser.txt.
00023 -----------------------------------------------------------------------------
00024 */
00025 #include "OgreStableHeaders.h"
00026 #include "OgreVertexIndexData.h"
00027 #include "OgreHardwareBufferManager.h"
00028 #include "OgreHardwareVertexBuffer.h"
00029 #include "OgreHardwareIndexBuffer.h"
00030 #include "OgreVector3.h"
00031 #include "OgreAxisAlignedBox.h"
00032 
00033 namespace Ogre {
00034 
00035     //-----------------------------------------------------------------------
00036     VertexData::VertexData()
00037     {
00038         vertexBufferBinding = HardwareBufferManager::getSingleton().
00039             createVertexBufferBinding();
00040         vertexDeclaration = HardwareBufferManager::getSingleton().
00041             createVertexDeclaration();
00042         vertexCount = 0;
00043         vertexStart = 0;
00044         softwareBlendInfo = NULL;
00045 
00046     }
00047     //-----------------------------------------------------------------------
00048     VertexData::~VertexData()
00049     {
00050         HardwareBufferManager::getSingleton().
00051             destroyVertexBufferBinding(vertexBufferBinding);
00052         HardwareBufferManager::getSingleton().destroyVertexDeclaration(vertexDeclaration);
00053         if(softwareBlendInfo)
00054         {
00055             delete softwareBlendInfo;
00056             softwareBlendInfo = NULL;
00057         }
00058 
00059     }
00060     //-----------------------------------------------------------------------
00061     VertexData* VertexData::clone(void)
00062     {
00063         VertexData* dest = new VertexData();
00064 
00065         // Copy vertex buffers in turn
00066         const VertexBufferBinding::VertexBufferBindingMap bindings = 
00067             this->vertexBufferBinding->getBindings();
00068         VertexBufferBinding::VertexBufferBindingMap::const_iterator vbi, vbend;
00069         vbend = bindings.end();
00070         for (vbi = bindings.begin(); vbi != vbend; ++vbi)
00071         {
00072             HardwareVertexBufferSharedPtr srcbuf = vbi->second;
00073             // create new buffer with the same settings
00074             HardwareVertexBufferSharedPtr dstBuf = 
00075                 HardwareBufferManager::getSingleton().createVertexBuffer(
00076                     srcbuf->getVertexSize(), srcbuf->getNumVertices(), srcbuf->getUsage(),
00077                     srcbuf->isSystemMemory());
00078 
00079             // copy data
00080             dstBuf->copyData(*srcbuf, 0, 0, srcbuf->getSizeInBytes(), true);
00081 
00082             // Copy binding
00083             dest->vertexBufferBinding->setBinding(vbi->first, dstBuf);
00084         }
00085 
00086         // Basic vertex info
00087         dest->vertexStart = this->vertexStart;
00088         dest->vertexCount = this->vertexCount;
00089         // Copy elements
00090         const VertexDeclaration::VertexElementList elems = 
00091             this->vertexDeclaration->getElements();
00092         VertexDeclaration::VertexElementList::const_iterator ei, eiend;
00093         eiend = elems.end();
00094         for (ei = elems.begin(); ei != eiend; ++ei)
00095         {
00096             dest->vertexDeclaration->addElement(
00097                 ei->getSource(),
00098                 ei->getOffset(),
00099                 ei->getType(),
00100                 ei->getSemantic(),
00101                 ei->getIndex() );
00102         }
00103 
00104         // Copy software blend info
00105         if(softwareBlendInfo)
00106         {
00107             dest->softwareBlendInfo = new SoftwareBlendInfo();
00108             dest->softwareBlendInfo->automaticBlend = softwareBlendInfo->automaticBlend;
00109             dest->softwareBlendInfo->numWeightsPerVertex = softwareBlendInfo->numWeightsPerVertex;
00110             dest->softwareBlendInfo->pBlendIndexes = 
00111                 new unsigned char[vertexCount * softwareBlendInfo->numWeightsPerVertex];
00112             dest->softwareBlendInfo->pBlendWeights = 
00113                 new Real[vertexCount * softwareBlendInfo->numWeightsPerVertex];
00114             // copy data
00115             memcpy(dest->softwareBlendInfo->pBlendIndexes, softwareBlendInfo->pBlendIndexes, 
00116                 sizeof(unsigned char) * vertexCount * softwareBlendInfo->numWeightsPerVertex);
00117             memcpy(dest->softwareBlendInfo->pBlendWeights, softwareBlendInfo->pBlendWeights, 
00118                 sizeof(Real) * vertexCount * softwareBlendInfo->numWeightsPerVertex);
00119 
00120             dest->softwareBlendInfo->pSrcPositions = new Real[vertexCount * 3];
00121             dest->softwareBlendInfo->pSrcNormals = new Real[vertexCount * 3];
00122             memcpy(dest->softwareBlendInfo->pSrcPositions, 
00123                 softwareBlendInfo->pSrcPositions, sizeof(Real) * vertexCount * 3);
00124             memcpy(dest->softwareBlendInfo->pSrcNormals, 
00125                 softwareBlendInfo->pSrcNormals, sizeof(Real) * vertexCount * 3);
00126 
00127         }
00128         
00129         return dest;
00130     }
00131     //-----------------------------------------------------------------------
00132     VertexData::SoftwareBlendInfo::~SoftwareBlendInfo()
00133     {
00134         if (pSrcPositions)
00135             delete [] pSrcPositions;
00136         if (pSrcNormals)
00137             delete [] pSrcNormals;
00138         if (pBlendIndexes)
00139             delete [] pBlendIndexes;
00140         if (pBlendWeights)
00141             delete [] pBlendWeights;
00142     }
00143     //-----------------------------------------------------------------------
00144     IndexData::IndexData()
00145     {
00146         indexCount = 0;
00147         indexStart = 0;
00148         
00149     }
00150     //-----------------------------------------------------------------------
00151     IndexData::~IndexData()
00152     {
00153     }
00154     //-----------------------------------------------------------------------
00155     IndexData* IndexData::clone(void)
00156     {
00157         IndexData* dest = new IndexData();
00158         if (indexBuffer.get())
00159         {
00160             dest->indexBuffer = HardwareBufferManager::getSingleton().
00161                 createIndexBuffer(indexBuffer->getType(), indexBuffer->getNumIndexes(),
00162                 indexBuffer->getUsage(), indexBuffer->isSystemMemory());
00163             dest->indexBuffer->copyData(*indexBuffer, 0, 0, indexBuffer->getSizeInBytes(), true);
00164         }
00165         dest->indexCount = indexCount;
00166         dest->indexStart = indexStart;
00167         return dest;
00168     }
00169 
00170 }

Copyright © 2002-2003 by The OGRE Team
Last modified Wed Jan 21 00:10:31 2004