diff --git a/docs/primitives.md b/docs/primitives.md
index 72a47295..be062129 100644
--- a/docs/primitives.md
+++ b/docs/primitives.md
@@ -27,6 +27,7 @@
* [voxel](#data/voxel) - 3D voxels
* [volume](#data/volume) - 3D sampled voxels
* [scale](#data/scale) - Human-friendly divisions on an axis, subdivided as needed
+ * [latch](#data/latch) - Control expr/data updates when conditions change
#### draw
@@ -80,6 +81,12 @@
* [step](#present/step) - Step through a sequenced animation
+#### reverse
+
+
+ * [reverse](#reverse/reverse) - Reverse data in one or more dimensions
+
+
#### rtt
@@ -344,6 +351,7 @@
* *line* = `false` (bool) - Draw line
* *lineBias* = `5` (number) - Z-Bias for lines on fill
* *map* = `null` (nullable select) - Texture map source, e.g. `"#map"`
+ * *normals* = `null` (nullable select) - Normals data source, e.g. `#normals`
* *opacity* = `1` (positive number) - Opacity
* *points* = `<` (select) - Points data source
* *proximity* = `null` (nullable number) - Proximity threshold, e.g. `10`
@@ -558,6 +566,16 @@
* *zTest* = `true` (bool) - Test Z buffer
* *zWrite* = `true` (bool) - Write Z buffer
+#### `data/latch`
+
+*Control expr/data updates when conditions change*
+
+ * *active* = `true` (bool) - Updates continuously
+ * *classes* = `[]` (string array) - Custom classes, e.g. `["big"]`
+ * *data* = `null` (nullable object) - Data to monitor for changes
+ * *deep* = `true` (boolean) - Do deep value comparison
+ * *id* = `null` (nullable string) - Unique ID, e.g. `"sampler"`
+
#### `transform/layer`
*Independent 2D layer/overlay*
@@ -854,6 +872,18 @@
* *id* = `null` (nullable string) - Unique ID, e.g. `"sampler"`
* *stagger* = `[0, 0, 0, 0]` (vec4) - Stagger dimensions, e.g. `[2, 1, 0, 0]`
+#### `reverse/reverse`
+
+*Reverse data in one or more dimensions*
+
+ * *classes* = `[]` (string array) - Custom classes, e.g. `["big"]`
+ * *depth* = `false` (boolean) - Reverse depth
+ * *height* = `false` (boolean) - Reverse height
+ * *id* = `null` (nullable string) - Unique ID, e.g. `"sampler"`
+ * *items* = `false` (boolean) - Reverse items
+ * *source* = `"<"` (select) - Input source
+ * *width* = `false` (boolean) - Reverse width
+
#### `base/root`
*Tree root*
@@ -906,9 +936,11 @@
*Custom shader snippet*
+ * *channels* = `4` (number) - Source channels
* *classes* = `[]` (string array) - Custom classes, e.g. `["big"]`
* *code* = `""` (string) - Shader code
* *id* = `null` (nullable string) - Unique ID, e.g. `"sampler"`
+ * *indices* = `4` (number) - Source indices
* *language* = `"glsl"` (string) - Shader language
* *sources* = `null` (nullable select) - Sampler sources, e.g. `["#pressure", "#divergence"]`
* *uniforms* = `null` (nullable object) - Shader uniform objects (three.js style), e.g. `{ time: { type: 'f', value: 3 }}`
@@ -1047,6 +1079,7 @@
* *line* = `false` (bool) - Draw line
* *lineBias* = `5` (number) - Z-Bias for lines on fill
* *map* = `null` (nullable select) - Texture map source, e.g. `"#map"`
+ * *normals* = `null` (nullable select) - Normals data source, e.g. `#normals`
* *opacity* = `1` (positive number) - Opacity
* *points* = `<` (select) - Points data source
* *proximity* = `null` (nullable number) - Proximity threshold, e.g. `10`
@@ -1093,6 +1126,7 @@
* *lineX* = `false` (bool) - Draw X lines
* *lineY* = `false` (bool) - Draw Y lines
* *map* = `null` (nullable select) - Texture map source, e.g. `"#map"`
+ * *normals* = `null` (nullable select) - Normals data source, e.g. `#normals`
* *opacity* = `1` (positive number) - Opacity
* *points* = `<` (select) - Points data source
* *proximity* = `null` (nullable number) - Proximity threshold, e.g. `10`
diff --git a/src/docs/primitives.js b/src/docs/primitives.js
index e69fafc2..48f1f237 100644
--- a/src/docs/primitives.js
+++ b/src/docs/primitives.js
@@ -55,6 +55,7 @@ export default {
{ expr: "function (emit, x, y, z, i, j, k, time, delta) { ... }" },
],
scale: ["data", "Human-friendly divisions on an axis, subdivided as needed"],
+ latch: ["data", "Control expr/data updates when conditions change"],
html: ["overlay", "HTML element source"],
dom: ["overlay", "HTML DOM injector"],
@@ -89,6 +90,7 @@ export default {
],
resample: ["operator", "Resample data to new dimensions with a shader"],
repeat: ["operator", "Repeat data in one or more dimensions"],
+ reverse: ["reverse", "Reverse data in one or more dimensions"],
swizzle: ["operator", "Swizzle data values"],
spread: ["operator", "Spread data values according to array indices"],
split: [