1#include "Foliage/FoliagePlacement.h"
2#include "Utils/Utils.h"
3#include "Base/ModelImporter.h"
4#include "Base/Shader.h"
5#include "Base/Texture2D.h"
6#include "Data/ProjectData.h"
7#include "Data/ApplicationState.h"
10#include <glm/gtc/type_ptr.hpp>
11#include <imgui/imgui.h>
12#include <json/json.hpp>
16 std::string path = ShowOpenFileDialog(
"*.png\0*.jpg\0");
31FoliageItem::FoliageItem(std::string defaultTexture)
33 albedo =
new Texture2D(defaultTexture,
false);
34 ao =
new Texture2D(defaultTexture,
false);
35 metallic =
new Texture2D(defaultTexture,
false);
36 roughness =
new Texture2D(defaultTexture,
false);
37 normal =
new Texture2D(defaultTexture,
false);
40FoliageItem::~FoliageItem()
79FoliageManager::~FoliageManager()
89void FoliageManager::ShowSettings(
bool *pOpen)
91 ImGui::Begin(
"Foliage Manager", pOpen);
97 ImGui::Text(
"Name : %s", item->name.data());
99 if(ImGui::ImageButton((ImTextureID)item->albedo->GetRendererID(), ImVec2(50, 50)))
101 item->albedo = LoadTextureFromFile(item->albedo);
106 if(ImGui::ImageButton((ImTextureID)item->normal->GetRendererID(), ImVec2(50, 50)))
108 item->normal = LoadTextureFromFile(item->normal);
113 if(ImGui::ImageButton((ImTextureID)item->ao->GetRendererID(), ImVec2(50, 50)))
115 item->ao = LoadTextureFromFile(item->ao);
118 if(ImGui::ImageButton((ImTextureID)item->metallic->GetRendererID(), ImVec2(50, 50)))
120 item->metallic = LoadTextureFromFile(item->metallic);
125 if(ImGui::ImageButton((ImTextureID)item->roughness->GetRendererID(), ImVec2(50, 50)))
127 item->roughness = LoadTextureFromFile(item->roughness);
130 ImGui::DragFloat3(
"Position##FItem", glm::value_ptr(item->model->position), 0.1f);
131 ImGui::DragFloat3(
"Rotation##FItem", glm::value_ptr(item->model->rotation), 0.1f);
132 ImGui::DragFloat3(
"Scale##FItem", glm::value_ptr(item->model->scale), 0.1f);
137 if(ImGui::Button(
"Add Item"))
139 std::string path = ShowOpenFileDialog(
".obj\0.fbx\0.gltf\0");
143 foliageItems.push_back(
new FoliageItem(appState->constants.texturesDir + PATH_SEPARATOR
"white.png"));
144 foliageItems.back()->name = path.substr(path.find(PATH_SEPARATOR) + 1);
145 foliageItems.back()->model = LoadModel(path);
146 foliageItems.back()->model->SetupMeshOnGPU();
147 foliageItems.back()->model->UploadToGPU();
152 Log(
"Invalid Path : " + path);
156 if(ImGui::Button(
"Reset Shaders"))
158 delete appState->shaders.foliage;
160 appState->shaders.foliage =
new Shader(ReadShaderSourceFile(appState->constants.shadersDir + PATH_SEPARATOR
"foliage" PATH_SEPARATOR
"vert.glsl", &res),
161 ReadShaderSourceFile(appState->constants.shadersDir + PATH_SEPARATOR
"foliage" PATH_SEPARATOR
"frag.glsl", &res),
162 ReadShaderSourceFile(appState->constants.shadersDir + PATH_SEPARATOR
"foliage" PATH_SEPARATOR
"geom.glsl", &res));
168void FoliageManager::RenderFoliage(
Camera &camera)
170 Shader *shader = appState->shaders.foliage;
174 item->albedo->Bind(1);
175 shader->SetUniformi(
"_Albedo", 1);
177 shader->SetUniformi(
"_AO", 2);
178 item->metallic->Bind(3);
179 shader->SetUniformi(
"_Metallic", 3);
180 item->roughness->Bind(4);
181 shader->SetUniformi(
"_Roughness", 4);
182 item->normal->Bind(5);
183 shader->SetUniformi(
"_Normal", 5);
184 item->model->Update();
185 glm::mat4 temp = camera.pv * item->model->modelMatrix;
186 shader->SetMPV(temp);
187 shader->SetUniformMat4(
"_Model", item->model->modelMatrix);
188 item->model->Render();
195 Log(
"Foliage Manager does not support Save/Load yet!");
201 Log(
"Foliage Manager does not support Save/Load yet!");
a class to store JSON values