1#include "ModelComponent.h" 
    2#include "imgui/imgui/imgui.h" 
    3#include "core/ecs/components/TransformComponent.h" 
    4#include "core/os/FileDialogue.h" 
    5#include "core/renderer/Texture.h" 
    6#include "editor/assets/Assets.h" 
    7#include "core/ecs/ECS.h" 
   11Vivid::ModelComponent::ModelComponent()
 
   13    m_Meshes.reserve(MAX_MESHES);
 
   16void Vivid::ModelComponent::Draw(
Camera* camera)
 
   18    auto component = ECS::GetComponent(ComponentType::TransformComponent, m_OwnerEntityID);
 
   21        std::cerr << 
"Entity does not have a TransformComponent\n";
 
   25    int componentID = component->GetComponentID();
 
   26    auto transformComponent = 
dynamic_cast<TransformComponent*
>(component.get());
 
   27    glm::mat4 transform = transformComponent->GetTransform();
 
   29    for (
auto& mesh : m_Meshes)
 
   31        mesh->Update(transform);
 
   36void Vivid::ModelComponent::AddMesh(
Vivid::Mesh* mesh)
 
   38    m_Meshes.push_back(mesh);
 
   41void Vivid::ModelComponent::RemoveMesh(
Vivid::Mesh* mesh)
 
   43    m_Meshes.erase(std::remove(m_Meshes.begin(), m_Meshes.end(), mesh), m_Meshes.end());
 
   46void Vivid::ModelComponent::ImGuiRender()
 
   48    static ImGuiTableColumnFlags columns_base_flags = ImGuiTableColumnFlags_None;
 
   50    if (ImGui::BeginTable(
"table_advanced", 4, 0, ImVec2(0, 0), 0))
 
   52        ImGui::TableSetupColumn(
"ID", columns_base_flags, 0.0f, 0);
 
   53        ImGui::TableSetupColumn(
"Action-Remove", columns_base_flags | ImGuiTableColumnFlags_NoSort | ImGuiTableColumnFlags_WidthFixed, 0.0f, 1);
 
   54        ImGui::TableSetupColumn(
"Action-Edit", columns_base_flags | ImGuiTableColumnFlags_NoSort | ImGuiTableColumnFlags_WidthFixed, 0.0f, 2);
 
   56        ImGui::PushButtonRepeat(
true);
 
   57        ImGuiListClipper clipper;
 
   58        clipper.Begin(m_Meshes.size());
 
   59        int row_minimum_height = (int)10;
 
   60        while (clipper.Step())
 
   62            for (
int row_n = clipper.DisplayStart; row_n < clipper.DisplayEnd; row_n++)
 
   64                if (row_n >= m_Meshes.size())
 
   66                Mesh* item = m_Meshes[row_n];
 
   70                ImGui::PushID(item->GetID());
 
   71                ImGui::TableNextRow(ImGuiTableRowFlags_None, row_minimum_height);
 
   73                ImGui::TableSetColumnIndex(0);
 
   74                ImGui::Text(
"Mesh %d", item->GetID());
 
   76                if (ImGui::TableSetColumnIndex(1))
 
   78                    if (ImGui::ImageButton((ImTextureID)VividGui::Assets::GetInstance()->GetTexMinus()->GetRendererID(), ImVec2(10, 10),
 
   79                            ImVec2(0.25, 0.25), ImVec2(0.75, 0.75), 2))
 
   81                        RemoveMesh(m_Meshes[row_n]);
 
   85                if (ImGui::TableSetColumnIndex(2))
 
   87                    if (ImGui::ImageButton((ImTextureID)VividGui::Assets::GetInstance()->GetTexEdit()->GetRendererID(), ImVec2(10, 10),
 
   88                            ImVec2(0.25, 0.25), ImVec2(0.75, 0.75), 2))
 
   90                        m_Meshes[row_n]->EditMesh();
 
   96        ImGui::PopButtonRepeat();
 
   99        if (ImGui::ImageButton((ImTextureID)VividGui::Assets::GetInstance()->GetTexPlus()->GetRendererID(), ImVec2(10, 10),
 
  100                ImVec2(0.25, 0.25), ImVec2(0.75, 0.75), 2))
 
  102            std::string file = FileDialogue::OpenFile({}, {});
 
  105                Mesh* mesh = 
new Mesh(file);
 
  110        for (
auto&& mesh : m_Meshes)
 
A class that represents the camera.