glsl-view
=========

a minimal GLSL shader host with an OSC interface for setting uniforms in realtime.

OSC interface
-------------

GLSL uniforms are accessible as `/$UNIFORM_NAME`. The OSC type must match the GLSL type:

    uniform float time = 0;
    uniform dvec3 color;

    ----

    /time f 123.56
    /color ddd 0.5 0.1 0.1

Vectors and matrices can be indexed using integers or the GLSL swizzling keys (x/y/z/w, r/g/b/a, s/t/p/q):

    uniform vec3 color;
    uniform mat3 mat;

    ----

    /color/r f 0.5
    /mat/0/y f 123

### samplers

When built with ffmpeg, images and videos can be loaded as 2D or 3D textures:

    uniform sampler2D image;
    uniform sampler3D videoA;
    uniform sampler2DArray videoB;

    ----

    /image s "image.jpg"
    /videoA s "subdir/video_a.mp4"
    /videoB s "subdir/video_b.mov"

The filepaths are interpreted relative to the config file.

### commands

A message to `/-/reload` forces a reload of the shader source code.

configuration
-------------

Configuration is read from `config.yaml` or the only command line argument.

- `fragment` (`str`): path to GLSL fragment shader.
- `width` (`int`): horizontal rendering resolution. defaults to `1920`.
- `height` (`int`): vertical rendering resolution. defaults to `1080`.
- `outputs`: list of outputs. defaults to one 800x600 window.
  each output is a dictionary with the following keys:
  - `type` (`str`): currently always `window`.
  - `width` (`int`): window width. defaults to `800`.
  - `height` (`int`): window height. defaults to `600`.
  - `filter` (`str`): one of `nearest` or `linear`.
- `osc`: either a 'liblo URL' or dictionary with the following keys:
  - `protocol` (`str`): `udp`, `tcp` or `unix`. defaults to `udp`.
  - `port` (`int`): port to bind to. defaults to `9000`.

### liblo URLs

Unfortunately undocumented by libio. The following formats are valid:

- `osc.udp://localhost:1234`
- `osc.udp://224.0.1.9:1234` (multicast IP)
- `osc.tcp://:1234`
- `osc.unix://localhost/tmp/mysocket` 
