#ifndef CUBE_MESH_H
#define CUBE_MESH_H
namespace fw
{
template<class D3DVersion>
class Cube : public D3DMeshSceneNode<D3DVersion>
{
public:
typedef typename D3DMeshSceneNode<D3DVersion> D3DMeshSceneNode;
Cube() :
D3DMeshSceneNode("Cube")
{
D3DMeshSceneNode::SetVertexType(VertexLayoutType::PTN_VERTEX);
D3DMeshSceneNode::SetDrawMethod(D3DMeshSceneNode::DrawMethod::DRAW_INDEXED);
D3DMeshSceneNode::SetTopology(D3D_PRIMITIVE_TOPOLOGY::D3D_PRIMITIVE_TOPOLOGY_TRIANGLELIST);
D3DMeshSceneNode::SetIndexFormat(D3DMeshSceneNode::IndexFormat::FORMAT_32_BIT);
Initialize();
D3DMeshSceneNode::SetShaderTechnique( SHADER_MANAGER->GetShader("SimpleTexture") );
}
virtual ~Cube()
{
}
PTNVertex CreateVertex(
const D3DXVECTOR3& pos,
const D3DXVECTOR2& tex,
const D3DXVECTOR3& normal)
{
PTNVertex v;
v.position = pos;
v.texture = tex;
v.normal = normal;
return v;
}
virtual bool Initialize() override
{
if (D3DMeshSceneNode::GetMeshCaches()->MeshBufferExists("Cube"))
{
const MeshBuffers<D3DVersion::BufferType>* pMesh =
D3DMeshSceneNode::GetMeshCaches()->GetMeshBuffers("Cube");
D3DMeshSceneNode::SetMeshBuffers(pMesh);
}
else
{
CreateCubeMesh();
const MeshBuffers<D3DVersion::BufferType>* pMesh(this);
D3DMeshSceneNode::GetMeshCaches()->AddMeshBuffer("Cube", pMesh);
}
return true;
}
void CreateCubeMesh()
{
PTNVertex v[24];
v[0] = CreateVertex(D3DXVECTOR3(-1.0f, 1.0f, -1.0f), D3DXVECTOR2(0.0f, 0.0f), D3DXVECTOR3(0.0f, 1.0f, 0.0f));
v[1] = CreateVertex(D3DXVECTOR3(1.0f, 1.0f, -1.0f), D3DXVECTOR2(1.0f, 0.0f), D3DXVECTOR3(0.0f, 1.0f, 0.0f));
v[2] = CreateVertex(D3DXVECTOR3(1.0f, 1.0f, 1.0f), D3DXVECTOR2(1.0f, 1.0f), D3DXVECTOR3(0.0f, 1.0f, 0.0f));
v[3] = CreateVertex(D3DXVECTOR3(-1.0f, 1.0f, 1.0f), D3DXVECTOR2(0.0f, 1.0f), D3DXVECTOR3(0.0f, 1.0f, 0.0f));
v[4] = CreateVertex(D3DXVECTOR3(-1.0f, -1.0f, -1.0f), D3DXVECTOR2(0.0f, 0.0f), D3DXVECTOR3(0.0f, -1.0f, 0.0f));
v[5] = CreateVertex(D3DXVECTOR3(1.0f, -1.0f, -1.0f), D3DXVECTOR2(1.0f, 0.0f), D3DXVECTOR3(0.0f, -1.0f, 0.0f));
v[6] = CreateVertex(D3DXVECTOR3(1.0f, -1.0f, 1.0f), D3DXVECTOR2(1.0f, 1.0f), D3DXVECTOR3(0.0f, -1.0f, 0.0f));
v[7] = CreateVertex(D3DXVECTOR3(-1.0f, -1.0f, 1.0f), D3DXVECTOR2(0.0f, 1.0f), D3DXVECTOR3(0.0f, -1.0f, 0.0f));
v[8] = CreateVertex(D3DXVECTOR3(-1.0f, -1.0f, 1.0f), D3DXVECTOR2(0.0f, 0.0f), D3DXVECTOR3(-1.0f, 0.0f, 0.0f));
v[9] = CreateVertex(D3DXVECTOR3(-1.0f, -1.0f, -1.0f), D3DXVECTOR2(1.0f, 0.0f), D3DXVECTOR3(-1.0f, 0.0f, 0.0f));
v[10] = CreateVertex(D3DXVECTOR3(-1.0f, 1.0f, -1.0f), D3DXVECTOR2(1.0f, 1.0f), D3DXVECTOR3(-1.0f, 0.0f, 0.0f));
v[11] = CreateVertex(D3DXVECTOR3(-1.0f, 1.0f, 1.0f), D3DXVECTOR2(0.0f, 1.0f), D3DXVECTOR3(-1.0f, 0.0f, 0.0f));
v[12] = CreateVertex(D3DXVECTOR3(1.0f, -1.0f, 1.0f), D3DXVECTOR2(0.0f, 0.0f), D3DXVECTOR3(1.0f, 0.0f, 0.0f));
v[13] = CreateVertex(D3DXVECTOR3(1.0f, -1.0f, -1.0f), D3DXVECTOR2(1.0f, 0.0f), D3DXVECTOR3(1.0f, 0.0f, 0.0f));
v[14] = CreateVertex(D3DXVECTOR3(1.0f, 1.0f, -1.0f), D3DXVECTOR2(1.0f, 1.0f), D3DXVECTOR3(1.0f, 0.0f, 0.0f));
v[15] = CreateVertex(D3DXVECTOR3(1.0f, 1.0f, 1.0f), D3DXVECTOR2(0.0f, 1.0f), D3DXVECTOR3(1.0f, 0.0f, 0.0f));
v[16] = CreateVertex(D3DXVECTOR3(-1.0f, -1.0f, -1.0f), D3DXVECTOR2(0.0f, 0.0f), D3DXVECTOR3(0.0f, 0.0f, -1.0f));
v[17] = CreateVertex(D3DXVECTOR3(1.0f, -1.0f, -1.0f), D3DXVECTOR2(1.0f, 0.0f), D3DXVECTOR3(0.0f, 0.0f, -1.0f));
v[18] = CreateVertex(D3DXVECTOR3(1.0f, 1.0f, -1.0f), D3DXVECTOR2(1.0f, 1.0f), D3DXVECTOR3(0.0f, 0.0f, -1.0f));
v[19] = CreateVertex(D3DXVECTOR3(-1.0f, 1.0f, -1.0f), D3DXVECTOR2(0.0f, 1.0f), D3DXVECTOR3(0.0f, 0.0f, -1.0f));
v[20] = CreateVertex(D3DXVECTOR3(-1.0f, -1.0f, 1.0f), D3DXVECTOR2(0.0f, 0.0f), D3DXVECTOR3(0.0f, 0.0f, 1.0f));
v[21] = CreateVertex(D3DXVECTOR3(1.0f, -1.0f, 1.0f), D3DXVECTOR2(1.0f, 0.0f), D3DXVECTOR3(0.0f, 0.0f, 1.0f));
v[22] = CreateVertex(D3DXVECTOR3(1.0f, 1.0f, 1.0f), D3DXVECTOR2(1.0f, 1.0f), D3DXVECTOR3(0.0f, 0.0f, 1.0f));
v[23] = CreateVertex(D3DXVECTOR3(-1.0f, 1.0f, 1.0f), D3DXVECTOR2(0.0f, 1.0f), D3DXVECTOR3(0.0f, 0.0f, 1.0f));
uint32 i[36] = { 3,1,0,
2,1,3,
6,4,5,
7,4,6,
11,9,8,
10,9,11,
14,12,13,
15,12,14,
19,17,16,
18,17,19,
22,20,21,
23,20,22 };
// On déclare les tableaux
std::vector<PTNVertex> vertices;
std::vector<uint32> indices;
// On reset les emplacements
vertices.resize(24);
indices.resize(36);
// On affecte les valeurs
std::copy(v, v + 24, vertices.begin());
std::copy(i, i + 36, indices.begin());
D3DMeshSceneNode::VBuildMesh(vertices, indices);
}
void SetTexture(const std::string& sTextureFileName)
{
ShaderSceneNodeInfo param;
param.SetTexture(sTextureFileName);
D3DMeshSceneNode::PushCustomShaderParameter(param);
}
};
}
#endif