WIP: gl_area params allocated
This commit is contained in:
parent
b2e25470ed
commit
abea32cd88
|
@ -32,7 +32,7 @@
|
|||
* of Gem-graph client current gl_areas
|
||||
*/
|
||||
struct gl_area_entry {
|
||||
void *ptr; // ptr to GtkGLArea
|
||||
char name[16];
|
||||
GLuint vao;
|
||||
GLuint position_buffer;
|
||||
GLuint color_buffer;
|
||||
|
@ -50,7 +50,7 @@ struct gl_area_entry {
|
|||
*
|
||||
* @return true if initialized
|
||||
*/
|
||||
bool graphics_init(void *gl_area);
|
||||
bool graphics_init(const char *gl_area);
|
||||
|
||||
/*
|
||||
* Draws the current buffer to a gl_area
|
||||
|
@ -59,7 +59,7 @@ bool graphics_init(void *gl_area);
|
|||
*
|
||||
* @return void
|
||||
*/
|
||||
void graphics_draw(void *gl_area);
|
||||
void graphics_draw(const void *gl_area);
|
||||
|
||||
/*
|
||||
* Shutdowns a gl_area
|
||||
|
@ -68,4 +68,25 @@ void graphics_draw(void *gl_area);
|
|||
*
|
||||
* @return true if success
|
||||
*/
|
||||
bool graphics_shutdown(void *gl_area);
|
||||
bool graphics_shutdown(const void *gl_area);
|
||||
|
||||
/*
|
||||
* Initializes the shaders of a gl_area and link them to a program
|
||||
*
|
||||
* @param gl_area, ptr to the gl_area widget
|
||||
*
|
||||
*
|
||||
* @return true if initialized
|
||||
*/
|
||||
bool graphics_init_shaders(const void *gl_area);
|
||||
|
||||
/*
|
||||
* Initializes the buffer of a gl_area
|
||||
*
|
||||
* @param gl_area, ptr to the gl_area widget
|
||||
*
|
||||
* Note : indices[] is defined in graphics_cube.h
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
void graphics_init_buffers(const void *gl_area);
|
||||
|
|
|
@ -24,6 +24,7 @@
|
|||
|
||||
#include <sys/types.h>
|
||||
#include <sys/stat.h>
|
||||
#include <string.h>
|
||||
#include <stdio.h>
|
||||
#include <fcntl.h>
|
||||
#include <epoxy/gl.h>
|
||||
|
@ -43,13 +44,6 @@
|
|||
|
||||
/* -------------------------------------------------------------------------- */
|
||||
|
||||
/*
|
||||
* Dynamic array of ptr to dynamically allocated gl_area_entry
|
||||
*/
|
||||
struct gl_area_entry **gl_area_array = NULL;
|
||||
|
||||
/* -------------------------------------------------------------------------- */
|
||||
|
||||
/*
|
||||
* Prints verbose human-readable debug messages
|
||||
*
|
||||
|
@ -166,6 +160,179 @@ static void graphics_debug_callback(GLenum source, GLenum type, GLuint id,
|
|||
errseverity, string, errtype, errsource, msg);
|
||||
}
|
||||
|
||||
/* -------------------------------------------------------------------------- */
|
||||
|
||||
/*
|
||||
* Dynamic array of ptrs to dynamically allocated gl_area_entry
|
||||
*/
|
||||
struct gl_area_entry **gl_area_array = NULL;
|
||||
|
||||
|
||||
/*
|
||||
* Find gl_area_entry from a gl_area ptr
|
||||
*
|
||||
* @param gl_area, ptr to the gl_area widget
|
||||
*
|
||||
*
|
||||
* @return entry ptr
|
||||
*/
|
||||
struct gl_area_entry *find_entry_from_ptr(const char *name)
|
||||
{
|
||||
struct gl_area_entry **cur;
|
||||
|
||||
// Check uninitialized and quit
|
||||
if (gl_area_array == NULL) return NULL;
|
||||
|
||||
// Seek in array
|
||||
cur = gl_area_array;
|
||||
while(*cur) {
|
||||
if (strncmp((*cur)->name, name, sizeof((*cur)->name)) == 0) return *cur;
|
||||
cur++;
|
||||
}
|
||||
|
||||
// Nothing found
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/*
|
||||
* Find the gl_area_entry size
|
||||
*
|
||||
* @param void
|
||||
*
|
||||
* @return size of array
|
||||
*/
|
||||
static inline short gl_area_size(void)
|
||||
{
|
||||
struct gl_area_entry **cur;
|
||||
short size;
|
||||
|
||||
// Check uninitialized and quit
|
||||
if (gl_area_array == NULL) return 0;
|
||||
|
||||
cur = gl_area_array;
|
||||
while(*cur) {
|
||||
cur++;
|
||||
size++;
|
||||
}
|
||||
|
||||
return size;
|
||||
}
|
||||
|
||||
/*
|
||||
* Initializes a gl_area
|
||||
*
|
||||
* @param gl_area, ptr to the gl_area widget
|
||||
*
|
||||
* @return true if initialized
|
||||
*/
|
||||
bool graphics_init(const char *gl_area)
|
||||
{
|
||||
short array_size;
|
||||
|
||||
glEnable(GL_DEBUG_OUTPUT);
|
||||
glEnable(GL_DEBUG_OUTPUT_SYNCHRONOUS);
|
||||
glEnable(GL_MULTISAMPLE);
|
||||
|
||||
// Check if not already initialized
|
||||
if (find_entry_from_ptr(gl_area)) {
|
||||
errno = EEXIST;
|
||||
perror("gl_area_array already exists");
|
||||
return false;
|
||||
}
|
||||
|
||||
// Get actual array size
|
||||
array_size = gl_area_size();
|
||||
|
||||
// If it does not exist, allocs it
|
||||
if (gl_area_array == NULL) {
|
||||
gl_area_array = calloc(2, sizeof(struct gl_area_entry *));
|
||||
|
||||
// check if an error occured during allocation
|
||||
if (gl_area_array == NULL) {
|
||||
printf("gl_area_array : %p", gl_area_array);
|
||||
perror("Not enough memory to allocate gl_area_array");
|
||||
return false;
|
||||
}
|
||||
|
||||
// If it does exist, reallocs it
|
||||
} else {
|
||||
gl_area_array = realloc(gl_area_array,
|
||||
(array_size + 1)
|
||||
* sizeof(struct gl_area_entry *));
|
||||
if (gl_area_array == NULL) {
|
||||
perror("Not enough memory to allocate gl_area_array");
|
||||
return false;
|
||||
}
|
||||
|
||||
explicit_bzero(gl_area_array + array_size * sizeof(struct gl_area_entry *),
|
||||
sizeof(struct gl_area_entry *));
|
||||
}
|
||||
|
||||
// Alloc new entry
|
||||
gl_area_array[array_size] = calloc(1, sizeof(struct gl_area_entry));
|
||||
|
||||
if (gl_area_array[array_size] == NULL) {
|
||||
perror("Not enough memory to allocate gl_area_array entry");
|
||||
return false;
|
||||
}
|
||||
|
||||
strcpy(gl_area_array[array_size]->name, gl_area);
|
||||
|
||||
if (!graphics_init_shaders(gl_area)) return false;
|
||||
|
||||
graphics_init_buffers(gl_area);
|
||||
|
||||
glDebugMessageCallback(graphics_debug_callback, NULL);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/*
|
||||
* Shutdowns a gl_area
|
||||
*
|
||||
* @param gl_area, ptr to the gl_area widget
|
||||
*
|
||||
* @return true if success
|
||||
*/
|
||||
bool graphics_shutdown(const void *gl_area)
|
||||
{
|
||||
struct gl_area_entry *entry;
|
||||
|
||||
entry = find_entry_from_ptr(gl_area);
|
||||
|
||||
if (entry == NULL) {
|
||||
errno = EFAULT;
|
||||
perror("gl_area_array entry not found");
|
||||
return false;
|
||||
}
|
||||
|
||||
glDeleteBuffers(1, &entry->position_buffer);
|
||||
glDeleteBuffers(1, &entry->color_buffer);
|
||||
glDeleteProgram(entry->program);
|
||||
|
||||
// Liberate
|
||||
free(entry);
|
||||
|
||||
if (errno) {
|
||||
perror("Impossible to free the gl_area_array entry");
|
||||
return false;
|
||||
}
|
||||
|
||||
entry = NULL;
|
||||
|
||||
gl_area_array = realloc(gl_area_array,
|
||||
(gl_area_size())
|
||||
* sizeof(struct gl_area_entry *));
|
||||
if (errno) {
|
||||
perror("Impossible to shrink gl_area_array");
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/* -------------------------------------------------------------------------- */
|
||||
|
||||
/*
|
||||
* Initializes an identity matrix
|
||||
*
|
||||
|
@ -268,55 +435,7 @@ static inline GLuint create_shader(int type, const char *src)
|
|||
return shader;
|
||||
}
|
||||
|
||||
/*
|
||||
* Find gl_area_entry from a gl_area ptr
|
||||
*
|
||||
* @param gl_area, ptr to the gl_area widget
|
||||
*
|
||||
*
|
||||
* @return entry ptr
|
||||
*/
|
||||
static inline struct gl_area_entry *find_entry_from_ptr(void *ptr)
|
||||
{
|
||||
struct gl_area_entry **cur;
|
||||
|
||||
// Check uninitialized and quit
|
||||
if (gl_area_array == NULL) return NULL;
|
||||
|
||||
// Seek in array
|
||||
cur = gl_area_array;
|
||||
while(*cur) {
|
||||
if ((*cur)->ptr == ptr) return *cur;
|
||||
cur++;
|
||||
}
|
||||
|
||||
// Nothing found
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/*
|
||||
* Find the gl_area_entry size
|
||||
*
|
||||
* @param void
|
||||
*
|
||||
* @return size of array
|
||||
*/
|
||||
static inline short gl_area_size(void)
|
||||
{
|
||||
struct gl_area_entry **cur;
|
||||
short size;
|
||||
|
||||
// Check uninitialized and quit
|
||||
if (gl_area_array == NULL) return 0;
|
||||
|
||||
cur = gl_area_array;
|
||||
while(*cur) {
|
||||
cur++;
|
||||
size++;
|
||||
}
|
||||
|
||||
return size;
|
||||
}
|
||||
/* -------------------------------------------------------------------------- */
|
||||
|
||||
/*
|
||||
* Initializes the shaders of a gl_area and link them to a program
|
||||
|
@ -326,7 +445,7 @@ static inline short gl_area_size(void)
|
|||
*
|
||||
* @return true if initialized
|
||||
*/
|
||||
static bool graphics_init_shaders(void *gl_area)
|
||||
bool graphics_init_shaders(const void *gl_area)
|
||||
{
|
||||
char *vertex_shader;
|
||||
char *fragment_shader;
|
||||
|
@ -437,7 +556,7 @@ static bool graphics_init_shaders(void *gl_area)
|
|||
*
|
||||
* @return void
|
||||
*/
|
||||
static void graphics_init_buffers(void *gl_area)
|
||||
void graphics_init_buffers(const void *gl_area)
|
||||
{
|
||||
GLuint vao, vertex_buffer, color_buffer;
|
||||
struct gl_area_entry *entry;
|
||||
|
@ -475,77 +594,6 @@ static void graphics_init_buffers(void *gl_area)
|
|||
}
|
||||
}
|
||||
|
||||
/* -------------------------------------------------------------------------- */
|
||||
|
||||
/*
|
||||
* Initializes a gl_area
|
||||
*
|
||||
* @param gl_area, ptr to the gl_area widget
|
||||
*
|
||||
* @return true if initialized
|
||||
*/
|
||||
bool graphics_init(void *gl_area)
|
||||
{
|
||||
short array_size;
|
||||
|
||||
glEnable(GL_DEBUG_OUTPUT);
|
||||
glEnable(GL_DEBUG_OUTPUT_SYNCHRONOUS);
|
||||
glEnable(GL_MULTISAMPLE);
|
||||
|
||||
// Check if not already initialized
|
||||
if (find_entry_from_ptr(gl_area)) {
|
||||
errno = EEXIST;
|
||||
perror("gl_area_array already exists");
|
||||
return false;
|
||||
}
|
||||
|
||||
// Get actual array size
|
||||
array_size = gl_area_size();
|
||||
|
||||
// If it does not exist, allocs it
|
||||
if (gl_area_array == NULL) {
|
||||
gl_area_array = calloc(2, sizeof(struct gl_area_entry *));
|
||||
|
||||
// check if an error occured during allocation
|
||||
if (gl_area_array == NULL) {
|
||||
printf("gl_area_array : %p", gl_area_array);
|
||||
perror("Not enough memory to allocate gl_area_array");
|
||||
return false;
|
||||
}
|
||||
|
||||
// If it does exist, reallocs it
|
||||
} else {
|
||||
gl_area_array = realloc(gl_area_array,
|
||||
(array_size + 1)
|
||||
* sizeof(struct gl_area_entry *));
|
||||
if (gl_area_array == NULL) {
|
||||
perror("Not enough memory to allocate gl_area_array");
|
||||
return false;
|
||||
}
|
||||
|
||||
explicit_bzero(gl_area_array + array_size * sizeof(struct gl_area_entry *),
|
||||
sizeof(struct gl_area_entry *));
|
||||
}
|
||||
|
||||
// Alloc new entry
|
||||
gl_area_array[array_size] = calloc(1, sizeof(struct gl_area_entry));
|
||||
|
||||
if (gl_area_array[array_size] == NULL) {
|
||||
perror("Not enough memory to allocate gl_area_array entry");
|
||||
return false;
|
||||
}
|
||||
|
||||
gl_area_array[array_size]->ptr = gl_area;
|
||||
|
||||
if (!graphics_init_shaders(gl_area)) return false;
|
||||
|
||||
graphics_init_buffers(gl_area);
|
||||
|
||||
glDebugMessageCallback(graphics_debug_callback, NULL);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/*
|
||||
* Draws the current buffer to a gl_area
|
||||
*
|
||||
|
@ -553,7 +601,7 @@ bool graphics_init(void *gl_area)
|
|||
*
|
||||
* @return void
|
||||
*/
|
||||
void graphics_draw(void *gl_area)
|
||||
void graphics_draw(const void *gl_area)
|
||||
{
|
||||
float m[16];
|
||||
float v[16];
|
||||
|
@ -612,50 +660,3 @@ void graphics_draw(void *gl_area)
|
|||
|
||||
glFlush();
|
||||
}
|
||||
|
||||
/*
|
||||
* Shutdowns a gl_area
|
||||
*
|
||||
* @param gl_area, ptr to the gl_area widget
|
||||
*
|
||||
* @return true if success
|
||||
*/
|
||||
bool graphics_shutdown(void *gl_area)
|
||||
{
|
||||
struct gl_area_entry *entry;
|
||||
|
||||
entry = find_entry_from_ptr(gl_area);
|
||||
|
||||
if (entry == NULL) {
|
||||
errno = EFAULT;
|
||||
perror("gl_area_array entry not found");
|
||||
return false;
|
||||
}
|
||||
|
||||
glDeleteBuffers(1, &entry->position_buffer);
|
||||
glDeleteBuffers(1, &entry->color_buffer);
|
||||
glDeleteProgram(entry->program);
|
||||
|
||||
// Liberate
|
||||
free(entry);
|
||||
|
||||
if (errno) {
|
||||
perror("Impossible to free the gl_area_array entry");
|
||||
return false;
|
||||
}
|
||||
|
||||
entry = NULL;
|
||||
|
||||
gl_area_array = realloc(gl_area_array,
|
||||
(gl_area_size())
|
||||
* sizeof(struct gl_area_entry *));
|
||||
if (errno) {
|
||||
perror("Impossible to shrink gl_area_array");
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/* -------------------------------------------------------------------------- */
|
||||
|
||||
|
|
|
@ -202,10 +202,10 @@ void on_axis_value_change(GtkAdjustment *adjustment, gpointer data)
|
|||
g_assert(axis >= 0 && axis < N_AXIS);
|
||||
|
||||
/* Update the rotation angle */
|
||||
rotation_angles[axis] = gtk_adjustment_get_value(adjustment);
|
||||
rotation_angles[axis] = gtk_adjustment_get_value(adjustment); //XXX selon widget
|
||||
|
||||
/* Update the contents of the GL drawing area */
|
||||
gtk_widget_queue_draw(gl_area); // XXX selon l'id de la GLArea
|
||||
gtk_widget_queue_draw(gl_area);
|
||||
}
|
||||
|
||||
gboolean on_render(GtkGLArea *area, GdkGLContext *context)
|
||||
|
@ -213,7 +213,7 @@ gboolean on_render(GtkGLArea *area, GdkGLContext *context)
|
|||
if(gtk_gl_area_get_error(area) != NULL)
|
||||
return false;
|
||||
|
||||
graphics_draw((void*)&area);
|
||||
graphics_draw(gtk_widget_get_name(GTK_WIDGET(area)));
|
||||
|
||||
return true;
|
||||
}
|
||||
|
@ -227,7 +227,7 @@ void on_realize(GtkWidget *widget)
|
|||
if(gtk_gl_area_get_error(GTK_GL_AREA(widget)) != NULL)
|
||||
return;
|
||||
|
||||
if (graphics_init((void*)&widget) == false) {
|
||||
if (graphics_init(gtk_widget_get_name(widget)) == false) {
|
||||
ui_send_internal_notification("Failed to allocate GLArea !");
|
||||
}
|
||||
}
|
||||
|
@ -240,7 +240,7 @@ void on_unrealize(GtkWidget *widget)
|
|||
if(gtk_gl_area_get_error(GTK_GL_AREA(widget)) != NULL)
|
||||
return;
|
||||
|
||||
if (graphics_shutdown((void*)&widget)) {
|
||||
if (graphics_shutdown(gtk_widget_get_name(widget))) {
|
||||
ui_send_internal_notification("Failed to allocate GLArea !");
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue