diff --git a/include/graphics.h b/include/graphics.h index d163bb4..f7de3da 100644 --- a/include/graphics.h +++ b/include/graphics.h @@ -86,7 +86,7 @@ extern struct graphic_stack_t *graphic_stack; * * @return true if initialized */ -int graphics_init(void); +int graphics_init(void *error_buffer); /* * Draws the current buffer to a gl_area @@ -104,7 +104,7 @@ void graphics_draw(const int stack_id); * * @return true if success */ -bool graphics_shutdown(const int stack_id); +bool graphics_shutdown(const int stack_id, void *error_buffer); /* * Initializes the shaders of a gl_area and link them to a program diff --git a/include/ui.h b/include/ui.h index a729d40..0995eea 100644 --- a/include/ui.h +++ b/include/ui.h @@ -189,7 +189,7 @@ long ui_get_graphic_stack(void *container_widget); * * @returns bool, true if success */ -bool ui_init_graphic_stack(void *container_widget); +bool ui_init_graphic_stack(void *container_widget, GError *error_buffer); /* * Look for stack entry and shutdowns OpenGL for it @@ -198,7 +198,7 @@ bool ui_init_graphic_stack(void *container_widget); * * @returns bool, true if success */ -bool ui_shutdown_graphic_stack(void *container_widget); +bool ui_shutdown_graphic_stack(void *container_widget, GError *error_buffer); void ui_clean_stack_index(void); @@ -229,3 +229,4 @@ void ui_shutdown_all_graphic_stacks(void); * @returns bool, true if success */ bool ui_update_axis_stack(GtkWidget *container_widget, int axis, int value); + diff --git a/src/graphics/draw.c b/src/graphics/draw.c index 43aedb2..c596e90 100644 --- a/src/graphics/draw.c +++ b/src/graphics/draw.c @@ -41,20 +41,20 @@ void graphics_draw_vertex (const int stack_id, GLfloat y, GLfloat z) { - printf("stack_id is %d\n", stack_id); - printf("stack_id is %d\n", stack_id); - printf("graphic_stack is at %p\n", graphic_stack); - printf("graphic_stack[stack_id] is at %p\n", graphic_stack + stack_id); + //g_printerr("stack_id is %d\n", stack_id); + //g_printerr("stack_id is %d\n", stack_id); + //g_printerr("graphic_stack is at %p\n", graphic_stack); + //g_printerr("graphic_stack[stack_id] is at %p\n", graphic_stack + stack_id); struct graphic_stack_t *stack = &graphic_stack[stack_id]; //assert (stack->buffer_vertex_origin); - printf("Currently stack->buffer_vertex_origin @ %p\n", stack->buffer_vertex_origin); + //g_printerr("Currently stack->buffer_vertex_origin @ %p\n", stack->buffer_vertex_origin); stack->buffer_vertex_origin = g_realloc (stack->buffer_vertex_origin, (stack->buffer_vertex_size + 3) * sizeof(GLfloat)); - print_stack(stack_id); + //print_stack(stack_id); stack->buffer_vertex_origin[stack->buffer_vertex_size + 0] = x; stack->buffer_vertex_origin[stack->buffer_vertex_size + 1] = y; @@ -150,6 +150,10 @@ void graphics_draw(const int stack_id) { struct graphic_stack_t *stack = &graphic_stack[stack_id]; + //g_printerr("[debug] graphics_draw() started\n"); + + //print_stack(stack_id); + float m[16]; float v[16]; float p[16]; @@ -169,9 +173,7 @@ void graphics_draw(const int stack_id) /* Use our shaders */ glUseProgram(stack->program); -// if (pref_show_space_design_mix_colors == 0) - glClearColor(0, 0, 0, 0.4f); - + glClearColor(0, 0, 0, 1); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); /* Update the "mvp" matrix we use in the shader */ @@ -201,4 +203,5 @@ void graphics_draw(const int stack_id) glUseProgram(0); glFlush(); + //g_printerr("[debug] graphics_draw() ended\n"); } diff --git a/src/graphics/graphics.c b/src/graphics/graphics.c index cd2e8db..921c85c 100644 --- a/src/graphics/graphics.c +++ b/src/graphics/graphics.c @@ -91,7 +91,7 @@ static void graphics_debug_callback(GLenum source, GLenum type, GLuint id, code = glGetError(); string = gluErrorString(code); - printf("[%s] %s (%s) from %s: %s\n", + g_printerr("[%s] %s (%s) from %s: %s\n", errseverity, string, errtype, errsource, msg); } @@ -104,16 +104,17 @@ static void graphics_debug_callback(GLenum source, GLenum type, GLuint id, * * @return id if initialized */ -int graphics_init(void) +int graphics_init(void *error_buffer) { int cur_id = 0; struct graphic_stack_t *stack; - g_printerr("[debug] graphics_init()\n"); + /* g_printerr("[debug] graphics_init()\n"); */ if (graphic_stack == NULL) { graphic_stack = g_malloc0(sizeof(struct graphic_stack_t)); graphic_stack_size = 1; + /* g_printerr("[debug] graphics_init(): init graphic_stack @ %p\n", graphic_stack); */ } else { // Check if there are free slots if (free_stack_slot_size) { @@ -131,9 +132,9 @@ int graphics_init(void) } } - g_printerr("[debug] graphics_init() : graphic_stack (@0x%p) has %ld elements\n", - graphic_stack, - graphic_stack_size); + /* g_printerr("[debug] graphics_init() : graphic_stack (@0x%p) has %ld elements\n", */ + /* graphic_stack, */ + /* graphic_stack_size); */ stack = &graphic_stack[cur_id]; stack->id = cur_id; @@ -145,13 +146,13 @@ int graphics_init(void) if (!graphics_init_shaders(cur_id)) return -1; - print_stack(cur_id); + //print_stack(cur_id); graphics_init_buffers(cur_id); glDebugMessageCallback(graphics_debug_callback, NULL); - print_stack(cur_id); + //print_stack(cur_id); return cur_id; } @@ -163,12 +164,11 @@ int graphics_init(void) * * @return true if success */ -bool graphics_shutdown(const int id) +bool graphics_shutdown(const int id, void *error_buffer) { struct graphic_stack_t *stack; - if (id == 0 || - id >= graphic_stack_size || + if (id >= graphic_stack_size || graphic_stack_size == 0 || graphic_stack == NULL) return false; diff --git a/src/ui/events.c b/src/ui/events.c index 3e1b167..b7eb65d 100644 --- a/src/ui/events.c +++ b/src/ui/events.c @@ -211,7 +211,6 @@ void on_axis_value_change(GtkAdjustment *adjustment, gpointer data) gtk_adjustment_get_value(adjustment)); /* Update the contents of the GL drawing area */ - //gtk_widget_queue_draw(gl_area); } gboolean on_glarea_render(GtkGLArea *area, GdkGLContext *context) @@ -235,6 +234,11 @@ gboolean on_glarea_render(GtkGLArea *area, GdkGLContext *context) /* We need to set up our state when we realize the GtkGLArea widget */ void on_glarea_realize(GtkWidget *widget) { + GError *internal_error = NULL; + + // Make the GL context current to be able to call the GL API + gtk_gl_area_make_current(GTK_GL_AREA(widget)); + // Check if the widget is a glarea if(gtk_gl_area_get_error(GTK_GL_AREA(widget)) != NULL) { ui_send_internal_notification("An OpenGL error occured !"); @@ -242,7 +246,8 @@ void on_glarea_realize(GtkWidget *widget) } // Link graphical stack to widget - if (ui_init_graphic_stack(gtk_widget_get_parent(widget)) == false) { + if (ui_init_graphic_stack(gtk_widget_get_parent(widget), + internal_error) == false) { ui_send_internal_notification( "Failed to link the graphic stack to widgets !"); return; @@ -254,6 +259,11 @@ void on_glarea_realize(GtkWidget *widget) /* We should tear down the state when unrealizing */ void on_glarea_unrealize(GtkWidget *widget) { + GError *internal_error = NULL; + + // Make the GL context current to be able to call the GL API + gtk_gl_area_make_current(GTK_GL_AREA(widget)); + // Check if the widget is a glarea if(gtk_gl_area_get_error(GTK_GL_AREA(widget)) != NULL) { ui_send_internal_notification("An OpenGL error occured !"); @@ -261,7 +271,8 @@ void on_glarea_unrealize(GtkWidget *widget) } // Destroy graphic stack - if (ui_shutdown_graphic_stack(ui_shutdown_graphic_stack) == false) { + if (ui_shutdown_graphic_stack(gtk_widget_get_parent(widget), + internal_error) == false) { ui_send_internal_notification( "Failed to shutdown the graphic stack !"); return; @@ -340,3 +351,4 @@ void on_openfile_response_complete(GObject *source_object, ui_enable_action("togglesidebar"); ui_set_stack(RUN_MODE); } + diff --git a/src/ui/graphics.c b/src/ui/graphics.c index b467a3e..ec37f17 100644 --- a/src/ui/graphics.c +++ b/src/ui/graphics.c @@ -32,6 +32,7 @@ struct stack_index_t { long stack_id; void *container_widget; + void *gl_area; }; static struct stack_index_t *stack_index = NULL; @@ -81,22 +82,22 @@ long ui_is_graphic_stack_ready(void *container_widget) * * @returns bool, true if success */ -bool ui_init_graphic_stack(void *container_widget) +bool ui_init_graphic_stack(void *container_widget, GError *error_buffer) { - g_printerr("[debug] ui_init_graphic_stack()\n"); + //g_printerr("[debug] ui_init_graphic_stack()\n"); - g_printerr("[debug] ui_init_graphic_stack() : target is %p\n", container_widget); + //g_printerr("[debug] ui_init_graphic_stack() : target is %p\n", container_widget); // look for stack_index entry for (int i = 0; i < stack_index_size; i++) { - g_printerr("[debug] ui_init_graphic_stack() : i is %d\n", i); - g_printerr("[debug] ui_init_graphic_stack() : target would be %p\n", - stack_index[i].container_widget); + //g_printerr("[debug] ui_init_graphic_stack() : i is %d\n", i); + //g_printerr("[debug] ui_init_graphic_stack() : target would be %p\n", + //stack_index[i].container_widget); if (stack_index[i].container_widget == (void *)container_widget) { - stack_index[i].stack_id = graphics_init(); - g_printerr("[debug] ui_init_graphic_stack() : stack_id is %d\n", - stack_index[i].stack_id); - if (stack_index[i].stack_id > 0) + stack_index[i].stack_id = graphics_init(&error_buffer); + //g_printerr("[debug] ui_init_graphic_stack() : stack_id is %d\n", + //stack_index[i].stack_id); + if (stack_index[i].stack_id >= 0) return true; else return false; @@ -112,12 +113,13 @@ bool ui_init_graphic_stack(void *container_widget) * * @returns bool, true if success */ -bool ui_shutdown_graphic_stack(void *container_widget) +bool ui_shutdown_graphic_stack(void *container_widget, GError *error_buffer) { // look for stack_index entry for (int i = 0; i < stack_index_size; i++) { if (stack_index[i].container_widget == (void *)container_widget) { - if (graphics_shutdown(stack_index[i].stack_id) == false) { + if (graphics_shutdown(stack_index[i].stack_id, + &error_buffer) == false) { return false; } stack_index[i].stack_id = 0; @@ -169,6 +171,7 @@ bool ui_update_axis_stack(GtkWidget *container_widget, int axis, int value) for (int i = 0; i < stack_index_size; i++) { if (stack_index[i].container_widget == (void *)container_widget) { graphic_stack[stack_index[i].stack_id].rotation_angles[axis] = value; + gtk_widget_queue_draw((GtkWidget*)(stack_index[i].gl_area)); return true; } } @@ -186,7 +189,7 @@ void ui_shutdown_all_graphic_stacks(void) { // look for stack_index entry for (int i = 0; i < stack_index_size; i++) { - graphics_shutdown(stack_index[i].stack_id); + graphics_shutdown(stack_index[i].stack_id, NULL); } return; } @@ -253,11 +256,11 @@ bool ui_setup_glarea(int target_mode, GtkWidget *target_widget) { GtkWidget *gl_area; - g_printerr("[debug] ui_setup_glarea()\n"); + //g_printerr("[debug] ui_setup_glarea()\n"); assert(target_widget); - g_printerr("[debug] ui_setup_glarea() : target is %p\n", target_widget); + //g_printerr("[debug] ui_setup_glarea() : target is %p\n", target_widget); if (stack_index == NULL) { stack_index = g_malloc(sizeof(struct stack_index_t)); @@ -275,17 +278,16 @@ bool ui_setup_glarea(int target_mode, GtkWidget *target_widget) ++stack_index_size * sizeof(struct stack_index_t)); } - stack_index[stack_index_size-1].container_widget = - (void*)target_widget; - g_printerr("[debug] ui_setup_glarea() : set target to\n", target_widget); - - g_printerr("[debug] ui_setup_glarea() : stack_index (@0x%p) had %ld elements\n", - stack_index, - stack_index_size); - gl_area = GTK_WIDGET(gtk_gl_area_new()); assert(gl_area); + 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_set_size_request(gl_area, 500, 500); + gtk_gl_area_set_auto_render(GTK_GL_AREA(gl_area), true); + // The main "draw" call for GtkGLArea g_signal_connect(GTK_GL_AREA(gl_area), "render", @@ -299,24 +301,19 @@ bool ui_setup_glarea(int target_mode, GtkWidget *target_widget) "unrealize", G_CALLBACK(on_glarea_unrealize), NULL); + stack_index[stack_index_size-1].container_widget = + (void*)target_widget; + + stack_index[stack_index_size-1].gl_area = (void*)gl_area; + + //g_printerr("[debug] ui_setup_glarea() : set target to %p\n", target_widget); + + //g_printerr("[debug] ui_setup_glarea() : stack_index (@0x%p) had %ld elements\n", + //stack_index, + //stack_index_size); + gtk_box_append(GTK_BOX(target_widget), gl_area); - //gtk_widget_show(GTK_WIDGET(gl_area)); - - // We need to initialize and free GL resources, so we use - // the realize and unrealize signals on the widget - // - - - /* 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_set_size_request(gl_area, 500, 500); */ - - /* gtk_gl_area_set_required_version(GTK_GL_AREA(gl_area), */ - /* GL_TARGET_MINOR_VERSION, */ - /* GL_TARGET_MAJOR_VERSION); */ - + gtk_widget_show(GTK_WIDGET(gl_area)); // Create sliders for(int i = 0; i < N_AXIS; i++)