Skip to content

Commit a334df1

Browse files
committed
split main by graphics api
1 parent e9f7cb3 commit a334df1

23 files changed

+871
-889
lines changed

CMakeLists.txt

+49-12
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,48 @@
11
# Copyright (C) 2018 Tomasz Gałaj
22

33
cmake_minimum_required(VERSION 3.2 FATAL_ERROR)
4-
project(BunnyRenderer)
4+
project(bunny_renderer)
55

66
# Add .lib files
77
link_directories(${CMAKE_SOURCE_DIR}/lib)
88

99
# Add source files
10-
file(GLOB_RECURSE SOURCE_FILES
11-
${CMAKE_SOURCE_DIR}/src/*.c
12-
${CMAKE_SOURCE_DIR}/src/*.cpp)
10+
file(GLOB_RECURSE SOURCE_FILES_COMMON
11+
${CMAKE_SOURCE_DIR}/src/common/*.cpp
12+
${CMAKE_SOURCE_DIR}/src/rasterizer/*.cpp
13+
${CMAKE_SOURCE_DIR}/src/raytracer/*.cpp)
14+
15+
file(GLOB_RECURSE SOURCE_FILES_D3D11 ${CMAKE_SOURCE_DIR}/src/d3d11/*.cpp)
16+
SET(SOURCE_FILES_D3D11 ${SOURCE_FILES_COMMON} ${SOURCE_FILES_D3D11} ${CMAKE_SOURCE_DIR}/src/main_d3d11.cpp)
17+
18+
file(GLOB_RECURSE SOURCE_FILES_OPENGL ${CMAKE_SOURCE_DIR}/src/opengl/*.cpp)
19+
SET(SOURCE_FILES_OPENGL ${SOURCE_FILES_COMMON} ${SOURCE_FILES_OPENGL} ${CMAKE_SOURCE_DIR}/src/main_opengl.cpp)
1320

1421
# Add header files
1522
file(GLOB_RECURSE HEADER_FILES
16-
${CMAKE_SOURCE_DIR}/src/*.h
17-
${CMAKE_SOURCE_DIR}/src/*.hpp)
23+
${CMAKE_SOURCE_DIR}/src/*.h)
24+
25+
file(GLOB_RECURSE HEADER_FILES_COMMON
26+
${CMAKE_SOURCE_DIR}/src/common/*.h
27+
${CMAKE_SOURCE_DIR}/src/rasterizer/*.h
28+
${CMAKE_SOURCE_DIR}/src/raytracer/*.h)
29+
30+
file(GLOB_RECURSE HEADER_FILES_D3D11 ${CMAKE_SOURCE_DIR}/src/d3d11/*.h)
31+
SET(HEADER_FILES_D3D11 ${HEADER_FILES_COMMON} ${HEADER_FILES_D3D11})
32+
33+
file(GLOB_RECURSE HEADER_FILES_OPENGL ${CMAKE_SOURCE_DIR}/src/opengl/*.h)
34+
SET(HEADER_FILES_OPENGL ${HEADER_FILES_COMMON} ${HEADER_FILES_OPENGL})
1835

1936
# Configure assets header file
2037
configure_file(src/helpers/RootDir.h.in src/helpers/RootDir.h)
2138
include_directories(${CMAKE_BINARY_DIR}/src)
39+
40+
SET(EXE_NAME_D3D11 ${PROJECT_NAME}_d3d11)
41+
SET(EXE_NAME_OPENGL ${PROJECT_NAME}_opengl)
2242

2343
# Define the executable
24-
add_executable(${PROJECT_NAME} ${HEADER_FILES} ${SOURCE_FILES})
44+
add_executable(${EXE_NAME_D3D11} ${HEADER_FILES_D3D11} ${SOURCE_FILES_D3D11})
45+
add_executable(${EXE_NAME_OPENGL} ${HEADER_FILES_OPENGL} ${SOURCE_FILES_OPENGL})
2546

2647
# We need a CMAKE_DIR with some code to find external dependencies
2748
set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/cmake/")
@@ -84,25 +105,41 @@ find_library(DXGI dxgi.lib)
84105

85106
# Put all libraries into a variable
86107
set(LIBS ${GLFW3_LIBRARY} ${OPENGL_LIBRARY} IMGUI GLAD ${CMAKE_DL_LIBS} ${ASSIMP_LIBRARY} STB_IMAGE STB_IMAGE_WRITE TINYEXR IMGUIZMO ${COMCTL32} ${PROPSYS} ${SHLWAPI} ${D3D11} ${D3D11COMPILER} ${DXGI})
108+
set(LIBS_COMMON ${GLFW3_LIBRARY} IMGUI ${CMAKE_DL_LIBS} ${ASSIMP_LIBRARY} STB_IMAGE STB_IMAGE_WRITE TINYEXR IMGUIZMO ${COMCTL32} ${PROPSYS} ${SHLWAPI})
109+
set(LIBS_D3D11 ${LIBS_COMMON} ${D3D11} ${D3D11COMPILER} ${DXGI})
110+
set(LIBS_OPENGL ${LIBS_COMMON} ${OPENGL_LIBRARY} GLAD)
87111

88112
# Define the link libraries
89-
target_link_libraries(${PROJECT_NAME} ${LIBS})
113+
target_link_libraries(${EXE_NAME_D3D11} ${LIBS})
114+
target_link_libraries(${EXE_NAME_OPENGL} ${LIBS})
90115

91116
if(WIN32)
92117
# Copy dlls
93-
add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD
118+
add_custom_command(TARGET ${EXE_NAME_D3D11} POST_BUILD
119+
COMMAND ${CMAKE_COMMAND} -E copy_directory
120+
"${PROJECT_SOURCE_DIR}/dlls"
121+
$<TARGET_FILE_DIR:${EXE_NAME_D3D11}>)
122+
add_custom_command(TARGET ${EXE_NAME_OPENGL} POST_BUILD
94123
COMMAND ${CMAKE_COMMAND} -E copy_directory
95124
"${PROJECT_SOURCE_DIR}/dlls"
96-
$<TARGET_FILE_DIR:${PROJECT_NAME}>)
125+
$<TARGET_FILE_DIR:${EXE_NAME_OPENGL}>)
97126

98127
# Copy resources
99-
add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD
128+
add_custom_command(TARGET ${EXE_NAME_D3D11} POST_BUILD
129+
COMMAND ${CMAKE_COMMAND} -E copy_directory
130+
"${PROJECT_SOURCE_DIR}/res"
131+
"${CMAKE_BINARY_DIR}/res")
132+
add_custom_command(TARGET ${EXE_NAME_OPENGL} POST_BUILD
100133
COMMAND ${CMAKE_COMMAND} -E copy_directory
101134
"${PROJECT_SOURCE_DIR}/res"
102135
"${CMAKE_BINARY_DIR}/res")
103136

104137
# Copy imgui config
105-
add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD
138+
add_custom_command(TARGET ${EXE_NAME_D3D11} POST_BUILD
139+
COMMAND ${CMAKE_COMMAND} -E copy
140+
"${PROJECT_SOURCE_DIR}/imgui.ini"
141+
"${CMAKE_BINARY_DIR}/imgui.ini")
142+
add_custom_command(TARGET ${EXE_NAME_OPENGL} POST_BUILD
106143
COMMAND ${CMAKE_COMMAND} -E copy
107144
"${PROJECT_SOURCE_DIR}/imgui.ini"
108145
"${CMAKE_BINARY_DIR}/imgui.ini")

src/Application.h

+2-3
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,7 @@
1717
#include "common/Utils.h"
1818
#include "common/Dialog.h"
1919

20-
#include "opengl/OpenGLRenderer.h"
21-
#include "d3d11/D3D11Renderer.h"
20+
#include "common/RealTimeRenderer.h"
2221
#include "rasterizer/RasterizerRenderer.h"
2322
#include "raytracer/RayTracerRenderer.h"
2423

@@ -551,7 +550,7 @@ class Application
551550
//}
552551

553552
ImGui::SameLine();
554-
ImGui::Checkbox("Show Irradiance", &scene.skybox.showIrradianceMap);
553+
ImGui::Checkbox("Show Irradiance", &realtimeRenderer.showIrradianceMap);
555554

556555
ImGui::SameLine(ImGui::GetWindowWidth() - 200);
557556
ImGui::Text("%.3f ms/frame (%.1f FPS)", 1000.0f / ImGui::GetIO().Framerate, ImGui::GetIO().Framerate);

src/common/Cubemap.cpp

+9-9
Original file line numberDiff line numberDiff line change
@@ -13,14 +13,14 @@ Cubemap::Cubemap(std::string path)
1313
"res/obj/skybox/back.jpg"
1414
};
1515

16-
glGenTextures(1, &ID);
17-
glObjectLabel(GL_TEXTURE, ID, -1, "cubemap");
18-
glBindTexture(GL_TEXTURE_CUBE_MAP, ID);
19-
glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
20-
glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
21-
glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
22-
glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
23-
glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE);
16+
//glGenTextures(1, &ID);
17+
//glObjectLabel(GL_TEXTURE, ID, -1, "cubemap");
18+
//glBindTexture(GL_TEXTURE_CUBE_MAP, ID);
19+
//glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
20+
//glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
21+
//glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
22+
//glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
23+
//glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE);
2424
// This might help with seams on some systems
2525
//glEnable(GL_TEXTURE_CUBE_MAP_SEAMLESS);
2626

@@ -29,7 +29,7 @@ Cubemap::Cubemap(std::string path)
2929
for (unsigned int i = 0; i < 6; i++)
3030
{
3131
textures[i] = stbi_load(facesCubemap[i].c_str(), &width, &height, &numColCh, 0);
32-
glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, textures[i]);
32+
//glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, textures[i]);
3333
}
3434
}
3535

src/common/Material.cpp

+3-1
Original file line numberDiff line numberDiff line change
@@ -1 +1,3 @@
1-
#include "Material.h"
1+
#include "Material.h"
2+
3+
TexBindFunc TextureBindFunction;

src/common/Material.h

+7-4
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,9 @@
2222
#include "Vertex.h"
2323
#include "Skybox.h"
2424

25+
typedef void(*TexBindFunc)(Texture&, unsigned int);
26+
extern TexBindFunc TextureBindFunction;
27+
2528
class Material
2629
{
2730
public:
@@ -133,7 +136,7 @@ class UnlitMaterial : public Material
133136

134137
std::shared_ptr<Texture> tex = texture != nullptr ? texture : Texture::white_tex;
135138
tex->texUnit(*shader, "tex0", 0);
136-
tex->Bind(GL_TEXTURE0);
139+
TextureBindFunction(*tex, 0);
137140

138141
SetUniform("_Color", color);
139142
}
@@ -175,15 +178,15 @@ class PBRMaterial : public Material
175178

176179
std::shared_ptr<Texture> tex = texture != nullptr ? texture : Texture::white_tex;
177180
tex->texUnit(*shader, "albedoMap", 0);
178-
tex->Bind(GL_TEXTURE0);
181+
TextureBindFunction(*tex, 0);
179182

180183
std::shared_ptr<Texture> normal = normalMap != nullptr ? normalMap : Texture::normal_tex;
181184
normal->texUnit(*shader, "normalMap", 1);
182-
normal->Bind(GL_TEXTURE1);
185+
TextureBindFunction(*normal, 1);
183186

184187
std::shared_ptr<Texture> metal = metallicMap != nullptr ? metallicMap : Texture::white_tex;
185188
metal->texUnit(*shader, "metalMap", 2);
186-
metal->Bind(GL_TEXTURE2);
189+
TextureBindFunction(*metal, 2);
187190

188191
SetUniform("_Color", color);
189192
SetUniform("_Metallic", metallic);

src/common/Mesh.cpp

+13-53
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
#include "Mesh.h"
22
#include "common/Utils.h"
33

4+
MeshFunc MeshRegisterFunction;
5+
MeshFunc MeshUnregisterFunction;
6+
47
bool Mesh::LoadMesh(const std::string& pFile) {
58
Assimp::Importer importer;
69

@@ -16,35 +19,7 @@ bool Mesh::LoadMesh(const std::string& pFile) {
1619

1720
const aiMesh* model = scene->mMeshes[0];
1821

19-
const aiVector3D aiZeroVector(0.0f, 0.0f, 0.0f);
20-
for (unsigned int i = 0; i < model->mNumVertices; i++)
21-
{
22-
const aiVector3D* pPos = &(model->mVertices[i]);
23-
const aiVector3D* pNormal = &(model->mNormals[i]);
24-
const aiVector3D* pTexCoord = model->HasTextureCoords(0) ? &(model->mTextureCoords[0][i]) : &aiZeroVector;
25-
const aiVector3D* pTangent = &(model->mTangents[i]);
26-
27-
Vertex vert{ glm::vec3(pPos->x, pPos->y, pPos->z),
28-
glm::vec3(pNormal->x, pNormal->y, pNormal->z),
29-
glm::vec2(pTexCoord->x, pTexCoord->y),
30-
glm::vec3(pTangent->x, pTangent->y, pTangent->z) };
31-
32-
verts.push_back(glm::vec3(pPos->x, pPos->y, pPos->z));
33-
uvs.push_back(glm::vec2(pTexCoord->x, pTexCoord->y));
34-
normals.push_back(glm::vec3(pNormal->x, pNormal->y, pNormal->z));
35-
tangents.push_back(glm::vec3(pTangent->x, pTangent->y, pTangent->z));
36-
37-
vertices.push_back(vert);
38-
}
39-
40-
for (unsigned int i = 0; i < model->mNumFaces; i++)
41-
{
42-
const aiFace& face = model->mFaces[i];
43-
assert(face.mNumIndices == 3);
44-
indices.push_back(face.mIndices[0]);
45-
indices.push_back(face.mIndices[1]);
46-
indices.push_back(face.mIndices[2]);
47-
}
22+
InitMesh(model);
4823

4924
return true;
5025
}
@@ -87,7 +62,8 @@ Mesh::Mesh(const aiMesh* model)
8762
SetName(model->mName.data);
8863
InitMesh(model);
8964
CalcBounds();
90-
Bind();
65+
66+
MeshRegisterFunction(this);
9167
}
9268

9369
Mesh::Mesh(const char *path)
@@ -96,7 +72,13 @@ Mesh::Mesh(const char *path)
9672
SetName(GetFileNameFromPath(path).c_str());
9773
LoadMesh(path);
9874
CalcBounds();
99-
Bind();
75+
76+
MeshRegisterFunction(this);
77+
}
78+
79+
Mesh::~Mesh()
80+
{
81+
MeshUnregisterFunction(this);
10082
}
10183

10284
inline std::size_t hash_combine(const std::size_t& seed1, const std::size_t& seed2)
@@ -128,26 +110,4 @@ void Mesh::CalcBounds()
128110
if (pos.y > maxPos.y) maxPos.y = pos.y;
129111
if (pos.z > maxPos.z) maxPos.z = pos.z;
130112
}
131-
}
132-
133-
void Mesh::Bind()
134-
{
135-
vao.Bind();
136-
137-
VBO vbo(vertices);
138-
EBO ebo(indices);
139-
140-
vao.LinkAttrib(vbo, 0, 3, GL_FLOAT, sizeof(Vertex), 0);
141-
vao.LinkAttrib(vbo, 1, 3, GL_FLOAT, sizeof(Vertex), (void*)(3 * sizeof(float)));
142-
vao.LinkAttrib(vbo, 2, 2, GL_FLOAT, sizeof(Vertex), (void*)(6 * sizeof(float)));
143-
vao.LinkAttrib(vbo, 3, 3, GL_FLOAT, sizeof(Vertex), (void*)(8 * sizeof(float)));
144-
vao.Unbind();
145-
vbo.Unbind();
146-
ebo.Unbind();
147-
}
148-
149-
void Mesh::Draw()
150-
{
151-
vao.Bind();
152-
glDrawElements(GL_TRIANGLES, (GLsizei)indices.size(), GL_UNSIGNED_INT, 0);
153113
}

src/common/Mesh.h

+7-7
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,6 @@
44
#include <string>
55
#include <unordered_map>
66

7-
#include "../opengl/VAO.h"
8-
#include "../opengl/EBO.h"
97
#include "Texture.h"
108
#include "Object.h"
119
#include "Material.h"
@@ -24,8 +22,8 @@ class Mesh : public Object
2422
std::vector<glm::vec3> normals;
2523
std::vector<glm::vec3> tangents;
2624
std::vector<glm::vec2> uvs;
27-
28-
VAO vao;
25+
26+
GLuint ID;
2927

3028
glm::vec3 minPos = glm::vec3(std::numeric_limits<float>::max(), std::numeric_limits<float>::max(), std::numeric_limits<float>::max());
3129
glm::vec3 maxPos = glm::vec3(-std::numeric_limits<float>::max(), -std::numeric_limits<float>::max(), -std::numeric_limits<float>::max());
@@ -37,16 +35,18 @@ class Mesh : public Object
3735
public:
3836
Mesh(const char *filename);
3937
Mesh(const aiMesh* model);
38+
~Mesh();
4039

4140
virtual Type GetType() { return Type_Mesh; };
4241

43-
void Draw();
44-
4542
private:
4643
void CalcBounds();
47-
void Bind();
4844
void InitMesh(const aiMesh* model);
4945
bool LoadMesh(const std::string& pFile);
5046
};
5147

48+
typedef void(*MeshFunc)(Mesh*);
49+
extern MeshFunc MeshRegisterFunction;
50+
extern MeshFunc MeshUnregisterFunction;
51+
5252
#endif

src/common/RealTimeRenderer.h

+7-2
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,11 @@ class RealtimeRenderer : public Renderer
1313
virtual void GeneratePrefilterMap(Scene& scene) {};
1414
virtual void GenerateBrdfLUT(Scene& scene) {};
1515

16-
virtual void RegisterTexture(unsigned int ID, const char* name, int width, int height, GLenum format, GLenum type, GLenum wrap, bool mipmap, unsigned char* bytes) {};
17-
virtual void RegisterTextureF(unsigned int ID, const char* name, int width, int height, GLenum format, GLenum type, GLenum wrap, bool mipmap, float* data) {};
16+
virtual void RegisterTexture(Texture* texture) {};
17+
virtual void UnregisterTexture(Texture* texture) {};
18+
19+
virtual void RegisterSkybox(Skybox* skybox) {};
20+
virtual void DrawSkybox() {};
1821

1922
virtual void BindTexture(Texture& texture) {};
2023

@@ -25,6 +28,8 @@ class RealtimeRenderer : public Renderer
2528
public:
2629
GLuint postprocessRT;
2730
GLuint outlineRT;
31+
32+
bool showIrradianceMap = false;
2833
};
2934

3035
#endif //__REALTIME_RENDERER_H__

0 commit comments

Comments
 (0)