{"id":3225,"date":"2015-07-13T17:21:12","date_gmt":"2015-07-13T17:21:12","guid":{"rendered":"http:\/\/anthroponaute.fr\/blog-informatique\/?p=3225"},"modified":"2015-10-28T18:41:21","modified_gmt":"2015-10-28T18:41:21","slug":"une-classe-pour-afficher-des-lignes-dun-certaine-couleur","status":"publish","type":"post","link":"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/?p=3225","title":{"rendered":"Une classe pour afficher des lignes en 3D avec une certaine couleur"},"content":{"rendered":"<p><a href=\"https:\/\/anthropoya.cluster014.ovh.net\/blog-informatique\/wp-content\/uploads\/2015\/07\/3D_lines.png\"><img decoding=\"async\" loading=\"lazy\" class=\"alignnone  wp-image-3307\" src=\"https:\/\/anthropoya.cluster014.ovh.net\/blog-informatique\/wp-content\/uploads\/2015\/07\/3D_lines.png\" alt=\"3D_lines\" width=\"419\" height=\"327\" srcset=\"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/wp-content\/uploads\/2015\/07\/3D_lines.png 815w, https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/wp-content\/uploads\/2015\/07\/3D_lines-300x234.png 300w, https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/wp-content\/uploads\/2015\/07\/3D_lines-624x488.png 624w\" sizes=\"(max-width: 419px) 100vw, 419px\" \/><\/a><\/p>\n<p><strong>Intro :<\/strong><\/p>\n<p>Il peut \u00eatre utile d&rsquo;afficher des lignes dans la surface de rendu ; par exemple pour repr\u00e9senter des normales, des trajectoires, un rep\u00e8re, etc&#8230;<\/p>\n<p><strong>Pr\u00e9requis :<\/strong><\/p>\n<p>&#8211; Savoir lire du C++<\/p>\n<p>&#8211; Savoir utiliser la classe <em>MeshSceneNode<\/em><\/p>\n<p>&#8211; Savoir utiliser la classe<em> ShaderTechnique <\/em>et les d\u00e9clarations de vertices.<\/p>\n<p><strong>Explications :<\/strong><\/p>\n<p>Voici le fichier Vertex3DLine.h :<\/p>\n<pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\r\n#ifndef MESH_3D_LINE_H\r\n#define MESH_3D_LINE_H\r\n\r\nclass Vertex3DLine : public MeshSceneNode\r\n{\r\npublic:\r\n\u00a0\u00a0 \u00a0Vertex3DLine(unsigned int bufferBytesSize);\r\n\u00a0\u00a0 \u00a0virtual ~Vertex3DLine();\r\n\r\n\u00a0\u00a0 \u00a0bool Initialize();\r\n\r\n\u00a0\u00a0 \u00a0void AddLine(D3DXVECTOR3 startPoint, D3DXVECTOR3 endPoint, D3DXCOLOR color);\r\n\r\nprivate:\r\n\u00a0\u00a0 \u00a0void ResizeVertexBuffer(unsigned int iNewBytesSize);\r\n\r\nprivate:\r\n\u00a0\u00a0 \u00a0std::vector&lt;PCVertex&gt; m_vertices;\r\n\r\n\u00a0\u00a0 \u00a0unsigned int m_bufferBytesSize;\r\n};\r\n\r\n#endif\r\n<\/pre>\n<p>&nbsp;<\/p>\n<p>Voici le fichier Vertex3DLine.cpp :<\/p>\n<pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\r\n#include &quot;Vertex3DLine.h&quot;\r\n\r\nVertex3DLine::Vertex3DLine(unsigned int bufferBytesSize) :\r\nm_bufferBytesSize(bufferBytesSize)\r\n{\r\n\u00a0\u00a0 \u00a0SetVertexType(VertexLayoutType::PC_VERTEX);\r\n\u00a0\u00a0 \u00a0SetDrawMethod(DrawMethod::DRAW_NORMAL);\r\n\u00a0\u00a0 \u00a0SetTopology(D3D10_PRIMITIVE_TOPOLOGY_LINELIST);\r\n\r\n\u00a0\u00a0 \u00a0SetShaderTechnique( SHADER_MANAGER-&gt;GetShader(&quot;Vertex3DLine&quot;) );\r\n}\r\n\r\nVertex3DLine::~Vertex3DLine()\r\n{\r\n\u00a0\u00a0 \u00a0m_vertices.clear();\r\n}\r\n\r\nbool Vertex3DLine::Initialize()\r\n{\r\n\u00a0\u00a0 \u00a0HRESULT hr;\r\n\r\n\u00a0\u00a0 \u00a0D3D10_BUFFER_DESC bd;\r\n\u00a0\u00a0 \u00a0bd.Usage = D3D10_USAGE_DYNAMIC;\r\n\u00a0\u00a0 \u00a0bd.ByteWidth = sizeof(PCVertex) * m_bufferBytesSize;\r\n\u00a0\u00a0 \u00a0bd.BindFlags = D3D10_BIND_VERTEX_BUFFER;\r\n\u00a0\u00a0 \u00a0bd.CPUAccessFlags = D3D10_CPU_ACCESS_WRITE;\r\n\u00a0\u00a0 \u00a0bd.MiscFlags = 0;\r\n\r\n\u00a0\u00a0 \u00a0hr = D3D10_RENDERER-&gt;GetDevice()-&gt;CreateBuffer(&amp;bd, 0, &amp;m_pVertexBuffer);\r\n\r\n\u00a0\u00a0 \u00a0if (FAILED(hr))\r\n\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0ShowMessageBoxDXError(hr);\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0return false;\r\n\u00a0\u00a0 \u00a0}\r\n\r\n\u00a0\u00a0 \u00a0return true;\r\n}\r\n\r\nvoid Vertex3DLine::AddLine(D3DXVECTOR3 startPoint, D3DXVECTOR3 endPoint, D3DXCOLOR color)\r\n{\r\n\u00a0\u00a0 \u00a0if (!m_pVertexBuffer)\r\n\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0return;\r\n\u00a0\u00a0 \u00a0}\r\n\r\n\u00a0\u00a0 \u00a0D3D10_BUFFER_DESC bd;\r\n\u00a0\u00a0 \u00a0m_pVertexBuffer-&gt;GetDesc(&amp;bd);\r\n\r\n\u00a0\u00a0 \u00a0unsigned int iActualBufferBytesSize = bd.ByteWidth;\r\n\u00a0\u00a0 \u00a0unsigned int iNewBufferBytesSize = (m_vertices.size() + 2) * sizeof(PCVertex);\r\n\r\n\u00a0\u00a0 \u00a0\/\/ Si la taille du buffer est trop petite pour ajouter de nouveaux \u00e9l\u00e9ments\r\n\u00a0\u00a0 \u00a0\/\/ =&gt; on redimensionne\r\n\u00a0\u00a0 \u00a0if (iNewBufferBytesSize &gt; iActualBufferBytesSize)\r\n\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0ResizeVertexBuffer(iActualBufferBytesSize + 2);\r\n\u00a0\u00a0 \u00a0}\r\n\r\n\u00a0\u00a0 \u00a0PCVertex* data = nullptr;\r\n\r\n\u00a0\u00a0 \u00a0PCVertex vert1;\r\n\u00a0\u00a0 \u00a0PCVertex vert2;\r\n\r\n\u00a0\u00a0 \u00a0vert1.position = startPoint;\r\n\u00a0\u00a0 \u00a0vert1.color = color;\r\n\r\n\u00a0\u00a0 \u00a0vert2.position = endPoint;\r\n\u00a0\u00a0 \u00a0vert2.color = color;\r\n\r\n\u00a0\u00a0 \u00a0m_vertices.push_back(vert1);\r\n\u00a0\u00a0 \u00a0m_vertices.push_back(vert2);\r\n\r\n\u00a0\u00a0 \u00a0m_pVertexBuffer-&gt;Map(D3D10_MAP_WRITE_DISCARD, 0, (void**)&amp;data);\r\n\r\n\u00a0\u00a0 \u00a0memcpy(data, m_vertices.data(), sizeof(PCVertex) * m_vertices.size());\r\n\r\n\u00a0\u00a0 \u00a0m_pVertexBuffer-&gt;Unmap();\r\n\r\n\u00a0\u00a0 \u00a0m_iVerticesCount = m_vertices.size();\r\n}\r\n\r\nvoid Vertex3DLine::ResizeVertexBuffer(unsigned int iNewBytesSize)\r\n{\r\n\u00a0\u00a0 \u00a0SAFE_RELEASE(m_pVertexBuffer);\r\n\r\n\u00a0\u00a0 \u00a0HRESULT hr;\r\n\r\n\u00a0\u00a0 \u00a0D3D10_BUFFER_DESC bd;\r\n\u00a0\u00a0 \u00a0bd.Usage = D3D10_USAGE_DYNAMIC;\r\n\u00a0\u00a0 \u00a0bd.ByteWidth = sizeof(PCVertex) * iNewBytesSize;\r\n\u00a0\u00a0 \u00a0bd.BindFlags = D3D10_BIND_VERTEX_BUFFER;\r\n\u00a0\u00a0 \u00a0bd.CPUAccessFlags = D3D10_CPU_ACCESS_WRITE;\r\n\u00a0\u00a0 \u00a0bd.MiscFlags = 0;\r\n\u00a0\u00a0 \u00a0hr = D3D10_RENDERER-&gt;GetDevice()-&gt;CreateBuffer(&amp;bd, nullptr, &amp;m_pVertexBuffer);\r\n\r\n\u00a0\u00a0 \u00a0if (FAILED(hr))\r\n\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0ShowMessageBoxDXError(hr);\r\n\u00a0\u00a0 \u00a0}\r\n}\r\n<\/pre>\n<p>&nbsp;<\/p>\n<p>Voici le fichier ShaderTechnique_Vertex3DLine.h :<\/p>\n<pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\r\n\/\/------------------------------------------------------\r\n\/\/ Shader d'affichage de lignes 3D\r\n\/\/------------------------------------------------------\r\nclass Vertex3DShaderTechnique : public ShaderTechnique\r\n{\r\npublic:\r\n\u00a0\u00a0 \u00a0Vertex3DShaderTechnique();\r\n\u00a0\u00a0 \u00a0virtual ~Vertex3DShaderTechnique();\r\n\r\n\u00a0\u00a0 \u00a0virtual bool Initialize();\r\n\r\n\u00a0\u00a0 \u00a0virtual void SetupShaderVariables();\r\n\r\n\u00a0\u00a0 \u00a0virtual void Update(float fTimeSinceLastFrame);\r\n\r\n};\r\n\r\n<\/pre>\n<p>&nbsp;<\/p>\n<p>Voici le fichier ShaderTechnique_Vertex3DLine.cpp :<\/p>\n<pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\r\n#include &quot;ShaderTechnique_Vertex3DLine.h&quot;\r\n\r\nVertex3DShaderTechnique::Vertex3DShaderTechnique() :\r\nShaderTechnique(&quot;3DLine.fx&quot;, &quot;Render&quot;, VertexLayoutType::PC_VERTEX)\r\n{\r\n}\r\n\r\nVertex3DShaderTechnique::~Vertex3DShaderTechnique()\r\n{\r\n}\r\n\r\nbool Vertex3DShaderTechnique::Initialize()\r\n{\r\n\u00a0\u00a0 \u00a0ShaderTechnique::Initialize();\r\n\r\n\u00a0\u00a0 \u00a0SetupShaderVariables();\r\n\r\n\u00a0\u00a0 \u00a0return true;\r\n}\r\n\r\nvoid Vertex3DShaderTechnique::SetupShaderVariables()\r\n{\r\n\u00a0\u00a0 \u00a0RegisterMatrixVariable(&quot;World&quot;, ShaderVariableType::WORLD);\r\n\u00a0\u00a0 \u00a0RegisterMatrixVariable(&quot;View&quot;, ShaderVariableType::VIEW);\r\n\u00a0\u00a0 \u00a0RegisterMatrixVariable(&quot;Projection&quot;, ShaderVariableType::PROJECTION);\r\n}\r\n\r\nvoid Vertex3DShaderTechnique::Update(float fTimeSinceLastFrame)\r\n{\r\n\u00a0\u00a0 \u00a0SetAutoMatrix(ShaderVariableType::WORLD);\r\n\u00a0\u00a0 \u00a0SetAutoMatrix(ShaderVariableType::VIEW);\r\n\u00a0\u00a0 \u00a0SetAutoMatrix(ShaderVariableType::PROJECTION);\r\n}\r\n<\/pre>\n<p>&nbsp;<\/p>\n<p>Voici le fichier 3DLine.fx correspondant :<\/p>\n<pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\r\nmatrix World;\r\nmatrix View;\r\nmatrix Projection;\r\n\r\nstruct VS_INPUT\r\n{\r\n\u00a0\u00a0\u00a0 float4 Pos : POSITION;\r\n\u00a0\u00a0\u00a0 float4 Color : COLOR0;\r\n};\r\n\r\nstruct PS_INPUT\r\n{\r\n\u00a0\u00a0\u00a0 float4 Pos : SV_POSITION;\r\n\u00a0\u00a0\u00a0 float4 Color : COLOR0;\r\n};\r\n\r\nPS_INPUT VS( VS_INPUT input )\r\n{\r\n\u00a0\u00a0\u00a0 PS_INPUT output = (PS_INPUT)0;\r\n\u00a0\u00a0 \u00a0\r\n\u00a0\u00a0\u00a0 output.Pos = mul( input.Pos, World );\r\n\u00a0\u00a0\u00a0 output.Pos = mul( output.Pos, View );\r\n\u00a0\u00a0\u00a0 output.Pos = mul( output.Pos, Projection );\r\n\u00a0\u00a0 \u00a0\r\n\u00a0\u00a0 \u00a0output.Color = input.Color;\r\n\u00a0\u00a0 \u00a0\r\n\u00a0\u00a0\u00a0 return output;\r\n}\r\n\r\nfloat4 PS( PS_INPUT input) : SV_Target\r\n{\r\n\u00a0\u00a0\u00a0 return input.Color;\r\n}\r\n\r\ntechnique10 Render\r\n{\r\n\u00a0\u00a0\u00a0 pass P0\r\n\u00a0\u00a0\u00a0 {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 SetVertexShader( CompileShader( vs_4_0, VS() ) );\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 SetGeometryShader( NULL );\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 SetPixelShader( CompileShader( ps_4_0, PS() ) );\r\n\u00a0\u00a0\u00a0 }\r\n}\r\n\r\n<\/pre>\n<p>&nbsp;<\/p>\n<p><strong>R\u00e9sum\u00e9 :<\/strong><\/p>\n<p>Nous avons pr\u00e9sent\u00e9 un syst\u00e8me permettant d&rsquo;afficher des lignes dans la surface de rendu tout en pouvant sp\u00e9cifier leur couleur.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Intro : Il peut \u00eatre utile d&rsquo;afficher des lignes dans la surface de rendu ; par exemple pour repr\u00e9senter des normales, des trajectoires, un rep\u00e8re, etc&#8230; Pr\u00e9requis : &#8211; Savoir lire du C++ &#8211; Savoir utiliser la classe MeshSceneNode &#8211; Savoir utiliser la classe ShaderTechnique et les d\u00e9clarations de vertices. Explications : Voici le fichier [&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\/3225"}],"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=3225"}],"version-history":[{"count":23,"href":"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/index.php?rest_route=\/wp\/v2\/posts\/3225\/revisions"}],"predecessor-version":[{"id":3375,"href":"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/index.php?rest_route=\/wp\/v2\/posts\/3225\/revisions\/3375"}],"wp:attachment":[{"href":"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=3225"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=3225"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=3225"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}