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