Skip to main content

User Representation Type

HoloMIT SDK provides a modular system to define and control how each user is visually and functionally represented within a session. Whether you use a 3D avatar, webcam feed, or a full volumetric capture pipeline, the SDK offers a flexible framework to register, instantiate, and extend representations at runtime.


What Is a User Representation Type?

A User Representation Type defines how a user appears in the virtual world and what capabilities they have (e.g., audio, video, interaction). Examples include:

  • A 3D avatar
  • A 2D webcam
  • A full volumetric reconstruction
  • A non-visual participant (e.g., spectator)

These representations are identified via UserRepresentationType, which can be built-in or user-defined.


Built-in Representations

Out-of-the-box, HoloMIT includes predefined types such as:

IDDisplay NameInteractions
AVATAR3D Avatar
WEBCAM2D Video
HOLOCAPTURER_DEPTHHoloCapturer
SPECTATORAudio only / No rendering
NONENo audio / No rendering

You can list them at runtime using:

UserRepresentationType.GetAll();

Core Components

Representation Type

A strongly typed runtime‑extensible identifier that declares what kind of representation a user is using. Unlike enums, these types can be registered dynamically, discovered at runtime, sorted, and used in tooling and UI generation.

  • Each type is a unique ID + display name.
  • Custom types can be created via:
UserRepresentationType.CreateAndRegister("MY_REP", "My Custom Representation", true);

Handler Logic

Each representation type is paired with a handler implementing the behavior of that representation:

  • Enabling/disabling different GameObjects
  • Connecting pipelines
  • Applying different logic for local vs. remote users
  • Adapting the scene for producers vs. consumers
  • Must implement:
public interface IUserRepresentationHandler {
void Setup(RepresentationSetupContext context);
}

Registry

  • All handlers must be registered in:
RepresentationHandlerRegistry.Register(UserRepresentationType, IUserRepresentationHandler);

UI Integration

Every representation can expose UI data such as:

  • Icon
  • Description
  • Display name
  • Lobby text

The UI system can automatically populate dropdowns and selection widgets based on registered representation types. But it is optional to implement.

  • Associate icons, labels and descriptions via:
RepresentationUIRegistry.Register(UserRepresentationType, icon, suffix, lobbyText, description);

How to Create a New Representation

Developers can create entirely new representations:

  • Custom holograms
  • AI‑driven avatars
  • Robot proxies
  • Minimalistic “ghost” or “invisible” views
  • Hybrid mixed‑reality modes
  • Third‑party volumetric solutions
  1. Create a type:
var myType = UserRepresentationType.CreateAndRegister("MY_CUSTOM", "My Custom", true);
  1. Implement handler:
public class MyCustomHandler : IUserRepresentationHandler {
public void Setup(RepresentationSetupContext context) {
// Load model, apply materials, modify parameters, etc.
}
}
  1. Register it:
RepresentationHandlerRegistry.Register(myType, new MyCustomHandler());
  1. (Optional) Add UI support:
RepresentationUIRegistry.Register(myType, "Icons/MyIcon", " - (Custom)", "CUSTOM USER", "Custom visual representation");

No SDK core changes are needed.


Runtime Setup Flow

At runtime, when a player joins:

  • The system checks the UserRepresentationType
  • It calls TryGetHandler(type, out handler)
  • If found, the handler receives a RepresentationSetupContext and instantiates the representation

The context includes:

  • The player instance
  • Whether the user is local or remote
  • Whether it's a preview or full setup
  • Source type (e.g. webcam, volumetric, etc.)

Benefits of This System

  • 🧩 Modular – Add or replace representations without changing core logic
  • ♻️ Extensible – Add custom pipelines, rendering systems, etc.
  • 🧠 Consistent – Uses the same flow across built-in and external handlers
  • 🎨 UI-ready – UI registry enables dropdowns, previews, tooltips

Tip: If you're building your own capture/rendering pipeline, integrate it by creating a custom handler and registering it with your own UserRepresentationType.


📄 See Scripting API documentation: User Representation Type