src/graphics, src/ui: reworked GLArea generation and setup
This commit is contained in:
parent
9bb7cefc2f
commit
ff35840a26
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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");
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
@ -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++)
|
||||
|
|
Loading…
Reference in New Issue