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 "OgreD3D9VertexDeclaration.h" 00026 #include "OgreD3D9Mappings.h" 00027 #include "OgreException.h" 00028 #include "OgreRoot.h" 00029 00030 namespace Ogre { 00031 00032 //----------------------------------------------------------------------- 00033 D3D9VertexDeclaration::D3D9VertexDeclaration(LPDIRECT3DDEVICE9 device) 00034 : mlpD3DDevice(device), mlpD3DDecl(NULL), mNeedsRebuild(true) 00035 { 00036 } 00037 //----------------------------------------------------------------------- 00038 D3D9VertexDeclaration::~D3D9VertexDeclaration() 00039 { 00040 SAFE_RELEASE(mlpD3DDecl); 00041 } 00042 //----------------------------------------------------------------------- 00043 const VertexElement& D3D9VertexDeclaration::addElement(unsigned short source, 00044 size_t offset, VertexElementType theType, 00045 VertexElementSemantic semantic, unsigned short index) 00046 { 00047 mNeedsRebuild = true; 00048 return VertexDeclaration::addElement(source, offset, theType, semantic, index); 00049 } 00050 //----------------------------------------------------------------------------- 00051 const VertexElement& D3D9VertexDeclaration::insertElement(unsigned short atPosition, 00052 unsigned short source, size_t offset, VertexElementType theType, 00053 VertexElementSemantic semantic, unsigned short index) 00054 { 00055 mNeedsRebuild = true; 00056 return VertexDeclaration::insertElement(atPosition, source, offset, theType, semantic, index); 00057 } 00058 //----------------------------------------------------------------------- 00059 void D3D9VertexDeclaration::removeElement(unsigned short elem_index) 00060 { 00061 VertexDeclaration::removeElement(elem_index); 00062 mNeedsRebuild = true; 00063 } 00064 //----------------------------------------------------------------------- 00065 void D3D9VertexDeclaration::modifyElement(unsigned short elem_index, 00066 unsigned short source, size_t offset, VertexElementType theType, 00067 VertexElementSemantic semantic, unsigned short index) 00068 { 00069 VertexDeclaration::modifyElement(elem_index, source, offset, theType, semantic, index); 00070 mNeedsRebuild = true; 00071 } 00072 //----------------------------------------------------------------------- 00073 LPDIRECT3DVERTEXDECLARATION9 D3D9VertexDeclaration::getD3DVertexDeclaration(void) 00074 { 00075 if (mNeedsRebuild) 00076 { 00077 SAFE_RELEASE(mlpD3DDecl); 00078 // Create D3D elements 00079 D3DVERTEXELEMENT9* d3delems = new D3DVERTEXELEMENT9[mElementList.size() + 1]; 00080 00081 VertexElementList::const_iterator i, iend; 00082 unsigned int idx; 00083 iend = mElementList.end(); 00084 for (idx = 0, i = mElementList.begin(); i != iend; ++i, ++idx) 00085 { 00086 d3delems[idx].Method = D3DDECLMETHOD_DEFAULT; 00087 d3delems[idx].Offset = static_cast<WORD>(i->getOffset()); 00088 d3delems[idx].Stream = i->getSource(); 00089 d3delems[idx].Type = D3D9Mappings::get(i->getType()); 00090 d3delems[idx].Usage = D3D9Mappings::get(i->getSemantic()); 00091 // NB force index if colours since D3D uses the same usage for 00092 // diffuse & specular 00093 if (i->getSemantic() == VES_SPECULAR) 00094 { 00095 d3delems[idx].UsageIndex = 1; 00096 } 00097 else if (i->getSemantic() == VES_DIFFUSE) 00098 { 00099 d3delems[idx].UsageIndex = 0; 00100 } 00101 else 00102 { 00103 d3delems[idx].UsageIndex = i->getIndex(); 00104 } 00105 } 00106 // Add terminator 00107 d3delems[idx].Stream = 0xff; 00108 d3delems[idx].Offset = 0; 00109 d3delems[idx].Type = D3DDECLTYPE_UNUSED; 00110 d3delems[idx].Method = 0; 00111 d3delems[idx].Usage = 0; 00112 d3delems[idx].UsageIndex = 0; 00113 00114 HRESULT hr = mlpD3DDevice->CreateVertexDeclaration(d3delems, &mlpD3DDecl); 00115 00116 if (FAILED(hr)) 00117 { 00118 Except(Exception::ERR_INTERNAL_ERROR, 00119 "Cannot create D3D9 vertex declaration: " + 00120 Root::getSingleton().getErrorDescription(hr), 00121 "Direct3D9VertexDeclaration::getD3DVertexDeclaration"); 00122 } 00123 00124 delete [] d3delems; 00125 00126 mNeedsRebuild = false; 00127 00128 } 00129 return mlpD3DDecl; 00130 } 00131 //----------------------------------------------------------------------- 00132 00133 00134 } 00135
Copyright © 2002-2003 by The OGRE Team
Last modified Sun Nov 28 19:48:22 2004