From 4448059ce87c15cfe167452d321d573a658f5a4e Mon Sep 17 00:00:00 2001 From: Martin Felis Date: Fri, 5 Nov 2021 14:04:05 +0100 Subject: [PATCH] Can now generate and render meshes of sch_hull's! --- src/vissim.cc | 332 +++++++++++++++++++++++++++++++++++++++----------- 1 file changed, 263 insertions(+), 69 deletions(-) diff --git a/src/vissim.cc b/src/vissim.cc index ad599ee..a984409 100644 --- a/src/vissim.cc +++ b/src/vissim.cc @@ -11,20 +11,25 @@ #include #include -#include "backends/imgui_impl_glfw.h" -#include "backends/imgui_impl_opengl3.h" -#include "imgui.h" -#include "ImGuizmo.h" - +// clang-format off #ifndef IMGUI_DEFINE_MATH_OPERATORS #define IMGUI_DEFINE_MATH_OPERATORS #endif +#include "backends/imgui_impl_glfw.h" +#include "backends/imgui_impl_opengl3.h" +#include "ImGuizmo.h" #include "imgui_internal.h" +#include "imgui.h" +// clang-format on + #include "render_utils.h" #include "simulator.h" #include "srender.h" #include "utils.h" +#define SCONVCOL_IMPLEMENTATION +#include "sconvcol.h" + GLFWwindow* gWindow = nullptr; GuiInputState* gGuiInputState = nullptr; CameraState* gCameraState = nullptr; @@ -87,38 +92,74 @@ static void opengl_error_callback( const GLchar* message, const void* userParam) { const char* source_str; - switch (source) - { - case GL_DEBUG_SOURCE_API: source_str = "API"; break; - case GL_DEBUG_SOURCE_WINDOW_SYSTEM: source_str = "Window System"; break; - case GL_DEBUG_SOURCE_SHADER_COMPILER: source_str = "Shader Compiler"; break; - case GL_DEBUG_SOURCE_THIRD_PARTY: source_str = "3rd Party"; break; - case GL_DEBUG_SOURCE_APPLICATION: source_str = "Application"; break; - default: source_str = "Other"; break; + switch (source) { + case GL_DEBUG_SOURCE_API: + source_str = "API"; + break; + case GL_DEBUG_SOURCE_WINDOW_SYSTEM: + source_str = "Window System"; + break; + case GL_DEBUG_SOURCE_SHADER_COMPILER: + source_str = "Shader Compiler"; + break; + case GL_DEBUG_SOURCE_THIRD_PARTY: + source_str = "3rd Party"; + break; + case GL_DEBUG_SOURCE_APPLICATION: + source_str = "Application"; + break; + default: + source_str = "Other"; + break; } const char* type_str; - switch (type) - { - case GL_DEBUG_TYPE_ERROR: type_str = "Error"; break; - case GL_DEBUG_TYPE_DEPRECATED_BEHAVIOR: type_str = "Deprecated Behaviour"; break; - case GL_DEBUG_TYPE_UNDEFINED_BEHAVIOR: type_str = "Undefined Behaviour"; break; - case GL_DEBUG_TYPE_PORTABILITY: type_str = "Portability"; break; - case GL_DEBUG_TYPE_PERFORMANCE: type_str = "Performance"; break; - case GL_DEBUG_TYPE_MARKER: type_str = "Marker"; break; - case GL_DEBUG_TYPE_PUSH_GROUP: type_str = "Push Group"; break; - case GL_DEBUG_TYPE_POP_GROUP: type_str = "Pop Group"; break; - default: type_str = "Other"; break; + switch (type) { + case GL_DEBUG_TYPE_ERROR: + type_str = "Error"; + break; + case GL_DEBUG_TYPE_DEPRECATED_BEHAVIOR: + type_str = "Deprecated Behaviour"; + break; + case GL_DEBUG_TYPE_UNDEFINED_BEHAVIOR: + type_str = "Undefined Behaviour"; + break; + case GL_DEBUG_TYPE_PORTABILITY: + type_str = "Portability"; + break; + case GL_DEBUG_TYPE_PERFORMANCE: + type_str = "Performance"; + break; + case GL_DEBUG_TYPE_MARKER: + type_str = "Marker"; + break; + case GL_DEBUG_TYPE_PUSH_GROUP: + type_str = "Push Group"; + break; + case GL_DEBUG_TYPE_POP_GROUP: + type_str = "Pop Group"; + break; + default: + type_str = "Other"; + break; } const char* severity_str; - switch (severity) - { - case GL_DEBUG_SEVERITY_HIGH: severity_str = "high"; break; - case GL_DEBUG_SEVERITY_MEDIUM: severity_str = "medium"; break; - case GL_DEBUG_SEVERITY_LOW: severity_str = "low"; break; - case GL_DEBUG_SEVERITY_NOTIFICATION: severity_str = "notification"; break; - default: severity_str = "unknown"; + switch (severity) { + case GL_DEBUG_SEVERITY_HIGH: + severity_str = "high"; + break; + case GL_DEBUG_SEVERITY_MEDIUM: + severity_str = "medium"; + break; + case GL_DEBUG_SEVERITY_LOW: + severity_str = "low"; + break; + case GL_DEBUG_SEVERITY_NOTIFICATION: + severity_str = "notification"; + break; + default: + severity_str = "unknown"; } gLog( @@ -151,8 +192,8 @@ void handle_mouse() { glfwGetCursorPos(gWindow, &mouse_x, &mouse_y); if (gGuiInputState->mouseButton) { - gGuiInputState->mousedX = int32_t (mouse_x) - gGuiInputState->mouseX; - gGuiInputState->mousedY = int32_t (mouse_y) - gGuiInputState->mouseY; + gGuiInputState->mousedX = int32_t(mouse_x) - gGuiInputState->mouseX; + gGuiInputState->mousedY = int32_t(mouse_y) - gGuiInputState->mouseY; } else { gGuiInputState->mousedX = 0; gGuiInputState->mousedY = 0; @@ -357,7 +398,8 @@ void ShowTransformManip( case ImGuizmo::SCALE: ImGui::InputFloat("Scale Snap", &snap[0]); break; - default: break; + default: + break; } ImGui::Checkbox("Bound Sizing", &boundSizing); if (boundSizing) { @@ -410,7 +452,170 @@ void ShowTransformManip( } } -void DoRender() { +void SimulatorSceneRender(srcmdbuf* render_commands) { + // Populate render commands + srcmdbuf_clear(render_commands); + + srcmd rcmd; + srcmd_clear(&rcmd); + + rcmd.type = SRndrCmdTypeFrame; + srcmdbuf_add(render_commands, &rcmd); + + simulator_draw(render_commands); + + if (gDialogs->mSimulator) { + ImGui::Begin("Simulator", &gDialogs->mSimulator); + simulator_gui(); + ImGui::End(); + } +} + +sch_hull box_hull; +srmeshdata* box_hull_mesh; + +void SconvHUllSceneInit() { + sch_create_unitbox(&box_hull); + + // create mesh for hull + static srvrtxdata mesh_buffer_data[1024]; + static GLuint index_buffer_data[1024]; + int vertex_index = -1; + int index_count = -1; + int triangle_count = 0; + + sch_hull* hull = &box_hull; + + int face_vert0_idx = 0; + + for (int fi = 0; fi < hull->num_faces; fi++) { + sch_face* face = &hull->faces[fi]; + sch_edge* edge0 = face->edge; + sch_vert* face_vert0 = edge0->vert; + sch_edge* cur_edge = edge0->next; + sch_vert* cur_vert = nullptr; + sch_edge* next_edge = nullptr; + sch_vert* next_vert = nullptr; + + int tri_vert_0_idx = 0; + int tri_vert_1_idx = 0; + int tri_vert_2_idx = 0; + + sch_plane plane; + sch_hull_calc_plane(hull, fi, &plane); + + // add face_vert0 (later used as tri_vert_0) + vertex_index++; + face_vert0_idx = vertex_index; + tri_vert_0_idx = face_vert0_idx; + srvrtxdata* mesh_vert = &mesh_buffer_data[tri_vert_0_idx]; + mesh_vert->x = simd4f_get_x(face_vert0->p); + mesh_vert->y = simd4f_get_y(face_vert0->p); + mesh_vert->z = simd4f_get_z(face_vert0->p); + mesh_vert->w = 1.f; + mesh_vert->nx = simd4f_get_x(plane.n); + mesh_vert->ny = simd4f_get_y(plane.n); + mesh_vert->nz = simd4f_get_z(plane.n); + mesh_vert->color[0] = fabs(mesh_vert->nx) * 255; + mesh_vert->color[1] = fabs(mesh_vert->ny) * 255; + mesh_vert->color[2] = fabs(mesh_vert->nz) * 255; + mesh_vert->color[3] = 255; + + // add tri_vert_1 + cur_vert = cur_edge->vert; + tri_vert_1_idx = ++vertex_index; + mesh_vert = &mesh_buffer_data[tri_vert_1_idx]; + mesh_vert->x = simd4f_get_x(cur_vert->p); + mesh_vert->y = simd4f_get_y(cur_vert->p); + mesh_vert->z = simd4f_get_z(cur_vert->p); + mesh_vert->w = 1.f; + mesh_vert->nx = simd4f_get_x(plane.n); + mesh_vert->ny = simd4f_get_y(plane.n); + mesh_vert->nz = simd4f_get_z(plane.n); + mesh_vert->color[0] = fabs(mesh_vert->nx) * 255; + mesh_vert->color[1] = fabs(mesh_vert->ny) * 255; + mesh_vert->color[2] = fabs(mesh_vert->nz) * 255; + mesh_vert->color[3] = 255; + + do { + // add face_vert0 + index_buffer_data[++index_count] = tri_vert_0_idx; + + // add face_vert1 + index_buffer_data[++index_count] = tri_vert_1_idx; + + next_edge = cur_edge->next; + next_vert = next_edge->vert; + tri_vert_2_idx = ++vertex_index; + + mesh_vert = &mesh_buffer_data[tri_vert_2_idx]; + mesh_vert->x = simd4f_get_x(next_vert->p); + mesh_vert->y = simd4f_get_y(next_vert->p); + mesh_vert->z = simd4f_get_z(next_vert->p); + mesh_vert->w = 1.f; + mesh_vert->nx = simd4f_get_x(plane.n); + mesh_vert->ny = simd4f_get_y(plane.n); + mesh_vert->nz = simd4f_get_z(plane.n); + mesh_vert->color[0] = fabs(mesh_vert->nx) * 255; + mesh_vert->color[1] = fabs(mesh_vert->ny) * 255; + mesh_vert->color[2] = fabs(mesh_vert->nz) * 255; + mesh_vert->color[3] = 255; + index_buffer_data[++index_count] = tri_vert_2_idx; + + triangle_count++; + cur_edge = next_edge; + tri_vert_1_idx = tri_vert_2_idx; + } while (next_edge->next != edge0); + } + + box_hull_mesh = srmesh_create( + mesh_buffer_data, + vertex_index + 1, + index_buffer_data, + index_count + 1, + GL_TRIANGLES, + index_count + 1); +} + +void SconvHUllSceneCleanup() { srmesh_destroy(box_hull_mesh); } + +void SconvHUllSceneUpdate() {} + +void SconvHullSceneRender(srcmdbuf* render_commands) { + // Populate render commands + srcmdbuf_clear(render_commands); + + srcmd rcmd; + srcmd_clear(&rcmd); + + rcmd.type = SRndrCmdTypeFrame; + srcmdbuf_add(render_commands, &rcmd); + + rcmd.type = SRndrCmdTypeGrid; + float origin[3] = {0.f, 0.f, 0.f}; + + for (int i = -1; i <= 1; i++) { + for (int j = -1; j <= 1; j++) { + simd4x4f_translation( + &rcmd.mat, + origin[0] + i * 10.0f, + origin[1], + origin[2] + j * 10.f); + srcmdbuf_add(render_commands, &rcmd); + } + } + + // Render hull + srcmd cmd; + cmd.type = SrndrCmdTypeMesh; + cmd.color = simd4f_create(1.f, 1.f, 1.f, 1.f); + simd4x4f_identity(&cmd.mat); + cmd.meshdata = box_hull_mesh; + + srcmdbuf_add(render_commands, &cmd); +} + +void ImSRenderWidget(srndr* renderer, srview* view) { ZoneScoped; const ImGuiStyle& imgui_style = ImGui::GetStyle(); @@ -420,7 +625,7 @@ void DoRender() { // Update the gCameraState->mtxView const ImVec2 content_avail = ImGui::GetContentRegionAvail(); - srview_set_size(gView, int(content_avail.x), int(content_avail.y)); + srview_set_size(view, int(content_avail.x), int(content_avail.y)); float view_width = content_avail.x / 50.f; float view_height = content_avail.y / 50.f; @@ -439,34 +644,12 @@ void DoRender() { view_width / view_height, 0.1f, 50.f); - srview_set_view(gView, gCameraState->mtxView); - srview_set_proj(gView, gProjMatrix); - - // Populate render commands - srcmdbuf_clear(gRndrCmds); - - srcmd rcmd; - srcmd_clear(&rcmd); - - rcmd.type = SRndrCmdTypeFrame; - srcmdbuf_add(gRndrCmds, &rcmd); - - if (gViewMode == ViewModeSimulation) { - simulator_draw(gRndrCmds); - - if (gDialogs->mSimulator) { - ImGui::Begin("Simulator", &gDialogs->mSimulator); - simulator_gui(); - ImGui::End(); - } - } else { - RenderGuizmoTest(gRndrCmds); - } + srview_set_view(view, gCameraState->mtxView); + srview_set_proj(view, gProjMatrix); // Perform the actual render - srndr_render(gRndr, gView, gRndrCmds); GLuint view_texture; - srview_get_output_texture(gView, &view_texture); + srview_get_output_texture(view, &view_texture); ImGui::Image( (void*)view_texture, @@ -483,7 +666,7 @@ void DoRender() { (float*)(&gTransformMatrix)); ImGui::End(); -} +}; int main() { gTimerInit(); @@ -574,7 +757,12 @@ int main() { gRndr = srndr_create(); gView = srview_create(); gRndrCmds = srcmdbuf_create(1024); + + // + // Scene init + // simulator_init(); + SconvHUllSceneInit(); simd4x4f_translation(&gCameraState->mtxView, 0.1f, 0.1f, -0.5f); simd4f eye = simd4f_create(0.f, 0.f, 10.f, 1.f); @@ -607,6 +795,7 @@ int main() { ImGui_ImplOpenGL3_NewFrame(); ImGui_ImplGlfw_NewFrame(); ImGui::NewFrame(); + ShowDockspace(true); ImGuizmo::BeginFrame(); ImGuizmo::Enable(gGizmoEnabled); } @@ -710,19 +899,22 @@ int main() { if (changed) { CameraState_CalcToMatrix(gCameraState, &gCameraState->mtxView); } + + if (gDialogs->mImGuiDemo) { + ImGui::ShowDemoWindow(&gDialogs->mImGuiDemo); + } + ImGui::End(); } - if (gDialogs->mImGuiDemo) { - ImGui::ShowDemoWindow(&gDialogs->mImGuiDemo); - } - - ShowDockspace(true); - - DoRender(); + SconvHullSceneRender(gRndrCmds); + // SimulatorSceneRender(gRndrCmds); + srndr_render(gRndr, gView, gRndrCmds); + ImSRenderWidget(gRndr, gView); } simulator_update(gTimer->mDeltaTime); + SconvHUllSceneUpdate(); { ZoneNamedN(render_submit, "RenderSubmit", true); @@ -772,6 +964,8 @@ int main() { gLog("Exiting application"); + SconvHUllSceneCleanup(); + srview_destroy(gView); srndr_destroy(gRndr);