From 6c322a975939641dd2024115afaae34710cb776a Mon Sep 17 00:00:00 2001 From: PedroEdiaz Date: Sun, 1 Dec 2024 12:19:53 -0600 Subject: [PATCH] Avoid bottle-neck while drwing lines, fix surface --- src/main.c | 10 +++++----- src/main.h | 4 +++- src/mesh.c | 22 +++++++++++----------- src/surface.c | 47 ++++++++++++++++++++++++++--------------------- 4 files changed, 45 insertions(+), 38 deletions(-) diff --git a/src/main.c b/src/main.c index b041fad..6bb1712 100644 --- a/src/main.c +++ b/src/main.c @@ -84,17 +84,17 @@ void main_loop(void) #ifndef DEBUG load_mdl_matrix(shader_plain, 0, 0); - draw_mesh(m_axis, 1); + draw_mesh(m_axis); load_mdl_matrix(shader_plain, 1, 1); - draw_mesh(m_axis, 1); + draw_mesh(m_axis); load_mdl_matrix(shader_plain, 2, 2); - draw_mesh(m_axis, 1); + draw_mesh(m_axis); #endif load_mdl_matrix(shader, 0, 3); - draw_mesh(m_surface, 0); + draw_mesh(m_surface); load_mdl_matrix(shader_plain, 0, 3); - draw_mesh(m_surface, 1); + draw_mesh_lines(m_surface); } int main(void) diff --git a/src/main.h b/src/main.h index a14d487..4798dd2 100644 --- a/src/main.h +++ b/src/main.h @@ -57,7 +57,9 @@ void set_projection_mesh( struct projection ); void destroy_mesh(mesh_t p); -void draw_mesh(mesh_t p, char lines); +void draw_mesh(mesh_t p); + +void draw_mesh_lines(mesh_t p); /* Set background color: diff --git a/src/mesh.c b/src/mesh.c index 0353741..df044ae 100644 --- a/src/mesh.c +++ b/src/mesh.c @@ -91,19 +91,19 @@ void destroy_mesh(mesh_t p) free(p); } -void draw_mesh(mesh_t p, char lines ) +void draw_mesh(mesh_t p) { struct obj *obj = p; glBindVertexArray(obj->vao); - if( lines ) - { - int i; - for (i = 0; i < obj->vertex; i += 3) - glDrawArrays(GL_LINE_LOOP, i, 3); - } - else - { - glDrawArrays(GL_TRIANGLES, 0, obj->vertex); - } + glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); + glDrawArrays(GL_TRIANGLES, 0, obj->vertex); +} +void draw_mesh_lines(mesh_t p) +{ + struct obj *obj = p; + + glBindVertexArray(obj->vao); + glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); + glDrawArrays(GL_TRIANGLES, 0, obj->vertex); } diff --git a/src/surface.c b/src/surface.c index 12a99ab..41f02ea 100644 --- a/src/surface.c +++ b/src/surface.c @@ -20,6 +20,7 @@ #ifdef TEST #include #endif +#include typedef void (*function_t)(float *, int *, int); @@ -62,8 +63,13 @@ void riemman(float *d_surface, int *coords, int grid) void cube(float *d_surface, int *coord, int grid) { - for (int i = 0; i < parm.m; i++) - d_surface[i] = ((float)coord[i] / grid) - 0.5; + int i; + + for (i = 0; i < parm.m; i++) + d_surface[i] = (2*(float)coord[i] / grid) - 1; + + if( parm.m == 2 ) + d_surface[2]=0; } void mobius(float *d_surface, int *coord, int grid) @@ -103,13 +109,12 @@ float *generate_data_surface(unsigned char *s) unsigned int i, j, k, o, p, n; long size, q = 0; float *d_surface; - int *cara; - parm.f = cube; - parm.m = 6; - parm.n = parm.m; - parm.grid = 1; + parm.f = klein; + parm.m = 2; + parm.n = 4; + parm.grid = 16; #ifdef TEST assert(numero_caras(2) == 1); @@ -117,9 +122,9 @@ float *generate_data_surface(unsigned char *s) assert(numero_caras(4) == 24); #endif - cara = malloc(parm.m * sizeof(int)); - *s = parm.m; + *s = parm.n; + cara = malloc(parm.m * sizeof(int)); size = parm.grid * parm.grid * 6 * (parm.n) * numero_caras(parm.m); d_surface = malloc((size + 1) * sizeof(float)); d_surface[0] = size; @@ -143,33 +148,33 @@ float *generate_data_surface(unsigned char *s) { for (j = 0; j < parm.grid; j++) { - cara[o] = i; - cara[p] = j; + cara[p] = i; + cara[o] = j; parm.f(&d_surface[q + 1], cara, parm.grid); q += parm.n; - cara[o] = i + 1; - // cara[p] = j; + cara[p] = i + 1; + cara[o] = j; parm.f(&d_surface[q + 1], cara, parm.grid); q += parm.n; - // cara[o] = i + 1; - cara[p] = j + 1; + cara[p] = i + 1; + cara[o] = j + 1; parm.f(&d_surface[q + 1], cara, parm.grid); q += parm.n; - cara[o] = i; - cara[p] = j; + cara[p] = i; + cara[o] = j; parm.f(&d_surface[q + 1], cara, parm.grid); q += parm.n; - // cara[o] = i; - cara[p] = j + 1; + cara[p] = i; + cara[o] = j + 1; parm.f(&d_surface[q + 1], cara, parm.grid); q += parm.n; - cara[o] = i + 1; - // cara [p] = j + 1; + cara[p] = i + 1; + cara[o] = j + 1; parm.f(&d_surface[q + 1], cara, parm.grid); q += parm.n; }