OSDN Git Service

Merge branch 'feature/#36529_SlimDXからSharpDXへの移行' into develop
[dtxmania/dtxmania.git] / SlimDXc_Jun2010(VC++2008) / source / direct3d9 / Mesh.cpp
diff --git a/SlimDXc_Jun2010(VC++2008)/source/direct3d9/Mesh.cpp b/SlimDXc_Jun2010(VC++2008)/source/direct3d9/Mesh.cpp
deleted file mode 100644 (file)
index 5fb501b..0000000
+++ /dev/null
@@ -1,1147 +0,0 @@
-#include "stdafx.h"\r
-/*\r
-* Copyright (c) 2007-2010 SlimDX Group\r
-* \r
-* Permission is hereby granted, free of charge, to any person obtaining a copy\r
-* of this software and associated documentation files (the "Software"), to deal\r
-* in the Software without restriction, including without limitation the rights\r
-* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r
-* copies of the Software, and to permit persons to whom the Software is\r
-* furnished to do so, subject to the following conditions:\r
-* \r
-* The above copyright notice and this permission notice shall be included in\r
-* all copies or substantial portions of the Software.\r
-* \r
-* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r
-* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r
-* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r
-* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r
-* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r
-* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\r
-* THE SOFTWARE.\r
-*/\r
-#include <d3d9.h>\r
-#include <d3dx9.h>\r
-#include <vcclr.h>\r
-\r
-#include "../stack_array.h"\r
-#include "../ComObject.h"\r
-#include "../Utilities.h"\r
-#include "../DataStream.h"\r
-\r
-#include "Direct3D9Exception.h"\r
-\r
-#include "Device.h"\r
-#include "Texture.h"\r
-#include "IndexBuffer.h"\r
-#include "VertexBuffer.h"\r
-#include "Mesh.h"\r
-#include "SkinInfo.h"\r
-\r
-using namespace System;\r
-using namespace System::IO;\r
-using namespace System::Drawing;\r
-using namespace System::Runtime::InteropServices;\r
-\r
-namespace SlimDX\r
-{\r
-namespace Direct3D9\r
-{\r
-       Mesh::Mesh( SlimDX::Direct3D9::Device^ device, int numFaces, int numVertices, MeshFlags options, array<VertexElement>^ vertexDeclaration )\r
-       {\r
-               ID3DXMesh* mesh = NULL;\r
-               pin_ptr<VertexElement> pinnedDecl = &vertexDeclaration[0];\r
-\r
-               HRESULT hr = D3DXCreateMesh( numFaces, numVertices, static_cast<DWORD>( options ),\r
-                       reinterpret_cast<D3DVERTEXELEMENT9*>( pinnedDecl ), device->InternalPointer, &mesh );\r
-\r
-               if( RECORD_D3D9( hr ).IsFailure )\r
-                       throw gcnew Direct3D9Exception( Result::Last );\r
-\r
-               Construct(mesh);\r
-       }\r
-\r
-       Mesh::Mesh( SlimDX::Direct3D9::Device^ device, int numFaces, int numVertices, MeshFlags options, SlimDX::Direct3D9::VertexFormat fvf )\r
-       {\r
-               ID3DXMesh* mesh = NULL;\r
-\r
-               HRESULT hr = D3DXCreateMeshFVF( numFaces, numVertices, static_cast<DWORD>( options ), \r
-                       static_cast<DWORD>( fvf ), device->InternalPointer, &mesh );\r
-\r
-               if( RECORD_D3D9( hr ).IsFailure )\r
-                       throw gcnew Direct3D9Exception( Result::Last );\r
-\r
-               Construct(mesh);\r
-       }\r
-\r
-       Mesh^ Mesh::FromMemory_Internal( SlimDX::Direct3D9::Device^ device, const void* memory, DWORD size, MeshFlags flags )\r
-       {\r
-               ID3DXMesh* mesh = NULL;\r
-               ID3DXBuffer* adjacencyBuffer = NULL;\r
-               ID3DXBuffer* materialBuffer = NULL;\r
-               ID3DXBuffer* instanceBuffer = NULL;\r
-               DWORD materialCount = 0;\r
-               \r
-               HRESULT hr = D3DXLoadMeshFromXInMemory( memory, size, static_cast<DWORD>( flags ), device->InternalPointer,\r
-                       &adjacencyBuffer, &materialBuffer, &instanceBuffer, &materialCount, &mesh );\r
-               \r
-               if( RECORD_D3D9( hr ).IsFailure )\r
-                       return nullptr;\r
-\r
-               Mesh^ result = Mesh::FromPointer( mesh );\r
-\r
-               result->SetAdjacency( Utilities::ReadRange<int>( adjacencyBuffer, mesh->GetNumFaces() * 3 ) );\r
-               result->SetMaterials( ExtendedMaterial::FromBuffer( materialBuffer, materialCount ) );\r
-               result->SetEffects( EffectInstance::FromBuffer( instanceBuffer, materialCount ) );\r
-\r
-               materialBuffer->Release();\r
-               instanceBuffer->Release();\r
-\r
-               return result;\r
-       }\r
-\r
-       Mesh^ Mesh::FromMemory( SlimDX::Direct3D9::Device^ device, array<Byte>^ memory, MeshFlags flags )\r
-       {\r
-               pin_ptr<unsigned char> pinnedMemory = &memory[0];\r
-               return Mesh::FromMemory_Internal( device, pinnedMemory, static_cast<DWORD>( memory->Length ), flags );\r
-       }\r
-\r
-       Mesh^ Mesh::FromStream( SlimDX::Direct3D9::Device^ device, Stream^ stream, MeshFlags flags )\r
-       {\r
-               DataStream^ ds = nullptr;\r
-               array<Byte>^ data = Utilities::ReadStream( stream, &ds );\r
-\r
-               if( data == nullptr )\r
-               {\r
-                       DWORD size = static_cast<DWORD>( ds->RemainingLength );\r
-                       return Mesh::FromMemory_Internal( device, ds->SeekToEnd(), size, flags );\r
-               }\r
-\r
-               return Mesh::FromMemory( device, data, flags );\r
-       }\r
-\r
-       Mesh^ Mesh::FromFile( SlimDX::Direct3D9::Device^ device, String^ fileName, MeshFlags flags )\r
-       {\r
-               ID3DXMesh* mesh = NULL;\r
-               ID3DXBuffer* adjacencyBuffer = NULL;\r
-               ID3DXBuffer* materialBuffer = NULL;\r
-               ID3DXBuffer* instanceBuffer = NULL;\r
-               DWORD materialCount = 0;\r
-               pin_ptr<const wchar_t> pinnedFileName = PtrToStringChars( fileName );\r
-               \r
-               HRESULT hr = D3DXLoadMeshFromX( pinnedFileName, static_cast<DWORD>( flags ), device->InternalPointer,\r
-                       &adjacencyBuffer, &materialBuffer, &instanceBuffer, &materialCount, &mesh );\r
-               \r
-               if( RECORD_D3D9( hr ).IsFailure )\r
-                       return nullptr;\r
-\r
-               Mesh^ result = Mesh::FromPointer( mesh );\r
-\r
-               result->SetAdjacency( Utilities::ReadRange<int>( adjacencyBuffer, mesh->GetNumFaces() * 3 ) );\r
-               result->SetMaterials( ExtendedMaterial::FromBuffer( materialBuffer, materialCount ) );\r
-               result->SetEffects( EffectInstance::FromBuffer( instanceBuffer, materialCount ) );\r
-\r
-               materialBuffer->Release();\r
-               instanceBuffer->Release();\r
-\r
-               return result;\r
-       }\r
-\r
-       Mesh^ Mesh::FromXFile( SlimDX::Direct3D9::Device^ device, XFileData^ xfile, MeshFlags flags )\r
-       {\r
-               ID3DXMesh* mesh = NULL;\r
-               ID3DXSkinInfo* skin = NULL;\r
-               ID3DXBuffer* adjacencyBuffer = NULL;\r
-               ID3DXBuffer* materialBuffer = NULL;\r
-               ID3DXBuffer* instanceBuffer = NULL;\r
-               DWORD materialCount = 0;\r
-               \r
-               HRESULT hr = D3DXLoadSkinMeshFromXof( xfile->InternalPointer, static_cast<DWORD>( flags ), device->InternalPointer,\r
-                       &adjacencyBuffer, &materialBuffer, &instanceBuffer, &materialCount, &skin, &mesh );\r
-               \r
-               if( RECORD_D3D9( hr ).IsFailure )\r
-                       return nullptr;\r
-\r
-               Mesh^ result = Mesh::FromPointer( mesh );\r
-\r
-               result->SetAdjacency( Utilities::ReadRange<int>( adjacencyBuffer, mesh->GetNumFaces() * 3 ) );\r
-               result->SetMaterials( ExtendedMaterial::FromBuffer( materialBuffer, materialCount ) );\r
-               result->SetEffects( EffectInstance::FromBuffer( instanceBuffer, materialCount ) );\r
-\r
-               materialBuffer->Release();\r
-               instanceBuffer->Release();\r
-\r
-               result->SkinInfo = SlimDX::Direct3D9::SkinInfo::FromPointer( skin );\r
-\r
-               return result;\r
-       }\r
-\r
-       Result Mesh::ComputeTangentFrame( TangentOptions options )\r
-       {\r
-               HRESULT hr = D3DXComputeTangentFrame( InternalPointer, static_cast<DWORD>( options ) );\r
-               return RECORD_D3D9( hr );\r
-       }\r
-\r
-       Mesh^ Mesh::CreateBox( SlimDX::Direct3D9::Device^ device, float width, float height, float depth )\r
-       {\r
-               ID3DXMesh *result = NULL;\r
-               ID3DXBuffer *adj = NULL;\r
-\r
-               HRESULT hr = D3DXCreateBox( device->InternalPointer, width, height, depth, &result, &adj );\r
-               \r
-               if( RECORD_D3D9( hr ).IsFailure )\r
-                       return nullptr;\r
-\r
-               Mesh^ mesh = Mesh::FromPointer( result );\r
-\r
-               mesh->SetAdjacency( Utilities::ReadRange<int>( adj, result->GetNumFaces() * 3 ) );\r
-               return mesh;\r
-       }\r
-\r
-       Mesh^ Mesh::CreateCylinder( SlimDX::Direct3D9::Device^ device, float radius1, float radius2, float length, int slices, int stacks )\r
-       {\r
-               ID3DXMesh *result = NULL;\r
-               ID3DXBuffer *adj = NULL;\r
-\r
-               HRESULT hr = D3DXCreateCylinder( device->InternalPointer, radius1, radius2, length, slices, stacks, &result, &adj );\r
-               \r
-               if( RECORD_D3D9( hr ).IsFailure )\r
-                       return nullptr;\r
-\r
-               Mesh^ mesh = Mesh::FromPointer( result );\r
-\r
-               mesh->SetAdjacency( Utilities::ReadRange<int>( adj, result->GetNumFaces() * 3 ) );\r
-               return mesh;\r
-       }\r
-\r
-       Mesh^ Mesh::CreateSphere( SlimDX::Direct3D9::Device^ device, float radius, int slices, int stacks )\r
-       {\r
-               ID3DXMesh *result = NULL;\r
-               ID3DXBuffer *adj = NULL;\r
-\r
-               HRESULT hr = D3DXCreateSphere( device->InternalPointer, radius, slices, stacks, &result, &adj );\r
-               \r
-               if( RECORD_D3D9( hr ).IsFailure )\r
-                       return nullptr;\r
-\r
-               Mesh^ mesh = Mesh::FromPointer( result );\r
-\r
-               mesh->SetAdjacency( Utilities::ReadRange<int>( adj, result->GetNumFaces() * 3 ) );\r
-               return mesh;\r
-       }\r
-\r
-       Mesh^ Mesh::CreateTeapot( SlimDX::Direct3D9::Device^ device )\r
-       {\r
-               ID3DXMesh *result = NULL;\r
-               ID3DXBuffer *adj = NULL;\r
-\r
-               HRESULT hr = D3DXCreateTeapot( device->InternalPointer, &result, &adj );\r
-               \r
-               if( RECORD_D3D9( hr ).IsFailure )\r
-                       return nullptr;\r
-\r
-               Mesh^ mesh = Mesh::FromPointer( result );\r
-\r
-               mesh->SetAdjacency( Utilities::ReadRange<int>( adj, result->GetNumFaces() * 3 ) );\r
-               return mesh;\r
-       }\r
-\r
-       Mesh^ Mesh::CreateTorus( SlimDX::Direct3D9::Device^ device, float innerRadius, float outerRadius, int sides, int rings )\r
-       {\r
-               ID3DXMesh *result = NULL;\r
-               ID3DXBuffer *adj = NULL;\r
-\r
-               HRESULT hr = D3DXCreateTorus( device->InternalPointer, innerRadius, outerRadius, sides, rings, &result, &adj );\r
-               \r
-               if( RECORD_D3D9( hr ).IsFailure )\r
-                       return nullptr;\r
-\r
-               Mesh^ mesh = Mesh::FromPointer( result );\r
-\r
-               mesh->SetAdjacency( Utilities::ReadRange<int>( adj, result->GetNumFaces() * 3 ) );\r
-               return mesh;\r
-       }\r
-\r
-       Mesh^ Mesh::CreateText( SlimDX::Direct3D9::Device^ device, Font^ font, String^ text, float deviation, float extrusion, [Out] array<GlyphMetricsFloat>^% glyphMetrics )\r
-       {\r
-               ID3DXMesh *result = NULL;\r
-               ID3DXBuffer *adj = NULL;\r
-\r
-               glyphMetrics = gcnew array<GlyphMetricsFloat>( text->Length );\r
-\r
-               pin_ptr<const wchar_t> pinnedText = PtrToStringChars( text );\r
-               pin_ptr<GlyphMetricsFloat> pinnedMetrics = &glyphMetrics[0];\r
-\r
-               HDC hdc = CreateCompatibleDC( NULL );\r
-               HFONT newFont;\r
-               HFONT oldFont;\r
-               if( hdc == NULL )\r
-                       throw gcnew OutOfMemoryException();\r
-\r
-               newFont = static_cast<HFONT>( font->ToHfont().ToPointer() );\r
-               oldFont = static_cast<HFONT>( SelectObject( hdc, newFont ) );           \r
-\r
-               HRESULT hr = D3DXCreateText( device->InternalPointer, hdc, reinterpret_cast<LPCWSTR>( pinnedText ),\r
-                       deviation, extrusion, &result, &adj, reinterpret_cast<LPGLYPHMETRICSFLOAT>( pinnedMetrics ) );\r
-\r
-               SelectObject( hdc, oldFont );\r
-               DeleteObject( newFont );\r
-               DeleteDC( hdc );\r
-\r
-               if( RECORD_D3D9( hr ).IsFailure )\r
-               {\r
-                       glyphMetrics = nullptr;\r
-                       return nullptr;\r
-               }\r
-\r
-               Mesh^ mesh = Mesh::FromPointer( result );\r
-\r
-               mesh->SetAdjacency( Utilities::ReadRange<int>( adj, result->GetNumFaces() * 3 ) );\r
-               return mesh;\r
-       }\r
-\r
-       Mesh^ Mesh::CreateText( SlimDX::Direct3D9::Device^ device, Font^ font, String^ text, float deviation, float extrusion )\r
-       {\r
-               ID3DXMesh *result = NULL;\r
-               ID3DXBuffer *adj = NULL;\r
-\r
-               pin_ptr<const wchar_t> pinnedText = PtrToStringChars( text );\r
-\r
-               HDC hdc = CreateCompatibleDC( NULL );\r
-               HFONT newFont;\r
-               HFONT oldFont;\r
-               if( hdc == NULL )\r
-                       throw gcnew OutOfMemoryException();\r
-\r
-               newFont = static_cast<HFONT>( font->ToHfont().ToPointer() );\r
-               oldFont = static_cast<HFONT>( SelectObject( hdc, newFont ) );           \r
-\r
-               HRESULT hr = D3DXCreateText( device->InternalPointer, hdc, reinterpret_cast<LPCWSTR>( pinnedText ),\r
-                       deviation, extrusion, &result, &adj, NULL );\r
-\r
-               SelectObject( hdc, oldFont );\r
-               DeleteObject( newFont );\r
-               DeleteDC( hdc );\r
-\r
-               if( RECORD_D3D9( hr ).IsFailure )\r
-                       return nullptr;\r
-\r
-               Mesh^ mesh = Mesh::FromPointer( result );\r
-\r
-               mesh->SetAdjacency( Utilities::ReadRange<int>( adj, result->GetNumFaces() * 3 ) );\r
-               return mesh;\r
-       }\r
-\r
-       DataStream^ Mesh::LockAttributeBuffer( LockFlags flags )\r
-       {\r
-               DWORD *data = NULL;\r
-               int faceCount = InternalPointer->GetNumFaces();\r
-               \r
-               HRESULT hr = InternalPointer->LockAttributeBuffer( static_cast<DWORD>( flags ), &data );\r
-               \r
-               if( RECORD_D3D9( hr ).IsFailure )\r
-                       return nullptr;\r
-\r
-               bool readOnly = (flags & LockFlags::ReadOnly) == LockFlags::ReadOnly;\r
-               return gcnew DataStream( data, faceCount * sizeof( DWORD ), true, !readOnly, false );\r
-       }\r
-\r
-       Result Mesh::UnlockAttributeBuffer()\r
-       {\r
-               HRESULT hr = InternalPointer->UnlockAttributeBuffer();\r
-               return RECORD_D3D9( hr );\r
-       }\r
-\r
-       Result Mesh::SetAttributeTable( array<AttributeRange>^ table )\r
-       {\r
-               pin_ptr<AttributeRange> pinnedTable = &table[0];\r
-\r
-               HRESULT hr = InternalPointer->SetAttributeTable( reinterpret_cast<const D3DXATTRIBUTERANGE*>( pinnedTable ), table->Length );\r
-               return RECORD_D3D9( hr );\r
-       }\r
-\r
-       Result Mesh::OptimizeInPlace( MeshOptimizeFlags flags, [Out] array<int>^% faceRemap, [Out] array<int>^% vertexRemap )\r
-       {\r
-               ID3DXBuffer *buffer = NULL;\r
-               DWORD *adjacencyIn = NULL;\r
-               DWORD *adjacencyOutPtr = NULL;\r
-               stack_array<DWORD> adjacencyOut = stackalloc( DWORD, FaceCount * 3 );\r
-\r
-               array<int>^ adjacency = GetAdjacency();\r
-               pin_ptr<int> pinnedAdjIn;\r
-\r
-               faceRemap = gcnew array<int>( FaceCount );\r
-               pin_ptr<int> pinnedFR = &faceRemap[0];\r
-\r
-               if( adjacency != nullptr )\r
-               {\r
-                       pinnedAdjIn = &adjacency[0];\r
-                       adjacencyIn = reinterpret_cast<DWORD*>( pinnedAdjIn );\r
-                       adjacencyOutPtr = &adjacencyOut[0];\r
-               }               \r
-\r
-               HRESULT hr = InternalPointer->OptimizeInplace( static_cast<DWORD>( flags ), adjacencyIn,\r
-                       adjacencyOutPtr, reinterpret_cast<DWORD*>( pinnedFR ), &buffer );\r
-\r
-               if( RECORD_D3D9( hr ).IsFailure )\r
-               {\r
-                       faceRemap = nullptr;\r
-                       vertexRemap = nullptr;\r
-                       SetAdjacency( NULL );\r
-               }\r
-               else\r
-               {\r
-                       vertexRemap = Utilities::ReadRange<int>( buffer, VertexCount );\r
-                       if( adjacencyOutPtr != NULL )\r
-                               SetAdjacency( &adjacencyOut[0] );\r
-                       else\r
-                               SetAdjacency( NULL );\r
-               }\r
-\r
-               return Result::Last;\r
-       }\r
-\r
-       Result Mesh::OptimizeInPlace( MeshOptimizeFlags flags )\r
-       {\r
-               DWORD *adjacencyIn = NULL;\r
-               DWORD *adjacencyOutPtr = NULL;\r
-               stack_array<DWORD> adjacencyOut = stackalloc( DWORD, FaceCount * 3 );\r
-\r
-               array<int>^ adjacency = GetAdjacency();\r
-               pin_ptr<int> pinnedAdjIn;\r
-               if( adjacency != nullptr )\r
-               {\r
-                       pinnedAdjIn = &adjacency[0];\r
-                       adjacencyIn = reinterpret_cast<DWORD*>( pinnedAdjIn );\r
-                       adjacencyOutPtr = &adjacencyOut[0];\r
-               }\r
-\r
-               HRESULT hr = InternalPointer->OptimizeInplace( static_cast<DWORD>( flags ), adjacencyIn,\r
-                       adjacencyOutPtr, NULL, NULL );\r
-               RECORD_D3D9( hr );\r
-\r
-               if( FAILED( hr ) )\r
-                       SetAdjacency( NULL );\r
-               else\r
-               {\r
-                       if( adjacencyOutPtr != NULL )\r
-                               SetAdjacency( &adjacencyOut[0] );\r
-                       else\r
-                               SetAdjacency( NULL );\r
-               }\r
-\r
-               return Result::Last;\r
-       }\r
-\r
-       Mesh^ Mesh::Optimize( MeshOptimizeFlags flags, [Out] array<int>^% faceRemap, [Out] array<int>^% vertexRemap )\r
-       {\r
-               ID3DXMesh *result = NULL;\r
-               ID3DXBuffer *buffer = NULL;\r
-               DWORD *adjacencyIn = NULL;\r
-               DWORD *adjacencyOutPtr = NULL;\r
-               stack_array<DWORD> adjacencyOut = stackalloc( DWORD, FaceCount * 3 );\r
-\r
-               array<int>^ adjacency = GetAdjacency();\r
-               pin_ptr<int> pinnedAdjIn;\r
-\r
-               faceRemap = gcnew array<int>( FaceCount );\r
-               pin_ptr<int> pinnedFR = &faceRemap[0];\r
-\r
-               if( adjacency != nullptr )\r
-               {\r
-                       pinnedAdjIn = &adjacency[0];\r
-                       adjacencyIn = reinterpret_cast<DWORD*>( pinnedAdjIn );\r
-                       adjacencyOutPtr = &adjacencyOut[0];\r
-               }               \r
-\r
-               HRESULT hr = InternalPointer->Optimize( static_cast<DWORD>( flags ), adjacencyIn,\r
-                       adjacencyOutPtr, reinterpret_cast<DWORD*>( pinnedFR ), &buffer, &result );\r
-\r
-               if( RECORD_D3D9( hr ).IsFailure )\r
-               {\r
-                       faceRemap = nullptr;\r
-                       vertexRemap = nullptr;\r
-                       return nullptr;\r
-               }\r
-\r
-               Mesh^ mesh = Mesh::FromPointer( result );\r
-\r
-               vertexRemap = Utilities::ReadRange<int>( buffer, VertexCount );\r
-\r
-               if( adjacencyOutPtr != NULL )\r
-                       mesh->SetAdjacency( &adjacencyOut[0] );\r
-\r
-               return mesh;\r
-       }\r
-\r
-       Mesh^ Mesh::Optimize( MeshOptimizeFlags flags )\r
-       {\r
-               ID3DXMesh *result = NULL;\r
-               DWORD *adjacencyIn = NULL;\r
-               DWORD *adjacencyOutPtr = NULL;\r
-               stack_array<DWORD> adjacencyOut = stackalloc( DWORD, FaceCount * 3 );\r
-\r
-               array<int>^ adjacency = GetAdjacency();\r
-               pin_ptr<int> pinnedAdjIn;\r
-\r
-               if( adjacency != nullptr )\r
-               {\r
-                       pinnedAdjIn = &adjacency[0];\r
-                       adjacencyIn = reinterpret_cast<DWORD*>( pinnedAdjIn );\r
-                       adjacencyOutPtr = &adjacencyOut[0];\r
-               }\r
-\r
-               HRESULT hr = InternalPointer->Optimize( static_cast<DWORD>( flags ), adjacencyIn,\r
-                       adjacencyOutPtr, NULL, NULL, &result );\r
-\r
-               if( RECORD_D3D9( hr ).IsFailure )\r
-                       return nullptr;\r
-\r
-               Mesh^ mesh = Mesh::FromPointer( result );\r
-\r
-               if( adjacencyOutPtr != NULL )\r
-                       mesh->SetAdjacency( &adjacencyOut[0] );\r
-\r
-               return mesh;\r
-       }\r
-\r
-       Mesh^ Mesh::Clean( CleanType type, [Out] String^% errorsAndWarnings )\r
-       {\r
-               ID3DXMesh *result = NULL;\r
-               ID3DXBuffer *errors = NULL;\r
-               DWORD *adjacencyIn = NULL;\r
-               DWORD *adjacencyOutPtr = NULL;\r
-               stack_array<DWORD> adjacencyOut = stackalloc( DWORD, FaceCount * 3 );\r
-\r
-               array<int>^ adjacency = GetAdjacency();\r
-               pin_ptr<int> pinnedAdjIn;\r
-\r
-               if( adjacency != nullptr )\r
-               {\r
-                       pinnedAdjIn = &adjacency[0];\r
-                       adjacencyIn = reinterpret_cast<DWORD*>( pinnedAdjIn );\r
-                       adjacencyOutPtr = &adjacencyOut[0];\r
-               }\r
-\r
-               HRESULT hr = D3DXCleanMesh( static_cast<D3DXCLEANTYPE>( type ), InternalPointer, \r
-                       adjacencyIn, &result, adjacencyOutPtr, &errors );\r
-\r
-               if( RECORD_D3D9( hr ).IsFailure )\r
-               {\r
-                       errorsAndWarnings = nullptr;\r
-                       return nullptr;\r
-               }\r
-\r
-               errorsAndWarnings = Utilities::BufferToString( errors );\r
-\r
-               Mesh^ mesh = Mesh::FromPointer( result );\r
-\r
-               if( adjacencyOutPtr != NULL )\r
-                       mesh->SetAdjacency( &adjacencyOut[0] );\r
-\r
-               return mesh;\r
-       }\r
-\r
-       Mesh^ Mesh::Clean( CleanType type )\r
-       {\r
-               ID3DXMesh *result = NULL;\r
-               DWORD *adjacencyIn = NULL;\r
-               DWORD *adjacencyOutPtr = NULL;\r
-               stack_array<DWORD> adjacencyOut = stackalloc( DWORD, FaceCount * 3 );\r
-\r
-               array<int>^ adjacency = GetAdjacency();\r
-               pin_ptr<int> pinnedAdjIn;\r
-\r
-               if( adjacency != nullptr )\r
-               {\r
-                       pinnedAdjIn = &adjacency[0];\r
-                       adjacencyIn = reinterpret_cast<DWORD*>( pinnedAdjIn );\r
-                       adjacencyOutPtr = &adjacencyOut[0];\r
-               }\r
-\r
-               HRESULT hr = D3DXCleanMesh( static_cast<D3DXCLEANTYPE>( type ), InternalPointer, \r
-                       &adjacencyIn[0], &result, adjacencyOutPtr, NULL );\r
-\r
-               if( RECORD_D3D9( hr ).IsFailure )\r
-                       return nullptr;\r
-\r
-               Mesh^ mesh = Mesh::FromPointer( result );\r
-\r
-               if( adjacencyOutPtr != NULL )\r
-                       mesh->SetAdjacency( &adjacencyOut[0] );\r
-\r
-               return mesh;\r
-       }\r
-\r
-       void Mesh::GenerateAdjacency( float epsilon )\r
-       {\r
-               array<int>^ adj = BaseMesh::GenerateAdjacency( epsilon );\r
-               SetAdjacency( adj );\r
-       }\r
-\r
-       String^ Mesh::Validate()\r
-       {\r
-               ID3DXBuffer *errorBuffer = NULL;\r
-               DWORD *adjacencyIn = NULL;\r
-               pin_ptr<int> pinnedAdj;\r
-               String^ errors = nullptr;\r
-\r
-               array<int>^ adjacency = GetAdjacency();\r
-               if( adjacency != nullptr )\r
-               {\r
-                       pinnedAdj = &adjacency[0];\r
-                       adjacencyIn = reinterpret_cast<DWORD*>( pinnedAdj );\r
-               }\r
-\r
-               D3DXValidMesh( InternalPointer, adjacencyIn, &errorBuffer );\r
-               errors = Utilities::BufferToString( errorBuffer );\r
-\r
-               return errors;\r
-       }\r
-\r
-       void Mesh::SetAdjacency( DWORD *adj )\r
-       {\r
-               if( adj == NULL )\r
-                       adjacency = nullptr;\r
-               else\r
-               {\r
-                       adjacency = gcnew array<int>( FaceCount * 3 );\r
-                       for( int i = 0; i < FaceCount * 3; i++ )\r
-                               adjacency[i] = adj[i];\r
-               }\r
-       }\r
-\r
-       Result Mesh::ComputeNormals()\r
-       {\r
-               DWORD *adjacencyIn = NULL;\r
-               pin_ptr<int> pinnedAdj;\r
-\r
-               array<int>^ adjacency = GetAdjacency();\r
-               if( adjacency != nullptr )\r
-               {\r
-                       pinnedAdj = &adjacency[0];\r
-                       adjacencyIn = reinterpret_cast<DWORD*>( pinnedAdj );\r
-               }\r
-\r
-               HRESULT hr = D3DXComputeNormals( InternalPointer, adjacencyIn );\r
-               return RECORD_D3D9( hr );\r
-       }\r
-\r
-       Result Mesh::ComputeTangent( int textureStage, int tangentIndex, int binormalIndex, bool wrap )\r
-       {\r
-               array<int>^ adjacency = GetAdjacency();\r
-               DWORD *adjacencyIn = NULL;\r
-               pin_ptr<int> pinnedAdj;\r
-\r
-               if( adjacency != nullptr )\r
-               {\r
-                       pinnedAdj = &adjacency[0];\r
-                       adjacencyIn = reinterpret_cast<DWORD*>( pinnedAdj );\r
-               }\r
-\r
-               HRESULT hr = D3DXComputeTangent( InternalPointer, textureStage, tangentIndex, binormalIndex, wrap, adjacencyIn );\r
-               return RECORD_D3D9( hr );\r
-       }\r
-\r
-       Mesh^ Mesh::ComputeTangentFrame( int textureInSemantic, int textureInIndex, int partialOutSemanticU, \r
-               int partialOutIndexU, int partialOutSemanticV, int partialOutIndexV, int normalOutSemantic,\r
-               int normalOutIndex, TangentOptions options, float partialEdgeThreshold,\r
-               float singularPointThreshold, float normalEdgeThreshold, [Out] array<int>^% vertexMapping )\r
-       {\r
-               ID3DXMesh *result = NULL;\r
-               ID3DXBuffer *vertex = NULL;\r
-\r
-               array<int>^ adjacency = GetAdjacency();\r
-               DWORD *adjacencyIn = NULL;\r
-               pin_ptr<int> pinnedAdj;\r
-\r
-               if( adjacency != nullptr )\r
-               {\r
-                       pinnedAdj = &adjacency[0];\r
-                       adjacencyIn = reinterpret_cast<DWORD*>( pinnedAdj );\r
-               }\r
-\r
-               HRESULT hr = D3DXComputeTangentFrameEx( InternalPointer, textureInSemantic, textureInIndex,\r
-                       partialOutSemanticU, partialOutIndexU, partialOutSemanticV, partialOutIndexV, normalOutSemantic,\r
-                       normalOutIndex, static_cast<DWORD>( options ), adjacencyIn,\r
-                       partialEdgeThreshold, singularPointThreshold, normalEdgeThreshold, &result, &vertex );\r
-\r
-               if( RECORD_D3D9( hr ).IsFailure )\r
-               {\r
-                       vertexMapping = nullptr;\r
-                       return nullptr;\r
-               }\r
-\r
-               vertexMapping = Utilities::ReadRange<int>( vertex, result->GetNumVertices() );\r
-\r
-               if( (options & TangentOptions::GenerateInPlace) == TangentOptions::GenerateInPlace )\r
-                       return this;\r
-\r
-               return Mesh::FromPointer( result );\r
-       }\r
-\r
-       Mesh^ Mesh::ComputeTangentFrame( int textureInSemantic, int textureInIndex, int partialOutSemanticU, \r
-               int partialOutIndexU, int partialOutSemanticV, int partialOutIndexV, int normalOutSemantic,\r
-               int normalOutIndex, TangentOptions options, float partialEdgeThreshold,\r
-               float singularPointThreshold, float normalEdgeThreshold )\r
-       {\r
-               ID3DXMesh *result = NULL;\r
-\r
-               array<int>^ adjacency = GetAdjacency();\r
-               DWORD *adjacencyIn = NULL;\r
-               pin_ptr<int> pinnedAdj;\r
-\r
-               if( adjacency != nullptr )\r
-               {\r
-                       pinnedAdj = &adjacency[0];\r
-                       adjacencyIn = reinterpret_cast<DWORD*>( pinnedAdj );\r
-               }\r
-\r
-               HRESULT hr = D3DXComputeTangentFrameEx( InternalPointer, textureInSemantic, textureInIndex,\r
-                       partialOutSemanticU, partialOutIndexU, partialOutSemanticV, partialOutIndexV, normalOutSemantic,\r
-                       normalOutIndex, static_cast<DWORD>( options ), adjacencyIn,\r
-                       partialEdgeThreshold, singularPointThreshold, normalEdgeThreshold, &result, NULL );\r
-\r
-               if( RECORD_D3D9( hr ).IsFailure )\r
-                       return nullptr;\r
-\r
-               if( (options & TangentOptions::GenerateInPlace) == TangentOptions::GenerateInPlace )\r
-                       return this;\r
-\r
-               return Mesh::FromPointer( result );\r
-       }\r
-\r
-       Mesh^ Mesh::Concatenate( SlimDX::Direct3D9::Device^ device, array<Mesh^>^ meshes, MeshFlags options, array<Matrix>^ geometryTransforms,\r
-               array<Matrix>^ textureTransforms, array<VertexElement>^ vertexDeclaration )\r
-       {\r
-               ID3DXMesh *result = NULL;\r
-               D3DXMATRIX *geoXForms = NULL;\r
-               D3DXMATRIX *textureXForms = NULL;\r
-               D3DVERTEXELEMENT9 *decl = NULL;\r
-\r
-               pin_ptr<Matrix> pinnedGeo = nullptr;\r
-               pin_ptr<Matrix> pinnedTexture = nullptr;\r
-               pin_ptr<VertexElement> pinnedDecl = nullptr;\r
-\r
-               stack_array<ID3DXMesh*> input = stackalloc( ID3DXMesh*, meshes->Length );\r
-               for( int i = 0; i < meshes->Length; i++ )\r
-                       input[i] = meshes[i]->InternalPointer;\r
-\r
-               if( geometryTransforms != nullptr )\r
-               {\r
-                       pinnedGeo = &geometryTransforms[0];\r
-                       geoXForms = reinterpret_cast<D3DXMATRIX*>( pinnedGeo );\r
-               }\r
-\r
-               if( textureTransforms != nullptr )\r
-               {\r
-                       pinnedTexture = &textureTransforms[0];\r
-                       textureXForms = reinterpret_cast<D3DXMATRIX*>( pinnedTexture );\r
-               }\r
-\r
-               if( vertexDeclaration != nullptr )\r
-               {\r
-                       pinnedDecl = &vertexDeclaration[0];\r
-                       decl = reinterpret_cast<D3DVERTEXELEMENT9*>( pinnedDecl );\r
-               }\r
-\r
-               HRESULT hr = D3DXConcatenateMeshes( &input[0], meshes->Length, static_cast<DWORD>( options ), geoXForms,\r
-                       textureXForms, decl, device->InternalPointer, &result );\r
-\r
-               if( RECORD_D3D9( hr ).IsFailure )\r
-                       return nullptr;\r
-\r
-               return Mesh::FromPointer( result );\r
-       }\r
-\r
-       Mesh^ Mesh::Concatenate( SlimDX::Direct3D9::Device^ device, array<Mesh^>^ meshes, MeshFlags options, array<Matrix>^ geometryTransforms,\r
-               array<Matrix>^ textureTransforms )\r
-       {\r
-               ID3DXMesh *result = NULL;\r
-               D3DXMATRIX *geoXForms = NULL;\r
-               D3DXMATRIX *textureXForms = NULL;\r
-\r
-               pin_ptr<Matrix> pinnedGeo = nullptr;\r
-               pin_ptr<Matrix> pinnedTexture = nullptr;\r
-\r
-               stack_array<ID3DXMesh*> input = stackalloc( ID3DXMesh*, meshes->Length );\r
-               for( int i = 0; i < meshes->Length; i++ )\r
-                       input[i] = meshes[i]->InternalPointer;\r
-\r
-               if( geometryTransforms != nullptr )\r
-               {\r
-                       pinnedGeo = &geometryTransforms[0];\r
-                       geoXForms = reinterpret_cast<D3DXMATRIX*>( pinnedGeo );\r
-               }\r
-\r
-               if( textureTransforms != nullptr )\r
-               {\r
-                       pinnedTexture = &textureTransforms[0];\r
-                       textureXForms = reinterpret_cast<D3DXMATRIX*>( pinnedTexture );\r
-               }\r
-\r
-               HRESULT hr = D3DXConcatenateMeshes( &input[0], meshes->Length, static_cast<DWORD>( options ), geoXForms,\r
-                       textureXForms, NULL, device->InternalPointer, &result );\r
-\r
-               if( RECORD_D3D9( hr ).IsFailure )\r
-                       return nullptr;\r
-\r
-               return Mesh::FromPointer( result );\r
-       }\r
-\r
-       Mesh^ Mesh::Concatenate( SlimDX::Direct3D9::Device^ device, array<Mesh^>^ meshes, MeshFlags options )\r
-       {\r
-               ID3DXMesh *result = NULL;\r
-\r
-               stack_array<ID3DXMesh*> input = stackalloc( ID3DXMesh*, meshes->Length );\r
-               for( int i = 0; i < meshes->Length; i++ )\r
-                       input[i] = meshes[i]->InternalPointer;\r
-\r
-               HRESULT hr = D3DXConcatenateMeshes( &input[0], meshes->Length, static_cast<DWORD>( options ), NULL,\r
-                       NULL, NULL, device->InternalPointer, &result );\r
-\r
-               if( RECORD_D3D9( hr ).IsFailure )\r
-                       return nullptr;\r
-\r
-               return Mesh::FromPointer( result );\r
-       }\r
-\r
-       Result Mesh::ToXFile( Mesh^ mesh, String^ fileName, XFileFormat format, CharSet charSet )\r
-       {\r
-               pin_ptr<const wchar_t> pinnedName = PtrToStringChars( fileName );\r
-               \r
-               array<int>^ adjacency = mesh->GetAdjacency();\r
-               array<ExtendedMaterial>^ materials = mesh->GetMaterials();\r
-               array<EffectInstance>^ effects = mesh->GetEffects();\r
-\r
-               DWORD *adjacencyIn = NULL;\r
-               D3DXMATERIAL *materialPtr = NULL;\r
-               D3DXEFFECTINSTANCE *effectPtr = NULL;\r
-               stack_array<D3DXMATERIAL> nativeMaterials;\r
-               stack_array<D3DXEFFECTINSTANCE> nativeEffects;\r
-               pin_ptr<int> pinnedAdj;\r
-               int length = 0;\r
-\r
-               if( adjacency != nullptr )\r
-               {\r
-                       pinnedAdj = &adjacency[0];\r
-                       adjacencyIn = reinterpret_cast<DWORD*>( pinnedAdj );\r
-               }\r
-\r
-               if( materials != nullptr )\r
-               {\r
-                       length = materials->Length;\r
-                       nativeMaterials = stack_array<D3DXMATERIAL>( length );\r
-                       for( int i = 0; i < length; i++ )\r
-                               nativeMaterials[i] = ExtendedMaterial::ToUnmanaged( materials[i] );\r
-\r
-                       materialPtr = &nativeMaterials[0];\r
-               }\r
-\r
-               if( effects != nullptr )\r
-               {\r
-                       nativeEffects = stack_array<D3DXEFFECTINSTANCE>( effects->Length );\r
-                       for( int i = 0; i < effects->Length; i++ )\r
-                               nativeEffects[i] = EffectInstance::ToUnmanaged( effects[i] );\r
-\r
-                       effectPtr = &nativeEffects[0];\r
-               }\r
-\r
-               DWORD f = static_cast<DWORD>( format );\r
-               if( charSet == CharSet::Unicode )\r
-                       f |= D3DXF_FILESAVE_TOWFILE;\r
-               else\r
-                       f |= D3DXF_FILESAVE_TOFILE;\r
-\r
-               HRESULT hr = D3DXSaveMeshToX( reinterpret_cast<LPCWSTR>( pinnedName ), mesh->InternalPointer, \r
-                       adjacencyIn, materialPtr, effectPtr, length, f );\r
-\r
-               if( materials != nullptr )\r
-               {\r
-                       for( int i = 0; i < length; i++ )\r
-                               Utilities::FreeNativeString( nativeMaterials[i].pTextureFilename );\r
-               }\r
-\r
-               if( effects != nullptr )\r
-               {\r
-                       for( int i = 0; i < effects->Length; i++ )\r
-                       {\r
-                               for( UINT j = 0; j < nativeEffects[i].NumDefaults; j++ )\r
-                                       Utilities::FreeNativeString( nativeEffects[i].pDefaults[j].pParamName );\r
-\r
-                               delete[] nativeEffects[i].pDefaults;\r
-                       }\r
-               }\r
-\r
-               return RECORD_D3D9( hr );\r
-       }\r
-\r
-       Result Mesh::ToXFile( Mesh^ mesh, String^ fileName, XFileFormat format )\r
-       {\r
-               return ToXFile( mesh, fileName, format, CharSet::Auto );\r
-       }\r
-\r
-       Mesh^ Mesh::Simplify( Mesh^ mesh, array<AttributeWeights>^ attributeWeights,\r
-               array<float>^ vertexWeights, int minimumValue, MeshSimplification options )\r
-       {\r
-               ID3DXMesh *result = NULL;\r
-\r
-               DWORD *adjacencyIn = NULL;\r
-               pin_ptr<int> pinnedAdj;\r
-               array<int>^ adjacency = mesh->GetAdjacency();\r
-\r
-               if( adjacency != nullptr )\r
-               {\r
-                       pinnedAdj = &adjacency[0];\r
-                       adjacencyIn = reinterpret_cast<DWORD*>( pinnedAdj );\r
-               }\r
-\r
-               pin_ptr<float> pinnedVW = &vertexWeights[0];\r
-               pin_ptr<AttributeWeights> pinnedAW = &attributeWeights[0];\r
-\r
-               HRESULT hr = D3DXSimplifyMesh( mesh->InternalPointer, adjacencyIn,\r
-                       reinterpret_cast<const D3DXATTRIBUTEWEIGHTS*>( pinnedAW ), reinterpret_cast<const FLOAT*>( pinnedVW ),\r
-                       minimumValue, static_cast<DWORD>( options ), &result );\r
-\r
-               if( RECORD_D3D9( hr ).IsFailure )\r
-                       return nullptr;\r
-\r
-               return Mesh::FromPointer( result );\r
-       }\r
-\r
-       Mesh^ Mesh::Simplify( Mesh^ mesh, array<AttributeWeights>^ attributeWeights,\r
-               int minimumValue, MeshSimplification options )\r
-       {\r
-               ID3DXMesh *result = NULL;\r
-\r
-               DWORD *adjacencyIn = NULL;\r
-               pin_ptr<int> pinnedAdj;\r
-               array<int>^ adjacency = mesh->GetAdjacency();\r
-\r
-               if( adjacency != nullptr )\r
-               {\r
-                       pinnedAdj = &adjacency[0];\r
-                       adjacencyIn = reinterpret_cast<DWORD*>( pinnedAdj );\r
-               }\r
-\r
-               pin_ptr<AttributeWeights> pinnedAW = &attributeWeights[0];\r
-\r
-               HRESULT hr = D3DXSimplifyMesh( mesh->InternalPointer, adjacencyIn,\r
-                       reinterpret_cast<const D3DXATTRIBUTEWEIGHTS*>( pinnedAW ), NULL,\r
-                       minimumValue, static_cast<DWORD>( options ), &result );\r
-\r
-               if( RECORD_D3D9( hr ).IsFailure )\r
-                       return nullptr;\r
-\r
-               return Mesh::FromPointer( result );\r
-       }\r
-\r
-       Mesh^ Mesh::Simplify( Mesh^ mesh, int minimumValue, MeshSimplification options )\r
-       {\r
-               ID3DXMesh *result = NULL;\r
-\r
-               DWORD *adjacencyIn = NULL;\r
-               array<int>^ adjacency = mesh->GetAdjacency();\r
-               pin_ptr<int> pinnedAdj;\r
-\r
-               if( adjacency != nullptr )\r
-               {\r
-                       pinnedAdj = &adjacency[0];\r
-                       adjacencyIn = reinterpret_cast<DWORD*>( pinnedAdj );\r
-               }\r
-\r
-               HRESULT hr = D3DXSimplifyMesh( mesh->InternalPointer, adjacencyIn,\r
-                       NULL, NULL, minimumValue, static_cast<DWORD>( options ), &result );\r
-\r
-               if( RECORD_D3D9( hr ).IsFailure )\r
-                       return nullptr;\r
-\r
-               return Mesh::FromPointer( result );\r
-       }\r
-\r
-       Mesh^ Mesh::TessellateNPatches( Mesh^ mesh, float segmentCount, bool quadraticInterpolation )\r
-       {\r
-               ID3DXMesh *result = NULL;\r
-               ID3DXBuffer *adjacencyOut = NULL;\r
-\r
-               DWORD *adjacencyIn = NULL;\r
-               array<int>^ adjacency = mesh->GetAdjacency();\r
-               pin_ptr<int> pinnedAdj;\r
-\r
-               if( adjacency != nullptr )\r
-               {\r
-                       pinnedAdj = &adjacency[0];\r
-                       adjacencyIn = reinterpret_cast<DWORD*>( pinnedAdj );\r
-               }\r
-\r
-               HRESULT hr = D3DXTessellateNPatches( mesh->InternalPointer, adjacencyIn, segmentCount,\r
-                       quadraticInterpolation, &result, &adjacencyOut );\r
-\r
-               if( RECORD_D3D9( hr ).IsFailure )\r
-                       return nullptr;\r
-\r
-               Mesh^ newMesh = Mesh::FromPointer( result );\r
-               newMesh->SetAdjacency( Utilities::ReadRange<int>( adjacencyOut, result->GetNumFaces() * 3 ) );\r
-\r
-               return newMesh;\r
-       }\r
-\r
-       Result Mesh::TessellateRectanglePatch( SlimDX::Direct3D9::VertexBuffer^ vertexBuffer, array<float>^ segmentCounts,\r
-               array<VertexElement>^ vertexDeclaration, RectanglePatchInfo rectanglePatchInfo )\r
-       {\r
-               pin_ptr<float> pinnedSegments = &segmentCounts[0];\r
-               pin_ptr<VertexElement> pinnedDeclaration = &vertexDeclaration[0];\r
-\r
-               HRESULT hr = D3DXTessellateRectPatch( vertexBuffer->InternalPointer, reinterpret_cast<const FLOAT*>( pinnedSegments ),\r
-                       reinterpret_cast<const D3DVERTEXELEMENT9*>( pinnedDeclaration ), reinterpret_cast<const D3DRECTPATCH_INFO*>( &rectanglePatchInfo ),\r
-                       InternalPointer );\r
-\r
-               return RECORD_D3D9( hr );\r
-       }\r
-\r
-       Result Mesh::TessellateTrianglePatch( SlimDX::Direct3D9::VertexBuffer^ vertexBuffer, array<float>^ segmentCounts,\r
-               array<VertexElement>^ vertexDeclaration, TrianglePatchInfo trianglePatchInfo )\r
-       {\r
-               pin_ptr<float> pinnedSegments = &segmentCounts[0];\r
-               pin_ptr<VertexElement> pinnedDeclaration = &vertexDeclaration[0];\r
-\r
-               HRESULT hr = D3DXTessellateTriPatch( vertexBuffer->InternalPointer, reinterpret_cast<const FLOAT*>( pinnedSegments ),\r
-                       reinterpret_cast<const D3DVERTEXELEMENT9*>( pinnedDeclaration ), reinterpret_cast<const D3DTRIPATCH_INFO*>( &trianglePatchInfo ),\r
-                       InternalPointer );\r
-\r
-               return RECORD_D3D9( hr );\r
-       }\r
-\r
-       Result Mesh::WeldVertices( WeldFlags flags, WeldEpsilons epsilons, [Out] array<int>^% faceRemap, [Out] array<int>^% vertexRemap )\r
-       {\r
-               ID3DXBuffer *buffer = NULL;\r
-               DWORD *adjIn = NULL;\r
-               DWORD *adjOut = NULL;\r
-               stack_array<DWORD> adjacencyOut = stackalloc( DWORD, FaceCount * 3 );\r
-\r
-               array<int>^ adjacency = GetAdjacency();\r
-               pin_ptr<int> pinnedAdjIn;\r
-\r
-               faceRemap = gcnew array<int>( FaceCount );\r
-               pin_ptr<int> pinnedFR = &faceRemap[0];\r
-\r
-               if( adjacency != nullptr )\r
-               {\r
-                       pinnedAdjIn = &adjacency[0];\r
-                       adjIn = reinterpret_cast<DWORD*>( pinnedAdjIn );\r
-                       adjOut = &adjacencyOut[0];\r
-               }\r
-\r
-               HRESULT hr = D3DXWeldVertices( InternalPointer, static_cast<DWORD>( flags ), \r
-                       reinterpret_cast<const D3DXWELDEPSILONS*>( &epsilons ), adjIn, adjOut, \r
-                       reinterpret_cast<DWORD*>( pinnedFR ), &buffer );\r
-\r
-               if( RECORD_D3D9( hr ).IsFailure )\r
-               {\r
-                       faceRemap = nullptr;\r
-                       vertexRemap = nullptr;\r
-                       return Result::Last;\r
-               }\r
-\r
-               vertexRemap = Utilities::ReadRange<int>( buffer, VertexCount );\r
-\r
-               if( adjOut != NULL )\r
-                       SetAdjacency( &adjacencyOut[0] );\r
-\r
-               return Result::Last;\r
-       }\r
-\r
-       Result Mesh::WeldVertices( WeldFlags flags, [Out] array<int>^% faceRemap, [Out] array<int>^% vertexRemap )\r
-       {\r
-               ID3DXBuffer *buffer = NULL;\r
-               DWORD *adjIn = NULL;\r
-               DWORD *adjOut = NULL;\r
-               stack_array<DWORD> adjacencyOut = stackalloc( DWORD, FaceCount * 3 );\r
-\r
-               array<int>^ adjacency = GetAdjacency();\r
-               pin_ptr<int> pinnedAdjIn;\r
-\r
-               faceRemap = gcnew array<int>( FaceCount );\r
-               pin_ptr<int> pinnedFR = &faceRemap[0];\r
-\r
-               if( adjacency != nullptr )\r
-               {\r
-                       pinnedAdjIn = &adjacency[0];\r
-                       adjIn = reinterpret_cast<DWORD*>( pinnedAdjIn );\r
-                       adjOut = &adjacencyOut[0];\r
-               }\r
-\r
-               HRESULT hr = D3DXWeldVertices( InternalPointer, static_cast<DWORD>( flags ), NULL, adjIn, adjOut, \r
-                       reinterpret_cast<DWORD*>( pinnedFR ), &buffer );\r
-\r
-               if( RECORD_D3D9( hr ).IsFailure )\r
-               {\r
-                       faceRemap = nullptr;\r
-                       vertexRemap = nullptr;\r
-                       return Result::Last;\r
-               }\r
-\r
-               vertexRemap = Utilities::ReadRange<int>( buffer, VertexCount );\r
-\r
-               if( adjOut != NULL )\r
-                       SetAdjacency( &adjacencyOut[0] );\r
-\r
-               return Result::Last;\r
-       }\r
-\r
-       Result Mesh::WeldVertices( WeldFlags flags, WeldEpsilons epsilons )\r
-       {\r
-               DWORD *adjIn = NULL;\r
-               DWORD *adjOut = NULL;\r
-               stack_array<DWORD> adjacencyOut = stackalloc( DWORD, FaceCount * 3 );\r
-\r
-               array<int>^ adjacency = GetAdjacency();\r
-               pin_ptr<int> pinnedAdjIn;\r
-\r
-               if( adjacency != nullptr )\r
-               {\r
-                       pinnedAdjIn = &adjacency[0];\r
-                       adjIn = reinterpret_cast<DWORD*>( pinnedAdjIn );\r
-                       adjOut = &adjacencyOut[0];\r
-               }\r
-\r
-               HRESULT hr = D3DXWeldVertices( InternalPointer, static_cast<DWORD>( flags ), \r
-                       reinterpret_cast<const D3DXWELDEPSILONS*>( &epsilons ), adjIn, adjOut, NULL, NULL );\r
-\r
-               if( RECORD_D3D9( hr ).IsFailure )\r
-                       return Result::Last;\r
-\r
-               if( adjOut != NULL )\r
-                       SetAdjacency( &adjacencyOut[0] );\r
-\r
-               return Result::Last;\r
-       }\r
-\r
-       Result Mesh::WeldVertices( WeldFlags flags )\r
-       {\r
-               DWORD *adjIn = NULL;\r
-               DWORD *adjOut = NULL;\r
-               stack_array<DWORD> adjacencyOut = stackalloc( DWORD, FaceCount * 3 );\r
-\r
-               array<int>^ adjacency = GetAdjacency();\r
-               pin_ptr<int> pinnedAdjIn;\r
-\r
-               if( adjacency != nullptr )\r
-               {\r
-                       pinnedAdjIn = &adjacency[0];\r
-                       adjIn = reinterpret_cast<DWORD*>( pinnedAdjIn );\r
-                       adjOut = &adjacencyOut[0];\r
-               }\r
-\r
-               HRESULT hr = D3DXWeldVertices( InternalPointer, static_cast<DWORD>( flags ), NULL, adjIn, adjOut, NULL, NULL );\r
-\r
-               if( RECORD_D3D9( hr ).IsFailure )\r
-                       return Result::Last;\r
-\r
-               if( adjOut != NULL )\r
-                       SetAdjacency( &adjacencyOut[0] );\r
-\r
-               return Result::Last;\r
-       }\r
-}\r
-}\r