WIP: Voisinage 3D de rayon > 2 (mise en place)

This commit is contained in:
Jean Sirmai 2023-08-13 23:11:31 +02:00
parent ba7ebcbe2b
commit 734045a50f
Signed by: jean
GPG Key ID: FB3115C340E057E3
2 changed files with 367 additions and 466 deletions

View File

@ -69,18 +69,25 @@ static bool grids_intersections (long x, long y, long z,
vertex_index += 3; vertex_index += 3;
if ((i == 0 || i == x) && (j == 0 || j == y) && (k == 0 || k == z)) {
*(colors_origin + colors_index + 0) = 0.5f;// 3 * vx / 2;
*(colors_origin + colors_index + 1) = 0.5f;// 3 * vy / 2;
*(colors_origin + colors_index + 2) = 0.5f;// 3 * vz / 2;
} else {
*(colors_origin + colors_index + 0) = 0.64f;// 3 * vx / 2; *(colors_origin + colors_index + 0) = 0.64f;// 3 * vx / 2;
*(colors_origin + colors_index + 1) = 0.64f;// 3 * vy / 2; *(colors_origin + colors_index + 1) = 0.64f;// 3 * vy / 2;
*(colors_origin + colors_index + 2) = 0.64f;// 3 * vz / 2; *(colors_origin + colors_index + 2) = 0.64f;// 3 * vz / 2;
}
colors_index += 3; colors_index += 3;
}; };
return 1; return 1;
} }
static bool arrows_anchors (long x, long y, long z, static bool central_stars (long x, long y, long z,
GLfloat *vertex_origin, GLfloat *colors_origin) GLfloat *vertex_origin, GLfloat *colors_origin)
{ {
@ -99,7 +106,7 @@ static bool arrows_anchors (long x, long y, long z,
// pour qu'elles n'aillent pas jusqu'aux faces des cubes // pour qu'elles n'aillent pas jusqu'aux faces des cubes
if (0) printf("arrows_anchors 1 / max = %5.2f max / 2 = %5.2f\n", ad, max / 2); if (0) printf("central_stars 1 / max = %5.2f max / 2 = %5.2f\n", ad, max / 2);
for (i = 0; i < x; i++) for (i = 0; i < x; i++)
for (j = 0; j < y; j++) for (j = 0; j < y; j++)
@ -123,13 +130,13 @@ static bool arrows_anchors (long x, long y, long z,
vertex_index += 3; vertex_index += 3;
*(colors_origin + colors_index + 0) = 0.3f; *(colors_origin + colors_index + 0) = 1.0f;
*(colors_origin + colors_index + 1) = 0.3f; *(colors_origin + colors_index + 1) = 0.3f;
*(colors_origin + colors_index + 2) = 0.3f; *(colors_origin + colors_index + 2) = 0.3f;
colors_index += 3; colors_index += 3;
*(colors_origin + colors_index + 0) = 0.3f; *(colors_origin + colors_index + 0) = 1.0f;
*(colors_origin + colors_index + 1) = 0.3f; *(colors_origin + colors_index + 1) = 0.3f;
*(colors_origin + colors_index + 2) = 0.3f; *(colors_origin + colors_index + 2) = 0.3f;
@ -150,14 +157,14 @@ static bool arrows_anchors (long x, long y, long z,
vertex_index += 3; vertex_index += 3;
*(colors_origin + colors_index + 0) = 0.3f; *(colors_origin + colors_index + 0) = 1.0f;
*(colors_origin + colors_index + 1) = 0.3f; *(colors_origin + colors_index + 1) = 1.3f;
*(colors_origin + colors_index + 2) = 0.3f; *(colors_origin + colors_index + 2) = 0.3f;
colors_index += 3; colors_index += 3;
*(colors_origin + colors_index + 0) = 0.3f; *(colors_origin + colors_index + 0) = 1.0f;
*(colors_origin + colors_index + 1) = 0.3f; *(colors_origin + colors_index + 1) = 1.3f;
*(colors_origin + colors_index + 2) = 0.3f; *(colors_origin + colors_index + 2) = 0.3f;
colors_index += 3; colors_index += 3;
@ -178,100 +185,71 @@ static bool arrows_anchors (long x, long y, long z,
vertex_index += 3; vertex_index += 3;
*(colors_origin + colors_index + 0) = 0.3f; *(colors_origin + colors_index + 0) = 0.3f;
*(colors_origin + colors_index + 1) = 0.3f; *(colors_origin + colors_index + 1) = 1.3f;
*(colors_origin + colors_index + 2) = 0.3f; *(colors_origin + colors_index + 2) = 0.3f;
colors_index += 3; colors_index += 3;
*(colors_origin + colors_index + 0) = 0.3f; *(colors_origin + colors_index + 0) = 0.3f;
*(colors_origin + colors_index + 1) = 0.3f; *(colors_origin + colors_index + 1) = 1.3f;
*(colors_origin + colors_index + 2) = 0.3f; *(colors_origin + colors_index + 2) = 0.3f;
colors_index += 3; colors_index += 3;
//-------------------------------------------------------------- };
// X - X axis arrows tips near the faces centers EAST - WEST
*(vertex_origin + vertex_index + 0) = vx + ad - eps; return 1;
}
static bool centers (long x, long y, long z,
GLfloat *vertex_origin, GLfloat *colors_origin)
{
float max = fmax(x, y);
max = fmax(max, z);
float i, j, k, vx, vy, vz,
ad = 1 / max,
eps = 0.1 * ad; // eps(ilon) servira à décaler légèrement les deux vertex centraux
// l'un source, l'autre cible, de couleurs différentes
if (0) printf("centers eps(ilon) = %5.2f\n", eps);
for (i = 0; i < x; i++)
for (j = 0; j < y; j++)
for (k = 0; k < z; k++){
vx = (2 * i / x - 1) * x / max + ad;
vy = (2 * j / y - 1) * y / max + ad;
vz = (2 * k / z - 1) * z / max + ad;
*(vertex_origin + vertex_index + 0) = vx + eps;
*(vertex_origin + vertex_index + 1) = vy; *(vertex_origin + vertex_index + 1) = vy;
*(vertex_origin + vertex_index + 2) = vz; *(vertex_origin + vertex_index + 2) = vz;
vertex_index += 3; vertex_index += 3;
*(vertex_origin + vertex_index + 0) = vx - ad + eps; *(colors_origin + colors_index + 0) = 0.0f;
*(colors_origin + colors_index + 1) = 0.0f;
*(colors_origin + colors_index + 2) = 0.0f;
colors_index += 3;
*(vertex_origin + vertex_index + 0) = vx - eps;
*(vertex_origin + vertex_index + 1) = vy; *(vertex_origin + vertex_index + 1) = vy;
*(vertex_origin + vertex_index + 2) = vz; *(vertex_origin + vertex_index + 2) = vz;
vertex_index += 3; vertex_index += 3;
*(colors_origin + colors_index + 0) = 1; *(colors_origin + colors_index + 0) = 1.0f;
*(colors_origin + colors_index + 1) = 0; *(colors_origin + colors_index + 1) = 1.0f;
*(colors_origin + colors_index + 2) = 0; *(colors_origin + colors_index + 2) = 1.0f;
colors_index += 3; colors_index += 3;
*(colors_origin + colors_index + 0) = 0;
*(colors_origin + colors_index + 1) = 1;
*(colors_origin + colors_index + 2) = 1;
colors_index += 3;
// Y - Y axis arrows tips near the faces centers ZENITH - NADIR
*(vertex_origin + vertex_index + 0) = vx;
*(vertex_origin + vertex_index + 1) = vy + ad - eps;
*(vertex_origin + vertex_index + 2) = vz;
vertex_index += 3;
*(vertex_origin + vertex_index + 0) = vx;
*(vertex_origin + vertex_index + 1) = vy - ad + eps;
*(vertex_origin + vertex_index + 2) = vz;
vertex_index += 3;
*(colors_origin + colors_index + 0) = 0;
*(colors_origin + colors_index + 1) = 1;
*(colors_origin + colors_index + 2) = 0;
colors_index += 3;
*(colors_origin + colors_index + 0) = 1;
*(colors_origin + colors_index + 1) = 0;
*(colors_origin + colors_index + 2) = 1;
colors_index += 3;
// Z - Z axis arrows tips near the faces centers NORTH - SOUTH
*(vertex_origin + vertex_index + 0) = vx;
*(vertex_origin + vertex_index + 1) = vy;
*(vertex_origin + vertex_index + 2) = vz + ad - eps;
vertex_index += 3;
*(vertex_origin + vertex_index + 0) = vx;
*(vertex_origin + vertex_index + 1) = vy;
*(vertex_origin + vertex_index + 2) = vz - ad + eps;
vertex_index += 3;
*(colors_origin + colors_index + 0) = 0;
*(colors_origin + colors_index + 1) = 0;
*(colors_origin + colors_index + 2) = 1;
colors_index += 3;
*(colors_origin + colors_index + 0) = 1;
*(colors_origin + colors_index + 1) = 1;
*(colors_origin + colors_index + 2) = 0;
colors_index += 3;
}; };
@ -285,41 +263,6 @@ static void draw_line (GLuint *lines_origin, int a, int b)
*(lines_origin + lines_index) = b; lines_index ++; *(lines_origin + lines_index) = b; lines_index ++;
} }
static void draw_a_cube_at(long u, long v, long w, GLuint *lines_origin,
long size_x, long size_y, long size_z, bool diagonals)
{
long step_z = 1, step_y = size_z, step_x = size_y * size_z, x = u + 1, y = v + 1, z = w + 1;
// draw_line (lines_origin, 0,21); draw_line (lines_origin, 21,42);
// ce qui suit ne vaut que dans un espace 3 x 3 x 3 (le reste est à corriger - ou à oublier ?)
draw_line (lines_origin, 21,22); draw_line (lines_origin, 21,25);
draw_line (lines_origin, 25,26); draw_line (lines_origin, 22,26);
draw_line (lines_origin, 37,41); draw_line (lines_origin, 41,42);
draw_line (lines_origin, 38,42); draw_line (lines_origin, 37,38);
draw_line (lines_origin, 25,41); draw_line (lines_origin, 21,37);
draw_line (lines_origin, 26,42); draw_line (lines_origin, 22,38);
/* draw_line (lines_origin, step_z * w + step_y * v + step_x * u, step_z * (w + 0) + step_y * (v + 0) + step_x * (u + 1)); */
/* draw_line (lines_origin, step_z * w + step_y * v + step_x * u, step_z * (w + 0) + step_y * (v + 1) + step_x * (u + 0)); */
/* draw_line (lines_origin, step_z * w + step_y * v + step_x * u, step_z * (w + 1) + step_y * (v + 1) + step_x * (u + 0)); */
/* draw_line (lines_origin, step_z * z + step_y * y + step_x * x, step_z * (w + 1) + step_y * (v + 1) + step_x * (u + 0)); */
/* draw_line (lines_origin, step_z * z + step_y * y + step_x * x, step_z * (w + 1) + step_y * (v + 0) + step_x * (u + 1)); */
/* draw_line (lines_origin, step_z * z + step_y * y + step_x * x, step_z * (w + 0) + step_y * (v + 1) + step_x * (u + 1)); */
/* draw_line (lines_origin, step_z * w + step_y * v + step_x * x, step_z * (w + 1) + step_y * (v + 0) + step_x * (u + 1)); */
/* draw_line (lines_origin, step_z * w + step_y * v + step_x * x, step_z * (w + 0) + step_y * (v + 1) + step_x * (u + 1)); */
/* draw_line (lines_origin, step_z * w + step_y * y + step_x * u, step_z * (w + 0) + step_y * (v + 1) + step_x * (u + 1)); */
/* draw_line (lines_origin, step_z * z + step_y * v + step_x * u, step_z * (w + 1) + step_y * (v + 1) + step_x * (u + 0)); */
/* draw_line (lines_origin, step_z * z + step_y * v + step_x * u, step_z * (w + 1) + step_y * (v + 0) + step_x * (u + 1)); */
/* draw_line (lines_origin, step_z * z + step_y * y + step_x * u, step_z * (w + 0) + step_y * (v + 1) + step_x * (u + 0)); */
if (diagonals){
draw_line (lines_origin, step_z * w + step_y * v + step_x * u, step_z * (w + 1) + step_y * (v + 1) + step_x * (u + 1));
draw_line (lines_origin, step_z * w + step_y * v + step_x * x, step_z * (w + 1) + step_y * (v + 1) + step_x * (u + 0));
draw_line (lines_origin, step_z * z + step_y * v + step_x * u, step_z * (w + 0) + step_y * (v + 1) + step_x * (u + 1));
draw_line (lines_origin, step_z * w + step_y * y + step_x * u, step_z * (w + 1) + step_y * (v + 0) + step_x * (u + 1));
}
}
static void draw_ridges_3D (long x, long y, long z, static void draw_ridges_3D (long x, long y, long z,
long step_x, long step_y, long step_z, long step_x, long step_y, long step_z,
@ -352,10 +295,6 @@ static bool draw_grids_3D (long x, long y, long z,
for (int u = 0; u < y; u ++){ for (int u = 0; u < y; u ++){
for (int w = 0; w < x; w ++){ for (int w = 0; w < x; w ++){
calcul = step_x * w + step_y * u; calcul = step_x * w + step_y * u;
// écriture plus concise en utilisant la fonction "draw_line(...){...}"
// mais probablement plus lente.
// Je commente donc la ligne "draw_line" et laisse les deux lignes suivantes actives
// draw_line (lines_origin, calcul, calcul + step_y - step_z);
*(lines_origin + lines_index) = calcul; lines_index ++; *(lines_origin + lines_index) = calcul; lines_index ++;
*(lines_origin + lines_index) = calcul + step_y - step_z; lines_index ++; *(lines_origin + lines_index) = calcul + step_y - step_z; lines_index ++;
} }
@ -395,32 +334,6 @@ static void diagonal_test(long x, long y, long z,
static void draw_an_arrow_East_or_West (GLuint *lines_origin, long s, int weight, int site)
{
draw_line (lines_origin, s + 2, s + 6 + site % 2);
draw_line (lines_origin, s + 3, s + 6 + site % 2);
draw_line (lines_origin, s + 4, s + 6 + site % 2);
draw_line (lines_origin, s + 5, s + 6 + site % 2);
}
static void draw_an_arrow_Zenith_or_Nadir (GLuint *lines_origin, long s, int weight, int site)
{
draw_line (lines_origin, s + 0, s + 8 + site % 2);
draw_line (lines_origin, s + 1, s + 8 + site % 2);
draw_line (lines_origin, s + 4, s + 8 + site % 2);
draw_line (lines_origin, s + 5, s + 8 + site % 2);
}
static void draw_an_arrow_North_or_South (GLuint *lines_origin, long s, int weight, int site)
{
draw_line (lines_origin, s + 0, s + 10 + site % 2);
draw_line (lines_origin, s + 1, s + 10 + site % 2);
draw_line (lines_origin, s + 2, s + 10 + site % 2);
draw_line (lines_origin, s + 3, s + 10 + site % 2);
}
static void draw_a_central_star(GLuint *lines_origin, long n) static void draw_a_central_star(GLuint *lines_origin, long n)
@ -441,123 +354,127 @@ static void draw_a_central_star(GLuint *lines_origin, long n)
#define NORTH 5 // - z bleu #define NORTH 5 // - z bleu
bool draw_some_arrows (GLuint *lines_origin, long s, long stx, long sty, bool draw_some_arrows (GLuint *lines_origin, long s, long stx, long sty,
GLuint *arrows, int arrows_nb) GLuint *arrows, int arrows_nb) {return 1;}
{
long stz = 1;
long site = 0, x = 0, y = 0, z = 0;
for (int i = 0; i < arrows_nb; i++) bool compute_space(long space_x, long space_y, long space_z,
{ GLuint *arrows, int model_arrows_nb,
site = *(arrows + i * 5 + 1); int pref_show_grid, int pref_test_diagonal,
x = *(arrows + i * 5 + 2); y = *(arrows + i * 5 + 3); z = *(arrows + i * 5 + 4); GLfloat *vertex_origin, GLfloat *colors_origin,
// printf("[%d] site = %d x = %ld y = %ld z = %ld step x = %ld step y = %ld\n", site, i, x, y, z, stx, sty); GLuint *lines_origin, GLuint *plans_origin)
draw_a_central_star (lines_origin, s + 1 + 12 * (stx * x + sty * y + stz * z));
if (site >-1 && site < 2) draw_an_arrow_East_or_West (lines_origin, s + 1 + 12 * (stx * x + sty * y + stz * z), 1, site);
if (site > 3 && site < 6) draw_an_arrow_North_or_South (lines_origin, s + 1 + 12 * (stx * x + sty * y + stz * z), 1, site);
if (site > 1 && site < 4) draw_an_arrow_Zenith_or_Nadir (lines_origin, s + 1 + 12 * (stx * x + sty * y + stz * z), 1, site);
}
return 1;
}
// X - X = EAST - WEST = rouge - cyan
// Y - Y = ZENITH - NADIR = vert - magenta
// Z - Z = SOUTH - NORTH = jaune - bleu
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("\nmodel + 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);
// if (pref_mark_unit_space == 0) printf("no unit_space marks ");
// if (pref_mark_unit_space == 1) printf("first unit space marked ");
// if (pref_mark_unit_space == 2) printf("last unit_space marked ");
// if (pref_mark_unit_space == 3) printf("first and last units space marked ");
// if (! pref_style_lines_planes) printf("no style_lines_planes ");
// if (pref_style_lines_planes > 0) printf("style_lines_planes = %d ", pref_style_lines_planes);
// if (! pref_style_mix_colors) printf("no style_mix_colors ");
// if (pref_style_mix_colors > 0) printf("style_mix_colors = %d ", pref_style_mix_colors);
if (pref_show_grid == 1) printf("pref_show_grid = %d <> show no grid ", pref_show_grid);
if (pref_show_grid == 0) printf("pref_show_grid = %d <> show all grids ", pref_show_grid);
if (pref_show_grid == 2) printf("pref_show_grid = %d <> show grid xy ", pref_show_grid);
if (pref_show_grid == 3) printf("pref_show_grid = %d <> show grid xz ", pref_show_grid);
if (pref_show_grid == 5) printf("pref_show_grid = %d <> show grid yz ", pref_show_grid);
if (pref_show_grid == 6) printf("pref_show_grid = %d <> show grids xy & xz ", pref_show_grid);
if (pref_show_grid == 10) printf("pref_show_grid = %d <> show grids xy & yz ", pref_show_grid);
if (pref_show_grid == 15) printf("pref_show_grid = %d <> show grids xz & yz ", pref_show_grid);
if (model_arrows_nb > 0) printf("\n[ n] load site x y z ---- < arrows array >\
------------------------------------------------------------\n");
// (DEPRECATED) arrows = { 1, 1, 0, 1, 2, 1, 1, 1, 10, 1, 2, 11, 1, 1, 20, 1, 2, 21 }
for (int i = 0; i < model_arrows_nb; i++)
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));
if (0) 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 'central_stars_nb' is automatically set equal to the number_of_arrows (line 559).\n");
}
bool compute_space(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, int pref_test_diagonal,
GLfloat *vertex_origin, GLfloat *colors_origin,
GLuint *lines_origin, GLuint *plans_origin)
{ {
if (0) show_user_choices(model_size_x, model_size_y, model_size_z, grids_intersections (space_x, space_y, space_z, vertex_origin, colors_origin);
arrows, model_arrows_nb, central_stars (space_x, space_y, space_z, vertex_origin, colors_origin);
// pref_mark_unit_space, pref_style_lines_planes, pref_style_mix_colors, centers (space_x, space_y, space_z, vertex_origin, colors_origin);
pref_show_grid);
grids_intersections (model_size_x, model_size_y, model_size_z, vertex_origin, colors_origin); long step_z = 1, step_y = space_z + 1, step_x = (space_z + 1) * (space_y + 1);
arrows_anchors (model_size_x, model_size_y, model_size_z, vertex_origin, colors_origin);
long step_z = 1, draw_grids_3D (space_x, space_y, space_z, step_x, step_y, step_z, lines_origin, pref_show_grid);
step_y = model_size_z + 1, if (pref_show_grid > 0) draw_ridges_3D (space_x, space_y, space_z, step_x, step_y, step_z, lines_origin);
step_x = (model_size_z + 1) * (model_size_y + 1); long s = step_z * space_z + step_y * space_y + step_x * space_x;
draw_a_central_star (lines_origin, s + 1 + 171 * 6);
draw_grids_3D (model_size_x, model_size_y, model_size_z, step_x, step_y, step_z, lines_origin, pref_show_grid);
if (pref_show_grid > 0) draw_ridges_3D (model_size_x, model_size_y, model_size_z, step_x, step_y, step_z, lines_origin);
if (pref_test_diagonal) diagonal_test (model_size_x, model_size_y, model_size_z, step_x, step_y, step_z, lines_origin);
// long s = step_z * model_size_z + step_y * model_size_y + step_x * model_size_x;
// if (0) draw_some_arrows_demo (lines_origin, s, model_size_x, model_size_y, model_size_z, arrows, model_arrows_nb);
// if (0) draw_some_arrows (lines_origin, s, model_size_z * model_size_y, model_size_z, arrows, model_arrows_nb);
// draw_a_cube_at(1, 1, 1, lines_origin, model_size_x, model_size_y, model_size_z, 0);
draw_line (lines_origin, 2800, 3500);
draw_line (lines_origin, 3500, 2422);//
draw_line (lines_origin, 3500, 2606);
if (pref_test_diagonal) diagonal_test (space_x, space_y, space_z, step_x, step_y, step_z, lines_origin);
return 0; return 0;
} }
// S C O R I E S --------------------------------------------------------
// draw_a_central_star (lines_origin, s + 1 + 3 * (29 * 2 * 6)); // OK NORTH 58
// draw_a_central_star (lines_origin, s + 1 + 3 * (19 * 3 * 6)); // CENTRE 57
// draw_a_central_star (lines_origin, s + 1 + 3 * ( 7 * 8 * 6)); // OK SOUTH 56
// draw_a_central_star (lines_origin, s + 1 + 3 * (106 * 6 )); // Ok EAST 19 x 3 + 7 x 7 (57 + 49)
// draw_a_central_star (lines_origin, s + 1 + 3 * (8 * 6)); // OK WEST 19 x 3 - 7 x 7 (57 - 49)
// draw_a_central_star (lines_origin, s + 1 + 3 * (15 * 6)); // W Z
// draw_a_central_star (lines_origin, s + 1 + 3 * (1 * 6)); // W A
// draw_a_central_star (lines_origin, s + 1 + 3 * (49 * 6)); // S A
// draw_a_central_star (lines_origin, s + 1 + 3 * (7 * 6)); // W S
// draw_a_central_star (lines_origin, s + 1 + 3 * (9 * 6)); // W N
// draw_a_central_star (lines_origin, s + 1 + 3 * (105 * 6)); // E S
// draw_a_central_star (lines_origin, s + 1 + 3 * (19 * 6 * 6 - 12)); // E A S
// draw_a_central_star (lines_origin, s + 1 + 3 * (49 * 2 * 6)); // E A S
// draw_a_central_star (lines_origin, s + 1 + 3 * (19 * 6 * 6)); // E Z S << Last One
// draw_a_central_star (lines_origin, s + 1 + 3 * (19 * 6 * 6 - 6)); // E A
// draw_a_central_star (lines_origin, s + 1 + 3 * (19 * 6 * 4)); //
// draw_a_central_star (lines_origin, s + 1 + 171 * 6);
// 4 x 6 = W 10 x 6 = A 14 x 6 = N
// 1 x 6 = WA 3 x 6 = WS 9 x 6 = AS 15 x 6 = ZS 21 x 6 = ES
// 0 x 6 = WAS 2 x 6 = WAN 6 x 6 = WZS 8 x 6 = WZN 12 x 6 = EZS
// 27 x 6 > out
// if (0) draw_some_arrows_demo (lines_origin, s, space_x, space_y, space_z, arrows, model_arrows_nb);
// if (0) draw_some_arrows (lines_origin, s, space_z * space_y, space_z, arrows, model_arrows_nb);
// X - X = EAST - WEST = rouge - cyan // X - X = EAST - WEST = rouge - cyan
// Y - Y = ZENITH - NADIR = vert - magenta // Y - Y = ZENITH - NADIR = vert - magenta
// Z - Z = SOUTH - NORTH = jaune - bleu // Z - Z = SOUTH - NORTH = jaune - bleu
/* static void draw_an_arrow_East_or_West (GLuint *lines_origin, long s, int weight, int site) */
/* { */
/* draw_line (lines_origin, s + 2, s + 6 + site % 2); */
/* draw_line (lines_origin, s + 3, s + 6 + site % 2); */
/* draw_line (lines_origin, s + 4, s + 6 + site % 2); */
/* draw_line (lines_origin, s + 5, s + 6 + site % 2); */
/* } */
/* static void draw_an_arrow_Zenith_or_Nadir (GLuint *lines_origin, long s, int weight, int site) */
/* { */
/* draw_line (lines_origin, s + 0, s + 8 + site % 2); */
/* draw_line (lines_origin, s + 1, s + 8 + site % 2); */
/* draw_line (lines_origin, s + 4, s + 8 + site % 2); */
/* draw_line (lines_origin, s + 5, s + 8 + site % 2); */
/* } */
/* static void draw_an_arrow_North_or_South (GLuint *lines_origin, long s, int weight, int site) */
/* { */
/* draw_line (lines_origin, s + 0, s + 10 + site % 2); */
/* draw_line (lines_origin, s + 1, s + 10 + site % 2); */
/* draw_line (lines_origin, s + 2, s + 10 + site % 2); */
/* draw_line (lines_origin, s + 3, s + 10 + site % 2); */
/* } */

View File

@ -548,18 +548,7 @@ bool graphics_init_shaders(const void *gl_area)
#define c_est_idiot__ce_nombre_est_donné_à_la_lecture_du_fichier_XML 0 #define c_est_idiot__ce_nombre_est_donné_à_la_lecture_du_fichier_XML 0
#define ça_me_sert_juste_à_éviter_des_erreurs_pendant_le_débuguage 0 #define ça_me_sert_juste_à_éviter_des_erreurs_pendant_le_débuguage 0
GLuint arrows[] = { GLuint arrows[] = {
/* 1, 0, 0, 0, 0, */ // 1, 0, 0, 0, 0,
/* 1, 1, 1, 0, 0, */
/* 1, 2, 2, 1, 1, */
/* 1, 3, 2, 2, 1, */
// 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, */
un_nombre_ad_hoc_que_je_mets_a_la_fin_du_tableau_pour_en_mesurer_la_taille un_nombre_ad_hoc_que_je_mets_a_la_fin_du_tableau_pour_en_mesurer_la_taille
// load, site, x, y, z // load, site, x, y, z
}; };
@ -567,31 +556,22 @@ GLuint arrows[] = {
static void get_model_data_and_user_preferences(){ static void get_model_data_and_user_preferences(){
model_space_size_x = 4; // 0 < model_space_size_x model_space_size_x = 7; // 0 < model_space_size_x
model_space_size_y = 3; // 0 < model_space_size_y model_space_size_y = 7; // 0 < model_space_size_y
model_space_size_z = 3; // 0 < model_space_size_z model_space_size_z = 7; // 0 < model_space_size_z
// XXX ONLY space drawed, no arrows yet
long arrows_array_size = 0; long arrows_array_size = 0;
while (*(arrows + arrows_array_size) != un_nombre_ad_hoc_que_je_mets_a_la_fin_du_tableau_pour_en_mesurer_la_taille) while (*(arrows + arrows_array_size) != un_nombre_ad_hoc_que_je_mets_a_la_fin_du_tableau_pour_en_mesurer_la_taille)
arrows_array_size ++; arrows_array_size ++;
printf("get_model_data_and_user_preferences (579) arrows_array_size = %ld (arrows_nb = %ld)\n", arrows_array_size, arrows_array_size / 5); printf("get_model_data_and_user_preferences (566) arrows_array_size = %ld (arrows_nb = %ld)\n", arrows_array_size, arrows_array_size / 5);
arrows_nb = arrows_array_size / 5; // assert : l'emplacement des flèches est contraint arrows_nb = arrows_array_size / 5;
// par model_space_size_x, y, z et le nombre de sites // assert : l'emplacement des flèches est contraint par space_size_x, y, z et le nombre de sites
// central_stars_nb sera à calculer pour éviter de redessiner les central_stars TODO central_stars_nb = 1;
central_stars_nb = arrows_nb; // ! WARNING ! Pour l'instant égal au nombre de flèches ! pref_show_grid = 1; // 0, 1, 2, 3, 5, 6, 10, 15, 30, etc
// (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
// pref_style_mix_colors = 0; // TODO
pref_show_grid = 0; // 0, 1, 2, 3, 5, 6, 10, 15, 30, etc
// xyz, 0, x, y, z, xy, xz, yz, xyz // xyz, 0, x, y, z, xy, xz, yz, xyz
pref_test_diagonal = 0; pref_test_diagonal = 1;
} }
@ -602,12 +582,6 @@ static void get_model_data_and_user_preferences(){
static void compute_buffers_sizes(int model_space_size_x, static void compute_buffers_sizes(int model_space_size_x,
int model_space_size_y, int model_space_size_y,
int model_space_size_z, int model_space_size_z,
// int arrows_nb,
// int pref_mark_unit_space,
// int pref_style_lines_planes,
// int pref_style_mix_colors,
int pref_test_diagonal) int pref_test_diagonal)
{ {
// XXX ONLY space and no arrows // XXX ONLY space and no arrows
@ -615,24 +589,23 @@ static void compute_buffers_sizes(int model_space_size_x,
* (model_space_size_y + 1) * (model_space_size_y + 1)
* (model_space_size_z + 1); * (model_space_size_z + 1);
long arrows_anchors = (model_space_size_x) long central_stars = (model_space_size_x)
* (model_space_size_y) * (model_space_size_y)
* (model_space_size_z) * (model_space_size_z)
* (6 + 6); // 6 is to draw the small central star * 6; // 6 is to draw the small central star
// 6 is for the six faces centers long centers = (model_space_size_x)
* (model_space_size_y)
// long cubes_nb = model_space_size_x * model_space_size_y * model_space_size_z; * (model_space_size_z)
* 2; // and 2 is to draw two centers for each cube
// one will be for the arrows sources (blue ?)
// and the other, for their targets (red ?)
// NB In this git branch, I forget the six faces centers
buffer_vertex_size = grids_intersections * 3; // 3 numbers per vertex buffer_vertex_size = grids_intersections * 3; // 3 numbers per vertex
// + cubes_nb * (8 + 6) + 15 * arrows_nb;// OLD ARROWS (DEPRECATED) buffer_vertex_size += central_stars * 3;
buffer_vertex_size += arrows_anchors * 3; buffer_vertex_size += centers * 3;
buffer_vertex_size += 8 * 3; // draw a small cube
buffer_colors_size = buffer_vertex_size; buffer_colors_size = buffer_vertex_size;
buffer_plans_size = 0;
buffer_plans_size = 3;
long grids_lines = long grids_lines =
(pref_show_grid % 2 == 0) * (model_space_size_x + 1) * (model_space_size_y + 1) (pref_show_grid % 2 == 0) * (model_space_size_x + 1) * (model_space_size_y + 1)
@ -647,9 +620,7 @@ static void compute_buffers_sizes(int model_space_size_x,
buffer_lines_size += 6 * central_stars_nb; // test central stars buffer_lines_size += 6 * central_stars_nb; // test central stars
buffer_lines_size += 8 * arrows_nb; // flèches buffer_lines_size += 6;
// buffer_lines_size += 16 + 20; // draw a small cube with diagonals
// buffer_lines_size -= 2; // == TEST LINES BUFFER SIZE // buffer_lines_size -= 2; // == TEST LINES BUFFER SIZE
@ -662,128 +633,6 @@ 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)
{
if (DETAIL) printf("write the arrow weight to %ld at (%ld, %ld, %ld, %ld)\n",\
weight, site, x, y, z);
*(arrows + address + 0) = weight;
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)
{
if (1) printf("create a new arrow with weight = %ld at (%ld, %ld, %ld, %ld)\n",\
weight, site, x, y, z);
arrows_nb ++;
if (arrows_nb == 1) arrows = g_malloc(arrows_nb * 5 * sizeof(GLuint) * 2);
else arrows = g_realloc(arrows, arrows_nb * 5 * sizeof(GLuint) * 2);
buffer_lines_size += 14;
buffer_lines_origin = g_realloc(buffer_lines_origin, buffer_lines_size * 2 * sizeof(GLuint) * 2);
*(arrows + arrows_nb * 5 + 0) = weight;
*(arrows + arrows_nb * 5 + 1) = site;
*(arrows + arrows_nb * 5 + 2) = x;
*(arrows + arrows_nb * 5 + 3) = y;
*(arrows + arrows_nb * 5 + 4) = z;
return 1;
}
static bool erase_arrow (GLuint *arrows, long address,
long site, long x, long y, long z)
{
if (DETAIL) printf("erase arrow at address %ld with values (%ld, %ld, %ld, %ld)",\
address / 5, site, x, y, z);
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),
*(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_nb --;
buffer_lines_size -= 14;
buffer_lines_origin = g_realloc(buffer_lines_origin, buffer_lines_size * 2 * sizeof(GLuint) * 2);
return 1;
}
static long check_for_arrow (GLuint *arrows, long site, long x, long y, long z)
{
if (arrows_nb <= 1) return -1;
printf("check_for_arrow (723) arrows_nb = %ld\n", arrows_nb);
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;
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);
if (DETAIL) 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 address, long weight, long site, long x, long y, long z)
{
printf("\n[ n] load | site x y z ----- < arrows_nb = %ld > ------", arrows_nb);
if (arrows_nb == 0) printf("--------------------------- no arrows\n");
else if (address == -1) printf("--------------------------- create new arrow\n");
else printf("--------------------------- erase arrow at address = %ld / 5\n", address);
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 && i != address / 5) 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));
show_arrows_array(arrows, 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);
if (address >= 0 && weight > 0) return rewrite_arrow (arrows, address, weight, site, x, y, z);
return 0;
}
@ -817,12 +666,6 @@ void graphics_init_buffers(const void *gl_area)
compute_buffers_sizes (model_space_size_x, compute_buffers_sizes (model_space_size_x,
model_space_size_y, model_space_size_y,
model_space_size_z, model_space_size_z,
// arrows_nb,
// pref_mark_unit_space,
// pref_style_lines_planes,
// pref_style_mix_colors,
pref_test_diagonal); pref_test_diagonal);
buffer_vertex_origin = g_malloc0(buffer_vertex_size * sizeof(GLfloat) * 2); buffer_vertex_origin = g_malloc0(buffer_vertex_size * sizeof(GLfloat) * 2);
@ -837,9 +680,6 @@ void graphics_init_buffers(const void *gl_area)
arrows, arrows,
arrows_nb, arrows_nb,
// pref_mark_unit_space,
// pref_style_lines_planes,
// pref_style_mix_colors,
pref_show_grid, pref_show_grid,
pref_test_diagonal, pref_test_diagonal,
@ -858,41 +698,6 @@ void graphics_init_buffers(const void *gl_area)
model_space_size_z * model_space_size_y, model_space_size_z, model_space_size_z * model_space_size_y, model_space_size_z,
arrows, arrows_nb); arrows, arrows_nb);
// sleep(0);
// set_arrow(arrows, 0, 4, 3, 0, 0);
// set_arrow(arrows, 0, 5, 3, 0, 1);
/* set_arrow(arrows, 0, 5, 2, 1, 1); */
/* set_arrow(arrows, 0, 4, 2, 1, 0); */
/* set_arrow(arrows, 0, 2, 2, 1, 1); */
/* set_arrow(arrows, 0, 3, 2, 2, 1); */
/* 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); */
// sleep(0);
// set_arrow(arrows, 1, 0, 0, 0, 2);
set_arrow(arrows, 4, 1, 1, 0, 2);
// set_arrow(arrows, 0, 0, 0, 0, 2);
// set_arrow(arrows, 0, 1, 1, 0, 2);
// set_arrow(arrows, 1, 2, 0, 0, 2);
// set_arrow(arrows, 1, 3, 0, 1, 2);
// set_arrow(arrows, 3, 1, 1, 0, 2);
if (1) set_arrow(arrows, -1, -1, -1, -1, -1); // I use this to fprint the variables state
// before "drawing_some_arrows"
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; GLuint vao, vertex_buffer, color_buffer;
glGenBuffers(1, &vertex_buffer); glGenBuffers(1, &vertex_buffer);
@ -995,3 +800,182 @@ void graphics_draw(const void *gl_area)
/* #define DETAIL 0 */
/* static bool rewrite_arrow (GLuint *arrows, long address, long weight, */
/* long site, long x, long y, long z) */
/* { */
/* if (DETAIL) printf("write the arrow weight to %ld at (%ld, %ld, %ld, %ld)\n",\ */
/* weight, site, x, y, z); */
/* *(arrows + address + 0) = weight; */
/* 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) */
/* { */
/* if (1) printf("create a new arrow with weight = %ld at (%ld, %ld, %ld, %ld)\n",\ */
/* weight, site, x, y, z); */
/* arrows_nb ++; */
/* if (arrows_nb == 1) arrows = g_malloc(arrows_nb * 5 * sizeof(GLuint) * 2); */
/* else arrows = g_realloc(arrows, arrows_nb * 5 * sizeof(GLuint) * 2); */
/* buffer_lines_size += 14; */
/* buffer_lines_origin = g_realloc(buffer_lines_origin, buffer_lines_size * 2 * sizeof(GLuint) * 2); */
/* *(arrows + arrows_nb * 5 + 0) = weight; */
/* *(arrows + arrows_nb * 5 + 1) = site; */
/* *(arrows + arrows_nb * 5 + 2) = x; */
/* *(arrows + arrows_nb * 5 + 3) = y; */
/* *(arrows + arrows_nb * 5 + 4) = z; */
/* return 1; */
/* } */
/* static bool erase_arrow (GLuint *arrows, long address, */
/* long site, long x, long y, long z) */
/* { */
/* if (DETAIL) printf("erase arrow at address %ld with values (%ld, %ld, %ld, %ld)",\ */
/* address / 5, site, x, y, z); */
/* 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), */
/* *(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_nb --; */
/* buffer_lines_size -= 14; */
/* buffer_lines_origin = g_realloc(buffer_lines_origin, buffer_lines_size * 2 * sizeof(GLuint) * 2); */
/* return 1; */
/* } */
/* static long check_for_arrow (GLuint *arrows, long site, long x, long y, long z) */
/* { */
/* if (arrows_nb <= 1) return -1; */
/* printf("check_for_arrow (723) arrows_nb = %ld\n", arrows_nb); */
/* 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; */
/* 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); */
/* if (DETAIL) 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 address, long weight, long site, long x, long y, long z) */
/* { */
/* printf("\n[ n] load | site x y z ----- < arrows_nb = %ld > ------", arrows_nb); */
/* if (arrows_nb == 0) printf("--------------------------- no arrows\n"); */
/* else if (address == -1) printf("--------------------------- create new arrow\n"); */
/* else printf("--------------------------- erase arrow at address = %ld / 5\n", address); */
/* 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 && i != address / 5) 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)); */
/* show_arrows_array(arrows, 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); */
/* if (address >= 0 && weight > 0) return rewrite_arrow (arrows, address, weight, site, x, y, z); */
/* return 0; */
/* } */