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();