Schifty
Schifty

Reputation: 635

How to move D3DVERTEXELEMENT9 declaration to header

I am failing to move the following declaration to my C++ Header:

D3DVERTEXELEMENT9 vertexFormat[] =
{
{0,  0, D3DDECLTYPE_FLOAT3, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_POSITION,0},
{0, 12, D3DDECLTYPE_FLOAT2, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_TEXCOORD,0},
{0, 20, D3DDECLTYPE_FLOAT3, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_NORMAL,0},
{0, 32, D3DDECLTYPE_FLOAT3, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_TANGENT,  0},
{0, 44, D3DDECLTYPE_FLOAT3, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_BINORMAL, 0}, 
{1, 0,  D3DDECLTYPE_FLOAT4, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_TEXCOORD, 1},
{1, 16, D3DDECLTYPE_FLOAT4, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_TEXCOORD, 2},
{1, 32, D3DDECLTYPE_FLOAT4, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_TEXCOORD, 3},
{1, 48, D3DDECLTYPE_FLOAT4, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_TEXCOORD, 4},
 D3DDECL_END()
}; 

What is the problem there? How can I resolve this? Google shows me one interesting result (http://www.gamedev.net/topic/551682-about-d3dvertexelement9/), but somehow I still fail to compile it :(

To be clear - I want to use vertexFormat as a member of my class.

Upvotes: 1

Views: 681

Answers (2)

DirkMausF
DirkMausF

Reputation: 715

Could it be, that you simply forgot the "static" key word before your declaration?

static D3DVERTEXELEMENT9 vertexFormat[] =
{
{0,  0, .......

Or in a class:

D3DWhatever.h

class D3DWhatever
{
    static D3DVERTEXELEMENT9 vertexFormat[];

};

D3DWhatever.cpp

D3DWhatever::D3DVERTEXELEMENT9 vertexFormat[] =
{
{0,  0, D3DDECLTYPE_FLOAT3, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_POSITION,0},
{0, 12, D3DDECLTYPE_FLOAT2, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_TEXCOORD,0},
{0, 20, D3DDECLTYPE_FLOAT3, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_NORMAL,0},
{0, 32, D3DDECLTYPE_FLOAT3, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_TANGENT,  0},
{0, 44, D3DDECLTYPE_FLOAT3, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_BINORMAL, 0}, 
{1, 0,  D3DDECLTYPE_FLOAT4, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_TEXCOORD, 1},
{1, 16, D3DDECLTYPE_FLOAT4, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_TEXCOORD, 2},
{1, 32, D3DDECLTYPE_FLOAT4, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_TEXCOORD, 3},
{1, 48, D3DDECLTYPE_FLOAT4, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_TEXCOORD, 4},
 D3DDECL_END()
};

Upvotes: 0

alwynd
alwynd

Reputation: 311

An approach I used which could be useful is to provide the implementation in one cpp file: (*My example uses DirectX10, but for this answer the dx version is irrelevant)

(.h) Header:

int getLayoutPosTexNormCInstancedSize();
D3D10_INPUT_ELEMENT_DESC* getLayoutPosTexNormCInstanced();

(.cpp) Implentation:

D3D10_INPUT_ELEMENT_DESC layoutPosTexNormCInstanced[] = 
{
{"POSITION",     0, DXGI_FORMAT_R32G32B32_FLOAT,    0,  0, D3D10_INPUT_PER_VERTEX_DATA, 0},
{"TEXCOORD",     0, DXGI_FORMAT_R32G32_FLOAT,       0, 12, D3D10_INPUT_PER_VERTEX_DATA, 0},
{"NORMAL",       0, DXGI_FORMAT_R32G32B32_FLOAT,    0, 20, D3D10_INPUT_PER_VERTEX_DATA, 0},
{"TANGENT",      0, DXGI_FORMAT_R32G32B32_FLOAT,    0, 32, D3D10_INPUT_PER_VERTEX_DATA, 0},
{"BINORMAL",     0, DXGI_FORMAT_R32G32B32_FLOAT,    0, 44, D3D10_INPUT_PER_VERTEX_DATA, 0},
{"BLENDINDICES", 0, DXGI_FORMAT_R8G8B8A8_SINT,      0, 56, D3D10_INPUT_PER_VERTEX_DATA, 0 }, //4
{"mTransform",   0, DXGI_FORMAT_R32G32B32A32_FLOAT, 1,  0, D3D10_INPUT_PER_INSTANCE_DATA, 1 },
{"mTransform",   1, DXGI_FORMAT_R32G32B32A32_FLOAT, 1, 16, D3D10_INPUT_PER_INSTANCE_DATA, 1 },
{"mTransform",   2, DXGI_FORMAT_R32G32B32A32_FLOAT, 1, 32, D3D10_INPUT_PER_INSTANCE_DATA, 1 },
{"mTransform",   3, DXGI_FORMAT_R32G32B32A32_FLOAT, 1, 48, D3D10_INPUT_PER_INSTANCE_DATA, 1 },
};


D3D10_INPUT_ELEMENT_DESC* getLayoutPosTexNormCInstanced() { return layoutPosTexNormCInstanced; }
int getLayoutPosTexNormCInstancedSize() { return sizeof(layoutPosTexNormCInstanced) / sizeof(D3D10_INPUT_ELEMENT_DESC); }

Then at least where you reference or require the input layout when creating your vertex buffer(s), you can simply call the getLayoutPosTexNormCInstanced function, and these can also easily be moved to a class/struct, or even be provided by a reusable module, like a DLL.

Upvotes: 1

Related Questions