Skip to content

#196 Add EXTRUDE shape support - #203

Merged
tpwalke2 merged 5 commits into
mainfrom
feature/tpwalke2/196-extrude-markers
Sep 3, 2026
Merged

#196 Add EXTRUDE shape support#203
tpwalke2 merged 5 commits into
mainfrom
feature/tpwalke2/196-extrude-markers

Conversation

@tpwalke2

@tpwalke2 tpwalke2 commented Sep 3, 2026

Copy link
Copy Markdown
Owner

What

Adds a new EXTRUDE marker group type: signs sharing a prefix/label render as a solid extruded volume (floor at the lowest member's Y, ceiling at the tallest member's Y) instead of a flat polygon.

Why

Extends the existing SHAPE marker capability (issue #196) to let users mark 3D volumes (e.g. buildings) on the map, not just flat regions.

Changes

  • Added MarkerGroupType.EXTRUDE, following the same membership/threshold model as SHAPE (3+ signs sharing prefix+label, ordered by placement time)
  • ExtrudeGroupResolver delegates member resolution to LineGroupResolver (matches the existing ShapeGroupResolver pattern, per docs/adr/0002-shape-duplicates-line-pattern.md)
  • SignTransitionResolver gained extrudeJoinAction/extrudeLeaveAction branches mirroring the SHAPE join/leave/recompute logic
  • New SetExtrudeMarkerAction/RemoveExtrudeMarkerAction (ActionFactory) and ExtrudeMarkerIdentifier
  • BlueMapAPIConnector.setExtrudeMarker builds BlueMap's ExtrudeMarker, computing floor/ceiling from member Y values (resolveExtrudeHeightRange) with a 1-block minimum height fallback when all members share one Y
  • ConfigProvider: EXTRUDE reuses SHAPE's lineWidth/lineColor/fillColor/depthTest validation and warns on inapplicable fields (icon, offsetX, offsetY, cssClasses)
  • README.md documents the EXTRUDE type and an example [building] config
  • ADR 0002 updated to note EXTRUDE as a fourth instance of the duplicated shape/line pattern

Testing

  • ./gradlew test — new unit tests: ExtrudeGroupResolverTest, ActionFactoryTest (extrude actions), ConfigProviderTest (extrude field validation/defaults), BlueMapAPIConnectorTest (resolveExtrudeHeightRange), and extensive SignTransitionResolverTest coverage for extrude join/leave transitions
  • Manually verified via ./gradlew runServer: placing 3+ [building] signs sharing a label renders a solid extruded volume on the map, spanning from the lowest to tallest sign

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🟡 Changes recommended

The new EXTRUDE transition logic ignores sign “detail” content when dispatching set actions (despite recomputes being triggered by detail edits), and the README should be aligned with the implemented minimum-height behavior.

Once you've addressed the issues Copilot identified, you can request another Copilot review.

Pull request overview

Adds a new EXTRUDE marker-group type to extend existing SHAPE behavior from 2D polygons to 3D extruded volumes (floor/ceiling derived from member sign Y values), integrating it through the action/transition pipeline and config/docs.

Changes:

  • Introduces MarkerGroupType.EXTRUDE plus corresponding resolver, marker identifier, and BlueMap actions (set/remove).
  • Extends the transition table and BlueMap connector to dispatch and render BlueMap ExtrudeMarker instances, including height-range computation.
  • Updates config validation/warnings and documentation, and adds unit tests covering membership resolution, action construction, config parsing, and transition behavior.
File summaries
File Description
src/test/java/com/tpwalke2/bluemapsignmarkers/core/signs/SignTransitionResolverTest.java Adds EXTRUDE transition-table coverage (join/leave/recompute and type flips).
src/test/java/com/tpwalke2/bluemapsignmarkers/core/signs/ExtrudeGroupResolverTest.java Tests EXTRUDE membership filtering and ordering behavior.
src/test/java/com/tpwalke2/bluemapsignmarkers/core/bluemap/BlueMapAPIConnectorTest.java Tests extrude height-range resolution logic in isolation.
src/test/java/com/tpwalke2/bluemapsignmarkers/core/bluemap/actions/ActionFactoryTest.java Verifies extrude action construction and marker-set identifier reuse.
src/test/java/com/tpwalke2/bluemapsignmarkers/config/ConfigProviderTest.java Adds config parsing/validation tests for EXTRUDE styling and mismatch warnings.
src/main/java/com/tpwalke2/bluemapsignmarkers/core/signs/SignTransitionResolver.java Adds EXTRUDE join/leave logic and integrates it into dispatch selection.
src/main/java/com/tpwalke2/bluemapsignmarkers/core/signs/ExtrudeGroupResolver.java Implements EXTRUDE member resolution by delegating to the shared line resolver.
src/main/java/com/tpwalke2/bluemapsignmarkers/core/markers/MarkerGroupType.java Adds EXTRUDE to the marker group type enum.
src/main/java/com/tpwalke2/bluemapsignmarkers/core/markers/ExtrudeMarkerIdentifier.java Defines the marker-id scheme for extruded volume markers.
src/main/java/com/tpwalke2/bluemapsignmarkers/core/bluemap/BlueMapAPIConnector.java Adds processing/logging and builder logic for BlueMap ExtrudeMarker rendering.
src/main/java/com/tpwalke2/bluemapsignmarkers/core/bluemap/actions/SetExtrudeMarkerAction.java New action carrying styling and point data for extrude create/update.
src/main/java/com/tpwalke2/bluemapsignmarkers/core/bluemap/actions/RemoveExtrudeMarkerAction.java New action for extrude marker removal.
src/main/java/com/tpwalke2/bluemapsignmarkers/core/bluemap/actions/ActionFactory.java Adds factory methods to create extrude set/remove actions and identifiers.
src/main/java/com/tpwalke2/bluemapsignmarkers/config/ConfigProvider.java Extends field validation and type-mismatch warnings to include EXTRUDE.
README.md Documents the new EXTRUDE type and adds a configuration example.
docs/adr/0002-shape-duplicates-line-pattern.md Updates ADR to include EXTRUDE as another instance of the duplicated pattern.
Review details

Suppressed comments (1)

README.md:134

  • This section describes EXTRUDE spanning from the lowest to tallest sign height, but the code intentionally enforces a minimum 1-block height when all members share the same Y. Consider mentioning that here as well.
"Regions" marker group once 3 or more such signs exist. Signs with the `[building]` prefix, sharing the same
description line, will be connected in placement order into a solid volume in the "Buildings" marker group once 3
or more such signs exist, spanning from the lowest sign's height up to the tallest sign's height.
  • Files reviewed: 16/16 changed files
  • Comments generated: 2
  • Review effort level: Lite

💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.

Comment thread README.md Outdated
@tpwalke2
tpwalke2 merged commit e86ce41 into main Sep 3, 2026
1 check passed
@tpwalke2
tpwalke2 deleted the feature/tpwalke2/196-extrude-markers branch September 3, 2026 02:25
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants