# drawable_submap.cpp `src/drawable_submap.cpp` implements the `DrawableSubmap` class declared in `drawable_submap.h`. ## Constants - `kMinQueryDelayInMs = 250` — minimum delay between texture queries to avoid flooding the service. - `kAlphaUpdateThreshold = 0.2f` — alpha is only updated when it changes by more than this amount (unless it is exactly 0 or 1). - `kSubmapIdColor` (red), `kSubmapIdPosition` `(0, 0, 0.3)`, `kSubmapIdCharHeight = 0.2f` — styling of the submap ID label. - `kNumberOfSlicesPerSubmap = 2` — each submap is rendered with a high- and a low-resolution slice. ## Constructor Creates a child scene node under the map node, creates the two `OgreSlice` objects, creates the `visibility_` `BoolProperty` (parented to the submap category), sets up the red submap-ID text label ("(trajectory_id,submap_index)") above the submap origin, applies the initial pose-marker visibility, and connects the `RequestSucceeded()` signal to the `UpdateSceneNode()` slot. ## Destructor If a texture query is in progress, waits on `rpc_request_future_` (Qt then guarantees `RequestSucceeded` is not delivered after destruction). Destroys the submap and ID-text scene nodes. ## Update Stores the new metadata version and pose, applies the pose to the submap scene node, requests a render, and renames the visibility property to `"."` with a descriptive tooltip (trajectory, submap, version). ## MaybeFetchTexture Under the mutex, it checks three conditions: a newer texture version exists (`submap_textures_` is null or its version differs), the last query was not within `kMinQueryDelayInMs`, and no query is in progress. If all hold, it marks a query in progress and launches an asynchronous task that calls `cartographer_ros::FetchSubmapTextures()` with a 10-second timeout. On success it stores the textures and emits `RequestSucceeded()`. Returns `true` if a query was started. ## SetAlpha Computes the z distance between the submap pose and the current tracking z, scales it against the fade-out band (which spans twice the configured start distance), and derives a target alpha. If the change is significant (or the alpha reaches 0 or 1), it updates `current_alpha_` and applies it to every slice, then requests a render. ## SetSliceVisibility / ToggleVisibility `SetSliceVisibility` forwards to the given slice and re-evaluates node visibility. `ToggleVisibility` updates every slice node to the visibility property value. ## UpdateSceneNode Called via the Qt signal after a successful query: applies each fetched texture to the corresponding `OgreSlice` and requests a render. ## TogglePoseMarkerVisibility Shows/hides the submap ID text node and the pose-axes scene node.