src/graphics/*: full refactoring of source code
src/graphics.c : contains all primitives on buffers and control src/arrows.c : contains all complex writing for arrows constructions src/grid.c : contains all complexe writing for grid construction Signed-off-by: Adrien Bourmault <neox@a-lec.org> Acked-by: Jean Sirmai <jean@a-lec.org>
This commit is contained in:
parent
7f010b87c7
commit
f8b1943edc
|
@ -4,6 +4,7 @@
|
||||||
* Desc: OpenGL utils header
|
* Desc: OpenGL utils header
|
||||||
*
|
*
|
||||||
* Copyright (C) 2023 Jean Sirmai <jean@a-lec.org>
|
* Copyright (C) 2023 Jean Sirmai <jean@a-lec.org>
|
||||||
|
* Copyright (C) 2023 Adrien Bourmault <neox@a-lec.org>
|
||||||
*
|
*
|
||||||
* This file is part of Gem-graph.
|
* This file is part of Gem-graph.
|
||||||
*
|
*
|
||||||
|
@ -26,17 +27,88 @@
|
||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
#include <GL/glu.h>
|
#include <GL/glu.h>
|
||||||
|
|
||||||
void check_arrows_data(int x, int y, int z,
|
/*
|
||||||
GLuint *arrows, int arrows_nb, int central_stars_nb);
|
* Writes basis and tip for all arrows into vertex and color buffers
|
||||||
|
*
|
||||||
|
* @param dimensions (x,y,z)
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
void arrows_write_terminations (long x, long y, long z);
|
||||||
|
|
||||||
long compute_vertex_nb(int vertex_nb, int x, int y, int z);
|
/*
|
||||||
|
* Writes lines for arrow oriented to the east into lines buffer
|
||||||
|
*
|
||||||
|
* @param s,
|
||||||
|
* weight,
|
||||||
|
* site
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
void write_arrow_lines_east (long s, int weight, int site);
|
||||||
|
|
||||||
long compute_lines_nb(int lines_nb, int arrows_nb, int central_stars_nb);
|
/*
|
||||||
|
* Writes lines for arrow oriented to the west into lines buffer
|
||||||
|
*
|
||||||
|
* @param s,
|
||||||
|
* weight,
|
||||||
|
* site
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
void write_arrow_lines_west (long s, int weight, int site);
|
||||||
|
|
||||||
bool alloc_arrows_vertex (long x, long y, long z,
|
/*
|
||||||
GLfloat *vertex_origin, GLfloat *colors_origin,
|
* Writes lines for arrow oriented to the zenith into lines buffer
|
||||||
int vertex_index, int colors_index);
|
*
|
||||||
|
* @param s,
|
||||||
|
* weight,
|
||||||
|
* site
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
void write_arrow_lines_zenith (long s, int weight, int site);
|
||||||
|
|
||||||
bool alloc_arrows_lines (long space_size_x, long space_size_y, long space_size_z,
|
/*
|
||||||
GLuint *arrows, int arrows_nb);
|
* Writes lines for arrow oriented to the nadir into lines buffer
|
||||||
|
*
|
||||||
|
* @param s,
|
||||||
|
* weight,
|
||||||
|
* site
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
void write_arrow_lines_nadir (long s, int weight, int site);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Writes lines for arrow oriented to the south into lines buffer
|
||||||
|
*
|
||||||
|
* @param s,
|
||||||
|
* weight,
|
||||||
|
* site
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
void write_arrow_lines_south (long s, int weight, int site);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Writes lines for arrow oriented to the north into lines buffer
|
||||||
|
*
|
||||||
|
* @param s,
|
||||||
|
* weight,
|
||||||
|
* site
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
void write_arrow_lines_north (long s, int weight, int site);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Writes lines for arrow basis into lines buffer
|
||||||
|
*
|
||||||
|
* @param n,
|
||||||
|
* weight,
|
||||||
|
* site
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
void arrows_write_basis(long n);
|
||||||
|
|
|
@ -23,13 +23,18 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
#include <assert.h>
|
||||||
|
#include <errno.h>
|
||||||
|
#include <fcntl.h>
|
||||||
|
#include <math.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
#include <fcntl.h>
|
#include <sys/types.h>
|
||||||
|
#include <sys/stat.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#include <errno.h>
|
#include <glib-2.0/glib.h>
|
||||||
#include <glib.h>
|
|
||||||
#define G_APPLICATION_DEFAULT_FLAGS 0
|
#define G_APPLICATION_DEFAULT_FLAGS 0
|
||||||
|
|
||||||
enum
|
enum
|
||||||
|
@ -73,3 +78,18 @@ static inline char *read_file(char *filename)
|
||||||
|
|
||||||
return contents;
|
return contents;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* I'm standing on Earth (any planet or star or spinning spheroid, in fact)
|
||||||
|
* and looking towards its North pole
|
||||||
|
*
|
||||||
|
* X - X = EAST - WEST = rouge - cyan
|
||||||
|
* Y - Y = ZENITH - NADIR = vert - magenta
|
||||||
|
* Z - Z = NORTH - SOUTH = bleu - jaune
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define EAST 0 // + x rouge
|
||||||
|
#define WEST 1 // - x cyan
|
||||||
|
#define ZENITH 2 // + y vert
|
||||||
|
#define NADIR 3 // - y magenta
|
||||||
|
#define SOUTH 4 // - z jaune
|
||||||
|
#define NORTH 5 // + z bleu
|
||||||
|
|
|
@ -26,7 +26,9 @@
|
||||||
#pragma once
|
#pragma once
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
|
#include <epoxy/gl.h>
|
||||||
#include <GL/glu.h>
|
#include <GL/glu.h>
|
||||||
|
#include <GL/glext.h>
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Structure describing a gl_area and its parameters, used to create a table
|
* Structure describing a gl_area and its parameters, used to create a table
|
||||||
|
@ -46,6 +48,16 @@ struct gl_area_entry {
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Find gl_area_entry from a gl_area ptr
|
||||||
|
*
|
||||||
|
* @param gl_area, ptr to the gl_area widget
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* @return entry ptr
|
||||||
|
*/
|
||||||
|
struct gl_area_entry *graphics_find_glarea_from_ptr(const char *name);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Initializes a gl_area
|
* Initializes a gl_area
|
||||||
*
|
*
|
||||||
|
@ -78,51 +90,180 @@ bool graphics_shutdown(const void *gl_area);
|
||||||
*
|
*
|
||||||
* @param gl_area, ptr to the gl_area widget
|
* @param gl_area, ptr to the gl_area widget
|
||||||
*
|
*
|
||||||
*
|
|
||||||
* @return true if initialized
|
* @return true if initialized
|
||||||
*/
|
*/
|
||||||
bool graphics_init_shaders(const void *gl_area);
|
bool graphics_init_shaders(const void *gl_area);
|
||||||
|
|
||||||
/*
|
/* Initializes the buffer of a gl_area
|
||||||
* Initializes the buffer of a gl_area
|
* Calls according to the user preferences
|
||||||
*
|
|
||||||
* @param gl_area, ptr to the gl_area widget
|
* @param gl_area, ptr to the gl_area widget
|
||||||
*
|
|
||||||
* Note : indices[] is defined in graphics_cube.h
|
|
||||||
*
|
|
||||||
* @return void
|
* @return void
|
||||||
*/
|
*/
|
||||||
void graphics_init_buffers(const void *gl_area);
|
void graphics_init_buffers(const void *gl_area);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* 2023-09-05 Sur la branche dev/graphics2
|
* Writes values to describe a line from a to b into the line buffer
|
||||||
* >>> Restructuration [state // arrows]
|
|
||||||
*
|
*
|
||||||
* Le calcul du nombre et de la position des vertex et des couleurs
|
* @param coords GLuint (a,b)
|
||||||
* est fait au début de chaque session de travail en fonction de :
|
|
||||||
* - x,y,z
|
|
||||||
* - user preferences
|
|
||||||
*
|
*
|
||||||
* Le premier but de la restructuration est que :
|
* @return void
|
||||||
* le calcul des valeurs des vertex départ/arrivée des lignes
|
|
||||||
* et l'allocation du buffer lignes (! LIGNES ! <> pas vertex)
|
|
||||||
* soit fait par des realloc(),
|
|
||||||
* (une realloc à chaque écriture (ou effacement) d'une flèche)
|
|
||||||
* et non, comme actuellement, en une seule fois lors de l'initialisation
|
|
||||||
* bdad3857a9ede7f96dac430505c4f3c5da39744f
|
|
||||||
*
|
|
||||||
* Cette restructuration sera plus lisible si le code qui décrit les flèches
|
|
||||||
* est nettement séparé de celui qui décrit l'espace.
|
|
||||||
*
|
|
||||||
* Certaines fonctions des actuels fichiers '/graphics' et '/buffers'
|
|
||||||
* doivent donc être transférées vers deux nouveaux fichiers :
|
|
||||||
* '/space' et '/arrows'
|
|
||||||
*
|
|
||||||
* La fonction draw_line(a,b) sera utilisée pour tracer toutes les lignes
|
|
||||||
* (qu'elles décrivent l'espace ou les flèches).
|
|
||||||
* Elle calcule les adresses mémoire des vertex (a) et (b)
|
|
||||||
* en fonction de leur position dans l'espace
|
|
||||||
* et réalloue le buffer lines avant d'y écrire :
|
|
||||||
*/
|
*/
|
||||||
void draw_line (int a, int b);
|
void graphics_write_line (GLuint a, GLuint b);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Writes values to describe a vertex at (x,y,z) into the vertex buffer
|
||||||
|
*
|
||||||
|
* @param coords GLfloat(x,y,z)
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
void graphics_write_vertex (GLfloat x, GLfloat y, GLfloat z);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Writes values to describe a color (r,g,b) into the color buffer
|
||||||
|
*
|
||||||
|
* @param color GLfloat(r,g,b)
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
void graphics_write_color (GLfloat r, GLfloat g, GLfloat b);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Writes values to describe an (a,b,c) plan (triangle) into the plan buffer
|
||||||
|
*
|
||||||
|
* @param coords GLuint (a,b,c)
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
void graphics_write_plan (GLuint a, GLuint b, GLuint c);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Initializes an identity matrix
|
||||||
|
*
|
||||||
|
* @param res, target ptr
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
static inline void compute_i(float *res)
|
||||||
|
{
|
||||||
|
/* initialize to the identity matrix */
|
||||||
|
res[0] = 1.f; res[4] = 0.f; res[8] = 0.f; res[12] = 0.f;
|
||||||
|
res[1] = 0.f; res[5] = 1.f; res[9] = 0.f; res[13] = 0.f;
|
||||||
|
res[2] = 0.f; res[6] = 0.f; res[10] = 1.f; res[14] = 0.f;
|
||||||
|
res[3] = 0.f; res[7] = 0.f; res[11] = 0.f; res[15] = 1.f;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Computes the projection matrix
|
||||||
|
*
|
||||||
|
* @param res, target ptr
|
||||||
|
* phi, XXX
|
||||||
|
* theta, XXX
|
||||||
|
* psi, XXX
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
static inline void compute_mvp(float *res, float phi, float theta, float psi)
|
||||||
|
{
|
||||||
|
float x = phi *(G_PI / 180.f);
|
||||||
|
float y = theta *(G_PI / 180.f);
|
||||||
|
float z = psi *(G_PI / 180.f);
|
||||||
|
float c1 = cosf(x), s1 = sinf(x);
|
||||||
|
float c2 = cosf(y), s2 = sinf(y);
|
||||||
|
float c3 = cosf(z), s3 = sinf(z);
|
||||||
|
float c3c2 = c3 * c2;
|
||||||
|
float s3c1 = s3 * c1;
|
||||||
|
float c3s2s1 = c3 * s2 * s1;
|
||||||
|
float s3s1 = s3 * s1;
|
||||||
|
float c3s2c1 = c3 * s2 * c1;
|
||||||
|
float s3c2 = s3 * c2;
|
||||||
|
float c3c1 = c3 * c1;
|
||||||
|
float s3s2s1 = s3 * s2 * s1;
|
||||||
|
float c3s1 = c3 * s1;
|
||||||
|
float s3s2c1 = s3 * s2 * c1;
|
||||||
|
float c2s1 = c2 * s1;
|
||||||
|
float c2c1 = c2 * c1;
|
||||||
|
|
||||||
|
compute_i(res);
|
||||||
|
|
||||||
|
/* apply all three rotations using the three matrices:
|
||||||
|
*
|
||||||
|
* ⎡ c3 s3 0 ⎤ ⎡ c2 0 -s2 ⎤ ⎡ 1 0 0 ⎤
|
||||||
|
* ⎢ -s3 c3 0 ⎥ ⎢ 0 1 0 ⎥ ⎢ 0 c1 s1 ⎥
|
||||||
|
* ⎣ 0 0 1 ⎦ ⎣ s2 0 c2 ⎦ ⎣ 0 -s1 c1 ⎦
|
||||||
|
*/
|
||||||
|
res[0] = c3c2; res[4] = s3c1 + c3s2s1; res[8] = s3s1 - c3s2c1; res[12] = 0.f;
|
||||||
|
res[1] = -s3c2; res[5] = c3c1 - s3s2s1; res[9] = c3s1 + s3s2c1; res[13] = 0.f;
|
||||||
|
res[2] = s2; res[6] = -c2s1; res[10] = c2c1; res[14] = 0.f;
|
||||||
|
res[3] = 0.f; res[7] = 0.f; res[11] = 0.f; res[15] = 1.f;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Created and compile a shader
|
||||||
|
*
|
||||||
|
* @param type, shader type
|
||||||
|
* src, source code of shader
|
||||||
|
*
|
||||||
|
* @return shader id
|
||||||
|
*/
|
||||||
|
static inline GLuint create_shader(int type, const char *src)
|
||||||
|
{
|
||||||
|
GLuint shader;
|
||||||
|
int status;
|
||||||
|
|
||||||
|
shader = glCreateShader(type);
|
||||||
|
glShaderSource(shader, 1, &src, NULL);
|
||||||
|
glCompileShader(shader);
|
||||||
|
|
||||||
|
glGetShaderiv(shader, GL_COMPILE_STATUS, &status);
|
||||||
|
if(status == GL_FALSE) {
|
||||||
|
int log_len;
|
||||||
|
char *buffer;
|
||||||
|
|
||||||
|
glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &log_len);
|
||||||
|
|
||||||
|
buffer = g_malloc(log_len + 1);
|
||||||
|
glGetShaderInfoLog(shader, log_len, NULL, buffer);
|
||||||
|
|
||||||
|
g_warning("Compile failure in %s shader:\n%s",
|
||||||
|
type == GL_VERTEX_SHADER ? "vertex" : "fragment",
|
||||||
|
buffer);
|
||||||
|
|
||||||
|
g_free(buffer);
|
||||||
|
|
||||||
|
glDeleteShader(shader);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
return shader;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Find the gl_area_entry size
|
||||||
|
*
|
||||||
|
* @param void
|
||||||
|
*
|
||||||
|
* @return size of array
|
||||||
|
*/
|
||||||
|
extern struct gl_area_entry **gl_area_array;
|
||||||
|
static inline short gl_area_size(void)
|
||||||
|
{
|
||||||
|
struct gl_area_entry **cur;
|
||||||
|
short size;
|
||||||
|
|
||||||
|
// Check uninitialized and quit
|
||||||
|
if (gl_area_array == NULL) return 0;
|
||||||
|
|
||||||
|
cur = gl_area_array;
|
||||||
|
while(*cur) {
|
||||||
|
cur++;
|
||||||
|
size++;
|
||||||
|
}
|
||||||
|
|
||||||
|
return size;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*** TEST ***/
|
||||||
|
|
||||||
|
void main_test_graphics (void);
|
||||||
|
|
|
@ -3,6 +3,7 @@
|
||||||
*
|
*
|
||||||
* Desc: OpenGL utils header
|
* Desc: OpenGL utils header
|
||||||
*
|
*
|
||||||
|
* Copyright (C) 2023 Adrien Bourmault <neox@a-lec.org>
|
||||||
* Copyright (C) 2023 Jean Sirmai <jean@a-lec.org>
|
* Copyright (C) 2023 Jean Sirmai <jean@a-lec.org>
|
||||||
*
|
*
|
||||||
* This file is part of Gem-graph.
|
* This file is part of Gem-graph.
|
||||||
|
@ -26,22 +27,48 @@
|
||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
#include <GL/glu.h>
|
#include <GL/glu.h>
|
||||||
|
|
||||||
bool compute_space_and_arrows(long model_space_size_x,
|
/*
|
||||||
long model_space_size_y,
|
* Writes grid lines intersections to vertex and color buffers
|
||||||
long model_space_size_z,
|
*
|
||||||
|
* @param coords long (x,y,z)
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
void grid_write_intersections (long x, long y, long z);
|
||||||
|
|
||||||
GLuint *arrows,
|
/*
|
||||||
int model_arrows_nb,
|
* Writes grid ridges to vertex and color buffers
|
||||||
|
*
|
||||||
int pref_show_grid,
|
* @param coords long (x,y,z), step_x, step_y, step_z
|
||||||
|
*
|
||||||
GLfloat *vertex_origin,
|
* @return void
|
||||||
GLfloat *color_origin,
|
*/
|
||||||
GLuint *line_origin,
|
void grid_write_ridges (long x, long y, long z);
|
||||||
GLuint *plan_origin);
|
|
||||||
|
|
||||||
|
|
||||||
long get_buffer_lines_size();
|
/*
|
||||||
void inc_buffer_lines_size(long inc);
|
* Writes grid lines for x axis to vertex and color buffers
|
||||||
void dec_buffer_lines_size(long dec);
|
*
|
||||||
|
* @param coords long (x,y,z)
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
void grid_write_x (long x, long y, long z);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Writes grid lines for y axis to vertex and color buffers
|
||||||
|
*
|
||||||
|
* @param coords long (x,y,z)
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
void grid_write_y (long x, long y, long z);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Writes grid lines for z axis to vertex and color buffers
|
||||||
|
*
|
||||||
|
* @param coords long (x,y,z)
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
void grid_write_z (long x, long y, long z);
|
|
@ -1,61 +0,0 @@
|
||||||
/*
|
|
||||||
* Gem-graph OpenGL experiments
|
|
||||||
*
|
|
||||||
* Desc: OpenGL utils header
|
|
||||||
*
|
|
||||||
* Copyright (C) 2023 Jean Sirmai <jean@a-lec.org>
|
|
||||||
*
|
|
||||||
* This file is part of Gem-graph.
|
|
||||||
*
|
|
||||||
* This program is free software: you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU Affero General Public License as published by
|
|
||||||
* the Free Software Foundation, either version 3 of the License, or
|
|
||||||
* (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU Affero General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU Affero General Public License
|
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#pragma once
|
|
||||||
#include <unistd.h>
|
|
||||||
#include <stdbool.h>
|
|
||||||
#include <GL/glu.h>
|
|
||||||
|
|
||||||
void check_space_data_and_user_preferences(int x, int y, int z,
|
|
||||||
int grid, int diagonal);
|
|
||||||
|
|
||||||
// void do_alloc_buffers(){}; // ?!? Pourquoi ne dois-je pas déclarer cette fonction ici ?
|
|
||||||
|
|
||||||
void compute_buffers_sizes(int model_space_size_x,
|
|
||||||
int model_space_size_y,
|
|
||||||
int model_space_size_z,
|
|
||||||
long central_stars_nb,
|
|
||||||
long arrows_nb,
|
|
||||||
int pref_test_diagonal);
|
|
||||||
|
|
||||||
long compute_space_vertex_nb(int x, int y, int z);
|
|
||||||
|
|
||||||
long compute_space_lines_nb(int x, int y, int z, int pref_show_grid);
|
|
||||||
|
|
||||||
// bool alloc_space_vertex (long x, long y, long z,
|
|
||||||
// GLfloat *vertex_origin, GLfloat *colors_origin,
|
|
||||||
// int vertex_index, int colors_index);
|
|
||||||
bool alloc_space_vertex_and_colors (long x, long y, long z);
|
|
||||||
|
|
||||||
void draw_a_cube_at(long u, long v, long w,
|
|
||||||
long size_x, long size_y, long size_z, bool diagonals);
|
|
||||||
|
|
||||||
void draw_ridges_3D (long x, long y, long z,
|
|
||||||
long step_x, long step_y, long step_z);
|
|
||||||
|
|
||||||
bool draw_grids_3D (long x, long y, long z,
|
|
||||||
long step_x, long step_y, long step_z,
|
|
||||||
int pref_show_grid);
|
|
||||||
|
|
||||||
void diagonal_test(long x, long y, long z,
|
|
||||||
long step_x, long step_y, long step_z);
|
|
|
@ -4,6 +4,7 @@
|
||||||
* Desc: OpenGL utils header
|
* Desc: OpenGL utils header
|
||||||
*
|
*
|
||||||
* Copyright (C) 2023 Jean Sirmai <jean@a-lec.org>
|
* Copyright (C) 2023 Jean Sirmai <jean@a-lec.org>
|
||||||
|
* Copyright (C) 2023 Arien Bourmault <neox@a-lec.org>
|
||||||
*
|
*
|
||||||
* This file is part of Gem-graph.
|
* This file is part of Gem-graph.
|
||||||
*
|
*
|
||||||
|
@ -21,470 +22,197 @@
|
||||||
* aint with this program. If not, see <http://www.gnu.org/licenses/>.
|
* aint with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
//#pragma once
|
#include "../../include/base.h"
|
||||||
#include <unistd.h>
|
|
||||||
#include <stdbool.h>
|
|
||||||
#include <assert.h>
|
|
||||||
#include <sys/types.h>
|
|
||||||
#include <sys/stat.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <fcntl.h>
|
|
||||||
#include <epoxy/gl.h>
|
|
||||||
#include <GL/glu.h>
|
|
||||||
#include <GL/glext.h>
|
|
||||||
#include <glib-2.0/glib.h>
|
|
||||||
#include <math.h>
|
|
||||||
#include <errno.h>
|
|
||||||
|
|
||||||
#include "../../include/ui.h"
|
|
||||||
#include "../../include/graphics.h"
|
#include "../../include/graphics.h"
|
||||||
|
|
||||||
bool alloc_arrows_vertex (long x, long y, long z,
|
/* I'm standing on Earth (any planet or star or spinning spheroid, in fact)
|
||||||
GLfloat *vertex_origin, GLfloat *colors_origin,
|
* and looking towards its North pole
|
||||||
int vertex_index, int colors_index)
|
*
|
||||||
|
* X - X = EAST - WEST = rouge - cyan
|
||||||
|
* Y - Y = ZENITH - NADIR = vert - magenta
|
||||||
|
* Z - Z = NORTH - SOUTH = bleu - jaune
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Writes basis and tip for all arrows into vertex and color buffers
|
||||||
|
*
|
||||||
|
* @param dimensions (x,y,z)
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
void arrows_write_terminations (long x, long y, long z)
|
||||||
{
|
{
|
||||||
|
float max, i, j, k, vx, vy, vz, arrow_basis_width, arrow_tip_padding;
|
||||||
|
|
||||||
// X - X = EAST - WEST = rouge - cyan
|
max = fmax(x, y); max = fmax(max, z);
|
||||||
// Y - Y = ZENITH - NADIR = vert - magenta
|
|
||||||
// Z - Z = SOUTH - NORTH = jaune - bleu
|
|
||||||
|
|
||||||
|
// arrow_basis_width donne la dimension de l'étoile centrale
|
||||||
|
arrow_basis_width = 0.3f * (1 / max),
|
||||||
|
|
||||||
float max = fmax(x, y);
|
// décale légèrement les pointes des flèches
|
||||||
max = fmax(max, z);
|
// pour qu'elles n'aillent pas jusqu'aux faces des cubes
|
||||||
|
arrow_tip_padding = 0.1 * (1 / max);
|
||||||
float i, j, k, vx, vy, vz,
|
|
||||||
ad = 1 / max,
|
|
||||||
a_third = 0.3f * ad, // a_third donne la dimension de l'étoile centrale
|
|
||||||
eps = 0.1 * ad; // eps(ilon) servira à décaler légèrement les pointes des flèches
|
|
||||||
// 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);
|
|
||||||
|
|
||||||
for (i = 0; i < x; i++)
|
for (i = 0; i < x; i++)
|
||||||
for (j = 0; j < y; j++)
|
for (j = 0; j < y; j++)
|
||||||
for (k = 0; k < z; k++){
|
for (k = 0; k < z; k++){
|
||||||
|
|
||||||
vx = (2 * i / x - 1) * x / max + ad;
|
vx = (2 * i / x - 1) * x / max + (1 / max);
|
||||||
vy = (2 * j / y - 1) * y / max + ad;
|
vy = (2 * j / y - 1) * y / max + (1 / max);
|
||||||
vz = (2 * k / z - 1) * z / max + ad;
|
vz = (2 * k / z - 1) * z / max + (1 / max);
|
||||||
|
|
||||||
// X - X axis Central Star
|
// X - X axis - central star (basis)
|
||||||
|
graphics_write_vertex(vx + arrow_basis_width, vy, vz);
|
||||||
|
graphics_write_vertex(vx - arrow_basis_width, vy, vz);
|
||||||
|
graphics_write_color(0.3f, 0.3f, 0.3f);
|
||||||
|
graphics_write_color(0.3f, 0.3f, 0.3f);
|
||||||
|
|
||||||
*(vertex_origin + vertex_index + 0) = vx + a_third;
|
// Y - Y axis - central star (basis)
|
||||||
*(vertex_origin + vertex_index + 1) = vy;
|
graphics_write_vertex(vx, vy + arrow_basis_width, vz);
|
||||||
*(vertex_origin + vertex_index + 2) = vz;
|
graphics_write_vertex(vx, vy - arrow_basis_width, vz);
|
||||||
|
graphics_write_color(0.3f, 0.3f, 0.3f);
|
||||||
|
graphics_write_color(0.3f, 0.3f, 0.3f);
|
||||||
|
|
||||||
vertex_index += 3;
|
// Z - Z axis - central star (basis)
|
||||||
|
graphics_write_vertex(vx, vy, vz + arrow_basis_width);
|
||||||
|
graphics_write_vertex(vx, vy, vz - arrow_basis_width);
|
||||||
|
graphics_write_color(0.3f, 0.3f, 0.3f);
|
||||||
|
graphics_write_color(0.3f, 0.3f, 0.3f);
|
||||||
|
|
||||||
*(vertex_origin + vertex_index + 0) = vx - a_third;
|
// X - X (EAST - WEST) axis - arrows tips
|
||||||
*(vertex_origin + vertex_index + 1) = vy;
|
graphics_write_vertex (vx + (1 / max) - arrow_tip_padding, vy, vz);
|
||||||
*(vertex_origin + vertex_index + 2) = vz;
|
graphics_write_vertex (vx - (1 / max) + arrow_tip_padding, vy, vz);
|
||||||
|
graphics_write_color(1.0f, 0.0f, 0.0f);
|
||||||
vertex_index += 3;
|
graphics_write_color(0.0f, 1.0f, 1.0f);
|
||||||
|
|
||||||
*(colors_origin + colors_index + 0) = 0.3f;
|
|
||||||
*(colors_origin + colors_index + 1) = 0.3f;
|
|
||||||
*(colors_origin + colors_index + 2) = 0.3f;
|
|
||||||
|
|
||||||
colors_index += 3;
|
|
||||||
|
|
||||||
*(colors_origin + colors_index + 0) = 0.3f;
|
|
||||||
*(colors_origin + colors_index + 1) = 0.3f;
|
|
||||||
*(colors_origin + colors_index + 2) = 0.3f;
|
|
||||||
|
|
||||||
colors_index += 3;
|
|
||||||
|
|
||||||
|
|
||||||
// Y - Y axis Central Star
|
|
||||||
|
|
||||||
*(vertex_origin + vertex_index + 0) = vx;
|
|
||||||
*(vertex_origin + vertex_index + 1) = vy + a_third;
|
|
||||||
*(vertex_origin + vertex_index + 2) = vz;
|
|
||||||
|
|
||||||
vertex_index += 3;
|
|
||||||
|
|
||||||
*(vertex_origin + vertex_index + 0) = vx;
|
|
||||||
*(vertex_origin + vertex_index + 1) = vy - a_third;
|
|
||||||
*(vertex_origin + vertex_index + 2) = vz;
|
|
||||||
|
|
||||||
vertex_index += 3;
|
|
||||||
|
|
||||||
*(colors_origin + colors_index + 0) = 0.3f;
|
|
||||||
*(colors_origin + colors_index + 1) = 0.3f;
|
|
||||||
*(colors_origin + colors_index + 2) = 0.3f;
|
|
||||||
|
|
||||||
colors_index += 3;
|
|
||||||
|
|
||||||
*(colors_origin + colors_index + 0) = 0.3f;
|
|
||||||
*(colors_origin + colors_index + 1) = 0.3f;
|
|
||||||
*(colors_origin + colors_index + 2) = 0.3f;
|
|
||||||
|
|
||||||
colors_index += 3;
|
|
||||||
|
|
||||||
|
|
||||||
// Z - Z axis Central Star
|
|
||||||
|
|
||||||
*(vertex_origin + vertex_index + 0) = vx;
|
|
||||||
*(vertex_origin + vertex_index + 1) = vy;
|
|
||||||
*(vertex_origin + vertex_index + 2) = vz + a_third;
|
|
||||||
|
|
||||||
vertex_index += 3;
|
|
||||||
|
|
||||||
*(vertex_origin + vertex_index + 0) = vx;
|
|
||||||
*(vertex_origin + vertex_index + 1) = vy;
|
|
||||||
*(vertex_origin + vertex_index + 2) = vz - a_third;
|
|
||||||
|
|
||||||
vertex_index += 3;
|
|
||||||
|
|
||||||
*(colors_origin + colors_index + 0) = 0.3f;
|
|
||||||
*(colors_origin + colors_index + 1) = 0.3f;
|
|
||||||
*(colors_origin + colors_index + 2) = 0.3f;
|
|
||||||
|
|
||||||
colors_index += 3;
|
|
||||||
|
|
||||||
*(colors_origin + colors_index + 0) = 0.3f;
|
|
||||||
*(colors_origin + colors_index + 1) = 0.3f;
|
|
||||||
*(colors_origin + colors_index + 2) = 0.3f;
|
|
||||||
|
|
||||||
colors_index += 3;
|
|
||||||
|
|
||||||
//--------------------------------------------------------------
|
|
||||||
|
|
||||||
// X - X axis arrows tips near the faces centers EAST - WEST
|
|
||||||
|
|
||||||
*(vertex_origin + vertex_index + 0) = vx + ad - eps;
|
|
||||||
*(vertex_origin + vertex_index + 1) = vy;
|
|
||||||
*(vertex_origin + vertex_index + 2) = vz;
|
|
||||||
|
|
||||||
vertex_index += 3;
|
|
||||||
|
|
||||||
*(vertex_origin + vertex_index + 0) = vx - ad + eps;
|
|
||||||
*(vertex_origin + vertex_index + 1) = vy;
|
|
||||||
*(vertex_origin + vertex_index + 2) = vz;
|
|
||||||
|
|
||||||
vertex_index += 3;
|
|
||||||
|
|
||||||
*(colors_origin + colors_index + 0) = 1;
|
|
||||||
*(colors_origin + colors_index + 1) = 0;
|
|
||||||
*(colors_origin + colors_index + 2) = 0;
|
|
||||||
|
|
||||||
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;
|
|
||||||
|
|
||||||
|
// Y - Y (ZENITH - NADIR) axis - arrows tips
|
||||||
|
graphics_write_vertex (vx, vy + (1 / max) - arrow_tip_padding, vz);
|
||||||
|
graphics_write_vertex (vx, vy - (1 / max) + arrow_tip_padding, vz);
|
||||||
|
graphics_write_color(0.0f, 1.0f, 0.0f);
|
||||||
|
graphics_write_color(1.0f, 0.0f, 1.0f);
|
||||||
|
|
||||||
// Z - Z axis arrows tips near the faces centers NORTH - SOUTH
|
// Z - Z axis arrows tips near the faces centers NORTH - SOUTH
|
||||||
|
graphics_write_vertex (vx, vy, vz + (1 / max) - arrow_tip_padding);
|
||||||
*(vertex_origin + vertex_index + 0) = vx;
|
graphics_write_vertex (vx, vy, vz - (1 / max) + arrow_tip_padding);
|
||||||
*(vertex_origin + vertex_index + 1) = vy;
|
graphics_write_color(0.0f, 0.0f, 1.0f);
|
||||||
*(vertex_origin + vertex_index + 2) = vz + ad - eps;
|
graphics_write_color(1.0f, 1.0f, 0.0f);
|
||||||
|
|
||||||
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;
|
|
||||||
|
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
return 1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void check_arrows_data(int x, int y, int z,
|
/*
|
||||||
GLuint *arrows, int arrows_nb, int central_stars_nb)
|
* Writes lines for arrow oriented to the east into lines buffer
|
||||||
|
*
|
||||||
|
* @param s,
|
||||||
|
* weight,
|
||||||
|
* site
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
void write_arrow_lines_east (long s, int weight, int site)
|
||||||
{
|
{
|
||||||
// TODO assert : l'emplacement de chaque flèche est contraint
|
graphics_write_line (s + 2, s + 6 + site % 2);
|
||||||
// par model_space_size_x, y, z et le nombre de sites possibles.
|
graphics_write_line (s + 3, s + 6 + site % 2);
|
||||||
|
graphics_write_line (s + 4, s + 6 + site % 2);
|
||||||
// ! WARNING ! Pour l'instant égal au nombre de flèches !
|
graphics_write_line (s + 5, s + 6 + site % 2);
|
||||||
// Les "central stars" sont donc systématiquement redessinées
|
|
||||||
// s'il y a plusieurs flèches d'orientation différente dans le même cube.
|
|
||||||
|
|
||||||
printf("ARROWS x,y,z = (%d,%d,%d) arrows_nb = %d central_stars_nb = %d\n",\
|
|
||||||
x, y, z, arrows_nb, central_stars_nb);
|
|
||||||
|
|
||||||
if (arrows_nb > 0) printf("\n[ n] load site x y z ---- < arrows array >\
|
|
||||||
------------------------------------------------------------\n");
|
|
||||||
for (int i = 0; i < 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));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
long compute_vertex_nb(int vertex_nb, int x, int y, int z)
|
/*
|
||||||
|
* Writes lines for arrow oriented to the west into lines buffer
|
||||||
|
*
|
||||||
|
* @param s,
|
||||||
|
* weight,
|
||||||
|
* site
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
void write_arrow_lines_west (long s, int weight, int site)
|
||||||
{
|
{
|
||||||
// int vertex_nb = (x + 1) * (y + 1) * (z + 1); <> cf graphics/space.c
|
graphics_write_line (s + 2, s + 6 + site % 2);
|
||||||
int unit_cubes_nb = x * y * z;
|
graphics_write_line (s + 3, s + 6 + site % 2);
|
||||||
vertex_nb += 12 * unit_cubes_nb; // 6 for the central star
|
graphics_write_line (s + 4, s + 6 + site % 2);
|
||||||
// 6 for the unit cubes faces centers
|
graphics_write_line (s + 5, s + 6 + site % 2);
|
||||||
|
|
||||||
return vertex_nb;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
long compute_lines_nb(int lines_nb, int arrows_nb, int central_stars_nb)
|
/*
|
||||||
|
* Writes lines for arrow oriented to the zenith into lines buffer
|
||||||
|
*
|
||||||
|
* @param s,
|
||||||
|
* weight,
|
||||||
|
* site
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
void write_arrow_lines_zenith (long s, int weight, int site)
|
||||||
{
|
{
|
||||||
// TODO central_stars_nb sera à calculer pour éviter de redessiner les central_stars
|
graphics_write_line (s + 0, s + 8 + site % 2);
|
||||||
central_stars_nb = arrows_nb; // ! WARNING ! Pour l'instant égal au nombre de flèches !
|
graphics_write_line (s + 1, s + 8 + site % 2);
|
||||||
// Les "central stars" sont donc systématiquement redessinées
|
graphics_write_line (s + 4, s + 8 + site % 2);
|
||||||
// s'il y a plusieurs flèches d'orientation différente dans le même cube.
|
graphics_write_line (s + 5, s + 8 + site % 2);
|
||||||
|
|
||||||
lines_nb = 3 * 2 * central_stars_nb; // test central stars
|
|
||||||
lines_nb += 4 * 2 * arrows_nb; // flèches
|
|
||||||
|
|
||||||
return lines_nb;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#define VERBOSE 0
|
/*
|
||||||
static bool rewrite_arrow (GLuint *arrows, long arrows_nb, long address, long weight,
|
* Writes lines for arrow oriented to the nadir into lines buffer
|
||||||
long site, long x, long y, long z)
|
*
|
||||||
|
* @param s,
|
||||||
|
* weight,
|
||||||
|
* site
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
void write_arrow_lines_nadir (long s, int weight, int site)
|
||||||
{
|
{
|
||||||
if (VERBOSE) printf("write the arrow weight to %ld at (%ld, %ld, %ld, %ld)\n",\
|
graphics_write_line (s + 0, s + 8 + site % 2);
|
||||||
weight, site, x, y, z);
|
graphics_write_line (s + 1, s + 8 + site % 2);
|
||||||
|
graphics_write_line (s + 4, s + 8 + site % 2);
|
||||||
*(arrows + address + 0) = weight;
|
graphics_write_line (s + 5, s + 8 + site % 2);
|
||||||
|
|
||||||
return 1; /* replaces the load of the existing arrow by the load 'weight' */
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool create_arrow (GLuint *arrows, long arrows_nb, long weight, long site, long x, long y, long z)
|
/*
|
||||||
|
* Writes lines for arrow oriented to the south into lines buffer
|
||||||
|
*
|
||||||
|
* @param s,
|
||||||
|
* weight,
|
||||||
|
* site
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
void write_arrow_lines_south (long s, int weight, int site)
|
||||||
{
|
{
|
||||||
if (VERBOSE) printf("create a new arrow with weight = %ld at (%ld, %ld, %ld, %ld)\n",\
|
graphics_write_line (s + 0, s + 10 + site % 2);
|
||||||
weight, site, x, y, z);
|
graphics_write_line (s + 1, s + 10 + site % 2);
|
||||||
|
graphics_write_line (s + 2, s + 10 + site % 2);
|
||||||
arrows_nb ++;
|
graphics_write_line (s + 3, s + 10 + site % 2);
|
||||||
inc_buffer_lines_size ((3 + 4) * 2);
|
|
||||||
set_buffer_lines_origin (g_realloc (get_buffer_lines_origin(), get_buffer_lines_size() * 2 * sizeof(GLuint) * 2));
|
|
||||||
|
|
||||||
*(arrows + arrows_nb + 0) = weight;
|
|
||||||
*(arrows + arrows_nb + 1) = site;
|
|
||||||
*(arrows + arrows_nb + 2) = x;
|
|
||||||
*(arrows + arrows_nb + 3) = y;
|
|
||||||
*(arrows + arrows_nb + 4) = z;
|
|
||||||
|
|
||||||
return 1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool erase_arrow (GLuint *arrows, long arrows_nb, long address,
|
/*
|
||||||
long site, long x, long y, long z)
|
* Writes lines for arrow oriented to the north into lines buffer
|
||||||
|
*
|
||||||
|
* @param s,
|
||||||
|
* weight,
|
||||||
|
* site
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
void write_arrow_lines_north (long s, int weight, int site)
|
||||||
{
|
{
|
||||||
if (VERBOSE) printf("erase arrow at address %ld with values (%ld, %ld, %ld, %ld)",\
|
graphics_write_line (s + 0, s + 10 + site % 2);
|
||||||
address / 5, site, x, y, z);
|
graphics_write_line (s + 1, s + 10 + site % 2);
|
||||||
if (VERBOSE) printf(" last arrow is %d, %d, %d, %d, %d\n",
|
graphics_write_line (s + 2, s + 10 + site % 2);
|
||||||
*(arrows + (arrows_nb - 1) * 5 + 0),
|
graphics_write_line (s + 3, s + 10 + site % 2);
|
||||||
*(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 --;
|
|
||||||
dec_buffer_lines_size ((3 + 4) * 2);
|
|
||||||
set_buffer_lines_origin (g_realloc (get_buffer_lines_origin(), get_buffer_lines_size() * 2 * sizeof(GLuint) * 2));
|
|
||||||
|
|
||||||
return 1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static long check_for_arrow (GLuint *arrows, long arrows_nb, long site, long x, long y, long z)
|
/*
|
||||||
|
* Writes lines for arrow basis into lines buffer
|
||||||
|
*
|
||||||
|
* @param n,
|
||||||
|
* weight,
|
||||||
|
* site
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
void arrows_write_basis(long n)
|
||||||
{
|
{
|
||||||
if (arrows_nb == 0) return -1;
|
graphics_write_line (n + 0, n + 1);
|
||||||
|
graphics_write_line (n + 2, n + 3);
|
||||||
long address = -1, f_weight = -1, f_site = -1, f_x = -1, f_y = -1, f_z = -1;
|
graphics_write_line (n + 4, n + 5);
|
||||||
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 (VERBOSE) 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 (VERBOSE && f_weight > 1) printf(" weight = %ld", f_weight);
|
|
||||||
if (VERBOSE) 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] 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 arrows_nb, long weight, long site, long x, long y, long z)
|
|
||||||
{
|
|
||||||
long address = (check_for_arrow (arrows, arrows_nb, site, x, y, z));
|
|
||||||
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, 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;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void old_draw_line (int a, int b)
|
|
||||||
{
|
|
||||||
// *(lines_origin + lines_index) = a; lines_index ++;
|
|
||||||
|
|
||||||
// *(get_buffer_lines_origin() + get_buffer_lines_size()) = a; inc_buffer_lines_size(1);
|
|
||||||
// *(get_buffer_lines_origin() + get_buffer_lines_size()) = b; inc_buffer_lines_size(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void draw_an_arrow_East_or_West (long s, int weight, int site)
|
|
||||||
{
|
|
||||||
old_draw_line (s + 2, s + 6 + site % 2);
|
|
||||||
old_draw_line (s + 3, s + 6 + site % 2);
|
|
||||||
|
|
||||||
old_draw_line (s + 4, s + 6 + site % 2);
|
|
||||||
old_draw_line (s + 5, s + 6 + site % 2);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void draw_an_arrow_Zenith_or_Nadir (long s, int weight, int site)
|
|
||||||
{
|
|
||||||
old_draw_line (s + 0, s + 8 + site % 2);
|
|
||||||
old_draw_line (s + 1, s + 8 + site % 2);
|
|
||||||
|
|
||||||
old_draw_line (s + 4, s + 8 + site % 2);
|
|
||||||
old_draw_line (s + 5, s + 8 + site % 2);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void draw_an_arrow_North_or_South (long s, int weight, int site)
|
|
||||||
{
|
|
||||||
old_draw_line (s + 0, s + 10 + site % 2);
|
|
||||||
old_draw_line (s + 1, s + 10 + site % 2);
|
|
||||||
|
|
||||||
old_draw_line (s + 2, s + 10 + site % 2);
|
|
||||||
old_draw_line (s + 3, s + 10 + site % 2);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void draw_a_central_star(long n)
|
|
||||||
{
|
|
||||||
old_draw_line (n + 0, n + 1);
|
|
||||||
old_draw_line (n + 2, n + 3);
|
|
||||||
old_draw_line (n + 4, n + 5);
|
|
||||||
}
|
|
||||||
|
|
||||||
// I'm standing on Earth (any planet or star or spinning spheroid, in fact)
|
|
||||||
// and looking towards its North pole
|
|
||||||
|
|
||||||
#define EAST 0 // + x rouge
|
|
||||||
#define WEST 1 // - x cyan
|
|
||||||
#define ZENITH 2 // + y vert
|
|
||||||
#define NADIR 3 // - y magenta
|
|
||||||
#define SOUTH 4 // + z jaune
|
|
||||||
#define NORTH 5 // - z bleu
|
|
||||||
|
|
||||||
bool alloc_arrows_lines (long space_size_x, long space_size_y, long space_size_z,
|
|
||||||
GLuint *arrows, int arrows_nb)
|
|
||||||
{
|
|
||||||
long step_z = 1,
|
|
||||||
step_y = space_size_z + 1,
|
|
||||||
step_x = (space_size_z + 1) * (space_size_y + 1);
|
|
||||||
|
|
||||||
long s = step_z * space_size_z + step_y * space_size_y
|
|
||||||
+ step_x * space_size_x;
|
|
||||||
|
|
||||||
long site = 0, x = 0, y = 0, z = 0;
|
|
||||||
|
|
||||||
for (int i = 0; i < arrows_nb; i++)
|
|
||||||
{
|
|
||||||
site = *(arrows + i * 5 + 1);
|
|
||||||
x = *(arrows + i * 5 + 2); y = *(arrows + i * 5 + 3); z = *(arrows + i * 5 + 4);
|
|
||||||
|
|
||||||
draw_a_central_star (s + 1 + 12 * (step_x * x + step_y * y + step_z * z));
|
|
||||||
|
|
||||||
if (site >-1 && site < 2) draw_an_arrow_East_or_West (s + 1 + 12 * (step_x * x + step_y * y + step_z * z), 1, site);
|
|
||||||
if (site > 3 && site < 6) draw_an_arrow_North_or_South (s + 1 + 12 * (step_x * x + step_y * y + step_z * z), 1, site);
|
|
||||||
if (site > 1 && site < 4) draw_an_arrow_Zenith_or_Nadir (s + 1 + 12 * (step_x * x + step_y * y + step_z * z), 1, site);
|
|
||||||
}
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
// X - X = EAST - WEST = rouge - cyan
|
|
||||||
// Y - Y = ZENITH - NADIR = vert - magenta
|
|
||||||
// Z - Z = SOUTH - NORTH = jaune - bleu
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -1,574 +0,0 @@
|
||||||
/*
|
|
||||||
* Gem-graph OpenGL experiments
|
|
||||||
*
|
|
||||||
* Desc: OpenGL utils header
|
|
||||||
*
|
|
||||||
* Copyright (C) 2023 Jean Sirmai <jean@a-lec.org>
|
|
||||||
*
|
|
||||||
* This file is part of Gem-graph.
|
|
||||||
*
|
|
||||||
* This program is free software: you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU Affero General Public License as published by
|
|
||||||
* the Free Software Foundation, either version 3 of the License, or
|
|
||||||
* (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU Affero General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU Affero General Public License
|
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
*/
|
|
||||||
|
|
||||||
//#pragma once
|
|
||||||
#include <unistd.h>
|
|
||||||
#include <stdbool.h>
|
|
||||||
#include <assert.h>
|
|
||||||
#include <sys/types.h>
|
|
||||||
#include <sys/stat.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <fcntl.h>
|
|
||||||
#include <epoxy/gl.h>
|
|
||||||
#include <GL/glu.h>
|
|
||||||
#include <GL/glext.h>
|
|
||||||
#include <glib-2.0/glib.h>
|
|
||||||
#include <math.h>
|
|
||||||
#include <errno.h>
|
|
||||||
|
|
||||||
#include "../../include/ui.h"
|
|
||||||
#include "../../include/graphics.h"
|
|
||||||
#include "../../include/buffers.h"
|
|
||||||
|
|
||||||
static long vertex_index = 0;
|
|
||||||
static long colors_index = 0;
|
|
||||||
static long primitive_lines_index = 0;
|
|
||||||
|
|
||||||
long get_buffer_lines_size() {return primitive_lines_index / 2;}
|
|
||||||
void inc_buffer_lines_size(long inc) {primitive_lines_index += inc * 2;}
|
|
||||||
void dec_buffer_lines_size(long dec) {primitive_lines_index -= dec * 2;}
|
|
||||||
|
|
||||||
static long plans_index = 0;
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
static bool grids_intersections (long x, long y, long z,
|
|
||||||
GLfloat *vertex_origin, GLfloat *colors_origin)
|
|
||||||
{
|
|
||||||
|
|
||||||
float i, j, k, vx, vy, vz, max = fmax(x, y);
|
|
||||||
max = fmax(max, z);
|
|
||||||
|
|
||||||
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;
|
|
||||||
vy = (2 * j / y - 1) * y / max;
|
|
||||||
vz = (2 * k / z - 1) * z / max;
|
|
||||||
|
|
||||||
*(vertex_origin + vertex_index + 0) = vx;
|
|
||||||
*(vertex_origin + vertex_index + 1) = vy;
|
|
||||||
*(vertex_origin + vertex_index + 2) = vz;
|
|
||||||
|
|
||||||
vertex_index += 3;
|
|
||||||
|
|
||||||
*(colors_origin + colors_index + 0) = 0.64f;// 3 * vx / 2;
|
|
||||||
*(colors_origin + colors_index + 1) = 0.64f;// 3 * vy / 2;
|
|
||||||
*(colors_origin + colors_index + 2) = 0.64f;// 3 * vz / 2;
|
|
||||||
|
|
||||||
colors_index += 3;
|
|
||||||
};
|
|
||||||
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static bool arrows_anchors (long x, long y, long z,
|
|
||||||
GLfloat *vertex_origin, GLfloat *colors_origin)
|
|
||||||
{
|
|
||||||
/*
|
|
||||||
X - X = EAST - WEST = rouge - cyan
|
|
||||||
Y - Y = ZENITH - NADIR = vert - magenta
|
|
||||||
Z - Z = NORTH - SOUTH = bleu - jaune
|
|
||||||
*/
|
|
||||||
|
|
||||||
float max = fmax(x, y);
|
|
||||||
max = fmax(max, z);
|
|
||||||
|
|
||||||
float i, j, k, vx, vy, vz,
|
|
||||||
ad = 1 / max,
|
|
||||||
a_third = 0.3f * ad, // a_third donne la dimension de l'étoile centrale
|
|
||||||
eps = 0.1 * ad; // eps(ilon) servira à décaler légèrement les pointes des flèches
|
|
||||||
// pour qu'elles n'aillent pas jusqu'aux faces des cubes
|
|
||||||
|
|
||||||
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;
|
|
||||||
|
|
||||||
// X - X axis Central Star
|
|
||||||
|
|
||||||
*(vertex_origin + vertex_index + 0) = vx + a_third;
|
|
||||||
*(vertex_origin + vertex_index + 1) = vy;
|
|
||||||
*(vertex_origin + vertex_index + 2) = vz;
|
|
||||||
|
|
||||||
vertex_index += 3;
|
|
||||||
|
|
||||||
*(vertex_origin + vertex_index + 0) = vx - a_third;
|
|
||||||
*(vertex_origin + vertex_index + 1) = vy;
|
|
||||||
*(vertex_origin + vertex_index + 2) = vz;
|
|
||||||
|
|
||||||
vertex_index += 3;
|
|
||||||
|
|
||||||
*(colors_origin + colors_index + 0) = 0.3f;
|
|
||||||
*(colors_origin + colors_index + 1) = 0.3f;
|
|
||||||
*(colors_origin + colors_index + 2) = 0.3f;
|
|
||||||
|
|
||||||
colors_index += 3;
|
|
||||||
|
|
||||||
*(colors_origin + colors_index + 0) = 0.3f;
|
|
||||||
*(colors_origin + colors_index + 1) = 0.3f;
|
|
||||||
*(colors_origin + colors_index + 2) = 0.3f;
|
|
||||||
|
|
||||||
colors_index += 3;
|
|
||||||
|
|
||||||
|
|
||||||
// Y - Y axis Central Star
|
|
||||||
|
|
||||||
*(vertex_origin + vertex_index + 0) = vx;
|
|
||||||
*(vertex_origin + vertex_index + 1) = vy + a_third;
|
|
||||||
*(vertex_origin + vertex_index + 2) = vz;
|
|
||||||
|
|
||||||
vertex_index += 3;
|
|
||||||
|
|
||||||
*(vertex_origin + vertex_index + 0) = vx;
|
|
||||||
*(vertex_origin + vertex_index + 1) = vy - a_third;
|
|
||||||
*(vertex_origin + vertex_index + 2) = vz;
|
|
||||||
|
|
||||||
vertex_index += 3;
|
|
||||||
|
|
||||||
*(colors_origin + colors_index + 0) = 0.3f;
|
|
||||||
*(colors_origin + colors_index + 1) = 0.3f;
|
|
||||||
*(colors_origin + colors_index + 2) = 0.3f;
|
|
||||||
|
|
||||||
colors_index += 3;
|
|
||||||
|
|
||||||
*(colors_origin + colors_index + 0) = 0.3f;
|
|
||||||
*(colors_origin + colors_index + 1) = 0.3f;
|
|
||||||
*(colors_origin + colors_index + 2) = 0.3f;
|
|
||||||
|
|
||||||
colors_index += 3;
|
|
||||||
|
|
||||||
|
|
||||||
// Z - Z axis Central Star
|
|
||||||
|
|
||||||
*(vertex_origin + vertex_index + 0) = vx;
|
|
||||||
*(vertex_origin + vertex_index + 1) = vy;
|
|
||||||
*(vertex_origin + vertex_index + 2) = vz + a_third;
|
|
||||||
|
|
||||||
vertex_index += 3;
|
|
||||||
|
|
||||||
*(vertex_origin + vertex_index + 0) = vx;
|
|
||||||
*(vertex_origin + vertex_index + 1) = vy;
|
|
||||||
*(vertex_origin + vertex_index + 2) = vz - a_third;
|
|
||||||
|
|
||||||
vertex_index += 3;
|
|
||||||
|
|
||||||
*(colors_origin + colors_index + 0) = 0.3f;
|
|
||||||
*(colors_origin + colors_index + 1) = 0.3f;
|
|
||||||
*(colors_origin + colors_index + 2) = 0.3f;
|
|
||||||
|
|
||||||
colors_index += 3;
|
|
||||||
|
|
||||||
*(colors_origin + colors_index + 0) = 0.3f;
|
|
||||||
*(colors_origin + colors_index + 1) = 0.3f;
|
|
||||||
*(colors_origin + colors_index + 2) = 0.3f;
|
|
||||||
|
|
||||||
colors_index += 3;
|
|
||||||
|
|
||||||
//--------------------------------------------------------------
|
|
||||||
|
|
||||||
// X - X axis arrows tips near the faces centers EAST - WEST
|
|
||||||
|
|
||||||
*(vertex_origin + vertex_index + 0) = vx + ad - eps;
|
|
||||||
*(vertex_origin + vertex_index + 1) = vy;
|
|
||||||
*(vertex_origin + vertex_index + 2) = vz;
|
|
||||||
|
|
||||||
vertex_index += 3;
|
|
||||||
|
|
||||||
*(vertex_origin + vertex_index + 0) = vx - ad + eps;
|
|
||||||
*(vertex_origin + vertex_index + 1) = vy;
|
|
||||||
*(vertex_origin + vertex_index + 2) = vz;
|
|
||||||
|
|
||||||
vertex_index += 3;
|
|
||||||
|
|
||||||
*(colors_origin + colors_index + 0) = 1;
|
|
||||||
*(colors_origin + colors_index + 1) = 0;
|
|
||||||
*(colors_origin + colors_index + 2) = 0;
|
|
||||||
|
|
||||||
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;
|
|
||||||
|
|
||||||
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static void primitive_draw_line (GLuint *lines_origin, int a, int b)
|
|
||||||
{
|
|
||||||
*(lines_origin + primitive_lines_index) = a; primitive_lines_index ++;
|
|
||||||
*(lines_origin + primitive_lines_index) = b; primitive_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 (0,21); draw_line (21,42);
|
|
||||||
// ce qui suit ne vaut que dans un espace 3 x 3 x 3 (le reste est à corriger - ou à oublier ?)
|
|
||||||
draw_line (21,22); draw_line (21,25);
|
|
||||||
draw_line (25,26); draw_line (22,26);
|
|
||||||
draw_line (37,41); draw_line (41,42);
|
|
||||||
draw_line (38,42); draw_line (37,38);
|
|
||||||
draw_line (25,41); draw_line (21,37);
|
|
||||||
draw_line (26,42); draw_line (22,38);
|
|
||||||
|
|
||||||
/* draw_line (step_z * w + step_y * v + step_x * u, step_z * (w + 0) + step_y * (v + 0) + step_x * (u + 1)); */
|
|
||||||
/* draw_line (step_z * w + step_y * v + step_x * u, step_z * (w + 0) + step_y * (v + 1) + step_x * (u + 0)); */
|
|
||||||
/* draw_line (step_z * w + step_y * v + step_x * u, step_z * (w + 1) + step_y * (v + 1) + step_x * (u + 0)); */
|
|
||||||
/* draw_line (step_z * z + step_y * y + step_x * x, step_z * (w + 1) + step_y * (v + 1) + step_x * (u + 0)); */
|
|
||||||
/* draw_line (step_z * z + step_y * y + step_x * x, step_z * (w + 1) + step_y * (v + 0) + step_x * (u + 1)); */
|
|
||||||
/* draw_line (step_z * z + step_y * y + step_x * x, step_z * (w + 0) + step_y * (v + 1) + step_x * (u + 1)); */
|
|
||||||
/* draw_line (step_z * w + step_y * v + step_x * x, step_z * (w + 1) + step_y * (v + 0) + step_x * (u + 1)); */
|
|
||||||
/* draw_line (step_z * w + step_y * v + step_x * x, step_z * (w + 0) + step_y * (v + 1) + step_x * (u + 1)); */
|
|
||||||
/* draw_line (step_z * w + step_y * y + step_x * u, step_z * (w + 0) + step_y * (v + 1) + step_x * (u + 1)); */
|
|
||||||
/* draw_line (step_z * z + step_y * v + step_x * u, step_z * (w + 1) + step_y * (v + 1) + step_x * (u + 0)); */
|
|
||||||
/* draw_line (step_z * z + step_y * v + step_x * u, step_z * (w + 1) + step_y * (v + 0) + step_x * (u + 1)); */
|
|
||||||
/* draw_line (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 (step_z * w + step_y * v + step_x * u, step_z * (w + 1) + step_y * (v + 1) + step_x * (u + 1));
|
|
||||||
draw_line (step_z * w + step_y * v + step_x * x, step_z * (w + 1) + step_y * (v + 1) + step_x * (u + 0));
|
|
||||||
draw_line (step_z * z + step_y * v + step_x * u, step_z * (w + 0) + step_y * (v + 1) + step_x * (u + 1));
|
|
||||||
draw_line (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,
|
|
||||||
long step_x, long step_y, long step_z,
|
|
||||||
GLuint *lines_origin)
|
|
||||||
{
|
|
||||||
draw_line (step_z * 0 + step_y * 0 + step_x * 0, step_z * 0 + step_y * 0 + step_x * x);
|
|
||||||
draw_line (step_z * 0 + step_y * 0 + step_x * 0, step_z * 0 + step_y * y + step_x * 0);
|
|
||||||
draw_line (step_z * 0 + step_y * 0 + step_x * 0, step_z * z + step_y * 0 + step_x * 0);
|
|
||||||
draw_line (step_z * z + step_y * y + step_x * x, step_z * 0 + step_y * y + step_x * x);
|
|
||||||
draw_line (step_z * z + step_y * y + step_x * x, step_z * z + step_y * y + step_x * 0);
|
|
||||||
draw_line (step_z * z + step_y * y + step_x * x, step_z * z + step_y * 0 + step_x * x);
|
|
||||||
draw_line (step_z * 0 + step_y * 0 + step_x * x, step_z * 0 + step_y * y + step_x * x);
|
|
||||||
draw_line (step_z * 0 + step_y * 0 + step_x * x, step_z * z + step_y * 0 + step_x * x);
|
|
||||||
draw_line (step_z * z + step_y * 0 + step_x * 0, step_z * z + step_y * y + step_x * 0);
|
|
||||||
draw_line (step_z * 0 + step_y * y + step_x * 0, step_z * 0 + step_y * y + step_x * x);
|
|
||||||
draw_line (step_z * 0 + step_y * y + step_x * 0, step_z * z + step_y * y + step_x * 0);
|
|
||||||
draw_line (step_z * z + step_y * 0 + step_x * 0, step_z * z + step_y * 0 + step_x * x);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static bool draw_grids_3D (long x, long y, long z,
|
|
||||||
long step_x, long step_y, long step_z,
|
|
||||||
GLuint *lines_origin,
|
|
||||||
int pref_show_grid)
|
|
||||||
{
|
|
||||||
x ++; y ++; z ++;
|
|
||||||
float calcul = 0;
|
|
||||||
|
|
||||||
if (pref_show_grid % 2 == 0)
|
|
||||||
for (int u = 0; u < y; u ++){
|
|
||||||
for (int w = 0; w < x; w ++){
|
|
||||||
calcul = step_x * w + step_y * u;
|
|
||||||
draw_line (calcul, calcul + step_y - step_z);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (pref_show_grid % 3 == 0)
|
|
||||||
for (int u = 0; u < z; u ++){
|
|
||||||
for (int w = 0; w < x; w ++){
|
|
||||||
calcul = step_x * w + step_z * u;
|
|
||||||
draw_line (calcul, calcul + step_x - step_y);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (pref_show_grid % 5 == 0)
|
|
||||||
for (int u = 0; u < z; u ++){
|
|
||||||
for (int w = 0; w < y; w ++){
|
|
||||||
calcul = step_y * w + step_z * u;
|
|
||||||
draw_line (calcul, calcul + step_x * (x - 1));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
static void diagonal_test(long x, long y, long z,
|
|
||||||
long step_x, long step_y, long step_z,
|
|
||||||
GLuint *lines_origin)
|
|
||||||
{
|
|
||||||
draw_line (0, step_z * z + step_y * y + step_x * x);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
static void draw_an_arrow_East_or_West (GLuint *lines_origin, long s, int weight, int site)
|
|
||||||
{
|
|
||||||
draw_line (s + 2, s + 6 + site % 2);
|
|
||||||
draw_line (s + 3, s + 6 + site % 2);
|
|
||||||
|
|
||||||
draw_line (s + 4, s + 6 + site % 2);
|
|
||||||
draw_line (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 (s + 0, s + 8 + site % 2);
|
|
||||||
draw_line (s + 1, s + 8 + site % 2);
|
|
||||||
|
|
||||||
draw_line (s + 4, s + 8 + site % 2);
|
|
||||||
draw_line (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 (s + 0, s + 10 + site % 2);
|
|
||||||
draw_line (s + 1, s + 10 + site % 2);
|
|
||||||
|
|
||||||
draw_line (s + 2, s + 10 + site % 2);
|
|
||||||
draw_line (s + 3, s + 10 + site % 2);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static void draw_a_central_star(GLuint *lines_origin, long n)
|
|
||||||
{
|
|
||||||
draw_line (n + 0, n + 1);
|
|
||||||
draw_line (n + 2, n + 3);
|
|
||||||
draw_line (n + 4, n + 5);
|
|
||||||
}
|
|
||||||
|
|
||||||
// I'm standing on Earth (any planet or star or spinning spheroid, in fact)
|
|
||||||
// and looking towards its North pole
|
|
||||||
|
|
||||||
#define EAST 0 // + x rouge
|
|
||||||
#define WEST 1 // - x cyan
|
|
||||||
#define ZENITH 2 // + y vert
|
|
||||||
#define NADIR 3 // - y magenta
|
|
||||||
#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);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void draw_some_arrows (GLuint *lines_origin, long s, long stx, long sty,
|
|
||||||
GLuint *arrows, int arrows_nb)
|
|
||||||
{
|
|
||||||
long stz = 1;
|
|
||||||
long site = 0, x = 0, y = 0, z = 0;
|
|
||||||
|
|
||||||
for (int i = 0; i < arrows_nb; i++)
|
|
||||||
{
|
|
||||||
site = *(arrows + i * 5 + 1);
|
|
||||||
x = *(arrows + i * 5 + 2); y = *(arrows + i * 5 + 3); z = *(arrows + i * 5 + 4);
|
|
||||||
|
|
||||||
printf("[%d] site = %d x = %ld y = %ld z = %ld step x = %ld step y = %ld\n", site, i, x, y, z, stx, sty);
|
|
||||||
|
|
||||||
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);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// X - X = EAST - WEST = rouge - cyan
|
|
||||||
// Y - Y = ZENITH - NADIR = vert - magenta
|
|
||||||
// Z - Z = NORTH - SOUTH = bleu - jaune
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
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_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);
|
|
||||||
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");
|
|
||||||
if (model_arrows_nb > 0) printf("\n[ n] load site x y z ---- < arrows array >\
|
|
||||||
------------------------------------------------------------\n");
|
|
||||||
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));
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
bool compute_space_and_arrows(long model_size_x, long model_size_y, long model_size_z,
|
|
||||||
|
|
||||||
GLuint *arrows, int model_arrows_nb,
|
|
||||||
|
|
||||||
int pref_show_grid,
|
|
||||||
|
|
||||||
GLfloat *vertex_origin, GLfloat *colors_origin,
|
|
||||||
GLuint *lines_origin, GLuint *plans_origin)
|
|
||||||
|
|
||||||
{
|
|
||||||
show_user_choices(model_size_x, model_size_y, model_size_z,
|
|
||||||
arrows, model_arrows_nb,
|
|
||||||
pref_show_grid);
|
|
||||||
|
|
||||||
grids_intersections (model_size_x, model_size_y, model_size_z, vertex_origin, colors_origin);
|
|
||||||
arrows_anchors (model_size_x, model_size_y, model_size_z, vertex_origin, colors_origin);
|
|
||||||
|
|
||||||
long step_z = 1,
|
|
||||||
step_y = model_size_z + 1,
|
|
||||||
step_x = (model_size_z + 1) * (model_size_y + 1);
|
|
||||||
|
|
||||||
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);
|
|
||||||
|
|
||||||
long s = step_z * model_size_z + step_y * model_size_y + step_x * model_size_x;
|
|
||||||
|
|
||||||
draw_some_arrows_demo (lines_origin, s, model_size_x, model_size_y, model_size_z, arrows, model_arrows_nb);
|
|
||||||
draw_some_arrows (lines_origin, s, model_size_z * model_size_y, model_size_z, arrows, model_arrows_nb);
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
// X - X = EAST - WEST = rouge - cyan
|
|
||||||
// Y - Y = ZENITH - NADIR = vert - magenta
|
|
||||||
// Z - Z = NORTH - SOUTH = bleu - jaune
|
|
||||||
|
|
|
@ -23,28 +23,24 @@
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <assert.h>
|
#include "../../include/base.h"
|
||||||
#include <sys/types.h>
|
|
||||||
#include <sys/stat.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <fcntl.h>
|
|
||||||
#include <epoxy/gl.h>
|
|
||||||
#include <GL/glu.h>
|
|
||||||
#include <GL/glext.h>
|
|
||||||
#include <glib-2.0/glib.h>
|
|
||||||
#include <math.h>
|
|
||||||
#include <errno.h>
|
|
||||||
|
|
||||||
//#include "../../include/base.h"
|
|
||||||
#include "../../include/ui.h"
|
#include "../../include/ui.h"
|
||||||
#include "../../include/graphics.h"
|
#include "../../include/graphics.h"
|
||||||
#include "../../include/buffers.h"
|
#include "../../include/arrows.h"
|
||||||
|
#include "../../include/grid.h"
|
||||||
|
|
||||||
#define VERTEX_SHADER_FILE "src/shaders/shader.vert"
|
#define VERTEX_SHADER_FILE "src/shaders/shader.vert"
|
||||||
#define FRAG_SHADER_FILE "src/shaders/shader.frag"
|
#define FRAG_SHADER_FILE "src/shaders/shader.frag"
|
||||||
|
|
||||||
/* ----------------- V A R I A B L E S G L O B A L E S ------------------ */
|
static GLuint arrows[] = {
|
||||||
|
1, 0, 0, 0, 0,
|
||||||
|
1, 1, 0, 0, 0,
|
||||||
|
1, 2, 0, 0, 0,
|
||||||
|
1, 3, 0, 0, 0,
|
||||||
|
1, 4, 0, 0, 0,
|
||||||
|
1, 5, 0, 0, 0,
|
||||||
|
// load, site, x, y, z
|
||||||
|
};
|
||||||
|
|
||||||
static int model_space_size_x = 0;
|
static int model_space_size_x = 0;
|
||||||
static int model_space_size_y = 0;
|
static int model_space_size_y = 0;
|
||||||
|
@ -52,7 +48,6 @@ static int model_space_size_z = 0;
|
||||||
static int model_arrows_nb = 0;
|
static int model_arrows_nb = 0;
|
||||||
static int central_stars_nb = 0;
|
static int central_stars_nb = 0;
|
||||||
|
|
||||||
|
|
||||||
static GLfloat *buffer_vertex_origin = NULL;
|
static GLfloat *buffer_vertex_origin = NULL;
|
||||||
static GLfloat *buffer_colors_origin = NULL;
|
static GLfloat *buffer_colors_origin = NULL;
|
||||||
static GLuint *buffer_lines_origin = NULL;
|
static GLuint *buffer_lines_origin = NULL;
|
||||||
|
@ -60,46 +55,17 @@ static GLuint *buffer_plans_origin = NULL;
|
||||||
|
|
||||||
static int pref_show_grid = 0;
|
static int pref_show_grid = 0;
|
||||||
|
|
||||||
static int buffer_vertex_size = 0;
|
static volatile int buffer_vertex_size = 0;
|
||||||
static int buffer_colors_size = 0;
|
static int buffer_colors_size = 0;
|
||||||
static int buffer_lines_size = 0;
|
static int buffer_lines_size = 0;
|
||||||
static int buffer_plans_size = 0;
|
static int buffer_plans_size = 0;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Dynamic array of ptrs to dynamically allocated gl_area_entry
|
||||||
|
*/
|
||||||
|
struct gl_area_entry **gl_area_array = NULL;
|
||||||
|
|
||||||
|
/* -------------------------------------------------------------------------- */
|
||||||
static void set_vertex_xyz(float x, float y, float z){
|
|
||||||
// *(buffer_vertex_origin + buffer_vertex_size) = x; buffer_vertex_size ++;
|
|
||||||
// *(buffer_vertex_origin + buffer_vertex_size) = y; buffer_vertex_size ++;
|
|
||||||
// *(buffer_vertex_origin + buffer_vertex_size) = z; buffer_vertex_size ++;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void set_color_xyz(float x, float y, float z){
|
|
||||||
// *(buffer_colors_origin + buffer_colors_size) = x; buffer_colors_size ++;
|
|
||||||
// *(buffer_colors_origin + buffer_colors_size) = y; buffer_colors_size ++;
|
|
||||||
// *(buffer_colors_origin + buffer_colors_size) = z; buffer_colors_size ++;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void draw_triangle(long a, long b, long c){
|
|
||||||
// *(buffer_plans_origin + buffer_plans_size) = a; buffer_plans_size ++;
|
|
||||||
// *(buffer_plans_origin + buffer_plans_size) = b; buffer_plans_size ++;
|
|
||||||
// *(buffer_plans_origin + buffer_plans_size) = c; buffer_plans_size ++;
|
|
||||||
}
|
|
||||||
|
|
||||||
void draw_line (int a, int b)
|
|
||||||
{
|
|
||||||
buffer_lines_origin = g_realloc (buffer_lines_origin,
|
|
||||||
(buffer_lines_size + 2) * sizeof(GLuint));
|
|
||||||
|
|
||||||
assert (buffer_lines_origin);
|
|
||||||
|
|
||||||
buffer_lines_origin[buffer_lines_size + 0] = a;
|
|
||||||
buffer_lines_origin[buffer_lines_size + 1] = b;
|
|
||||||
|
|
||||||
buffer_lines_size += 2;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/* ----------------- O P E N G L D E B U G M E S S A G E S ------------ */
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Prints verbose human-readable debug messages
|
* Prints verbose human-readable debug messages
|
||||||
|
@ -162,270 +128,156 @@ static void graphics_debug_callback(GLenum source, GLenum type, GLuint id,
|
||||||
|
|
||||||
/* -------------------------------------------------------------------------- */
|
/* -------------------------------------------------------------------------- */
|
||||||
|
|
||||||
/*
|
static void get_model_data_and_user_preferences()
|
||||||
* Dynamic array of ptrs to dynamically allocated gl_area_entry
|
|
||||||
*/
|
|
||||||
struct gl_area_entry **gl_area_array = NULL;
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Find gl_area_entry from a gl_area ptr
|
|
||||||
*
|
|
||||||
* @param gl_area, ptr to the gl_area widget
|
|
||||||
*
|
|
||||||
*
|
|
||||||
* @return entry ptr
|
|
||||||
*/
|
|
||||||
struct gl_area_entry *find_entry_from_ptr(const char *name)
|
|
||||||
{
|
{
|
||||||
struct gl_area_entry **cur;
|
model_space_size_x = 2; // 0 < model_space_size_x
|
||||||
|
model_space_size_y = 2; // 0 < model_space_size_y
|
||||||
|
model_space_size_z = 2; // 0 < model_space_size_z
|
||||||
|
|
||||||
// Check uninitialized and quit
|
model_arrows_nb = sizeof(arrows) / (5 * 4);
|
||||||
if (gl_area_array == NULL) return NULL;
|
// assert : l'emplacement des flèches est contraint
|
||||||
|
// par model_space_size_x, y, z et le nombre de sites
|
||||||
|
|
||||||
// Seek in array
|
central_stars_nb = 0; // à calculer TODO
|
||||||
cur = gl_area_array;
|
// ! WARNING ! Pour l'instant égal au nombre de flèches ! (central stars réécrites)
|
||||||
while(*cur) {
|
central_stars_nb = model_arrows_nb;
|
||||||
if (strncmp((*cur)->name, name, sizeof((*cur)->name)) == 0) return *cur;
|
|
||||||
cur++;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Nothing found
|
pref_show_grid = 0; // 0, 1, 2, 3, 5, 6, 10, 15, 30, etc
|
||||||
return NULL;
|
// xyz, 0, x, y, z, xy, xz, yz, xyz
|
||||||
|
}
|
||||||
|
|
||||||
|
/* -------------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Writes values to describe a line from a to b into the line buffer
|
||||||
|
*
|
||||||
|
* @param coords GLuint (a,b)
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
void graphics_write_line (GLuint a, GLuint b)
|
||||||
|
{
|
||||||
|
buffer_lines_origin = g_realloc (buffer_lines_origin,
|
||||||
|
(buffer_lines_size + 2) * sizeof(GLuint));
|
||||||
|
|
||||||
|
assert (buffer_lines_origin);
|
||||||
|
|
||||||
|
buffer_lines_origin[buffer_lines_size + 0] = a;
|
||||||
|
buffer_lines_origin[buffer_lines_size + 1] = b;
|
||||||
|
|
||||||
|
buffer_lines_size += 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Find the gl_area_entry size
|
* Writes values to describe a vertex at (x,y,z) into the vertex buffer
|
||||||
*
|
*
|
||||||
* @param void
|
* @param coords GLfloat(x,y,z)
|
||||||
*
|
*
|
||||||
* @return size of array
|
* @return void
|
||||||
*/
|
*/
|
||||||
static inline short gl_area_size(void)
|
void graphics_write_vertex (GLfloat x, GLfloat y, GLfloat z)
|
||||||
{
|
{
|
||||||
struct gl_area_entry **cur;
|
buffer_vertex_origin = g_realloc (buffer_vertex_origin,
|
||||||
short size;
|
(buffer_vertex_size + 3) * sizeof(GLfloat));
|
||||||
|
|
||||||
// Check uninitialized and quit
|
assert (buffer_vertex_origin);
|
||||||
if (gl_area_array == NULL) return 0;
|
|
||||||
|
|
||||||
cur = gl_area_array;
|
buffer_vertex_origin[buffer_vertex_size + 0] = x;
|
||||||
while(*cur) {
|
buffer_vertex_origin[buffer_vertex_size + 1] = y;
|
||||||
cur++;
|
buffer_vertex_origin[buffer_vertex_size + 2] = z;
|
||||||
size++;
|
|
||||||
}
|
|
||||||
|
|
||||||
return size;
|
buffer_vertex_size += 3;
|
||||||
|
|
||||||
|
printf("Created vertex (%f,%f,%f), size is %d\n", x,y,z, buffer_vertex_size);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Initializes a gl_area
|
* Writes values to describe a color (r,g,b) into the color buffer
|
||||||
*
|
*
|
||||||
* @param gl_area, ptr to the gl_area widget
|
* @param color GLfloat(r,g,b)
|
||||||
*
|
*
|
||||||
* @return true if initialized
|
* @return void
|
||||||
*/
|
*/
|
||||||
bool graphics_init(const char *gl_area)
|
void graphics_write_color (GLfloat r, GLfloat g, GLfloat b)
|
||||||
{
|
{
|
||||||
short array_size;
|
buffer_colors_origin = g_realloc (buffer_colors_origin,
|
||||||
|
(buffer_colors_size + 3) * sizeof(GLfloat));
|
||||||
|
|
||||||
glEnable(GL_DEBUG_OUTPUT);
|
assert (buffer_colors_origin);
|
||||||
glEnable(GL_DEBUG_OUTPUT_SYNCHRONOUS);
|
|
||||||
glEnable(GL_MULTISAMPLE);
|
|
||||||
|
|
||||||
// Check if not already initialized
|
buffer_colors_origin[buffer_colors_size + 0] = r;
|
||||||
if (find_entry_from_ptr(gl_area)) {
|
buffer_colors_origin[buffer_colors_size + 1] = g;
|
||||||
errno = EEXIST;
|
buffer_colors_origin[buffer_colors_size + 2] = b;
|
||||||
perror("gl_area_array already exists");
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Get actual array size
|
buffer_colors_size += 3;
|
||||||
array_size = gl_area_size();
|
|
||||||
|
|
||||||
// If it does not exist, allocs it
|
|
||||||
if (gl_area_array == NULL) {
|
|
||||||
gl_area_array = g_malloc0(sizeof(struct gl_area_entry *) * 2);
|
|
||||||
|
|
||||||
// If it does exist, g_reallocs it
|
|
||||||
} else {
|
|
||||||
gl_area_array = g_realloc(gl_area_array,
|
|
||||||
(array_size + 1)
|
|
||||||
* sizeof(struct gl_area_entry *));
|
|
||||||
if (gl_area_array == NULL) {
|
|
||||||
perror("Not enough memory to allocate gl_area_array");
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
explicit_bzero(gl_area_array + array_size * sizeof(struct gl_area_entry *),
|
|
||||||
sizeof(struct gl_area_entry *));
|
|
||||||
}
|
|
||||||
|
|
||||||
// Alloc new entry
|
|
||||||
gl_area_array[array_size] = g_malloc0(sizeof(struct gl_area_entry));
|
|
||||||
|
|
||||||
strcpy(gl_area_array[array_size]->name, gl_area);
|
|
||||||
|
|
||||||
if (!graphics_init_shaders(gl_area)) return false;
|
|
||||||
|
|
||||||
graphics_init_buffers(gl_area);
|
|
||||||
|
|
||||||
glDebugMessageCallback(graphics_debug_callback, NULL);
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Shutdowns a gl_area
|
* Writes values to describe an (a,b,c) plan (triangle) into the plan buffer
|
||||||
*
|
*
|
||||||
* @param gl_area, ptr to the gl_area widget
|
* @param coords GLuint (a,b,c)
|
||||||
*
|
*
|
||||||
* @return true if success
|
* @return void
|
||||||
*/
|
*/
|
||||||
bool graphics_shutdown(const void *gl_area)
|
void graphics_write_plan (GLuint a, GLuint b, GLuint c)
|
||||||
|
{
|
||||||
|
buffer_plans_origin = g_realloc (buffer_plans_origin,
|
||||||
|
(buffer_plans_size + 3) * sizeof(GLuint));
|
||||||
|
|
||||||
|
assert (buffer_plans_origin);
|
||||||
|
|
||||||
|
buffer_plans_origin[buffer_plans_size + 0] = a;
|
||||||
|
buffer_plans_origin[buffer_plans_size + 1] = b;
|
||||||
|
buffer_plans_origin[buffer_plans_size + 2] = c;
|
||||||
|
|
||||||
|
buffer_plans_size += 3;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Initializes the buffer of a gl_area
|
||||||
|
* Calls according to the user preferences
|
||||||
|
* @param gl_area, ptr to the gl_area widget
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
void graphics_init_buffers(const void *gl_area)
|
||||||
{
|
{
|
||||||
struct gl_area_entry *entry;
|
struct gl_area_entry *entry;
|
||||||
|
entry = graphics_find_glarea_from_ptr(gl_area);
|
||||||
|
|
||||||
entry = find_entry_from_ptr(gl_area);
|
get_model_data_and_user_preferences();
|
||||||
|
|
||||||
if (entry == NULL) {
|
//XXX
|
||||||
errno = EFAULT;
|
main_test_graphics ();
|
||||||
perror("gl_area_array entry not found");
|
|
||||||
return false;
|
GLuint vao, vertex_buffer, color_buffer;
|
||||||
|
|
||||||
|
glGenBuffers(1, &vertex_buffer);
|
||||||
|
glBindBuffer(GL_ARRAY_BUFFER, vertex_buffer);
|
||||||
|
glBufferData(GL_ARRAY_BUFFER, buffer_vertex_size * sizeof(buffer_vertex_origin[0]), buffer_vertex_origin, GL_STATIC_DRAW);
|
||||||
|
glBindBuffer(GL_ARRAY_BUFFER, 0);
|
||||||
|
|
||||||
|
|
||||||
|
// colors
|
||||||
|
glGenBuffers(1, &color_buffer);
|
||||||
|
glBindBuffer(GL_ARRAY_BUFFER, color_buffer);
|
||||||
|
glBufferData(GL_ARRAY_BUFFER, buffer_colors_size * sizeof(buffer_colors_origin), buffer_colors_origin, GL_STATIC_DRAW);
|
||||||
|
glBindBuffer(GL_ARRAY_BUFFER, 0);
|
||||||
|
|
||||||
|
// We only use one VAO, so we always keep it bound
|
||||||
|
glGenVertexArrays(1, &vao);
|
||||||
|
glBindVertexArray(vao);
|
||||||
|
|
||||||
|
if(entry != NULL) {
|
||||||
|
entry->vao = vao;
|
||||||
|
entry->position_buffer = vertex_buffer;
|
||||||
|
entry->color_buffer = color_buffer;
|
||||||
}
|
}
|
||||||
|
|
||||||
glDeleteBuffers(1, &entry->position_buffer);
|
|
||||||
glDeleteBuffers(1, &entry->color_buffer);
|
|
||||||
glDeleteProgram(entry->program);
|
|
||||||
|
|
||||||
// Liberate
|
|
||||||
g_free(entry);
|
|
||||||
|
|
||||||
entry = NULL;
|
|
||||||
|
|
||||||
gl_area_array = g_realloc(gl_area_array,
|
|
||||||
(gl_area_size())
|
|
||||||
* sizeof(struct gl_area_entry *));
|
|
||||||
|
|
||||||
g_free(buffer_vertex_origin);
|
|
||||||
g_free(buffer_colors_origin);
|
|
||||||
g_free(buffer_lines_origin);
|
|
||||||
g_free(buffer_plans_origin);
|
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------------------------------------- */
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Initializes an identity matrix
|
|
||||||
*
|
|
||||||
* @param res, target ptr
|
|
||||||
*
|
|
||||||
* @return void
|
|
||||||
*/
|
|
||||||
static inline void compute_i(float *res)
|
|
||||||
{
|
|
||||||
/* initialize to the identity matrix */
|
|
||||||
res[0] = 1.f; res[4] = 0.f; res[8] = 0.f; res[12] = 0.f;
|
|
||||||
res[1] = 0.f; res[5] = 1.f; res[9] = 0.f; res[13] = 0.f;
|
|
||||||
res[2] = 0.f; res[6] = 0.f; res[10] = 1.f; res[14] = 0.f;
|
|
||||||
res[3] = 0.f; res[7] = 0.f; res[11] = 0.f; res[15] = 1.f;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Computes the projection matrix
|
|
||||||
*
|
|
||||||
* @param res, target ptr
|
|
||||||
* phi, XXX
|
|
||||||
* theta, XXX
|
|
||||||
* psi, XXX
|
|
||||||
*
|
|
||||||
* @return void
|
|
||||||
*/
|
|
||||||
static inline void compute_mvp(float *res, float phi, float theta, float psi)
|
|
||||||
{
|
|
||||||
float x = phi *(G_PI / 180.f);
|
|
||||||
float y = theta *(G_PI / 180.f);
|
|
||||||
float z = psi *(G_PI / 180.f);
|
|
||||||
float c1 = cosf(x), s1 = sinf(x);
|
|
||||||
float c2 = cosf(y), s2 = sinf(y);
|
|
||||||
float c3 = cosf(z), s3 = sinf(z);
|
|
||||||
float c3c2 = c3 * c2;
|
|
||||||
float s3c1 = s3 * c1;
|
|
||||||
float c3s2s1 = c3 * s2 * s1;
|
|
||||||
float s3s1 = s3 * s1;
|
|
||||||
float c3s2c1 = c3 * s2 * c1;
|
|
||||||
float s3c2 = s3 * c2;
|
|
||||||
float c3c1 = c3 * c1;
|
|
||||||
float s3s2s1 = s3 * s2 * s1;
|
|
||||||
float c3s1 = c3 * s1;
|
|
||||||
float s3s2c1 = s3 * s2 * c1;
|
|
||||||
float c2s1 = c2 * s1;
|
|
||||||
float c2c1 = c2 * c1;
|
|
||||||
|
|
||||||
compute_i(res);
|
|
||||||
|
|
||||||
/* apply all three rotations using the three matrices:
|
|
||||||
*
|
|
||||||
* ⎡ c3 s3 0 ⎤ ⎡ c2 0 -s2 ⎤ ⎡ 1 0 0 ⎤
|
|
||||||
* ⎢ -s3 c3 0 ⎥ ⎢ 0 1 0 ⎥ ⎢ 0 c1 s1 ⎥
|
|
||||||
* ⎣ 0 0 1 ⎦ ⎣ s2 0 c2 ⎦ ⎣ 0 -s1 c1 ⎦
|
|
||||||
*/
|
|
||||||
res[0] = c3c2; res[4] = s3c1 + c3s2s1; res[8] = s3s1 - c3s2c1; res[12] = 0.f;
|
|
||||||
res[1] = -s3c2; res[5] = c3c1 - s3s2s1; res[9] = c3s1 + s3s2c1; res[13] = 0.f;
|
|
||||||
res[2] = s2; res[6] = -c2s1; res[10] = c2c1; res[14] = 0.f;
|
|
||||||
res[3] = 0.f; res[7] = 0.f; res[11] = 0.f; res[15] = 1.f;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Created and compile a shader
|
|
||||||
*
|
|
||||||
* @param type, shader type
|
|
||||||
* src, source code of shader
|
|
||||||
*
|
|
||||||
* @return shader id
|
|
||||||
*/
|
|
||||||
static inline GLuint create_shader(int type, const char *src)
|
|
||||||
{
|
|
||||||
GLuint shader;
|
|
||||||
int status;
|
|
||||||
|
|
||||||
shader = glCreateShader(type);
|
|
||||||
glShaderSource(shader, 1, &src, NULL);
|
|
||||||
glCompileShader(shader);
|
|
||||||
|
|
||||||
glGetShaderiv(shader, GL_COMPILE_STATUS, &status);
|
|
||||||
if(status == GL_FALSE) {
|
|
||||||
int log_len;
|
|
||||||
char *buffer;
|
|
||||||
|
|
||||||
glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &log_len);
|
|
||||||
|
|
||||||
buffer = g_malloc(log_len + 1);
|
|
||||||
glGetShaderInfoLog(shader, log_len, NULL, buffer);
|
|
||||||
|
|
||||||
g_warning("Compile failure in %s shader:\n%s",
|
|
||||||
type == GL_VERTEX_SHADER ? "vertex" : "fragment",
|
|
||||||
buffer);
|
|
||||||
|
|
||||||
g_free(buffer);
|
|
||||||
|
|
||||||
glDeleteShader(shader);
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
return shader;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* -------------------------------------------------------------------------- */
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Initializes the shaders of a gl_area and link them to a program
|
* Initializes the shaders of a gl_area and link them to a program
|
||||||
*
|
*
|
||||||
* @param gl_area, ptr to the gl_area widget
|
* @param gl_area, ptr to the gl_area widget
|
||||||
*
|
*
|
||||||
*
|
|
||||||
* @return true if initialized
|
* @return true if initialized
|
||||||
*/
|
*/
|
||||||
bool graphics_init_shaders(const void *gl_area)
|
bool graphics_init_shaders(const void *gl_area)
|
||||||
|
@ -440,7 +292,7 @@ bool graphics_init_shaders(const void *gl_area)
|
||||||
GLuint v = 0;
|
GLuint v = 0;
|
||||||
GLuint p = 0;
|
GLuint p = 0;
|
||||||
|
|
||||||
entry = find_entry_from_ptr(gl_area);
|
entry = graphics_find_glarea_from_ptr(gl_area);
|
||||||
|
|
||||||
if (entry == NULL) {
|
if (entry == NULL) {
|
||||||
errno = EFAULT;
|
errno = EFAULT;
|
||||||
|
@ -531,221 +383,6 @@ bool graphics_init_shaders(const void *gl_area)
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
GLuint arrows[] = {
|
|
||||||
1, 0, 0, 0, 0,
|
|
||||||
1, 1, 0, 0, 0,
|
|
||||||
1, 2, 0, 0, 0,
|
|
||||||
1, 3, 0, 0, 0,
|
|
||||||
1, 4, 0, 0, 0,
|
|
||||||
1, 5, 0, 0, 0,
|
|
||||||
/* 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, 5, 2, 1, 1, */
|
|
||||||
// load, site, x, y, z
|
|
||||||
};
|
|
||||||
|
|
||||||
static void get_model_data_and_user_preferences(){
|
|
||||||
|
|
||||||
|
|
||||||
model_space_size_x = 1; // 0 < model_space_size_x
|
|
||||||
model_space_size_y = 1; // 0 < model_space_size_y
|
|
||||||
model_space_size_z = 1; // 0 < model_space_size_z
|
|
||||||
|
|
||||||
// XXX ONLY space drawed, no arrows yet
|
|
||||||
|
|
||||||
model_arrows_nb = sizeof(arrows) / (5 * 4); // assert : l'emplacement des flèches est contraint
|
|
||||||
// par model_space_size_x, y, z et le nombre de sites
|
|
||||||
|
|
||||||
central_stars_nb = 0; // à calculer TODO
|
|
||||||
// ! WARNING ! Pour l'instant égal au nombre de flèches ! (central stars réécrites)
|
|
||||||
central_stars_nb = model_arrows_nb;
|
|
||||||
|
|
||||||
pref_show_grid = 0; // 0, 1, 2, 3, 5, 6, 10, 15, 30, etc
|
|
||||||
// xyz, 0, x, y, z, xy, xz, yz, xyz
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
static void compute_buffers_sizes(int model_space_size_x,
|
|
||||||
int model_space_size_y,
|
|
||||||
int model_space_size_z,
|
|
||||||
|
|
||||||
int model_arrows_nb)
|
|
||||||
{
|
|
||||||
long grids_intersections = (model_space_size_x + 1)
|
|
||||||
* (model_space_size_y + 1)
|
|
||||||
* (model_space_size_z + 1);
|
|
||||||
|
|
||||||
long arrows_anchors = (model_space_size_x)
|
|
||||||
* (model_space_size_y)
|
|
||||||
* (model_space_size_z)
|
|
||||||
* (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;
|
|
||||||
|
|
||||||
buffer_vertex_size = grids_intersections * 3; // 3 numbers per vertex
|
|
||||||
|
|
||||||
buffer_vertex_size += arrows_anchors * 3;
|
|
||||||
|
|
||||||
|
|
||||||
buffer_colors_size = buffer_vertex_size;
|
|
||||||
|
|
||||||
buffer_plans_size = 0;
|
|
||||||
|
|
||||||
long grids_lines =
|
|
||||||
(pref_show_grid % 2 == 0) * (model_space_size_x + 1) * (model_space_size_y + 1)
|
|
||||||
+ (pref_show_grid % 3 == 0) * (model_space_size_x + 1) * (model_space_size_z + 1)
|
|
||||||
+ (pref_show_grid % 5 == 0) * (model_space_size_y + 1) * (model_space_size_z + 1);
|
|
||||||
|
|
||||||
if (pref_show_grid != 1) inc_buffer_lines_size(grids_lines * 2);
|
|
||||||
if (pref_show_grid > 0) inc_buffer_lines_size(12 * 2); // space ridges
|
|
||||||
// sinon, les arêtes de l'espace sont tracées par les grilles
|
|
||||||
|
|
||||||
printf("allocated buffers sizes :%4d/3 = %3d vertices, %4d/3 = %3d colors,\
|
|
||||||
%4d/2 = %3d lines, %4d/3 = %3d plans.\n",
|
|
||||||
buffer_vertex_size, buffer_vertex_size / 3,
|
|
||||||
buffer_colors_size, buffer_colors_size / 3,
|
|
||||||
buffer_lines_size, buffer_lines_size / 2,
|
|
||||||
buffer_plans_size, buffer_plans_size / 3);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/* Initializes the buffer of a gl_area
|
|
||||||
* Calls according to the user preferences
|
|
||||||
* @param gl_area, ptr to the gl_area widget
|
|
||||||
* 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;
|
|
||||||
entry = find_entry_from_ptr(gl_area);
|
|
||||||
|
|
||||||
get_model_data_and_user_preferences();
|
|
||||||
|
|
||||||
compute_buffers_sizes (model_space_size_x,
|
|
||||||
model_space_size_y,
|
|
||||||
model_space_size_z,
|
|
||||||
|
|
||||||
model_arrows_nb);
|
|
||||||
|
|
||||||
buffer_vertex_origin = g_malloc0 (buffer_vertex_size * sizeof(GLfloat) * 2);
|
|
||||||
buffer_colors_origin = g_malloc0 (buffer_colors_size * sizeof(GLfloat) * 2);
|
|
||||||
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,
|
|
||||||
|
|
||||||
arrows,
|
|
||||||
model_arrows_nb,
|
|
||||||
|
|
||||||
pref_show_grid,
|
|
||||||
|
|
||||||
buffer_vertex_origin,
|
|
||||||
buffer_colors_origin,
|
|
||||||
buffer_lines_origin,
|
|
||||||
buffer_plans_origin);
|
|
||||||
|
|
||||||
GLuint vao, vertex_buffer, color_buffer;
|
|
||||||
|
|
||||||
glGenBuffers(1, &vertex_buffer);
|
|
||||||
glBindBuffer(GL_ARRAY_BUFFER, vertex_buffer);
|
|
||||||
glBufferData(GL_ARRAY_BUFFER, buffer_vertex_size * sizeof(buffer_vertex_origin[0]), buffer_vertex_origin, GL_STATIC_DRAW);
|
|
||||||
glBindBuffer(GL_ARRAY_BUFFER, 0);
|
|
||||||
|
|
||||||
|
|
||||||
// colors
|
|
||||||
glGenBuffers(1, &color_buffer);
|
|
||||||
glBindBuffer(GL_ARRAY_BUFFER, color_buffer);
|
|
||||||
glBufferData(GL_ARRAY_BUFFER, buffer_colors_size * sizeof(buffer_colors_origin), buffer_colors_origin, GL_STATIC_DRAW);
|
|
||||||
glBindBuffer(GL_ARRAY_BUFFER, 0);
|
|
||||||
|
|
||||||
// We only use one VAO, so we always keep it bound
|
|
||||||
glGenVertexArrays(1, &vao);
|
|
||||||
glBindVertexArray(vao);
|
|
||||||
|
|
||||||
if(entry != NULL) {
|
|
||||||
entry->vao = vao;
|
|
||||||
entry->position_buffer = vertex_buffer;
|
|
||||||
entry->color_buffer = color_buffer;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Draws the current buffer to a gl_area
|
* Draws the current buffer to a gl_area
|
||||||
*
|
*
|
||||||
|
@ -760,7 +397,7 @@ void graphics_draw(const void *gl_area)
|
||||||
float p[16];
|
float p[16];
|
||||||
struct gl_area_entry *entry;
|
struct gl_area_entry *entry;
|
||||||
|
|
||||||
entry = find_entry_from_ptr(gl_area);
|
entry = graphics_find_glarea_from_ptr(gl_area);
|
||||||
|
|
||||||
if (entry == NULL) {
|
if (entry == NULL) {
|
||||||
errno = EFAULT;
|
errno = EFAULT;
|
||||||
|
@ -814,4 +451,238 @@ void graphics_draw(const void *gl_area)
|
||||||
|
|
||||||
glFlush();
|
glFlush();
|
||||||
}
|
}
|
||||||
|
/* -------------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* DEBUG
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
static void show_user_choices(long model_space_size_x,
|
||||||
|
long model_space_size_y,
|
||||||
|
long model_space_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_space_size_x, model_space_size_y, model_space_size_z);
|
||||||
|
if (model_arrows_nb > 0) printf("[%d] arrows ", model_arrows_nb);
|
||||||
|
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("\tbuffer_vertex_size = %d\t lines = %d\n",\
|
||||||
|
buffer_vertex_size, buffer_lines_size);
|
||||||
|
if (model_arrows_nb > 0) printf("\n[ n] load site x y z ---- < arrows array >\
|
||||||
|
------------------------------------------------------------\n");
|
||||||
|
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));
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Find gl_area_entry from a gl_area ptr
|
||||||
|
*
|
||||||
|
* @param gl_area, ptr to the gl_area widget
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* @return entry ptr
|
||||||
|
*/
|
||||||
|
struct gl_area_entry *graphics_find_glarea_from_ptr(const char *name)
|
||||||
|
{
|
||||||
|
struct gl_area_entry **cur;
|
||||||
|
|
||||||
|
// Check uninitialized and quit
|
||||||
|
if (gl_area_array == NULL) return NULL;
|
||||||
|
|
||||||
|
// Seek in array
|
||||||
|
cur = gl_area_array;
|
||||||
|
while(*cur) {
|
||||||
|
if (strncmp((*cur)->name, name, sizeof((*cur)->name)) == 0) return *cur;
|
||||||
|
cur++;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Nothing found
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Initializes a gl_area
|
||||||
|
*
|
||||||
|
* @param gl_area, ptr to the gl_area widget
|
||||||
|
*
|
||||||
|
* @return true if initialized
|
||||||
|
*/
|
||||||
|
bool graphics_init(const char *gl_area)
|
||||||
|
{
|
||||||
|
short array_size;
|
||||||
|
|
||||||
|
glEnable(GL_DEBUG_OUTPUT);
|
||||||
|
glEnable(GL_DEBUG_OUTPUT_SYNCHRONOUS);
|
||||||
|
glEnable(GL_MULTISAMPLE);
|
||||||
|
|
||||||
|
// Check if not already initialized
|
||||||
|
if (graphics_find_glarea_from_ptr(gl_area)) {
|
||||||
|
errno = EEXIST;
|
||||||
|
perror("gl_area_array already exists");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get actual array size
|
||||||
|
array_size = gl_area_size();
|
||||||
|
|
||||||
|
// If it does not exist, allocs it
|
||||||
|
if (gl_area_array == NULL) {
|
||||||
|
gl_area_array = g_malloc0(sizeof(struct gl_area_entry *) * 2);
|
||||||
|
|
||||||
|
// If it does exist, g_reallocs it
|
||||||
|
} else {
|
||||||
|
gl_area_array = g_realloc(gl_area_array,
|
||||||
|
(array_size + 1)
|
||||||
|
* sizeof(struct gl_area_entry *));
|
||||||
|
if (gl_area_array == NULL) {
|
||||||
|
perror("Not enough memory to allocate gl_area_array");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
explicit_bzero(gl_area_array + array_size * sizeof(struct gl_area_entry *),
|
||||||
|
sizeof(struct gl_area_entry *));
|
||||||
|
}
|
||||||
|
|
||||||
|
// Alloc new entry
|
||||||
|
gl_area_array[array_size] = g_malloc0(sizeof(struct gl_area_entry));
|
||||||
|
|
||||||
|
strcpy(gl_area_array[array_size]->name, gl_area);
|
||||||
|
|
||||||
|
if (!graphics_init_shaders(gl_area)) return false;
|
||||||
|
|
||||||
|
graphics_init_buffers(gl_area);
|
||||||
|
|
||||||
|
glDebugMessageCallback(graphics_debug_callback, NULL);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Shutdowns a gl_area
|
||||||
|
*
|
||||||
|
* @param gl_area, ptr to the gl_area widget
|
||||||
|
*
|
||||||
|
* @return true if success
|
||||||
|
*/
|
||||||
|
bool graphics_shutdown(const void *gl_area)
|
||||||
|
{
|
||||||
|
struct gl_area_entry *entry;
|
||||||
|
|
||||||
|
entry = graphics_find_glarea_from_ptr(gl_area);
|
||||||
|
|
||||||
|
if (entry == NULL) {
|
||||||
|
errno = EFAULT;
|
||||||
|
perror("gl_area_array entry not found");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
glDeleteBuffers(1, &entry->position_buffer);
|
||||||
|
glDeleteBuffers(1, &entry->color_buffer);
|
||||||
|
glDeleteProgram(entry->program);
|
||||||
|
|
||||||
|
// Liberate
|
||||||
|
g_free(entry);
|
||||||
|
|
||||||
|
entry = NULL;
|
||||||
|
|
||||||
|
gl_area_array = g_realloc(gl_area_array,
|
||||||
|
(gl_area_size())
|
||||||
|
* sizeof(struct gl_area_entry *));
|
||||||
|
|
||||||
|
g_free(buffer_vertex_origin);
|
||||||
|
g_free(buffer_colors_origin);
|
||||||
|
g_free(buffer_lines_origin);
|
||||||
|
g_free(buffer_plans_origin);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* -------------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
void main_test_graphics (void)
|
||||||
|
{
|
||||||
|
long stx = model_space_size_z * model_space_size_y,
|
||||||
|
sty = model_space_size_z,
|
||||||
|
stz = 1;
|
||||||
|
|
||||||
|
long site = 0, x = 0, y = 0, z = 0;
|
||||||
|
|
||||||
|
show_user_choices(model_space_size_x, model_space_size_y, model_space_size_z,
|
||||||
|
arrows, model_arrows_nb,
|
||||||
|
pref_show_grid);
|
||||||
|
|
||||||
|
printf("offset_before_grid = %d\n", buffer_vertex_size / 3);
|
||||||
|
|
||||||
|
/* GRID */
|
||||||
|
|
||||||
|
grid_write_intersections (model_space_size_x, model_space_size_y, model_space_size_z);
|
||||||
|
|
||||||
|
if (pref_show_grid % 2 == 0)
|
||||||
|
grid_write_x (model_space_size_x, model_space_size_y, model_space_size_z);
|
||||||
|
if (pref_show_grid % 3 == 0)
|
||||||
|
grid_write_y (model_space_size_x, model_space_size_y, model_space_size_z);
|
||||||
|
if (pref_show_grid % 5 == 0)
|
||||||
|
grid_write_z (model_space_size_x, model_space_size_y, model_space_size_z);
|
||||||
|
|
||||||
|
if (pref_show_grid > 0)
|
||||||
|
grid_write_ridges (model_space_size_x, model_space_size_y, model_space_size_z);
|
||||||
|
|
||||||
|
int offset_after_grid = buffer_vertex_size / 3;
|
||||||
|
printf("offset_after_grid = %d\n", offset_after_grid);
|
||||||
|
|
||||||
|
/* ARROWS */
|
||||||
|
arrows_write_terminations (model_space_size_x, model_space_size_y, model_space_size_z);
|
||||||
|
|
||||||
|
for (int i = 0; i < model_arrows_nb; i++) {
|
||||||
|
site = arrows[i * 5 + 1];
|
||||||
|
x = arrows[i * 5 + 2];
|
||||||
|
y = arrows[i * 5 + 3];
|
||||||
|
z = arrows[i * 5 + 4];
|
||||||
|
|
||||||
|
printf("[%ld]\tsite = %d\tx = %ld\ty = %ld\tz = %ld\tstep x = %ld\tstep y = %ld\n",
|
||||||
|
site, i, x, y, z, stx, sty);
|
||||||
|
|
||||||
|
arrows_write_basis (offset_after_grid + 12 * (stx * x + sty * y + stz * z)); // XXX 1 + 12 ?
|
||||||
|
|
||||||
|
switch(site){
|
||||||
|
case EAST:
|
||||||
|
write_arrow_lines_east(offset_after_grid + 12 * (stx * x + sty * y + stz * z), 1, site);
|
||||||
|
break;
|
||||||
|
case WEST:
|
||||||
|
write_arrow_lines_west(offset_after_grid + 12 * (stx * x + sty * y + stz * z), 1, site);
|
||||||
|
break;
|
||||||
|
case ZENITH:
|
||||||
|
write_arrow_lines_zenith(offset_after_grid + 12 * (stx * x + sty * y + stz * z), 1, site);
|
||||||
|
break;
|
||||||
|
case NADIR:
|
||||||
|
write_arrow_lines_nadir(offset_after_grid + 12 * (stx * x + sty * y + stz * z), 1, site);
|
||||||
|
break;
|
||||||
|
case SOUTH:
|
||||||
|
write_arrow_lines_south(offset_after_grid + 12 * (stx * x + sty * y + stz * z), 1, site);
|
||||||
|
break;
|
||||||
|
case NORTH:
|
||||||
|
write_arrow_lines_north(offset_after_grid + 12 * (stx * x + sty * y + stz * z), 1, site);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
// XXX ?
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
show_user_choices(model_space_size_x, model_space_size_y, model_space_size_z,
|
||||||
|
arrows, model_arrows_nb,
|
||||||
|
pref_show_grid);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,154 @@
|
||||||
|
/*
|
||||||
|
* Gem-graph
|
||||||
|
*
|
||||||
|
* Desc: OpenGL grid functions
|
||||||
|
*
|
||||||
|
* Copyright (C) 2023 Jean Sirmai <jean@a-lec.org>
|
||||||
|
* Copyright (C) 2023 Adrien Bourmault <neox@a-lec.org>
|
||||||
|
*
|
||||||
|
* This file is part of Gem-graph.
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU Affero General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU Affero General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Affero General Public License
|
||||||
|
* aint with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "../../include/base.h"
|
||||||
|
#include "../../include/graphics.h"
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Writes grid lines intersections to vertex and color buffers
|
||||||
|
*
|
||||||
|
* @param coords long (x,y,z)
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
void grid_write_intersections (long x, long y, long z)
|
||||||
|
{
|
||||||
|
|
||||||
|
float i, j, k, vx, vy, vz, max = fmax(x, y);
|
||||||
|
max = fmax(max, z);
|
||||||
|
|
||||||
|
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;
|
||||||
|
vy = (2 * j / y - 1) * y / max;
|
||||||
|
vz = (2 * k / z - 1) * z / max;
|
||||||
|
|
||||||
|
graphics_write_vertex (vx, vy, vz);
|
||||||
|
graphics_write_color (0.64f,0.64f,0.64f);
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Writes grid ridges to vertex and color buffers
|
||||||
|
*
|
||||||
|
* @param coords long (x,y,z), step_x, step_y, step_z
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
void grid_write_ridges (long x,
|
||||||
|
long y,
|
||||||
|
long z)
|
||||||
|
{
|
||||||
|
long step_x = z * y,
|
||||||
|
step_y = z,
|
||||||
|
step_z = 1;
|
||||||
|
|
||||||
|
if (1) graphics_write_line (step_z * 0 + step_y * 0 + step_x * 0, step_z * 0 + step_y * 0 + step_x * x);
|
||||||
|
if (1) graphics_write_line (step_z * 0 + step_y * 0 + step_x * 0, step_z * 0 + step_y * y + step_x * 0);
|
||||||
|
if (1) graphics_write_line (step_z * 0 + step_y * 0 + step_x * 0, step_z * z + step_y * 0 + step_x * 0);
|
||||||
|
if (1) graphics_write_line (step_z * z + step_y * y + step_x * x, step_z * 0 + step_y * y + step_x * x);
|
||||||
|
if (1) graphics_write_line (step_z * z + step_y * y + step_x * x, step_z * z + step_y * y + step_x * 0);
|
||||||
|
if (1) graphics_write_line (step_z * z + step_y * y + step_x * x, step_z * z + step_y * 0 + step_x * x);
|
||||||
|
if (1) graphics_write_line (step_z * 0 + step_y * 0 + step_x * x, step_z * 0 + step_y * y + step_x * x);
|
||||||
|
if (1) graphics_write_line (step_z * 0 + step_y * 0 + step_x * x, step_z * z + step_y * 0 + step_x * x);
|
||||||
|
if (1) graphics_write_line (step_z * z + step_y * 0 + step_x * 0, step_z * z + step_y * y + step_x * 0);
|
||||||
|
if (1) graphics_write_line (step_z * 0 + step_y * y + step_x * 0, step_z * 0 + step_y * y + step_x * x);
|
||||||
|
if (1) graphics_write_line (step_z * 0 + step_y * y + step_x * 0, step_z * z + step_y * y + step_x * 0);
|
||||||
|
if (1) graphics_write_line (step_z * z + step_y * 0 + step_x * 0, step_z * z + step_y * 0 + step_x * x);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Writes grid lines for x axis to vertex and color buffers
|
||||||
|
*
|
||||||
|
* @param coords long (x,y,z)
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
void grid_write_x (long x, long y, long z)
|
||||||
|
{
|
||||||
|
long step_z = 1,
|
||||||
|
step_y = z + 1,
|
||||||
|
step_x = (z + 1) * (y + 1);
|
||||||
|
|
||||||
|
x ++; y ++; z ++;
|
||||||
|
float calcul = 0;
|
||||||
|
|
||||||
|
for (int u = 0; u < y; u ++){
|
||||||
|
for (int w = 0; w < x; w ++){
|
||||||
|
calcul = step_x * w + step_y * u;
|
||||||
|
graphics_write_line (calcul, calcul + step_y - step_z);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Writes grid lines for y axis to vertex and color buffers
|
||||||
|
*
|
||||||
|
* @param coords long (x,y,z)
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
void grid_write_y (long x, long y, long z)
|
||||||
|
{
|
||||||
|
long step_z = 1,
|
||||||
|
step_y = z + 1,
|
||||||
|
step_x = (z + 1) * (y + 1);
|
||||||
|
|
||||||
|
x ++; y ++; z ++;
|
||||||
|
float calcul = 0;
|
||||||
|
|
||||||
|
for (int u = 0; u < y; u++) {
|
||||||
|
for (int w = 0; w < x; w ++){
|
||||||
|
calcul = step_x * w + step_z * u;
|
||||||
|
graphics_write_line (calcul, calcul + step_x - step_y);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Writes grid lines for z axis to vertex and color buffers
|
||||||
|
*
|
||||||
|
* @param coords long (x,y,z)
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
void grid_write_z (long x, long y, long z)
|
||||||
|
{
|
||||||
|
long step_z = 1,
|
||||||
|
step_y = z + 1,
|
||||||
|
step_x = (z + 1) * (y + 1);
|
||||||
|
|
||||||
|
x ++; y ++; z ++;
|
||||||
|
float calcul = 0;
|
||||||
|
|
||||||
|
for (int u = 0; u < z; u ++){
|
||||||
|
for (int w = 0; w < y; w ++){
|
||||||
|
calcul = step_y * w + step_z * u;
|
||||||
|
graphics_write_line (calcul, calcul + step_x * (x - 1));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -1,394 +0,0 @@
|
||||||
/*
|
|
||||||
* Gem-graph OpenGL experiments
|
|
||||||
*
|
|
||||||
* Desc: OpenGL utils header
|
|
||||||
*
|
|
||||||
* Copyright (C) 2023 Jean Sirmai <jean@a-lec.org>
|
|
||||||
*
|
|
||||||
* This file was part of Gem-graph. Forget it now.
|
|
||||||
*
|
|
||||||
* This program is free software: you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU Affero General Public License as published by
|
|
||||||
* the Free Software Foundation, either version 3 of the License, or
|
|
||||||
* (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU Affero General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU Affero General Public License
|
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
*/
|
|
||||||
|
|
||||||
//#pragma once
|
|
||||||
#include <unistd.h>
|
|
||||||
#include <stdbool.h>
|
|
||||||
#include <assert.h>
|
|
||||||
#include <sys/types.h>
|
|
||||||
#include <sys/stat.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <fcntl.h>
|
|
||||||
#include <epoxy/gl.h>
|
|
||||||
#include <GL/glu.h>
|
|
||||||
#include <GL/glext.h>
|
|
||||||
#include <glib-2.0/glib.h>
|
|
||||||
#include <math.h>
|
|
||||||
#include <errno.h>
|
|
||||||
|
|
||||||
#include "../../include/ui.h"
|
|
||||||
#include "../../include/graphics.h"
|
|
||||||
#include "../../include/buffers.h"
|
|
||||||
|
|
||||||
static long vertex_index = 0;
|
|
||||||
static long colors_index = 0;
|
|
||||||
static long lines_index = 0;
|
|
||||||
static long plans_index = 0;
|
|
||||||
|
|
||||||
|
|
||||||
#define V 0
|
|
||||||
|
|
||||||
static bool compute_space_2D(int size_x,
|
|
||||||
int size_y,
|
|
||||||
int size_z,
|
|
||||||
|
|
||||||
int pref_mark_unit_space,
|
|
||||||
int pref_style_lines_planes,
|
|
||||||
int pref_style_mix_colors,
|
|
||||||
|
|
||||||
GLfloat *vertex_origin,
|
|
||||||
GLfloat *colors_origin,
|
|
||||||
GLuint *lines_origin,
|
|
||||||
GLuint *plans_origin)
|
|
||||||
{
|
|
||||||
|
|
||||||
float x = 0;
|
|
||||||
// for (int k = 0; k < size_x + 1; k++) <=> + 1
|
|
||||||
// car on passe du nombre de cases = (n)
|
|
||||||
// au nombre de séparations entre les cases + les deux bords = (n + 1)
|
|
||||||
|
|
||||||
if (V) printf("space_2D vertex ");
|
|
||||||
for (int k = 0; k < size_x; k++){ // barres verticales
|
|
||||||
//
|
|
||||||
x = ((size_x % 2) * (size_x / 2 - k)
|
|
||||||
+ (size_x % 2 - 1) * (k + 0.5f - size_x / 2)) / size_x * 2;
|
|
||||||
|
|
||||||
if (V) printf("[%1.1f] ", x);
|
|
||||||
|
|
||||||
*(vertex_origin + k * 6 + 0) = - x;
|
|
||||||
*(vertex_origin + k * 6 + 1) = 1.0f / size_x;
|
|
||||||
*(vertex_origin + k * 6 + 2) = 0.0f;
|
|
||||||
|
|
||||||
*(vertex_origin + k * 6 + 3) = - x;
|
|
||||||
*(vertex_origin + k * 6 + 4) = - 1.0f / size_x;
|
|
||||||
*(vertex_origin + k * 6 + 5) = 0.0f;
|
|
||||||
|
|
||||||
// fun > if (k == size_x - 1) *(vertex_origin + k * 6 + 5) = 0.1f;
|
|
||||||
|
|
||||||
vertex_index += 6; if (V) printf(" => vertex_index = %3ld space 2D\n", vertex_index);
|
|
||||||
|
|
||||||
*(colors_origin + k * 6 + 0) = 1;
|
|
||||||
*(colors_origin + k * 6 + 1) = 0;
|
|
||||||
*(colors_origin + k * 6 + 2) = 0;
|
|
||||||
|
|
||||||
*(colors_origin + k * 6 + 3) = 1;
|
|
||||||
*(colors_origin + k * 6 + 4) = 1;
|
|
||||||
*(colors_origin + k * 6 + 5) = 0;
|
|
||||||
|
|
||||||
colors_index += 6;
|
|
||||||
|
|
||||||
*(lines_origin + k * 2 + 0) = k * 2 + 0;
|
|
||||||
*(lines_origin + k * 2 + 1) = k * 2 + 1;
|
|
||||||
|
|
||||||
lines_index += 2; if (V) printf(" => lines_index = %3ld space 2D\n", lines_index);
|
|
||||||
}
|
|
||||||
|
|
||||||
*(colors_origin + 0) = 0;
|
|
||||||
*(colors_origin + 1) = 0;
|
|
||||||
*(colors_origin + 2) = 0;
|
|
||||||
|
|
||||||
*(colors_origin + 3) = 1;
|
|
||||||
*(colors_origin + 4) = 1;
|
|
||||||
*(colors_origin + 5) = 1;
|
|
||||||
|
|
||||||
*(colors_origin + (size_x - 1) * 6 + 0) = 1;
|
|
||||||
*(colors_origin + (size_x - 1) * 6 + 1) = 1;
|
|
||||||
*(colors_origin + (size_x - 1) * 6 + 2) = 1;
|
|
||||||
|
|
||||||
*(colors_origin + (size_x - 1) * 6 + 3) = 0;
|
|
||||||
*(colors_origin + (size_x - 1) * 6 + 4) = 0;
|
|
||||||
*(colors_origin + (size_x - 1) * 6 + 5) = 0;
|
|
||||||
|
|
||||||
colors_index += 12; if (V) printf(" => colors_index = %ld\n", colors_index);
|
|
||||||
|
|
||||||
*(lines_origin + lines_index + 0) = 0;
|
|
||||||
*(lines_origin + lines_index + 1) = size_x * 2 - 2; // barre horizontale du bas
|
|
||||||
|
|
||||||
*(lines_origin + lines_index + 2) = 1;
|
|
||||||
*(lines_origin + lines_index + 3) = size_x * 2 - 1; // barre horizontale du haut
|
|
||||||
|
|
||||||
lines_index += 4; if (V) printf("H=> lines_index = %3ld space 2D H\n", lines_index);
|
|
||||||
|
|
||||||
if (pref_mark_unit_space == 1 || pref_mark_unit_space == 3) // diagonales to mark first space unit
|
|
||||||
{
|
|
||||||
*(lines_origin + lines_index + 0) = 0;
|
|
||||||
*(lines_origin + lines_index + 1) = 3;
|
|
||||||
|
|
||||||
*(lines_origin + lines_index + 2) = 1;
|
|
||||||
*(lines_origin + lines_index + 3) = 2;
|
|
||||||
|
|
||||||
lines_index += 4; if (V) printf("X=> lines_index = %3ld space 2D X\n", lines_index);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
if (pref_mark_unit_space == 2 || pref_mark_unit_space == 3) // diagonales to mark last space unit
|
|
||||||
{
|
|
||||||
*(lines_origin + lines_index + 0) = (size_x - 2) * 2 + 0;
|
|
||||||
*(lines_origin + lines_index + 1) = (size_x - 2) * 2 + 3;
|
|
||||||
|
|
||||||
*(lines_origin + lines_index + 2) = (size_x - 2) * 2 + 1;
|
|
||||||
*(lines_origin + lines_index + 3) = (size_x - 2) * 2 + 2;
|
|
||||||
|
|
||||||
lines_index +=4; if (V) printf("X=> lines_index = %3ld space 2D X\n", lines_index);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
if (V) printf(" n = %d x 2 côté = [%1.1f]\n", size_x + 1, 2.0f / size_x);
|
|
||||||
if (V) printf("space_2D lines_origin (%d - size_x(0)) x (%d - size_x(1)) ", 0, 1);
|
|
||||||
for (int v = 0; v < size_x + 2; v++)
|
|
||||||
if (V) printf("(%d-%d) ", *(lines_origin + v), *(lines_origin + v + 1));
|
|
||||||
if (V) printf(" n = 4 + (%d x 2)\n", size_x + 2);
|
|
||||||
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int compute_arrow_2D(int size_x,
|
|
||||||
int size_y,
|
|
||||||
int size_z,
|
|
||||||
|
|
||||||
int weight,
|
|
||||||
int site,
|
|
||||||
int x,
|
|
||||||
int y,
|
|
||||||
int z,
|
|
||||||
|
|
||||||
int pref_style_lines_planes,
|
|
||||||
int pref_style_mix_colors,
|
|
||||||
|
|
||||||
GLfloat *vertex_origin,
|
|
||||||
GLfloat *colors_origin,
|
|
||||||
GLuint *lines_origin,
|
|
||||||
GLuint *plans_origin)
|
|
||||||
{
|
|
||||||
printf("compute_arrow_2D load = %d site = %d x = %d\n", weight, site, x);
|
|
||||||
float zero = 0.0f;
|
|
||||||
float center = (1.0f / size_x) * (2 * x - size_x + 2);
|
|
||||||
float tip = center + (2 * site - 1) * (1.0f / size_x - 0.01f);
|
|
||||||
float base = center + (2 * site - 1) * (0.1f / size_x);
|
|
||||||
float lat = 0.4f / size_x;
|
|
||||||
|
|
||||||
/* for (int i = 0; i < size_x; i++) */
|
|
||||||
/* for (int j = 0; j < size_y; j++) */
|
|
||||||
/* for (int k = 0; k < size_z; k++) */
|
|
||||||
/* { */
|
|
||||||
|
|
||||||
/* x = - ((size_x % 2) * (size_x / 2 - i) */
|
|
||||||
/* - (size_x % 2 - 1) * (i + 0.5f - size_x / 2)) / size_x * 2 * EDGE; */
|
|
||||||
/* y = - ((size_x % 2) * (size_x / 2 - j) */
|
|
||||||
/* - (size_x % 2 - 1) * (j + 0.5f - size_x / 2)) / size_x * 2 * EDGE; */
|
|
||||||
/* z = - ((size_x % 2) * (size_x / 2 - k) */
|
|
||||||
/* - (size_x % 2 - 1) * (k + 0.5f - size_x / 2)) / size_x * 2 * EDGE; */
|
|
||||||
/* } */
|
|
||||||
|
|
||||||
*(vertex_origin + vertex_index + 0) = tip;
|
|
||||||
*(vertex_origin + vertex_index + 1) = zero;
|
|
||||||
*(vertex_origin + vertex_index + 2) = zero;
|
|
||||||
|
|
||||||
*(vertex_origin + vertex_index + 3) = base;
|
|
||||||
*(vertex_origin + vertex_index + 4) = lat;
|
|
||||||
*(vertex_origin + vertex_index + 5) = zero;
|
|
||||||
|
|
||||||
*(vertex_origin + vertex_index + 6) = base;
|
|
||||||
*(vertex_origin + vertex_index + 7) = - lat;
|
|
||||||
*(vertex_origin + vertex_index + 8) = zero;
|
|
||||||
|
|
||||||
vertex_index += 9; if (V) printf(" => vertex_index = %3ld arrow_2D\n", vertex_index);
|
|
||||||
|
|
||||||
if (pref_style_lines_planes == 0) {
|
|
||||||
|
|
||||||
if (V) printf("0=> lines_index = %ld\n", lines_index);
|
|
||||||
|
|
||||||
*(lines_origin + lines_index + 0) = vertex_index / 3 - 3;
|
|
||||||
*(lines_origin + lines_index + 1) = vertex_index / 3 - 2;
|
|
||||||
|
|
||||||
*(lines_origin + lines_index + 2) = vertex_index / 3 - 3;
|
|
||||||
*(lines_origin + lines_index + 3) = vertex_index / 3 - 1;
|
|
||||||
|
|
||||||
*(lines_origin + lines_index + 4) = vertex_index / 3 - 2;
|
|
||||||
*(lines_origin + lines_index + 5) = vertex_index / 3 - 1;
|
|
||||||
|
|
||||||
lines_index += 6; if (V) printf("|=> lines_index = %3ld arrow_2D\n", lines_index);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
if (pref_style_lines_planes == 1) {
|
|
||||||
*(plans_origin + plans_index + 0) = vertex_index / 3 + 0;
|
|
||||||
*(plans_origin + plans_index + 1) = vertex_index / 3 + 1;
|
|
||||||
*(plans_origin + plans_index + 2) = vertex_index / 3 + 2;
|
|
||||||
|
|
||||||
*(plans_origin + plans_index + 3) = vertex_index / 3 + 0;
|
|
||||||
*(plans_origin + plans_index + 4) = vertex_index / 3 + 1;
|
|
||||||
*(plans_origin + plans_index + 5) = vertex_index / 3 + 2;
|
|
||||||
|
|
||||||
plans_index += 6; if (V) printf("|=> plans_index = %ld\n", plans_index);
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* x = - ((size_x % 2) * (size_x / 2 - i) */
|
|
||||||
/* - (size_x % 2 - 1) * (i + 0.5f - size_x / 2)) / size_x * 2 * EDGE; */
|
|
||||||
/* y = - ((size_y % 2) * (size_y / 2 - j) */
|
|
||||||
/* - (size_y % 2 - 1) * (j + 0.5f - size_y / 2)) / size_y * 2 * EDGE; */
|
|
||||||
/* z = - ((size_z % 2) * (size_z / 2 - k) */
|
|
||||||
/* - (size_z % 2 - 1) * (k + 0.5f - size_z / 2)) / size_z * 2 * EDGE; */
|
|
||||||
|
|
||||||
static bool compute_arrow_3D(long size_x,
|
|
||||||
long size_y,
|
|
||||||
long size_z,
|
|
||||||
|
|
||||||
int weight,
|
|
||||||
int site, // North, South, East, West, Zenith, nAdir (NSEWZA)
|
|
||||||
long x,
|
|
||||||
long y,
|
|
||||||
long z,
|
|
||||||
|
|
||||||
int pref_style_lines_planes,
|
|
||||||
int pref_style_mix_colors,
|
|
||||||
|
|
||||||
GLfloat *vertex_origin,
|
|
||||||
GLfloat *colors_origin,
|
|
||||||
GLuint *lines_origin,
|
|
||||||
GLuint *plans_origin)
|
|
||||||
|
|
||||||
{
|
|
||||||
float zero = 0.0f;
|
|
||||||
float center = (1.0f / size_x) * (2 * x - size_x + 2);
|
|
||||||
float tip = center + (2 * site - 1) * (1.0f / size_x);
|
|
||||||
float base = center + (2 * site - 1) * (0.1f / size_x);
|
|
||||||
|
|
||||||
*(vertex_origin + vertex_index + 0) = center + (2 * site - 1) * (1.0f / size_x - 0.01f);
|
|
||||||
*(vertex_origin + vertex_index + 1) = zero;
|
|
||||||
*(vertex_origin + vertex_index + 2) = zero;
|
|
||||||
|
|
||||||
*(vertex_origin + vertex_index + 3) = base;
|
|
||||||
*(vertex_origin + vertex_index + 4) = 0.4f / size_x;
|
|
||||||
*(vertex_origin + vertex_index + 5) = 0.4f / size_x;
|
|
||||||
|
|
||||||
*(vertex_origin + vertex_index + 6) = base;
|
|
||||||
*(vertex_origin + vertex_index + 7) = 0.4f / size_x;
|
|
||||||
*(vertex_origin + vertex_index + 8) = - 0.4f / size_x;
|
|
||||||
|
|
||||||
*(vertex_origin + vertex_index + 9) = base;
|
|
||||||
*(vertex_origin + vertex_index + 10) = - 0.4f / size_x;
|
|
||||||
*(vertex_origin + vertex_index + 11) = - 0.4f / size_x;
|
|
||||||
|
|
||||||
*(vertex_origin + vertex_index + 12) = base;
|
|
||||||
*(vertex_origin + vertex_index + 13) = - 0.4f / size_x;
|
|
||||||
*(vertex_origin + vertex_index + 14) = 0.4f / size_x;
|
|
||||||
|
|
||||||
vertex_index += 15; if (V) printf(" => vertex_index = %3ld arrow_3D\n", vertex_index);
|
|
||||||
|
|
||||||
if (V) printf("center = %f tip = %f base = %f\n",\
|
|
||||||
center, tip, base); // size_x * 12=%d igap=%d
|
|
||||||
|
|
||||||
if (pref_style_lines_planes == 0) {
|
|
||||||
|
|
||||||
*(lines_origin + lines_index + 0) = vertex_index / 3 - 5;
|
|
||||||
*(lines_origin + lines_index + 1) = vertex_index / 3 - 4;
|
|
||||||
|
|
||||||
*(lines_origin + lines_index + 2) = vertex_index / 3 - 5;
|
|
||||||
*(lines_origin + lines_index + 3) = vertex_index / 3 - 3;
|
|
||||||
|
|
||||||
*(lines_origin + lines_index + 4) = vertex_index / 3 - 5;
|
|
||||||
*(lines_origin + lines_index + 5) = vertex_index / 3 - 2;
|
|
||||||
|
|
||||||
*(lines_origin + lines_index + 6) = vertex_index / 3 - 5;
|
|
||||||
*(lines_origin + lines_index + 7) = vertex_index / 3 - 1;
|
|
||||||
|
|
||||||
*(lines_origin + lines_index + 8) = vertex_index / 3 - 4;
|
|
||||||
*(lines_origin + lines_index + 9) = vertex_index / 3 - 3;
|
|
||||||
|
|
||||||
*(lines_origin + lines_index + 10) = vertex_index / 3 - 3;
|
|
||||||
*(lines_origin + lines_index + 11) = vertex_index / 3 - 2;
|
|
||||||
|
|
||||||
*(lines_origin + lines_index + 12) = vertex_index / 3 - 2;
|
|
||||||
*(lines_origin + lines_index + 13) = vertex_index / 3 - 1;
|
|
||||||
|
|
||||||
*(lines_origin + lines_index + 14) = vertex_index / 3 - 1;
|
|
||||||
*(lines_origin + lines_index + 15) = vertex_index / 3 - 4;
|
|
||||||
|
|
||||||
lines_index += 16; if (V) printf("|=> lines_index = %3ld arrow_3D\n", lines_index);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (pref_style_lines_planes == 1) {
|
|
||||||
|
|
||||||
*(plans_origin + plans_index + 0) = size_x * 12 / 3 + 0;
|
|
||||||
*(plans_origin + plans_index + 1) = size_x * 12 / 3 + 1;
|
|
||||||
*(plans_origin + plans_index + 2) = size_x * 12 / 3 + 2;
|
|
||||||
|
|
||||||
*(plans_origin + plans_index + 3) = size_x * 12 / 3 + 0;
|
|
||||||
*(plans_origin + plans_index + 4) = size_x * 12 / 3 + 3;
|
|
||||||
*(plans_origin + plans_index + 5) = size_x * 12 / 3 + 4;
|
|
||||||
|
|
||||||
*(plans_origin + plans_index + 0) = size_x * 12 / 3 + 0;
|
|
||||||
*(plans_origin + plans_index + 1) = size_x * 12 / 3 + 1;
|
|
||||||
*(plans_origin + plans_index + 2) = size_x * 12 / 3 + 3;
|
|
||||||
|
|
||||||
*(plans_origin + plans_index + 3) = size_x * 12 / 3 + 0;
|
|
||||||
*(plans_origin + plans_index + 4) = size_x * 12 / 3 + 2;
|
|
||||||
*(plans_origin + plans_index + 5) = size_x * 12 / 3 + 4;
|
|
||||||
|
|
||||||
plans_index += 12; if (V) printf("|=> plans_index = %3ld arrow_3D\n", plans_index);
|
|
||||||
}
|
|
||||||
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void old_arrows(int model_arrows_nb,
|
|
||||||
long model_size_x, long model_size_y, long model_size_z,
|
|
||||||
int pref_style_lines_planes, int pref_style_mix_colors,
|
|
||||||
GLuint *arrows, GLfloat *vertex_origin, GLfloat *colors_origin,
|
|
||||||
GLuint *lines_origin, GLuint *plans_origin)
|
|
||||||
{
|
|
||||||
for (int i = 0; i < model_arrows_nb; i++)
|
|
||||||
compute_arrow_3D (model_size_x,
|
|
||||||
model_size_y,
|
|
||||||
model_size_z,
|
|
||||||
|
|
||||||
*(arrows + i * 5 + 0), // weight (load)
|
|
||||||
*(arrows + i * 5 + 1), // site
|
|
||||||
*(arrows + i * 5 + 2), // x
|
|
||||||
*(arrows + i * 5 + 3), // y
|
|
||||||
*(arrows + i * 5 + 4), // z
|
|
||||||
|
|
||||||
pref_style_lines_planes,
|
|
||||||
pref_style_mix_colors,
|
|
||||||
|
|
||||||
vertex_origin,
|
|
||||||
colors_origin,
|
|
||||||
lines_origin,
|
|
||||||
plans_origin);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// OLD ARROWS (DEPRECATED)
|
|
||||||
/* old_arrows (model_arrows_nb, model_size_x, model_size_y, model_size_z, arrows, */
|
|
||||||
/* pref_style_lines_planes, pref_style_mix_colors, */
|
|
||||||
/* vertex_origin, colors_origin, lines_origin, plans_origin); */
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue