{"id":3176,"date":"2015-07-13T07:39:36","date_gmt":"2015-07-13T07:39:36","guid":{"rendered":"http:\/\/anthroponaute.fr\/blog-informatique\/?p=3176"},"modified":"2015-11-17T15:43:53","modified_gmt":"2015-11-17T15:43:53","slug":"une-classe-meshscenenode-pour-representer-un-mesh-dans-la-scene","status":"publish","type":"post","link":"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/?p=3176","title":{"rendered":"Une classe MeshSceneNode pour repr\u00e9senter des meshes dans votre sc\u00e8ne"},"content":{"rendered":"<p><a href=\"https:\/\/anthropoya.cluster014.ovh.net\/blog-informatique\/wp-content\/uploads\/2015\/07\/mesh-node.png\"><img decoding=\"async\" loading=\"lazy\" class=\"alignnone  wp-image-3177\" src=\"https:\/\/anthropoya.cluster014.ovh.net\/blog-informatique\/wp-content\/uploads\/2015\/07\/mesh-node.png\" alt=\"mesh node\" width=\"490\" height=\"329\" srcset=\"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/wp-content\/uploads\/2015\/07\/mesh-node.png 927w, https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/wp-content\/uploads\/2015\/07\/mesh-node-300x202.png 300w, https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/wp-content\/uploads\/2015\/07\/mesh-node-624x419.png 624w\" sizes=\"(max-width: 490px) 100vw, 490px\" \/><\/a><\/p>\n<p><strong>Intro :<\/strong><\/p>\n<p>Pour <strong>afficher <\/strong>vos entit\u00e9s \/ mesh dans la sc\u00e8ne 3D, je vous pr\u00e9sente une classe qui permettra de les initialiser rapidement.<\/p>\n<p>Elle pourra construire facilement du contenu 3D \u00e0 partir des m\u00e9thodes suivantes :<\/p>\n<pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\r\n\/\/ Construit et remplit le vertex buffer \u00e0 partir d'un tableau de vertices\r\nbool BuildVB(std::vector&lt;T&gt;&amp; vertices)\r\n\r\n\/\/ Construit et remplit l'index buffer \u00e0 partir d'une tableau d'indices\r\nbool BuildIB(std::vector&lt;T&gt;&amp; indices)\r\n\r\n\/\/ Construit un mesh \u00e0 partir des tableaux de vertices et d'indices\r\nbool Build(std::vector&lt;T&gt;&amp; vertices, std::vector&lt;unsigned short&gt;&amp; indices)\r\n<\/pre>\n<p>&nbsp;<\/p>\n<p><strong>Pr\u00e9requis :<\/strong><\/p>\n<p>&#8211; Savoir utiliser la classe SceneNode. Voir cet article.<\/p>\n<p>&#8211; Savoir utiliser la classe Renderable. Voir cet article.<\/p>\n<p>&#8211; Savoir un peu utiliser DirectX 10<\/p>\n<p>&#8211; Comprendre la classe SceneNode<\/p>\n<p>&nbsp;<\/p>\n<p><strong>Explications :<\/strong><\/p>\n<p>Voici le fichier MeshSceneNode.h :<\/p>\n<pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\r\n#ifndef MESH_SCENE_NODE_H\r\n#define MESH_SCENE_NODE_H\r\n\r\nclass MeshSceneNode : public SceneNode, public Renderable\r\n{\r\npublic:\r\n\u00a0\u00a0 \u00a0MeshSceneNode(SceneNode* pParent = nullptr,\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0const D3DXVECTOR3&amp; position = D3DXVECTOR3(0, 0, 0),\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0const D3DXVECTOR3&amp; rotation = D3DXVECTOR3(0, 0, 0),\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0const D3DXVECTOR3&amp; scale = D3DXVECTOR3(0, 0, 0));\r\n\r\n\u00a0\u00a0 \u00a0virtual ~MeshSceneNode();\r\n\r\n\u00a0\u00a0 \u00a0virtual bool Initialize() { return true; }\r\n\r\n\u00a0\u00a0 \u00a0template&lt;class T&gt;\r\n\u00a0\u00a0 \u00a0bool BuildVB(std::vector&lt;T&gt;&amp; vertices)\r\n\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0unsigned int iVertexSize = sizeof(T);\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0D3D10_BUFFER_DESC vertexBufferDesc;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0D3D10_SUBRESOURCE_DATA vertexData;\r\n\u00a0\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0m_iVerticesCount = vertices.size();\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0vertexBufferDesc.Usage = D3D10_USAGE_DYNAMIC;\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0vertexBufferDesc.ByteWidth = iVertexSize * m_iVerticesCount;\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0vertexBufferDesc.BindFlags = D3D10_BIND_VERTEX_BUFFER;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0vertexBufferDesc.CPUAccessFlags = D3D10_CPU_ACCESS_WRITE;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0vertexBufferDesc.MiscFlags = 0;\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0vertexData.pSysMem = vertices.data();\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\/\/ Cr\u00e9\u00e9 le vertex buffer\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0HRESULT hr = D3D10_RENDERER-&gt;GetDevice()-&gt;CreateBuffer(&amp;vertexBufferDesc, &amp;vertexData, &amp;m_pVertexBuffer);\r\n\u00a0\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0if (FAILED(hr))\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0ShowMessageBoxDXError(hr);\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0return false;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0}\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0return true;\r\n\u00a0\u00a0 \u00a0}\r\n\r\n\u00a0\u00a0 \u00a0template&lt;class T&gt;\r\n\u00a0\u00a0 \u00a0bool BuildIB(std::vector&lt;T&gt;&amp; indices)\r\n\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0D3D10_BUFFER_DESC indexBufferDesc;\r\n\u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 D3D10_SUBRESOURCE_DATA indexData;\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0HRESULT hr;\r\n\u00a0\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0m_iIndicesCount = indices.size();\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0indexBufferDesc.Usage = D3D10_USAGE_DEFAULT;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0indexBufferDesc.ByteWidth = sizeof(T) * m_iIndicesCount;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0indexBufferDesc.BindFlags = D3D10_BIND_INDEX_BUFFER;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0indexBufferDesc.CPUAccessFlags = 0;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0indexBufferDesc.MiscFlags = 0;\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0indexData.pSysMem = indices.data();\r\n\u00a0\u00a0 \u00a0\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\/\/ Cr\u00e9\u00e9 l'index buffer\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0hr = D3D10_RENDERER-&gt;GetDevice()-&gt;CreateBuffer(&amp;indexBufferDesc, &amp;indexData, &amp;m_pIndexBuffer);\r\n\u00a0\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0if (FAILED(hr))\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0ShowMessageBoxDXError(hr);\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0return false;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0}\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0return true;\r\n\u00a0\u00a0 \u00a0}\r\n\r\n\u00a0\u00a0 \u00a0template&lt;class T&gt;\r\n\u00a0\u00a0 \u00a0bool Build(std::vector&lt;T&gt;&amp; vertices, std::vector&lt;unsigned short&gt;&amp; indices)\r\n\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0unsigned int iVertexSize = sizeof(T);\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0D3D10_BUFFER_DESC vertexBufferDesc;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0D3D10_BUFFER_DESC indexBufferDesc;\r\n\u00a0\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0D3D10_SUBRESOURCE_DATA vertexData;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0D3D10_SUBRESOURCE_DATA indexData;\r\n\u00a0\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0HRESULT hr;\r\n\u00a0\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0m_iVerticesCount = vertices.size();\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0m_iIndicesCount = indices.size();\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0vertexBufferDesc.Usage = D3D10_USAGE_DYNAMIC;\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0vertexBufferDesc.ByteWidth = iVertexSize * m_iVerticesCount;\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0vertexBufferDesc.BindFlags = D3D10_BIND_VERTEX_BUFFER;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0vertexBufferDesc.CPUAccessFlags = D3D10_CPU_ACCESS_WRITE;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0vertexBufferDesc.MiscFlags = 0;\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0vertexData.pSysMem = vertices.data();\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\/\/ Cr\u00e9\u00e9 le vertex buffer\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0hr = D3D10_RENDERER-&gt;GetDevice()-&gt;CreateBuffer(&amp;vertexBufferDesc, &amp;vertexData, &amp;m_pVertexBuffer);\r\n\u00a0\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0if (FAILED(hr))\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0ShowMessageBoxDXError(hr);\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0return false;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0}\r\n\u00a0\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0indexBufferDesc.Usage = D3D10_USAGE_DEFAULT;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0indexBufferDesc.ByteWidth = sizeof(unsigned short) * m_iIndicesCount;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0indexBufferDesc.BindFlags = D3D10_BIND_INDEX_BUFFER;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0indexBufferDesc.CPUAccessFlags = 0;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0indexBufferDesc.MiscFlags = 0;\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0indexData.pSysMem = indices.data();\r\n\u00a0\u00a0 \u00a0\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\/\/ Cr\u00e9\u00e9 l'index buffer\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0hr = D3D10_RENDERER-&gt;GetDevice()-&gt;CreateBuffer(&amp;indexBufferDesc, &amp;indexData, &amp;m_pIndexBuffer);\r\n\u00a0\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0if (FAILED(hr))\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0ShowMessageBoxDXError(hr);\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0return false;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0}\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0return true;\r\n\u00a0\u00a0 \u00a0}\r\n\r\n\u00a0\u00a0 \u00a0template&lt;class T&gt;\r\n\u00a0\u00a0 \u00a0void UpdateVertices(const std::vector&lt;T&gt; vertices)\r\n\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0T* data = nullptr;\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0m_pVertexBuffer-&gt;Map(D3D10_MAP_WRITE_DISCARD, 0, (void**)&amp;data);\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0memcpy(data, vertices.data(), sizeof(T) * vertices.size());\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0m_pVertexBuffer-&gt;Unmap();\r\n\u00a0\u00a0 \u00a0}\r\n};\r\n\r\n#endif\r\n<\/pre>\n<p>&nbsp;<\/p>\n<p><strong>Resum\u00e9 :<\/strong><\/p>\n<p>Nous avons pr\u00e9sent\u00e9e une classe qui permettra d&rsquo;afficher du contenu 3D dans vos sc\u00e8ne d&rsquo;entit\u00e9s (SceneNode).<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Intro : Pour afficher vos entit\u00e9s \/ mesh dans la sc\u00e8ne 3D, je vous pr\u00e9sente une classe qui permettra de les initialiser rapidement. Elle pourra construire facilement du contenu 3D \u00e0 partir des m\u00e9thodes suivantes : &nbsp; Pr\u00e9requis : &#8211; Savoir utiliser la classe SceneNode. Voir cet article. &#8211; Savoir utiliser la classe Renderable. Voir [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[4],"tags":[],"_links":{"self":[{"href":"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/index.php?rest_route=\/wp\/v2\/posts\/3176"}],"collection":[{"href":"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=3176"}],"version-history":[{"count":13,"href":"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/index.php?rest_route=\/wp\/v2\/posts\/3176\/revisions"}],"predecessor-version":[{"id":3179,"href":"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/index.php?rest_route=\/wp\/v2\/posts\/3176\/revisions\/3179"}],"wp:attachment":[{"href":"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=3176"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=3176"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=3176"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}