161 lines
4.0 KiB
C++
161 lines
4.0 KiB
C++
#pragma once
|
|
|
|
namespace BluntDirectX { namespace Direct3D
|
|
{
|
|
public ref class IndexBuffer
|
|
{
|
|
internal:
|
|
IDirect3DIndexBuffer9* buffer;
|
|
IDirect3DDevice9* device;
|
|
int size;
|
|
|
|
public:
|
|
IndexBuffer( GraphicsDevice^ device, int size )
|
|
: size( size ), device( device->device )
|
|
{
|
|
HRESULT hr;
|
|
IDirect3DIndexBuffer9* b;
|
|
|
|
if (FAILED( hr = this->device->CreateIndexBuffer( sizeof( unsigned short ) * size,
|
|
device->HasHardwareVP ? 0 : D3DUSAGE_SOFTWAREPROCESSING, D3DFMT_INDEX16, D3DPOOL_SYSTEMMEM, &b, NULL )))
|
|
ThrowHelper::Hr(hr);
|
|
|
|
buffer = b;
|
|
}
|
|
|
|
void SetData( array<unsigned short>^ data )
|
|
{
|
|
pin_ptr<unsigned short> pdata = &data[0];
|
|
void * ib;
|
|
|
|
buffer->Lock( 0, sizeof(unsigned short) * size, &ib, D3DLOCK_DISCARD );
|
|
memcpy( ib, pdata, sizeof(unsigned short) * data.Length );
|
|
buffer->Unlock();
|
|
}
|
|
|
|
void Bind()
|
|
{
|
|
device->SetIndices( buffer );
|
|
}
|
|
|
|
~IndexBuffer()
|
|
{
|
|
safe_release( buffer );
|
|
}
|
|
|
|
property int Size { int get() { return size; } }
|
|
};
|
|
|
|
generic<typename T> where T : value class
|
|
public ref class FvfVertexBuffer
|
|
{
|
|
internal:
|
|
IDirect3DVertexBuffer9* buffer;
|
|
IDirect3DDevice9* device;
|
|
int numVertices;
|
|
unsigned int fvf;
|
|
|
|
public:
|
|
FvfVertexBuffer( GraphicsDevice^ device, int numVertices, VertexFormat fvf )
|
|
: numVertices( numVertices ), device(device->device), fvf((unsigned int)fvf)
|
|
{
|
|
HRESULT hr;
|
|
IDirect3DVertexBuffer9* b;
|
|
|
|
if (FAILED( hr = device->device->CreateVertexBuffer( sizeof(T) * numVertices,
|
|
device->HasHardwareVP ? 0 : D3DUSAGE_SOFTWAREPROCESSING, this->fvf, D3DPOOL_SYSTEMMEM, &b, NULL )))
|
|
ThrowHelper::Hr(hr);
|
|
|
|
buffer = b;
|
|
}
|
|
|
|
void SetData( array<T>^ data )
|
|
{
|
|
pin_ptr<T> pdata = &data[0];
|
|
void* vb;
|
|
|
|
buffer->Lock( 0, sizeof(T) * numVertices, &vb, D3DLOCK_DISCARD );
|
|
memcpy( vb, pdata, sizeof(T) * data->Length );
|
|
buffer->Unlock();
|
|
}
|
|
|
|
void Bind( int stream )
|
|
{
|
|
device->SetStreamSource( stream, buffer, 0, sizeof(T) );
|
|
device->SetFVF( fvf );
|
|
}
|
|
|
|
~FvfVertexBuffer()
|
|
{
|
|
safe_release( buffer );
|
|
}
|
|
|
|
property int Size { int get() { return numVertices; } }
|
|
property VertexFormat FVF { VertexFormat get() { return (VertexFormat)fvf; }}
|
|
};
|
|
|
|
generic<typename T> where T : value class
|
|
public ref class VertexBuffer
|
|
{
|
|
internal:
|
|
IDirect3DVertexBuffer9* buffer;
|
|
IDirect3DVertexDeclaration9* decl;
|
|
IDirect3DDevice9* device;
|
|
int numVertices;
|
|
|
|
public:
|
|
VertexBuffer( GraphicsDevice^ device, int numVertices )
|
|
: numVertices( numVertices ), device(device->device)
|
|
{
|
|
HRESULT hr;
|
|
IDirect3DVertexBuffer9* b;
|
|
IDirect3DVertexDeclaration9* d;
|
|
|
|
D3DVERTEXELEMENT9 elements[] =
|
|
{
|
|
{0,0, D3DDECLTYPE_FLOAT3, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_POSITION, 0},
|
|
{0,12,D3DDECLTYPE_FLOAT4, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_COLOR,0},
|
|
{0,28,D3DDECLTYPE_FLOAT4, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_COLOR,1},
|
|
{0,44,D3DDECLTYPE_FLOAT1, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_PSIZE,0},
|
|
|
|
D3DDECL_END()
|
|
};
|
|
|
|
if (FAILED( hr = device->device->CreateVertexDeclaration( elements, &d ) ))
|
|
ThrowHelper::Hr(hr);
|
|
|
|
decl = d;
|
|
|
|
if (FAILED( hr = device->device->CreateVertexBuffer( sizeof(T) * numVertices,
|
|
D3DUSAGE_DYNAMIC | D3DUSAGE_POINTS |
|
|
(device->HasHardwareVP ? 0 : D3DUSAGE_SOFTWAREPROCESSING), 0, D3DPOOL_DEFAULT, &b, NULL )))
|
|
ThrowHelper::Hr(hr);
|
|
|
|
buffer = b;
|
|
}
|
|
|
|
void SetData( array<T>^ data )
|
|
{
|
|
pin_ptr<T> pdata = &data[0];
|
|
void* vb;
|
|
|
|
buffer->Lock( 0, sizeof(T) * numVertices, &vb, D3DLOCK_DISCARD );
|
|
memcpy( vb, pdata, sizeof(T) * data->Length );
|
|
buffer->Unlock();
|
|
}
|
|
|
|
void Bind( int stream )
|
|
{
|
|
device->SetStreamSource( stream, buffer, 0, sizeof(T) );
|
|
device->SetVertexDeclaration( decl );
|
|
}
|
|
|
|
~VertexBuffer()
|
|
{
|
|
safe_release( decl );
|
|
safe_release( buffer );
|
|
}
|
|
|
|
property int Size { int get() { return numVertices; } }
|
|
};
|
|
}} |