Skip to content

Commit b9356c7

Browse files
committed
refactor
1 parent 32172dc commit b9356c7

13 files changed

+108
-154
lines changed

.gitignore

+1
Original file line numberDiff line numberDiff line change
@@ -36,4 +36,5 @@
3636
# *.ini
3737

3838
# cmake
39+
.vs
3940
build

CMakeLists.txt

+4-37
Original file line numberDiff line numberDiff line change
@@ -74,53 +74,20 @@ include_directories(
7474
# Define the link libraries
7575
target_link_libraries(${PROJECT_NAME} ${LIBS})
7676

77-
# Create virtual folders to make it look nicer in VS
78-
if(MSVC_IDE)
79-
# Macro to preserve source files hierarchy in the IDE
80-
macro(GroupSources curdir)
81-
file(GLOB children RELATIVE ${PROJECT_SOURCE_DIR}/${curdir} ${PROJECT_SOURCE_DIR}/${curdir}/*)
82-
83-
foreach(child ${children})
84-
if(IS_DIRECTORY ${PROJECT_SOURCE_DIR}/${curdir}/${child})
85-
GroupSources(${curdir}/${child})
86-
else()
87-
string(REPLACE "/" "\\" groupname ${curdir})
88-
string(REPLACE "src" "Sources" groupname ${groupname})
89-
source_group(${groupname} FILES ${PROJECT_SOURCE_DIR}/${curdir}/${child})
90-
endif()
91-
endforeach()
92-
endmacro()
93-
94-
# Run macro
95-
GroupSources(src)
96-
endif()
97-
98-
# Copy dlls
9977
if(WIN32)
78+
# Copy dlls
10079
add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD
10180
COMMAND ${CMAKE_COMMAND} -E copy_directory
10281
"${PROJECT_SOURCE_DIR}/dlls"
10382
$<TARGET_FILE_DIR:${PROJECT_NAME}>)
104-
endif()
10583

106-
# Copy resources
107-
if(WIN32)
108-
add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD
109-
COMMAND ${CMAKE_COMMAND} -E copy_directory
110-
"${PROJECT_SOURCE_DIR}/res"
111-
$<TARGET_FILE_DIR:${PROJECT_NAME}>/res)
84+
# Copy resources
11285
add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD
11386
COMMAND ${CMAKE_COMMAND} -E copy_directory
11487
"${PROJECT_SOURCE_DIR}/res"
11588
"${CMAKE_BINARY_DIR}/res")
116-
endif()
117-
118-
# Copy imgui config
119-
if(WIN32)
120-
add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD
121-
COMMAND ${CMAKE_COMMAND} -E copy
122-
"${PROJECT_SOURCE_DIR}/imgui.ini"
123-
$<TARGET_FILE_DIR:${PROJECT_NAME}>/imgui.ini)
89+
90+
# Copy imgui config
12491
add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD
12592
COMMAND ${CMAKE_COMMAND} -E copy
12693
"${PROJECT_SOURCE_DIR}/imgui.ini"

src/Application.cpp

+39-39
Original file line numberDiff line numberDiff line change
@@ -29,19 +29,19 @@ void Application::DrawMenu()
2929
{
3030
if (ImGui::MenuItem("Plane"))
3131
{
32-
node_clicked = scene->AddPrimitive("plane");
32+
node_clicked = scene.AddPrimitive("plane");
3333
}
3434
if (ImGui::MenuItem("Cube"))
3535
{
36-
node_clicked = scene->AddPrimitive("cube");
36+
node_clicked = scene.AddPrimitive("cube");
3737
}
3838
if (ImGui::MenuItem("Sphere"))
3939
{
40-
node_clicked = scene->AddPrimitive("sphere");
40+
node_clicked = scene.AddPrimitive("sphere");
4141
}
4242
if (ImGui::MenuItem("Cylinder"))
4343
{
44-
node_clicked = scene->AddPrimitive("cylinder");
44+
node_clicked = scene.AddPrimitive("cylinder");
4545
}
4646
if (ImGui::MenuItem("Custom"))
4747
{
@@ -54,9 +54,9 @@ void Application::DrawMenu()
5454
{
5555
if (ImGui::MenuItem("Directional Light"))
5656
{
57-
DirectionalLight* dir = new DirectionalLight();
58-
strcpy(dir->name, "directional light");
59-
node_clicked = scene->AddObject(dir);
57+
std::shared_ptr<DirectionalLight> dirLight = std::make_shared<DirectionalLight>();
58+
strcpy(dirLight->name, "directional light");
59+
node_clicked = scene.AddObject(dirLight);
6060
}
6161
ImGui::EndMenu();
6262
}
@@ -84,8 +84,8 @@ void Application::DrawInspector()
8484

8585
if (node_clicked != -1)
8686
{
87-
Object* object = scene->objects[node_clicked];
88-
87+
std::shared_ptr<Object> object = scene.objects[node_clicked];
88+
8989
ImGui::Checkbox("##isEnabled", &object->isEnabled);
9090
ImGui::SameLine();
9191
ImGui::InputText("##name", object->name, IM_ARRAYSIZE(object->name));
@@ -98,7 +98,7 @@ void Application::DrawInspector()
9898

9999
if (object->GetType() == Type_Light)
100100
{
101-
Light* light = (Light*)object;
101+
std::shared_ptr<Light> light = std::dynamic_pointer_cast<Light>(object);
102102

103103
ImGui::Text("------------Light------------");
104104

@@ -127,9 +127,9 @@ void Application::DrawHierarchy()
127127
static ImGuiTreeNodeFlags base_flags = ImGuiTreeNodeFlags_OpenOnArrow | ImGuiTreeNodeFlags_OpenOnDoubleClick | ImGuiTreeNodeFlags_SpanAvailWidth;
128128

129129
static int selection_mask = 0;
130-
for (int i = 0; i < scene->objects.size(); i++)
130+
for (int i = 0; i < scene.objects.size(); i++)
131131
{
132-
Object* object = scene->objects[i];
132+
std::shared_ptr<Object> object = scene.objects[i];
133133
ImGuiTreeNodeFlags node_flags = base_flags;
134134
const bool is_selected = (selection_mask & (1 << i)) != 0;
135135
if (is_selected)
@@ -159,7 +159,7 @@ void Application::DrawHierarchy()
159159

160160
if (ImGui::IsKeyPressed(ImGui::GetKeyIndex(ImGuiKey_Delete)))
161161
{
162-
scene->RemoveObject(node_clicked);
162+
scene.RemoveObject(node_clicked);
163163
node_clicked = -1;
164164
}
165165
}
@@ -182,9 +182,9 @@ void Application::DrawGizmo()
182182
float windowHeight = (float)ImGui::GetWindowHeight();
183183
ImGuizmo::SetRect(ImGui::GetWindowPos().x, ImGui::GetWindowPos().y, windowWidth, windowHeight);
184184

185-
Object* object = scene->objects[node_clicked];
185+
std::shared_ptr<Object> object = scene.objects[node_clicked];
186186

187-
ImGuizmo::Manipulate(glm::value_ptr(scene->camera->view), glm::value_ptr(scene->camera->projection),
187+
ImGuizmo::Manipulate(glm::value_ptr(scene.camera.view), glm::value_ptr(scene.camera.projection),
188188
(ImGuizmo::OPERATION)gizmoType, ImGuizmo::LOCAL, glm::value_ptr(object->objectToWorld));
189189

190190
if (ImGuizmo::IsUsing())
@@ -214,19 +214,19 @@ void Application::ClickToSelect()
214214
ScreenPosToWorldRay(
215215
mouse.x, mouse.y,
216216
viewport.x, viewport.y,
217-
camera->view,
218-
camera->projection,
217+
camera.view,
218+
camera.projection,
219219
ray_origin,
220220
ray_direction
221221
);
222222

223223
node_clicked = -1;
224-
for (int i = 0; i < scene->objects.size(); i++)
224+
for (int i = 0; i < scene.objects.size(); i++)
225225
{
226-
Object* object = scene->objects[i];
226+
std::shared_ptr<Object> object = scene.objects[i];
227227
if (object->GetType() == Type_Mesh)
228228
{
229-
Mesh* mesh = (Mesh*)object;
229+
std::shared_ptr<Mesh> mesh = std::dynamic_pointer_cast<Mesh>(object);
230230

231231
float intersection_distance; // Output of TestRayOBBIntersection()
232232

@@ -262,15 +262,15 @@ void Application::DrawScene()
262262
viewport = ImGui::GetWindowSize();
263263
windowPos = ImGui::GetWindowPos();
264264

265-
scene->camera->windowPos = glm::vec2(windowPos.x, windowPos.y);
266-
scene->camera->viewport = glm::vec2(viewport.x, viewport.y);
267-
openglRenderer->viewport = glm::vec2(viewport.x, viewport.y);
265+
scene.camera.windowPos = glm::vec2(windowPos.x, windowPos.y);
266+
scene.camera.viewport = glm::vec2(viewport.x, viewport.y);
267+
openglRenderer.viewport = glm::vec2(viewport.x, viewport.y);
268268

269269
// Because I use the texture from OpenGL, I need to invert the V from the UV.
270270
if (postprocess)
271-
ImGui::Image((ImTextureID)(intptr_t)openglRenderer->outlineRT, viewport, ImVec2(0, 1), ImVec2(1, 0));
271+
ImGui::Image((ImTextureID)(intptr_t)openglRenderer.outlineRT, viewport, ImVec2(0, 1), ImVec2(1, 0));
272272
else
273-
ImGui::Image((ImTextureID)(intptr_t)openglRenderer->renderTexture, viewport, ImVec2(0, 1), ImVec2(1, 0));
273+
ImGui::Image((ImTextureID)(intptr_t)openglRenderer.renderTexture, viewport, ImVec2(0, 1), ImVec2(1, 0));
274274

275275
ClickToSelect();
276276

@@ -288,13 +288,13 @@ void Application::DrawSceneCamera()
288288
{
289289
ImGui::Begin("Scene Camera", &showSceneCamera);
290290

291-
ImGui::InputFloat3("Position", (float*)&camera->Position);
292-
ImGui::InputFloat("Move Speed", (float*)&camera->speed);
293-
ImGui::InputFloat("Sensitivity", (float*)&camera->sensitivity);
294-
ImGui::InputFloat("Pan Speed", (float*)&camera->scenePanSpeed);
295-
ImGui::InputFloat("Scroll Speed", (float*)&camera->sceneScrollSpeed);
291+
ImGui::InputFloat3("Position", (float*)&camera.Position);
292+
ImGui::InputFloat("Move Speed", (float*)&camera.speed);
293+
ImGui::InputFloat("Sensitivity", (float*)&camera.sensitivity);
294+
ImGui::InputFloat("Pan Speed", (float*)&camera.scenePanSpeed);
295+
ImGui::InputFloat("Scroll Speed", (float*)&camera.sceneScrollSpeed);
296296

297-
ImGui::ColorEdit3("Background", (float*)&camera->clearColor);
297+
ImGui::ColorEdit3("Background", (float*)&camera.clearColor);
298298

299299
ImGui::Checkbox("Post Process", &postprocess);
300300

@@ -308,7 +308,7 @@ void Application::DrawImage()
308308
{
309309
ImGui::SetNextWindowSize(window_size);
310310
ImGui::Begin("Render Result", &showImage);
311-
ImGui::Image((ImTextureID)(intptr_t)rasterizerRenderer->renderTexture, content_size);
311+
ImGui::Image((ImTextureID)(intptr_t)rasterizerRenderer.renderTexture, content_size);
312312
ImGui::End();
313313
}
314314
}
@@ -319,20 +319,20 @@ void Application::DrawRasterizer()
319319
{
320320
ImGui::Begin("Rasterizer", &showRasterizer);
321321

322-
ImGui::InputInt2("Size", (int*)&rasterizerRenderer->viewport);
322+
ImGui::InputInt2("Size", (int*)&rasterizerRenderer.viewport);
323323
ImGui::SameLine();
324324
if (ImGui::Button("Sync"))
325325
{
326-
rasterizerRenderer->viewport.x = viewport.x;
327-
rasterizerRenderer->viewport.y = viewport.y;
326+
rasterizerRenderer.viewport.x = viewport.x;
327+
rasterizerRenderer.viewport.y = viewport.y;
328328
}
329329

330330
if (ImGui::Button("rasterizer render"))
331331
{
332-
window_size = ImVec2(rasterizerRenderer->viewport.x + 20, rasterizerRenderer->viewport.y + 35);
333-
content_size = ImVec2(rasterizerRenderer->viewport.x, rasterizerRenderer->viewport.y);
332+
window_size = ImVec2(rasterizerRenderer.viewport.x + 20, rasterizerRenderer.viewport.y + 35);
333+
content_size = ImVec2(rasterizerRenderer.viewport.x, rasterizerRenderer.viewport.y);
334334

335-
rasterizerRenderer->Render(*scene);
335+
rasterizerRenderer.Render(scene);
336336

337337
showImage = true;
338338
}
@@ -353,7 +353,7 @@ void Application::DrawCustomMeshPopup()
353353

354354
if (ImGui::Button("Ok"))
355355
{
356-
node_clicked = scene->AddPrimitive(customMeshName);
356+
node_clicked = scene.AddPrimitive(customMeshName);
357357
strcpy(customMeshName, "");
358358
showCustomMeshPopup = false;
359359
}

src/Application.h

+7-12
Original file line numberDiff line numberDiff line change
@@ -22,14 +22,9 @@
2222
class Application
2323
{
2424
public:
25-
Application(Camera* camera, Scene* scene, ImGuiIO* io, OpenGLRenderer* openglRenderer, RasterizerRenderer* rasterizerRenderer)
25+
Application(Camera &camera, Scene &scene, ImGuiIO &io, OpenGLRenderer &openglRenderer, RasterizerRenderer &rasterizerRenderer)
26+
: camera(camera), scene(scene), io(io), openglRenderer(openglRenderer), rasterizerRenderer(rasterizerRenderer)
2627
{
27-
Application::camera = camera;
28-
Application::scene = scene;
29-
Application::io = io;
30-
Application::openglRenderer = openglRenderer;
31-
Application::rasterizerRenderer = rasterizerRenderer;
32-
3328
strcpy(customMeshName, "");
3429
}
3530

@@ -48,11 +43,11 @@ class Application
4843
void ClickToSelect();
4944

5045
private:
51-
Camera* camera;
52-
Scene* scene;
53-
ImGuiIO* io;
54-
OpenGLRenderer* openglRenderer;
55-
RasterizerRenderer* rasterizerRenderer;
46+
Camera &camera;
47+
Scene &scene;
48+
ImGuiIO &io;
49+
OpenGLRenderer &openglRenderer;
50+
RasterizerRenderer &rasterizerRenderer;
5651

5752
ImVec2 viewport = ImVec2(800, 800);
5853
ImVec2 windowPos;

src/OpenGLRenderer.cpp

+8-7
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,7 @@ OpenGLRenderer::OpenGLRenderer()
5959
glBindFramebuffer(GL_FRAMEBUFFER, outlineFBO);
6060
// outlinert
6161
glGenTextures(1, &outlineRT);
62+
char* name = "outlineRT";
6263
glBindTexture(GL_TEXTURE_2D, outlineRT);
6364
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, viewport.x, viewport.y, 0, GL_RGB, GL_UNSIGNED_BYTE, NULL);
6465
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
@@ -106,11 +107,11 @@ void OpenGLRenderer::Render(Scene &scene)
106107
glEnable(GL_DEPTH_TEST);
107108
glDepthMask(GL_TRUE);
108109

109-
glm::vec3 clearColor = scene.camera->clearColor;
110+
glm::vec3 clearColor = scene.camera.clearColor;
110111
glClearColor(clearColor.x, clearColor.y, clearColor.z, 1);
111112
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
112113

113-
scene.camera->updateMatrix(45.0f, 0.1f, 1000.0f, viewport.x, viewport.y);
114+
scene.camera.updateMatrix(45.0f, 0.1f, 1000.0f, viewport.x, viewport.y);
114115

115116
scene.Draw(shader);
116117

@@ -151,15 +152,15 @@ void OpenGLRenderer::Render(Scene &scene)
151152

152153
glEnable(GL_DEPTH_TEST);
153154

154-
Object* selected = scene.objects[node_clicked];
155+
std::shared_ptr<Object> selected = scene.objects[node_clicked];
155156
if (selected->GetType() == Type_Mesh)
156157
{
157-
Mesh* mesh = (Mesh*)selected;
158+
std::shared_ptr<Mesh> mesh = std::dynamic_pointer_cast<Mesh>(selected);
158159
outlineShader->Activate();
159160

160161
glm::vec4 draw_color(1 / 255.0f, 1, 1, 1);
161162
glUniform4fv(glGetUniformLocation(outlineShader->ID, "_DRAW_COLOR"), 1, (float*)&draw_color);
162-
glUniformMatrix4fv(glGetUniformLocation(outlineShader->ID, "camMatrix"), 1, GL_FALSE, glm::value_ptr(scene.camera->cameraMatrix * mesh->objectToWorld));
163+
glUniformMatrix4fv(glGetUniformLocation(outlineShader->ID, "camMatrix"), 1, GL_FALSE, glm::value_ptr(scene.camera.cameraMatrix * mesh->objectToWorld));
163164

164165
mesh->Draw();
165166
}
@@ -171,12 +172,12 @@ void OpenGLRenderer::Render(Scene &scene)
171172

172173
if (selected->GetType() == Type_Mesh)
173174
{
174-
Mesh* mesh = (Mesh*)selected;
175+
std::shared_ptr<Mesh> mesh = std::dynamic_pointer_cast<Mesh>(selected);
175176
outlineShader->Activate();
176177

177178
glm::vec4 draw_color(0, 0, 1, 1);
178179
glUniform4fv(glGetUniformLocation(outlineShader->ID, "_DRAW_COLOR"), 1, (float*)&draw_color);
179-
glUniformMatrix4fv(glGetUniformLocation(outlineShader->ID, "camMatrix"), 1, GL_FALSE, glm::value_ptr(scene.camera->cameraMatrix * mesh->objectToWorld));
180+
glUniformMatrix4fv(glGetUniformLocation(outlineShader->ID, "camMatrix"), 1, GL_FALSE, glm::value_ptr(scene.camera.cameraMatrix * mesh->objectToWorld));
180181

181182
mesh->Draw();
182183
}

0 commit comments

Comments
 (0)