#196 Add EXTRUDE shape support - #203
Merged
Merged
Conversation
Contributor
There was a problem hiding this comment.
🟡 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.EXTRUDEplus corresponding resolver, marker identifier, and BlueMap actions (set/remove). - Extends the transition table and BlueMap connector to dispatch and render BlueMap
ExtrudeMarkerinstances, 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.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
What
Adds a new
EXTRUDEmarker 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
SHAPEmarker capability (issue #196) to let users mark 3D volumes (e.g. buildings) on the map, not just flat regions.Changes
MarkerGroupType.EXTRUDE, following the same membership/threshold model asSHAPE(3+ signs sharing prefix+label, ordered by placement time)ExtrudeGroupResolverdelegates member resolution toLineGroupResolver(matches the existingShapeGroupResolverpattern, perdocs/adr/0002-shape-duplicates-line-pattern.md)SignTransitionResolvergainedextrudeJoinAction/extrudeLeaveActionbranches mirroring theSHAPEjoin/leave/recompute logicSetExtrudeMarkerAction/RemoveExtrudeMarkerAction(ActionFactory) andExtrudeMarkerIdentifierBlueMapAPIConnector.setExtrudeMarkerbuilds BlueMap'sExtrudeMarker, computing floor/ceiling from member Y values (resolveExtrudeHeightRange) with a 1-block minimum height fallback when all members share one YConfigProvider:EXTRUDEreusesSHAPE'slineWidth/lineColor/fillColor/depthTestvalidation and warns on inapplicable fields (icon,offsetX,offsetY,cssClasses)README.mddocuments theEXTRUDEtype and an example[building]configEXTRUDEas a fourth instance of the duplicated shape/line patternTesting
./gradlew test— new unit tests:ExtrudeGroupResolverTest,ActionFactoryTest(extrude actions),ConfigProviderTest(extrude field validation/defaults),BlueMapAPIConnectorTest(resolveExtrudeHeightRange), and extensiveSignTransitionResolverTestcoverage for extrude join/leave transitions./gradlew runServer: placing 3+[building]signs sharing a label renders a solid extruded volume on the map, spanning from the lowest to tallest sign