Vivid
Loading...
Searching...
No Matches
ModelComponent.cpp
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"
8
9#define MAX_MESHES 10
10
11Vivid::ModelComponent::ModelComponent()
12{
13 m_Meshes.reserve(MAX_MESHES);
14}
15
16void Vivid::ModelComponent::Draw(Camera* camera)
17{
18 auto component = ECS::GetComponent(ComponentType::TransformComponent, m_OwnerEntityID);
19 if (!component)
20 {
21 std::cerr << "Entity does not have a TransformComponent\n";
22 return;
23 }
24
25 int componentID = component->GetComponentID();
26 auto transformComponent = dynamic_cast<TransformComponent*>(component.get());
27 glm::mat4 transform = transformComponent->GetTransform();
28
29 for (auto& mesh : m_Meshes)
30 {
31 mesh->Update(transform);
32 mesh->Draw(camera);
33 }
34}
35
36void Vivid::ModelComponent::AddMesh(Vivid::Mesh* mesh)
37{
38 m_Meshes.push_back(mesh);
39}
40
41void Vivid::ModelComponent::RemoveMesh(Vivid::Mesh* mesh)
42{
43 m_Meshes.erase(std::remove(m_Meshes.begin(), m_Meshes.end(), mesh), m_Meshes.end());
44}
45
46void Vivid::ModelComponent::ImGuiRender()
47{
48 static ImGuiTableColumnFlags columns_base_flags = ImGuiTableColumnFlags_None;
49
50 if (ImGui::BeginTable("table_advanced", 4, 0, ImVec2(0, 0), 0))
51 {
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);
55
56 ImGui::PushButtonRepeat(true);
57 ImGuiListClipper clipper;
58 clipper.Begin(m_Meshes.size());
59 int row_minimum_height = (int)10;
60 while (clipper.Step())
61 {
62 for (int row_n = clipper.DisplayStart; row_n < clipper.DisplayEnd; row_n++)
63 {
64 if (row_n >= m_Meshes.size())
65 break;
66 Mesh* item = m_Meshes[row_n];
67 // if (!filter.PassFilter(item->Name))
68 // continue;
69
70 ImGui::PushID(item->GetID());
71 ImGui::TableNextRow(ImGuiTableRowFlags_None, row_minimum_height);
72
73 ImGui::TableSetColumnIndex(0);
74 ImGui::Text("Mesh %d", item->GetID());
75
76 if (ImGui::TableSetColumnIndex(1))
77 {
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))
80 {
81 RemoveMesh(m_Meshes[row_n]);
82 }
83 }
84
85 if (ImGui::TableSetColumnIndex(2))
86 {
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))
89 {
90 m_Meshes[row_n]->EditMesh();
91 }
92 }
93 ImGui::PopID();
94 }
95 }
96 ImGui::PopButtonRepeat();
97 ImGui::EndTable();
98
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))
101 {
102 std::string file = FileDialogue::OpenFile({}, {});
103 if (!file.empty())
104 {
105 Mesh* mesh = new Mesh(file);
106 AddMesh(mesh);
107 }
108 }
109
110 for (auto&& mesh : m_Meshes)
111 {
112 mesh->ImGuiRender();
113 }
114 }
115}
A class that represents the camera.
Definition: Camera.h:25
Contains a Mesh.
Definition: Mesh.h:32