summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Makefile83
-rw-r--r--share/fonts/AlegreyaSans-Regular.ttf (renamed from fonts/AlegreyaSans-Regular.ttf)bin267388 -> 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
diff --git a/Makefile b/Makefile
index c401a65..6d32245 100644
--- a/Makefile
+++ b/Makefile
@@ -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
index 9a0aa2c..9a0aa2c 100644
--- a/fonts/AlegreyaSans-Regular.ttf
+++ b/share/fonts/AlegreyaSans-Regular.ttf
Binary files differ
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);
diff --git a/main.c b/src/main.c
index 952dd45..2639aae 100644
--- a/main.c
+++ b/src/main.c
@@ -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();
diff --git a/plug.c b/src/plug.c
index f67382d..3ce6989 100644
--- a/plug.c
+++ b/src/plug.c
@@ -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';
}
diff --git a/plug.h b/src/plug.h
index 2a9dcea..2a9dcea 100644
--- a/plug.h
+++ b/src/plug.h