-
Notifications
You must be signed in to change notification settings - Fork 3
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
9 changed files
with
238 additions
and
26 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,3 +1,6 @@ | ||
[submodule "submodules/tinyxml2"] | ||
path = symmetri/submodules/tinyxml2 | ||
url = https://github.com/leethomason/tinyxml2.git | ||
[submodule "symmetri/gui/imgui"] | ||
path = symmetri/gui/imgui | ||
url = https://github.com/ocornut/imgui.git |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,206 @@ | ||
// Dear ImGui: standalone example application for GLFW + OpenGL 3, using | ||
// programmable pipeline (GLFW is a cross-platform general purpose library for | ||
// handling windows, inputs, OpenGL/Vulkan/Metal graphics context creation, | ||
// etc.) | ||
|
||
// Learn about Dear ImGui: | ||
// - FAQ https://dearimgui.com/faq | ||
// - Getting Started https://dearimgui.com/getting-started | ||
// - Documentation https://dearimgui.com/docs (same as your local docs/ | ||
// folder). | ||
// - Introduction, links and more at the top of imgui.cpp | ||
#define IMGUI_DEFINE_MATH_OPERATORS | ||
|
||
#include <stdio.h> | ||
|
||
#include <chrono> | ||
|
||
#include "imgui.h" | ||
#include "imgui_impl_glfw.h" | ||
#include "imgui_impl_opengl3.h" | ||
#define GL_SILENCE_DEPRECATION | ||
#if defined(IMGUI_IMPL_OPENGL_ES2) | ||
#include <GLES2/gl2.h> | ||
#endif | ||
#include <GLFW/glfw3.h> // Will drag system OpenGL headers | ||
|
||
#include "rpp/rpp.hpp" | ||
#include "rxdispatch.h" | ||
#include "rximgui.h" | ||
using namespace rximgui; | ||
#include <iostream> | ||
|
||
#include "draw_ui.h" | ||
#include "model.h" | ||
#include "util.h" | ||
|
||
// [Win32] Our example includes a copy of glfw3.lib pre-compiled with VS2010 to | ||
// maximize ease of testing and compatibility with old VS compilers. To link | ||
// with VS2010-era libraries, VS2015+ requires linking with | ||
// legacy_stdio_definitions.lib, which we do using this pragma. Your own project | ||
// should not be affected, as you are likely to link with a newer binary of GLFW | ||
// that is adequate for your version of Visual Studio. | ||
#if defined(_MSC_VER) && (_MSC_VER >= 1900) && \ | ||
!defined(IMGUI_DISABLE_WIN32_FUNCTIONS) | ||
#pragma comment(lib, "legacy_stdio_definitions") | ||
#endif | ||
|
||
// This example can also compile and run with Emscripten! See | ||
// 'Makefile.emscripten' for details. | ||
#ifdef __EMSCRIPTEN__ | ||
#include "../libs/emscripten/emscripten_mainloop_stub.h" | ||
#endif | ||
|
||
static void glfw_error_callback(int error, const char* description) { | ||
fprintf(stderr, "GLFW Error %d: %s\n", error, description); | ||
} | ||
|
||
// Main code | ||
int main(int, char**) { | ||
glfwSetErrorCallback(glfw_error_callback); | ||
if (!glfwInit()) return 1; | ||
|
||
// Decide GL+GLSL versions | ||
#if defined(IMGUI_IMPL_OPENGL_ES2) | ||
// GL ES 2.0 + GLSL 100 | ||
const char* glsl_version = "#version 100"; | ||
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 2); | ||
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 0); | ||
glfwWindowHint(GLFW_CLIENT_API, GLFW_OPENGL_ES_API); | ||
#elif defined(__APPLE__) | ||
// GL 3.2 + GLSL 150 | ||
const char* glsl_version = "#version 150"; | ||
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3); | ||
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 2); | ||
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); // 3.2+ only | ||
glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE); // Required on Mac | ||
#else | ||
// GL 3.0 + GLSL 130 | ||
const char* glsl_version = "#version 130"; | ||
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3); | ||
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 0); | ||
// glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); // 3.2+ | ||
// only glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE); // 3.0+ only | ||
#endif | ||
|
||
// Create window with graphics context | ||
GLFWwindow* window = glfwCreateWindow( | ||
1280, 720, "Dear ImGui GLFW+OpenGL3 example", nullptr, nullptr); | ||
if (window == nullptr) return 1; | ||
glfwMakeContextCurrent(window); | ||
glfwSwapInterval(1); // Enable vsync | ||
|
||
// Setup Dear ImGui context | ||
IMGUI_CHECKVERSION(); | ||
ImGui::CreateContext(); | ||
ImGuiIO& io = ImGui::GetIO(); | ||
(void)io; | ||
|
||
io.ConfigFlags |= | ||
ImGuiConfigFlags_NavEnableKeyboard; // Enable Keyboard Controls | ||
io.ConfigFlags |= | ||
ImGuiConfigFlags_NavEnableGamepad; // Enable Gamepad Controls | ||
|
||
// Setup Dear ImGui style | ||
ImGui::StyleColorsDark(); | ||
// ImGui::StyleColorsLight(); | ||
|
||
// Setup Platform/Renderer backends | ||
ImGui_ImplGlfw_InitForOpenGL(window, true); | ||
#ifdef __EMSCRIPTEN__ | ||
ImGui_ImplGlfw_InstallEmscriptenCallbacks(window, "#canvas"); | ||
#endif | ||
ImGui_ImplOpenGL3_Init(glsl_version); | ||
|
||
auto reducers = rpp::source::create<model::Reducer>(&rxdispatch::dequeue) | | ||
rpp::operators::subscribe_on(rpp::schedulers::new_thread{}); | ||
|
||
auto models = reducers | | ||
rpp::operators::scan( | ||
model::initializeModel(), | ||
[](model::Model&& m, const model::Reducer& f) { | ||
static size_t i = 0; | ||
std::cout << "update " << i++ | ||
<< ", ref: " << m.data.use_count() << std::endl; | ||
try { | ||
m.data->timestamp = std::chrono::steady_clock::now(); | ||
return f(std::move(m)); | ||
} catch (const std::exception& e) { | ||
printf("%s", e.what()); | ||
return std::move(m); | ||
} | ||
}); | ||
|
||
auto root_subscription = | ||
frames | rpp::operators::subscribe_on(rximgui::rl) | | ||
rpp::operators::with_latest_from( | ||
rxu::take_at<1>(), | ||
models | rpp::operators::map([](const model::Model& m) { | ||
return model::ViewModel{m}; | ||
})) | | ||
rpp::operators::tap(&draw_everything) | | ||
rpp::operators::subscribe_with_disposable(); | ||
|
||
// Main loop | ||
#ifdef __EMSCRIPTEN__ | ||
// For an Emscripten build we are disabling file-system access, so let's not | ||
// attempt to do a fopen() of the imgui.ini file. You may manually call | ||
// LoadIniSettingsFromMemory() to load settings from your own storage. | ||
io.IniFilename = nullptr; | ||
EMSCRIPTEN_MAINLOOP_BEGIN | ||
#else | ||
while (!glfwWindowShouldClose(window)) | ||
#endif | ||
{ | ||
// Poll and handle events (inputs, window resize, etc.) | ||
// You can read the io.WantCaptureMouse, io.WantCaptureKeyboard flags to | ||
// tell if dear imgui wants to use your inputs. | ||
// - When io.WantCaptureMouse is true, do not dispatch mouse input data to | ||
// your main application, or clear/overwrite your copy of the mouse data. | ||
// - When io.WantCaptureKeyboard is true, do not dispatch keyboard input | ||
// data to your main application, or clear/overwrite your copy of the | ||
// keyboard data. Generally you may always pass all inputs to dear imgui, | ||
// and hide them from your application based on those two flags. | ||
glfwPollEvents(); | ||
if (glfwGetWindowAttrib(window, GLFW_ICONIFIED) != 0) { | ||
ImGui_ImplGlfw_Sleep(10); | ||
continue; | ||
} | ||
|
||
// Start the Dear ImGui frame | ||
ImGui_ImplOpenGL3_NewFrame(); | ||
ImGui_ImplGlfw_NewFrame(); | ||
ImGui::NewFrame(); | ||
while (!rl.is_empty()) { | ||
rl.dispatch(); | ||
}; | ||
sendframe(); | ||
while (!rl.is_empty()) { | ||
rl.dispatch(); | ||
}; | ||
// Rendering | ||
ImGui::Render(); | ||
int display_w, display_h; | ||
glfwGetFramebufferSize(window, &display_w, &display_h); | ||
glViewport(0, 0, display_w, display_h); | ||
glClear(GL_COLOR_BUFFER_BIT); | ||
ImGui_ImplOpenGL3_RenderDrawData(ImGui::GetDrawData()); | ||
|
||
glfwSwapBuffers(window); | ||
} | ||
rxdispatch::unsubscribe(); | ||
root_subscription.dispose(); | ||
#ifdef __EMSCRIPTEN__ | ||
EMSCRIPTEN_MAINLOOP_END; | ||
#endif | ||
|
||
// Cleanup | ||
ImGui_ImplOpenGL3_Shutdown(); | ||
ImGui_ImplGlfw_Shutdown(); | ||
ImGui::DestroyContext(); | ||
|
||
glfwDestroyWindow(window); | ||
glfwTerminate(); | ||
|
||
return 0; | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters