Skip to content
Curious Trove
Guide Geometry OctoShaper 1.2Updated

Procedural Meshes

OctoShaper 1.2 can build the geometry itself, not just place existing assets. Mesh nodes output ordinary ElementSets of points with faces attached, so everything you know about editing points still applies. When the shape is done, you realize it into a shared Unity mesh and draw it.

The mesh workflow in four steps

ExplainerFrom points to a rendered mesh

Mesh generators like Box Mesh, Cylinder Mesh or UV Sphere Mesh produce an ElementSet of logical points, one row per corner, with faces and corner UVs attached as topology. A box has 8 points, even though its rendered mesh needs extra vertices for hard edges and UV seams. OctoShaper creates those when you realize the mesh.

Step Nodes Result
Generate Box, Cylinder, UV Sphere, Plane, Convex Hull, Triangulate Points, Revolve Profile, Follow Spline Points with faces
Edit Any point node, Transform Mesh, Bevel Mesh, Boolean Meshes, Combine Mesh Definitions Still points with faces
Realize Realize Meshes One placement row per shape, with a shared Unity mesh in mesh
Draw Draw Instanced or Draw Instanced Indirect, Mesh: Attribute mesh Rendered surface
OctoShaper graph with Cylinder Mesh, Bevel Mesh, Realize Meshes and Draw Instanced nodes, and the rendered bevelled cylinder in the Preview Stage
A small mesh graph: generate, bevel, realize and draw.

Example: cylinders with a per-point radius

  1. Generate your placement points, then write a float attribute named radius (for example with Set Random Float Attribute).
  2. Connect the points to Cylinder Mesh, set Radius to Attribute and type radius. Each input point becomes one cylinder.
  3. Optionally add Bevel Mesh or move points with ordinary nodes. Mesh-level inputs bound to attributes must be constant within each generated shape; the source point's attributes are copied onto the shape's points for you.
  4. Add Realize Meshes, then Draw Instanced with Mesh set to Attribute mesh, and assign a material.

Note: Before realization, previews show triangle outlines only. Only the output of an explicit draw node previews as a rendered surface.

Editing points and shapes

Because a mesh is just points with faces, any node that moves position deforms it: jitter, attract, displace by a texture, and so on. A few rules help:

  • Filtering removes faces. Dropping a point also removes every face that used it.
  • Rotation and scale stay spawn attributes. They don't deform vertices. Use Transform Mesh to rotate or scale the geometry itself.
  • Merging keeps shapes separate. The Merge node keeps each definition on its own. Combine Mesh Definitions joins them into one without a boolean union.
  • Booleans and bevels are careful. On collapsed or degenerate solids they leave the input unchanged (input A for booleans). Adjust the tolerance or fix the shape.
  • Custom attributes and topology. Changing topology doesn't interpolate arbitrary custom attributes, and realization keeps only attributes that are the same across the whole shape.

Realizing and drawing

Realize Meshes consolidates each definition into one Unity mesh instance and outputs one placement row per shape, with the mesh in the mesh attribute. Identical definitions share their mesh, so if you need many copies of one shape, realize once and duplicate the placements.

Both draw nodes now have an explicit Mesh selector:

  • Attribute mesh: draw whatever each row carries. Use this for realized geometry.
  • Constant: draw one asset mesh on every row. An empty constant, or a missing material, skips drawing. It doesn't switch to attribute mode by itself.

Before realization you can also feed mesh points straight into prefab spawning nodes. Use Discard Mesh Topology when a branch should spawn objects without also carrying the mesh definition along.

Reusing a mesh on other points

To stamp one custom shape onto a separate set of points:

  1. Connect Realize Meshes to Assign Mesh → Source, and your placement points to Elements. Leave the asset Mesh input empty.
  2. Source Row picks which realized shape to use (zero by default), or reads an integer attribute on the target points to vary it.
  3. Draw the result with Mesh set to Attribute mesh.

Explode Meshes goes the other way: it turns existing readable Unity meshes into editable points and faces. Place Mesh On Points and the surface sampling nodes (Sample Mesh Surface, Sample Mesh Surface Grid) let you scatter on top of generated geometry.

Colliders

The Physics category has matching collider nodes for generated content: Add Box Collider, Add Sphere Collider, Add Capsule Collider and Add Mesh Collider. Several nodes can stack on the same rows to build compound colliders. Fit Box Collider To Mesh sizes a box to the mesh bounds, and Clear Colliders removes the list again.

A generated cylinder prop with its capsule collider drawn as a green gizmo, next to the Add Capsule Collider node
A collider node on realized geometry.

Where things moved in 1.2

  • The Geometry category (green) holds mesh generation and editing.
  • The new Rendering category (blue) holds Draw Instanced, Draw Instanced Indirect, Assign Mesh and the prefab and primitive spawning nodes.
  • Translate, Rotate, Jitter Positions, Jitter Rotation, Jitter Scale and Randomize Rotation moved from Mutators to Spatial.
  • The experimental Draw Meshes node is gone. See Upgrading to 1.2.

Continue with Colors, textures and materials to paint what you built, or open the bundled samples to see complete mesh graphs.

Frequently asked questions

Why can't I see a surface after Box Mesh?
Mesh nodes output point-based mesh definitions, which preview as wireframes. Add Realize Meshes, then Draw Instanced with Mesh set to Attribute mesh and a material.
Where did the Draw Meshes node go?
The experimental Draw Meshes node was removed in 1.2. Use Realize Meshes followed by Draw Instanced or Draw Instanced Indirect in Mesh Attribute mode.
Can I edit an imported FBX mesh with these nodes?
Yes, if the mesh is readable. Explode Meshes turns an existing Unity mesh into editable points and faces.
Do procedural meshes work at runtime?
Yes. Mesh generation and sampling use Burst where available and run in the same graphs as the rest of your generation, in the editor, at runtime and in procedural prefabs.