Intro :
Pour afficher vos entités / mesh dans la scène 3D, je vous présente une classe qui permettra de les initialiser rapidement.
Elle pourra construire facilement du contenu 3D à partir des méthodes suivantes :
|
1 2 3 4 5 6 7 8 |
// Construit et remplit le vertex buffer à partir d'un tableau de vertices bool BuildVB(std::vector<T>& vertices) // Construit et remplit l'index buffer à partir d'une tableau d'indices bool BuildIB(std::vector<T>& indices) // Construit un mesh à partir des tableaux de vertices et d'indices bool Build(std::vector<T>& vertices, std::vector<unsigned short>& indices) |
Prérequis :
– Savoir utiliser la classe SceneNode. Voir cet article.
– Savoir utiliser la classe Renderable. Voir cet article.
– Savoir un peu utiliser DirectX 10
– Comprendre la classe SceneNode
Explications :
Voici le fichier MeshSceneNode.h :
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 |
#ifndef MESH_SCENE_NODE_H #define MESH_SCENE_NODE_H class MeshSceneNode : public SceneNode, public Renderable { public: MeshSceneNode(SceneNode* pParent = nullptr, const D3DXVECTOR3& position = D3DXVECTOR3(0, 0, 0), const D3DXVECTOR3& rotation = D3DXVECTOR3(0, 0, 0), const D3DXVECTOR3& scale = D3DXVECTOR3(0, 0, 0)); virtual ~MeshSceneNode(); virtual bool Initialize() { return true; } template<class T> bool BuildVB(std::vector<T>& vertices) { unsigned int iVertexSize = sizeof(T); D3D10_BUFFER_DESC vertexBufferDesc; D3D10_SUBRESOURCE_DATA vertexData; m_iVerticesCount = vertices.size(); vertexBufferDesc.Usage = D3D10_USAGE_DYNAMIC; vertexBufferDesc.ByteWidth = iVertexSize * m_iVerticesCount; vertexBufferDesc.BindFlags = D3D10_BIND_VERTEX_BUFFER; vertexBufferDesc.CPUAccessFlags = D3D10_CPU_ACCESS_WRITE; vertexBufferDesc.MiscFlags = 0; vertexData.pSysMem = vertices.data(); // Créé le vertex buffer HRESULT hr = D3D10_RENDERER->GetDevice()->CreateBuffer(&vertexBufferDesc, &vertexData, &m_pVertexBuffer); if (FAILED(hr)) { ShowMessageBoxDXError(hr); return false; } return true; } template<class T> bool BuildIB(std::vector<T>& indices) { D3D10_BUFFER_DESC indexBufferDesc; D3D10_SUBRESOURCE_DATA indexData; HRESULT hr; m_iIndicesCount = indices.size(); indexBufferDesc.Usage = D3D10_USAGE_DEFAULT; indexBufferDesc.ByteWidth = sizeof(T) * m_iIndicesCount; indexBufferDesc.BindFlags = D3D10_BIND_INDEX_BUFFER; indexBufferDesc.CPUAccessFlags = 0; indexBufferDesc.MiscFlags = 0; indexData.pSysMem = indices.data(); // Créé l'index buffer hr = D3D10_RENDERER->GetDevice()->CreateBuffer(&indexBufferDesc, &indexData, &m_pIndexBuffer); if (FAILED(hr)) { ShowMessageBoxDXError(hr); return false; } return true; } template<class T> bool Build(std::vector<T>& vertices, std::vector<unsigned short>& indices) { unsigned int iVertexSize = sizeof(T); D3D10_BUFFER_DESC vertexBufferDesc; D3D10_BUFFER_DESC indexBufferDesc; D3D10_SUBRESOURCE_DATA vertexData; D3D10_SUBRESOURCE_DATA indexData; HRESULT hr; m_iVerticesCount = vertices.size(); m_iIndicesCount = indices.size(); vertexBufferDesc.Usage = D3D10_USAGE_DYNAMIC; vertexBufferDesc.ByteWidth = iVertexSize * m_iVerticesCount; vertexBufferDesc.BindFlags = D3D10_BIND_VERTEX_BUFFER; vertexBufferDesc.CPUAccessFlags = D3D10_CPU_ACCESS_WRITE; vertexBufferDesc.MiscFlags = 0; vertexData.pSysMem = vertices.data(); // Créé le vertex buffer hr = D3D10_RENDERER->GetDevice()->CreateBuffer(&vertexBufferDesc, &vertexData, &m_pVertexBuffer); if (FAILED(hr)) { ShowMessageBoxDXError(hr); return false; } indexBufferDesc.Usage = D3D10_USAGE_DEFAULT; indexBufferDesc.ByteWidth = sizeof(unsigned short) * m_iIndicesCount; indexBufferDesc.BindFlags = D3D10_BIND_INDEX_BUFFER; indexBufferDesc.CPUAccessFlags = 0; indexBufferDesc.MiscFlags = 0; indexData.pSysMem = indices.data(); // Créé l'index buffer hr = D3D10_RENDERER->GetDevice()->CreateBuffer(&indexBufferDesc, &indexData, &m_pIndexBuffer); if (FAILED(hr)) { ShowMessageBoxDXError(hr); return false; } return true; } template<class T> void UpdateVertices(const std::vector<T> vertices) { T* data = nullptr; m_pVertexBuffer->Map(D3D10_MAP_WRITE_DISCARD, 0, (void**)&data); memcpy(data, vertices.data(), sizeof(T) * vertices.size()); m_pVertexBuffer->Unmap(); } }; #endif |
Resumé :
Nous avons présentée une classe qui permettra d’afficher du contenu 3D dans vos scène d’entités (SceneNode).


