@dpantani/tdmcp 0.1.0 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +96 -346
- package/dist/cli/agent.d.ts +139 -3
- package/dist/cli/agent.js +10236 -405
- package/dist/cli/agent.js.map +1 -1
- package/dist/index.js +13845 -2954
- package/dist/index.js.map +1 -1
- package/dist/knowledge/data/meta.json +1 -1
- package/dist/recipes/feedback_tunnel.json +4 -4
- package/dist/recipes/noise_landscape.json +102 -1
- package/dist/recipes/performable_feedback_tunnel.json +92 -0
- package/dist/recipes/webcam_glitch.json +5 -1
- package/package.json +21 -3
- package/recipes/feedback_tunnel.json +4 -4
- package/recipes/noise_landscape.json +102 -1
- package/recipes/performable_feedback_tunnel.json +92 -0
- package/recipes/webcam_glitch.json +5 -1
- package/td/README.md +1 -1
- package/td/modules/mcp/controllers/api_controller.py +70 -7
- package/td/modules/mcp/services/analysis_service.py +7 -2
- package/td/modules/mcp/services/api_service.py +25 -3
- package/td/modules/mcp/services/batch_service.py +36 -2
- package/td/modules/mcp/services/preview_service.py +89 -11
- package/td/modules/utils/version.py +1 -1
- package/td/tests/test_api_controller.py +67 -2
- package/td/tests/test_services.py +209 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"source":"bottobot","bottobotVersion":"2.8.0","importedAt":"2026-05-
|
|
1
|
+
{"source":"bottobot","bottobotVersion":"2.8.0","importedAt":"2026-05-26T08:21:03.449Z","counts":{"operators":629,"pythonClasses":68,"tutorials":14,"patterns":32,"glsl":7}}
|
|
@@ -21,14 +21,14 @@
|
|
|
21
21
|
{
|
|
22
22
|
"name": "transform1",
|
|
23
23
|
"type": "transformTOP",
|
|
24
|
-
"parameters": { "
|
|
24
|
+
"parameters": { "sx": 1.03, "sy": 1.03, "rotate": 1.5 },
|
|
25
25
|
"comment": "Zoom + rotate each frame to create the tunnel motion"
|
|
26
26
|
},
|
|
27
27
|
{ "name": "blur1", "type": "blurTOP", "parameters": { "size": 2 } },
|
|
28
28
|
{
|
|
29
29
|
"name": "level1",
|
|
30
30
|
"type": "levelTOP",
|
|
31
|
-
"parameters": { "
|
|
31
|
+
"parameters": { "brightness1": 0.96 },
|
|
32
32
|
"comment": "Decay / feedback gain"
|
|
33
33
|
},
|
|
34
34
|
{ "name": "out1", "type": "nullTOP", "comment": "Output of the system" }
|
|
@@ -53,7 +53,7 @@
|
|
|
53
53
|
{
|
|
54
54
|
"name": "feedback_gain",
|
|
55
55
|
"node": "level1",
|
|
56
|
-
"param": "
|
|
56
|
+
"param": "brightness1",
|
|
57
57
|
"value": 0.96,
|
|
58
58
|
"min": 0,
|
|
59
59
|
"max": 1,
|
|
@@ -62,7 +62,7 @@
|
|
|
62
62
|
{
|
|
63
63
|
"name": "zoom",
|
|
64
64
|
"node": "transform1",
|
|
65
|
-
"param": "
|
|
65
|
+
"param": "sx",
|
|
66
66
|
"value": 1.03,
|
|
67
67
|
"min": 1,
|
|
68
68
|
"max": 1.2,
|
|
@@ -70,7 +70,108 @@
|
|
|
70
70
|
"min": 0,
|
|
71
71
|
"max": 2,
|
|
72
72
|
"label": "Terrain Height"
|
|
73
|
+
},
|
|
74
|
+
{
|
|
75
|
+
"name": "sky_r",
|
|
76
|
+
"node": "render1",
|
|
77
|
+
"param": "bgcolorr",
|
|
78
|
+
"value": 0.06,
|
|
79
|
+
"description": "Background sky red — deep indigo atmosphere instead of empty white void."
|
|
80
|
+
},
|
|
81
|
+
{
|
|
82
|
+
"name": "sky_g",
|
|
83
|
+
"node": "render1",
|
|
84
|
+
"param": "bgcolorg",
|
|
85
|
+
"value": 0.07,
|
|
86
|
+
"description": "Background sky green."
|
|
87
|
+
},
|
|
88
|
+
{
|
|
89
|
+
"name": "sky_b",
|
|
90
|
+
"node": "render1",
|
|
91
|
+
"param": "bgcolorb",
|
|
92
|
+
"value": 0.14,
|
|
93
|
+
"description": "Background sky blue."
|
|
94
|
+
},
|
|
95
|
+
{
|
|
96
|
+
"name": "sky_a",
|
|
97
|
+
"node": "render1",
|
|
98
|
+
"param": "bgcolora",
|
|
99
|
+
"value": 1,
|
|
100
|
+
"description": "Background alpha = 1 so the sky is opaque (not transparent/white)."
|
|
101
|
+
},
|
|
102
|
+
{
|
|
103
|
+
"name": "terrain_diffuse_r",
|
|
104
|
+
"node": "phong1",
|
|
105
|
+
"param": "diffr",
|
|
106
|
+
"value": 0.3,
|
|
107
|
+
"description": "Terrain diffuse red — mossy green so the landscape is coloured, not default grey."
|
|
108
|
+
},
|
|
109
|
+
{
|
|
110
|
+
"name": "terrain_diffuse_g",
|
|
111
|
+
"node": "phong1",
|
|
112
|
+
"param": "diffg",
|
|
113
|
+
"value": 0.58,
|
|
114
|
+
"description": "Terrain diffuse green."
|
|
115
|
+
},
|
|
116
|
+
{
|
|
117
|
+
"name": "terrain_diffuse_b",
|
|
118
|
+
"node": "phong1",
|
|
119
|
+
"param": "diffb",
|
|
120
|
+
"value": 0.42,
|
|
121
|
+
"description": "Terrain diffuse blue."
|
|
122
|
+
},
|
|
123
|
+
{
|
|
124
|
+
"name": "terrain_ambient_r",
|
|
125
|
+
"node": "phong1",
|
|
126
|
+
"param": "ambr",
|
|
127
|
+
"value": 0.07,
|
|
128
|
+
"description": "Ambient red — cool indigo fill matching the sky so shadow sides read as atmospheric depth, not black."
|
|
129
|
+
},
|
|
130
|
+
{
|
|
131
|
+
"name": "terrain_ambient_g",
|
|
132
|
+
"node": "phong1",
|
|
133
|
+
"param": "ambg",
|
|
134
|
+
"value": 0.11,
|
|
135
|
+
"description": "Ambient green."
|
|
136
|
+
},
|
|
137
|
+
{
|
|
138
|
+
"name": "terrain_ambient_b",
|
|
139
|
+
"node": "phong1",
|
|
140
|
+
"param": "ambb",
|
|
141
|
+
"value": 0.2,
|
|
142
|
+
"description": "Ambient blue (indigo fill)."
|
|
143
|
+
},
|
|
144
|
+
{
|
|
145
|
+
"name": "terrain_specular_r",
|
|
146
|
+
"node": "phong1",
|
|
147
|
+
"param": "specr",
|
|
148
|
+
"value": 0.7,
|
|
149
|
+
"description": "Specular red — warm sun glint catching the hill tops."
|
|
150
|
+
},
|
|
151
|
+
{
|
|
152
|
+
"name": "terrain_specular_g",
|
|
153
|
+
"node": "phong1",
|
|
154
|
+
"param": "specg",
|
|
155
|
+
"value": 0.62,
|
|
156
|
+
"description": "Specular green."
|
|
157
|
+
},
|
|
158
|
+
{
|
|
159
|
+
"name": "terrain_specular_b",
|
|
160
|
+
"node": "phong1",
|
|
161
|
+
"param": "specb",
|
|
162
|
+
"value": 0.4,
|
|
163
|
+
"description": "Specular blue (warm)."
|
|
164
|
+
},
|
|
165
|
+
{
|
|
166
|
+
"name": "terrain_shininess",
|
|
167
|
+
"node": "phong1",
|
|
168
|
+
"param": "shininess",
|
|
169
|
+
"value": 30,
|
|
170
|
+
"min": 0,
|
|
171
|
+
"max": 100,
|
|
172
|
+
"label": "Highlight Tightness",
|
|
173
|
+
"description": "Phong shininess — tighter sun highlight on the ridges."
|
|
73
174
|
}
|
|
74
175
|
],
|
|
75
|
-
"preview_description": "A
|
|
176
|
+
"preview_description": "A green-teal rolling 3D terrain, sun-lit with warm specular highlights on the ridges and cool indigo ambient in the valleys, set against a deep indigo atmospheric sky."
|
|
76
177
|
}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
{
|
|
2
|
+
"id": "performable_feedback_tunnel",
|
|
3
|
+
"name": "Performable Feedback Tunnel",
|
|
4
|
+
"description": "A feedback tunnel that ships with live controls: knobs for feedback decay, zoom, spin and blur are exposed on the container so you can perform it, animate the knobs with an LFO, or snapshot looks as presets.",
|
|
5
|
+
"tags": [
|
|
6
|
+
"feedback",
|
|
7
|
+
"generative",
|
|
8
|
+
"tunnel",
|
|
9
|
+
"abstract",
|
|
10
|
+
"noise",
|
|
11
|
+
"performable",
|
|
12
|
+
"controls",
|
|
13
|
+
"vj"
|
|
14
|
+
],
|
|
15
|
+
"difficulty": "intermediate",
|
|
16
|
+
"td_version_min": "2022",
|
|
17
|
+
"nodes": [
|
|
18
|
+
{
|
|
19
|
+
"name": "noise1",
|
|
20
|
+
"type": "noiseTOP",
|
|
21
|
+
"parameters": { "period": 3, "mono": 1 },
|
|
22
|
+
"comment": "Seed texture that feeds the loop (mono=1 keeps it grayscale; the param is 'mono', not 'monochrome')"
|
|
23
|
+
},
|
|
24
|
+
{ "name": "feedback1", "type": "feedbackTOP", "comment": "Holds the previous frame" },
|
|
25
|
+
{
|
|
26
|
+
"name": "comp1",
|
|
27
|
+
"type": "compositeTOP",
|
|
28
|
+
"parameters": { "operand": "maximum" },
|
|
29
|
+
"comment": "Combines seed + fed-back frame. 'maximum' stays bounded under feedback gain (the default multiply collapses to black)."
|
|
30
|
+
},
|
|
31
|
+
{
|
|
32
|
+
"name": "transform1",
|
|
33
|
+
"type": "transformTOP",
|
|
34
|
+
"parameters": { "sx": 1.03, "sy": 1.03, "rotate": 1.5 },
|
|
35
|
+
"comment": "Zoom + rotate each frame to create the tunnel motion (sx/sy are the scale params, not scalex/scaley)"
|
|
36
|
+
},
|
|
37
|
+
{ "name": "blur1", "type": "blurTOP", "parameters": { "size": 2 } },
|
|
38
|
+
{
|
|
39
|
+
"name": "level1",
|
|
40
|
+
"type": "levelTOP",
|
|
41
|
+
"parameters": { "brightness1": 0.96 },
|
|
42
|
+
"comment": "Decay / feedback gain. levelTOP multiplies RGB via brightness1 (it has no 'gain' parameter)."
|
|
43
|
+
},
|
|
44
|
+
{ "name": "out1", "type": "nullTOP", "comment": "Output of the system" }
|
|
45
|
+
],
|
|
46
|
+
"connections": [
|
|
47
|
+
{ "from": "noise1", "to": "feedback1" },
|
|
48
|
+
{ "from": "noise1", "to": "comp1", "to_input": 0 },
|
|
49
|
+
{ "from": "feedback1", "to": "comp1", "to_input": 1 },
|
|
50
|
+
{ "from": "comp1", "to": "transform1" },
|
|
51
|
+
{ "from": "transform1", "to": "blur1" },
|
|
52
|
+
{ "from": "blur1", "to": "level1" },
|
|
53
|
+
{ "from": "level1", "to": "out1" }
|
|
54
|
+
],
|
|
55
|
+
"parameters": [
|
|
56
|
+
{
|
|
57
|
+
"name": "feedback_target",
|
|
58
|
+
"node": "feedback1",
|
|
59
|
+
"param": "top",
|
|
60
|
+
"value": "level1",
|
|
61
|
+
"description": "feedbackTOP samples the loop output (level1). Value resolves to the created node path."
|
|
62
|
+
}
|
|
63
|
+
],
|
|
64
|
+
"controls": [
|
|
65
|
+
{
|
|
66
|
+
"name": "Feedback",
|
|
67
|
+
"type": "float",
|
|
68
|
+
"min": 0,
|
|
69
|
+
"max": 1,
|
|
70
|
+
"default": 0.96,
|
|
71
|
+
"bind_to": ["level1.brightness1"]
|
|
72
|
+
},
|
|
73
|
+
{
|
|
74
|
+
"name": "Zoom",
|
|
75
|
+
"type": "float",
|
|
76
|
+
"min": 1,
|
|
77
|
+
"max": 1.2,
|
|
78
|
+
"default": 1.03,
|
|
79
|
+
"bind_to": ["transform1.sx", "transform1.sy"]
|
|
80
|
+
},
|
|
81
|
+
{
|
|
82
|
+
"name": "Spin",
|
|
83
|
+
"type": "float",
|
|
84
|
+
"min": -5,
|
|
85
|
+
"max": 5,
|
|
86
|
+
"default": 1.5,
|
|
87
|
+
"bind_to": ["transform1.rotate"]
|
|
88
|
+
},
|
|
89
|
+
{ "name": "Blur", "type": "float", "min": 0, "max": 8, "default": 2, "bind_to": ["blur1.size"] }
|
|
90
|
+
],
|
|
91
|
+
"preview_description": "An endless rotating tunnel of evolving colored noise that folds into its own center, with live knobs for feedback, zoom, spin and blur."
|
|
92
|
+
}
|
|
@@ -10,7 +10,11 @@
|
|
|
10
10
|
{ "name": "edge", "type": "edgeTOP" },
|
|
11
11
|
{ "name": "rgbsplit", "type": "glslTOP", "comment": "Chromatic RGB offset" },
|
|
12
12
|
{ "name": "feedback1", "type": "feedbackTOP" },
|
|
13
|
-
{
|
|
13
|
+
{
|
|
14
|
+
"name": "comp1",
|
|
15
|
+
"type": "compositeTOP",
|
|
16
|
+
"parameters": { "outputresolution": "custom", "resolutionw": 1280, "resolutionh": 720 }
|
|
17
|
+
},
|
|
14
18
|
{ "name": "glitch", "type": "glslTOP", "comment": "Per-band horizontal displacement" },
|
|
15
19
|
{ "name": "out1", "type": "nullTOP" }
|
|
16
20
|
],
|
package/package.json
CHANGED
|
@@ -1,9 +1,11 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@dpantani/tdmcp",
|
|
3
|
-
"
|
|
4
|
-
"
|
|
3
|
+
"mcpName": "io.github.Pantani/tdmcp",
|
|
4
|
+
"version": "0.3.0",
|
|
5
|
+
"description": "tdmcp — the TouchDesigner MCP server. Build real TouchDesigner visual systems from plain language with Claude, Cursor, or Codex (Model Context Protocol).",
|
|
5
6
|
"type": "module",
|
|
6
7
|
"license": "MIT",
|
|
8
|
+
"homepage": "https://pantani.github.io/tdmcp/",
|
|
7
9
|
"engines": {
|
|
8
10
|
"node": ">=20"
|
|
9
11
|
},
|
|
@@ -41,6 +43,10 @@
|
|
|
41
43
|
"validate:recipes": "tsx scripts/validate-recipes.ts",
|
|
42
44
|
"smoke:live": "tsx scripts/smoke-live.ts",
|
|
43
45
|
"build:dxt": "node scripts/build-dxt.mjs",
|
|
46
|
+
"docs:gen": "tsx scripts/gen-tool-docs.ts",
|
|
47
|
+
"docs:dev": "npm run docs:gen && vitepress dev docs",
|
|
48
|
+
"docs:build": "npm run docs:gen && vitepress build docs",
|
|
49
|
+
"docs:preview": "vitepress preview docs",
|
|
44
50
|
"version": "node scripts/sync-manifest-version.mjs && git add dxt/manifest.json",
|
|
45
51
|
"prepack": "node scripts/clean-pycache.mjs",
|
|
46
52
|
"prepublishOnly": "npm run build && npm test"
|
|
@@ -50,14 +56,25 @@
|
|
|
50
56
|
},
|
|
51
57
|
"keywords": [
|
|
52
58
|
"touchdesigner",
|
|
59
|
+
"touchdesigner-mcp",
|
|
53
60
|
"mcp",
|
|
61
|
+
"mcp-server",
|
|
54
62
|
"model-context-protocol",
|
|
63
|
+
"claude",
|
|
64
|
+
"cursor",
|
|
65
|
+
"codex",
|
|
66
|
+
"ai",
|
|
55
67
|
"visual",
|
|
56
68
|
"creative-coding",
|
|
57
|
-
"generative-art"
|
|
69
|
+
"generative-art",
|
|
70
|
+
"vj",
|
|
71
|
+
"glsl",
|
|
72
|
+
"audio-reactive",
|
|
73
|
+
"derivative"
|
|
58
74
|
],
|
|
59
75
|
"dependencies": {
|
|
60
76
|
"@modelcontextprotocol/sdk": "^1.29.0",
|
|
77
|
+
"gray-matter": "^4.0.3",
|
|
61
78
|
"zod": "^4.4.3"
|
|
62
79
|
},
|
|
63
80
|
"devDependencies": {
|
|
@@ -69,6 +86,7 @@
|
|
|
69
86
|
"tsup": "^8.5.1",
|
|
70
87
|
"tsx": "^4.22.3",
|
|
71
88
|
"typescript": "^6.0.3",
|
|
89
|
+
"vitepress": "^1.6.4",
|
|
72
90
|
"vitest": "^4.1.7"
|
|
73
91
|
}
|
|
74
92
|
}
|
|
@@ -21,14 +21,14 @@
|
|
|
21
21
|
{
|
|
22
22
|
"name": "transform1",
|
|
23
23
|
"type": "transformTOP",
|
|
24
|
-
"parameters": { "
|
|
24
|
+
"parameters": { "sx": 1.03, "sy": 1.03, "rotate": 1.5 },
|
|
25
25
|
"comment": "Zoom + rotate each frame to create the tunnel motion"
|
|
26
26
|
},
|
|
27
27
|
{ "name": "blur1", "type": "blurTOP", "parameters": { "size": 2 } },
|
|
28
28
|
{
|
|
29
29
|
"name": "level1",
|
|
30
30
|
"type": "levelTOP",
|
|
31
|
-
"parameters": { "
|
|
31
|
+
"parameters": { "brightness1": 0.96 },
|
|
32
32
|
"comment": "Decay / feedback gain"
|
|
33
33
|
},
|
|
34
34
|
{ "name": "out1", "type": "nullTOP", "comment": "Output of the system" }
|
|
@@ -53,7 +53,7 @@
|
|
|
53
53
|
{
|
|
54
54
|
"name": "feedback_gain",
|
|
55
55
|
"node": "level1",
|
|
56
|
-
"param": "
|
|
56
|
+
"param": "brightness1",
|
|
57
57
|
"value": 0.96,
|
|
58
58
|
"min": 0,
|
|
59
59
|
"max": 1,
|
|
@@ -62,7 +62,7 @@
|
|
|
62
62
|
{
|
|
63
63
|
"name": "zoom",
|
|
64
64
|
"node": "transform1",
|
|
65
|
-
"param": "
|
|
65
|
+
"param": "sx",
|
|
66
66
|
"value": 1.03,
|
|
67
67
|
"min": 1,
|
|
68
68
|
"max": 1.2,
|
|
@@ -70,7 +70,108 @@
|
|
|
70
70
|
"min": 0,
|
|
71
71
|
"max": 2,
|
|
72
72
|
"label": "Terrain Height"
|
|
73
|
+
},
|
|
74
|
+
{
|
|
75
|
+
"name": "sky_r",
|
|
76
|
+
"node": "render1",
|
|
77
|
+
"param": "bgcolorr",
|
|
78
|
+
"value": 0.06,
|
|
79
|
+
"description": "Background sky red — deep indigo atmosphere instead of empty white void."
|
|
80
|
+
},
|
|
81
|
+
{
|
|
82
|
+
"name": "sky_g",
|
|
83
|
+
"node": "render1",
|
|
84
|
+
"param": "bgcolorg",
|
|
85
|
+
"value": 0.07,
|
|
86
|
+
"description": "Background sky green."
|
|
87
|
+
},
|
|
88
|
+
{
|
|
89
|
+
"name": "sky_b",
|
|
90
|
+
"node": "render1",
|
|
91
|
+
"param": "bgcolorb",
|
|
92
|
+
"value": 0.14,
|
|
93
|
+
"description": "Background sky blue."
|
|
94
|
+
},
|
|
95
|
+
{
|
|
96
|
+
"name": "sky_a",
|
|
97
|
+
"node": "render1",
|
|
98
|
+
"param": "bgcolora",
|
|
99
|
+
"value": 1,
|
|
100
|
+
"description": "Background alpha = 1 so the sky is opaque (not transparent/white)."
|
|
101
|
+
},
|
|
102
|
+
{
|
|
103
|
+
"name": "terrain_diffuse_r",
|
|
104
|
+
"node": "phong1",
|
|
105
|
+
"param": "diffr",
|
|
106
|
+
"value": 0.3,
|
|
107
|
+
"description": "Terrain diffuse red — mossy green so the landscape is coloured, not default grey."
|
|
108
|
+
},
|
|
109
|
+
{
|
|
110
|
+
"name": "terrain_diffuse_g",
|
|
111
|
+
"node": "phong1",
|
|
112
|
+
"param": "diffg",
|
|
113
|
+
"value": 0.58,
|
|
114
|
+
"description": "Terrain diffuse green."
|
|
115
|
+
},
|
|
116
|
+
{
|
|
117
|
+
"name": "terrain_diffuse_b",
|
|
118
|
+
"node": "phong1",
|
|
119
|
+
"param": "diffb",
|
|
120
|
+
"value": 0.42,
|
|
121
|
+
"description": "Terrain diffuse blue."
|
|
122
|
+
},
|
|
123
|
+
{
|
|
124
|
+
"name": "terrain_ambient_r",
|
|
125
|
+
"node": "phong1",
|
|
126
|
+
"param": "ambr",
|
|
127
|
+
"value": 0.07,
|
|
128
|
+
"description": "Ambient red — cool indigo fill matching the sky so shadow sides read as atmospheric depth, not black."
|
|
129
|
+
},
|
|
130
|
+
{
|
|
131
|
+
"name": "terrain_ambient_g",
|
|
132
|
+
"node": "phong1",
|
|
133
|
+
"param": "ambg",
|
|
134
|
+
"value": 0.11,
|
|
135
|
+
"description": "Ambient green."
|
|
136
|
+
},
|
|
137
|
+
{
|
|
138
|
+
"name": "terrain_ambient_b",
|
|
139
|
+
"node": "phong1",
|
|
140
|
+
"param": "ambb",
|
|
141
|
+
"value": 0.2,
|
|
142
|
+
"description": "Ambient blue (indigo fill)."
|
|
143
|
+
},
|
|
144
|
+
{
|
|
145
|
+
"name": "terrain_specular_r",
|
|
146
|
+
"node": "phong1",
|
|
147
|
+
"param": "specr",
|
|
148
|
+
"value": 0.7,
|
|
149
|
+
"description": "Specular red — warm sun glint catching the hill tops."
|
|
150
|
+
},
|
|
151
|
+
{
|
|
152
|
+
"name": "terrain_specular_g",
|
|
153
|
+
"node": "phong1",
|
|
154
|
+
"param": "specg",
|
|
155
|
+
"value": 0.62,
|
|
156
|
+
"description": "Specular green."
|
|
157
|
+
},
|
|
158
|
+
{
|
|
159
|
+
"name": "terrain_specular_b",
|
|
160
|
+
"node": "phong1",
|
|
161
|
+
"param": "specb",
|
|
162
|
+
"value": 0.4,
|
|
163
|
+
"description": "Specular blue (warm)."
|
|
164
|
+
},
|
|
165
|
+
{
|
|
166
|
+
"name": "terrain_shininess",
|
|
167
|
+
"node": "phong1",
|
|
168
|
+
"param": "shininess",
|
|
169
|
+
"value": 30,
|
|
170
|
+
"min": 0,
|
|
171
|
+
"max": 100,
|
|
172
|
+
"label": "Highlight Tightness",
|
|
173
|
+
"description": "Phong shininess — tighter sun highlight on the ridges."
|
|
73
174
|
}
|
|
74
175
|
],
|
|
75
|
-
"preview_description": "A
|
|
176
|
+
"preview_description": "A green-teal rolling 3D terrain, sun-lit with warm specular highlights on the ridges and cool indigo ambient in the valleys, set against a deep indigo atmospheric sky."
|
|
76
177
|
}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
{
|
|
2
|
+
"id": "performable_feedback_tunnel",
|
|
3
|
+
"name": "Performable Feedback Tunnel",
|
|
4
|
+
"description": "A feedback tunnel that ships with live controls: knobs for feedback decay, zoom, spin and blur are exposed on the container so you can perform it, animate the knobs with an LFO, or snapshot looks as presets.",
|
|
5
|
+
"tags": [
|
|
6
|
+
"feedback",
|
|
7
|
+
"generative",
|
|
8
|
+
"tunnel",
|
|
9
|
+
"abstract",
|
|
10
|
+
"noise",
|
|
11
|
+
"performable",
|
|
12
|
+
"controls",
|
|
13
|
+
"vj"
|
|
14
|
+
],
|
|
15
|
+
"difficulty": "intermediate",
|
|
16
|
+
"td_version_min": "2022",
|
|
17
|
+
"nodes": [
|
|
18
|
+
{
|
|
19
|
+
"name": "noise1",
|
|
20
|
+
"type": "noiseTOP",
|
|
21
|
+
"parameters": { "period": 3, "mono": 1 },
|
|
22
|
+
"comment": "Seed texture that feeds the loop (mono=1 keeps it grayscale; the param is 'mono', not 'monochrome')"
|
|
23
|
+
},
|
|
24
|
+
{ "name": "feedback1", "type": "feedbackTOP", "comment": "Holds the previous frame" },
|
|
25
|
+
{
|
|
26
|
+
"name": "comp1",
|
|
27
|
+
"type": "compositeTOP",
|
|
28
|
+
"parameters": { "operand": "maximum" },
|
|
29
|
+
"comment": "Combines seed + fed-back frame. 'maximum' stays bounded under feedback gain (the default multiply collapses to black)."
|
|
30
|
+
},
|
|
31
|
+
{
|
|
32
|
+
"name": "transform1",
|
|
33
|
+
"type": "transformTOP",
|
|
34
|
+
"parameters": { "sx": 1.03, "sy": 1.03, "rotate": 1.5 },
|
|
35
|
+
"comment": "Zoom + rotate each frame to create the tunnel motion (sx/sy are the scale params, not scalex/scaley)"
|
|
36
|
+
},
|
|
37
|
+
{ "name": "blur1", "type": "blurTOP", "parameters": { "size": 2 } },
|
|
38
|
+
{
|
|
39
|
+
"name": "level1",
|
|
40
|
+
"type": "levelTOP",
|
|
41
|
+
"parameters": { "brightness1": 0.96 },
|
|
42
|
+
"comment": "Decay / feedback gain. levelTOP multiplies RGB via brightness1 (it has no 'gain' parameter)."
|
|
43
|
+
},
|
|
44
|
+
{ "name": "out1", "type": "nullTOP", "comment": "Output of the system" }
|
|
45
|
+
],
|
|
46
|
+
"connections": [
|
|
47
|
+
{ "from": "noise1", "to": "feedback1" },
|
|
48
|
+
{ "from": "noise1", "to": "comp1", "to_input": 0 },
|
|
49
|
+
{ "from": "feedback1", "to": "comp1", "to_input": 1 },
|
|
50
|
+
{ "from": "comp1", "to": "transform1" },
|
|
51
|
+
{ "from": "transform1", "to": "blur1" },
|
|
52
|
+
{ "from": "blur1", "to": "level1" },
|
|
53
|
+
{ "from": "level1", "to": "out1" }
|
|
54
|
+
],
|
|
55
|
+
"parameters": [
|
|
56
|
+
{
|
|
57
|
+
"name": "feedback_target",
|
|
58
|
+
"node": "feedback1",
|
|
59
|
+
"param": "top",
|
|
60
|
+
"value": "level1",
|
|
61
|
+
"description": "feedbackTOP samples the loop output (level1). Value resolves to the created node path."
|
|
62
|
+
}
|
|
63
|
+
],
|
|
64
|
+
"controls": [
|
|
65
|
+
{
|
|
66
|
+
"name": "Feedback",
|
|
67
|
+
"type": "float",
|
|
68
|
+
"min": 0,
|
|
69
|
+
"max": 1,
|
|
70
|
+
"default": 0.96,
|
|
71
|
+
"bind_to": ["level1.brightness1"]
|
|
72
|
+
},
|
|
73
|
+
{
|
|
74
|
+
"name": "Zoom",
|
|
75
|
+
"type": "float",
|
|
76
|
+
"min": 1,
|
|
77
|
+
"max": 1.2,
|
|
78
|
+
"default": 1.03,
|
|
79
|
+
"bind_to": ["transform1.sx", "transform1.sy"]
|
|
80
|
+
},
|
|
81
|
+
{
|
|
82
|
+
"name": "Spin",
|
|
83
|
+
"type": "float",
|
|
84
|
+
"min": -5,
|
|
85
|
+
"max": 5,
|
|
86
|
+
"default": 1.5,
|
|
87
|
+
"bind_to": ["transform1.rotate"]
|
|
88
|
+
},
|
|
89
|
+
{ "name": "Blur", "type": "float", "min": 0, "max": 8, "default": 2, "bind_to": ["blur1.size"] }
|
|
90
|
+
],
|
|
91
|
+
"preview_description": "An endless rotating tunnel of evolving colored noise that folds into its own center, with live knobs for feedback, zoom, spin and blur."
|
|
92
|
+
}
|
|
@@ -10,7 +10,11 @@
|
|
|
10
10
|
{ "name": "edge", "type": "edgeTOP" },
|
|
11
11
|
{ "name": "rgbsplit", "type": "glslTOP", "comment": "Chromatic RGB offset" },
|
|
12
12
|
{ "name": "feedback1", "type": "feedbackTOP" },
|
|
13
|
-
{
|
|
13
|
+
{
|
|
14
|
+
"name": "comp1",
|
|
15
|
+
"type": "compositeTOP",
|
|
16
|
+
"parameters": { "outputresolution": "custom", "resolutionw": 1280, "resolutionh": 720 }
|
|
17
|
+
},
|
|
14
18
|
{ "name": "glitch", "type": "glslTOP", "comment": "Per-band horizontal displacement" },
|
|
15
19
|
{ "name": "out1", "type": "nullTOP" }
|
|
16
20
|
],
|
package/td/README.md
CHANGED
|
@@ -102,7 +102,7 @@ Verify from a terminal:
|
|
|
102
102
|
|
|
103
103
|
```bash
|
|
104
104
|
curl http://127.0.0.1:9980/api/info
|
|
105
|
-
# {"ok":true,"data":{"python_version":"3.11.x","td_version":"...","bridge_version":"0.
|
|
105
|
+
# {"ok":true,"data":{"python_version":"3.11.x","td_version":"...","bridge_version":"0.3.0"}}
|
|
106
106
|
```
|
|
107
107
|
|
|
108
108
|
Then run the live smoke test from the repo root:
|