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-2002 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 "OgreSubMesh.h" 00027 00028 #include "OgreMesh.h" 00029 #include "OgreException.h" 00030 #include "OgreMeshManager.h" 00031 00032 namespace Ogre { 00033 //----------------------------------------------------------------------- 00034 SubMesh::SubMesh() 00035 { 00036 useSharedVertices = true; 00037 vertexData = NULL; 00038 indexData = new IndexData(); 00039 mMatInitialised = false; 00040 mBoneAssignmentsOutOfDate = false; 00041 operationType = RenderOperation::OT_TRIANGLE_LIST; 00042 00043 } 00044 //----------------------------------------------------------------------- 00045 SubMesh::~SubMesh() 00046 { 00047 if (vertexData) 00048 { 00049 delete vertexData; 00050 } 00051 delete indexData; 00052 00053 removeLodLevels(); 00054 } 00055 00056 //----------------------------------------------------------------------- 00057 void SubMesh::setMaterialName(const String& name) 00058 { 00059 mMaterialName = name; 00060 mMatInitialised = true; 00061 } 00062 //----------------------------------------------------------------------- 00063 const String& SubMesh::getMaterialName() const 00064 { 00065 return mMaterialName; 00066 } 00067 //----------------------------------------------------------------------- 00068 bool SubMesh::isMatInitialised(void) const 00069 { 00070 return mMatInitialised; 00071 00072 } 00073 //----------------------------------------------------------------------- 00074 void SubMesh::_getRenderOperation(RenderOperation& ro, ushort lodIndex) 00075 { 00076 00077 // SubMeshes always use indexes 00078 ro.useIndexes = true; 00079 if (lodIndex > 0 && static_cast< size_t >( lodIndex - 1 ) < mLodFaceList.size()) 00080 { 00081 // lodIndex - 1 because we don't store full detail version in mLodFaceList 00082 ro.indexData = mLodFaceList[lodIndex-1]; 00083 } 00084 else 00085 { 00086 ro.indexData = indexData; 00087 } 00088 ro.operationType = operationType; 00089 ro.vertexData = useSharedVertices? parent->sharedVertexData : vertexData; 00090 00091 } 00092 //----------------------------------------------------------------------- 00093 void SubMesh::addBoneAssignment(const VertexBoneAssignment& vertBoneAssign) 00094 { 00095 if (useSharedVertices) 00096 { 00097 Except(Exception::ERR_INVALIDPARAMS, "This SubMesh uses shared geometry, you " 00098 "must assign bones to the Mesh, not the SubMesh", "SubMesh.addBoneAssignment"); 00099 } 00100 mBoneAssignments.insert( 00101 VertexBoneAssignmentList::value_type(vertBoneAssign.vertexIndex, vertBoneAssign)); 00102 mBoneAssignmentsOutOfDate = true; 00103 } 00104 //----------------------------------------------------------------------- 00105 void SubMesh::clearBoneAssignments(void) 00106 { 00107 mBoneAssignments.clear(); 00108 mBoneAssignmentsOutOfDate = true; 00109 } 00110 00111 //----------------------------------------------------------------------- 00112 void SubMesh::_compileBoneAssignments(void) 00113 { 00114 unsigned short maxBones = 00115 parent->_rationaliseBoneAssignments(vertexData->vertexCount, mBoneAssignments); 00116 00117 if (maxBones == 0) 00118 { 00119 // No bone assignments 00120 return; 00121 } 00122 00123 parent->compileBoneAssignments(mBoneAssignments, maxBones, 00124 vertexData); 00125 00126 /* 00127 if (parent->mUseSoftwareBlending) 00128 { 00129 parent->compileBoneAssignmentsSoftware(mBoneAssignments, maxBones, vertexData); 00130 } 00131 else 00132 { 00133 parent->compileBoneAssignmentsHardware(mBoneAssignments, maxBones, vertexData); 00134 } 00135 */ 00136 00137 mBoneAssignmentsOutOfDate = false; 00138 } 00139 //--------------------------------------------------------------------- 00140 SubMesh::BoneAssignmentIterator SubMesh::getBoneAssignmentIterator(void) 00141 { 00142 return BoneAssignmentIterator(mBoneAssignments.begin(), 00143 mBoneAssignments.end()); 00144 } 00145 //--------------------------------------------------------------------- 00146 void SubMesh::removeLodLevels(void) 00147 { 00148 ProgressiveMesh::LODFaceList::iterator lodi, lodend; 00149 lodend = mLodFaceList.end(); 00150 for (lodi = mLodFaceList.begin(); lodi != lodend; ++lodi) 00151 { 00152 delete *lodi; 00153 } 00154 00155 mLodFaceList.clear(); 00156 00157 } 00158 00159 00160 00161 } 00162
Copyright © 2002-2003 by The OGRE Team
Last modified Sun Nov 28 19:48:48 2004