WIP: Je crois bien que la fonction 'erase_arrow' est arrivée.

This commit is contained in:
Jean Sirmai 2023-08-11 18:39:21 +02:00
parent f030bd72fb
commit 945e7be9ad
Signed by: jean
GPG Key ID: FB3115C340E057E3
3 changed files with 135 additions and 85 deletions

View File

@ -26,7 +26,7 @@
#include <stdbool.h>
#include <GL/glu.h>
bool compute_space_and_arrows(long model_space_size_x,
bool compute_space(long model_space_size_x,
long model_space_size_y,
long model_space_size_z,
@ -48,3 +48,6 @@ bool draw_some_arrows (GLuint *lines_origin,
long s, long stx, long sty,
GLuint *arrows, int arrows_nb);
void show_user_choices(long model_size_x, long model_size_y, long model_size_z,
GLuint *arrows, int model_arrows_nb, int pref_show_grid);

View File

@ -440,33 +440,6 @@ static void draw_a_central_star(GLuint *lines_origin, long n)
#define SOUTH 4 // + z jaune
#define NORTH 5 // - z bleu
static void draw_some_arrows_demo (GLuint *lines_origin,
long s, long x, long y, long z,
GLuint *arrows, int arrows_nb)
{
long stx = z * y, sty = z, stz = 1;
long a = 0, b = 0, c = 0;
a = 0, b = 1, c = 0;
draw_a_central_star (lines_origin, s + 1 + 12 * (stx * a + sty * b + stz * c));
draw_an_arrow_East_or_West (lines_origin, s + 1 + 12 * (stx * a + sty * b + stz * c), 1, EAST);
a = 1, b = 1, c = 0;
draw_a_central_star (lines_origin, s + 1 + 12 * (stx * a + sty * b + stz * c));
draw_an_arrow_East_or_West (lines_origin, s + 1 + 12 * (stx * a + sty * b + stz * c), 1, WEST);
a = 1, b = 1, c = 1;
draw_a_central_star (lines_origin, s + 1 + 12 * (stx * a + sty * b + stz * c));
draw_an_arrow_Zenith_or_Nadir (lines_origin, s + 1 + 12 * (stx * a + sty * b + stz * c), 1, ZENITH);
a = 1, b = 2, c = 1;
draw_a_central_star (lines_origin, s + 1 + 12 * (stx * a + sty * b + stz * c));
draw_an_arrow_Zenith_or_Nadir (lines_origin, s + 1 + 12 * (stx * a + sty * b + stz * c), 1, NADIR);
a = 2, b = 2, c = 1;
draw_a_central_star (lines_origin, s + 1 + 12 * (stx * a + sty * b + stz * c));
draw_an_arrow_North_or_South (lines_origin, s + 1 + 12 * (stx * a + sty * b + stz * c), 1, NORTH);
a = 2, b = 2, c = 2;
draw_a_central_star (lines_origin, s + 1 + 12 * (stx * a + sty * b + stz * c));
draw_an_arrow_North_or_South (lines_origin, s + 1 + 12 * (stx * a + sty * b + stz * c), 1, SOUTH);
}
bool draw_some_arrows (GLuint *lines_origin, long s, long stx, long sty,
GLuint *arrows, int arrows_nb)
{
@ -506,17 +479,8 @@ bool draw_some_arrows (GLuint *lines_origin, long s, long stx, long sty,
static void show_user_choices(long model_size_x,
long model_size_y,
long model_size_z,
GLuint *arrows,
int model_arrows_nb,
// int pref_mark_unit_space,
// int pref_style_lines_planes,
// int pref_style_mix_colors,
int pref_show_grid)
void show_user_choices(long model_size_x, long model_size_y, long model_size_z,
GLuint *arrows, int model_arrows_nb, int pref_show_grid)
{
printf("model + user constraints : space size x,y,z = %ld,%ld,%ld ", model_size_x, model_size_y, model_size_z);
if (model_arrows_nb > 0) printf("[%d] arrows ", model_arrows_nb);
@ -543,16 +507,9 @@ static void show_user_choices(long model_size_x,
printf("[%2d] = %2d, %2d, %2d, %2d, %2d \n",\
i, *(arrows + i * 5 + 0), *(arrows + i * 5 + 1), *(arrows + i * 5 + 2), *(arrows + i * 5 + 3), *(arrows + i * 5 + 4));
printf("NB If you play : 'draw_some_arrows_demo(...)',\
don't forget to set model_arrows_nb to 6 (line 555 in graphics.c). \
The 'nombre_de_cases_contenant_des_fleches' is automatically set to 6 (line 560) ( ;- ))\n");
printf("NB The same is true if you play : 'draw_some_arrows(...)',\
and modify the number of arrows described above the line 570.\n");
printf("NB If you play : 'draw_some_arrows(...)' and add some more arrows (above the line 570),\
printf("NB If you play : 'draw_some_arrows(...)' and add some more arrows (in graphics.c below line 571),\
you must also increase the number of arrows (line 555) \n\
The 'nombre_de_cases_contenant_des_fleches' is automatically set equal to the number of arrows (line 560).\n");
The 'central_stars_nb' is automatically set equal to the number_of_arrows (line 559).\n");
}
@ -563,7 +520,7 @@ static void show_user_choices(long model_size_x,
bool compute_space_and_arrows(long model_size_x, long model_size_y, long model_size_z,
bool compute_space(long model_size_x, long model_size_y, long model_size_z,
GLuint *arrows, int model_arrows_nb,

View File

@ -50,8 +50,8 @@
int model_space_size_x = 0;
int model_space_size_y = 0;
int model_space_size_z = 0;
int model_arrows_nb = 0;
int nombre_de_cases_contenant_des_fleches = 0;
int arrows_nb = 0;
int central_stars_nb = 0;
GLfloat *buffer_vertex_origin = NULL;
GLfloat *buffer_colors_origin = NULL;
@ -209,7 +209,7 @@ bool graphics_init(const char *gl_area)
// Check if not already initialized
if (find_entry_from_ptr(gl_area)) {
errno = EEXIST;
perror("gl_area_array already exists");
perror("gl_area_array already address");
return false;
}
@ -548,16 +548,17 @@ static void get_model_data_and_user_preferences(){
model_space_size_x = 4; // 0 < model_space_size_x
model_space_size_y = 3; // 0 < model_space_size_y
model_space_size_z = 3; // 0 < model_space_size_z
model_space_size_z = 2; // 0 < model_space_size_z
// XXX ONLY space drawed, no arrows yet
model_arrows_nb = 9; // assert : l'emplacement des flèches est contraint
arrows_nb = 12; // assert : l'emplacement des flèches est contraint
// par model_space_size_x, y, z et le nombre de sites
nombre_de_cases_contenant_des_fleches = 8; // à calculer TODO
// ! WARNING ! Pour l'instant égal au nombre de flèches ! (central stars réécrites)
nombre_de_cases_contenant_des_fleches = model_arrows_nb;
// central_stars_nb sera à calculer pour éviter de redessiner les central_stars TODO
central_stars_nb = arrows_nb; // ! WARNING ! Pour l'instant égal au nombre de flèches !
// (les "central stars" sont donc systématiquement redessinées
// s'il y a plusieurs flèches dans le même cube)
// 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
@ -572,11 +573,14 @@ GLuint arrows[] = {
1, 1, 1, 0, 0,
1, 2, 2, 1, 1,
1, 3, 2, 2, 1,
1, 4, 3, 0, 1,
1, 5, 3, 0, 2,
1, 1, 3, 0, 2,
1, 0, 2, 0, 2,
1, 4, 3, 0, 0,
1, 5, 3, 0, 1,
1, 1, 3, 0, 0,
1, 0, 2, 0, 0,
1, 5, 2, 1, 1,
1, 4, 2, 1, 0,
1, 4, 0, 1, 0,
1, 5, 0, 1, 1,
// load, site, x, y, z
};
@ -590,7 +594,7 @@ static void compute_buffers_sizes(int model_space_size_x,
int model_space_size_y,
int model_space_size_z,
int model_arrows_nb,
int arrows_nb,
// int pref_mark_unit_space,
// int pref_style_lines_planes,
@ -608,10 +612,10 @@ static void compute_buffers_sizes(int model_space_size_x,
* (6 + 6); // 6 is to draw the small central star
// 6 is for the six faces centers
long cubes_nb = model_space_size_x * model_space_size_y * model_space_size_z;
// long cubes_nb = model_space_size_x * model_space_size_y * model_space_size_z;
buffer_vertex_size = grids_intersections * 3; // 3 numbers per vertex
// + cubes_nb * (8 + 6) + 15 * model_arrows_nb;// OLD ARROWS (DEPRECATED)
// + cubes_nb * (8 + 6) + 15 * arrows_nb;// OLD ARROWS (DEPRECATED)
buffer_vertex_size += arrows_anchors * 3;
buffer_vertex_size += 8 * 3; // draw a small cube
@ -632,9 +636,9 @@ static void compute_buffers_sizes(int model_space_size_x,
if (pref_test_diagonal) buffer_lines_size += 2; // la diagonale test [0 - max]
buffer_lines_size += 6 * nombre_de_cases_contenant_des_fleches; // test central stars
buffer_lines_size += 6 * central_stars_nb; // test central stars
buffer_lines_size += 8 * model_arrows_nb; // flèches
buffer_lines_size += 8 * arrows_nb; // flèches
// buffer_lines_size += 16 + 20; // draw a small cube with diagonals
@ -650,11 +654,89 @@ static void compute_buffers_sizes(int model_space_size_x,
static bool rewrite_arrow (GLuint *arrows, int arrows_nb,
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",\
weight, site, x, y, z);
return 1; /* replaces the load of the existing arrow by the load 'weight' */
}
static bool create_arrow (GLuint *arrows, int arrows_nb,
long weight, long site, long x, long y, long z)
{
printf("create a new arrow with weight = %ld at (%ld, %ld, %ld, %ld)\n",\
weight, site, x, y, z);
return 1;
}
static bool erase_arrow (GLuint *arrows, int arrows_nb, 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",\
address / 5, site, x, y, z);
if (1) 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),
*(arrows + (arrows_nb - 1) * 5 + 3),
*(arrows + (arrows_nb - 1) * 5 + 4));
*(arrows + address + 0) = *(arrows + (arrows_nb - 1) * 5 + 0);
*(arrows + address + 1) = *(arrows + (arrows_nb - 1) * 5 + 1);
*(arrows + address + 2) = *(arrows + (arrows_nb - 1) * 5 + 2);
*(arrows + address + 3) = *(arrows + (arrows_nb - 1) * 5 + 3);
*(arrows + address + 4) = *(arrows + (arrows_nb - 1) * 5 + 4);
*(arrows + (arrows_nb - 1) * 5 + 0) = 0; // est-ce bien utile ?
*(arrows + (arrows_nb - 1) * 5 + 1) = 0;
*(arrows + (arrows_nb - 1) * 5 + 2) = 0;
*(arrows + (arrows_nb - 1) * 5 + 3) = 0;
*(arrows + (arrows_nb - 1) * 5 + 4) = 0;
arrows_nb --;
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;
}
static long check_for_arrow (GLuint *arrows, int arrows_nb,
long site, long x, long y, long z)
{
long address = -1, f_weight = -1, f_site = -1, f_x = -1, f_y = -1, f_z = -1;
for (int i = 0; i < arrows_nb; i++)
{
f_weight = *(arrows + i * 5 + 0);
f_site = *(arrows + i * 5 + 1);
f_x = *(arrows + i * 5 + 2);
f_y = *(arrows + i * 5 + 3);
f_z = *(arrows + i * 5 + 4);
if (f_site == site && f_x == x && f_y == y && f_z == z) {
address = i * 5;
printf("found at %ld (%ld / 5 = %ld)\n", address, address, address / 5);
}
}
return address; /* returns the address of the arrow if there is one
* or (-1) if there is none */
}
static bool set_arrow (GLuint *arrows, int arrows_nb,
long weight, long site, long x, long y, long z)
{
long address = (check_for_arrow (arrows, arrows_nb, site, x, y, z));
if (address == -1 && weight == 0) return 0;
if (address == -1 && weight > 0) return create_arrow (arrows, arrows_nb, weight, site, x, y, z);
if (address >= 0 && weight == 0) return erase_arrow (arrows, arrows_nb, address, site, x, y, z);
if (address >= 0 && weight > 0) return rewrite_arrow (arrows, arrows_nb, address, weight, site, x, y, z);
return 0;
}
@ -678,7 +760,7 @@ static void compute_buffers_sizes(int model_space_size_x,
* Note : buffer_lines_origin[] is no more defined in graphics_cube.h
* @return void
*/
#define A 0
void graphics_init_buffers(const void *gl_area)
{
struct gl_area_entry *entry;
@ -691,7 +773,7 @@ void graphics_init_buffers(const void *gl_area)
model_space_size_y,
model_space_size_z,
model_arrows_nb,
arrows_nb,
// pref_mark_unit_space,
// pref_style_lines_planes,
@ -703,23 +785,23 @@ void graphics_init_buffers(const void *gl_area)
buffer_lines_origin = g_malloc0(buffer_lines_size * 2 * sizeof(GLuint) * 2);
buffer_plans_origin = g_malloc0(buffer_plans_size * 3 * sizeof(GLuint) * 2);
compute_space_and_arrows (model_space_size_x,
model_space_size_y,
model_space_size_z,
compute_space (model_space_size_x,
model_space_size_y,
model_space_size_z,
arrows,
model_arrows_nb,
arrows,
arrows_nb,
// pref_mark_unit_space,
// pref_style_lines_planes,
// pref_style_mix_colors,
pref_show_grid,
pref_test_diagonal,
// pref_mark_unit_space,
// pref_style_lines_planes,
// pref_style_mix_colors,
pref_show_grid,
pref_test_diagonal,
buffer_vertex_origin,
buffer_colors_origin,
buffer_lines_origin,
buffer_plans_origin);
buffer_vertex_origin,
buffer_colors_origin,
buffer_lines_origin,
buffer_plans_origin);
long step_z = 1,
step_y = model_space_size_z + 1,
@ -729,7 +811,15 @@ void graphics_init_buffers(const void *gl_area)
draw_some_arrows (buffer_lines_origin, s,
model_space_size_z * model_space_size_y, model_space_size_z,
arrows, model_arrows_nb);
arrows, arrows_nb);
set_arrow(arrows, arrows_nb, 0, 4, 3, 0, 0);
set_arrow(arrows, arrows_nb, 0, 5, 3, 0, 1);
draw_some_arrows (buffer_lines_origin, s,
model_space_size_z * model_space_size_y, model_space_size_z,
arrows, arrows_nb);
GLuint vao, vertex_buffer, color_buffer;