From 86a07a035a7b3f60f213ffd0d1360fc0c3f0acc0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mario=20H=C3=BCttel?= Date: Sat, 27 Jun 2020 22:08:34 +0200 Subject: [PATCH] Draw red example triangle --- lib/CMakeLists.txt | 17 ++++++++ lib/shaders/monochrome.fragment.glsl | 10 +++++ lib/shaders/passthrough2d.vertex.glsl | 8 ++++ lib/shaders/passthrough3d.vertex.glsl | 8 ++++ lib/src/gtk-graph-view.c | 56 +++++++++++++++++++++++++-- shimatta-opengl | 2 +- 6 files changed, 97 insertions(+), 4 deletions(-) create mode 100644 lib/shaders/monochrome.fragment.glsl create mode 100644 lib/shaders/passthrough2d.vertex.glsl create mode 100644 lib/shaders/passthrough3d.vertex.glsl diff --git a/lib/CMakeLists.txt b/lib/CMakeLists.txt index abfc3f9..2733438 100644 --- a/lib/CMakeLists.txt +++ b/lib/CMakeLists.txt @@ -9,9 +9,26 @@ pkg_check_modules(EPOXY REQUIRED epoxy) add_compile_options(-Wall -Wextra -Wold-style-declaration -Wuninitialized -Wmaybe-uninitialized -Wunused-parameter) aux_source_directory("src" SRC_DIR) +IF(CMAKE_BUILD_TYPE STREQUAL "Debug") + message("${Yellow}Debug mode for shader locations used!${ColorReset}") + add_definitions(-DSHADER_DIRECTORY=\"${CMAKE_CURRENT_BINARY_DIR}/shaders\") + message("${BoldMagenta}${CMAKE_CURRENT_BINARY_DIR}/shaders used as shader directory${ColorReset}") +else(CMAKE_BUILD_TYPE STREQUAL "Debug") + message("Global shader directory used. Make sure files in /usr/share/gtk-graph-view/shaders are available") + add_definitions(-DSHADER_DIRECTORY=\"/usr/share/gtk-graph-view/shaders\") +ENDIF(CMAKE_BUILD_TYPE STREQUAL "Debug") + + add_library(${PROJECT_NAME} SHARED ${SRC_DIR}) target_include_directories(${PROJECT_NAME} PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/include) target_include_directories(${PROJECT_NAME} PRIVATE ${EPOXY_INCLUDE_DIRS}) target_link_libraries(${PROJECT_NAME} PUBLIC ${GLIB_LDFLAGS} ${GTK3_LDFLAGS} ${EPOXY_LDFLAGS} shimatta-opengl) target_link_directories(${PROJECT_NAME} PUBLIC ${GLIB_LINK_DIRS} ${GTK3_LINK_DIRS} ${EPOXY_LINK_DIRS}) target_include_directories(${PROJECT_NAME} PUBLIC ${GLIB_INCLUDE_DIRS} ${GTK3_INCLUDE_DIRS}) + +configure_file("${CMAKE_CURRENT_SOURCE_DIR}/shaders/passthrough3d.vertex.glsl" + "${CMAKE_CURRENT_BINARY_DIR}/shaders/passthrough3d.vertex.glsl" COPYONLY) +configure_file("${CMAKE_CURRENT_SOURCE_DIR}/shaders/monochrome.fragment.glsl" + "${CMAKE_CURRENT_BINARY_DIR}/shaders/monochrome.fragment.glsl" COPYONLY) + + diff --git a/lib/shaders/monochrome.fragment.glsl b/lib/shaders/monochrome.fragment.glsl new file mode 100644 index 0000000..53523f2 --- /dev/null +++ b/lib/shaders/monochrome.fragment.glsl @@ -0,0 +1,10 @@ +#version 330 core + +out vec4 fragmentColor; + +uniform vec3 color; + +void main() +{ + fragmentColor = vec4(color.r, color.g, color.b, 1.0); +} diff --git a/lib/shaders/passthrough2d.vertex.glsl b/lib/shaders/passthrough2d.vertex.glsl new file mode 100644 index 0000000..68947b6 --- /dev/null +++ b/lib/shaders/passthrough2d.vertex.glsl @@ -0,0 +1,8 @@ +#version 330 core + +layout (location = 0) in vec2 inputVertex; + +void main() +{ + gl_Position = vec4(inputVertex.x, inputVertex.y, 0.0, 1.0); +} diff --git a/lib/shaders/passthrough3d.vertex.glsl b/lib/shaders/passthrough3d.vertex.glsl new file mode 100644 index 0000000..739cd92 --- /dev/null +++ b/lib/shaders/passthrough3d.vertex.glsl @@ -0,0 +1,8 @@ +#version 330 core + +layout (location = 0) in vec3 inputVertex; + +void main() +{ + gl_Position = vec4(inputVertex.x, inputVertex.y, inputVertex.z, 1.0); +} diff --git a/lib/src/gtk-graph-view.c b/lib/src/gtk-graph-view.c index fdd8b15..4bfc8b1 100644 --- a/lib/src/gtk-graph-view.c +++ b/lib/src/gtk-graph-view.c @@ -17,6 +17,11 @@ #include #include #include +#include + +#ifndef SHADER_DIRECTORY +#define SHADER_DIRECTORY "/usr/share/gtk-graph-view/shaders" +#endif struct _GtkGraphView { GtkBox super; @@ -29,6 +34,9 @@ typedef struct { */ GtkWidget *gl_area; GdkRGBA background_color; + ShimattaOpenglProgram *passthrough_prog; + ShimattaOpenglGraphics *test; + } GtkGraphViewPrivate; G_DEFINE_TYPE_WITH_PRIVATE(GtkGraphView, gtk_graph_view, GTK_TYPE_BOX) @@ -59,6 +67,9 @@ static gboolean gl_render(GtkGLArea *gl_area, GdkGLContext *context, GtkGraphVie gl_area_set_clear_color(gl_area, &priv->background_color); glClear(GL_COLOR_BUFFER_BIT); + + shimatta_opengl_graphics_draw(priv->test); + glFlush(); return TRUE; @@ -91,6 +102,16 @@ static void gtk_graph_view_set_property(GObject *obj, guint property_id, const G } } +void gtk_graph_view_dispose(GObject *obj) +{ + GtkGraphView *graph_view = GTK_GRAPH_VIEW(obj); + GtkGraphViewPrivate *priv = gtk_graph_view_get_instance_private(graph_view); + + if (priv->gl_area) + gtk_gl_area_make_current(GTK_GL_AREA(priv->gl_area)); + g_clear_object(&priv->passthrough_prog); +} + static GParamSpec *gtk_graph_view_properties[N_PROPERTIES] = {NULL}; /** @@ -104,6 +125,7 @@ static void gtk_graph_view_class_init(GtkGraphViewClass *klass) oclass = G_OBJECT_CLASS(klass); oclass->set_property = gtk_graph_view_set_property; oclass->get_property = gtk_graph_view_get_property; + oclass->dispose = gtk_graph_view_dispose; gtk_graph_view_properties[PROP_BG_COLOR] = g_param_spec_boxed("background-color", "background color", "Background color of Graph View", @@ -112,11 +134,38 @@ static void gtk_graph_view_class_init(GtkGraphViewClass *klass) g_object_class_install_properties(oclass, N_PROPERTIES, gtk_graph_view_properties); } -static void gl_area_realize(GtkGLArea *area, gpointer data) +static void gl_area_realize(GtkGLArea *area, GtkGraphView *graph_view) { - (void)data; - gtk_gl_area_make_current(area); + GtkGraphViewPrivate *priv; + char error_text[512]; + int status; + const vec3 color = {1.0f, 0.0f, 0.0f}; + const vec3 vertecies[3] = { + {-0.5f, 0.0f, 0.0f}, + {0.5f, 0.0f, 0.0f}, + {0.0, 0.5f, 0.0f}, + }; + gtk_gl_area_make_current(area); + priv = gtk_graph_view_get_instance_private(graph_view); + + priv->passthrough_prog = shimatta_opengl_program_new_from_file(SHADER_DIRECTORY"/passthrough3d.vertex.glsl", + NULL, + SHADER_DIRECTORY"/monochrome.fragment.glsl"); + status = shimatta_opengl_program_compile(priv->passthrough_prog, error_text, sizeof(error_text)); + if (status) { + g_warning("Error compiling shader: %s", error_text); + } + + priv->test = shimatta_opengl_colored_triangle_new(priv->passthrough_prog, color, vertecies); + shimatta_opengl_graphics_realize(priv->test); +} + +static void gl_area_resize(GtkGLArea *area, GtkGraphView *graph_view) +{ + (void)graph_view; + + gtk_gl_area_queue_render(area); } /** @@ -133,6 +182,7 @@ static void gtk_graph_view_init(GtkGraphView *obj) priv->gl_area = gtk_gl_area_new(); g_signal_connect(priv->gl_area, "render", G_CALLBACK(gl_render), obj); g_signal_connect(priv->gl_area, "realize", G_CALLBACK(gl_area_realize), obj); + g_signal_connect(priv->gl_area, "resize", G_CALLBACK(gl_area_resize), obj); gtk_container_add(GTK_CONTAINER(obj), priv->gl_area); gtk_box_set_child_packing(GTK_BOX(obj), priv->gl_area, TRUE, TRUE, 0, GTK_PACK_START); gtk_widget_show(priv->gl_area); diff --git a/shimatta-opengl b/shimatta-opengl index 97d11cf..93fb12e 160000 --- a/shimatta-opengl +++ b/shimatta-opengl @@ -1 +1 @@ -Subproject commit 97d11cf2b000cadb5e5e2434296e1e3d4d0fe7d3 +Subproject commit 93fb12eb249f7b71f032fb2dc9b7d953b275b242