Skip to content

Commit

Permalink
opengl3 biuld
Browse files Browse the repository at this point in the history
  • Loading branch information
thorstink committed Sep 13, 2024
1 parent 616e65d commit 00fb107
Show file tree
Hide file tree
Showing 9 changed files with 238 additions and 26 deletions.
2 changes: 2 additions & 0 deletions .github/workflows/config.yml
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,8 @@ jobs:
- uses: actions/checkout@v1
- name: "build project"
run: |
sudo apt-get update
sudo apt-get install -y libglfw3-dev libsdl2-dev gcc-multilib g++-multilib libfreetype6-dev libvulkan-dev
git submodule update --init --recursive
mkdir build
cd build
Expand Down
3 changes: 3 additions & 0 deletions .gitmodules
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
36 changes: 17 additions & 19 deletions symmetri/gui/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -4,14 +4,16 @@ set(CMAKE_CXX_STANDARD 20)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)
find_package(glfw3 REQUIRED)
find_package(ogdf REQUIRED)

if(ASAN_BUILD AND NOT TSAN_BUILD)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g -fsanitize=address,undefined -fno-omit-frame-pointer -O0")
elseif(TSAN_BUILD AND NOT ASAN_BUILD)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g -fsanitize=thread -fno-omit-frame-pointer -O0")
endif()

# just because metal it seems
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-unused-variable")

include_directories(
rpp
imgui
Expand All @@ -22,8 +24,7 @@ include_directories(
extensions
)

set(SOURCES
main.mm
set(APP_SOURCES
reducers.cpp
draw_context_menu.cpp
draw_graph.cpp
Expand All @@ -47,28 +48,25 @@ set(IMGUI_SOURCES
imgui/imgui_widgets.cpp
imgui/imgui_tables.cpp
imgui/backends/imgui_impl_glfw.cpp
imgui/backends/imgui_impl_metal.mm
)

find_library(OPENGL_LIBRARY OpenGL)
set(EXTRA_LIBS
${OPENGL_LIBRARY}
glfw
)
if(APPLE)
message("Using Metal backend")
include_directories(/opt/homebrew/include)
find_library(COCOA_LIBRARY Cocoa)
find_library(OPENGL_LIBRARY OpenGL)
find_library(IOKIT_LIBRARY IOKit)
find_library(COREVIDEO_LIBRARY CoreVideo)
set(EXTRA_LIBS
${COCOA_LIBRARY}
${OPENGL_LIBRARY}
${IOKIT_LIBRARY}
${COREVIDEO_LIBRARY}
glfw
"-framework Metal"
"-framework MetalKit"
"-framework AppKit"
"-framework Foundation"
"-framework QuartzCore"
)
endif(APPLE)
set(ALL_SOURCES ${APP_SOURCES} ${IMGUI_SOURCES} imgui/backends/imgui_impl_metal.mm metal_main.mm)
set(EXTRA_LIBS ${EXTRA_LIBS} ${COCOA_LIBRARY} ${IOKIT_LIBRARY} ${COREVIDEO_LIBRARY} "-framework Metal" "-framework MetalKit" "-framework AppKit" "-framework Foundation" "-framework QuartzCore")
else()
message("Using OpenGL3 backend")
set(ALL_SOURCES ${APP_SOURCES} ${IMGUI_SOURCES} imgui/backends/imgui_impl_opengl3.cpp opengl3_main.cpp)
endif()

add_executable(Farbart ${SOURCES} ${IMGUI_SOURCES})
add_executable(Farbart ${ALL_SOURCES})
target_link_libraries(Farbart symmetri ${EXTRA_LIBS})
2 changes: 1 addition & 1 deletion symmetri/gui/imgui
Submodule imgui updated 101 files
7 changes: 4 additions & 3 deletions symmetri/gui/main.mm → symmetri/gui/metal_main.mm
Original file line number Diff line number Diff line change
Expand Up @@ -86,9 +86,10 @@ int main(int, char **) {

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::with_latest_from(rxu::take_at<1>(),
models | rpp::operators::map([](const model::Model &m) {
return model::ViewModel{std::move(m)};
})) |
rpp::operators::tap(&draw_everything) | rpp::operators::subscribe_with_disposable();

// Main loop
Expand Down
4 changes: 2 additions & 2 deletions symmetri/gui/model.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -44,8 +44,8 @@ ViewModel::ViewModel(const Model& m)
p_positions(m.data->p_positions),
t_fireable(
std::reduce(t_view.begin(), t_view.end(), std::vector<size_t>{},
[&](std::vector<size_t>&& t_fireable, size_t t_idx) {
if (canFire(m.data->net.input_n[t_idx], tokens)) {
[this](std::vector<size_t>&& t_fireable, size_t t_idx) {
if (canFire(this->net.input_n[t_idx], tokens)) {
t_fireable.push_back(t_idx);
}
return std::move(t_fireable);
Expand Down
2 changes: 1 addition & 1 deletion symmetri/gui/model.h
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,7 @@ struct ViewModel {
const std::vector<ImVec2> &t_positions, p_positions;
std::vector<size_t> t_fireable;

static inline ImGui::FileBrowser file_dialog;
static inline ImGui::FileBrowser file_dialog = ImGui::FileBrowser();
ViewModel() = delete;
explicit ViewModel(const Model &m);
};
Expand Down
206 changes: 206 additions & 0 deletions symmetri/gui/opengl3_main.cpp
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;
}
2 changes: 2 additions & 0 deletions symmetri/include/symmetri/colors.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@

/** @file colors.hpp */

#include <string.h>

#include <algorithm>
#include <array> // std::array
#include <cassert>
Expand Down

0 comments on commit 00fb107

Please sign in to comment.