feat: forge_project.cfg

This commit is contained in:
2025-11-07 19:23:27 +01:00
parent 28987bbb54
commit 63284d34ef
18 changed files with 37 additions and 25 deletions
+2
View File
@@ -85,6 +85,8 @@ make -f Makefile.dev release-arch
- [x] Clean code and fix things
- [x] Share openGL state between monitor and screen
- [ ] Other
- [x] `forge_project.cfg`
- [ ] Define frag prefix in config
- [ ] Use custom `#include xxx.glsl` preprocessor
- [ ] Update readme with usage documentation
- [x] Documentation in default config file
+2 -2
View File
@@ -5,6 +5,6 @@ forge_CFLAGS = -Ofast -march=native -flto -funroll-loops -fprefetch-loop-arrays
forge_LDADD = -lm -lGL -lglfw -lasound
include_HEADERS = src/main.h src/args.h src/config.h src/types.h src/forge.h src/file.h src/constants.h src/window.h src/shaders.h src/timer.h src/string.h src/config_file.h src/rand.h src/video.h src/shared.h src/midi.h src/state.h src/arr.h src/tempo.h $(top_srcdir)/include/glad/gl.h $(top_srcdir)/include/glad/egl.h $(top_srcdir)/include/linmath.h $(top_srcdir)/include/hashmap.h $(top_srcdir)/include/log.h
EXTRA_DIST = default.cfg shaders/frag0.glsl shaders/frag1.glsl shaders/frag2.glsl shaders/frag3.glsl shaders/frag4.glsl shaders/frag5.glsl shaders/frag6.glsl shaders/frag7.glsl shaders/frag8.glsl shaders/frag9.glsl shaders/frag10.glsl
EXTRA_DIST = default/forge_project.cfg default/frag0.glsl default/frag1.glsl default/frag2.glsl default/frag3.glsl default/frag4.glsl default/frag5.glsl default/frag6.glsl default/frag7.glsl default/frag8.glsl default/frag9.glsl default/frag10.glsl
confdir = $(prefix)/share/$(PACKAGE)
conf_DATA = default.cfg shaders/frag0.glsl shaders/frag1.glsl shaders/frag2.glsl shaders/frag3.glsl shaders/frag4.glsl shaders/frag5.glsl shaders/frag6.glsl shaders/frag7.glsl shaders/frag8.glsl shaders/frag9.glsl shaders/frag10.glsl
conf_DATA = default/forge_project.cfg default/frag0.glsl default/frag1.glsl default/frag2.glsl default/frag3.glsl default/frag4.glsl default/frag5.glsl default/frag6.glsl default/frag7.glsl default/frag8.glsl default/frag9.glsl default/frag10.glsl
+13 -8
View File
@@ -12,7 +12,7 @@ Discover an engine where user-defined fragment shaders collide to produce stunni
![](./images/preview.png)
See [Demo #1 - 1H](https://youtu.be/HgErrasSs-w) and [Demo #2 - Monitor View](https://youtu.be/RW9Pno7YAzg) on YouTube
b
<!-- omit from toc -->
## Table of Contents
@@ -25,11 +25,12 @@ See [Demo #1 - 1H](https://youtu.be/HgErrasSs-w) and [Demo #2 - Monitor View](ht
- [Usage](#usage)
- [Runtime keybindings](#runtime-keybindings)
- [CLI arguments](#cli-arguments)
- [Default Shaders and Config](#default-shaders-and-config)
- [Default Project](#default-project)
- [Sources and Effects](#sources-and-effects)
- [Debug View](#debug-view)
- [NanoKontrol2 Controller mapping](#nanokontrol2-controller-mapping)
- [Making your own FORGE config](#making-your-own-forge-config)
- [Making your own FORGE project](#making-your-own-forge-project)
- [`forge_project.cfg`](#forge_projectcfg)
- [Working with `frag0.glsl`](#working-with-frag0glsl)
- [Frequently Asked Questions](#frequently-asked-questions)
- [Why "steel"?](#why-steel)
@@ -100,7 +101,7 @@ When running, the following keybindings are available:
### CLI arguments
```txt
usage: forge [-h] [-v] [-hr] [-s=SCREEN] [-m=SCREEN] [-mo] [-f=DIR_PATH] [-c=CFG_PATH] [-sf=STATE_PATH] [-ls / -nls] [-ss / -nss] [-is=SIZE] [-v=FILE] [-vs=SIZE] [-t=TEMPO] [--demo] [-w]
usage: forge [-h] [-v] [-hr] [-s=SCREEN] [-m=SCREEN] [-mo] [-p=PROJECT_PATH] [-c=CFG_FILE] [-sf=STATE_PATH] [-ls / -nls] [-ss / -nss] [-is=SIZE] [-v=FILE] [-vs=SIZE] [-t=TEMPO] [--demo] [-w]
Fusion Of Real-time Generative Effects.
@@ -111,8 +112,8 @@ options:
-s, --screen output screen number (default: primary)
-m, --monitor monitor screen number (default: none)
-mo, --monitor-only no output screen
-f, --frag fragment shaders directory (default: /usr/share/forge/shaders)
-c, --config fragment shaders config file (default: /usr/share/forge/default.cfg)
-p, --project forge project directory (default: /usr/share/forge/default)
-c, --config config file name (default: forge_project.cfg)
-sf, --state-file saved state file (default: forge_saved_state.txt)
-ls, --load-state load saved state (default)
-nls, --no-load-state do not load saved state
@@ -128,7 +129,7 @@ options:
--trace-fps print fps status of subsystems
```
## Default Shaders and Config
## Default Project
> A.K.A Kleπek's shaders
@@ -166,7 +167,11 @@ TODO update
> ⚠️ you'll need to change your NanoKontrol2 settings to remove the "toggle" behavior of the buttons and use "external" led control
## Making your own FORGE config
## Making your own FORGE project
TODO
### `forge_project.cfg`
TODO
+11 -11
View File
@@ -20,8 +20,8 @@ static void print_help(int status_code) {
"[-s=SCREEN] "
"[-m=SCREEN] "
"[-mo] "
"[-f=DIR_PATH] "
"[-c=CFG_PATH] "
"[-p=PROJECT_PATH] "
"[-c=CFG_FILE] "
"[-sf=STATE_PATH] "
"[-ls / -nls] "
"[-ss / -nss] "
@@ -40,10 +40,10 @@ static void print_help(int status_code) {
" -s, --screen output screen number (default: primary)\n"
" -m, --monitor monitor screen number (default: none)\n"
" -mo, --monitor-only no output screen\n"
" -f, --frag fragment shaders directory "
"(default: " DATADIR "/shaders)\n"
" -c, --config fragment shaders config file "
"(default: " DATADIR "/default.cfg)\n"
" -p, --project forge project directory "
"(default: " DATADIR "/default)\n"
" -c, --config config file name "
"(default: forge_project.cfg)\n"
" -sf, --state-file saved state file (default: "
"forge_saved_state.txt)\n"
" -ls, --load-state load saved state (default)\n"
@@ -105,8 +105,8 @@ Parameters args_parse(int argc, char **argv) {
params.output_screen = 0;
params.monitor = false;
params.monitor_screen = 0;
strncpy(params.frag_path, DATADIR "/shaders", STR_LEN);
strncpy(params.config_path, DATADIR "/default.cfg", STR_LEN);
strncpy(params.project_path, DATADIR "/default", STR_LEN);
strncpy(params.config_file, "forge_project.cfg", STR_LEN);
strncpy(params.state_file, "forge_saved_state.txt", STR_LEN);
params.load_state = true;
params.save_state = true;
@@ -131,10 +131,10 @@ Parameters args_parse(int argc, char **argv) {
params.hot_reload = true;
} else if (is_arg(arg, "-s") || is_arg(arg, "--screen")) {
params.output_screen = parse_uint(arg, value);
} else if (is_arg(arg, "-f") || is_arg(arg, "--frag")) {
strncpy(params.frag_path, value, STR_LEN);
} else if (is_arg(arg, "-p") || is_arg(arg, "--project")) {
strncpy(params.project_path, value, STR_LEN);
} else if (is_arg(arg, "-c") || is_arg(arg, "--config")) {
strncpy(params.config_path, value, STR_LEN);
strncpy(params.config_file, value, STR_LEN);
} else if (is_arg(arg, "-sf") || is_arg(arg, "--state-file")) {
strncpy(params.state_file, value, STR_LEN);
} else if (is_arg(arg, "-ls") || is_arg(arg, "--load-state")) {
+7 -2
View File
@@ -233,19 +233,24 @@ static void loop(bool hr, bool trace_fps) {
void forge_run(Parameters params) {
unsigned int frag_count, in_count;
char config_path[STR_LEN];
context = shared_init_context("/" PACKAGE "_context");
context->stop = false;
config = config_file_read(params.config_path);
strncpy(config_path, params.project_path, STR_LEN);
strcat(config_path, "/");
strcat(config_path, params.config_file);
config = config_file_read(config_path);
frag_count = config_file_get_int(config, "FRAG_COUNT", 1);
in_count = config_file_get_int(config, "IN_COUNT", 0);
state_config = state_parse_config(config);
init_files(params.frag_path, frag_count);
init_files(params.project_path, frag_count);
init_inputs(params.video_in, params.video_size);
+2 -2
View File
@@ -35,8 +35,8 @@ typedef struct Parameters {
unsigned int output_screen;
bool monitor;
unsigned int monitor_screen;
char frag_path[STR_LEN];
char config_path[STR_LEN];
char project_path[STR_LEN];
char config_file[STR_LEN];
char state_file[STR_LEN];
bool load_state;
bool save_state;