add linux support

This commit is contained in:
2019-10-03 22:45:01 +02:00
parent c26a4d1e86
commit 96f8cb72d2
9 changed files with 310 additions and 11 deletions

121
linux/CMakeLists.txt Normal file
View File

@@ -0,0 +1,121 @@
cmake_minimum_required(VERSION 3.4.1)
project(panopainter)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++14")
add_executable(panopainter
src/main.cpp
../libs/glad/src/glad.c
../libs/glad/src/glad_glx.c
../libs/yoga/yoga/log.cpp
../libs/yoga/yoga/Utils.cpp
../libs/yoga/yoga/YGConfig.cpp
../libs/yoga/yoga/YGEnums.cpp
../libs/yoga/yoga/YGLayout.cpp
../libs/yoga/yoga/YGMarker.cpp
../libs/yoga/yoga/YGNode.cpp
../libs/yoga/yoga/YGNodePrint.cpp
../libs/yoga/yoga/YGStyle.cpp
../libs/yoga/yoga/YGValue.cpp
../libs/yoga/yoga/Yoga.cpp
../libs/tinyxml2/tinyxml2.cpp
../libs/jpeg/jpgd.cpp
../libs/jpeg/jpge.cpp
../libs/poly2tri/poly2tri/common/shapes.cc
../libs/poly2tri/poly2tri/sweep/advancing_front.cc
../libs/poly2tri/poly2tri/sweep/cdt.cc
../libs/poly2tri/poly2tri/sweep/sweep_context.cc
../libs/poly2tri/poly2tri/sweep/sweep.cc
../libs/fmt/src/format.cc
../src/pch.cpp
../src/util.cpp
../src/rtt.cpp
../src/bezier.cpp
../src/asset.cpp
../src/image.cpp
../src/texture.cpp
../src/font.cpp
../src/shader.cpp
../src/shape.cpp
../src/app.cpp
../src/app_cloud.cpp
../src/app_dialogs.cpp
../src/app_events.cpp
../src/app_layout.cpp
../src/app_shaders.cpp
../src/app_vr.cpp
../src/brush.cpp
../src/canvas.cpp
../src/canvas_layer.cpp
../src/canvas_actions.cpp
../src/canvas_modes.cpp
../src/log.cpp
../src/action.cpp
../src/layout.cpp
../src/version.cpp
../src/node.cpp
../src/node_about.cpp
../src/node_border.cpp
../src/node_button.cpp
../src/node_button_custom.cpp
../src/node_canvas.cpp
../src/node_checkbox.cpp
../src/node_color_quad.cpp
../src/node_colorwheel.cpp
../src/node_combobox.cpp
../src/node_changelog.cpp
../src/node_dialog_browse.cpp
../src/node_dialog_cloud.cpp
../src/node_dialog_open.cpp
../src/node_dialog_picker.cpp
../src/node_dialog_layer_rename.cpp
../src/node_dialog_resize.cpp
../src/node_icon.cpp
../src/node_image.cpp
../src/node_image_texture.cpp
../src/node_message_box.cpp
../src/node_panel_brush.cpp
../src/node_panel_color.cpp
../src/node_panel_grid.cpp
../src/node_panel_floating.cpp
../src/node_panel_layer.cpp
../src/node_panel_stroke.cpp
../src/node_panel_quick.cpp
../src/node_popup_menu.cpp
../src/node_progress_bar.cpp
../src/node_settings.cpp
../src/node_slider.cpp
../src/node_stroke_preview.cpp
../src/node_text.cpp
../src/node_text_input.cpp
../src/node_tool_bucket.cpp
../src/node_usermanual.cpp
../src/node_viewport.cpp
../src/node_scroll.cpp
../src/abr.cpp
../src/binary_stream.cpp
../src/serializer.cpp
../src/settings.cpp
../src/node_input_box.cpp
../src/node_dialog_export_ppbr.cpp
)
target_include_directories(panopainter PRIVATE
src
../src
../libs/glm
../libs/tinyxml2
../libs/yoga
../libs/stb
../libs/jpeg
../libs/poly2tri/poly2tri
../libs/base64
../libs/sqlite3
../libs/nanort
../libs/hash-library
../libs/fmt/include
../libs/glad/include
)
target_link_libraries(panopainter glfw curl GL dl X11 pthread)
target_compile_definitions(panopainter PUBLIC "$<$<CONFIG:DEBUG>:_DEBUG>")

129
linux/src/main.cpp Normal file
View File

@@ -0,0 +1,129 @@
#include <pch.h>
#include <stdio.h>
#include <glad/glad.h>
#include <GLFW/glfw3.h>
#include <app.h>
#include <libgen.h>
#include <pwd.h>
#include <unistd.h>
static App app;
glm::vec2 g_cursor_pos;
int mkpath(const std::string& dir, mode_t mode = ALLPERMS)
{
struct stat sb;
if (dir.empty()) {
errno = EINVAL;
return 1;
}
if (!stat(dir.c_str(), &sb))
return 0;
mkpath(dirname(strdupa(dir.c_str())), mode);
int ret = mkdir(dir.c_str(), mode);
if (ret != 0)
LOG("mkdir failed with error %d on %s", errno, dir.c_str());
return ret;
}
std::string linux_home_path()
{
struct passwd *pw = getpwuid(getuid());
return pw->pw_dir;
}
void linux_update_fps(int frames)
{
static char title_fps[512];
sprintf(title_fps, "PanoPainter - %d fps", frames);
glfwSetWindowTitle(app.glfw_window, title_fps);
}
void error_log(int code, const char * s)
{
printf("glfw error: %s", s);
}
int main(int argc, char** args)
{
GLFWwindow* wnd = nullptr;
glfwSetErrorCallback(error_log);
if (!glfwInit())
{
printf("could not initialize glfw\n");
return 1;
}
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
//glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_FORWARD_COMPAT);
wnd = glfwCreateWindow(800, 600, "PanoPainter", nullptr, nullptr);
if (!wnd)
{
printf("could not create window\n");
return 1;
}
glfwSetCursorPosCallback(wnd, [](GLFWwindow* w, double x, double y){
g_cursor_pos = glm::vec2(x, y);
app.ui_task_async([=]{
app.mouse_move(x, y, 1.f, kEventSource::Mouse, false);
});
});
glfwSetMouseButtonCallback(wnd, [](GLFWwindow* w, int button, int action, int mods){
app.ui_task_async([=]{
if (action == GLFW_PRESS)
app.mouse_down(button, g_cursor_pos.x, g_cursor_pos.y, 1.f, kEventSource::Mouse, false);
else if (action == GLFW_RELEASE)
app.mouse_up(button, g_cursor_pos.x, g_cursor_pos.y, kEventSource::Mouse, false);
});
});
glfwSetWindowSizeCallback(wnd, [](GLFWwindow* wnd, int width, int height){
app.ui_task_async([=]{
app.resize(width, height);
});
});
glfwSetWindowCloseCallback(wnd, [](GLFWwindow* wnd){
app.ui_task([] {
if (!app.request_close())
glfwSetWindowShouldClose(app.glfw_window, GLFW_FALSE);
});
});
glfwMakeContextCurrent(wnd);
if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress))
{
printf("Failed to initialize OpenGL context\n");
return -1;
}
printf("GL: %s\n", glGetString(GL_VERSION));
printf("Renderer: %s\n", glGetString(GL_RENDER));
printf("Vendor: %s\n", glGetString(GL_VENDOR));
glfwShowWindow(wnd);
App::I = &app;
app.initLog();
app.create();
app.width = 800;
app.height = 600;
app.glfw_window = wnd;
app.render_thread_start();
app.ui_thread_start();
while (!glfwWindowShouldClose(wnd))
{
glfwWaitEvents();
}
app.ui_thread_stop();
app.render_thread_stop();
app.terminate();
return 0;
}