//+------------------------------------------------------------------+ //| DXMesh.mqh | //| Copyright 2000-2025, MetaQuotes Ltd. | //| https://www.mql5.com | //+------------------------------------------------------------------+ #property copyright "Copyright 2000-2025, MetaQuotes Ltd." #property link "https://www.mql5.com" #include "DXObject.mqh" #include "DXDispatcher.mqh" #include "DXData.mqh" #include "DXUtils.mqh" //+------------------------------------------------------------------+ //| DX simple mesh object with default shader | //+------------------------------------------------------------------+ class CDXMesh : public CDXObject { protected: //--- DX resources CDXVertexBuffer* m_buffer_vertex; CDXIndexBuffer* m_buffer_index; CDXInput* m_buffer_object; CDXInput* m_buffer_scene; CDXShader* m_shader_vertex; CDXShader* m_shader_pixel; CDXTexture* m_texture; //--- object data DXMatrix m_transform_matrix; DXColor m_diffuse_color; DXColor m_emission_color; DXColor m_specular_color; float m_specular_power; ENUM_DX_PRIMITIVE_TOPOLOGY m_topology; public: //+------------------------------------------------------------------+ //| Constructor | //+------------------------------------------------------------------+ CDXMesh(void):m_buffer_vertex(NULL),m_buffer_index(NULL),m_buffer_object(NULL),m_buffer_scene(NULL),m_shader_vertex(NULL),m_shader_pixel(NULL),m_topology(WRONG_VALUE) { } //+------------------------------------------------------------------+ //| Destructor | //+------------------------------------------------------------------+ ~CDXMesh(void) { Shutdown(); } //+------------------------------------------------------------------+ //| Create mesh object from vertices and indices list | //+------------------------------------------------------------------+ bool Create(CDXDispatcher &dispatcher,CDXInput* buffer_scene,const DXVertex &vertices[],const uint &indices[],ENUM_DX_PRIMITIVE_TOPOLOGY topology=DX_PRIMITIVE_TOPOLOGY_TRIANGLELIST) { Shutdown(); //--- check data if(buffer_scene==NULL || buffer_scene.Handle()==INVALID_HANDLE || ArraySize(vertices)<1 || ArraySize(indices)<1) return(false); //--- update context m_context=dispatcher.DXContext(); //--- initialize default parameters DXMatrixIdentity(m_transform_matrix); m_diffuse_color =DXColor(1.0,1.0,1.0,1.0); m_emission_color=DXColor(0.0,0.0,0.0,0.0); m_specular_color=DXColor(0.0,0.0,0.0,0.0); m_specular_power=16.0f; //--- create object input m_buffer_object=dispatcher.InputCreate(); if(m_buffer_object!=NULL) { m_buffer_object.AddRef(); //--- use default vertex shader m_shader_vertex=dispatcher.ShaderCreateDefault(DX_SHADER_VERTEX); if(m_shader_vertex!=NULL) { m_shader_vertex.AddRef(); //--- use default pixel shader m_shader_pixel=dispatcher.ShaderCreateDefault(DX_SHADER_PIXEL); if(m_shader_pixel!=NULL) { m_shader_pixel.AddRef(); //--- create vertex buffer m_buffer_vertex=dispatcher.VertexBufferCreate(vertices); if(m_buffer_vertex!=NULL) { m_buffer_vertex.AddRef(); //--- create index buffer m_buffer_index=dispatcher.IndexBufferCreate(indices); if(m_buffer_index!=NULL) m_buffer_index.AddRef(); } } } } //--- set object buffer to shaders if(m_buffer_object==NULL || m_shader_vertex==NULL || m_shader_pixel==NULL || m_buffer_vertex==NULL || m_buffer_index==NULL) { Shutdown(); return(false); } //--- save scene buffer m_buffer_scene=buffer_scene; m_buffer_scene.AddRef(); //--- save topology m_topology=topology; //--- return(true); } //+------------------------------------------------------------------+ //| Create mesh object from OBJ mesh file | //+------------------------------------------------------------------+ bool Create(CDXDispatcher &dispatcher,CDXInput* buffer_scene,string obj_path,float scale=1.0f,bool inverse_winding=false) { DXVertex vertices[]; uint indices[]; //--- load model if(!DXLoadObjModel(obj_path,vertices,indices,scale)) return(false); //--- set white vertices color DXColor white=DXColor(1.0f,1.0f,1.0f,1.0f); int count=ArraySize(vertices); for(int i=0; i