From 7942e69f5eceee0ba635f7b13cdcad3c982a0bd1 Mon Sep 17 00:00:00 2001 From: Jean Sirmai Date: Sat, 12 Aug 2023 13:42:55 +0200 Subject: [PATCH] WIP: une petite 'Erreur de segmentation' de la fonction create_arrow() mais erase_arrow est OK et l'affichage aussi --- src/graphics/buffers.c | 2 +- src/graphics/graphics.c | 92 +++++++++++++++++++++++++++-------------- 2 files changed, 63 insertions(+), 31 deletions(-) diff --git a/src/graphics/buffers.c b/src/graphics/buffers.c index ec7bfe1..9a1abd0 100644 --- a/src/graphics/buffers.c +++ b/src/graphics/buffers.c @@ -531,7 +531,7 @@ bool compute_space(long model_size_x, long model_size_y, long model_size_z, GLuint *lines_origin, GLuint *plans_origin) { - show_user_choices(model_size_x, model_size_y, model_size_z, + if (0) show_user_choices(model_size_x, model_size_y, model_size_z, arrows, model_arrows_nb, // pref_mark_unit_space, pref_style_lines_planes, pref_style_mix_colors, pref_show_grid); diff --git a/src/graphics/graphics.c b/src/graphics/graphics.c index 32f4a22..be61fe0 100644 --- a/src/graphics/graphics.c +++ b/src/graphics/graphics.c @@ -47,11 +47,11 @@ /* ----------------- V A R I A B L E S G L O B A L E S ------------------ */ // int model_dim; < INUTILE : dim est fonction de model_space_size_x, y ,z) */ -int model_space_size_x = 0; -int model_space_size_y = 0; -int model_space_size_z = 0; -int arrows_nb = 0; -int central_stars_nb = 0; +long model_space_size_x = 0; +long model_space_size_y = 0; +long model_space_size_z = 0; +long arrows_nb = 0; +long central_stars_nb = 0; GLfloat *buffer_vertex_origin = NULL; GLfloat *buffer_colors_origin = NULL; @@ -66,10 +66,10 @@ GLuint *buffer_plans_origin = NULL; int pref_show_grid = 0; // 0, 1, 2, 3, 5, 6, 10, 15, 30, etc int pref_test_diagonal = 0; // diagonal test -int buffer_vertex_size = 0; -int buffer_colors_size = 0; -int buffer_lines_size = 0; // previously in graphics.h struct gl_area_entry.GLuint line_indices_nb; -int buffer_plans_size = 0; // previously in graphics.h struct gl_area_entry.GLuint plan_indices_nb; +long buffer_vertex_size = 0; +long buffer_colors_size = 0; +long buffer_lines_size = 0; // previously in graphics.h struct gl_area_entry.GLuint line_indices_nb; +long buffer_plans_size = 0; // previously in graphics.h struct gl_area_entry.GLuint plan_indices_nb; /* ----------------- O P E N G L D E B U G M E S S A G E S ------------ */ @@ -642,10 +642,10 @@ static void compute_buffers_sizes(int model_space_size_x, // buffer_lines_size += 16 + 20; // draw a small cube with diagonals -// buffer_lines_size -= 2; +// buffer_lines_size -= 2; // == TEST LINES BUFFER SIZE - if (0) printf("allocated buffers sizes :%4d/3 = %3d vertices, %4d/3 = %3d colors,\ - %4d/2 = %3d lines, %4d/3 = %3d plans.\n", + if (0) printf("allocated buffers sizes :%4ld/3 = %3ld vertices, %4ld/3 = %3ld colors,\ + %4ld/2 = %3ld lines, %4ld/3 = %3ld plans.\n", buffer_vertex_size, buffer_vertex_size / 3, buffer_colors_size, buffer_colors_size / 3, buffer_lines_size, buffer_lines_size / 2, @@ -653,23 +653,21 @@ static void compute_buffers_sizes(int model_space_size_x, } - +#define DETAIL 0 static bool rewrite_arrow (GLuint *arrows, long address, long weight, long site, long x, long y, long z) { - printf("write the arrow weight to %ld at (%ld, %ld, %ld, %ld)\n",\ + if (DETAIL) printf("write the arrow weight to %ld at (%ld, %ld, %ld, %ld)\n",\ weight, site, x, y, z); *(arrows + address + 0) = weight; - show_user_choices(model_space_size_x, model_space_size_y, model_space_size_z, - arrows, arrows_nb, pref_show_grid); return 1; /* replaces the load of the existing arrow by the load 'weight' */ } static bool create_arrow (GLuint *arrows, long weight, long site, long x, long y, long z) { - printf("create a new arrow with weight = %ld at (%ld, %ld, %ld, %ld)\n",\ + if (DETAIL) printf("create a new arrow with weight = %ld at (%ld, %ld, %ld, %ld)\n",\ weight, site, x, y, z); arrows_nb ++; @@ -683,17 +681,15 @@ static bool create_arrow (GLuint *arrows, long weight, long site, long x, long y buffer_lines_size += 14; - show_user_choices(model_space_size_x, model_space_size_y, model_space_size_z, - arrows, arrows_nb, pref_show_grid); return 1; } static bool erase_arrow (GLuint *arrows, long address, long site, long x, long y, long z) { - if (1) printf("erase arrow at address %ld with values (%ld, %ld, %ld, %ld)\n",\ + if (DETAIL) printf("erase arrow at address %ld with values (%ld, %ld, %ld, %ld)",\ address / 5, site, x, y, z); - if (1) printf("last arrow is %d, %d, %d, %d, %d\n", + if (DETAIL) printf(" last arrow is %d, %d, %d, %d, %d\n", *(arrows + (arrows_nb - 1) * 5 + 0), *(arrows + (arrows_nb - 1) * 5 + 1), *(arrows + (arrows_nb - 1) * 5 + 2), @@ -710,8 +706,6 @@ static bool erase_arrow (GLuint *arrows, long address, buffer_lines_size -= 14; buffer_lines_origin = g_realloc(buffer_lines_origin, buffer_lines_size * 2 * sizeof(GLuint) * 2); - show_user_choices(model_space_size_x, model_space_size_y, model_space_size_z, - arrows, arrows_nb, pref_show_grid); return 1; } @@ -727,19 +721,48 @@ static long check_for_arrow (GLuint *arrows, long site, long x, long y, long z) f_z = *(arrows + i * 5 + 4); if (f_site == site && f_x == x && f_y == y && f_z == z) { - if (f_weight > 1) printf("weight = %ld ", f_weight); address = i * 5; - printf("found at %ld (%ld / 5 = %ld)\n", address, address, address / 5); - } + if (DETAIL) printf("arrows_nb = %ld checked arrow (%ld,%ld,%ld,%ld) found at address %ld (line %ld)",\ + arrows_nb, site, x, y, z, address, address / 5); + if (DETAIL && f_weight > 1) printf(" weight = %ld", f_weight); + printf("\n"); + } } return address; /* returns the address of the arrow if there is one * or (-1) if there is none */ } +static void show_arrows_array (GLuint *arrows, long arrows_nb, long address, long weight, long site, long x, long y, long z) +{ + printf("\n\n[ n] load | site x y z ----- < arrows_nb = %ld > -------", arrows_nb); + if (arrows_nb == address) printf(" graphic state ----------------\n"); + else printf("------------------------------------------\n"); + + for (int i = 0; i < arrows_nb; i++) + { + printf("[%2d] = %2d | %2d, %2d, %2d, %2d ",\ + i, *(arrows + i * 5 + 0), *(arrows + i * 5 + 1), *(arrows + i * 5 + 2),\ + *(arrows + i * 5 + 3), *(arrows + i * 5 + 4)); + if (weight == 0 && i == address / 5) printf(" <<<| < - > (%d, %d, %d, %d) @ [%ld]",\ + *(arrows + i * 5 + 1), *(arrows + i * 5 + 2),\ + *(arrows + i * 5 + 3), *(arrows + i * 5 + 4), address / 5); + if (weight > 0 && i == arrows_nb - 1) printf(" <<< < + > (%d, %d, %d, %d) @ [%ld]",\ + *(arrows + i * 5 + 1), *(arrows + i * 5 + 2),\ + *(arrows + i * 5 + 3), *(arrows + i * 5 + 4), address / 5); + if (weight == 0 && i > address / 5 && i < arrows_nb - 1) printf(" |"); + if (weight == 0 && i == arrows_nb - 1) printf(" >>>|"); + printf("\n"); + } +} + + static bool set_arrow (GLuint *arrows, long weight, long site, long x, long y, long z) { + long address = (check_for_arrow (arrows, site, x, y, z)); + if (1) show_arrows_array(arrows, arrows_nb, address, weight, site, x, y, z); + if (address == -1 && weight == 0) return 0; if (address == -1 && weight > 0) return create_arrow (arrows, weight, site, x, y, z); if (address >= 0 && weight == 0) return erase_arrow (arrows, address, site, x, y, z); @@ -830,13 +853,22 @@ void graphics_init_buffers(const void *gl_area) set_arrow(arrows, 0, 2, 2, 1, 1); set_arrow(arrows, 0, 3, 2, 2, 1); - set_arrow(arrows, 1, 0, 0, 0, 2); - set_arrow(arrows, 1, 1, 1, 0, 2); - set_arrow(arrows, 1, 2, 0, 0, 2); - set_arrow(arrows, 1, 3, 0, 1, 2); + set_arrow(arrows, 0, 0, 0, 0, 0); + set_arrow(arrows, 0, 1, 1, 0, 0); + set_arrow(arrows, 0, 1, 3, 0, 0); + set_arrow(arrows, 0, 0, 2, 0, 0); + set_arrow(arrows, 0, 4, 0, 1, 0); + set_arrow(arrows, 0, 5, 0, 1, 1); + + // set_arrow(arrows, 1, 0, 0, 0, 2); + // set_arrow(arrows, 1, 1, 1, 0, 2); + /* set_arrow(arrows, 1, 2, 0, 0, 2); */ + /* set_arrow(arrows, 1, 3, 0, 1, 2); */ // set_arrow(arrows, 2, 1, 1, 0, 2); + if (1) show_arrows_array(arrows, arrows_nb, arrows_nb, -1, -1, -1, -1, -1); + draw_some_arrows (buffer_lines_origin, s, model_space_size_z * model_space_size_y, model_space_size_z, arrows, arrows_nb);