src/util/draw/gl.c: draw a red GL area

This commit is contained in:
Adrien Bourmault 2024-09-10 15:20:25 +02:00
parent 0862038597
commit f7f8c5be98
3 changed files with 44 additions and 23 deletions

View File

@ -6,8 +6,8 @@ CPUS ?= $(shell (nproc --all || sysctl -n hw.ncpu) 2>/dev/null || echo 1)
MAKEFLAGS += --jobs=$(CPUS) MAKEFLAGS += --jobs=$(CPUS)
CC=gcc CC=gcc
CFLAGS=`pkg-config --cflags gtk4 gl glib-2.0 libxml-2.0` CFLAGS=`pkg-config --cflags gtk4 epoxy glib-2.0 libxml-2.0`
LDFLAGS=`pkg-config --libs gtk4 gl glib-2.0 libxml-2.0` -lGL -lGLU -lm -lepoxy -lX11 -lGLEW LDFLAGS=`pkg-config --libs gtk4 epoxy glib-2.0 libxml-2.0` -lGL -lGLU -lm -lepoxy -lX11 -lGLEW
WARNINGS = -Wall WARNINGS = -Wall
DEBUG = -ggdb -fno-omit-frame-pointer #-fdiagnostics-color=always -fsanitize=bounds -fstack-check DEBUG = -ggdb -fno-omit-frame-pointer #-fdiagnostics-color=always -fsanitize=bounds -fstack-check
OPTIMIZE = -O3 OPTIMIZE = -O3

View File

@ -17,7 +17,6 @@
"libxml2" "libxml2"
"glu" "glu"
"glew" "glew"
;; "glfw"
"cglm" "cglm"
"libepoxy" "libepoxy"
"pango@1.90.0" "pango@1.90.0"
@ -25,6 +24,7 @@
"glib" "glib"
"mesa-headers" "mesa-headers"
"mesa" "mesa"
"mesa-utils"
"libadwaita" "libadwaita"
) )
) )

View File

@ -27,7 +27,7 @@
#include "../../../include/graphics.h" #include "../../../include/graphics.h"
#include "../../../include/signal.h" #include "../../../include/signal.h"
#define GL_AREA_1000 1000 #define GL_AREA_SIZE 400
struct stack_index_t { struct stack_index_t {
long stack_id; long stack_id;
@ -101,18 +101,18 @@ long util_gl_is_ready(void *container_widget)
*/ */
bool util_gl_init_stack(void *container_widget, GError *error_buffer) bool util_gl_init_stack(void *container_widget, GError *error_buffer)
{ {
g_printerr("[debug] util_gl_init_util_gl_stack()\n"); g_message("[debug] util_gl_init_util_gl_stack()\n");
g_printerr("[debug] util_gl_init_util_gl_stack() : target is %p\n", container_widget); g_message("[debug] util_gl_init_util_gl_stack() : target is %p\n", container_widget);
// look for stack_index entry // look for stack_index entry
for (int i = 0; i < stack_index_size; i++) { for (int i = 0; i < stack_index_size; i++) {
g_printerr("[debug] util_gl_init_util_gl_stack() : i is %d\n", i); g_message("[debug] util_gl_init_util_gl_stack() : i is %d\n", i);
g_printerr("[debug] util_gl_init_util_gl_stack() : target would be %p\n", g_message("[debug] util_gl_init_util_gl_stack() : target would be %p\n",
stack_index[i].container_widget); stack_index[i].container_widget);
if (stack_index[i].container_widget == (void *)container_widget) { if (stack_index[i].container_widget == (void *)container_widget) {
stack_index[i].stack_id = graphics_init(&error_buffer); stack_index[i].stack_id = graphics_init(&error_buffer);
g_printerr("[debug] util_gl_init_util_gl_stack() : stack_id is %ld\n", g_message("[debug] util_gl_init_util_gl_stack() : stack_id is %ld\n",
stack_index[i].stack_id); stack_index[i].stack_id);
if (stack_index[i].stack_id >= 0) if (stack_index[i].stack_id >= 0)
return true; return true;
@ -273,11 +273,11 @@ GtkWidget *create_axis_slider(int axis)
/* { */ /* { */
/* GtkWidget *gl_area; */ /* GtkWidget *gl_area; */
/* g_printerr("[debug] util_gl_setup_glarea()\n"); */ /* g_message("[debug] util_gl_setup_glarea()\n"); */
/* assert(target_widget); */ /* assert(target_widget); */
/* g_printerr("[debug] util_gl_setup_glarea() : target is %p\n", target_widget); */ /* g_message("[debug] util_gl_setup_glarea() : target is %p\n", target_widget); */
/* if (stack_index == NULL) { */ /* if (stack_index == NULL) { */
/* stack_index = g_malloc(sizeof(struct stack_index_t)); */ /* stack_index = g_malloc(sizeof(struct stack_index_t)); */
@ -315,9 +315,9 @@ GtkWidget *create_axis_slider(int axis)
/* stack_index[stack_index_size-1].gl_area = (void*)gl_area; */ /* stack_index[stack_index_size-1].gl_area = (void*)gl_area; */
/* g_printerr("[debug] util_gl_setup_glarea() : set target to %p\n", target_widget); */ /* g_message("[debug] util_gl_setup_glarea() : set target to %p\n", target_widget); */
/* g_printerr("[debug] util_gl_setup_glarea() : stack_index (@0x%p) had %ld elements\n", */ /* g_message("[debug] util_gl_setup_glarea() : stack_index (@0x%p) had %ld elements\n", */
/* stack_index, */ /* stack_index, */
/* stack_index_size); */ /* stack_index_size); */
@ -332,31 +332,52 @@ GtkWidget *create_axis_slider(int axis)
/* } */ /* } */
static void static void
on_realize_debug (GtkGLArea *area) { on_realize_debug (GtkGLArea *area)
// Initialisation du contexte OpenGL {
gdk_gl_context_make_current(gtk_gl_area_get_context(area)); gdk_gl_context_make_current(gtk_gl_area_get_context(area));
if (gtk_gl_area_get_error(area) != NULL) {
// Si nécessaire, ajouter d'autres initialisations OpenGL ici g_message("Failed to create OpenGL context");
}
gtk_gl_area_set_has_depth_buffer(GTK_GL_AREA(area), TRUE);
} }
static gboolean static gboolean
on_render_debug (GtkGLArea *area, GdkGLContext *context) { on_render_debug (GtkGLArea *area, GdkGLContext *context)
// Ici vous pouvez dessiner avec OpenGL {
glClearColor(0.0, 1.0, 0.0, 1.0); // Effacer en vert GLenum err;
while ((err = glGetError()) != GL_NO_ERROR) {
g_warning("OpenGL error: %d", err);
}
int width, height;
width = gtk_widget_get_allocated_width(GTK_WIDGET(area));
height = gtk_widget_get_allocated_height(GTK_WIDGET(area));
g_message("GtkGLArea size: %d x %d", width, height);
glViewport(0, 0, width, height);
glClearColor(1.0, 0.0, 0.0, 1.0);
glClear(GL_COLOR_BUFFER_BIT); glClear(GL_COLOR_BUFFER_BIT);
return TRUE; return TRUE;
} }
bool util_gl_setup_glarea(int target_mode, GtkWidget *target_widget) { bool util_gl_setup_glarea (int target_mode, GtkWidget *target_widget)
{
g_message("[debug] util_gl_setup_glarea()\n");
GtkWidget *gl_area = gtk_gl_area_new(); GtkWidget *gl_area = gtk_gl_area_new();
g_signal_connect(gl_area, "realize", G_CALLBACK(on_realize_debug), NULL); g_signal_connect(gl_area, "realize", G_CALLBACK(on_realize_debug), NULL);
g_signal_connect(gl_area, "render", G_CALLBACK(on_render_debug), NULL); g_signal_connect(gl_area, "render", G_CALLBACK(on_render_debug), NULL);
gtk_box_append(GTK_BOX(target_widget), gl_area); gtk_widget_set_size_request(gl_area, GL_AREA_SIZE, GL_AREA_SIZE);
gtk_gl_area_set_auto_render(GTK_GL_AREA(gl_area), true);
gtk_widget_set_hexpand(gl_area, TRUE);
gtk_widget_set_vexpand(gl_area, TRUE);
gtk_widget_set_halign(gl_area, GTK_ALIGN_CENTER);
gtk_widget_set_valign(gl_area, GTK_ALIGN_CENTER);
gtk_widget_show(gl_area); gtk_box_append (GTK_BOX (target_widget), gl_area);
gtk_widget_set_visible (GTK_WIDGET (gl_area), TRUE);
return TRUE; return TRUE;
} }