diff options
| -rw-r--r-- | Makefile | 83 | ||||
| -rw-r--r-- | share/fonts/AlegreyaSans-Regular.ttf (renamed from fonts/AlegreyaSans-Regular.ttf) | bin | 267388 -> 267388 bytes | |||
| -rw-r--r-- | share/shaders/circles.fs (renamed from shaders/circles.fs) | 0 | ||||
| -rw-r--r-- | share/shaders/smear.fs (renamed from shaders/smear.fs) | 8 | ||||
| -rw-r--r-- | src/main.c (renamed from main.c) | 19 | ||||
| -rw-r--r-- | src/plug.c (renamed from plug.c) | 59 | ||||
| -rw-r--r-- | src/plug.h (renamed from plug.h) | 0 |
7 files changed, 138 insertions, 31 deletions
@@ -1,9 +1,17 @@ SHELL = /bin/sh CC = gcc +SRC_DIR = src +BUILD_DIR = build +SHARE_DIR = share +FONT_DIR = ${SHARE_DIR}/fonts +SHADER_DIR = ${SHARE_DIR}/shaders + PREFIX=/usr/local BINDIR=/bin LIBDIR=/lib64 +SHADERDIR=/share/shaders +FONTDIR=/share/fonts INSTALL_PROGRAM = install INSTALL_DATA = install -m 644 @@ -11,11 +19,13 @@ INSTALL_DATA = install -m 644 SO_FLAGS = -fPIC -shared COMMON_CFLAGS = -Wall -Wextra -O2 -ggdb CFLAGS = `pkg-config --cflags raylib` $(COMMON_CFLAGS) -LDFLAGS = `pkg-config --libs raylib` -lm -lpthread -ldl -SRC = main.c -LIB = plug.c -OBJ = main.o -SOBJ = libplug.so +LDFLAGS = `pkg-config --libs raylib` -lm -lpthread -ldl -L${BUILD_DIR} -lplug -Wl,-R,'$$ORIGIN' +FONTS = ${wildcard ${FONT_DIR}/*.ttf} +SHADERS = ${wildcard ${SHADER_DIR}/*.fs} +SRC = ${SRC_DIR}/main.c +LIB = ${SRC_DIR}/plug.c +OBJ = ${SRC:${SRC_DIR}/%.c=${BUILD_DIR}/%.o} +SOBJ = ${LIB:${SRC_DIR}/%.c=${BUILD_DIR}/lib%.so} BIN = mvis all: options ${BIN} @@ -26,27 +36,64 @@ options: @echo "CFLAGS = ${CFLAGS}" @echo "LDFLAGS = ${LDFLAGS}" -.c.so: - ${CC} ${LIB} ${SO_FLAGS} ${CFLAGS} -o ${SOBJ} +${BUILD_DIR}/%.so: ${LIB} | ${BUILD_DIR} + ${CC} ${SO_FLAGS} ${CFLAGS} -Wl,-soname,libplug.so $< -o $@ + +${BUILD_DIR}/%.o: ${SRC} | ${BUILD_DIR} + ${CC} ${CFLAGS} -c $< -o $@ + +mvis: ${OBJ} ${SOBJ} | ${BUILD_DIR} + ${CC} ${OBJ} ${LDFLAGS} -o ${BUILD_DIR}/${BIN} + +dev: ${SRC} ${SOBJ} | ${BUILD_DIR} + ${CC} -c ${SRC} ${CFLAGS} -DHOTRELOAD -o ${OBJ} + ${CC} ${OBJ} ${LDFLAGS} -o ${BUILD_DIR}/${BIN} + +${BUILD_DIR}: + mkdir -p ${PREFIX}$@ + +${BINDIR}: + mkdir -p ${PREFIX}$@ -.c.o: - ${CC} -c ${CFLAGS} ${SRC} +${LIBDIR}: + mkdir -p ${PREFIX}$@ -mvis: .c.o .c.so - ${CC} ${OBJ} ${SOBJ} ${CFLAGS} ${LDFLAGS} -o ${BIN} +${SHADERDIR}: + mkdir -p ${PREFIX}$@ -dev: .c.o .c.so - ${CC} ${OBJ} ${SOBJ} ${CFLAGS} -DHOTRELOAD ${LDFLAGS} -o ${BIN} +${FONTDIR}: + mkdir -p ${PREFIX}$@ -install: - ${INSTALL_PROGRAM} ${BIN} ${PREFIX}${BINDIR}/${BIN} - ${INSTALL_DATA} ${SOBJ} ${PREFIX}${LIBDIR}/${SOBJ} +install: ${BINDIR} ${LIBDIR} ${SHADERDIR} ${FONTDIR} + ${INSTALL_PROGRAM} ${BUILD_DIR}/${BIN} ${PREFIX}${BINDIR}/${BIN} + ${INSTALL_PROGRAM} ${SOBJ} ${PREFIX}${LIBDIR}/${subst ${BUILD_DIR}/,,${SOBJ}} + ${INSTALL_DATA} ${FONTS} ${subst ${FONT_DIR},${PREFIX}${FONTDIR},${FONTS}} + @for font in ${FONTS}; do \ + dest="${PREFIX}${FONTDIR}/$$(basename $$font)"; \ + echo "install -m 644 $$font $$dest"; \ + ${INSTALL_DATA} $$font $$dest; \ + done + @for shader in ${SHADERS}; do \ + dest="${PREFIX}${SHADERDIR}/$$(basename $$shader)"; \ + echo "install -m 644 $$shader $$dest"; \ + ${INSTALL_DATA} $$shader $$dest; \ + done uninstall: ${RM} ${PREFIX}${BINDIR}/${BIN} - ${RM} ${PREFIX}${LIBDIR}/${SOBJ} + ${RM} ${PREFIX}${LIBDIR}/${subst ${BUILD_DIR}/,,${SOBJ}} + @for font in ${FONTS}; do \ + dest="${PREFIX}${FONTDIR}/$$(basename $$font)"; \ + echo "rm -f $$dest"; \ + ${RM} $$dest; \ + done + @for shader in ${SHADERS}; do \ + dest="${PREFIX}${SHADERDIR}/$$(basename $$shader)"; \ + echo "rm -f $$dest"; \ + ${RM} $$dest; \ + done clean: - ${RM} ${BIN} + ${RM} ${BUILD_DIR}/${BIN} ${RM} ${OBJ} ${RM} ${SOBJ} diff --git a/fonts/AlegreyaSans-Regular.ttf b/share/fonts/AlegreyaSans-Regular.ttf Binary files differindex 9a0aa2c..9a0aa2c 100644 --- a/fonts/AlegreyaSans-Regular.ttf +++ b/share/fonts/AlegreyaSans-Regular.ttf diff --git a/shaders/circles.fs b/share/shaders/circles.fs index 5d504d8..5d504d8 100644 --- a/shaders/circles.fs +++ b/share/shaders/circles.fs diff --git a/shaders/smear.fs b/share/shaders/smear.fs index 0f7c316..5d504d8 100644 --- a/shaders/smear.fs +++ b/share/shaders/smear.fs @@ -9,17 +9,17 @@ out vec4 finalColor; void main() { - float radius = 0.25; + float radius = 0.1; vec2 distance_from_center = fragTexCoord - vec2(0.5); // s <= 0 -> inside circle // s > 0 -> outside circle if (length(distance_from_center) <= 0.5) { float s = length(distance_from_center) - radius; if (s <= 0) { - finalColor = fragColor*1.25; + finalColor = fragColor*1.5; } else { - float t = 1 - (s / (0.5 - radius)); - finalColor = vec4(fragColor.xyz, t); + float t = 1 - s / (0.5 - radius); + finalColor = vec4(fragColor.xyz, t*t); } } else { finalColor = vec4(0); @@ -27,19 +27,18 @@ LIST_OF_PLUGS #ifdef HOTRELOAD bool reload_plugin(void) { - if (libplug != NULL) dlclose(libplug); libplug = dlopen(libplug_file_name, RTLD_NOW); if (libplug == NULL) { - fprintf(stderr, "ERROR: could not load %s: %s", libplug_file_name, dlerror()); + fprintf(stderr, "ERROR: could not load %s: %s\n", libplug_file_name, dlerror()); return false; } #define PLUG(name, ...) \ name = dlsym(libplug, #name); \ if (name == NULL) { \ - fprintf(stderr, "ERROR: could not find %s symbol in %s: %s", \ + fprintf(stderr, "ERROR: could not find %s symbol in %s: %s\n", \ #name, libplug_file_name, dlerror()); \ return false; \ } @@ -65,13 +64,13 @@ int main(void) plug_init(); +#ifdef HOTRELOAD while (!WindowShouldClose()) { if (IsKeyPressed(KEY_O)) { void *state = plug_pre_reload(); if (!reload_plugin()) return 1; plug_post_reload(state); } - if (IsKeyPressed(KEY_X)) { break; } @@ -79,6 +78,18 @@ int main(void) plug_update(); } +#else + while (!WindowShouldClose()) { + if (IsKeyPressed(KEY_O)) { + fprintf(stderr, "INFO: MVis not compiled with HOTRELOAD\n"); + } + if (IsKeyPressed(KEY_X)) { + break; + } + + plug_update(); + } +#endif CloseAudioDevice(); CloseWindow(); @@ -1,11 +1,16 @@ #include <stdio.h> #include <math.h> #include <assert.h> +#include <stdint.h> #include <string.h> #include <stdlib.h> +#include <unistd.h> +#include <errno.h> +#include <libgen.h> #include <complex.h> #include <raylib.h> #include <rlgl.h> +#include <sys/param.h> #include "plug.h" @@ -14,6 +19,11 @@ #define SMOOTHNESS 8 #define SMEARNESS 6 +char circle_shader[PATH_MAX]; +char smear_shader[PATH_MAX]; +char font[PATH_MAX]; + + typedef struct { Music music; float audio_volume; @@ -297,19 +307,58 @@ void plug_post_reload(Plug *prev) } UnloadShader(plug->circle); UnloadShader(plug->smear); - plug->circle = LoadShader(NULL, "./shaders/circles.fs"); - plug->smear = LoadShader(NULL, "./shaders/smear.fs"); + plug->circle = LoadShader(NULL, circle_shader); + plug->smear = LoadShader(NULL, smear_shader); } void plug_init(void) { + char exe_path[PATH_MAX]; + char exe_dir[PATH_MAX]; + ssize_t len = readlink("/proc/self/exe", exe_path, sizeof(exe_path)); + if (len == -1) { + perror("readlink"); + exit(EXIT_FAILURE); + } + exe_path[len] = '\0'; + + strncpy(exe_dir, exe_path, sizeof(exe_dir)); + exe_dir[sizeof(exe_dir) - 1] = '\0'; + char *dir = dirname(exe_dir); + + char rel_shader_base[PATH_MAX]; + char rel_font_base[PATH_MAX]; + snprintf(rel_shader_base, sizeof(rel_shader_base), "%s/../share/shaders", dir); + snprintf(rel_font_base, sizeof(rel_font_base), "%s/../share/fonts", dir); + + char shader_base[PATH_MAX]; + char font_base[PATH_MAX]; + + if (!realpath(rel_shader_base, shader_base)) { + fprintf(stderr, "ERROR: realpath failed for shaders %s\n", strerror(errno)); + exit(EXIT_FAILURE); + } + if (!realpath(rel_font_base, font_base)) { + fprintf(stderr, "ERROR: realpath failed for fonts %s\n", strerror(errno)); + exit(EXIT_FAILURE); + } + + if ( + (size_t)snprintf(circle_shader, sizeof(circle_shader), "%s/circles.fs", shader_base) >= sizeof(circle_shader) || + (size_t)snprintf(smear_shader, sizeof(smear_shader), "%s/smear.fs", shader_base) >= sizeof(smear_shader) || + (size_t)snprintf(font, sizeof(font), "%s/AlegreyaSans-Regular.ttf", font_base) >= sizeof(font) + ) { + fprintf(stderr, "Asset path truncated -- path too long\n"); + exit(EXIT_FAILURE); + } + plug = malloc(sizeof(*plug)); assert(plug != NULL && "Not enough RAM!"); memset(plug, 0, sizeof(*plug)); - plug->font = LoadFontEx("./fonts/AlegreyaSans-Regular.ttf", FONT_SIZE, NULL, 0); - plug->circle = LoadShader(NULL, "./shaders/circles.fs"); - plug->smear = LoadShader(NULL, "./shaders/smear.fs"); + plug->font = LoadFontEx(font, FONT_SIZE, NULL, 0); + plug->circle = LoadShader(NULL, circle_shader); + plug->smear = LoadShader(NULL, smear_shader); plug->audio_volume = 0.5f; plug->render_option = 'b'; } |
