From e9d5dda8894d278bb649d406cf8740a57ee89e73 Mon Sep 17 00:00:00 2001 From: Jean Sirmai Date: Wed, 2 Aug 2023 00:00:08 +0200 Subject: [PATCH] WIP: marche pas, mais je sais pourquoi --- include/buffers.h | 1 + src/graphics/buffers.c | 193 +++++++++++++++++++++++++++++++++------- src/graphics/graphics.c | 145 ++++++++++++++++++------------ 3 files changed, 250 insertions(+), 89 deletions(-) diff --git a/include/buffers.h b/include/buffers.h index 2ed7b8a..e58223d 100644 --- a/include/buffers.h +++ b/include/buffers.h @@ -36,6 +36,7 @@ bool compute_space_and_arrows(long model_space_size_x, int pref_mark_unit_space, int pref_style_lines_planes, int pref_style_mix_colors, + int pref_show_grid, GLfloat *vertex_origin, GLfloat *color_origin, diff --git a/src/graphics/buffers.c b/src/graphics/buffers.c index 46a9a1c..9847d20 100644 --- a/src/graphics/buffers.c +++ b/src/graphics/buffers.c @@ -278,6 +278,7 @@ static bool compute_space_3D (long x, int pref_mark_unit_space, int pref_style_lines_planes, int pref_style_mix_colors, + int pref_show_grid, GLfloat *vertex_origin, GLfloat *colors_origin, @@ -326,30 +327,35 @@ static bool compute_space_3D (long x, if (P) printf("[%ldx%ld=%ld]+[%ldx%ld=%ld]+[%ldx%ld=%ld] = %ld lines [%ldx%ldx%ld] = %ld vertices step_x = %ld step_y = %ld step_z = %ld ",\ x,y,x*y, x,z,x*z, y,z,y*z, x*y + x*z + y*z, x,y,z, x*y*z, step_x, step_y, step_z); - /* for (int u = 0; u < z; u ++){ */ - /* for (int w = 0; w < x; w ++){ */ - /* calcul = step_x * w + step_z * u; */ - /* *(lines_origin + lines_buffer_size) = calcul; lines_buffer_size ++; */ - /* *(lines_origin + lines_buffer_size) = calcul + step_x - step_y; lines_buffer_size ++; */ - /* } */ - /* } */ + float calcul = 0; - /* for (int u = 0; u < y; u ++){ */ - /* for (int w = 0; w < x; w ++){ */ - /* calcul = step_x * w + step_y * u; */ - /* *(lines_origin + lines_buffer_size) = calcul; lines_buffer_size ++; */ - /* *(lines_origin + lines_buffer_size) = calcul + step_y - step_z; lines_buffer_size ++; */ - /* // printf("(%ld>%ld) ", calcul, calcul + step_y - 1); */ - /* } */ - /* } */ + if (! (pref_show_grid % 2)) + for (int u = 0; u < y; u ++){ + for (int w = 0; w < x; w ++){ + calcul = step_x * w + step_y * u; + *(lines_origin + lines_buffer_size) = calcul; lines_buffer_size ++; + *(lines_origin + lines_buffer_size) = calcul + step_y - step_z; lines_buffer_size ++; + // printf("(%ld>%ld) ", calcul, calcul + step_y - 1); + } + } - /* for (int u = 0; u < z; u ++){ */ - /* for (int w = 0; w < y; w ++){ */ - /* calcul = step_y * w + step_y * u; */ - /* *(lines_origin + lines_buffer_size) = calcul; lines_buffer_size ++; */ - /* *(lines_origin + lines_buffer_size) = calcul + step_x * (x - 1); lines_buffer_size ++; */ - /* } */ - /* } */ + if (! (pref_show_grid % 3)) + for (int u = 0; u < z; u ++){ + for (int w = 0; w < x; w ++){ + calcul = step_x * w + step_z * u; + *(lines_origin + lines_buffer_size) = calcul; lines_buffer_size ++; + *(lines_origin + lines_buffer_size) = calcul + step_x - step_y; lines_buffer_size ++; + } + } + + if (! (pref_show_grid % 5)) + for (int u = 0; u < z; u ++){ + for (int w = 0; w < y; w ++){ + calcul = step_y * w + step_y * u; + *(lines_origin + lines_buffer_size) = calcul; lines_buffer_size ++; + *(lines_origin + lines_buffer_size) = calcul + step_x * (x - 1); lines_buffer_size ++; + } + } /* *(lines_origin + lines_buffer_size) = step_z * 1 + step_y * 2 + step_x * 0; lines_buffer_size ++; */ /* *(lines_origin + lines_buffer_size) = step_z * 1 + step_y * 2 + step_x * 2; lines_buffer_size ++; */ @@ -471,7 +477,7 @@ static bool compute_space_3D (long x, -#define ARR 0 +#define ARR 1 static void draw_an_arrow_3D_at(long load, long site, long x, long y, long z, long maximum, @@ -524,8 +530,13 @@ static void draw_an_arrow_3D_at(long load, long site, long x, long y, long z, if (V) printf(" => vertex_buffer_size = %3ld arrow_3D\n", vertex_buffer_size); - *(lines_origin + lines_buffer_size + 0) = vertex_buffer_size - 9; - *(lines_origin + lines_buffer_size + 1) = vertex_buffer_size + 210; + long step_z = 1, step_y = z + 1, step_x = (y + 1) * (z + 1); + + *(lines_origin + lines_buffer_size) = step_z * 0 + step_y * 0 + step_x * 0; lines_buffer_size ++; + *(lines_origin + lines_buffer_size) = step_z * (z - 1) + step_y * (y - 1) + step_x * (x - 1); lines_buffer_size ++; + + /* *(lines_origin + lines_buffer_size + 0) = vertex_buffer_size - 0; */ + /* *(lines_origin + lines_buffer_size + 1) = vertex_buffer_size + 56; */ /* *(lines_origin + lines_buffer_size + 0) = vertex_buffer_size / 3 - 5; */ /* *(lines_origin + lines_buffer_size + 1) = vertex_buffer_size / 3 - 4; */ @@ -662,11 +673,11 @@ static void draw_a_cube_at(long u, long v, long w, *(lines_origin + lines_buffer_size) = step_z * w + step_y * v + step_x * x; lines_buffer_size ++; *(lines_origin + lines_buffer_size) = step_z * z + step_y * y + step_x * u; lines_buffer_size ++; - *(lines_origin + lines_buffer_size) = step_z * w + step_y * y + step_x * u; lines_buffer_size ++; - *(lines_origin + lines_buffer_size) = step_z * z + step_y * v + step_x * x; lines_buffer_size ++; - *(lines_origin + lines_buffer_size) = step_z * z + step_y * v + step_x * u; lines_buffer_size ++; *(lines_origin + lines_buffer_size) = step_z * w + step_y * y + step_x * x; lines_buffer_size ++; + + *(lines_origin + lines_buffer_size) = step_z * w + step_y * y + step_x * u; lines_buffer_size ++; + *(lines_origin + lines_buffer_size) = step_z * z + step_y * v + step_x * x; lines_buffer_size ++; } } @@ -839,6 +850,7 @@ bool compute_space_and_arrows(long model_size_x, int pref_mark_unit_space, int pref_style_lines_planes, int pref_style_mix_colors, + int pref_show_grid, GLfloat *vertex_origin, GLfloat *colors_origin, @@ -864,18 +876,31 @@ bool compute_space_and_arrows(long model_size_x, pref_mark_unit_space, pref_style_lines_planes, pref_style_mix_colors, + pref_show_grid, vertex_origin, colors_origin, lines_origin, plans_origin); - for (long i = 0; i < model_size_x; i++) - for (long j = 0; j < model_size_y; j++) - for (long k = 0; k < model_size_z; k++) - if ((i + j + k) % 2 == 0) draw_a_cube_at (i, j, k, lines_origin, - model_size_x + 1, model_size_y + 1, model_size_z + 1, - 0); // < set to 1 (TRUE) to see the diagonals + /* for (long i = 0; i < model_size_x; i++) */ + /* for (long j = 0; j < model_size_y; j++) */ + /* for (long k = 0; k < model_size_z; k++) */ + /* if ((i + j + k) % 2 == 0) */ + /* draw_a_cube_at ( */ + /* i, j, k, lines_origin, */ + /* model_size_x + 1, model_size_y + 1, model_size_z + 1, */ + /* pref_mark_unit_space); // shows the diagonals of each small cube */ + + draw_a_cube_at ( + 1, 1, 1, lines_origin, + model_size_x + 1, model_size_y + 1, model_size_z + 1, + 0); // shows the diagonals of each small cube + + draw_a_cube_at ( + model_size_x - 2, model_size_y - 2, model_size_z - 2, lines_origin, + model_size_x + 1, model_size_y + 1, model_size_z + 1, + 0); // shows the diagonals of each small cube long maximum = fmax(model_size_x, model_size_y); maximum = fmax(maximum, model_size_z); @@ -913,3 +938,103 @@ bool compute_space_and_arrows(long model_size_x, + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +// REMEMBER (another way to draw space) + + /* for (int u = 0; u < z; u ++){ */ + /* for (int w = 0; w < y; w ++){ */ + /* calcul = step_y * w + step_z * u; */ + /* *(lines_origin + lines_buffer_size) = calcul; lines_buffer_size += 1; */ + /* *(lines_origin + lines_buffer_size) = calcul + step_z - step_x; lines_buffer_size += 1; */ + /* } */ + /* } */ + + + /* for (int u = 0; u < z; u ++){ */ + /* for (int w = 0; w < y; w ++){ */ + /* calcul = step_y * w + step_z * u; */ + /* *(lines_origin + lines_buffer_size) = calcul; lines_buffer_size += 1; */ + /* *(lines_origin + lines_buffer_size) = calcul + z * step_x; lines_buffer_size += 1; */ + /* } */ + /* } */ + + /* for (int u = 0; u < y; u ++){ */ + /* for (int w = 0; w < x; w ++){ */ + /* calcul = step_x * w + step_y * u; */ + /* *(lines_origin + lines_buffer_size) = calcul; lines_buffer_size += 1; */ + /* *(lines_origin + lines_buffer_size) = calcul + step_y - step_z; lines_buffer_size += 1; */ + /* } */ + /* } */ + + /* for (int u = 0; u < x; u ++){ */ + /* for (int w = 0; w < z; w ++){ */ + /* calcul = step_z * w + step_x * u; */ + /* *(lines_origin + lines_buffer_size) = calcul; lines_buffer_size += 1; */ + /* *(lines_origin + lines_buffer_size) = calcul + step_x - step_y; lines_buffer_size += 1; */ + /* } */ + /* } */ + + + /* for (int u = 0; u < y; u ++){ */ + /* for (int w = 0; w < z; w ++){ */ + /* *(lines_origin + lines_buffer_size) = w + z * u; lines_buffer_size += 1; */ + /* *(lines_origin + lines_buffer_size) = x * y * z - y * z + w + z * u; lines_buffer_size += 1; */ + /* } */ + /* } */ + + diff --git a/src/graphics/graphics.c b/src/graphics/graphics.c index 4581425..a4fd9f4 100644 --- a/src/graphics/graphics.c +++ b/src/graphics/graphics.c @@ -59,9 +59,10 @@ GLuint *buffer_plans_origin = NULL; //int pref_3D_xor_2D_space = 0; // default view == 0 == 3D //int pref_3D_xor_2D_arrows = 0; // default view == 0 == 3D -int pref_mark_unit_space = 0; // default == 0 == no marks -int pref_style_lines_planes = 0; // arrows as lines = 0, as planes = 1 -int pref_style_mix_colors = 0; // ... don't know yet ... +int pref_mark_unit_space = 0; // default == 0 == no marks +int pref_style_lines_planes = 0; // arrows as lines = 0, as planes = 1 +int pref_style_mix_colors = 0; // ... don't know yet ... +int pref_show_grid = 0; // 0, 2, 3, 5, 6, 10, 15, 30 int buffer_vertex_size = 0; int buffer_colors_size = 0; @@ -511,58 +512,45 @@ bool graphics_init_shaders(const void *gl_area) -// REMEMBER (It worked almost fine) - - /* for (int u = 0; u < z; u ++){ */ - /* for (int w = 0; w < y; w ++){ */ - /* calcul = step_y * w + step_z * u; */ - /* *(lines_origin + lines_buffer_size) = calcul; lines_buffer_size += 1; */ - /* *(lines_origin + lines_buffer_size) = calcul + step_z - step_x; lines_buffer_size += 1; */ - /* } */ - /* } */ - /* for (int u = 0; u < z; u ++){ */ - /* for (int w = 0; w < y; w ++){ */ - /* calcul = step_y * w + step_z * u; */ - /* *(lines_origin + lines_buffer_size) = calcul; lines_buffer_size += 1; */ - /* *(lines_origin + lines_buffer_size) = calcul + z * step_x; lines_buffer_size += 1; */ - /* } */ - /* } */ - - /* for (int u = 0; u < y; u ++){ */ - /* for (int w = 0; w < x; w ++){ */ - /* calcul = step_x * w + step_y * u; */ - /* *(lines_origin + lines_buffer_size) = calcul; lines_buffer_size += 1; */ - /* *(lines_origin + lines_buffer_size) = calcul + step_y - step_z; lines_buffer_size += 1; */ - /* } */ - /* } */ - - /* for (int u = 0; u < x; u ++){ */ - /* for (int w = 0; w < z; w ++){ */ - /* calcul = step_z * w + step_x * u; */ - /* *(lines_origin + lines_buffer_size) = calcul; lines_buffer_size += 1; */ - /* *(lines_origin + lines_buffer_size) = calcul + step_x - step_y; lines_buffer_size += 1; */ - /* } */ - /* } */ - /* for (int u = 0; u < y; u ++){ */ - /* for (int w = 0; w < z; w ++){ */ - /* *(lines_origin + lines_buffer_size) = w + z * u; lines_buffer_size += 1; */ - /* *(lines_origin + lines_buffer_size) = x * y * z - y * z + w + z * u; lines_buffer_size += 1; */ - /* } */ - /* } */ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + GLuint arrows[] = { - 1, 0, 0, 0, 0, - 1, 1, 0, 0, 0, - 1, 0, 1, 0, 0, - 1, 1, 1, 0, 0, 1, 0, 2, 0, 0, 1, 1, 2, 0, 0, 1, 0, 3, 0, 0, @@ -575,12 +563,12 @@ GLuint arrows[] = { static void get_model_data_and_user_preferences(){ - model_space_size_x = 5; // 0 < model_space_size_x - model_space_size_y = 4; // 0 < model_space_size_y - model_space_size_z = 3; // 0 < model_space_size_z + model_space_size_x = 4; // 0 < model_space_size_x + model_space_size_y = 6; // 0 < model_space_size_y + model_space_size_z = 5; // 0 < model_space_size_z // XXX ONLY space drawed, no arrows - model_arrows_nb = 8; // assert : l'emplacement des flèches est contraint + model_arrows_nb = 0; // assert : l'emplacement des flèches est contraint // par model_space_size_x, y, z et le nombre de sites // pref_1D_shown_as_3D_xor_2D_space = 0; // 0 = 3D 1 = 2D @@ -588,6 +576,8 @@ static void get_model_data_and_user_preferences(){ pref_mark_unit_space = 0; // 0 = no marks, 1 = 1st, 2 = last, 3 = both pref_style_lines_planes = 0; // 0 = arrows as lines, 1 = as planes, 2 = mix pref_style_mix_colors = 0; // TODO + pref_show_grid = 5; // 0, 2, 3, 5, 6, 10, 15, 30 + // 0, x, y, z, xy, xz, yz, xyz } @@ -642,13 +632,36 @@ static void compute_buffers_sizes(int model_space_size_x, /* + ((model_space_size_y + 1) * (model_space_size_z + 1)); */ // XXX drawing unit cubes plus space limits (ridges) - buffer_lines_size = (model_space_size_x) - * (model_space_size_y) - * (model_space_size_z) - * 12 // les petits cubes dans l'espace + long small_cubes_nb = 0; + for (long i = 0; i < model_space_size_x; i++) + for (long j = 0; j < model_space_size_y; j++) + for (long k = 0; k < model_space_size_z; k++) + if ((i + j + k) % 2 == 0) small_cubes_nb ++; + small_cubes_nb = small_cubes_nb * 2; + + small_cubes_nb = 2; + + buffer_lines_size = small_cubes_nb * 24 // small cubes in space + 24 // les arêtes de l'espace - + 12 - + model_arrows_nb * 16; + + (! (pref_show_grid % 2)) + * (model_space_size_x + 1) + * (model_space_size_y + 1) + * 2 + + (! (pref_show_grid % 3)) + * (model_space_size_x + 1) + * (model_space_size_z + 1) + * 2 + + (! (pref_show_grid % 5)) + * (model_space_size_y + 1) + * (model_space_size_z + 1) + * 2 + // + (model_space_size_x + 1) * (model_space_size_z + 1) * 2 + // + (model_space_size_x + 1) * (model_space_size_z + 1) * 2 + + model_arrows_nb * 16 + ;//+ 0; // expérimental + + if (pref_mark_unit_space) + buffer_lines_size += small_cubes_nb * 8; // small cubes diagonals (if...) if (S) printf("allocated buffers sizes :%4d/3 = %3d vertices, %4d/3 = %3d colors,\ %4d/2 = %3d lines, %4d/3 = %3d plans.\n", @@ -660,6 +673,27 @@ static void compute_buffers_sizes(int model_space_size_x, + + + + + + + + + + + + + + + + + + + + + /* Initializes the buffer of a gl_area * Calls according to the user preferences * @param gl_area, ptr to the gl_area widget @@ -700,6 +734,7 @@ void graphics_init_buffers(const void *gl_area) pref_mark_unit_space, pref_style_lines_planes, pref_style_mix_colors, + pref_show_grid, buffer_vertex_origin, buffer_colors_origin,