{"id":4469,"date":"2015-12-07T11:59:16","date_gmt":"2015-12-07T11:59:16","guid":{"rendered":"http:\/\/anthroponaute.fr\/blog-informatique\/?p=4469"},"modified":"2016-07-27T15:31:16","modified_gmt":"2016-07-27T15:31:16","slug":"introduction-a-directx-10-ecrire-du-texte-a-lecran-partie-7","status":"publish","type":"post","link":"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/?p=4469","title":{"rendered":"Introduction \u00e0 DirectX 10 \u2013 \u00c9crire du texte \u00e0 l&rsquo;\u00e9cran (syst\u00e8me de polices) \u2013 partie 7"},"content":{"rendered":"<p><a href=\"https:\/\/anthropoya.cluster014.ovh.net\/blog-informatique\/wp-content\/uploads\/2015\/03\/directx9c.png\"><img decoding=\"async\" loading=\"lazy\" class=\"alignnone size-full wp-image-1053\" src=\"https:\/\/anthropoya.cluster014.ovh.net\/blog-informatique\/wp-content\/uploads\/2015\/03\/directx9c.png\" alt=\"directx9c\" width=\"346\" height=\"360\" srcset=\"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/wp-content\/uploads\/2015\/03\/directx9c.png 346w, https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/wp-content\/uploads\/2015\/03\/directx9c-288x300.png 288w\" sizes=\"(max-width: 346px) 100vw, 346px\" \/><\/a><\/p>\n<p><a href=\"https:\/\/anthropoya.cluster014.ovh.net\/blog-informatique\/wp-content\/uploads\/2015\/12\/Hello2.png\"><img decoding=\"async\" loading=\"lazy\" class=\"alignnone size-full wp-image-5174\" src=\"https:\/\/anthropoya.cluster014.ovh.net\/blog-informatique\/wp-content\/uploads\/2015\/12\/Hello2.png\" alt=\"Hello\" width=\"795\" height=\"623\" srcset=\"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/wp-content\/uploads\/2015\/12\/Hello2.png 795w, https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/wp-content\/uploads\/2015\/12\/Hello2-300x235.png 300w, https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/wp-content\/uploads\/2015\/12\/Hello2-624x489.png 624w\" sizes=\"(max-width: 795px) 100vw, 795px\" \/><\/a><\/p>\n<p>Utilisation de <strong>BMFont<\/strong> :<\/p>\n<p><a href=\"https:\/\/anthropoya.cluster014.ovh.net\/blog-informatique\/wp-content\/uploads\/2015\/12\/BMFont.png\"><img decoding=\"async\" loading=\"lazy\" class=\"alignnone size-full wp-image-5210\" src=\"https:\/\/anthropoya.cluster014.ovh.net\/blog-informatique\/wp-content\/uploads\/2015\/12\/BMFont.png\" alt=\"BMFont\" width=\"795\" height=\"623\" srcset=\"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/wp-content\/uploads\/2015\/12\/BMFont.png 795w, https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/wp-content\/uploads\/2015\/12\/BMFont-300x235.png 300w, https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/wp-content\/uploads\/2015\/12\/BMFont-624x489.png 624w\" sizes=\"(max-width: 795px) 100vw, 795px\" \/><\/a><\/p>\n<p>&nbsp;<\/p>\n<p><strong>Intro : <\/strong><\/p>\n<p>Pour afficher du texte dans une application DirectX il faut proc\u00e9der comme suit.<\/p>\n<p><strong>Pr\u00e9requis :<\/strong><\/p>\n<p>&#8211; Savoir initialiser DirectX 10<\/p>\n<p>&#8211; Savoir comment afficher une image 2D \u00e0 l&rsquo;\u00e9cran<\/p>\n<h2>Septi\u00e8me partie :<\/h2>\n<p>Afficher du texte \u00e0 l&rsquo;\u00e9cran.<\/p>\n<p><strong>Explications :<\/strong><\/p>\n<p>Il vous faudra plusieurs<strong> images bitmap<\/strong> pour supporter les diff\u00e9rentes r\u00e9solutions de l&rsquo;\u00e9cran de l&rsquo;utilisateur.<\/p>\n<p><em>\u00ab\u00a0Their source rect will form our texture coordinates, and their destination rect will form our vertexcoordinates.\u00a0\u00bb<\/em><\/p>\n<p>&nbsp;<\/p>\n<p>Voici le fichier FontTextManager.h :<\/p>\n<pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\r\n#ifndef FONT_TEXT_MANAGER_H\r\n#define FONT_TEXT_MANAGER_H\r\n\r\n#include &lt;d3dx10math.h&gt;\r\n#include &lt;vector&gt;\r\n#include &lt;map&gt;\r\n#include &lt;string&gt;\r\n#include &lt;fstream&gt;\r\n\r\n#include &quot;Singleton.h&quot;\r\n#include &quot;Defines.h&quot;\r\n#include &quot;Types.h&quot;\r\n\r\nnamespace FontSystem\r\n{\r\n\u00a0\u00a0 \u00a0struct FontTextFileCharacter\r\n\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0FontTextFileCharacter() :\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0iXPos(0),\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0iYPos(0),\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0iWidth(0),\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0iHeight(0),\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0iXOffset(0),\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0iYOffset(0),\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0iXAdvance(0),\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0iPage(0)\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0}\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0uint16 iXPos, iYPos;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0uint16 iWidth, iHeight;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0float iXOffset, iYOffset;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0float iXAdvance;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0uint16 iPage;\r\n\u00a0\u00a0 \u00a0};\r\n\r\n\u00a0\u00a0 \u00a0struct PTPVertex\r\n\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0D3DXVECTOR3 position;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0D3DXVECTOR2 texture;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0int page;\r\n\u00a0\u00a0 \u00a0};\r\n\r\n\u00a0\u00a0 \u00a0struct Font\r\n\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0std::string sFontTextName;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0uint16 iLineHeight;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0uint16 iBase;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0uint16 iWidth; \/\/ Taille en largeur de l'image de la police\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0uint16 iHeight; \/\/ Taille en hauteur de l'image de la police\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0uint16 iPagesCount;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0int16 iSize;\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\/\/ Un tableau de caract\u00e8res constituants la police de font\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0FontTextFileCharacter* aCharacters;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\/\/ Un tableau contenant les fichiers shader ressources\u00a0 (les pages !) en l'occurence les textures de la police de font\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0ID3D10ShaderResourceView* texturesArray;\r\n\u00a0\u00a0 \u00a0};\r\n\r\n\u00a0\u00a0 \u00a0class Text\r\n\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0public:\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0Text(const std::wstring m_sText, const D3DXCOLOR&amp; color, float fPosX, float fPosY);\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0virtual ~Text();\r\n\u00a0\u00a0 \u00a0\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0void SetFont(Font* pFont);\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0Font* GetFont();\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0float GetPosX();\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0float GetPosY();\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0std::wstring GetText();\r\n\u00a0\u00a0 \u00a0\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0void SetVertexBuffer(ID3D10Buffer* pBuffer);\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0void SetIndexBuffer(ID3D10Buffer* pBuffer);\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0ID3D10Buffer* GetVertexBuffer();\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0ID3D10Buffer* GetIndexBuffer();\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0D3DXCOLOR GetColor();\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0size_t GetVertexCount();\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0size_t GetIndexCount();\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0void SetVertexCount(size_t iCount);\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0void SetIndexCount(size_t iCount);\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0void SetTransparency(float fAlpha);\r\n\r\n\u00a0\u00a0 \u00a0private:\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0std::wstring m_sText;\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0float m_fPosX;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0float m_fPosY;\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0D3DXCOLOR m_color;\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0Font* m_pFont;\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\/\/ Un vertex \/ index buffer par page\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0ID3D10Buffer* m_pVertexBuffer;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0ID3D10Buffer* m_pIndexBuffer;\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0size_t m_iVertexCount;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0size_t m_iIndexCount;\r\n\u00a0\u00a0 \u00a0};\r\n}\r\n\r\nusing namespace FontSystem;\r\n\r\nclass FontTextManager : public Singleton&lt;FontTextManager&gt;\r\n{\r\npublic : \/\/ todo : mettre des commentaires partout ; utiliser AlphaTransparencyPass\r\n\u00a0\u00a0 \u00a0FontTextManager();\r\n\u00a0\u00a0 \u00a0virtual ~FontTextManager();\r\n\u00a0\u00a0 \u00a0\r\n\u00a0\u00a0 \u00a0bool Initialize();\r\n\r\n\u00a0\u00a0 \u00a0void Render(Text* pText);\r\n\r\n\u00a0\u00a0 \u00a0bool LoadFontTextFile(const std::string&amp; sFileName, const std::string&amp; sFontTextName);\r\n\u00a0\u00a0 \u00a0bool IsFontTextLoaded(const std::string&amp; sFontTextName);\r\n\r\n\u00a0\u00a0 \u00a0Text* CreateText(const std::wstring&amp; sText, const std::string&amp; sFontTextName, const float fPosX, const float fPosY,\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0const D3DXCOLOR&amp; color);\r\n\r\n\u00a0\u00a0 \u00a0float GetGlyphAspectRatio(const wchar_t* c, const std::string&amp; sFontTextName);\r\n\u00a0\u00a0 \u00a0RECT GetGlyphTexCoords(const wchar_t* c, const std::string&amp; sFontTextName);\r\n\u00a0\u00a0 \u00a0uint16 GetCharacterPage(const wchar_t* c, const std::string&amp; sFontTextName);\r\n\r\nprivate:\r\n\u00a0\u00a0 \u00a0void CreateVertexInputLayout();\r\n\u00a0\u00a0 \u00a0void SetupMatrix();\r\n\u00a0\u00a0 \u00a0bool BuildTextBuffers(Text* text);\r\n\u00a0\u00a0 \u00a0bool InitializeShader();\r\n\r\n\u00a0\u00a0 \u00a0ID3D10Texture2D* CreateTexture(const std::string&amp; sBitmapFileName);\r\n\u00a0\u00a0 \u00a0ID3D10Texture2D* CreateTextureArray(std::vector&lt;ID3D10Texture2D*&gt;&amp; textures);\r\n\u00a0\u00a0 \u00a0ID3D10ShaderResourceView* GetTextureRVArray(ID3D10Texture2D* pTexArray);\r\n\r\nprivate:\r\n\u00a0\u00a0 \u00a0D3D10_INPUT_ELEMENT_DESC* m_pLayoutPT; \/\/ todo : enlever\r\n\u00a0\u00a0 \u00a0ID3D10InputLayout* m_pVertexLayout;\r\n\r\n\u00a0\u00a0 \u00a0std::map&lt;std::string, Font*&gt; m_fonts;\r\n\r\n\u00a0\u00a0\u00a0 ID3D10Effect* m_pEffect;\r\n\u00a0\u00a0\u00a0 ID3D10EffectTechnique* m_pTechnique;\r\n\r\n\u00a0\u00a0 \u00a0ID3D10EffectShaderResourceVariable* m_pBitmapVariable;\r\n\r\n\u00a0\u00a0 \u00a0ID3D10EffectMatrixVariable* m_pWorldVariable;\r\n\u00a0\u00a0 \u00a0ID3D10EffectMatrixVariable* m_pViewVariable;\r\n\u00a0\u00a0 \u00a0ID3D10EffectMatrixVariable* m_pProjVariable;\r\n\u00a0\u00a0 \u00a0ID3D10EffectVectorVariable* m_pColorVariable;\r\n\r\n\u00a0\u00a0\u00a0 D3DXMATRIX m_worldMatrix;\r\n\u00a0\u00a0\u00a0 D3DXMATRIX m_viewMatrix;\r\n\u00a0\u00a0\u00a0 D3DXMATRIX m_projMatrix;\r\n};\r\n\r\n#endif\r\n<\/pre>\n<p>&nbsp;<\/p>\n<p>Voici le fichier FontTextManager.cpp :<\/p>\n<pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\r\n#include &quot;FontTextManager.h&quot;\r\n#include &quot;D3D10Renderer.h&quot;\r\n#include &quot;AlphaPass.h&quot;\r\n\r\nText::Text(const std::wstring sText, const D3DXCOLOR&amp; color, float fPosX, float fPosY) :\r\nm_sText(sText),\r\nm_color(color),\r\nm_fPosX(fPosX),\r\nm_fPosY(fPosY),\r\nm_pFont(nullptr),\r\nm_pIndexBuffer(nullptr),\r\nm_pVertexBuffer(nullptr),\r\nm_iIndexCount(0),\r\nm_iVertexCount(0)\r\n{\r\n}\r\n\r\nText::~Text()\r\n{\r\n\u00a0\u00a0 \u00a0SAFE_RELEASE(m_pVertexBuffer);\r\n\u00a0\u00a0 \u00a0SAFE_RELEASE(m_pIndexBuffer);\r\n}\r\n\r\nvoid Text::SetFont(Font* pFont)\r\n{\r\n\u00a0\u00a0 \u00a0m_pFont = pFont;\r\n}\r\n\r\nFont* Text::GetFont()\r\n{\r\n\u00a0\u00a0 \u00a0return m_pFont;\r\n}\r\n\r\nstd::wstring Text::GetText()\r\n{\r\n\u00a0\u00a0 \u00a0return m_sText;\r\n}\r\n\r\nvoid Text::SetVertexBuffer(ID3D10Buffer* pBuffer)\r\n{\r\n\u00a0\u00a0 \u00a0m_pVertexBuffer = pBuffer;\r\n}\r\n\r\nvoid Text::SetIndexBuffer(ID3D10Buffer* pBuffer)\r\n{\r\n\u00a0\u00a0 \u00a0m_pIndexBuffer = pBuffer;\r\n}\r\n\r\nID3D10Buffer* Text::GetVertexBuffer()\r\n{\r\n\u00a0\u00a0 \u00a0return m_pVertexBuffer;\r\n}\r\n\r\nID3D10Buffer* Text::GetIndexBuffer()\r\n{\r\n\u00a0\u00a0 \u00a0return m_pIndexBuffer;\r\n}\r\n\r\nsize_t Text::GetVertexCount()\r\n{\r\n\u00a0\u00a0 \u00a0return m_iVertexCount;\r\n}\r\n\r\nsize_t Text::GetIndexCount()\r\n{\r\n\u00a0\u00a0 \u00a0return m_iIndexCount;\r\n}\r\n\r\nvoid Text::SetVertexCount(size_t iCount)\r\n{\r\n\u00a0\u00a0 \u00a0m_iVertexCount = iCount;\r\n}\r\n\r\nvoid Text::SetIndexCount(size_t iCount)\r\n{\r\n\u00a0\u00a0 \u00a0m_iIndexCount = iCount;\r\n}\r\n\r\nD3DXCOLOR Text::GetColor()\r\n{\r\n\u00a0\u00a0 \u00a0return m_color;\r\n}\r\n\r\nfloat Text::GetPosX()\r\n{\r\n\u00a0\u00a0 \u00a0return m_fPosX;\r\n}\r\n\r\nfloat Text::GetPosY()\r\n{\r\n\u00a0\u00a0 \u00a0return m_fPosY;\r\n}\r\n\r\nvoid Text::SetTransparency(float fAlpha)\r\n{\r\n\u00a0\u00a0 \u00a0m_color.a = fAlpha;\r\n}\r\n\r\n\/\/ ---------------------------------------------\/\/\r\n\r\ntemplate&lt;&gt; FontTextManager* Singleton&lt;FontTextManager&gt;::ms_instance = nullptr;\r\n\r\nFontTextManager::FontTextManager() :\r\nm_pLayoutPT(nullptr),\r\nm_pBitmapVariable(nullptr),\r\nm_pEffect(nullptr),\r\nm_pTechnique(nullptr),\r\nm_pVertexLayout(nullptr),\r\nm_pWorldVariable(nullptr),\r\nm_pViewVariable(nullptr),\r\nm_pProjVariable(nullptr),\r\nm_pColorVariable(nullptr)\r\n{\r\n}\r\n\r\nFontTextManager::~FontTextManager()\r\n{\r\n\u00a0\u00a0 \u00a0SAFE_DELETE(m_pLayoutPT);\r\n\r\n\u00a0\u00a0 \u00a0SAFE_RELEASE(m_pVertexLayout);\r\n\u00a0\u00a0 \u00a0SAFE_RELEASE(m_pEffect);\r\n}\r\n\r\nbool FontTextManager::Initialize()\r\n{\r\n\u00a0\u00a0 \u00a0CreateVertexInputLayout();\r\n\r\n\u00a0\u00a0 \u00a0if (!InitializeShader())\r\n\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0return false;\r\n\u00a0\u00a0 \u00a0}\r\n\r\n\u00a0\u00a0 \u00a0SetupMatrix();\r\n\r\n\u00a0\u00a0 \u00a0return true;\r\n}\r\n\r\nbool FontTextManager::InitializeShader()\r\n{\r\n\u00a0\u00a0 \u00a0HRESULT hr = S_OK;\r\n\r\n\u00a0\u00a0\u00a0 ID3D10Blob* pBlob = nullptr;\r\n\u00a0\r\n\u00a0\u00a0 \u00a0hr = D3DX10CreateEffectFromFile(FONT_TEXT_FX_FILE_NAME, nullptr, nullptr, &quot;fx_4_0&quot;,\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0D3D10_SHADER_ENABLE_STRICTNESS | D3D10_SHADER_DEBUG, 0,\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0D3D10_RENDERER-&gt;GetDevice(), nullptr, nullptr, &amp;m_pEffect, &amp;pBlob, nullptr);\r\n\r\n\u00a0\u00a0 \u00a0if (FAILED(hr))\r\n\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0if (pBlob)\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\/\/ Affiche l'erreur de compilation du shader\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0MessageBoxA(nullptr, (PCSTR)pBlob-&gt;GetBufferPointer(), &quot;Erreur dans le fichier shader&quot;, MB_ICONHAND | MB_OK);\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0}\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0else\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0ShowMessageBoxDXError(hr);\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0}\r\n\u00a0\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0return false;\r\n\u00a0\u00a0 \u00a0}\r\n\u00a0 \r\n\r\n\u00a0\u00a0\u00a0 m_pTechnique = m_pEffect-&gt;GetTechniqueByName(&quot;FontTechnique&quot;);\r\n\r\n\u00a0\u00a0\u00a0 m_pWorldVariable = m_pEffect-&gt;GetVariableByName(&quot;World&quot;)-&gt;AsMatrix();\r\n\u00a0\u00a0\u00a0 m_pViewVariable = m_pEffect-&gt;GetVariableByName(&quot;View&quot;)-&gt;AsMatrix();\r\n\u00a0\u00a0\u00a0 m_pProjVariable = m_pEffect-&gt;GetVariableByName(&quot;Projection&quot;)-&gt;AsMatrix();\r\n\u00a0\u00a0 \u00a0m_pBitmapVariable = m_pEffect-&gt;GetVariableByName(&quot;gTextures&quot;)-&gt;AsShaderResource();\r\n\u00a0\u00a0 \u00a0m_pColorVariable = m_pEffect-&gt;GetVariableByName(&quot;BlendColor&quot;)-&gt;AsVector();\r\n\r\n\u00a0\u00a0\u00a0 D3D10_PASS_DESC PassDesc;\r\n\u00a0\u00a0\u00a0 m_pTechnique-&gt;GetPassByIndex(0)-&gt;GetDesc(&amp;PassDesc);\r\n\u00a0\u00a0 \u00a0hr = D3D10_RENDERER-&gt;GetDevice()-&gt;CreateInputLayout(m_pLayoutPT, 3, PassDesc.pIAInputSignature,\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 PassDesc.IAInputSignatureSize, &amp;m_pVertexLayout);\r\n\r\n\u00a0\u00a0 \u00a0VR_RETURN(hr);\r\n\r\n\u00a0\u00a0 \u00a0return true;\r\n}\r\n\r\nvoid FontTextManager::SetupMatrix()\r\n{\r\n\u00a0\u00a0\u00a0 D3DXMatrixIdentity(&amp;m_worldMatrix);\r\n\u00a0\r\n\u00a0\u00a0\u00a0 D3DXVECTOR3 Eye(0.0f, 0.0f, -1.0f);\r\n\u00a0\u00a0\u00a0 D3DXVECTOR3 At(0.0f, 0.0f, 0.0f);\r\n\u00a0\u00a0\u00a0 D3DXVECTOR3 Up(0.0f, 1.0f, 0.0f);\r\n\u00a0\r\n\u00a0\u00a0\u00a0 D3DXMatrixLookAtLH(&amp;m_viewMatrix, &amp;Eye, &amp;At, &amp;Up);\r\n\r\n\u00a0\u00a0 \u00a0D3DXMatrixOrthoLH(&amp;m_projMatrix, (float) D3D10_RENDERER-&gt;GetViewportWidth(), (float) D3D10_RENDERER-&gt;GetViewportHeight(),\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a01.0f, 20.0f);\r\n}\r\n\r\nvoid FontTextManager::CreateVertexInputLayout()\r\n{\u00a0\u00a0 \u00a0\r\n\u00a0\u00a0 \u00a0m_pLayoutPT = new D3D10_INPUT_ELEMENT_DESC[3];\r\n\r\n\u00a0\u00a0 \u00a0D3D10_INPUT_ELEMENT_DESC layoutPT[] =\r\n\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0{ &quot;POSITION&quot;, 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 0, D3D10_INPUT_PER_VERTEX_DATA, 0 },\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0{ &quot;TEXCOORD&quot;, 0, DXGI_FORMAT_R32G32_FLOAT, 0, 12, D3D10_INPUT_PER_VERTEX_DATA, 0 },\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0{ &quot;PAGE&quot;, 0, DXGI_FORMAT_R16_UINT, 0, 20, D3D10_INPUT_PER_VERTEX_DATA, 0 },\r\n\u00a0\u00a0 \u00a0};\r\n\r\n\u00a0\u00a0 \u00a0memcpy(m_pLayoutPT, layoutPT, sizeof(D3D10_INPUT_ELEMENT_DESC) * 3);\r\n}\r\n\r\nbool FontTextManager::IsFontTextLoaded(const std::string&amp; sFontTextName)\r\n{\r\n\u00a0\u00a0 \u00a0return m_fonts.count(sFontTextName) != 0;\r\n}\r\n\/*\r\n\u00a0\u00a0 \u00a0http:\/\/www.angelcode.com\/products\/bmfont\/doc\/render_text.html\r\n*\/\r\nbool FontTextManager::BuildTextBuffers(Text* pText)\r\n{\r\n\u00a0\u00a0 \u00a0std::string sFontTextName = pText-&gt;GetFont()-&gt;sFontTextName;\r\n\r\n\u00a0\u00a0 \u00a0std::wstring sText = pText-&gt;GetText();\r\n\u00a0\u00a0 \u00a0float fPosX = pText-&gt;GetPosX();\r\n\u00a0\u00a0 \u00a0float fPosY = -pText-&gt;GetPosY();\r\n\r\n\u00a0\u00a0 \u00a0\/\/ D\u00e9calage en fonction de la taille de l'\u00e9cran\r\n\u00a0\u00a0 \u00a0fPosX -= (float)((D3D10_RENDERER-&gt;GetViewportWidth() \/ 2 ));\r\n\u00a0\u00a0 \u00a0fPosY += (float)((D3D10_RENDERER-&gt;GetViewportHeight() \/ 2 ));\r\n\r\n\u00a0\u00a0 \u00a0\/\/ On v\u00e9rifie si l'on a bien la police charg\u00e9e en m\u00e9moire\r\n\u00a0\u00a0 \u00a0if (m_fonts.count(sFontTextName) == 0)\r\n\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0return false;\r\n\u00a0\u00a0 \u00a0}\r\n\r\n\u00a0\u00a0 \u00a0\/\/ On obtient la police sp\u00e9cifi\u00e9e\r\n\u00a0\u00a0 \u00a0Font* pFont = m_fonts[sFontTextName];\r\n\r\n\u00a0\u00a0 \u00a0\/\/ Tableau de tous les caract\u00e8res de la police de font\r\n\u00a0\u00a0 \u00a0FontTextFileCharacter* aCharacters = pFont-&gt;aCharacters;\r\n\r\n\u00a0\u00a0 \u00a0D3D10_BUFFER_DESC vertexBufferDesc, indexBufferDesc;\r\n\u00a0\u00a0\u00a0 D3D10_SUBRESOURCE_DATA vertexData, indexData;\r\n\r\n\u00a0\u00a0 \u00a0HRESULT hr;\r\n\r\n\u00a0\u00a0 \u00a0std::vector&lt;PTPVertex&gt; vertices;\r\n\r\n\u00a0\u00a0 \u00a0for (uint32 i = 0; i &lt; sText.length(); i++)\r\n\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\/\/ Chaque lettre\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0uint32 iLetter = (uint32)sText[i];\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0FontTextFileCharacter character = pFont-&gt;aCharacters[iLetter];\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0if (iLetter == SPACE_ASCII_CODE) \/\/ Espace !\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0fPosX += character.iXAdvance;\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0continue;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0}\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0if (iLetter == '\\n')\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0fPosX = 0;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0}\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0float x = 0;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0float y = 0;\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0float tu = 0;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0float tv = 0;\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0uint32 iCharX = character.iXPos; \/\/ Abscisse du caract\u00e8re dans la texture\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0uint32 iCharY = character.iYPos; \/\/ Ordonn\u00e9e du caract\u00e8re dans la texture\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0uint32 iWidth = character.iWidth; \/\/ Largeur du caract\u00e8re dans la texture\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0uint32 iHeight = character.iHeight; \/\/ Hauteur du caract\u00e8re dans la texture\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0float iOffsetX = character.iXOffset;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0float iOffsetY = character.iYOffset;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0float iXAdvance = character.iXAdvance;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0uint16 iPage = character.iPage;\r\n\r\n\u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\/\/----------------- 1er triangle de la face du caract\u00e8re -----------------\/\/\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\/\/ ---- Bottom left ---- \/\/\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0iOffsetY = - iOffsetY - iHeight;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\/\/iOffsetY = (- iOffsetY - pFont-&gt;iLineHeight\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\/\/iOffsetY -= pFont-&gt;iLineHeight;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\/\/iOffsetY -= pFont-&gt;iLineHeight;\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0x = fPosX + iOffsetX;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0y = fPosY + iOffsetY;\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0tu = (float) (iCharX) \/ pFont-&gt;iWidth;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0tv = (float) (iCharY + iHeight) \/ pFont-&gt;iHeight;\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0PTPVertex vertex;\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0vertex.position = D3DXVECTOR3(x, y, 0.0f);\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0vertex.texture = D3DXVECTOR2(tu, tv);\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0vertex.page = iPage;\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0vertices.push_back(vertex);\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\/\/ ---- Top left ---- \/\/\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0x = fPosX + iOffsetX;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0y = fPosY + iOffsetY + iHeight;\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0tu = (float) iCharX \/ pFont-&gt;iWidth;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0tv = (float) iCharY \/ pFont-&gt;iHeight;\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0vertex.position = D3DXVECTOR3(x, y, 0.0f); \u00a0\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0vertex.texture = D3DXVECTOR2(tu, tv);\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0vertex.page = iPage;\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0vertices.push_back(vertex);\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\/\/ ---- Top right ---- \/\/\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0x = fPosX + iOffsetX + iWidth;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0y = fPosY + iOffsetY + iHeight;\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0tu = (float) (iCharX + iWidth) \/ pFont-&gt;iWidth;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0tv = (float) iCharY \/ pFont-&gt;iHeight;\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0vertex.position = D3DXVECTOR3(x, y, 0.0f); \u00a0\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0vertex.texture = D3DXVECTOR2(tu, tv);\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0vertex.page = iPage;\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0vertices.push_back(vertex);\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\/\/----------------- 2\u00e8me triangle de la face du caract\u00e8re -----------------\/\/\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\/\/ ---- Top right ---- \/\/\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0x = fPosX + iOffsetX + iWidth;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0y = fPosY + iOffsetY + iHeight;\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0tu = (float) (iCharX + iWidth) \/ pFont-&gt;iWidth;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0tv = (float) iCharY \/ pFont-&gt;iHeight;\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0vertex.position = D3DXVECTOR3(x, y, 0.0f); \u00a0\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0vertex.texture = D3DXVECTOR2(tu, tv);\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0vertex.page = iPage;\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0vertices.push_back(vertex);\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\/\/ ---- Bottom right ---- \/\/\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0x = fPosX + iOffsetX + iWidth;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0y = fPosY + iOffsetY;\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0tu = (float) (iCharX + iWidth) \/ pFont-&gt;iWidth;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0tv = (float) (iCharY + iHeight) \/ pFont-&gt;iHeight;\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0vertex.position = D3DXVECTOR3(x, y, 0.0f); \u00a0\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0vertex.texture = D3DXVECTOR2(tu, tv);\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0vertex.page = iPage;\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0vertices.push_back(vertex);\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\/\/ ---- Bottom left ---- \/\/\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0x = fPosX + iOffsetX;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0y = fPosY + iOffsetY;\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0tu = (float) (iCharX) \/ pFont-&gt;iWidth;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0tv = (float) (iCharY + iHeight) \/ pFont-&gt;iHeight;\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0vertex.position = D3DXVECTOR3(x, y, 0.0f); \u00a0\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0vertex.texture = D3DXVECTOR2(tu, tv);\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0vertex.page = iPage;\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0vertices.push_back(vertex);\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\/\/ On d\u00e9cale de quelques pixels vers la gauche apr\u00e8s chaque lettre\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0fPosX += iXAdvance;\r\n\u00a0\u00a0 \u00a0}\r\n\r\n\u00a0\u00a0 \u00a0pText-&gt;SetVertexCount(vertices.size());\r\n\u00a0\u00a0 \u00a0pText-&gt;SetIndexCount( pText-&gt;GetVertexCount() );\r\n\r\n\u00a0\u00a0 \u00a0std::vector&lt;uint16&gt; indices;\r\n\u00a0\u00a0 \u00a0for (uint16 i = 0; i &lt; pText-&gt;GetIndexCount(); i++)\r\n\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0indices.push_back(i);\r\n\u00a0\u00a0 \u00a0}\r\n\r\n\u00a0\u00a0 \u00a0vertexBufferDesc.Usage = D3D10_USAGE_DYNAMIC;\r\n\u00a0\u00a0 \u00a0vertexBufferDesc.ByteWidth = sizeof(PTPVertex) * pText-&gt;GetVertexCount();\r\n\u00a0\u00a0 \u00a0vertexBufferDesc.BindFlags = D3D10_BIND_VERTEX_BUFFER;\r\n\u00a0\u00a0 \u00a0vertexBufferDesc.CPUAccessFlags = D3D10_CPU_ACCESS_WRITE;\r\n\u00a0\u00a0 \u00a0vertexBufferDesc.MiscFlags = 0;\r\n\r\n\u00a0\u00a0 \u00a0vertexData.pSysMem = vertices.data();\r\n\r\n\u00a0\u00a0 \u00a0ID3D10Buffer* pVB = nullptr;\r\n\r\n\u00a0\u00a0 \u00a0hr = D3D10_RENDERER-&gt;GetDevice()-&gt;CreateBuffer(&amp;vertexBufferDesc, &amp;vertexData, &amp;pVB);\r\n\u00a0\u00a0 \u00a0VR_RETURN(hr);\r\n\r\n\u00a0\u00a0 \u00a0pText-&gt;SetVertexBuffer(pVB);\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\r\n\u00a0\u00a0 \u00a0indexBufferDesc.Usage = D3D10_USAGE_DEFAULT;\r\n\u00a0\u00a0 \u00a0indexBufferDesc.ByteWidth = sizeof(uint16) * pText-&gt;GetIndexCount();\r\n\u00a0\u00a0 \u00a0indexBufferDesc.BindFlags = D3D10_BIND_INDEX_BUFFER;\r\n\u00a0\u00a0 \u00a0indexBufferDesc.CPUAccessFlags = 0;\r\n\u00a0\u00a0 \u00a0indexBufferDesc.MiscFlags = 0;\r\n\r\n\u00a0\u00a0 \u00a0indexData.pSysMem = indices.data();\r\n\r\n\u00a0\u00a0 \u00a0ID3D10Buffer* pIB = nullptr;\r\n\u00a0\u00a0 \u00a0hr = D3D10_RENDERER-&gt;GetDevice()-&gt;CreateBuffer(&amp;indexBufferDesc, &amp;indexData, &amp;pIB);\r\n\u00a0\u00a0 \u00a0VR_RETURN(hr);\r\n\r\n\u00a0\u00a0 \u00a0pText-&gt;SetIndexBuffer(pIB);\r\n\r\n\u00a0\u00a0 \u00a0return true;\r\n}\r\n\r\nvoid FontTextManager::Render(Text* pText)\r\n{\r\n\u00a0\u00a0 \u00a0if (!pText)\r\n\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0return;\r\n\u00a0\u00a0 \u00a0} \r\n\r\n\u00a0\u00a0\u00a0 uint32 iStride = sizeof(PTPVertex);\r\n\u00a0\u00a0 \u00a0uint32 iOffset = 0;\r\n\r\n\u00a0\u00a0 \u00a0D3D10_RENDERER-&gt;EnableZBuffer(false);\r\n\r\n\u00a0\u00a0 \u00a0m_pWorldVariable-&gt;SetMatrix((float*)&amp;m_worldMatrix);\r\n\u00a0\u00a0 \u00a0m_pViewVariable-&gt;SetMatrix((float*)&amp;m_viewMatrix);\r\n\u00a0\u00a0 \u00a0m_pProjVariable-&gt;SetMatrix((float*)&amp;m_projMatrix);\r\n\u00a0\u00a0 \u00a0m_pColorVariable-&gt;SetFloatVector((float*)pText-&gt;GetColor());\r\n\r\n\u00a0\u00a0 \u00a0ID3D10Buffer* pVertexBuffer = pText-&gt;GetVertexBuffer();\r\n\u00a0\u00a0 \u00a0ID3D10Buffer* pIndexBuffer = pText-&gt;GetIndexBuffer();\r\n\r\n\u00a0\u00a0 \u00a0size_t iVertexCount = pText-&gt;GetVertexCount();\r\n\u00a0\u00a0 \u00a0size_t iIndexCount = pText-&gt;GetIndexCount();\r\n\r\n\u00a0\u00a0 \u00a0D3D10_RENDERER-&gt;GetDevice()-&gt;IASetVertexBuffers(0, 1, &amp;pVertexBuffer, &amp;iStride, &amp;iOffset);\r\n\u00a0\u00a0 \u00a0D3D10_RENDERER-&gt;GetDevice()-&gt;IASetIndexBuffer(pIndexBuffer, DXGI_FORMAT_R16_UINT, 0);\r\n\u00a0\u00a0 \u00a0D3D10_RENDERER-&gt;GetDevice()-&gt;IASetPrimitiveTopology(D3D10_PRIMITIVE_TOPOLOGY_TRIANGLELIST);\r\n\r\n\u00a0\u00a0 \u00a0ID3D10ShaderResourceView* pRV = pText-&gt;GetFont()-&gt;texturesArray;\r\n\r\n\u00a0\u00a0 \u00a0if (pRV)\r\n\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0m_pBitmapVariable-&gt;SetResource(pRV);\r\n\u00a0\u00a0 \u00a0}\r\n\r\n\u00a0\u00a0 \u00a0D3D10_TECHNIQUE_DESC techniqueDesc;\r\n\u00a0\u00a0 \u00a0D3D10_RENDERER-&gt;GetDevice()-&gt;IASetInputLayout(m_pVertexLayout);\r\n\r\n\u00a0\u00a0 \u00a0m_pTechnique-&gt;GetDesc(&amp;techniqueDesc);\r\n\r\n\u00a0\u00a0 \u00a0AlphaPass TransparencyPass;\r\n\r\n\u00a0\u00a0 \u00a0for (uint32 i = 0; i &lt; techniqueDesc.Passes; i++)\r\n\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0m_pTechnique-&gt;GetPassByIndex(i)-&gt;Apply(0);\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0D3D10_RENDERER-&gt;GetDevice()-&gt;Draw(iVertexCount, 0);\r\n\u00a0\u00a0 \u00a0}\r\n\r\n\u00a0\u00a0 \u00a0D3D10_RENDERER-&gt;EnableZBuffer(true);\r\n}\r\n\r\nText* FontTextManager::CreateText(const std::wstring&amp; sText, const std::string&amp; sFontTextName,\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0 const float fPosX, const float fPosY, const D3DXCOLOR&amp; color)\r\n{\r\n\u00a0\u00a0 \u00a0Text* pText = new Text(sText, color, fPosX, fPosY);\r\n\r\n\u00a0\u00a0 \u00a0if (!IsFontTextLoaded(sFontTextName)) \/\/ todo : add dummy text\r\n\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0PRINT_ERROR(&quot;Police de caractere non reconnu&quot;);\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0return nullptr;\r\n\u00a0\u00a0 \u00a0}\r\n\r\n\u00a0\u00a0 \u00a0pText-&gt;SetFont(m_fonts[sFontTextName]);\r\n\r\n\u00a0\u00a0 \u00a0if (!BuildTextBuffers(pText))\r\n\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0PRINT_ERROR(&quot;Echec lors du la construction des buffers d'un texte speficie&quot;);\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0return nullptr;\r\n\u00a0\u00a0 \u00a0}\r\n\r\n\u00a0\u00a0 \u00a0return pText;\r\n}\r\n\r\n\/* Voir la documentation sur\r\n\u00a0\u00a0 \u00a0http:\/\/www.angelcode.com\/products\/bmfont\/doc\/file_format.html\r\n*\/\r\nbool FontTextManager::LoadFontTextFile(const std::string&amp; sFileName, const std::string&amp; sFontTextName)\r\n{\r\n\u00a0\u00a0 \u00a0std::vector&lt;ID3D10Texture2D*&gt; textures;\r\n\r\n\u00a0\u00a0 \u00a0std::string sLine;\r\n\u00a0\u00a0 \u00a0std::string sRead, sKey, sValue;\r\n\r\n\u00a0\u00a0 \u00a0std::ifstream file(sFileName);\r\n\r\n\u00a0\u00a0 \u00a0if (!file.is_open())\r\n\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0PRINT_ERROR(&quot;Impossible de charger un fichier font&quot;);\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0return false;\r\n\u00a0\u00a0 \u00a0}\r\n\r\n\u00a0\u00a0 \u00a0std::string sBitmapFileName = &quot;&quot;;\r\n\r\n\u00a0\u00a0 \u00a0FontTextFileCharacter* aCharacters = new FontTextFileCharacter[256];\r\n\r\n\u00a0\u00a0 \u00a0Font* pFont = new Font;\r\n\u00a0\u00a0 \u00a0pFont-&gt;sFontTextName = sFontTextName;\r\n\u00a0\u00a0 \u00a0pFont-&gt;aCharacters = aCharacters;\r\n\r\n\u00a0\u00a0 \u00a0while (!file.eof())\r\n\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0std::stringstream sLineStream;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0std::getline( file, sLine );\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0sLineStream &lt;&lt; sLine;\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\/\/ Lit le type de la ligne\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0sLineStream &gt;&gt; sRead;\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0if (sRead == &quot;info&quot;)\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0while (!sLineStream.eof())\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0std::stringstream Converter;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0sLineStream &gt;&gt; sRead;\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0uint32 i = sRead.find('=');\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0sKey = sRead.substr(0, i);\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0sValue = sRead.substr(i + 1);\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0Converter &lt;&lt; sValue;\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0if (sKey == &quot;size&quot;)\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0Converter &gt;&gt; pFont-&gt;iSize;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0}\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0}\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0}\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0else if (sRead == &quot;common&quot;)\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0while (!sLineStream.eof())\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0std::stringstream Converter;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0sLineStream &gt;&gt; sRead;\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0uint32 i = sRead.find('=');\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0sKey = sRead.substr(0, i);\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0sValue = sRead.substr(i + 1);\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0Converter &lt;&lt; sValue;\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0if (sKey == &quot;lineHeight&quot;)\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0Converter &gt;&gt; pFont-&gt;iLineHeight;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0}\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0else if (sKey == &quot;base&quot;)\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0Converter &gt;&gt; pFont-&gt;iBase;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0}\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0else if (sKey == &quot;scaleW&quot;)\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0Converter &gt;&gt; pFont-&gt;iWidth;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0}\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0else if (sKey == &quot;scaleH&quot;)\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0Converter &gt;&gt; pFont-&gt;iHeight;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0}\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0else if (sKey == &quot;pages&quot;)\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0Converter &gt;&gt; pFont-&gt;iPagesCount;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0}\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0}\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0}\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0else if (sRead == &quot;page&quot;)\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0while (!sLineStream.eof())\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0std::stringstream Converter;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0sLineStream &gt;&gt; sRead;\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0uint32 i = sRead.find('=');\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0sKey = sRead.substr(0, i);\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0sValue = sRead.substr(i + 1);\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0Converter &lt;&lt; sValue;\r\n\u00a0\u00a0 \u00a0\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0if (sKey == &quot;file&quot;)\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0Converter &gt;&gt; sBitmapFileName;\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\/\/ On supprime les guillemets entre le nom du fichier\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0sBitmapFileName.pop_back();\u00a0\u00a0 \u00a0\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0sBitmapFileName.erase(0, 1);\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0fastprint(&quot;Chargement de &quot; &lt;&lt; sBitmapFileName &lt;&lt; &quot; pour &quot; &lt;&lt; pFont-&gt;sFontTextName);\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0ID3D10Texture2D* pTexture = CreateTexture(sBitmapFileName);\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0if (pTexture)\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0textures.push_back(pTexture);\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0}\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0}\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0}\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0}\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0else if (sRead == &quot;char&quot;)\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0uint16 iCharID = 0;\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0while (!sLineStream.eof())\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0std::stringstream Converter;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0sLineStream &gt;&gt; sRead;\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0uint32 i = sRead.find('=');\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0sKey = sRead.substr(0, i);\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0sValue = sRead.substr(i + 1);\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0Converter &lt;&lt; sValue;\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0if (sKey == &quot;id&quot;)\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0Converter &gt;&gt; iCharID;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0}\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0else if (sKey == &quot;x&quot;)\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0Converter &gt;&gt; pFont-&gt;aCharacters[iCharID].iXPos;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0}\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0else if (sKey == &quot;y&quot; )\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0Converter &gt;&gt; pFont-&gt;aCharacters[iCharID].iYPos;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0}\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0else if (sKey == &quot;width&quot;)\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0Converter &gt;&gt; pFont-&gt;aCharacters[iCharID].iWidth;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0}\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0else if (sKey == &quot;height&quot;)\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0Converter &gt;&gt; pFont-&gt;aCharacters[iCharID].iHeight;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0}\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0else if (sKey == &quot;xoffset&quot;)\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0Converter &gt;&gt; pFont-&gt;aCharacters[iCharID].iXOffset;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0}\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0else if (sKey == &quot;yoffset&quot;)\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0Converter &gt;&gt; pFont-&gt;aCharacters[iCharID].iYOffset;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0}\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0else if (sKey == &quot;xadvance&quot;)\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0Converter &gt;&gt; pFont-&gt;aCharacters[iCharID].iXAdvance;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0}\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0else if (sKey == &quot;page&quot;)\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0Converter &gt;&gt; pFont-&gt;aCharacters[iCharID].iPage;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0}\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0}\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0}\r\n\u00a0\u00a0 \u00a0}\r\n\u00a0\u00a0 \u00a0\r\n\u00a0\u00a0 \u00a0m_fonts[sFontTextName] = pFont;\r\n\r\n\u00a0\u00a0 \u00a0debugprint(pFont-&gt;sFontTextName.c_str());\r\n\u00a0\u00a0 \u00a0debugprint(pFont-&gt;iBase);\r\n\u00a0\u00a0 \u00a0debugprint(pFont-&gt;iHeight);\r\n\u00a0\u00a0 \u00a0debugprint(pFont-&gt;iLineHeight);\r\n\u00a0\u00a0 \u00a0debugprint(pFont-&gt;iPagesCount);\r\n\u00a0\u00a0 \u00a0debugprint(pFont-&gt;iWidth);\r\n\r\n\u00a0\u00a0 \u00a0if (textures.size() == 0)\r\n\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0PRINT_ERROR(&quot;Aucune textures chargees&quot;);\r\n\u00a0\u00a0 \u00a0}\r\n\r\n\u00a0\u00a0 \u00a0fastprint(&quot;\\n---------------------------\\n&quot;);\r\n\r\n\u00a0\u00a0 \u00a0ID3D10Texture2D* pTextureArray = CreateTextureArray(textures);\r\n\r\n\u00a0\u00a0 \u00a0for (uint32 i = 0; i &lt; textures.size(); i++)\r\n\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0ID3D10Texture2D* pCurrentTexture = textures[i];\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0SAFE_RELEASE(pCurrentTexture);\r\n\u00a0\u00a0 \u00a0}\r\n\r\n\u00a0\u00a0 \u00a0ID3D10ShaderResourceView* pRVArray = GetTextureRVArray(pTextureArray);\r\n\r\n\u00a0\u00a0 \u00a0SAFE_RELEASE(pTextureArray);\r\n\r\n\u00a0\u00a0 \u00a0pFont-&gt;texturesArray = pRVArray;\r\n\r\n\u00a0\u00a0 \u00a0return true;\r\n}\r\n\r\nfloat FontTextManager::GetGlyphAspectRatio(const wchar_t* c, const std::string&amp; sFontTextName)\r\n{\r\n\u00a0\u00a0 \u00a0\/\/ On obtient la police sp\u00e9cifi\u00e9e\r\n\u00a0\u00a0 \u00a0Font* pFont = m_fonts[sFontTextName];\r\n\r\n\u00a0\u00a0 \u00a0if (pFont)\r\n\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0return 0;\r\n\u00a0\u00a0 \u00a0}\r\n\r\n\u00a0\u00a0 \u00a0\/\/ Tableau de tous les caract\u00e8res de la police de font\r\n\u00a0\u00a0 \u00a0FontTextFileCharacter* aCharacters = pFont-&gt;aCharacters;\r\n\r\n\u00a0\u00a0 \u00a0FontTextFileCharacter character = aCharacters[(uint32)c];\r\n\r\n\u00a0\u00a0 \u00a0uint32 iWidth = character.iWidth;\r\n\u00a0\u00a0 \u00a0uint32 iHeight = character.iHeight;\r\n\r\n\u00a0\u00a0 \u00a0return (float) (iWidth \/ iHeight);\r\n}\r\n\r\nRECT FontTextManager::GetGlyphTexCoords(const wchar_t* c, const std::string&amp; sFontTextName)\r\n{\r\n\u00a0\u00a0 \u00a0RECT rect;\r\n\u00a0\u00a0 \u00a0ZeroMemory(&amp;rect, sizeof(RECT));\r\n\r\n\u00a0\u00a0 \u00a0\/\/ On obtient la police sp\u00e9cifi\u00e9e\r\n\u00a0\u00a0 \u00a0Font* pFont = m_fonts[sFontTextName];\r\n\r\n\u00a0\u00a0 \u00a0if (!pFont)\r\n\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0return rect;\r\n\u00a0\u00a0 \u00a0}\r\n\r\n\u00a0\u00a0 \u00a0\/\/ Tableau de tous les caract\u00e8res de la police de font\r\n\u00a0\u00a0 \u00a0FontTextFileCharacter* aCharacters = pFont-&gt;aCharacters;\r\n\r\n\u00a0\u00a0 \u00a0FontTextFileCharacter character = aCharacters[(uint32)c];\r\n\r\n\u00a0\u00a0 \u00a0uint32 iCharX = character.iXPos;\r\n\u00a0\u00a0 \u00a0uint32 iCharY = character.iYPos;\r\n\u00a0\u00a0 \u00a0uint32 iWidth = character.iWidth;\r\n\u00a0\u00a0 \u00a0uint32 iHeight = character.iHeight;\r\n\r\n\u00a0\u00a0 \u00a0rect.left = iCharX;\r\n\u00a0\u00a0 \u00a0rect.top = iCharY;\r\n\u00a0\u00a0 \u00a0rect.right = iWidth;\r\n\u00a0\u00a0 \u00a0rect.bottom = iHeight;\r\n\r\n\u00a0\u00a0 \u00a0return rect;\r\n}\r\n\r\nuint16 FontTextManager::GetCharacterPage(const wchar_t* c, const std::string&amp; sFontTextName)\r\n{\r\n\u00a0\u00a0 \u00a0\/\/ On obtient la police sp\u00e9cifi\u00e9e\r\n\u00a0\u00a0 \u00a0Font* pFont = m_fonts[sFontTextName];\r\n\r\n\u00a0\u00a0 \u00a0if (!pFont)\r\n\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0return 0;\r\n\u00a0\u00a0 \u00a0}\r\n\r\n\u00a0\u00a0 \u00a0\/\/ Tableau de tous les caract\u00e8res de la police de font\r\n\u00a0\u00a0 \u00a0FontTextFileCharacter* aCharacters = pFont-&gt;aCharacters;\r\n\r\n\u00a0\u00a0 \u00a0FontTextFileCharacter character = aCharacters[(uint32)c];\r\n\r\n\u00a0\u00a0 \u00a0return character.iPage;\r\n}\r\n\r\nID3D10Texture2D* FontTextManager::CreateTexture(const std::string&amp; sBitmapFileName)\r\n{\r\n\u00a0\u00a0 \u00a0ID3D10Texture2D* pLoadedTexture = nullptr;\r\n\r\n\u00a0\u00a0 \u00a0D3DX10_IMAGE_LOAD_INFO loadinfo;\r\n\u00a0\u00a0 \u00a0ZeroMemory(&amp;loadinfo, sizeof(D3DX10_IMAGE_LOAD_INFO));\r\n\r\n\u00a0\u00a0 \u00a0loadinfo.Width = D3DX10_FROM_FILE;\r\n\u00a0\u00a0 \u00a0loadinfo.Height = D3DX10_FROM_FILE;\r\n\u00a0\u00a0 \u00a0loadinfo.Depth = D3DX10_FROM_FILE;\r\n\r\n\u00a0\u00a0 \u00a0loadinfo.FirstMipLevel = 0;\r\n\u00a0\u00a0 \u00a0loadinfo.MipLevels = D3DX10_FROM_FILE;\r\n\u00a0\u00a0 \u00a0loadinfo.Usage = D3D10_USAGE_STAGING;\r\n\r\n\u00a0\u00a0 \u00a0loadinfo.BindFlags = 0;\r\n\u00a0\u00a0 \u00a0loadinfo.CpuAccessFlags = D3D10_CPU_ACCESS_READ | D3D10_CPU_ACCESS_WRITE;\r\n\u00a0\u00a0 \u00a0loadinfo.MiscFlags = 0;\r\n\r\n\u00a0\u00a0 \u00a0loadinfo.Format = DXGI_FORMAT_R8G8B8A8_UNORM;\r\n\u00a0\u00a0 \u00a0loadinfo.Filter = D3DX10_FILTER_NONE;\r\n\u00a0\u00a0 \u00a0loadinfo.MipFilter = D3DX10_FILTER_NONE;\r\n\u00a0\u00a0 \u00a0loadinfo.pSrcInfo = 0;\r\n\r\n\u00a0\u00a0 \u00a0D3DX10CreateTextureFromFileA(D3D10_RENDERER-&gt;GetDevice(),\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0sBitmapFileName.c_str(), &amp;loadinfo, 0, (ID3D10Resource**)&amp;pLoadedTexture, 0);\r\n\r\n\u00a0\u00a0 \u00a0return pLoadedTexture;\r\n}\r\n\r\nID3D10Texture2D* FontTextManager::CreateTextureArray(std::vector&lt;ID3D10Texture2D*&gt;&amp; textures)\r\n{\r\n\u00a0\u00a0 \u00a0if (textures.size() == 0)\r\n\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0return nullptr;\r\n\u00a0\u00a0 \u00a0}\r\n\r\n\u00a0\u00a0 \u00a0ID3D10Texture2D* pTexturesArray = nullptr;\r\n\r\n\u00a0\u00a0 \u00a0D3D10_TEXTURE2D_DESC textElementDesc;\r\n\u00a0\u00a0 \u00a0ZeroMemory(&amp;textElementDesc, sizeof(D3D10_TEXTURE2D_DESC));\r\n\r\n\u00a0\u00a0 \u00a0textures[0]-&gt;GetDesc(&amp;textElementDesc);\r\n\r\n\u00a0\u00a0 \u00a0D3D10_TEXTURE2D_DESC textArrayDesc;\r\n\r\n\u00a0\u00a0 \u00a0textArrayDesc.Width = textElementDesc.Width;\r\n\u00a0\u00a0 \u00a0textArrayDesc.Height = textElementDesc.Height;\r\n\u00a0\u00a0 \u00a0textArrayDesc.MipLevels = textElementDesc.MipLevels;\r\n\u00a0\u00a0 \u00a0textArrayDesc.ArraySize = textures.size();\r\n\u00a0\u00a0 \u00a0textArrayDesc.Format = textElementDesc.Format;\r\n\u00a0\u00a0 \u00a0textArrayDesc.SampleDesc.Count = 1;\r\n\u00a0\u00a0 \u00a0textArrayDesc.SampleDesc.Quality = 0;\r\n\u00a0\u00a0 \u00a0textArrayDesc.Usage = D3D10_USAGE_DEFAULT;\r\n\u00a0\u00a0 \u00a0textArrayDesc.BindFlags = D3D10_BIND_SHADER_RESOURCE;\r\n\u00a0\u00a0 \u00a0textArrayDesc.CPUAccessFlags = 0;\r\n\u00a0\u00a0 \u00a0textArrayDesc.MiscFlags = 0;\r\n\r\n\u00a0\u00a0 \u00a0D3D10_RENDERER-&gt;GetDevice()-&gt;CreateTexture2D(&amp;textArrayDesc, 0, &amp;pTexturesArray);\r\n\r\n\u00a0\u00a0 \u00a0\/\/ On copie toutes les textures dans le tableau !\r\n\u00a0\u00a0 \u00a0for (uint16 i = 0; i &lt; textures.size(); i++)\r\n\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0for (uint16 j = 0; j &lt; textElementDesc.MipLevels; j++)\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0D3D10_MAPPED_TEXTURE2D mappedTex2D;\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0ID3D10Texture2D* pCurrentTexture = textures[i];\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0pCurrentTexture-&gt;Map(j, D3D10_MAP_READ, 0, &amp;mappedTex2D);\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0uint32 c = D3D10CalcSubresource(j, i, textElementDesc.MipLevels);\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0D3D10_RENDERER-&gt;GetDevice()-&gt;UpdateSubresource(pTexturesArray, c,\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a00, mappedTex2D.pData, mappedTex2D.RowPitch, 0);\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0pCurrentTexture-&gt;Unmap(j);\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0}\r\n\u00a0\u00a0 \u00a0}\r\n\r\n\u00a0\u00a0 \u00a0return pTexturesArray;\r\n}\r\n\r\nID3D10ShaderResourceView* FontTextManager::GetTextureRVArray(ID3D10Texture2D* pTexArray)\r\n{\r\n\u00a0\u00a0 \u00a0if (pTexArray == nullptr)\r\n\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0return nullptr;\r\n\u00a0\u00a0 \u00a0}\r\n\r\n\u00a0\u00a0 \u00a0ID3D10ShaderResourceView* pArrayRV = nullptr;\r\n\r\n\u00a0\u00a0 \u00a0D3D10_SHADER_RESOURCE_VIEW_DESC viewDesc;\r\n\u00a0\u00a0 \u00a0ZeroMemory(&amp;viewDesc, sizeof(D3D10_SHADER_RESOURCE_VIEW_DESC));\r\n\r\n\u00a0\u00a0 \u00a0D3D10_TEXTURE2D_DESC textArrayDesc;\r\n\u00a0\u00a0 \u00a0pTexArray-&gt;GetDesc(&amp;textArrayDesc);\r\n\r\n\u00a0\u00a0 \u00a0viewDesc.Format = textArrayDesc.Format;\r\n\u00a0\u00a0 \u00a0viewDesc.ViewDimension = D3D10_SRV_DIMENSION_TEXTURE2DARRAY;\r\n\u00a0\u00a0 \u00a0viewDesc.Texture1DArray.MostDetailedMip = 0;\r\n\u00a0\u00a0 \u00a0viewDesc.Texture1DArray.MipLevels = textArrayDesc.MipLevels;\r\n\u00a0\u00a0 \u00a0viewDesc.Texture1DArray.FirstArraySlice = 0;\r\n\u00a0\u00a0 \u00a0viewDesc.Texture1DArray.ArraySize = textArrayDesc.ArraySize;\r\n\r\n\u00a0\u00a0 \u00a0D3D10_RENDERER-&gt;GetDevice()-&gt;CreateShaderResourceView(pTexArray, &amp;viewDesc, &amp;pArrayRV);\r\n\r\n\u00a0\u00a0 \u00a0return pArrayRV;\r\n}\r\n\r\n<\/pre>\n<p>&nbsp;<\/p>\n<p><strong>R\u00e9sum\u00e9 :<\/strong><\/p>\n<p>Nous avons pr\u00e9senter une <strong>m\u00e9thode g\u00e9n\u00e9rique<\/strong> pour afficher du texte \u00e0 l&rsquo;\u00e9cran ! Pas besoin d&rsquo;utiliser D3DXFont !<\/p>\n<p><strong>R\u00e9f\u00e9rences :<\/strong><\/p>\n<p>&#8211; http:\/\/www.rastertek.com\/dx10tut12.html<\/p>\n<p>&#8211; http:\/\/kvazars.com\/littera\/<\/p>\n<p>&#8211; http:\/\/www.angelcode.com\/products\/bmfont\/<\/p>\n<p>&#8211; http:\/\/www.angelcode.com\/products\/bmfont\/doc\/file_format.html<\/p>\n<p>&#8211; http:\/\/www.gamedev.net\/topic\/330742-quick-tutorial-variable-width-bitmap-fonts\/<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Utilisation de BMFont : &nbsp; Intro : Pour afficher du texte dans une application DirectX il faut proc\u00e9der comme suit. Pr\u00e9requis : &#8211; Savoir initialiser DirectX 10 &#8211; Savoir comment afficher une image 2D \u00e0 l&rsquo;\u00e9cran Septi\u00e8me partie : Afficher du texte \u00e0 l&rsquo;\u00e9cran. Explications : Il vous faudra plusieurs images bitmap pour supporter les [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[9],"tags":[],"_links":{"self":[{"href":"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/index.php?rest_route=\/wp\/v2\/posts\/4469"}],"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=4469"}],"version-history":[{"count":27,"href":"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/index.php?rest_route=\/wp\/v2\/posts\/4469\/revisions"}],"predecessor-version":[{"id":5212,"href":"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/index.php?rest_route=\/wp\/v2\/posts\/4469\/revisions\/5212"}],"wp:attachment":[{"href":"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=4469"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=4469"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=4469"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}