First steps for rendering
parent
bcb05e5eea
commit
99508054bf
|
@ -52,11 +52,13 @@ target_include_directories(
|
||||||
PUBLIC $<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}/3rdparty/rbdl/include>
|
PUBLIC $<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}/3rdparty/rbdl/include>
|
||||||
PUBLIC $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/3rdparty/glfw/deps>
|
PUBLIC $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/3rdparty/glfw/deps>
|
||||||
PUBLIC $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/3rdparty/imgui>
|
PUBLIC $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/3rdparty/imgui>
|
||||||
|
PUBLIC $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/3rdparty/vectorial/include>
|
||||||
)
|
)
|
||||||
target_link_libraries(vissim ${PROJECT_NAME} glfw)
|
target_link_libraries(vissim ${PROJECT_NAME} glfw)
|
||||||
|
|
||||||
target_sources(vissim PRIVATE
|
target_sources(vissim PRIVATE
|
||||||
src/utils.cc
|
src/utils.cc
|
||||||
|
src/srender.c
|
||||||
3rdparty/glfw/deps/glad_gl.c
|
3rdparty/glfw/deps/glad_gl.c
|
||||||
3rdparty/imgui/imgui.cpp
|
3rdparty/imgui/imgui.cpp
|
||||||
3rdparty/imgui/imgui_draw.cpp
|
3rdparty/imgui/imgui_draw.cpp
|
||||||
|
|
|
@ -0,0 +1,153 @@
|
||||||
|
// clang-format off
|
||||||
|
#include <glad/gl.h>
|
||||||
|
// clang-format on
|
||||||
|
|
||||||
|
#include "srender.h"
|
||||||
|
|
||||||
|
#include "utils.h"
|
||||||
|
#include <assert.h>
|
||||||
|
|
||||||
|
typedef struct srndr {
|
||||||
|
} srndr;
|
||||||
|
|
||||||
|
typedef struct srview {
|
||||||
|
GLuint width;
|
||||||
|
GLuint height;
|
||||||
|
|
||||||
|
GLuint mFrameBufferId;
|
||||||
|
GLuint mColorTexture;
|
||||||
|
GLuint mDepthTexture;
|
||||||
|
} srveiw;
|
||||||
|
|
||||||
|
typedef struct srcmdbuf {
|
||||||
|
} srcmdbuf;
|
||||||
|
|
||||||
|
srndr* srndr_create() {
|
||||||
|
srndr* result = calloc(1, sizeof(srndr));
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
void srndr_destroy(srndr* sr) { free(sr); }
|
||||||
|
|
||||||
|
void srview_get_output_texture(srview* sv, GLuint* texture) {
|
||||||
|
*texture = sv->mColorTexture;
|
||||||
|
}
|
||||||
|
|
||||||
|
void srview_update_framebuffer(srview* sv) {
|
||||||
|
glGenFramebuffers(1, &sv->mFrameBufferId);
|
||||||
|
glBindFramebuffer(GL_FRAMEBUFFER, sv->mFrameBufferId);
|
||||||
|
|
||||||
|
// Color Texture
|
||||||
|
glGenTextures(1, &sv->mColorTexture);
|
||||||
|
glBindTexture(GL_TEXTURE_2D, sv->mColorTexture);
|
||||||
|
|
||||||
|
glTexImage2D(
|
||||||
|
GL_TEXTURE_2D,
|
||||||
|
0,
|
||||||
|
GL_RGB,
|
||||||
|
sv->width,
|
||||||
|
sv->height,
|
||||||
|
0,
|
||||||
|
GL_RGB,
|
||||||
|
GL_UNSIGNED_BYTE,
|
||||||
|
0);
|
||||||
|
|
||||||
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
|
||||||
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
|
||||||
|
|
||||||
|
glFramebufferTexture2D(
|
||||||
|
GL_FRAMEBUFFER,
|
||||||
|
GL_COLOR_ATTACHMENT0,
|
||||||
|
GL_TEXTURE_2D,
|
||||||
|
sv->mColorTexture,
|
||||||
|
0);
|
||||||
|
|
||||||
|
// Depth Texture
|
||||||
|
glGenTextures(1, &sv->mDepthTexture);
|
||||||
|
glBindTexture(GL_TEXTURE_2D, sv->mDepthTexture);
|
||||||
|
|
||||||
|
glTexImage2D(
|
||||||
|
GL_TEXTURE_2D,
|
||||||
|
0,
|
||||||
|
GL_DEPTH_COMPONENT,
|
||||||
|
sv->width,
|
||||||
|
sv->height,
|
||||||
|
0,
|
||||||
|
GL_DEPTH_COMPONENT,
|
||||||
|
GL_FLOAT,
|
||||||
|
0);
|
||||||
|
|
||||||
|
// Set parameters so that we can set a shadow2DSampler
|
||||||
|
glTexParameteri(
|
||||||
|
GL_TEXTURE_2D,
|
||||||
|
GL_TEXTURE_COMPARE_MODE,
|
||||||
|
GL_COMPARE_REF_TO_TEXTURE);
|
||||||
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
|
||||||
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
|
||||||
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_BORDER);
|
||||||
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_BORDER);
|
||||||
|
float border_color[] = {1.0f, 1.0f, 1.0f, 1.0f};
|
||||||
|
glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_BORDER_COLOR, border_color);
|
||||||
|
|
||||||
|
glFramebufferTexture2D(
|
||||||
|
GL_FRAMEBUFFER,
|
||||||
|
GL_DEPTH_ATTACHMENT,
|
||||||
|
GL_TEXTURE_2D,
|
||||||
|
sv->mDepthTexture,
|
||||||
|
0);
|
||||||
|
}
|
||||||
|
|
||||||
|
void srview_cleanup_framebuffer(srview* sv) {
|
||||||
|
if (glIsFramebuffer(sv->mFrameBufferId)) {
|
||||||
|
glDeleteFramebuffers(1, &sv->mFrameBufferId);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (sv->mColorTexture != -1) {
|
||||||
|
glDeleteTextures(1, &sv->mColorTexture);
|
||||||
|
sv->mColorTexture = -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (sv->mDepthTexture != -1) {
|
||||||
|
glDeleteTextures(1, &sv->mDepthTexture);
|
||||||
|
sv->mDepthTexture = -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void srview_set_size(srview* sv, int width, int height) {
|
||||||
|
if (sv->width == width && sv->height == height) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
gLog("Setting size to %d, %d", width, height);
|
||||||
|
|
||||||
|
sv->width = width;
|
||||||
|
sv->height = height;
|
||||||
|
|
||||||
|
srview_cleanup_framebuffer(sv);
|
||||||
|
srview_update_framebuffer(sv);
|
||||||
|
|
||||||
|
gLog("Color texture = %d", sv->mColorTexture);
|
||||||
|
}
|
||||||
|
|
||||||
|
srview* srview_create() {
|
||||||
|
srview* result = calloc(1, sizeof(srview));
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
void srview_destroy(srview* sv) {
|
||||||
|
srview_cleanup_framebuffer(sv);
|
||||||
|
|
||||||
|
free(sv);
|
||||||
|
}
|
||||||
|
|
||||||
|
void srndr_render(srndr* srndr, srview* sview, srcmdbuf* scmdbuf) {
|
||||||
|
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, sview->mFrameBufferId);
|
||||||
|
|
||||||
|
glViewport(0, 0, sview->width, sview->height);
|
||||||
|
glClearColor(1.f, 0.f, 1.f, 1.f);
|
||||||
|
glClear(GL_COLOR_BUFFER_BIT);
|
||||||
|
|
||||||
|
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0);
|
||||||
|
}
|
|
@ -0,0 +1,54 @@
|
||||||
|
#ifndef SRENDER_H
|
||||||
|
#define SRENDER_H
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
typedef struct srndr srndr;
|
||||||
|
typedef struct srview srview;
|
||||||
|
typedef struct srcmdbuf srcmdbuf;
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
SRndrCmdTypeGrid = 0,
|
||||||
|
SRndrCmdTypeBox,
|
||||||
|
SRndrCmdTypeLight,
|
||||||
|
SRndrCmdTypeSphere
|
||||||
|
} SRndrCmdType;
|
||||||
|
|
||||||
|
typedef struct srcmd {
|
||||||
|
float mat[16];
|
||||||
|
float color[4];
|
||||||
|
SRndrCmdType cmd_type;
|
||||||
|
} srcmd;
|
||||||
|
|
||||||
|
//
|
||||||
|
// Renderer
|
||||||
|
//
|
||||||
|
srndr* srndr_create();
|
||||||
|
void srndr_destroy(srndr* sr);
|
||||||
|
|
||||||
|
//
|
||||||
|
// View
|
||||||
|
//
|
||||||
|
srview* srview_create();
|
||||||
|
void srview_destroy(srview* sv);
|
||||||
|
|
||||||
|
void srview_set_proj(srview* sv, float* proj);
|
||||||
|
void srview_set_view(srview* sv, float* view);
|
||||||
|
void srview_set_size(srview* sv, int width, int height);
|
||||||
|
void srview_get_output_texture(srview* sv, GLuint* texture);
|
||||||
|
|
||||||
|
//
|
||||||
|
// Command Buffer and Commands
|
||||||
|
//
|
||||||
|
srcmdbuf* srcmdbuf_create(unsigned int size_max);
|
||||||
|
srcmd* srcmd_create(srcmdbuf* cmdbuf);
|
||||||
|
|
||||||
|
void srndr_render(srndr* srndr, srview* sview, srcmdbuf* scmdbuf);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif
|
|
@ -15,13 +15,6 @@
|
||||||
extern "C" {
|
extern "C" {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
struct Timer {
|
|
||||||
float mCurrentTime = 0.0f;
|
|
||||||
float mFrameTime = 0.0f;
|
|
||||||
float mDeltaTime = 0.0f;
|
|
||||||
bool mPaused = false;
|
|
||||||
};
|
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
int32_t mousedX;
|
int32_t mousedX;
|
||||||
int32_t mousedY;
|
int32_t mousedY;
|
||||||
|
|
|
@ -18,12 +18,25 @@
|
||||||
#include "backends/imgui_impl_opengl3.h"
|
#include "backends/imgui_impl_opengl3.h"
|
||||||
#include "imgui.h"
|
#include "imgui.h"
|
||||||
#include "utils.h"
|
#include "utils.h"
|
||||||
|
#include "srender.h"
|
||||||
|
|
||||||
|
struct Timer {
|
||||||
|
float mCurrentTime = 0.0f;
|
||||||
|
float mFrameTime = 0.0f;
|
||||||
|
float mDeltaTime = 0.0f;
|
||||||
|
bool mPaused = false;
|
||||||
|
};
|
||||||
|
|
||||||
Timer* gTimer = nullptr;
|
Timer* gTimer = nullptr;
|
||||||
GLFWwindow* gWindow = nullptr;
|
GLFWwindow* gWindow = nullptr;
|
||||||
GuiInputState* gGuiInputState = nullptr;
|
GuiInputState* gGuiInputState = nullptr;
|
||||||
double gTimeAtStart = 0;
|
double gTimeAtStart = 0;
|
||||||
|
|
||||||
|
// Rendering
|
||||||
|
srndr* gRndr = nullptr;
|
||||||
|
srview* gView = nullptr;
|
||||||
|
srcmdbuf* gRndrCmds = nullptr;
|
||||||
|
|
||||||
double mouse_scroll_x = 0.;
|
double mouse_scroll_x = 0.;
|
||||||
double mouse_scroll_y = 0.;
|
double mouse_scroll_y = 0.;
|
||||||
|
|
||||||
|
@ -139,6 +152,25 @@ void ShowDockspace(bool open) {
|
||||||
ImGui::End();
|
ImGui::End();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void DoRender() {
|
||||||
|
// Render Output
|
||||||
|
ImGui::Begin("Render Output");
|
||||||
|
const ImVec2 content_avail = ImGui::GetContentRegionAvail();
|
||||||
|
GLuint view_texture;
|
||||||
|
|
||||||
|
srview_set_size(gView, content_avail.x, content_avail.y);
|
||||||
|
srndr_render(gRndr, gView, gRndrCmds);
|
||||||
|
srview_get_output_texture(gView, &view_texture);
|
||||||
|
|
||||||
|
ImGui::Image(
|
||||||
|
(void*)view_texture,
|
||||||
|
content_avail,
|
||||||
|
ImVec2(0.0f, 1.0f),
|
||||||
|
ImVec2(1.0f, 0.0f));
|
||||||
|
|
||||||
|
ImGui::End();
|
||||||
|
}
|
||||||
|
|
||||||
int main(void) {
|
int main(void) {
|
||||||
gTimeAtStart = gGetCurrentTime();
|
gTimeAtStart = gGetCurrentTime();
|
||||||
std::cout << "Time at start: " << gTimeAtStart << std::endl;
|
std::cout << "Time at start: " << gTimeAtStart << std::endl;
|
||||||
|
@ -217,6 +249,9 @@ int main(void) {
|
||||||
bool show_demo_window = true;
|
bool show_demo_window = true;
|
||||||
ImVec4 clear_color = ImVec4(0.45f, 0.55f, 0.60f, 1.00f);
|
ImVec4 clear_color = ImVec4(0.45f, 0.55f, 0.60f, 1.00f);
|
||||||
|
|
||||||
|
gRndr = srndr_create();
|
||||||
|
gView = srview_create();
|
||||||
|
|
||||||
while (!glfwWindowShouldClose(gWindow)) {
|
while (!glfwWindowShouldClose(gWindow)) {
|
||||||
frame_counter++;
|
frame_counter++;
|
||||||
|
|
||||||
|
@ -257,11 +292,7 @@ int main(void) {
|
||||||
|
|
||||||
ShowDockspace(true);
|
ShowDockspace(true);
|
||||||
|
|
||||||
ImGui::Begin("yoyoyo");
|
DoRender();
|
||||||
ImGui::End();
|
|
||||||
|
|
||||||
ImGui::Begin("yoyoyo3333");
|
|
||||||
ImGui::End();
|
|
||||||
|
|
||||||
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0);
|
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0);
|
||||||
|
|
||||||
|
@ -295,6 +326,9 @@ int main(void) {
|
||||||
|
|
||||||
gLog("Exiting application");
|
gLog("Exiting application");
|
||||||
|
|
||||||
|
srview_destroy(gView);
|
||||||
|
srndr_destroy(gRndr);
|
||||||
|
|
||||||
ImGui_ImplOpenGL3_Shutdown();
|
ImGui_ImplOpenGL3_Shutdown();
|
||||||
ImGui_ImplGlfw_Shutdown();
|
ImGui_ImplGlfw_Shutdown();
|
||||||
ImGui::DestroyContext();
|
ImGui::DestroyContext();
|
||||||
|
|
Loading…
Reference in New Issue