Annotation System Decision Tree ============================= Decision guide for selecting Direct vs Proxy annotation mode. Mode Overview ------------ +--------------------+----------------+----------------+----------------+ | Aspect | Direct | Proxy | +--------------------+----------------+----------------+----------------+ | Draw Calls | O(N) | O(1) | | Quality | High | Medium | | Memory | O(N) materials | Constant | | Setup Complexity | Low | Medium | | Best For | <50 objects | >50 objects | +--------------------+----------------+----------------+----------------+ Decision Flowchart ----------------- :: Start: Need Annotation? ─────────────────────── │ ▼ ┌───────────────────────┐ │ How many annotated │ │ objects? │ └───────────────────────┘ │ ├─▶ < 10 objects ──────▶ USE DIRECT ✓ │ ├─▶ 10-50 objects ─────▶ Consider quality vs speed │ │ │ ├─▶ High quality needed? ──▶ USE DIRECT ✓ │ │ │ └─▶ Speed priority ─────▶ USE PROXY ✓ │ └─▶ > 50 objects ──────▶ USE PROXY ✓ Detailed Decision Matrix ---------------------- +---------------------------+----------------+----------------+ | Scenario | Recommended | Reason | +---------------------------+----------------+----------------| | Single object mask | Direct | Simple, high | | 10 objects, static | Direct | Low overhead | | 20 objects, static | Direct | Acceptable | | 50 objects, static | Either | Depends on FPS | | 100+ objects, any | Proxy | Required for | | | | performance | | Real-time annotation | Proxy | Required for | | | | frame rate | | Dynamic object changes | Proxy | Single update | | Complex materials | Direct | Better support| | Many materials per object | Direct | Per-material | | | | control | +---------------------------+----------------+----------------+ Direct Annotator Flow -------------------- :: ┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐ │ For each actor │ ───▶ │ Create unique │ ───▶ │ Render with │ │ to annotate │ │ material │ │ custom depth │ │ └─────────────────┘ └─────────────────┘ └─────────────────┘ │ ▼ ┌─────────────────┐ │ Extract color │ │ from ID │ └─────────────────┘ Performance: O(N) where N = annotated actors - Material creation: N - Render passes: N - Memory: O(N) materials Proxy Annotator Flow ------------------- :: ┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐ │ Enable custom │ ───▶ │ Enable post- │ ───▶ │ Post-process │ │ depth stencil │ │ process pass │ │ extracts IDs │ └─────────────────┘ └─────────────────┘ └─────────────────┘ │ ▼ ┌─────────────────┐ │ Color encoded │ │ in RGB channels │ └─────────────────┘ Performance: O(1) constant - Setup: 1 pass - Render: 1 pass - Memory: 1 post-process Color Generation --------------- Both modes use ColorGenerator for deterministic colors: :: Object ID ──▶ ColorGenerator ──▶ Unique Color │ │ │ │ ▼ ▼ │ Channel-wise R: high bits │ bit patterns G: mid bits │ B: low bits Formula: Color(ID) = (ID >> 16, (ID >> 8) & 255, ID & 255) Mode Switching ------------- :: ┌─────────────────┐ ┌─────────────────┐ │ FObjectAnnotator│ ───▶ │ SetAnnotationMode│ │ Static Facade │ │ (EAnnotationMode)│ └─────────────────┘ └─────────────────┘ │ ┌────────────────┼────────────────┐ ▼ ▼ ▼ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │ Direct │ │ Proxy │ │ Auto │ │ Annotator │ │ Annotator │ │ (based on N) │ └──────────────┘ └──────────────┘ └──────────────┘ Example Usage ------------ .. code-block:: cpp // Switch to Direct for quality FObjectAnnotator::SetAnnotationMode(EAnnotationMode::Direct); // Annotate objects for (AActor* Actor : TargetActors) { FObjectAnnotator::AnnotateActor(Actor); } // Switch to Proxy for many objects FObjectAnnotator::SetAnnotationMode(EAnnotationMode::Proxy); // Annotate scene FObjectAnnotator::AnnotateAllActors();