Merge branch 'experimental' of https://gitea.axiolutions.com/software/manigraph into experimental
This commit is contained in:
13
src/main.c
13
src/main.c
@@ -48,7 +48,8 @@ extern volatile unsigned char animate_index;
|
|||||||
static inline
|
static inline
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
void main_loop(void)
|
void
|
||||||
|
main_loop(void)
|
||||||
{
|
{
|
||||||
quat_t q;
|
quat_t q;
|
||||||
|
|
||||||
@@ -84,17 +85,17 @@ void main_loop(void)
|
|||||||
|
|
||||||
#ifndef DEBUG
|
#ifndef DEBUG
|
||||||
load_mdl_matrix(shader_plain, 0, 0);
|
load_mdl_matrix(shader_plain, 0, 0);
|
||||||
draw_mesh(m_axis, 1);
|
draw_mesh(m_axis);
|
||||||
load_mdl_matrix(shader_plain, 1, 1);
|
load_mdl_matrix(shader_plain, 1, 1);
|
||||||
draw_mesh(m_axis, 1);
|
draw_mesh(m_axis);
|
||||||
load_mdl_matrix(shader_plain, 2, 2);
|
load_mdl_matrix(shader_plain, 2, 2);
|
||||||
draw_mesh(m_axis, 1);
|
draw_mesh(m_axis);
|
||||||
#endif
|
#endif
|
||||||
load_mdl_matrix(shader, 0, 3);
|
load_mdl_matrix(shader, 0, 3);
|
||||||
draw_mesh(m_surface, 0);
|
draw_mesh(m_surface);
|
||||||
|
|
||||||
load_mdl_matrix(shader_plain, 0, 3);
|
load_mdl_matrix(shader_plain, 0, 3);
|
||||||
draw_mesh(m_surface, 1);
|
draw_mesh_lines(m_surface);
|
||||||
}
|
}
|
||||||
|
|
||||||
int main(void)
|
int main(void)
|
||||||
|
|||||||
@@ -57,7 +57,9 @@ void set_projection_mesh( struct projection );
|
|||||||
|
|
||||||
void destroy_mesh(mesh_t p);
|
void destroy_mesh(mesh_t p);
|
||||||
|
|
||||||
void draw_mesh(mesh_t p, char lines);
|
void draw_mesh(mesh_t p);
|
||||||
|
|
||||||
|
void draw_mesh_lines(mesh_t p);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Set background color:
|
Set background color:
|
||||||
|
|||||||
BIN
src/main.o
BIN
src/main.o
Binary file not shown.
18
src/mesh.c
18
src/mesh.c
@@ -91,19 +91,19 @@ void destroy_mesh(mesh_t p)
|
|||||||
free(p);
|
free(p);
|
||||||
}
|
}
|
||||||
|
|
||||||
void draw_mesh(mesh_t p, char lines )
|
void draw_mesh(mesh_t p)
|
||||||
{
|
{
|
||||||
struct obj *obj = p;
|
struct obj *obj = p;
|
||||||
|
|
||||||
glBindVertexArray(obj->vao);
|
glBindVertexArray(obj->vao);
|
||||||
if( lines )
|
glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
|
||||||
{
|
|
||||||
int i;
|
|
||||||
for (i = 0; i < obj->vertex; i += 3)
|
|
||||||
glDrawArrays(GL_LINE_LOOP, i, 3);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
glDrawArrays(GL_TRIANGLES, 0, obj->vertex);
|
glDrawArrays(GL_TRIANGLES, 0, obj->vertex);
|
||||||
}
|
}
|
||||||
|
void draw_mesh_lines(mesh_t p)
|
||||||
|
{
|
||||||
|
struct obj *obj = p;
|
||||||
|
|
||||||
|
glBindVertexArray(obj->vao);
|
||||||
|
glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
|
||||||
|
glDrawArrays(GL_TRIANGLES, 0, obj->vertex);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -20,6 +20,7 @@
|
|||||||
#ifdef TEST
|
#ifdef TEST
|
||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
#endif
|
#endif
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
typedef void (*function_t)(float *, int *, int);
|
typedef void (*function_t)(float *, int *, int);
|
||||||
|
|
||||||
@@ -62,8 +63,13 @@ void riemman(float *d_surface, int *coords, int grid)
|
|||||||
|
|
||||||
void cube(float *d_surface, int *coord, int grid)
|
void cube(float *d_surface, int *coord, int grid)
|
||||||
{
|
{
|
||||||
for (int i = 0; i < parm.m; i++)
|
int i;
|
||||||
d_surface[i] = ((float)coord[i] / grid) - 0.5;
|
|
||||||
|
for (i = 0; i < parm.m; i++)
|
||||||
|
d_surface[i] = (2 * (float)coord[i] / grid) - 1;
|
||||||
|
|
||||||
|
if (parm.m == 2)
|
||||||
|
d_surface[2] = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void sphere(float *d_surface, int *coord, int grid)
|
void sphere(float *d_surface, int *coord, int grid)
|
||||||
@@ -138,13 +144,19 @@ float *generate_data_surface(unsigned char *s)
|
|||||||
unsigned int i, j, k, o, p, n;
|
unsigned int i, j, k, o, p, n;
|
||||||
long size, q = 0;
|
long size, q = 0;
|
||||||
float *d_surface;
|
float *d_surface;
|
||||||
|
|
||||||
int *cara;
|
int *cara;
|
||||||
|
|
||||||
|
<<<<<<< HEAD
|
||||||
parm.f = lens;
|
parm.f = lens;
|
||||||
parm.m = 4;
|
parm.m = 4;
|
||||||
parm.n = 4;
|
parm.n = 4;
|
||||||
parm.grid = 5;
|
parm.grid = 5;
|
||||||
|
=======
|
||||||
|
parm.f = klein;
|
||||||
|
parm.m = 2;
|
||||||
|
parm.n = 4;
|
||||||
|
parm.grid = 16;
|
||||||
|
>>>>>>> b19100424dbeaf4a4ecc88ddfc633b0c34fd0010
|
||||||
|
|
||||||
#ifdef TEST
|
#ifdef TEST
|
||||||
assert(numero_caras(2) == 1);
|
assert(numero_caras(2) == 1);
|
||||||
@@ -152,9 +164,13 @@ float *generate_data_surface(unsigned char *s)
|
|||||||
assert(numero_caras(4) == 24);
|
assert(numero_caras(4) == 24);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
<<<<<<< HEAD
|
||||||
cara = malloc(parm.m * sizeof(int));
|
cara = malloc(parm.m * sizeof(int));
|
||||||
|
=======
|
||||||
|
>>>>>>> b19100424dbeaf4a4ecc88ddfc633b0c34fd0010
|
||||||
*s = parm.n;
|
*s = parm.n;
|
||||||
|
|
||||||
|
cara = malloc(parm.m * sizeof(int));
|
||||||
size = parm.grid * parm.grid * 6 * (parm.n) * numero_caras(parm.m);
|
size = parm.grid * parm.grid * 6 * (parm.n) * numero_caras(parm.m);
|
||||||
d_surface = malloc((size + 1) * sizeof(float));
|
d_surface = malloc((size + 1) * sizeof(float));
|
||||||
d_surface[0] = size;
|
d_surface[0] = size;
|
||||||
@@ -178,11 +194,12 @@ float *generate_data_surface(unsigned char *s)
|
|||||||
{
|
{
|
||||||
for (j = 0; j < parm.grid; j++)
|
for (j = 0; j < parm.grid; j++)
|
||||||
{
|
{
|
||||||
cara[o] = i;
|
cara[p] = i;
|
||||||
cara[p] = j;
|
cara[o] = j;
|
||||||
parm.f(&d_surface[q + 1], cara, parm.grid);
|
parm.f(&d_surface[q + 1], cara, parm.grid);
|
||||||
q += parm.n;
|
q += parm.n;
|
||||||
|
|
||||||
|
<<<<<<< HEAD
|
||||||
cara[o] = i + 1;
|
cara[o] = i + 1;
|
||||||
cara[p] = j;
|
cara[p] = j;
|
||||||
parm.f(&d_surface[q + 1], cara, parm.grid);
|
parm.f(&d_surface[q + 1], cara, parm.grid);
|
||||||
@@ -190,14 +207,24 @@ float *generate_data_surface(unsigned char *s)
|
|||||||
|
|
||||||
cara[o] = i + 1;
|
cara[o] = i + 1;
|
||||||
cara[p] = j + 1;
|
cara[p] = j + 1;
|
||||||
|
=======
|
||||||
|
cara[p] = i + 1;
|
||||||
|
cara[o] = j;
|
||||||
parm.f(&d_surface[q + 1], cara, parm.grid);
|
parm.f(&d_surface[q + 1], cara, parm.grid);
|
||||||
q += parm.n;
|
q += parm.n;
|
||||||
|
|
||||||
cara[o] = i;
|
cara[p] = i + 1;
|
||||||
cara[p] = j;
|
cara[o] = j + 1;
|
||||||
|
>>>>>>> b19100424dbeaf4a4ecc88ddfc633b0c34fd0010
|
||||||
parm.f(&d_surface[q + 1], cara, parm.grid);
|
parm.f(&d_surface[q + 1], cara, parm.grid);
|
||||||
q += parm.n;
|
q += parm.n;
|
||||||
|
|
||||||
|
cara[p] = i;
|
||||||
|
cara[o] = j;
|
||||||
|
parm.f(&d_surface[q + 1], cara, parm.grid);
|
||||||
|
q += parm.n;
|
||||||
|
|
||||||
|
<<<<<<< HEAD
|
||||||
cara[o] = i;
|
cara[o] = i;
|
||||||
cara[p] = j + 1;
|
cara[p] = j + 1;
|
||||||
parm.f(&d_surface[q + 1], cara, parm.grid);
|
parm.f(&d_surface[q + 1], cara, parm.grid);
|
||||||
@@ -205,6 +232,15 @@ float *generate_data_surface(unsigned char *s)
|
|||||||
|
|
||||||
cara[o] = i + 1;
|
cara[o] = i + 1;
|
||||||
cara [p] = j + 1;
|
cara [p] = j + 1;
|
||||||
|
=======
|
||||||
|
cara[p] = i;
|
||||||
|
cara[o] = j + 1;
|
||||||
|
parm.f(&d_surface[q + 1], cara, parm.grid);
|
||||||
|
q += parm.n;
|
||||||
|
|
||||||
|
cara[p] = i + 1;
|
||||||
|
cara[o] = j + 1;
|
||||||
|
>>>>>>> b19100424dbeaf4a4ecc88ddfc633b0c34fd0010
|
||||||
parm.f(&d_surface[q + 1], cara, parm.grid);
|
parm.f(&d_surface[q + 1], cara, parm.grid);
|
||||||
q += parm.n;
|
q += parm.n;
|
||||||
}
|
}
|
||||||
@@ -237,26 +273,30 @@ static void __calculate_normal(
|
|||||||
Calculate a normal vector of a plain using Gram-Schmidt process
|
Calculate a normal vector of a plain using Gram-Schmidt process
|
||||||
*/
|
*/
|
||||||
{
|
{
|
||||||
for (i = 0; i < n; ++i) {
|
for (i = 0; i < n; ++i)
|
||||||
|
{
|
||||||
v1[i] = p2[i] - p1[i];
|
v1[i] = p2[i] - p1[i];
|
||||||
v2[i] = p3[i] - p1[i];
|
v2[i] = p3[i] - p1[i];
|
||||||
v3[i] = p1[i];
|
v3[i] = p1[i];
|
||||||
}
|
}
|
||||||
|
|
||||||
for (i = 0; i < n; ++i) {
|
for (i = 0; i < n; ++i)
|
||||||
|
{
|
||||||
u1[i] = v1[i];
|
u1[i] = v1[i];
|
||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
float proj[n];
|
float proj[n];
|
||||||
float dot_v2_u1 = 0.0f, dot_u1_u1 = 0.0f;
|
float dot_v2_u1 = 0.0f, dot_u1_u1 = 0.0f;
|
||||||
for (i = 0; i < n; ++i) {
|
for (i = 0; i < n; ++i)
|
||||||
|
{
|
||||||
dot_v2_u1 += v2[i] * u1[i];
|
dot_v2_u1 += v2[i] * u1[i];
|
||||||
dot_u1_u1 += u1[i] * u1[i];
|
dot_u1_u1 += u1[i] * u1[i];
|
||||||
}
|
}
|
||||||
alpha = dot_v2_u1 / dot_u1_u1;
|
alpha = dot_v2_u1 / dot_u1_u1;
|
||||||
|
|
||||||
for (i = 0; i < n; ++i) {
|
for (i = 0; i < n; ++i)
|
||||||
|
{
|
||||||
proj[i] = u1[i] * alpha;
|
proj[i] = u1[i] * alpha;
|
||||||
u2[i] = v2[i] - proj[i];
|
u2[i] = v2[i] - proj[i];
|
||||||
}
|
}
|
||||||
@@ -267,31 +307,37 @@ static void __calculate_normal(
|
|||||||
float dot_v3_u1 = 0.0f, dot_u1_u1 = 0.0f;
|
float dot_v3_u1 = 0.0f, dot_u1_u1 = 0.0f;
|
||||||
float dot_v3_u2 = 0.0f, dot_u2_u2 = 0.0f;
|
float dot_v3_u2 = 0.0f, dot_u2_u2 = 0.0f;
|
||||||
|
|
||||||
for (i = 0; i < n; ++i) {
|
for (i = 0; i < n; ++i)
|
||||||
|
{
|
||||||
dot_v3_u1 += v3[i] * u1[i];
|
dot_v3_u1 += v3[i] * u1[i];
|
||||||
dot_u1_u1 += u1[i] * u1[i];
|
dot_u1_u1 += u1[i] * u1[i];
|
||||||
}
|
}
|
||||||
for (i = 0; i < n; ++i) {
|
for (i = 0; i < n; ++i)
|
||||||
|
{
|
||||||
proj1[i] = u1[i] * (dot_v3_u1 / dot_u1_u1);
|
proj1[i] = u1[i] * (dot_v3_u1 / dot_u1_u1);
|
||||||
}
|
}
|
||||||
|
|
||||||
for (i = 0; i < n; ++i) {
|
for (i = 0; i < n; ++i)
|
||||||
|
{
|
||||||
dot_v3_u2 += v3[i] * u2[i];
|
dot_v3_u2 += v3[i] * u2[i];
|
||||||
dot_u2_u2 += u2[i] * u2[i];
|
dot_u2_u2 += u2[i] * u2[i];
|
||||||
}
|
}
|
||||||
for (i = 0; i < n; ++i) {
|
for (i = 0; i < n; ++i)
|
||||||
|
{
|
||||||
proj2[i] = u2[i] * (dot_v3_u2 / dot_u2_u2);
|
proj2[i] = u2[i] * (dot_v3_u2 / dot_u2_u2);
|
||||||
u3[i] = v3[i] - proj1[i] - proj2[i];
|
u3[i] = v3[i] - proj1[i] - proj2[i];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
float magnitude = 0.0f;
|
float magnitude = 0.0f;
|
||||||
for (i = 0; i < n; ++i) {
|
for (i = 0; i < n; ++i)
|
||||||
|
{
|
||||||
magnitude += u3[i] * u3[i];
|
magnitude += u3[i] * u3[i];
|
||||||
}
|
}
|
||||||
magnitude = sqrtf(magnitude);
|
magnitude = sqrtf(magnitude);
|
||||||
|
|
||||||
for (i = 0; i < n; ++i) {
|
for (i = 0; i < n; ++i)
|
||||||
|
{
|
||||||
normal[i] = u3[i] / magnitude;
|
normal[i] = u3[i] / magnitude;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -305,7 +351,6 @@ static void __calculate_normal(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
float *generate_normals_surface(float *d, unsigned char m)
|
float *generate_normals_surface(float *d, unsigned char m)
|
||||||
{
|
{
|
||||||
float *n;
|
float *n;
|
||||||
@@ -318,7 +363,6 @@ float *generate_normals_surface(float *d, unsigned char m)
|
|||||||
for (int i = 0; i < *d; i += 3 * m)
|
for (int i = 0; i < *d; i += 3 * m)
|
||||||
{
|
{
|
||||||
|
|
||||||
|
|
||||||
__calculate_normal(
|
__calculate_normal(
|
||||||
(d + 1) + i, (d + 1) + i + m, (d + 1) + i + 2 * m, norm_vec, m);
|
(d + 1) + i, (d + 1) + i + m, (d + 1) + i + 2 * m, norm_vec, m);
|
||||||
glm_vec3_copy(norm_vec, (n + 1) + i);
|
glm_vec3_copy(norm_vec, (n + 1) + i);
|
||||||
|
|||||||
Reference in New Issue
Block a user