Function set_arrow() OK + comments & cleaning
This commit is contained in:
parent
ad9829aa40
commit
603153293b
|
@ -108,6 +108,12 @@ static void graphics_debug_callback(GLenum source, GLenum type, GLuint id,
|
|||
|
||||
/* -------------------------------------------------------------------------- */
|
||||
|
||||
/*
|
||||
* void graphics_erase_line (GLuint a, GLuint b){} TODO and to use ?
|
||||
* As, in this version only lines can be erased,
|
||||
* similar functions for vertex and plans are not considered. But ?...
|
||||
*/
|
||||
|
||||
/*
|
||||
* Writes values to describe a line from a to b into the line buffer
|
||||
*
|
||||
|
@ -539,14 +545,30 @@ bool graphics_shutdown(const void *gl_area)
|
|||
}
|
||||
|
||||
|
||||
/*
|
||||
* Prints the arrows[] array
|
||||
*
|
||||
* For each arrow the following parameters are displayed :
|
||||
* - rank in the array
|
||||
* - weight (or load)
|
||||
* - coordinates in space (site, x, y, z)
|
||||
*/
|
||||
static void show_arrows_array (GLuint *arrows, int arrows_nb, int x, int y, int z)
|
||||
{
|
||||
printf("\n [rank] load | site x y z");
|
||||
for (int i = 0; i < arrows_nb; i++)
|
||||
printf("\n [%4d] = %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 (arrows_nb == 0) printf("\n [NULL] ---- | ---- --- --- ---");
|
||||
}
|
||||
|
||||
/*
|
||||
* Prints the initial user choices :
|
||||
* - space dimension size and appearance (grids)
|
||||
* - arrows[] array
|
||||
* NB The space may be empty or saturated with arrows or any value in between
|
||||
* Only one arrow per possible coordinates with a load max equal to ? TODO
|
||||
*/
|
||||
static void show_user_choices(GLuint *arrows, int arrows_nb,
|
||||
int space_size_x, int space_size_y, int space_size_z,
|
||||
int prefer, int show_all)
|
||||
|
@ -560,9 +582,63 @@ static void show_user_choices(GLuint *arrows, int arrows_nb,
|
|||
show_arrows_array (arrows, arrows_nb, space_size_x, space_size_y, space_size_z);
|
||||
}
|
||||
|
||||
/*
|
||||
* Prints the result of the function set_arrow()
|
||||
* and indicates the reasons of the choice (call) this function makes (see this function)
|
||||
*/
|
||||
static void show_user_action(GLuint *arrows, int arrows_nb, int address, int requested_weight,
|
||||
int current_weight, int site, int x, int y, int z)
|
||||
{
|
||||
if (address == -1 && requested_weight > 0) {printf("no such arrow found (%d,%d,%d,%d)\n\
|
||||
requested weight == %d => CREATE",\
|
||||
arrows[address + 1], arrows[address + 2], arrows[address + 3], arrows[address + 4], requested_weight); return;}
|
||||
|
||||
if (address >= 0 && requested_weight == 0) {printf("arrow (%d,%d,%d,%d) found at address %d; current_weight = %d;\n\
|
||||
requested weight == %d => ERASE",\
|
||||
arrows[address + 1], arrows[address + 2], arrows[address + 3], arrows[address + 4], address/5, current_weight, requested_weight); return;}
|
||||
|
||||
if (address >= 0 && current_weight != requested_weight) {printf("arrow (%d,%d,%d,%d) found at address %d; current_weight = %d;\n\
|
||||
requested weight != current weight => MODIFY",\
|
||||
arrows[address + 1], arrows[address + 2], arrows[address + 3], arrows[address + 4], address/5, current_weight); return;}
|
||||
|
||||
if (address >= 0 && current_weight == requested_weight){
|
||||
printf("arrow (%d,%d,%d,%d) found at address %d;\n\
|
||||
current_weight == requested_weight => END",\
|
||||
arrows[address + 1], arrows[address + 2], arrows[address + 3], arrows[address + 4], address/5); return;}
|
||||
|
||||
if (address == -1 && requested_weight == 0) {printf("no such arrow found (%d,%d,%d,%d) && requested weight == 0 => END",\
|
||||
arrows[address + 1], arrows[address + 2], arrows[address + 3], arrows[address + 4]); return;}
|
||||
}
|
||||
|
||||
/*
|
||||
* assigns a new weight to the arrow at address (address)
|
||||
* Prints vertex and lines buffers_states (sizes) at major steps and at the end of a session.
|
||||
* Major steps are creation of grids and creation of arrows
|
||||
* Arithmetic verification is provided at each step
|
||||
*/
|
||||
static void show_buffers_states(int space_X, int space_Y, int space_Z, int arrows_nb,
|
||||
int offset_after_grids, int buffer_vertex_size,
|
||||
int buffer_lines_size_after_cubes, int buffer_lines_size)
|
||||
{
|
||||
int offset_after_arrows = buffer_vertex_size / 3, difference = offset_after_arrows - offset_after_grids;
|
||||
|
||||
printf("\n - - - - - - - - - - - - - - - - - - - - - - - - - - - -");
|
||||
printf("\n buffer_vertex_offset_after grids = %6d\t%6d = (x+1)*(y+1)*(z+1); <--> (x,y,z = %d,%d,%d)",\
|
||||
offset_after_grids, (space_X + 1)*(space_Y + 1)*(space_Z + 1), space_X, space_Y, space_Z);
|
||||
printf("\n buffer_vertex_offset_after arrows = %6d\t%6d = %d + %d; <--> %d = 12 x %d (there are %d cubes)",\
|
||||
offset_after_arrows, offset_after_arrows, offset_after_grids,\
|
||||
difference, difference, difference / 12, difference / 12);
|
||||
printf("\n buffer_lines_offset after cubes = %6d\t%6d = 2 * (%dx%d + %dx%d + %dx%d); <--> 2 * (x*y + x*z + y*z)",\
|
||||
buffer_lines_size_after_cubes, ((space_X+1) * (space_Y+1) + (space_X+1) * (space_Z+1) + (space_Y+1) * (space_Z+1)) * 2,
|
||||
space_X+1, space_Y+1, space_X+1, space_Z+1, space_Y+1, space_Z+1);
|
||||
printf("\n buffer_lines_offset after arrows = %6d\t%6d = %d + %d; <--> %d = (3 + 4) x 2 x %d (arrows_nb = %d)\n",\
|
||||
buffer_lines_size, buffer_lines_size, buffer_lines_size_after_cubes,\
|
||||
buffer_lines_size - buffer_lines_size_after_cubes, arrows_nb * 14, arrows_nb, arrows_nb);
|
||||
}
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* Assigns a new weight to the arrow at address (address)
|
||||
*/
|
||||
static int rewrite_arrow (GLuint *arrows, int arrows_nb, int address, int weight, int site, int x, int y, int z)
|
||||
{
|
||||
|
@ -573,6 +649,10 @@ static int rewrite_arrow (GLuint *arrows, int arrows_nb, int address, int weight
|
|||
return arrows_nb;
|
||||
}
|
||||
|
||||
/*
|
||||
* Creates a new arrow at address (address)
|
||||
* NB Weights (or loads) are NOT added
|
||||
*/
|
||||
static int create_arrow (GLuint *arrows, int arrows_nb, int weight, int site, int x, int y, int z)
|
||||
{
|
||||
buffer_lines_origin = g_realloc(buffer_lines_origin, buffer_lines_size * sizeof(GLuint));
|
||||
|
@ -587,11 +667,14 @@ static int create_arrow (GLuint *arrows, int arrows_nb, int weight, int site, in
|
|||
|
||||
arrows_nb ++;
|
||||
|
||||
show_arrows_array(arrows, arrows_nb, x, y, z);
|
||||
show_arrows_array (arrows, arrows_nb, x, y, z);
|
||||
|
||||
return arrows_nb;
|
||||
}
|
||||
|
||||
/*
|
||||
* Removes an arrow at address (address)
|
||||
*/
|
||||
static int erase_arrow (GLuint *arrows, int arrows_nb, int address, int site, int x, int y, int z)
|
||||
{
|
||||
arrows_nb --;
|
||||
|
@ -607,14 +690,19 @@ static int erase_arrow (GLuint *arrows, int arrows_nb, int address, int site, in
|
|||
|
||||
buffer_lines_origin = g_realloc(buffer_lines_origin, buffer_lines_size * sizeof(GLuint));
|
||||
|
||||
show_arrows_array(arrows, arrows_nb, x, y, z);
|
||||
show_arrows_array (arrows, arrows_nb, x, y, z);
|
||||
|
||||
return arrows_nb;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* Calls one of the functions create_arrow(), erase_arrow() or rewrite_arrow()
|
||||
* according to requested weight and address (coord site, x, y, z)
|
||||
*
|
||||
* May not call any of these three functions if :
|
||||
* - Current_weight of an arrow located at the requested address == requested_weight
|
||||
* - No arrow was found at the requested addres AND current_weight == requested_weight
|
||||
*/
|
||||
static int set_arrow (GLuint *arrows, int arrows_nb, int requested_weight, int site, int x, int y, int z)
|
||||
{
|
||||
int address = -1, current_weight = -1;
|
||||
|
@ -633,32 +721,32 @@ static int set_arrow (GLuint *arrows, int arrows_nb, int requested_weight, int s
|
|||
|
||||
printf("\nset_arrow() invoked with requested weight = %d > ", requested_weight);
|
||||
|
||||
if (address == -1 && requested_weight > 0) {printf("no such arrow found\n\
|
||||
requested weight == %d => CREATE", requested_weight);
|
||||
return create_arrow (arrows, arrows_nb, requested_weight, site, x, y, z);}
|
||||
show_user_action(arrows, arrows_nb, address, requested_weight, current_weight, site, x, y, z);
|
||||
|
||||
if (address >= 0 && requested_weight == 0) {printf("arrow (%d,%d,%d,%d) found at address %d; current_weight = %d;\n\
|
||||
requested weight == %d => ERASE",\
|
||||
arrows[address + 1], arrows[address + 2], arrows[address + 3], arrows[address + 4], address/5, current_weight, requested_weight);
|
||||
return erase_arrow (arrows, arrows_nb, address, site, x, y, z);}
|
||||
if (address == -1 && requested_weight > 0)
|
||||
return create_arrow (arrows, arrows_nb, requested_weight, site, x, y, z);
|
||||
|
||||
if (address >= 0 && current_weight != requested_weight) {printf("arrow (%d,%d,%d,%d) found at address %d; current_weight = %d;\n\
|
||||
requested weight != current weight => MODIFY",\
|
||||
arrows[address + 1],arrows[address + 2],arrows[address + 3],arrows[address + 4], address/5, current_weight);
|
||||
return rewrite_arrow (arrows, arrows_nb, address/5, requested_weight, site, x, y, z);}
|
||||
if (address >= 0 && requested_weight == 0)
|
||||
return erase_arrow (arrows, arrows_nb, address, site, x, y, z);
|
||||
|
||||
if (address >= 0 && current_weight == requested_weight) {
|
||||
printf("arrow (%d,%d,%d,%d) found at address %d; current_weight == requested_weight => END",\
|
||||
arrows[address + 1], arrows[address + 2], arrows[address + 3], arrows[address + 4], address/5); return arrows_nb;}
|
||||
if (address >= 0 && current_weight != requested_weight)
|
||||
return rewrite_arrow (arrows, arrows_nb, address/5, requested_weight, site, x, y, z);
|
||||
|
||||
if (address == -1 && requested_weight == 0) {printf("no such arrow found && requested weight == 0 => END"); return arrows_nb;}
|
||||
if (address >= 0 && current_weight == requested_weight) show_arrows_array(arrows, arrows_nb, x, y, z);
|
||||
|
||||
if (address == -1 && requested_weight == 0) show_arrows_array(arrows, arrows_nb, x, y, z);
|
||||
|
||||
return arrows_nb;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* Init space and arrows (= initial state)
|
||||
* and allows ulterior creations, suppressions or modifications of the arrows[] array
|
||||
*
|
||||
* Draws space and arrows
|
||||
*/
|
||||
void main_test_graphics (void)
|
||||
{
|
||||
// assert : space dimensions (x,y,z) > 0 TODO NOT checked before init
|
||||
|
@ -666,7 +754,7 @@ void main_test_graphics (void)
|
|||
// assert : no more than one arrow per address TODO NOT checked before init
|
||||
// notify : weights are replaced, NOT added (could be !) TODO
|
||||
|
||||
int space_X = 7, space_Y = 1, space_Z = 1;
|
||||
int space_X = 4, space_Y = 1, space_Z = 1;
|
||||
int pref_show_grids = 0; // 0, 1, 2, 3, 5, 6, 10, 15, 30, etc
|
||||
// xyz, 0, x, y, z, xy, xz, yz, xyz
|
||||
GLuint arrows[] = {
|
||||
|
@ -700,9 +788,8 @@ void main_test_graphics (void)
|
|||
arrows_nb = set_arrow (arrows, arrows_nb, 1, 1, 2, 0, 0);
|
||||
arrows_nb = set_arrow (arrows, arrows_nb, 8, 1, 3, 0, 0);
|
||||
arrows_nb = set_arrow (arrows, arrows_nb, 8, 1, 3, 0, 0);
|
||||
arrows_nb = set_arrow (arrows, arrows_nb, 0, 1, 3, 0, 0);
|
||||
arrows_nb = set_arrow (arrows, arrows_nb, 0, 1, 1, 0, 0);
|
||||
arrows_nb = set_arrow (arrows, arrows_nb, 1, 2, 0, 0, 0);
|
||||
arrows_nb = set_arrow (arrows, arrows_nb, 1, 2, 0, 0, 0);
|
||||
|
||||
int weight = 0, site = 0,
|
||||
stx = space_Z * space_Y, sty = space_Z, stz = 1, arrow_offset = 0;
|
||||
|
@ -727,19 +814,8 @@ void main_test_graphics (void)
|
|||
}
|
||||
}
|
||||
|
||||
int offset_after_arrows = buffer_vertex_size / 3, difference = offset_after_arrows - offset_after_grids;
|
||||
|
||||
printf("\n - - - - - - - - - - - - - - - - - - - - - - - - - - - -");
|
||||
printf("\n buffer_vertex_offset_after grids = %6d\t%6d = (x+1)*(y+1)*(z+1); <--> (x,y,z = %d,%d,%d)",\
|
||||
offset_after_grids, (space_X + 1)*(space_Y + 1)*(space_Z + 1), space_X, space_Y, space_Z);
|
||||
printf("\n buffer_vertex_offset_after arrows = %6d\t%6d = %d + %d; <--> %d = 12 x %d (there are %d cubes)",\
|
||||
offset_after_arrows, offset_after_arrows, offset_after_grids,\
|
||||
difference, difference, difference / 12, difference / 12);
|
||||
printf("\n buffer_lines_offset after cubes = %6d\t%6d = 2 * (%dx%d + %dx%d + %dx%d); <--> 2 * (x*y + x*z + y*z)",\
|
||||
buffer_lines_size_after_cubes, ((space_X+1) * (space_Y+1) + (space_X+1) * (space_Z+1) + (space_Y+1) * (space_Z+1)) * 2,
|
||||
space_X+1, space_Y+1, space_X+1, space_Z+1, space_Y+1, space_Z+1);
|
||||
printf("\n buffer_lines_offset after arrows = %6d\t%6d = %d + %d; <--> %d = (3 + 4) x 2 x %d (arrows_nb = %d)\n",\
|
||||
buffer_lines_size, buffer_lines_size, buffer_lines_size_after_cubes,\
|
||||
buffer_lines_size - buffer_lines_size_after_cubes, arrows_nb * 14, arrows_nb, arrows_nb);
|
||||
show_buffers_states(space_X, space_Y, space_Z, arrows_nb,
|
||||
offset_after_grids, buffer_vertex_size,
|
||||
buffer_lines_size_after_cubes, buffer_lines_size);
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue