SMOOTH placement uses exact world-space positions instead of snapping objects to the grid.
Use it for furniture, clutter, rocks, vegetation, or other objects where the grid should not determine the final position. GRID remains the better choice for lattice-aligned structures and CELL/EDGE/FACE/CORNER/TOP mounts. SMOOTH UP sockets are world-space sockets, not GRID TOP mounts.
Enable SMOOTH
Coordinate mode is per session:
session.placement_coordinate_mode= PlacementEnums.PlacementCoordinateMode.SMOOTHSwitch back with PlacementCoordinateMode.GRID.
Coordinate mode is separate from place, move, and demolish actions.
Configure a footprint
Every SMOOTH placeable needs a non-zero world footprint:
entry.footprint_2d= Vector2(32,32)
entry.footprint_3d_world= Vector3(2,2,2)If the footprint is missing, SMOOTH placement rejects the target because it cannot determine whether the object overlaps committed placement occupancy.
Validation model
SMOOTH placement uses plugin-owned occupancy as its main record of object overlap.
A commit normally checks:
- Selected entry and configuration.
- Target world position and footprint.
- Overlap against committed placement occupancy.
- Optional physics obstacles or support when configured.
- Final commit and stable placement identity.
Physics can add environment checks, but it does not replace Grid Placement's committed occupancy record.
2D and 3D
| Capability | 2D | 3D |
|---|---|---|
| World footprint | footprint_2d |
footprint_3d_world |
| Primary overlap shape | rotated 2D bounds | yaw-rotated 3D bounds |
| Optional physics obstacles | supported | supported |
| Ground/support sampling | project-specific targeting/physics path | optional ground/support ray/path |
| World-space object sockets | — | supported, opt-in |
3D ground/support
3D SMOOTH can optionally use physics to resolve or validate the supporting surface. Keep this separate from GRID slope/support rules:
- GRID support checks whether a grid footprint or structure can use the target support.
- SMOOTH support checks whether the free world-space target has acceptable ground or environment evidence.
If a configured support check misses, placement should reject instead of inventing a surface.
3D world-space sockets
SMOOTH sockets provide object-to-object joins without using GRID mount keys.
PlacementSnapProfile3D can publish or consume socket roles such as:
ENDS— end-to-end pieces such as fences;PERIMETER— edge or perimeter joins;FACE— provider face points;UP— upward or top points.
The consumer's snaps_with still controls which provider families it accepts. Socket snapping is opt-in; a zero snap radius or no published sockets leaves the object in free SMOOTH mode.
For socket-enabled consumers, attachment_requirement = REQUIRED rejects both preview and commit if no compatible socket is within the snap radius. OPTIONAL snaps nearby but permits free placement otherwise. INHERIT uses the host-bound GRID service's ObjectPlacementSettings3D default, including changes to that shared resource. A standalone SmoothPlacementService3D can set its attachment_settings resource directly; without one, the default is OPTIONAL. Explicit profile values override the shared default.
Example uses
- fence panel → fence panel;
- free-positioned floor → wall;
- wall/floor perimeter → ceiling/platform piece.
A SMOOTH socket is not a GRID CELL/EDGE/FACE/CORNER/TOP mount. Grid Placement 6.0.2 defines GRID SnapMode.TOP for roof/gable/ridge workflows; an UP socket remains a separate SMOOTH world-space socket and does not create or consume TOP occupancy.
Move and demolish
SMOOTH objects use the normal placement lifecycle:
- Move: validate the new footprint while excluding the object being moved; update occupancy only after validation succeeds.
- Cancel: keep the committed object and occupancy unchanged.
- Demolish: remove the placement record and its occupancy together.
Rotation
SMOOTH occupancy is rotation-aware. The overlap bounds use the rotated footprint, so a long object rotated 90° does not keep its original unrotated occupancy shape.
Save and restore
SMOOTH objects receive stable placement identity and use the same coordinated restore path as GRID objects and mounts.
Do not rebuild a standalone SMOOTH occupancy registry separately from the saved placement records. Use the restore coordinator for the dimension you are working in.
See Save and Load.
Optional physics obstacles
Set the relevant occupied/collision mask when game-world physics bodies should also block a SMOOTH target. Leave the optional physics check disabled when placement occupancy alone is the intended rule.
Keep collision masks explicit. Do not weaken placement occupancy rules to compensate for a misconfigured physics mask.
Common failures
| Symptom | Check |
|---|---|
| “No footprint configured” | Set footprint_2d or footprint_3d_world. |
| Preview is blocked over empty-looking ground | Inspect placement occupancy and optional physics masks. |
| 3D object has wrong Y | Check the configured ground/support path and collision mask. |
| Socket snap never activates | Check provider socket roles, consumer snaps_with, snap radius, and provider identity. |
| Duplicate join is rejected | Expected when the target socket is already occupied. |
| Restore creates conflicts/duplicates | Use coordinated placement-world restore instead of rebuilding one registry independently. |