Merge branch 'main' into roberto
This commit is contained in:
361
src/main.c
Executable file → Normal file
361
src/main.c
Executable file → Normal file
@@ -2,231 +2,194 @@
|
||||
#include "data/axis.h"
|
||||
#include "data/shaders.h"
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <GL/glew.h>
|
||||
|
||||
#define CGLM_ALL_UNALIGNED
|
||||
#include <cglm/vec3.h>
|
||||
#include <cglm/vec4.h>
|
||||
#include <string.h>
|
||||
|
||||
#define WIDTH 512
|
||||
#define HEIGHT 512
|
||||
|
||||
unsigned char coordanate[4] = {0,1,2,3};
|
||||
#ifdef EMSCRIPTEN
|
||||
#include <emscripten.h>
|
||||
#endif
|
||||
|
||||
unsigned char palette[] =
|
||||
{
|
||||
16,
|
||||
0xEB,0xD3,0xF8,0xff,
|
||||
0xEB,0xD4,0xF8,0xff,
|
||||
0xEB,0xD5,0xF8,0xff,
|
||||
0x7A,0x1C,0xAC,0xff,
|
||||
float *generate_data_surface(unsigned int, unsigned char *);
|
||||
float *generate_normals_surface(float *, unsigned char);
|
||||
|
||||
const char *wname = "manigraph: manifold grapher";
|
||||
|
||||
struct projection projection = {.x = 0, .y = 1, .z = 2, .w = 3};
|
||||
|
||||
unsigned char palette[][4] = {
|
||||
{0xEB, 0xD3, 0xF8, 0xff},
|
||||
{0xEB, 0xD4, 0xF8, 0xff},
|
||||
{0xEB, 0xD5, 0xF8, 0xff},
|
||||
{0x7A, 0x1C, 0xAC, 0xff},
|
||||
};
|
||||
|
||||
void calc_normal(float* p1, float* p2, float* p3, float* normal, unsigned char n) {
|
||||
float **u;
|
||||
float alpha;
|
||||
vec4 v1, v2, v3;
|
||||
vec4 u1, u2, u3;
|
||||
|
||||
switch (n) {
|
||||
case 3:
|
||||
glm_vec3_sub(p2, p1, v1);
|
||||
glm_vec3_sub(p3, p1, v2);
|
||||
|
||||
glm_vec3_cross(v1, v2, normal);
|
||||
glm_vec3_normalize(normal);
|
||||
return;
|
||||
#if 0
|
||||
case 4:
|
||||
glm_vec4_sub(p2, p1, v1);
|
||||
glm_vec4_sub(p3, p1, v2);
|
||||
glm_vec4_copy(p1, v3);
|
||||
glm_vec4_copy(v1, u1);
|
||||
{
|
||||
vec4 proj;
|
||||
alpha = glm_vec4_dot(v2, u1) / glm_vec4_dot(u1, u1);
|
||||
glm_vec4_scale(u1, alpha, proj);
|
||||
glm_vec4_sub(v2, proj, u2);
|
||||
}
|
||||
|
||||
{
|
||||
vec4 proj1, proj2;
|
||||
alpha = glm_vec4_dot(v3, u1) / glm_vec4_dot(u1, u1);
|
||||
glm_vec4_scale(u1, alpha, proj1);
|
||||
|
||||
alpha = glm_vec4_dot(v3, u2) / glm_vec4_dot(u2, u2);
|
||||
glm_vec4_scale(u2, alpha, proj2);
|
||||
|
||||
glm_vec4_sub(v3, proj1, u3);
|
||||
glm_vec4_sub(u3, proj2, u3);
|
||||
}
|
||||
|
||||
glm_vec4_copy(u3, normal);
|
||||
glm_vec4_normalize(normal);
|
||||
return;
|
||||
void mlog(char *msg)
|
||||
{
|
||||
#ifdef DEBUG
|
||||
printf(msg);
|
||||
#endif
|
||||
default:
|
||||
u = malloc((n - 1) * sizeof(float*));
|
||||
for (unsigned char i = 0; i < n - 1; i++) {
|
||||
u[i] = malloc(n * sizeof(float));
|
||||
}
|
||||
|
||||
for (unsigned char i = 0; i < n - 1; i++) {
|
||||
float* vi = malloc(n * sizeof(float));
|
||||
for (unsigned char j = 0; j < n; j++) {
|
||||
vi[j] = p2[j] - p1[j];
|
||||
}
|
||||
|
||||
for (unsigned char j = 0; j < i; j++) {
|
||||
float dot_vu = 0.0f, dot_uu = 0.0f;
|
||||
|
||||
for (unsigned char k = 0; k < n; k++) {
|
||||
dot_vu += vi[k] * u[j][k];
|
||||
dot_uu += u[j][k] * u[j][k];
|
||||
}
|
||||
|
||||
for (unsigned char k = 0; k < n; k++) {
|
||||
vi[k] -= (dot_vu / dot_uu) * u[j][k];
|
||||
}
|
||||
}
|
||||
|
||||
memcpy(u[i], vi, n * sizeof(float));
|
||||
free(vi);
|
||||
}
|
||||
|
||||
memcpy(normal, u[n - 2], n * sizeof(float));
|
||||
|
||||
float norm = 0.0f;
|
||||
for (unsigned char i = 0; i < n; i++) {
|
||||
norm += normal[i] * normal[i];
|
||||
}
|
||||
norm = sqrtf(norm);
|
||||
for (unsigned char i = 0; i < n; i++) {
|
||||
normal[i] /= norm;
|
||||
}
|
||||
|
||||
for (unsigned char i = 0; i < n - 1; i++) {
|
||||
free(u[i]);
|
||||
}
|
||||
free(u);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
float * fill_normal( float * d, unsigned char m )
|
||||
window_t window;
|
||||
mesh_t m_surface, m_axis;
|
||||
id_t shader, shader_plain;
|
||||
|
||||
#ifndef EMSCRIPTEN
|
||||
static inline
|
||||
#endif
|
||||
void
|
||||
main_loop(void)
|
||||
{
|
||||
float * n;
|
||||
n = malloc( (*d+1)*sizeof(float));
|
||||
*n = *d;
|
||||
for (int i = 0; i < *d; i += 3*m)
|
||||
{
|
||||
quat_t q;
|
||||
|
||||
vec4 norm_vec;
|
||||
q = poll_input(window);
|
||||
load_rot_matrix(shader, q);
|
||||
load_rot_matrix(shader_plain, q);
|
||||
|
||||
calc_normal((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+m );
|
||||
glm_vec3_copy( norm_vec, (n+1)+i+2*m );
|
||||
}
|
||||
return n;
|
||||
}
|
||||
|
||||
const char * wname = "manigraph: manifold grapher";
|
||||
float * generate_surface();
|
||||
|
||||
int main( void )
|
||||
{
|
||||
id_t shader, texture, shader_plain;
|
||||
mesh_t m_cube, m_axis;
|
||||
window_t window;
|
||||
|
||||
if( !( window = init_window( WIDTH, HEIGHT, wname ) ) )
|
||||
goto error_window;
|
||||
|
||||
use_window( window );
|
||||
set_clean_color_context( 0x2E, 0x07, 0x3F );
|
||||
|
||||
glewInit();
|
||||
|
||||
texture=create_palette_texture( palette );
|
||||
use_texture( texture );
|
||||
|
||||
if( !( shader = create_shader() ) )
|
||||
goto error_shader;
|
||||
gload_program( shader, vs, VERTEX );
|
||||
gload_program( shader, fs, FRAGMENT );
|
||||
|
||||
if( !( shader_plain = create_shader() ) )
|
||||
goto error_shader_plain;
|
||||
gload_program( shader_plain, vs, VERTEX );
|
||||
gload_program( shader_plain, fs_plain, FRAGMENT );
|
||||
|
||||
load_fix_matrix( shader, (float)WIDTH/HEIGHT );
|
||||
load_fix_matrix( shader_plain, (float)WIDTH/HEIGHT );
|
||||
|
||||
/* Fill m_cube */
|
||||
{
|
||||
float * n_cube, *d_cube;
|
||||
d_cube = generate_surface(16);
|
||||
n_cube = fill_normal( d_cube, 4 );
|
||||
if( !( m_cube = create_mesh( d_cube, n_cube, coordanate, 4 ) ) )
|
||||
goto error_mesh_cube;
|
||||
free( n_cube );
|
||||
free( d_cube);
|
||||
}
|
||||
|
||||
/* Fill m_axis */
|
||||
{
|
||||
float * n_axis;
|
||||
n_axis = fill_normal( d_axis, 3 );
|
||||
if( !( m_axis = create_mesh( d_axis, n_axis, coordanate, 3 ) ) )
|
||||
goto error_mesh_axis;
|
||||
free( n_axis );
|
||||
}
|
||||
|
||||
while( is_open_window( window ) )
|
||||
{
|
||||
quat_t q;
|
||||
|
||||
q=poll_input( window );
|
||||
load_rot_matrix( shader, q );
|
||||
load_rot_matrix( shader_plain, q );
|
||||
|
||||
clean_context();
|
||||
clean_context();
|
||||
|
||||
#ifndef DEBUG
|
||||
load_mdl_matrix( shader_plain, 0, 0 );
|
||||
draw_mesh( m_axis );
|
||||
load_mdl_matrix( shader_plain, 1, 1 );
|
||||
draw_mesh( m_axis );
|
||||
load_mdl_matrix( shader_plain, 2, 2 );
|
||||
draw_mesh( m_axis );
|
||||
load_mdl_matrix(shader_plain, 0, 0);
|
||||
draw_mesh(m_axis);
|
||||
load_mdl_matrix(shader_plain, 1, 1);
|
||||
draw_mesh(m_axis);
|
||||
load_mdl_matrix(shader_plain, 2, 2);
|
||||
draw_mesh(m_axis);
|
||||
load_mdl_matrix(shader, 0, 3);
|
||||
#else
|
||||
load_mdl_matrix(shader_plain, 0, 3);
|
||||
#endif
|
||||
draw_mesh(m_surface);
|
||||
}
|
||||
|
||||
load_mdl_matrix( shader, 0, 3 );
|
||||
draw_mesh( m_cube );
|
||||
int main(void)
|
||||
{
|
||||
id_t texture;
|
||||
|
||||
mlog("[VENTANA] Inicializando...\n");
|
||||
{
|
||||
if (!(window = init_window(WIDTH, HEIGHT, wname)))
|
||||
{
|
||||
mlog("[VENTANA] Error al inicializar...\n");
|
||||
goto error_window;
|
||||
}
|
||||
|
||||
use_window(window);
|
||||
}
|
||||
|
||||
destroy_mesh( m_axis );
|
||||
destroy_mesh( m_cube );
|
||||
destroy_shader( shader_plain );
|
||||
destroy_shader( shader );
|
||||
destroy_texture( texture );
|
||||
close_window( window );
|
||||
mlog("[CONTEXT] Inicializando...\n");
|
||||
{
|
||||
if (!(init_context()))
|
||||
{
|
||||
mlog("[CONTEXT] Error al inicializar...\n");
|
||||
goto error_context;
|
||||
}
|
||||
set_clean_color_context(0x2E, 0x07, 0x3F);
|
||||
}
|
||||
|
||||
mlog("[TEXTURE] Inicializando...\n");
|
||||
{
|
||||
texture = create_palette_texture(palette, 4);
|
||||
use_texture(texture);
|
||||
}
|
||||
|
||||
mlog("[SHADER] Inicializando...\n");
|
||||
{
|
||||
if (!(shader = create_shader()))
|
||||
{
|
||||
mlog("[SHADER] Error al inicializar...\n");
|
||||
goto error_shader;
|
||||
}
|
||||
load_program_to_shader(shader, vs, VERTEX);
|
||||
load_program_to_shader(shader, fs, FRAGMENT);
|
||||
load_fix_matrix(shader, (float)WIDTH / HEIGHT);
|
||||
}
|
||||
|
||||
mlog("[SHADER] Inicializando...\n");
|
||||
{
|
||||
if (!(shader_plain = create_shader()))
|
||||
{
|
||||
mlog("[SHADER] Error al inicializar...\n");
|
||||
goto error_shader_plain;
|
||||
}
|
||||
load_program_to_shader(shader_plain, vs, VERTEX);
|
||||
load_program_to_shader(shader_plain, fs_plain, FRAGMENT);
|
||||
load_fix_matrix(shader_plain, (float)WIDTH / HEIGHT);
|
||||
}
|
||||
|
||||
mlog("[MESH] Inicializando...\n");
|
||||
{
|
||||
unsigned char m;
|
||||
float *n_surface, *d_surface;
|
||||
d_surface = generate_data_surface(16, &m);
|
||||
n_surface = generate_normals_surface(d_surface, m);
|
||||
|
||||
projection.m = m;
|
||||
|
||||
if (!(m_surface = create_mesh(d_surface, n_surface, m)))
|
||||
{
|
||||
mlog("[MESH] Error al inicializar...\n");
|
||||
goto error_mesh_surface;
|
||||
}
|
||||
|
||||
projection.mesh = m_surface;
|
||||
|
||||
free(n_surface);
|
||||
free(d_surface);
|
||||
}
|
||||
|
||||
mlog("[MESH] Inicializando...\n");
|
||||
{
|
||||
if (!(m_axis = create_mesh(d_axis, NULL, 3)))
|
||||
{
|
||||
mlog("[MESH] Error al inicializar...\n");
|
||||
goto error_mesh_axis;
|
||||
}
|
||||
}
|
||||
|
||||
mlog("[MAIN LOOP] Inicializando...\n");
|
||||
#ifdef EMSCRIPTEN
|
||||
emscripten_set_main_loop(&main_loop, 0, 1);
|
||||
#else
|
||||
while (is_open_window(window))
|
||||
main_loop();
|
||||
#endif
|
||||
mlog("[MAIN LOOP] Terminando...\n");
|
||||
|
||||
mlog("[MESH] Destruyendo...\n");
|
||||
destroy_mesh(m_axis);
|
||||
mlog("[MESH] Destruyendo...\n");
|
||||
destroy_mesh(m_surface);
|
||||
mlog("[SHADER] Destruyendo...\n");
|
||||
destroy_shader(shader_plain);
|
||||
mlog("[SHADER] Destruyendo...\n");
|
||||
destroy_shader(shader);
|
||||
mlog("[TEXTURE] Destruyendo...\n");
|
||||
destroy_texture(texture);
|
||||
mlog("[WINDOW] Destruyendo...\n");
|
||||
close_window(window);
|
||||
return 0;
|
||||
|
||||
mlog("[MESH] Destruyendo...\n");
|
||||
destroy_mesh(m_axis);
|
||||
error_mesh_axis:
|
||||
destroy_mesh( m_cube );
|
||||
error_mesh_cube:
|
||||
destroy_shader( shader_plain );
|
||||
mlog("[MESH] Destruyendo...\n");
|
||||
destroy_mesh(m_surface);
|
||||
error_mesh_surface:
|
||||
mlog("[SHADER] Destruyendo...\n");
|
||||
destroy_shader(shader_plain);
|
||||
error_shader_plain:
|
||||
destroy_shader( shader );
|
||||
mlog("[SHADER] Destruyendo...\n");
|
||||
destroy_shader(shader);
|
||||
error_shader:
|
||||
close_window( window );
|
||||
destroy_texture( texture );
|
||||
mlog("[TEXTURE] Destruyendo...\n");
|
||||
destroy_texture(texture);
|
||||
error_context:
|
||||
mlog("[WINDOW] Destruyendo...\n");
|
||||
close_window(window);
|
||||
error_window:
|
||||
return 1;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user