First steps for rendering

master
Martin Felis 2020-10-17 22:09:41 +02:00
parent bcb05e5eea
commit 99508054bf
5 changed files with 248 additions and 12 deletions

View File

@ -52,11 +52,13 @@ target_include_directories(
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/imgui>
PUBLIC $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/3rdparty/vectorial/include>
)
target_link_libraries(vissim ${PROJECT_NAME} glfw)
target_sources(vissim PRIVATE
src/utils.cc
src/srender.c
3rdparty/glfw/deps/glad_gl.c
3rdparty/imgui/imgui.cpp
3rdparty/imgui/imgui_draw.cpp

153
src/srender.c Normal file
View File

@ -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);
}

54
src/srender.h Normal file
View File

@ -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

View File

@ -15,13 +15,6 @@
extern "C" {
#endif
struct Timer {
float mCurrentTime = 0.0f;
float mFrameTime = 0.0f;
float mDeltaTime = 0.0f;
bool mPaused = false;
};
typedef struct {
int32_t mousedX;
int32_t mousedY;

View File

@ -18,12 +18,25 @@
#include "backends/imgui_impl_opengl3.h"
#include "imgui.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;
GLFWwindow* gWindow = nullptr;
GuiInputState* gGuiInputState = nullptr;
double gTimeAtStart = 0;
// Rendering
srndr* gRndr = nullptr;
srview* gView = nullptr;
srcmdbuf* gRndrCmds = nullptr;
double mouse_scroll_x = 0.;
double mouse_scroll_y = 0.;
@ -139,6 +152,25 @@ void ShowDockspace(bool open) {
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) {
gTimeAtStart = gGetCurrentTime();
std::cout << "Time at start: " << gTimeAtStart << std::endl;
@ -217,6 +249,9 @@ int main(void) {
bool show_demo_window = true;
ImVec4 clear_color = ImVec4(0.45f, 0.55f, 0.60f, 1.00f);
gRndr = srndr_create();
gView = srview_create();
while (!glfwWindowShouldClose(gWindow)) {
frame_counter++;
@ -257,11 +292,7 @@ int main(void) {
ShowDockspace(true);
ImGui::Begin("yoyoyo");
ImGui::End();
ImGui::Begin("yoyoyo3333");
ImGui::End();
DoRender();
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0);
@ -295,6 +326,9 @@ int main(void) {
gLog("Exiting application");
srview_destroy(gView);
srndr_destroy(gRndr);
ImGui_ImplOpenGL3_Shutdown();
ImGui_ImplGlfw_Shutdown();
ImGui::DestroyContext();