diff --git a/README.md b/README.md index bddc67b..c6cc299 100644 --- a/README.md +++ b/README.md @@ -5,6 +5,8 @@ explore each dimension in an intuitive and dynamic way. Import your .klein files, which represents multidimentional surface. # Building +Manigraph is written in C99, and uses OpenGL 2.0 for the rendering. So you just +need a C compiler to build this project. ## Source code ``` @@ -32,3 +34,25 @@ make linux-wayland make cocoa make CC=emcc wasm ``` + +# Design +Manigraph is a program designed with sustainability in mind. It is built to be +portable, resource-efficient, and easy to maintain and scale. The program +follows a Data-Oriented Programming (DOP) paradigm, where each file is +responsible for a specific data type and manages its own dependencies. Each +function is named after the file it resides in, ensuring a clear organization +and structure. + +The independence of data types allows for efficient scaling and maintenance. +The main file is a special case in this design: it is responsible for combining +all the data types in a comprehensive manner, actng as the workflow of the program. + +# Contributing +Before commiting use `clang-format`, for coding style consistency. Your +contribution must be whitin the design principles and the concept of Manigraph. + +The following diagram illustrates the relationships between files, showing how +they are connected through dependencies. It also highlights the scenarios where +files are not independent of one another, + +![File layout](doc/file_layout.svg) diff --git a/doc/es/dev/estructura-archivos.md b/doc/es/dev/estructura-archivos.md deleted file mode 100644 index 5ff3837..0000000 --- a/doc/es/dev/estructura-archivos.md +++ /dev/null @@ -1,80 +0,0 @@ -# Estructura de archivos -Díaz Camacho Pedro Emilio - -# Headers -## main.h -Este archivo incluye los prototipos internos, que va a usar el programa -funge como api interna para los desarrolladores y debe estar bien documentada. - -# codigo fuente - -## main.c -Este archivo debe configurar el programa antes de iniciarse, avisar de los problemas -que eviten que el programa se ejecute correctamente, iniciar y terminar los objetos que use el -programa, así como ejecutar la función principal -### Depende de -- - -## context.c -En este archivo se escoge un color para limpiar la pantalla y tiene una función para limpiar -tanto lo dibujado en pantalla, como distintos buffers gráficos. -### Depende de -- - -## input.c -Incluye la función `poll_input`, que se ejecuta en cada ciclo del programa y devuelve un -cuaternion de tipo `float *` que representa la rotación total del cubo, después de interactuar -con el programa. -### Depende de -- -- - -## matrix.c -Incluye las funciónes para configurar y cargar en la GPU las 3 matrices principales. -- `fix_matrix` esta matriz no cambia y se usa para configurar la perspectiva y la vista que -va a usar el programa en todo momento. -- `mdl_matrix` esta matriz depende de cada mesh y describe la rotación única de cada objeto, -se usa para rotar los ejes ortogonamente con un indice. -- `rot_matrix` esta matriz describe la rotación total de todos los objetos y se configura con -un cuaternio -### Depende de -- -- -- - -## mesh.c -Este archivo se usa para crear, destruir y dibujar objetos de tipo `mesh`, un `mesh` es una -colección de triángulos que describen un objeto multidimensional. -### Depende de -- -- - -## shader.c -Debe crear, destruir y usar los shaders, estos shaders son programas para la gpu escritos en glsl para -además aquí se carga memoria en gpu con las funciónes `gload_` -### Depende de -- - -## texture.c -Debe cargar, usar y destruir las texturas, que va a usar la gpu, también crea una textura -para una paleta de colores definida, esto para manipular fácilmente los colores que usará el programa. -### Depende de -- - -## window.c -Crea, usa, limpie y cierra una ventana, una ventana tiene un contexto de OpenGL asociado para poder -dibujar objetos en ella, tiene una función especial para avisar si la ventana está abierta para -dibujar. -### Depende de -- - -# Datos -## data/cube.h -Aquí esta la información del mesh de un cubo, este se va a borrar cuando podamos -importar meshes para graficarlos. - -## data/axis.h -Aquí está el mesh de un solo eje, este se va a rotar para hacer los otros 2 ejes. - -## data/shaders.h -Aquí estan los shaders en glsl para dibujar en pantalla diff --git a/doc/es/dev/tipos.md b/doc/es/dev/tipos.md deleted file mode 100644 index 5f7e184..0000000 --- a/doc/es/dev/tipos.md +++ /dev/null @@ -1,43 +0,0 @@ -# Tipos de datos del proyecto -Díaz Camacho Pedro Emilio - -# Introducción -En este archivo vamos a detallar los tipos de datos únicos del programa, estos -tipos de datos son estructuras que representan objetos computacionales y son -necesarios para integrar las distintas partes del programa. - -## window_t -En `window.c` tenemos una estructura que es la ventana y esta se representa por `window_t`, -este tipo de dato es un pointer que es manejado por `glfw`. - -## id_t -`id_t` es un tipo de dato que representa objetos de `OpenGL`, estos datos -normalmente vienen enumerados, y en `manigraph` se usan para representar `shaders`, -`programs` y `texture`. - -## mesh_t -Este es un tipo de dato usado para interactuar con `mesh.c`, este representa la triangulación de un -objeto gráfico y funciona ocultando las variables que `OpenGL` necesita en un `void *`. - -## mat4_t -`mat4_t` se usará para representar las matrices, se usará este tipo de dato exclusivamente -en `matrix.c` y funcionará con el tipo de dato `mat4` de `cglm`. - -## quat_t -Este tipo de dato sirve para representar un quaternio, este quaternio representa la rotación -del objeto gráficado en la proyección tridimensional, y se usará para crear una matriz que -pueda entender `glsl`. - -## narray -`narray` es un tipo de dato que funciona como un `array` enumerado, esto significa que el primer -elemento del `array` dice cuantos elementos tiene este, sin contar el primer elemento, y los demas elementos -funcionan como un `array` normal. - -esta estructura nos ayuda a trabajar con arrays de tamaños arbitrario de forma óptima y sin tener que marcar el -último elemento de forma especial. - -### narray_u8_t -es un `narray` para `char` y `unsigned char`. -### narray_float_t -es un `narray` para `float`. - diff --git a/doc/es/tech/diseno.md b/doc/es/tech/diseno.md deleted file mode 100644 index 3b23f49..0000000 --- a/doc/es/tech/diseno.md +++ /dev/null @@ -1,59 +0,0 @@ -# Manual de Diseño -Diaz Camacho Pedro Emilio - -# Objetivos -## Prioridad alta -- [ ] El programa debe actualizarse cuando interactuan con el. -- [ ] El usuario quiere: - - [X] Ver 3 ejes en todo momento. - - [ ] Ver que ejes esta viendo. - - [ ] Ver cuantos ejes hay. -- [X] El usuario quiere: - - [X] Rotar estos ejes, - - [X] Ver donde quedan los ejes despues de la rotados. -- [ ] El usuario experimentado quiere ejecutar el programa y pasar la variedad: - - [ ] Como argumento del programa. - - [ ] Desde la entrada estandar del programa. - -## Prioridad media - -- [ ] El usuario quiere: - - [ ] Cambiar los ejes que se ven por pares. - - [ ] Cambiar los ejes donde esta la informacion de los ejes. -- [ ] El usuario quiere interactuar con el programa: - - [ ] Usando solo el mouse. - - [ ] Usando solo el teclado. - -## Prioridad baja -- [ ] El usuario quiere guardar las transformaciones como un archivo GIF. - -# Camino - -0. Graficadora de un cubo. - 1. Se hace un programa que muestre un cubo. - 1. Se muestran los 3 ejes del cubo - 1. Se rota el cubo en sus 3 ejes usando el teclado. - 1. Se rota el cubo en sus 3 ejes usando el mouse. - 1. Se muestran la etiqueta de los ejes. - 1. Se hace el formato de objetos multidimensionales. -0. Programa ejemplo - 1. Se hace un programa que divida un cuadrado en triangulos. - 1. Se mapea cada vertice del triangulo en un punto de la cinta de - mobius usando una parametrizacion - 1. Se mapea cada vertice del triangulo en un punto de la botella de - klein usando una parametrizacion - 1. Se divide cada lado de un cubo de n dimensiones, en triangulos. - -0. Graficadora de variedades - 1. Se generaliza el programa para usar este formato. - 1. Se muestran la informacion de los ejes mostrados y cuantos hay. - 1. Se pueden cambiar los ejes por pares - 1. Usando el mouse. - 1. Usando el teclado. -0. Detalles. - 1. Se anima el cambio de eje. - 1. Se hace el generador de GIF. - 1. Se puede cambiar el shader - 1. Documentacion - - diff --git a/doc/es/tech/problemas.md b/doc/es/tech/problemas.md deleted file mode 100644 index e449956..0000000 --- a/doc/es/tech/problemas.md +++ /dev/null @@ -1,22 +0,0 @@ -# Problemas esperados al desarrollar -Diaz Camacho Pedro Emilio - -## OpenGL esperan objetos tridimensionales, no de n dimensiones. - -Usando glVertexAttribPointer podemos pasar las coordenadas que -queramos de los puntos de las variedades, y con ello usar objetos 3D en -el shader. - -## Rotar ejes por pares en una animacion continua. -- Con glVertexAttribPointer podemos pasar las coordenadas del eje -seleccionado, al shader. -- Con la funcion mix del shader y bloqueando el input, podemos hacer -una animacion pasando una variable con la cpu. -- Cuando la animacion termine intercambiar los indices del layout, -usando glVertexAttribPointer otra vez. - -## Volumen de la variedad. -Dado que la funcion parametrizadora es continua, mandamos la frontera -de un n-cubo a la frontera de una variedad, por lo que solo basta -graficar la frontera de la variedad. - diff --git a/doc/es/user.md b/doc/es/user.md deleted file mode 100644 index a62cd2f..0000000 --- a/doc/es/user.md +++ /dev/null @@ -1,19 +0,0 @@ -# Manual de usario para Manigraph -Manigraph es un graficador interactivo de variedades que lee archivos -binarios de una variedad multidimensional y los proyecta a 3 dimensiones. - -# Glosario -Llamaremos a los 3 ejes de la proyección tridimensional `X`, `Y` y `Z`, -este sistema de coordenadas es derecho con el eje `Z` apuntando afuera de la pantalla - -# Controles -## Teclado -- `Q` Rota el eje `X` de forma horaria. -- `W` Rota el eje `X` de forma antihoraria. -- `A` Rota el eje `Y` de forma horaria. -- `S` Rota el eje `Y` de forma antihoraria. -- `Z` Rota el eje `Z` de forma horaria. -- `X` Rota el eje `Z` de forma antihoraria. -## Mouse -- Hacer `click` en un eje lo selecciona. -- El `scroll` del mouse hace girar al eje seleccionado. diff --git a/doc/file_layout.svg b/doc/file_layout.svg new file mode 100644 index 0000000..d4de8a9 --- /dev/null +++ b/doc/file_layout.svg @@ -0,0 +1,10 @@ + + + + + + + + examplemain.cfigure.kleinGLFWCGLMNUKLEAROpenGLgui.ccontext.cmesh.cshader.ctexture.cGLADdata/shader.hload.cinput.cwindow.ccallbacks \ No newline at end of file