mirror of
https://github.com/NousResearch/hermes-agent.git
synced 2026-06-10 04:08:28 +08:00
107 lines
3.5 KiB
Markdown
107 lines
3.5 KiB
Markdown
|
|
# Operator Tips
|
||
|
|
|
||
|
|
## Wireframe Rendering Pattern
|
||
|
|
|
||
|
|
Reusable setup for wireframe geometry on black background:
|
||
|
|
|
||
|
|
```python
|
||
|
|
# 1. Material
|
||
|
|
mat = root.create(wireframeMAT, 'wire_mat')
|
||
|
|
mat.par.colorr = 1.0; mat.par.colorg = 0.0; mat.par.colorb = 0.0
|
||
|
|
mat.par.linewidth = 3
|
||
|
|
|
||
|
|
# 2. Geometry COMP
|
||
|
|
geo = root.create(geometryCOMP, 'my_geo')
|
||
|
|
geo.par.rx.expr = 'absTime.seconds * 30'
|
||
|
|
geo.par.ry.expr = 'absTime.seconds * 45'
|
||
|
|
geo.par.material = mat.path # NOTE: 'material' not 'mat'
|
||
|
|
|
||
|
|
# 3. Shape inside the geo
|
||
|
|
box = geo.create(boxSOP, 'cube')
|
||
|
|
box.par.sizex = 1.5; box.par.sizey = 1.5; box.par.sizez = 1.5
|
||
|
|
|
||
|
|
# 4. Camera
|
||
|
|
cam = root.create(cameraCOMP, 'cam1')
|
||
|
|
cam.par.tx = 0; cam.par.ty = 0; cam.par.tz = 4; cam.par.fov = 45
|
||
|
|
|
||
|
|
# 5. Render TOP
|
||
|
|
render = root.create(renderTOP, 'render1')
|
||
|
|
render.par.outputresolution = 'custom'
|
||
|
|
render.par.resolutionw = 1280; render.par.resolutionh = 720
|
||
|
|
render.par.bgcolorr = 0; render.par.bgcolorg = 0; render.par.bgcolorb = 0
|
||
|
|
render.par.camera = cam.path
|
||
|
|
render.par.geometry = geo.path
|
||
|
|
|
||
|
|
# 6. Output null
|
||
|
|
out = root.create(nullTOP, 'out1')
|
||
|
|
out.inputConnectors[0].connect(render.outputConnectors[0])
|
||
|
|
```
|
||
|
|
|
||
|
|
**Key rules:**
|
||
|
|
- Class names: `wireframeMAT` not `wireframeMat` (all-caps suffix)
|
||
|
|
- Geometry SOPs/POPs go INSIDE the geo comp
|
||
|
|
- Material: `geo.par.material` not `geo.par.mat`
|
||
|
|
- Render geometry: `render.par.geometry = geo.path` (string path)
|
||
|
|
- `wireframeMAT.par.wireframemode = 'topology'` for clean wireframe (vs `'tesselated'` for triangle edges)
|
||
|
|
- Alternative: Use `renderTOP.par.overridemat` instead of per-geo material
|
||
|
|
|
||
|
|
## Feedback TOP
|
||
|
|
|
||
|
|
### Basic Structure
|
||
|
|
|
||
|
|
```
|
||
|
|
input (initial state) ──┐
|
||
|
|
├──→ feedback_top ──→ processing ──→ null_out
|
||
|
|
│ ↑
|
||
|
|
└── par.top = 'null_out' ────────────────┘
|
||
|
|
```
|
||
|
|
|
||
|
|
### Setup Pattern
|
||
|
|
|
||
|
|
```python
|
||
|
|
# 1. Processing chain
|
||
|
|
glsl = root.create(glslTOP, 'sim')
|
||
|
|
null_out = root.create(nullTOP, 'null_out')
|
||
|
|
glsl.outputConnectors[0].connect(null_out.inputConnectors[0])
|
||
|
|
|
||
|
|
# 2. Feedback referencing null_out
|
||
|
|
feedback = root.create(feedbackTOP, 'feedback')
|
||
|
|
feedback.par.top = 'null_out'
|
||
|
|
|
||
|
|
# 3. Black initial state
|
||
|
|
const_init = root.create(constantTOP, 'const_init')
|
||
|
|
const_init.par.colorr = 0; const_init.par.colorg = 0; const_init.par.colorb = 0
|
||
|
|
|
||
|
|
# 4. Wire: initial → feedback, feedback → processing
|
||
|
|
feedback.inputConnectors[0].connect(const_init)
|
||
|
|
glsl.inputConnectors[0].connect(feedback)
|
||
|
|
|
||
|
|
# 5. Reset to apply initial state
|
||
|
|
feedback.par.resetpulse.pulse()
|
||
|
|
```
|
||
|
|
|
||
|
|
### Common Errors
|
||
|
|
|
||
|
|
| Error | Cause | Solution |
|
||
|
|
|-------|-------|----------|
|
||
|
|
| "Not enough sources specified" | No input connected | Connect initial state TOP |
|
||
|
|
| Unexpected initial pattern | Wrong initial state | Use Constant TOP (black) |
|
||
|
|
|
||
|
|
### Tips
|
||
|
|
|
||
|
|
1. Use float format for simulations: `glsl.par.format = 'rgba32float'`
|
||
|
|
2. Reset after setup: `feedback.par.resetpulse.pulse()`
|
||
|
|
3. Match resolutions — feedback, processing, and initial state must match
|
||
|
|
4. Soft boundary prevents edge artifacts:
|
||
|
|
```glsl
|
||
|
|
float edge = 3.0 * texel.x;
|
||
|
|
float bx = smoothstep(0.0, edge, uv.x) * smoothstep(0.0, edge, 1.0 - uv.x);
|
||
|
|
float by = smoothstep(0.0, edge, uv.y) * smoothstep(0.0, edge, 1.0 - uv.y);
|
||
|
|
value *= bx * by;
|
||
|
|
```
|
||
|
|
|
||
|
|
### Use Cases
|
||
|
|
- **Wave Simulation** — R=height, G=velocity, black initial state
|
||
|
|
- **Cellular Automata** — white=alive, black=dead, random noise initial state
|
||
|
|
- **Trail / Motion Blur** — blend current frame with feedback, black initial
|