TerraForge3D  2.3.1
3D Terrain And Landscape Generator
FoliagePlacement.cpp
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"
8#include "Platform.h"
9
10#include <glm/gtc/type_ptr.hpp>
11#include <imgui/imgui.h>
12#include <json/json.hpp>
13
14static Texture2D *LoadTextureFromFile(Texture2D *texture)
15{
16 std::string path = ShowOpenFileDialog("*.png\0*.jpg\0");
17
18 if(path.size() > 3)
19 {
20 if(texture)
21 {
22 delete texture;
23 }
24
25 return new Texture2D(path, false);
26 }
27
28 return texture;
29}
30
31FoliageItem::FoliageItem(std::string defaultTexture)
32{
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);
38}
39
40FoliageItem::~FoliageItem()
41{
42 if(albedo)
43 {
44 delete albedo;
45 }
46
47 if(ao)
48 {
49 delete ao;
50 }
51
52 if(metallic)
53 {
54 delete metallic;
55 }
56
57 if(roughness)
58 {
59 delete roughness;
60 }
61
62 if(normal)
63 {
64 delete normal;
65 }
66
67 if(model)
68 {
69 delete model;
70 }
71}
72
73
74FoliageManager::FoliageManager(ApplicationState *as)
75{
76 appState = as;
77}
78
79FoliageManager::~FoliageManager()
80{
81 for(FoliageItem *item : foliageItems)
82 {
83 delete item;
84 }
85
86 foliageItems.clear();
87}
88
89void FoliageManager::ShowSettings(bool *pOpen)
90{
91 ImGui::Begin("Foliage Manager", pOpen);
92 int id = 0;
93
94 for(FoliageItem *item : foliageItems)
95 {
96 ImGui::PushID(id++);
97 ImGui::Text("Name : %s", item->name.data());
98
99 if(ImGui::ImageButton((ImTextureID)item->albedo->GetRendererID(), ImVec2(50, 50)))
100 {
101 item->albedo = LoadTextureFromFile(item->albedo);
102 }
103
104 ImGui::SameLine();
105
106 if(ImGui::ImageButton((ImTextureID)item->normal->GetRendererID(), ImVec2(50, 50)))
107 {
108 item->normal = LoadTextureFromFile(item->normal);
109 }
110
111 ImGui::SameLine();
112
113 if(ImGui::ImageButton((ImTextureID)item->ao->GetRendererID(), ImVec2(50, 50)))
114 {
115 item->ao = LoadTextureFromFile(item->ao);
116 }
117
118 if(ImGui::ImageButton((ImTextureID)item->metallic->GetRendererID(), ImVec2(50, 50)))
119 {
120 item->metallic = LoadTextureFromFile(item->metallic);
121 }
122
123 ImGui::SameLine();
124
125 if(ImGui::ImageButton((ImTextureID)item->roughness->GetRendererID(), ImVec2(50, 50)))
126 {
127 item->roughness = LoadTextureFromFile(item->roughness);
128 }
129
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);
133 ImGui::Separator();
134 ImGui::PopID();
135 }
136
137 if(ImGui::Button("Add Item"))
138 {
139 std::string path = ShowOpenFileDialog(".obj\0.fbx\0.gltf\0");
140
141 if(path.size() > 3)
142 {
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();
148 }
149
150 else
151 {
152 Log("Invalid Path : " + path);
153 }
154 }
155
156 if(ImGui::Button("Reset Shaders"))
157 {
158 delete appState->shaders.foliage;
159 bool res = false;
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));
163 }
164
165 ImGui::End();
166}
167
168void FoliageManager::RenderFoliage(Camera &camera)
169{
170 Shader *shader = appState->shaders.foliage;
171
172 for(FoliageItem *item : foliageItems)
173 {
174 item->albedo->Bind(1);
175 shader->SetUniformi("_Albedo", 1);
176 item->ao->Bind(2);
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();
189 }
190}
191
192nlohmann::json FoliageManager::Save()
193{
194 nlohmann::json data;
195 Log("Foliage Manager does not support Save/Load yet!");
196 return data;
197}
198
199void FoliageManager::Load(nlohmann::json data)
200{
201 Log("Foliage Manager does not support Save/Load yet!");
202}
Definition: Camera.h:9
Definition: Shader.h:7
a class to store JSON values
Definition: json.hpp:17860