summaryrefslogtreecommitdiff
path: root/doc/SEQUENCE_v2.md
blob: 74692a685096e7d759624eb9cd22e1f2db769662 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
# Sequence v2 System Documentation

This document describes the high-level ideas for an improved Sequence + Effects system "version 2".

## Goal

* more flexibility and less boilerplate
* fully configurable by text (.seq)
* no compatibility with previous version of sequences
* sequence can be stacked (with priority) and arranged in a timeline to create a demo

## Structure

### Sequence

A 'Sequence' unit consist of:
  * A predeclared set of named assets and Effects that are used during the sequence
  * a start-time, end-time
  * a globally-visible set of internal time-dependent params (UniformsSequenceParams) derived from GlobalParams
  * a globally-visible set of fixed params values (UniformsSequenceStaticParams) used to configure effects
  * an input in RGBAu8 format ("Source"). Black by default (RGB=0,0,0,255). Buffer format: u8x4_norm (see below)
  * an output in RGBAu8 format ("Sink"). This output goes to the next sequence in stack or to physical display
  * the sink of a Sequence is the source of the next Sequence in the stack, or goes to screen if it's the last sequence in stack
  * three programatic sections: 'Preprocess', 'EffectFlow' (time-ordered set of effects), 'Postprocess'
  * a set of internal buffers (Nodes = compute buffers or textures, used as input or render targets by effects stack)
  * this Nodes are visible to the final post-process effect
  * Node persists during the whole sequence
  * at compile time, one can detect which Node can actually be ping-pong buffers
  * each Sequence's preprocess and postprocess is unique and attached to the sequence

### Effects

The effect unit consists in:
  * An 'Effect' within the Sequence uses the UniformsSequenceParams and GlobalParams to update its internal state
  * Receives updated InputNode from the previous effects (InputNode = buffer, textures, g-buffer, ...)
  * processes them with a shader or c++ code (3d engine, etc.)
  * fills its OutputNode, passed to the next effect or the final postprocessing step
  * uses the sequence's assets and params only
  * if needed an effect predefines an alias of one of its internal buffer as its declared 'postprocess_output' OutputNode
  * by default, postprocess_output = sequence RGBA Source
  * Effect's are not attached to a particular Sequence, and can be used in any Sequence

### Preprocess:
  * the preprocessing step sets up the local UniformsSequenceParams (prepare timers, objects' transforms, camera position, fills Uniform buffers, etc.) 
  * it's a single function attached to the Sequence unit (virtual method?)

### Postprocess:
  * the post-process unique (virtual) function is responsible for the final assembly into OuputNode
  * it can take any internal Node as input (most likely the last effects' output) and produces its final Sink content

## How it works

### initialization

at initialization time, the sequence knows from compile-time:
  * the list of assets it needs to be ready at start time
  * the list of effects needed, their input nodes, their output node
  * the list of internal textures, buffer, render target, depth-buffer it will need for its stack effect to work
  * which intern Node buffers can actually be ping-pong buffers, to optimize resource
  * generally speaking, the lifetime of a buffer during a frame is known at compile time and can be optimized

### Flow
  * preprocess: prepare internal state at time t: UniformsSequenceParams
  * for each effects:
     ** bind the InputNode nodes (previous effect buffers, compute buffers, etc.)
     ** runs the compute, vertex and fragment passes
     ** fills its output Nodes
  * process: turns its pre-declared input Nodes into its unique Sink node, ready for next sequence, or display

## Requirement

  * unified code to flow the engine
  * textual description of the sequence/effects arrangement (similar to the .seq)
  * update the HTML editor tool
  * unified description of buffer, texture and compute buffers at compilation time
    ** example, of a sequence's internal Node declaration:
     "NODE Name1 u8x16_norm"
     "NODE Name2 f32x4"
     "NODE Name3 f16x8"
     "Node Name4 u8x4_norm" <- Source/Sink of a sequence, four bytes
  * each effect
    ** declares its requirement as input Node.
    ** declares its output Node
    ** can access the C++ version and WebGPU versions of GlobalParams, UniformsSequenceParams and UniformsSequenceStaticParams
    ** are not attached to a particular sequence, but can be used in many
  * validation and optimization at compile time (generating c++ code) by seq_compiler
  * compilation can generate boilerplate preprocess() / postprocess() functions  
  * no backward compatibility needed. Sequence v1 can go.
  * the HTML Editor overall code, look and functionalities need to be preserved though. Just adapted to v2.
    ** basically the sequence box will need to show input Node and output Node and have an editable property panel for these
    ** same for effects: ability to edit their input Node and output Node names
  * a lot of v1 effects can be deleted (solarized, chroma aberration, etc.): they will be implemented ad-hoc in postprocess() with a single macro call within the final shader
  * need a minimal migration plan for code.