Author SHA1 Message Date
pedroediaz b83f0f07e3 Merge main, change compile.bat, add struct gui 2025-02-04 10:16:09 -06:00
pedroediaz 52aa9d4ac2 Fix size of klein files, debug of glfw 2024-12-15 19:58:58 -06:00
Crisel bc537cf9f2 ui better 2024-12-10 00:06:17 -06:00
pedroediaz 533109fbcd Return color 2024-12-09 16:12:48 -06:00
pedroediaz 3997613d16 Fix nameing and reduce size 2024-12-09 00:40:40 -06:00
pedroediaz f21121b88d Better contrast 2024-12-09 00:39:39 -06:00
pedroediaz 86480fe9b1 Add flow 2024-12-05 21:38:59 -06:00
pedroediaz e9bd748dd8 Fix examples compilation 2024-12-05 19:19:19 -06:00
Crisel 81eb79662e 3rd ui 2024-12-02 14:59:47 -06:00
Crisel d2e2c6eef7 2nd ui colors 2024-12-02 14:39:32 -06:00
Crisel 57091d3408 1rst ui 2024-12-02 14:12:01 -06:00
Crisel 56339e9e10 changes 2024-11-29 15:49:17 -06:00
pedroediaz 03796fdaff Fix: OpenGL changes of Nuklear 2024-11-07 14:14:20 -06:00
pedroediaz 46869cbcde WIP: Working window that breaks OpenGL settings 2024-11-06 19:27:02 -06:00
Crisel 25df66b5f8 wip2 2024-11-06 15:57:45 -06:00
18 changed files with 260 additions and 97 deletions

No files matched your search

+15 -18
View File
@@ -9,29 +9,24 @@ OBJ = \
src/input.o \
src/load.o \
src/mesh.o \
src/gui.o \
src/main.o
EXAMPLES = \
example/basic.o
example/basic \
example/riemman \
example/n-cube \
example/n-hilbert-cube \
example/lens
CFLAGS = \
-I./ext/cglm/include \
-I./ext/glfw/include \
-I./ext/glad \
-I./ext/nuklear \
-I./include \
-Wall -Wno-unused-function -std=c99 -D_GNU_SOURCE \
WAYLAND-LIB = \
xdg-shell \
relative-pointer-unstable-v1 \
xdg-decoration-unstable-v1 \
pointer-constraints-unstable-v1 \
viewporter \
idle-inhibit-unstable-v1 \
fractional-scale-v1 \
xdg-activation-v1 \
wayland
help:
@echo "Usage:"
@echo " $(MAKE) windows"
@@ -39,6 +34,8 @@ help:
@echo " $(MAKE) linux-wayland"
@echo " $(MAKE) cocoa"
@echo " $(MAKE) CC=emcc wasm"
@echo "Examples"
@echo " $(MAKE) examples"
@echo "Clean"
@echo " $(MAKE) clean"
@@ -54,11 +51,11 @@ glfw.dll:
# LINUX
linux-wayland: $(OBJ)
cd ext; $(MAKE) -f glfw.mk linux-wayland; cd -
$(CC) -o $(BIN) $(OBJ) ext/libglfw.a -lGL -lm
$(CC) -o $(BIN) $(OBJ) ext/libglfw.a -lm
linux-x11: $(OBJ)
cd ext; $(MAKE) -f glfw.mk linux-x11; cd -
$(CC) -o $(BIN) $(OBJ) ext/libglfw.a -lGL -lm
$(CC) -o $(BIN) $(OBJ) ext/libglfw.a -lm
cocoa: $(OBJ)
cd ext; $(MAKE) -f glfw.mk cocoa; cd -
@@ -68,11 +65,8 @@ wasm: $(OBJ)
$(CC) -sUSE_WEBGL2=1 -sUSE_GLFW=3 -o $(BIN).html $(OBJ)
chmod -x $(BIN).wasm
libglfw.so:
$(CC) -fPIC -shared $(DFLAGS) -D_GLFW_BUILD_DLL -Iext/glfw/deps/wayland ./ext/glfw/src/*.c -o $@
clean:
rm $(OBJ) $(BIN)
rm $(OBJ) $(BIN) $(EXAMPLES)
cd ext; $(MAKE) -f glfw.mk clean; cd -
@@ -82,3 +76,6 @@ examples: $(EXAMPLES)
.c.o:
$(CC) -Wno-implicit-function-declaration $(CFLAGS) -c -o $@ $<
.c:
$(CC) -I include -o $@ $< -lm
+4
View File
@@ -35,6 +35,9 @@ make cocoa
make CC=emcc wasm
```
# Flow of Manigraph
![Flow of Manigraph](doc/flow.svg)
# 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
@@ -56,3 +59,4 @@ they are connected through dependencies. It also highlights the scenarios where
files are not independent of one another,
![File layout](doc/file_layout.svg)
+1 -1
View File
@@ -1,3 +1,3 @@
:: git submodule update --init --recursive
:: gcc -fPIC -shared -Iext/glfw/deps/MinGW -D_GLFW_WIN32 -D_GLFW_BUILD_DLL ./ext/glfw/src/*.c -o glfw.dll -lgdi32
gcc -I ext/cglm/include -I ext/glfw/include src/*.c -o manigraph -L . -lglfw -lopengl32 -lglew32
gcc -I ext/glad -I ext/cglm/include -I ext/nuklear -I ext/glfw/include src/*.c ext/glad/glad.c -o manigraph -L . -lglfw -lopengl32
+10
View File
@@ -0,0 +1,10 @@
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1898.4758660507769 1129.0324109769003" width="1898.4758660507769" height="1129.0324109769003" filter="invert(93%) hue-rotate(180deg)">
<!-- svg-source:excalidraw -->
<defs>
<style class="style-fonts">
@font-face { font-family: Excalifont; src: url(data:font/woff2;base64,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 truncated
</style>
</defs>
<rect x="0" y="0" width="1898.4758660507769" height="1129.0324109769003" fill="#ffffff"></rect><g stroke-linecap="round"><g transform="translate(134.6093715002511 107.77351992160297) rotate(0 0 20.53139395856948)"><path d="M-0.03 0.27 C0.12 7.13, 0.43 34.86, 0.4 41.61 M-0.71 -0.07 C-0.55 6.89, 0.17 34.05, 0.18 40.93" stroke="#1e1e1e" stroke-width="2" fill="none"></path></g><g transform="translate(134.6093715002511 107.77351992160297) rotate(0 0 20.53139395856948)"><path d="M-7.14 21.74 C-5.07 26.42, -3.05 29.24, 0.18 40.93 M-7.14 21.74 C-5.09 26.83, -3.72 31.32, 0.18 40.93" stroke="#1e1e1e" stroke-width="2" fill="none"></path></g><g transform="translate(134.6093715002511 107.77351992160297) rotate(0 0 20.53139395856948)"><path d="M6.9 21.53 C6.09 26.25, 5.21 29.1, 0.18 40.93 M6.9 21.53 C5.56 26.71, 3.54 31.25, 0.18 40.93" stroke="#1e1e1e" stroke-width="2" fill="none"></path></g></g><mask></mask><g stroke-linecap="round" transform="translate(10 10) rotate(0 111.7041731117875 50.71428571428572)"><path d="M94.57 1.05 C108.74 -0.54, 127.47 0.09, 142.03 1.74 C156.6 3.38, 170.26 6.55, 181.96 10.93 C193.65 15.31, 205.46 21.69, 212.2 28.03 C218.95 34.38, 221.77 42.07, 222.43 49 C223.09 55.92, 221.5 63.3, 216.18 69.59 C210.85 75.87, 201.36 82.01, 190.46 86.72 C179.57 91.43, 164.94 95.26, 150.82 97.85 C136.71 100.43, 120.76 102.54, 105.77 102.24 C90.78 101.94, 74.39 99.22, 60.88 96.05 C47.36 92.87, 34.4 88.55, 24.68 83.18 C14.96 77.82, 6.51 70.56, 2.54 63.86 C-1.42 57.16, -1.66 49.9, 0.88 42.97 C3.42 36.04, 9.22 28.01, 17.76 22.26 C26.3 16.51, 36.78 12.02, 52.11 8.45 C67.43 4.89, 97.69 1.96, 109.7 0.86 C121.7 -0.23, 124.22 1.3, 124.13 1.87 M89.3 -0.05 C102.73 -2.44, 118.6 -1.14, 133.29 0.37 C147.98 1.88, 164.89 4.63, 177.44 8.99 C189.98 13.36, 201.23 20.63, 208.58 26.55 C215.92 32.48, 219.93 38.04, 221.49 44.53 C223.04 51.01, 222.13 58.81, 217.9 65.47 C213.67 72.13, 206.1 79.1, 196.1 84.48 C186.09 89.86, 171.89 94.84, 157.87 97.74 C143.84 100.64, 126.92 102.13, 111.97 101.89 C97.01 101.66, 82.15 99.11, 68.12 96.32 C54.09 93.52, 38.32 90.03, 27.78 85.13 C17.25 80.23, 9.22 73.57, 4.91 66.93 C0.61 60.3, 0.56 52.44, 1.96 45.32 C3.36 38.2, 6.26 30.25, 13.3 24.22 C20.34 18.18, 31.69 12.76, 44.2 9.12 C56.71 5.48, 81.22 3.44, 88.35 2.37 C95.48 1.29, 86.8 1.94, 86.98 2.67" stroke="#1e1e1e" stroke-width="2" fill="none"></path></g><g transform="translate(94.25072764231356 48.35387038268223) rotate(0 27.46666717529297 12.5)"><text x="27.46666717529297" y="17.619999999999997" font-family="Excalifont, Xiaolai, Segoe UI Emoji" font-size="20px" fill="#1e1e1e" text-anchor="middle" style="white-space: pre;" direction="ltr" dominant-baseline="alphabetic">Start</text></g><g mask="url(#mask-DGfGDIEhGbM9VZLGxmU2x)" stroke-linecap="round"><g transform="translate(134.84314553266427 962.6293772541449) rotate(0 0 26.5107599192919)"><path d="M-1.19 0.39 C-0.97 9.52, 0.7 44.88, 0.73 53.73 M0.39 -0.45 C0.57 8.43, 0 43.34, 0.16 51.98" stroke="#1971c2" stroke-width="2" fill="none"></path></g><g transform="translate(134.84314553266427 962.6293772541449) rotate(0 0 26.5107599192919)"><path d="M-8.37 28.48 C-5.8 35.64, -3.14 38.61, 0.16 51.98 M-8.37 28.48 C-5.7 36.93, -1.61 43.92, 0.16 51.98" stroke="#1971c2" stroke-width="2" fill="none"></path></g><g transform="translate(134.84314553266427 962.6293772541449) rotate(0 0 26.5107599192919)"><path d="M8.73 28.49 C7.04 35.48, 5.43 38.45, 0.16 51.98 M8.73 28.49 C5.61 37, 3.89 43.99, 0.16 51.98" stroke="#1971c2" stroke-width="2" fill="none"></path></g></g><mask id="mask-DGfGDIEhGbM9VZLGxmU2x"><rect x="0" y="0" fill="#fff" width="234.84314553266427" height="1115.6508970927287"></rect><rect x="123.08481219933105" y="976.6401371734369" fill="#000" width="23.516666666666666" height="25" opacity="1"></rect></mask><g transform="translate(123.08481219933094 976.6401371734369) rotate(0 11.528343253334356 12.628268248881113)"><text x="11.758333333333333" y="17.619999999999997" font-family="Excalifont, Xiaolai, Segoe UI Emoji" font-size="20px" fill="#1971c2" text-anchor="middle" style="white-space: pre;" direction="ltr" dominant-baseline="alphabetic">no</text></g><g stroke-linecap="round" transform="translate(11.271716961235711 856.5863096653122) rotate(0 123.57142857142861 60.80888546829817)"><path d="M155 15.25 C178.01 26.81, 199.99 37.31, 216.14 45.75 M155 15.25 C177.66 26.24, 198.53 36.57, 216.14 45.75 M216.14 45.75 C247.48 62.03, 248.09 61.93, 216.14 76.25 M216.14 45.75 C249.22 61.31, 246.25 61.77, 216.14 76.25 M216.14 76.25 C197.3 84.9, 180.84 92.47, 155 106.37 M216.14 76.25 C197.75 85.2, 180.38 93.91, 155 106.37 M155 106.37 C125.11 121.61, 122.24 123.5, 93 106.37 M155 106.37 C125.91 121.02, 125.35 120.1, 93 106.37 M93 106.37 C69.08 94.76, 44.5 82.99, 31 76.25 M93 106.37 C79.25 99.51, 65.79 94.69, 31 76.25 M31 76.25 C-1.88 59.65, -1.57 62.64, 31 45.75 M31 76.25 C-1.26 61.03, 0.39 59.25, 31 45.75 M31 45.75 C48.24 37.32, 60.78 30.54, 93 15.25 M31 45.75 C55.54 34.5, 77.85 22.63, 93 15.25 M93 15.25 C122.69 -0.0Line truncated

After

Width:  |  Height:  |  Size: 107 KiB

+2 -2
View File
@@ -7,7 +7,7 @@
#include <klein/parm.h>
int p = 37;
int q = 1;
int q = 7;
void lens(float *d_surface, int *coord, unsigned char * grid)
{
@@ -41,7 +41,7 @@ int main(void)
.f = lens,
};
snprintf(file_name, 0xff, "%03d-%03d-cube.klein", p, q);
snprintf(file_name, 0xff, "lens-%03d-%03d.klein", p, q);
printf("writing %s\n", file_name);
klein_parametrize(&klein, parametrization);
+4 -4
View File
@@ -10,7 +10,7 @@
#define M_PI 3.14159265358979323846
#endif
unsigned char dim = 4;
unsigned char dim = 10;
void cube(float *d_surface, int *coord, unsigned char *grid)
{
@@ -35,11 +35,11 @@ int main(void)
};
parametrization.grid = malloc(dim);
for (i = 0; i < dim; ++i)
parametrization.grid[i] = 1 << i;
parametrization.grid[i] = 1 + i;
snprintf(file_name, 0xff, "%03d-cube.klein", dim);
snprintf(file_name, 0xff, "cube-%03d.klein", dim);
printf("writing %s\n", file_name);
klein_parametrize(&klein, parametrization);
+2 -2
View File
@@ -39,8 +39,8 @@ int klein_export_file(struct klein klein, const char * filename)
fwrite("\0", 1, 1, file);
fwrite(&klein.dim, 1, 1, file);
fwrite(&klein.vertex_size, 8, 1, file);
fwrite(klein.vertex, 16, klein.vertex_size * klein.dim, file);
fwrite(klein.normals, 16, klein.vertex_size * klein.dim, file);
fwrite(klein.vertex, 4, klein.vertex_size * klein.dim, file);
fwrite(klein.normals, 4, klein.vertex_size * klein.dim, file);
fclose(file);
return 0;
+8 -2
View File
@@ -9,7 +9,6 @@
void set_clean_color_context(unsigned char r, unsigned char g, unsigned char b)
{
glEnable(GL_DEPTH_TEST);
glClearColor((float)r / 0xff, (float)g / 0xff, (float)b / 0xff, 1.0);
}
@@ -22,4 +21,11 @@ int init_context(void)
#endif
}
void clean_context(void) { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); }
void clean_context(void)
{
/* This is important cos, Nuklear Disable DEPTH TEST */
glEnable(GL_BLEND);
glEnable(GL_DEPTH_TEST);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glClear(GL_COLOR_BUFFER_BIT| GL_DEPTH_BUFFER_BIT );
}
+32
View File
@@ -0,0 +1,32 @@
#define A -1,-1,-1,
#define B -1,-1, 1,
#define C -1, 1,-1,
#define D -1, 1, 1,
#define E 1,-1,-1,
#define F 1,-1, 1,
#define G 1, 1,-1,
#define H 1, 1, 1,
narray_float_t d_cube =
{
3*3*2*6,
A C E
C E G
E G F
G F H
F H B
H B D
B D A
D A C
C D G
D G H
A B E
B E F
};
+2 -2
View File
@@ -61,7 +61,7 @@ const char *fs_plain =
"void main()"
"{"
" FragColor = vec4(pow(vec3(Color),vec3(1.0/2.2)),Color.a);"
" FragColor = vec4(pow(vec3(Color),vec3(1.0/1.0)),Color.a);"
"}";
const char *fs =
@@ -92,7 +92,7 @@ const char *fs =
" float specular = pow(abs(dot(normalize(Normal), halfwayDir)), 32.0);\n"
" float diffuse = abs(dot(normalize(Normal), lightDir));\n"
" vec3 result = pow((0.5 + 0.5*diffuse + 1.5*specular) * Color.rgb, "
" vec3 result = pow((0.5 + 0.5*diffuse + 1*specular) * Color.rgb, "
"vec3(1.0/2.2));\n"
" FragColor = vec4(result, Color.a);\n"
"}";
+83
View File
@@ -0,0 +1,83 @@
#include <glad.h>
#include "main.h"
#define MAX_VERTEX_BUFFER 512 * 1024
#define MAX_ELEMENT_BUFFER 128 * 1024
#define NK_INCLUDE_FIXED_TYPES
#define NK_INCLUDE_STANDARD_IO
#define NK_INCLUDE_STANDARD_VARARGS
#define NK_INCLUDE_DEFAULT_ALLOCATOR
#define NK_INCLUDE_VERTEX_BUFFER_OUTPUT
#define NK_INCLUDE_FONT_BAKING
#define NK_INCLUDE_DEFAULT_FONT
#define NK_IMPLEMENTATION
#define NK_GLFW_GL3_IMPLEMENTATION
#include <nuklear.h>
#include <demo/glfw_opengl3/nuklear_glfw_gl3.h>
struct gui gui =
{
.file_name = {0},
.projection = (struct projection){ .mesh=NULL, .x =0, .y=1, .z=2 },
};
float surface_color[4] = {(float)0x2F/0xFF, (float)0x3C/0xFF, (float)0x7E/0xFF, (float)0xff/0xFF};
static inline
void restore_surface_color( void )
{
gui.picked_color[0] = surface_color[0];
gui.picked_color[1] = surface_color[1];
gui.picked_color[2] = surface_color[2];
gui.picked_color[3] = surface_color[3];
}
struct nk_glfw glfw ={0};
struct nk_context * context;
void draw_gui( void )
{
nk_glfw3_new_frame(&glfw);
if (nk_begin(context, "MANIGRAPH", nk_rect(10, 10, 256, 256),
NK_WINDOW_BORDER |NK_WINDOW_SCALABLE | NK_WINDOW_MOVABLE | NK_WINDOW_MINIMIZABLE) )
{
/* Color picker para personalización */
{
struct nk_colorf * p = (void*)&gui.picked_color;
nk_layout_row_dynamic(context, 120, 1);
*p = nk_color_picker(context, *p, NK_RGBA);
}
nk_layout_row_dynamic(context, 20, 1);
if (nk_button_label(context, "Restablecer"))
restore_surface_color();
nk_layout_row_dynamic(context, 12, 1);
nk_label(context, (char*)gui.file_name, NK_TEXT_ALIGN_LEFT);
nk_label_colored(context, "Atajos de teclado:", NK_TEXT_ALIGN_LEFT, nk_rgb(255, 255, 255)); // Encabezado
nk_label(context, " - W/S: Rotar eje X", NK_TEXT_ALIGN_LEFT);
nk_label(context, " - A/D: Rotar eje Y", NK_TEXT_ALIGN_LEFT);
nk_label(context, " - Z/X: Rotar eje Z", NK_TEXT_ALIGN_LEFT);
}
nk_end(context);
nk_glfw3_render(&glfw, NK_ANTI_ALIASING_ON, MAX_VERTEX_BUFFER, MAX_ELEMENT_BUFFER);
}
void init_gui( window_t window )
{
struct nk_font_atlas * atlas;
restore_surface_color();
{
context = nk_glfw3_init(&glfw,(GLFWwindow*) window, NK_GLFW3_DEFAULT );
nk_glfw3_font_stash_begin(&glfw, &atlas);
nk_glfw3_font_stash_end(&glfw);
}
}
+33 -30
View File
@@ -1,15 +1,18 @@
#include "main.h"
#include <glad.h>
#include <GLFW/glfw3.h>
#include <cglm/quat.h>
#include <stdio.h>
#include <string.h>
#define ANGLE ((float)0x01 / 0xff * 2 * GLM_PI)
unsigned char selected_axis = 0;
int window_width;
int window_height;
int window_width = 512;
int window_height = 512;
unsigned char animate_index = 0;
extern struct gui gui;
versor q = GLM_QUAT_IDENTITY_INIT;
@@ -19,7 +22,13 @@ vec3 axis[3] = {
{0, 0, 1},
};
extern struct projection projection;
void __error_callback_input(int x, const char * msg )
{
mlog("[GLFW] ");
mlog(msg);
mlog("\n");
}
void __key_callback_input(
GLFWwindow *window, int key, int scancode, int action, int mods)
@@ -33,41 +42,41 @@ void __key_callback_input(
selected_coord = key - GLFW_KEY_0 - 1;
if (selected_coord >= projection.m)
if (selected_coord >= gui.projection.m)
return;
if (selected_coord == projection.x)
if (selected_coord == gui.projection.x)
return;
if (selected_coord == projection.y)
if (selected_coord == gui.projection.y)
return;
if (selected_coord == projection.z)
if (selected_coord == gui.projection.z)
return;
selected_coord = projection.w;
selected_coord = gui.projection.w;
}
if (projection.w >= projection.m)
if (gui.projection.w >= gui.projection.m)
return;
switch (key)
{
unsigned char tmp;
case GLFW_KEY_I:
tmp = projection.w;
projection.w = projection.x;
projection.x = tmp;
tmp = gui.projection.w;
gui.projection.w = gui.projection.x;
gui.projection.x = tmp;
animate_index = 1;
break;
case GLFW_KEY_O:
tmp = projection.w;
projection.w = projection.y;
projection.y = tmp;
tmp = gui.projection.w;
gui.projection.w = gui.projection.y;
gui.projection.y = tmp;
animate_index = 2;
break;
case GLFW_KEY_P:
tmp = projection.w;
projection.w = projection.z;
projection.z = tmp;
tmp = gui.projection.w;
gui.projection.w = gui.projection.z;
gui.projection.z = tmp;
animate_index = 3;
break;
}
@@ -128,18 +137,20 @@ void __scroll_callback_input(GLFWwindow *window, double xoffset, double yoffset)
glm_quat_rotatev(r, axis[2], axis[2]);
}
void __drop_callback_input(GLFWwindow *window, int count, char **path)
void __drop_callback_input(GLFWwindow *window, int count, unsigned char **path)
{
struct surface surface;
if (create_surface_klein(*path, &surface))
return;
if (!(projection.mesh = create_mesh(surface)))
if (!(gui.projection.mesh = create_mesh(surface)))
return;
projection.m = surface.dim;
set_projection_mesh(projection);
strcpy(gui.file_name, *path);
gui.projection.m = surface.dim;
set_projection_mesh(gui.projection);
free(surface.norm);
free(surface.data);
@@ -187,13 +198,5 @@ end:
glm_quat_rotatev(p, axis[2], axis[2]);
glm_quat_normalize(q);
// LOG INFO
if (0)
{
printf("QUAT: %2.5f %2.5f %2.5f %2.5f\n", q[0], q[1], q[2], q[3]);
printf("PROY: %3d %3d %3d (%3d)\n", projection.x, projection.y,
projection.z, projection.w);
printf("\n");
}
return q;
}
+4 -4
View File
@@ -35,10 +35,10 @@ int create_surface_klein(unsigned char *path, struct surface *surface)
size = surface->dim * surface->vertex;
surface->data = malloc(16 * size);
fread(surface->data, 16, size, file);
surface->data = malloc(4 * size);
fread(surface->data, 4, size, file);
surface->norm = malloc(16 * size);
fread(surface->norm, 16, size, file);
surface->norm = malloc(4 * size);
fread(surface->norm, 4, size, file);
return 0;
}
+1 -7
View File
@@ -22,13 +22,7 @@ void rot_matrix_load(id_t shader, quat_t q)
load_mat4_to_shader(shader, "rot", (mat4_t)m);
}
void color_load(id_t shader, unsigned char color[4])
void color_load(id_t shader, float res[4])
{
float res[4];
res[0] = (float)color[0] / 0xff;
res[1] = (float)color[1] / 0xff;
res[2] = (float)color[2] / 0xff;
res[3] = (float)color[3] / 0xff;
load_float4_to_shader(shader, "color", res);
}
+35 -19
View File
@@ -7,6 +7,11 @@
#define WIDTH 512
#define HEIGHT 512
#include <glad.h>
float *generate_data_surface(unsigned int, unsigned char *);
float *generate_normals_surface(float *, unsigned char);
#ifdef EMSCRIPTEN
#include <emscripten.h>
#endif
@@ -15,11 +20,13 @@
#define M_PI 3.14159
#endif
struct projection projection = {.x = 0, .y = 1, .z = 2, .w = 3, .mesh = NULL};
window_t window;
id_t shader, shader_plain;
const char *wname = "manigraph: manifold grapher";
unsigned char color[4] = {0x2F, 0x3C, 0x7E, 0xff};
extern volatile unsigned char animate_index;
extern struct gui gui;
void mlog(char *msg)
{
@@ -28,11 +35,6 @@ void mlog(char *msg)
#endif
}
window_t window;
id_t shader, shader_plain;
extern volatile unsigned char animate_index;
#ifndef EMSCRIPTEN
static inline
#endif
@@ -44,10 +46,16 @@ static inline
q = poll_input(window);
gui.quat[0] = q[0];
gui.quat[1] = q[1];
gui.quat[2] = q[2];
gui.quat[3] = q[3];
rot_matrix_load(shader, q);
rot_matrix_load(shader_plain, q);
color_load(shader, color);
color_load(shader_plain, color);
color_load(shader, gui.picked_color);
color_load(shader_plain, gui.picked_color);
{
static float angle = 0;
@@ -59,7 +67,7 @@ static inline
load_float_to_shader(shader, "angle", angle);
load_float_to_shader(shader_plain, "angle", angle);
set_projection_mesh(projection);
set_projection_mesh(gui.projection);
}
if (animate_index)
@@ -74,16 +82,19 @@ static inline
}
clean_context();
if (!projection.mesh)
return;
draw_mesh(shader, projection.mesh);
draw_mesh_lines(shader_plain, projection.mesh);
if (gui.projection.mesh)
{
draw_mesh(shader, gui.projection.mesh);
draw_mesh_lines(shader_plain, gui.projection.mesh);
}
draw_gui();
}
int main(void)
{
mlog("[VENTANA] Inicializando...\n");
{
if (!(window = init_window(WIDTH, HEIGHT, wname)))
@@ -129,6 +140,11 @@ int main(void)
fix_matrix_load(shader_plain, (float)WIDTH / HEIGHT);
}
mlog("[GUI] Inicializando...\n");
{
init_gui(window);
}
mlog("[MAIN LOOP] Inicializando...\n");
#ifdef EMSCRIPTEN
emscripten_set_main_loop(&main_loop, 60, 1);
@@ -140,7 +156,7 @@ int main(void)
mlog("[MAIN LOOP] Terminando...\n");
mlog("[MESH] Destruyendo...\n");
destroy_mesh(projection.mesh);
destroy_mesh(gui.projection.mesh);
mlog("[SHADER] Destruyendo...\n");
destroy_shader(shader_plain);
mlog("[SHADER] Destruyendo...\n");
@@ -150,12 +166,12 @@ int main(void)
return 0;
error_context:
mlog("[SHADER] Destruyendo...\n");
destroy_shader(shader_plain);
error_shader_plain:
mlog("[SHADER] Destruyendo...\n");
destroy_shader(shader);
error_shader:
mlog("[SHADER] Destruyendo...\n");
destroy_shader(shader_plain);
error_shader_plain:
mlog("[WINDOW] Destruyendo...\n");
close_window(window);
error_window:
+15 -4
View File
@@ -5,6 +5,7 @@
*/
#define DEBUG
#define GLFW_INCLUDE_NONE
typedef const void *window_t;
typedef unsigned int id_t;
@@ -22,12 +23,19 @@ typedef float *mat4_t;
w: the coordanate of the w axis.
*/
struct projection
struct gui
{
mesh_t mesh;
unsigned char m, x, y, z, w;
float quat[4];
float picked_color[4];
char file_name[0xff];
struct projection
{
mesh_t mesh;
unsigned char m, x, y, z, w;
} projection;
};
/*
this structure has all the information to generate
a mesh, where:
@@ -163,7 +171,7 @@ void rot_matrix_load(id_t shader, quat_t q);
/*
*/
void color_load(id_t shader, unsigned char color[4]);
void color_load(id_t shader, float* color);
id_t config_texture(unsigned short type);
@@ -179,3 +187,6 @@ void destroy_texture(id_t texture);
id_t create_palette_texture(const unsigned char colors[][4], unsigned char n);
quat_t poll_input(window_t window);
void draw_gui( void );
void init_gui( window_t window );
+1
View File
@@ -111,6 +111,7 @@ void draw_mesh_lines(id_t shader, mesh_t p)
#ifndef EMSCRIPTEN
glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
glDrawArrays(GL_TRIANGLES, 0, obj->vertex);
glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
#else
glDrawArrays(GL_LINES, 0, obj->vertex);
#endif
+8 -2
View File
@@ -8,6 +8,7 @@ void __mouse_callback_input(GLFWwindow *, int, int, int);
void __scroll_callback_input(GLFWwindow *, double, double);
void __key_callback_input(GLFWwindow *, int, int, int, int);
void __drop_callback_input(GLFWwindow *, int, const char **);
void __error_callback_input(int, const char *);
window_t init_window(unsigned int w, unsigned int h, const char *name);
@@ -44,6 +45,7 @@ static void __limit_fps_window(int max_fps)
window_t init_window(unsigned int width, unsigned int height, const char *title)
{
window_t window;
glfwSetErrorCallback(__error_callback_input);
if (!glfwInit())
return NULL;
@@ -51,6 +53,7 @@ window_t init_window(unsigned int width, unsigned int height, const char *title)
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
glfwWindowHint(GLFW_OPENGL_DEBUG_CONTEXT, 1);
window = (window_t)glfwCreateWindow(width, height, title, NULL, NULL);
if (!(window))
@@ -67,15 +70,18 @@ window_t init_window(unsigned int width, unsigned int height, const char *title)
glfwSetKeyCallback((GLFWwindow *)window, __key_callback_input);
glfwSetDropCallback((GLFWwindow *)window, __drop_callback_input);
__window_callback_input((GLFWwindow *)window, width, height);
return window;
}
void use_window(window_t window) { glfwMakeContextCurrent((void *)window); }
extern int window_width, window_height;
int is_open_window(window_t window)
{
/* Restore window proportions if Nuklear breaks it */
__window_callback_input((GLFWwindow *)window, window_width, window_height);
glfwSwapBuffers((void *)window);
glfwPollEvents();