##################################
## FORGE DEFAULT PROJECT CONFIG ##
##################################
# Your reading a FORGE configuration file, don't panic
# Everything here is designed to link elements between them
# (shaders, video devices, textures, midi inputs, etc.)
# Every number based constant will be "one-based" (1,2,3,etc.)
# To read more, go to
# https://git.klemek.fr/klemek/forge-steel


# ================
# FRAGMENT SHADERS
# ================


# === UNIFORMS ===
# GLSL uniform names or prefixes
# Prefixed uniforms are "iVariableX" with a number

# --- uniform float ---

# Elapsed time
UNIFORM_TIME=iTime
# Current tempo
UNIFORM_TEMPO=iTempo
# Current total beats
UNIFORM_BEATS=iBeats

# --- uniform int ---

# Output frame per second
UNIFORM_FPS=iFPS
# Input X frame per second
UNIFORM_IN_FPS_PREFIX=iInputFPS
# 0/1 if demo
UNIFORM_DEMO=iDemo
# 0/1 if auto random
UNIFORM_AUTORAND=iAutoRand
# auto random cycle length
UNIFORM_AUTORANDCYCLE=iAutoRandCycle
# Current page
UNIFORM_PAGE=iPage
# Current selected shader
UNIFORM_SELECTED=iSelected
# Seed for shader X
UNIFORM_SEED_PREFIX=iSeed
# State for shader X
UNIFORM_STATE_PREFIX=iState
# Midi group X active layer number
UNIFORM_ACTIVE_PREFIX=iActive
# Input X format raw integer value
UNIFORM_IN_FORMAT_PREFIX=iInputFormat
# Input X should use swap texture or not (0/1)
UNIFORM_IN_SWAP_PREFIX=iInputSwap

# --- uniform vec2 ---

# Output resolution
UNIFORM_RESOLUTION=iResolution
# Internal textures resolution
UNIFORM_TEX_RESOLUTION=iTexResolution
# Input X resolution
UNIFORM_IN_RESOLUTION_PREFIX=iInputResolution

# --- uniform vec3 ---

# Midi group X layer Y (beware of group size)
# Injected as "iMidiX_Y[Z]"
UNIFORM_MIDI_PREFIX=iMidi

# --- uniform sampler2D ---

# Internal texture X
UNIFORM_TEX_PREFIX=iTex

# === SUBROUTINES ===
# GLSL subroutines prefixes
# You can then use them as:
#   subroutine(<definition>) <type> <prefix><number>(<args>) {}
# (see: https://wikis.khronos.org/opengl/Shader_Subroutine)
# Numbers go from 1 to SELECT_PAGE_COUNT * SELECT_ITEM_COUNT
# Each fragment shader is injected its current state subroutine

# Total subroutine variants
SUB_TYPE_COUNT=2
# Each subroutine variant prefix
SUB_1_PREFIX=src_
SUB_2_PREFIX=fx_


# ===========
# TEXTURE I/O
# ===========


# Total number of internal textures
TEX_COUNT=12

# === VIDEO DEVICES
# Video devices will be read from CLI arguments
# and used in the same order inside FORGE

# Number of video devices
IN_COUNT=2
# To which texture will be bound video device X
IN_1_OUT=1
IN_2_OUT=2
# To which texture will be bound swap buffers (for double-buffering)
IN_1_SWAP_OUT=3
IN_2_SWAP_OUT=4

# === FRAGMENT SHADERS
# Fragment shaders will be read from the CLI directory as "fragX.glsl"

# Prefix of fragment shaders to detect
FRAG_FILE_PREFIX=frag

# Total number of fragment shaders (excluding frag0.glsl)
FRAG_COUNT=10

# To which texture will the shader fragX.glsl will render to
FRAG_1_OUT=5
FRAG_2_OUT=6
FRAG_3_OUT=7
FRAG_4_OUT=8
FRAG_5_OUT=9
FRAG_6_OUT=10
FRAG_7_OUT=11
FRAG_8_OUT=0
# Which fragment shader renders to output window
FRAG_OUTPUT=9
# Which fragment shader renders to monitor window
FRAG_MONITOR=10


# ========
# MIDI I/O
# ========


# The recognized ALSA name of the midi device
MIDI_HW=hw:CARD=nanoKONTROL2

# === TYPES OF EVENTS
# FORGE needs to differentiate between fader and buttons
# In the next configurations, when an event is not configured,
# it will be skipped

# Total number of faders
FADER_COUNT=16
# Midi codes of faders
FADER_1=0
FADER_2=1
FADER_3=2
FADER_4=3
FADER_5=4
FADER_6=5
FADER_7=6
FADER_8=7
FADER_9=16
FADER_10=17
FADER_11=18
FADER_12=19
FADER_13=20
FADER_14=21
FADER_15=22
FADER_16=23
# Midi code for tap tempo
TAP_TEMPO=46

# === FRAGMENT SUBROUTINE SELECT
# You can manipulate which subroutine is sent to which fragment shader

# Midi codes to select fragment X
SELECT_FRAG_3=32
SELECT_FRAG_4=64
SELECT_FRAG_5=36
SELECT_FRAG_6=68
SELECT_FRAG_8=52
# Total number of pages (can be 1)
SELECT_PAGE_COUNT=3
# Midi codes to select page X
SELECT_PAGE_1=60
SELECT_PAGE_2=61
SELECT_PAGE_3=62
# Total number of items per page
SELECT_ITEM_COUNT=5
# Midi codes to select item Y on page X
SELECT_ITEM_1=43
SELECT_ITEM_2=44
SELECT_ITEM_3=42
SELECT_ITEM_4=41
SELECT_ITEM_5=45

# === MIDI INPUT STATES
# Midi inputs will control FORGE's state as follows
# X groups of Y layers sized Z
# You can manipulate only 1 layer at a time
# Every layer of every groups will be send as uniforms
# Each active layer will be sent back to the device
# with the same codes for nice display

# Total number of groups
MIDI_COUNT=3

# Total number of layers of group 1
MIDI_1_ACTIVE_COUNT=2
# Midi codes to change layer of group 1
MIDI_1_ACTIVE_1=32
MIDI_1_ACTIVE_2=64

# Size of group 1
MIDI_1_COUNT=6
# Every code of active layer manipulation of group 1
MIDI_1_1_X=33
MIDI_1_1_Y=49
MIDI_1_1_Z=65
MIDI_1_2_X=1
MIDI_1_2_Y=17
MIDI_1_2_Z=
MIDI_1_3_X=34
MIDI_1_3_Y=50
MIDI_1_3_Z=66
MIDI_1_4_X=2
MIDI_1_4_Y=18
MIDI_1_4_Z=
MIDI_1_5_X=35
MIDI_1_5_Y=51
MIDI_1_5_Z=67
MIDI_1_6_X=3
MIDI_1_6_Y=19
MIDI_1_6_Z=

# Same for group 2
MIDI_2_ACTIVE_COUNT=3
MIDI_2_ACTIVE_1=36
MIDI_2_ACTIVE_2=68
MIDI_2_ACTIVE_3=52
MIDI_2_COUNT=7
MIDI_2_1_X=37
MIDI_2_1_Y=53
MIDI_2_1_Z=69
MIDI_2_2_X=5
MIDI_2_2_Y=21
MIDI_2_2_Z=
MIDI_2_3_X=38
MIDI_2_3_Y=54
MIDI_2_3_Z=70
MIDI_2_4_X=6
MIDI_2_4_Y=22
MIDI_2_4_Z=
MIDI_2_5_X=39
MIDI_2_5_Y=55
MIDI_2_5_Z=71
MIDI_2_6_X=7
MIDI_2_6_Y=23
MIDI_2_6_Z=
MIDI_2_7_X=4
MIDI_2_7_Y=20
MIDI_2_7_Z=59

# Same for group 3
MIDI_3_COUNT=2
MIDI_3_1_X=48
MIDI_3_1_Y=58
MIDI_3_1_Z=
MIDI_3_2_X=0
MIDI_3_2_Y=16
MIDI_3_2_Z=

# =====
# OTHER
# =====

# === SAVE FILES
# When loading/saving from last run or using save states
SAVE_FILE_PREFIX=forge_default_save

# === HOTKEYS
# You can change the default keycodes used on runtime
# Modifiers are encoded like this:
# 1000 -> shift
# 10000 -> control
# 100000 -> alt
# This means 110082 is control+alt+R

# R on (qwerty)
HOTKEY_RANDOMIZE=82
# SHIFT+R (qwerty)
HOTKEY_RESET=1082
# D (qwerty)
HOTKEY_DEMO=68
# A (qwerty)
HOTKEY_AUTORAND=65
# Left arrow
HOTKEY_AUTORAND_DOWN=263
# Right arrow
HOTKEY_AUTORAND_UP=262
# Down arrow
HOTKEY_TEMPO_DOWN=264
# Up arrow
HOTKEY_TEMPO_UP=265

# Number of load states keys
HOTKEY_LOAD_COUNT=10

# 1 to 9 then 0 keys
HOTKEY_LOAD_1=49
HOTKEY_LOAD_2=50
HOTKEY_LOAD_3=51
HOTKEY_LOAD_4=52
HOTKEY_LOAD_5=53
HOTKEY_LOAD_6=54
HOTKEY_LOAD_7=55
HOTKEY_LOAD_8=56
HOTKEY_LOAD_9=57
HOTKEY_LOAD_10=48

# Number of save states keys
HOTKEY_SAVE_COUNT=10

# 1 to 9 then 0 keys with shift
HOTKEY_SAVE_1=1049
HOTKEY_SAVE_2=1050
HOTKEY_SAVE_3=1051
HOTKEY_SAVE_4=1052
HOTKEY_SAVE_5=1053
HOTKEY_SAVE_6=1054
HOTKEY_SAVE_7=1055
HOTKEY_SAVE_8=1056
HOTKEY_SAVE_9=1057
HOTKEY_SAVE_10=1048
