1format: tdn
2version: '2.0'
3build: null
4generator: Embody/6.0.26
5td_build: 099.2025.32820
6source_file: Embody-6.26.toe
7exported_at: '2026-06-13T15:59:04Z'
8network_path: /specimen_lab/plasma_interference
9options:
10 include_dat_content: true
11 include_storage: true
12type_defaults:
13 textDAT:
14 parameters:
15 language: glsl
16 flags:
17 - viewer
18 size: [130, 90]
19 color: [0.67, 0.67, 0.67]
20type: baseCOMP
21custom_pars:
22 Plasma:
23 - name: Scale
24 style: Float
25 startSection: true
26 default: 6
27 min: 1.0
28 max: 20.0
29 clampMin: true
30 clampMax: true
31 normMin: 1.0
32 normMax: 20.0
33 help: Spatial frequency of the sine fields. Low = broad lava-lamp blobs; high = dense fine plasma.
34 - name: Speed
35 style: Float
36 default: 1
37 max: 4.0
38 clampMin: true
39 clampMax: true
40 normMax: 4.0
41 help: Animation speed. 1 = gentle flow; 0 freezes a still (the TOP keeps cooking, frame is identical).
42 - name: Warp
43 style: Float
44 default: 1.2
45 max: 3.0
46 clampMin: true
47 clampMax: true
48 normMax: 3.0
49 help: Domain-warp amount. 0 = flat sliding stripes; higher bends the coords into a flowing liquid swirl.
50 - name: Complexity
51 style: Float
52 label: Interference
53 default: 1
54 max: 2.0
55 clampMin: true
56 clampMax: true
57 normMax: 2.0
58 help: Detune between the two sine fields. 0 = one clean plasma; higher beats them into shimmering moire.
59 - name: Palette
60 style: Float
61 label: Palette Hue
62 startSection: true
63 clampMin: true
64 clampMax: true
65 help: Rotates the cyclic cosine palette through the full hue ring. Loops seamlessly 1.0 -> 0.0.
66 - name: Contrast
67 style: Float
68 default: 0.4
69 clampMin: true
70 clampMax: true
71 help: Palette saturation/contrast (onto a 0.6 base in the shader). Low = pastel; high = punchy neon.
72color: [0.67, 0.67, 0.67]
73operators:
74- name: out1
75 type: outTOP
76 parameters:
77 label: =me.name
78 flags:
79 - viewer
80 position: [800, 0]
81 size: [130, 90]
82 color: [0.67, 0.67, 0.67]
83 inputs:
84 - glsl_plasma
85- name: annotate1
86 type: annotateCOMP
87 parameters:
88 order: =me.digits or 0
89 layerzone: =0 if hasattr(me, 'EncloseOPs') and me.EncloseOPs else 1
90 sequences:
91 ext:
92 - object: op.TDAnnotate.mod.AnnotateExt.AnnotateExt(me)
93 promote: true
94 custom_pars:
95 Text:
96 - name: Titletext
97 style: Str
98 label: Title Text
99 startSection: true
100 default: Annotate
101 help: Text in the title bar.
102 value: Plasma - interfering sine fields + domain warp
103 - name: Titleheight
104 style: Int
105 label: Title Height
106 default: 30
107 clampMin: true
108 normMin: 5.0
109 normMax: 100.0
110 help: Height of the title bar. Title font height adjusts automatically to fill.
111 - name: Titlealign
112 style: Menu
113 label: Title Align
114 default: left
115 menuNames:
116 - left
117 - center
118 - right
119 menuLabels:
120 - Left
121 - Center
122 - Right
123 help: Alignment of title text.
124 - name: Bodytext
125 style: Str
126 label: Body Text
127 startSection: true
128 help: Text in the body area. Use an expression for newlines etc.
129 value: 'Two sine-wave fields at slightly detuned scales BEAT against each other -> moire fringes (the shimmer). A slow rotating domain warp bends the sample coords -> liquid flow. The summed field is folded cyclically into 0..1 and mapped through an Inigo-Quilez cosine palette (smooth hue cycling, never bands); a vignette frames it as a loop. All on the GPU in one glslTOP -- no input, no feedback, stateless and cheap. Params: Scale, Speed, Warp, Complexity (detune), Palette (hue), Contrast.'
130 - name: Bodyfontsize
131 style: Int
132 label: Body Font Size
133 default: 10
134 clampMin: true
135 normMin: 8.0
136 normMax: 100.0
137 help: Size of text in the body area.
138 - name: Bodylimitwidth
139 style: Toggle
140 label: Limit Body Text Width
141 help: Limit the width of the text area.
142 - name: Bodymaxwidth
143 style: Int
144 label: Max Body Text Width
145 default: 1000
146 clampMin: true
147 normMin: 100.0
148 normMax: 2000.0
149 help: Width limit that will cause wraparound or cut-off. Measured in Panel units.
150 Settings:
151 - name: Mode
152 style: Menu
153 default: comment
154 menuNames:
155 - comment
156 - networkbox
157 - annotate
158 menuLabels:
159 - Comment
160 - Network Box
161 - Annotate
162 help: 'Switch between Comment, Network Box, and Annotate Modes. '
163 value: annotate
164 - name: Smartquote
165 style: Toggle
166 label: Smart Quote
167 startSection: true
168 help: Converts quotes, ellipsis, and dashes to more typographically nice unicode versions.
169 - name: Bodywordwrap
170 style: Toggle
171 label: Body Word Wrap
172 default: true
173 help: Wrap body text when it extends past right bound.
174 - name: Backcolorr
175 style: RGBA
176 label: Back Color
177 startSection: true
178 default: 1
179 help: Background color base.
180 values: [0.13, 0.28, 0.32]
181 - name: Backcoloralpha
182 style: Float
183 label: Back Color Alpha
184 default: 1
185 clampMin: true
186 clampMax: true
187 help: Back color alpha.
188 - name: Opacity
189 style: Float
190 label: Annotate Opacity
191 default: 1
192 clampMin: true
193 clampMax: true
194 help: Opacity of the entire Annotate.
195 value: 0.25
196 OP Viewer:
197 - name: Opviewerdisplay
198 style: Toggle
199 label: Viewer Display
200 help: Turn the visibility of the viewer specified in the OP parameter below on or off.
201 - name: Opviewer
202 style: OP
203 label: OP
204 help: The operator whose viewer is displayed in the Annotate.
205 - name: Opviewerinteractive
206 style: Toggle
207 label: OP Viewer Interactive
208 help: Allow interaction with the OP viewer.
209 - name: Opvieweroversize
210 style: Menu
211 label: Size/Aspect Override
212 startSection: true
213 default: 'False'
214 menuNames:
215 - natural
216 - specify
217 - autofit
218 menuLabels:
219 - Natural
220 - Specify
221 - Auto-Fit
222 help: Use the Size/Aspect Override to control viewer's size in the background.
223 value: natural
224 - name: Opviewersize
225 style: WH
226 label: Size/Aspect
227 default: 800
228 clampMin: true
229 normMin: 1.0
230 normMax: 1000.0
231 help: Diplay viewer as-if it were being displayed at this resolution. This is particularly useful for zooming into operators that don't have a built-in resolution, like CHOPs, SOPs, and DATs.
232 - name: Opviewerscale
233 style: Float
234 label: Scale
235 startSection: true
236 default: 1
237 normMax: 2.0
238 help: Scale the viewer by this factor.
239 - name: Opviewerjustifyx
240 style: Float
241 label: Justify X
242 normMin: -1.0
243 help: Move the border of the viewer towards left edge of Annotate when negative or towards right edge when positive.
244 - name: Opviewerjustifyy
245 style: Float
246 label: Justify Y
247 normMin: -1.0
248 - name: Opviewerfillbodytitle
249 style: Toggle
250 label: Cover Body and Title
251 help: When True, allow viewer to display in the Annotate title area as well as body.
252 - name: Opviewerzoom
253 style: Float
254 label: OP Viewer Zoom
255 startSection: true
256 default: 1
257 min: 0.001
258 clampMin: true
259 normMin: 1.0
260 normMax: 5.0
261 help: Zoom the viewer by this scale factor without increasing the size of its display area in the Annotate.
262 - name: Opvieweroffsetx
263 style: XYZW
264 label: OP Viewer Offset
265 help: Offsets the displayed area within the viewer. Combined with OP Viewer Zoom, this lets you display a specific area of a viewer, such as a CHOP channel or table cell.
266 - name: Opviewerfillalpha
267 style: Float
268 label: Fill Alpha
269 startSection: true
270 default: 1
271 clampMin: true
272 clampMax: true
273 help: Alpha value of the background area in the OP Viewer.
274 About:
275 - name: Version
276 style: Str
277 startSection: true
278 default: '1.0'
279 readOnly: true
280 help: Annotate COMP default setup version.
281 - name: Help
282 style: Pulse
283 help: Click to open help page.
284 flags:
285 - display
286 position: [180, -220]
287 size: [820, 480]
288 color: [0.45, 0.45, 0.45]
289 palette_clone: true
290- name: glsl_plasma
291 type: glslTOP
292 parameters:
293 pixeldat: glsl_plasma_pixel
294 computedat: glsl_plasma_compute
295 outputresolution: custom
296 resolutionw: 1280
297 resolutionh: 720
298 sequences:
299 vec:
300 - name: uParams
301 valuex: =parent().par.Scale.eval()
302 valuey: =parent().par.Warp.eval()
303 valuez: =parent().par.Complexity.eval()
304 valuew: =absTime.seconds*parent().par.Speed.eval()
305 - name: uPalette
306 valuex: =parent().par.Palette.eval()
307 valuey: =parent().par.Contrast.eval()
308 valuez: 0
309 valuew: 0
310 position: [400, 0]
311 size: [130, 90]
312 color: [0.67, 0.67, 0.67]
313- name: glsl_plasma_info
314 type: infoDAT
315 parameters:
316 op: glsl_plasma
317 flags:
318 - viewer
319 position: [550, -150]
320 size: [130, 90]
321 color: [0.67, 0.67, 0.67]
322 dock: glsl_plasma
323 dat_read_only: true
324- name: glsl_plasma_pixel
325 type: textDAT
326 parameters:
327 extension: frag
328 position: [400, -150]
329 dock: glsl_plasma
330 dat_content: |-
331 uniform vec4 uParams; // x=scale, y=warp, z=complexity(detune), w=time(=absTime*Speed)
332 uniform vec4 uPalette; // x=hue 0..1, y=contrast
333 out vec4 fragColor;
334 const float PI = 3.14159265;
335
336 // Inigo-Quilez cyclic cosine palette: smooth, loops in hue, never bands.
337 vec3 palette(float t, float hue, float contrast){
338 vec3 a = vec3(0.5);
339 vec3 b = vec3(0.5) * contrast;
340 vec3 c = vec3(1.0, 1.0, 1.0);
341 vec3 d = vec3(0.00, 0.33, 0.67) + hue; // hue rotates the phase offsets
342 return a + b * cos(6.28318 * (c * t + d));
343 }
344
345 // One animated sine field: a handful of moving plane-waves summed.
346 float field(vec2 p, float time, float freq){
347 float v = 0.0;
348 v += sin(p.x * freq + time);
349 v += sin(p.y * freq * 1.3 + time * 1.1);
350 v += sin((p.x + p.y) * freq * 0.7 + time * 0.9);
351 float cx = p.x + 0.5 * sin(time * 0.4);
352 float cy = p.y + 0.5 * cos(time * 0.35);
353 v += sin(sqrt(cx * cx + cy * cy) * freq * 1.6 + time * 1.3); // radial ripple, moving center
354 return v;
355 }
356
357 void main(){
358 float aspect = uTDOutputInfo.res.z / uTDOutputInfo.res.w; // output res = (1/w,1/h,w,h); zw = pixel dims
359 vec2 uv = vUV.st;
360 vec2 p = (uv - 0.5);
361 p.x *= aspect; // keep the plasma square on wide formats
362
363 float t = uParams.w;
364 float scale = max(0.5, uParams.x);
365 float warp = uParams.y;
366 float detune = uParams.z;
367
368 p *= scale;
369
370 // Domain warp: a slow rotating swirl bends the sample coords -> liquid flow.
371 vec2 w = vec2(
372 sin(p.y * 1.7 + t * 0.5),
373 cos(p.x * 1.5 - t * 0.45)
374 );
375 vec2 pw = p + warp * w;
376
377 // Two fields at slightly detuned scales BEAT against each other -> fringes.
378 float f1 = field(pw, t, 1.0);
379 float f2 = field(pw, t * 1.05, 1.0 + 0.25 * detune);
380 float v = (f1 + f2) * 0.25; // ~[-2,2]; folded cyclically into 0..1 below
381 v += 0.30 * detune * sin((f1 - f2) * PI); // explicit beat term -> visible moire shimmer
382
383 float tone = 0.5 + 0.5 * sin(v * PI); // fold into 0..1, smooth + cyclic
384
385 vec3 col = palette(tone, uPalette.x, 0.6 + uPalette.y);
386
387 float d = length(uv - 0.5); // gentle vignette: reads as a framed loop
388 col *= mix(1.0, 0.55, smoothstep(0.45, 0.95, d));
389
390 fragColor = vec4(clamp(col, 0.0, 1.0), 1.0);
391 }
392 dat_content_format: text
393- name: glsl_plasma_compute
394 type: textDAT
395 position: [250, -150]
396 dock: glsl_plasma
397annotations:
398- name: annotate1
399 mode: annotate
400 title: Plasma - interfering sine fields + domain warp
401 text: 'Two sine-wave fields at slightly detuned scales BEAT against each other -> moire fringes (the shimmer). A slow rotating domain warp bends the sample coords -> liquid flow. The summed field is folded cyclically into 0..1 and mapped through an Inigo-Quilez cosine palette (smooth hue cycling, never bands); a vignette frames it as a loop. All on the GPU in one glslTOP -- no input, no feedback, stateless and cheap. Params: Scale, Speed, Warp, Complexity (detune), Palette (hue), Contrast.'
402 position: [180, -220]
403 size: [820, 480]
404 color: [0.13, 0.28, 0.32]
405 opacity: 0.25