Features
A complete list of verified features in the Coding Passion Dynamic Floor Plugin.
Runtime Floor Placement
| Feature | Details |
|---|
| Single-tile placement | Place a floor polygon defined by the tool’s shape (e.g. a rectangle) at the cursor position |
| Area fill placement | Automatically detect the enclosed polygon from a node network and fill the entire room area with one action |
| Polygon-based floor mesh | All floor surfaces are procedural meshes triangulated from 2D polygon vertex data (triangulation via earcut) |
| Preview mode | Enter a non-destructive preview state before committing changes — meshes update in preview without writing to the production database |
| Abort placement | Right-click aborts the current placement and destroys the active tool |
| Mode toggle | Switch between fill mode and single-tile mode during placement (via modifier key, e.g. Shift) |
Node Network System (Boundary Tracking)
The node network is the backbone of the fill algorithm and boundary detection.
| Feature | Details |
|---|
| Node graph | Boundaries are represented as a graph of UBasicNode objects connected along wall/fence segments |
| Automatic polygon detection | Given a cursor position, the plugin finds the node network that encloses that position and returns the enclosed polygon |
| Room-within-room nesting | Node networks track inner and outer nesting depth — rooms inside rooms are supported |
| Hard and loose connections | Nodes support both structural (hard) connections and cosmetic (loose/soft) connections |
| Spatial queries | getNodeNetworkEnclosingPosition — find the network enclosing a 3D position |
| Boundary overlap detection | Detect whether two node networks overlap their bounding areas |
Polygon Database
| Feature | Details |
|---|
| Runtime CRUD | Add polygons (AddPolygon), remove them (RemovePolygonById), clear all |
| Polygon holes | Polygons support cutouts/holes (FFloorPolygonHole) |
| Spatial filtering | Query polygons by 2D bounding box, height level, material ID, and floor type |
| Preview vs production | EnterPreviewMode / ExitPreviewMode — non-destructive preview of changes |
| Material handling | InsertPolygonWithMaterialHandling handles material-aware polygon insertion |
| Change tracking | Polygons track bIsNew, bHasChanges, bMarkedForDeletion flags |
Material System
| Feature | Details |
|---|
| Material IDs | Materials are assigned via int32 IDs, not direct UMaterial references |
| SimpleMaterialManager pattern | A manager Blueprint maps integer IDs to UMaterialInterface — designed to scale to large material libraries |
| Per-polygon material | Each FFloorPolygon carries its own MaterialId |
| Per-section rendering | BP_FloorPolygonRenderer groups polygons by material and generates one mesh section per material |
| FloorType system | Each polygon has an EFloorType (Default, Border, Invisible) that allows logical layer separation |
Floor Types (EFloorType)
| Value | Description |
|---|
Default | Standard visible floor |
Border | Boundary/wall layer polygon |
Invisible | Invisible logical layer (e.g. placement helpers, pathfinding regions) |
Different floor types do not interact with each other in the backend, so changes to one layer do not affect another.
Rendering
| Feature | Details |
|---|
| Listener-based rendering | Renderers implement IFloorPolygonChangeListener and register with UFloorPolygonChangeService |
| Batch update | OnAllPolygonsTransferred signals the end of a batch of changes — rebuild meshes once rather than per-polygon |
| Multiple renderers | Multiple listeners can be registered simultaneously |
| Procedural mesh output | FloorPolygonToFloorMesh triangulates polygons into FFloorMeshData (vertices + indices) ready for ProceduralMeshComponent |
Polygon Boolean Operations
Provided via UFloorPolygonClipperLibrary (Blueprint Function Library, powered by Clipper2):
| Function | Description |
|---|
UnionPolygons | Merge multiple polygons into unified shapes |
DifferencePolygons | Subtract clip polygons from other polygons (supports holes) |
DoPolygonsIntersect | Test whether two polygons intersect or share an edge |
DoPolygonsStrictlyIntersect | Test strict intersection (no edge-only contact) |
Save and Load
| Feature | Details |
|---|
| Polygon database save | UPolygonDatabaseSaveManager saves/loads the runtime polygon state (slot: PolygonDatabaseSaveSlot) |
| Node network save | UNodeSystemDefaultSaveManager saves/loads the node graph (slot: NodeSystemSaveSlot) |
| Custom save manager | Implement INodeSystemSaveManagerInterface to use your own save/load logic |
Extensibility
| Extension point | How |
|---|
| Custom tool shape | Subclass BP_ExampleRuntimeFloorPolygonToolActor, override BeginPlay, set ToolShape (Vector array) |
| Custom renderer | Implement IFloorPolygonChangeListener in any Blueprint |
| Custom input handler | Implement IFloorInputEventHandlerInterface |
| Custom save manager | Implement INodeSystemSaveManagerInterface |
| Custom node type | Subclass UBasicNode or UFloorNode; assign NodeType and NodeMaterial for layer separation |
What is NOT supported
| |
|---|
| Multiplayer / network replication | Not supported |
| Mac (development or target) | Not supported |
| Automatic grid snapping | Not built-in — must be implemented in FindValidHitResult |
See also