Skip to main content

Overview

Display Values are the foundation of Speckle’s lowest-level interoperability. They allow any connector from any authoring tool to publish data that’s immediately visible in the Speckle 3D viewer, regardless of the source application’s native geometry format.
Common Beginner Mistake: Sending geometry primitives (Mesh, Point, Line) directly will NOT make them visible in the viewer! You must wrap them in a container object with a displayValue property. See the examples below.
Universal Visualization: Display values are what make a Revit wall, a Rhino NURBS surface, and a Grasshopper custom object all visible in the same 3D viewer, even though they come from completely different systems with different geometry representations.

The Core Concept

The Problem: Different Geometry Systems

Every authoring tool has its own geometry representation:
  • Revit - Solid geometry, parametric families
  • Rhino - NURBS surfaces, boundary representations
  • Grasshopper - Procedural geometry definitions
  • AutoCAD - 2D primitives, 3D solids
  • Blender - Polygon meshes, modifiers
  • Custom apps - Anything imaginable
Without display values, viewing geometry from different sources would require understanding every system’s native format.

The Solution: Display Values

Display Value = A simplified, viewer-ready geometric representation attached to any object.
Key principles:
  • Display values are meshes (triangulated geometry)
  • They’re viewer-ready (no computation needed)
  • Geometry primitives alone are NOT visible (must be in displayValue)
  • They enable universal visualization (any app → 3D viewer)

How Display Values Work

1. Connectors Generate Display Values

When a connector sends data, it generates display values:
What happens:
  • Connector reads native geometry (Revit solid, Rhino NURBS, etc.)
  • Converts to triangulated mesh(es)
  • Attaches as displayValue property
  • Sends both the object data AND display geometry

2. Viewer Receives and Renders

The Speckle 3D viewer:
  • Reads the displayValue property
  • Renders the meshes immediately
  • Allows selection, inspection, querying
  • No knowledge of source application required

3. Interoperability Achieved

Different sources, same viewer:

Display Value Structure

Single vs Multiple Meshes

Display values can be a single mesh or a list:
Why multiple meshes:
  • Different materials per layer
  • Performance optimization (LOD levels)
  • Separate components for complex objects
  • Per-material rendering in viewer

Mesh Properties

Display value meshes support rich visualization:
Mesh capabilities:
  • Triangulated or quad faces
  • Vertex colors for material visualization
  • Texture coordinates for mapped materials
  • Units for proper scaling

Display Values vs Native Geometry

The Dual Representation

Many objects carry BOTH display values AND native geometry:
Why both:
  • Display value - Universal visualization (all viewers)
  • Native geometry - Lossless round-trip (same app)

When to Use Each

Display Values for Interoperability

Atomic Viewer Objects

Objects with displayValue are atomic in the viewer - they can be clicked, selected, and queried:
Viewer interaction:
  • Click to select → queries object with displayValue
  • Hover for info → shows object name and properties
  • Filter/isolate → based on objects with displayValue

Container vs Renderable Objects

Not all objects need display values:
Pattern:
  • Containers (levels, groups, collections) → No displayValue
  • Elements (walls, columns, furniture) → Has displayValue

Architectural Principle: Leaf Nodes Have Display Values

Key Principle: Objects with displayValue typically don’t have child elements that also have displayValue. Display values mark leaf nodes in the object graph - the atomic, indivisible elements that appear in the viewer.
Why this matters:
Exceptions are rare:
Design implications:
  • Query optimization - Find all viewer objects by looking for displayValue, stop traversing deeper
  • Viewer selection - Click selects the object with displayValue, not its parent
  • Performance - Limits recursion depth when rendering
  • Clarity - Clear distinction between containers and atomic elements

Working with Display Values

Extracting Display Meshes

Finding Viewer-Selectable Objects

Creating Display Values

When publishing custom data:

Display Value Detachment

For large models, display values are automatically detached:
Automatic optimization:
  • SDK detects large displayValue meshes
  • Stores them separately in transport
  • Main object stays lightweight
  • Viewer loads meshes on-demand

Best Practices

1. Always Wrap Geometry in Objects with Display Values

Critical: Raw geometry primitives (Mesh, Point, Line) are NOT visible in the viewer by themselves. They must be attached as displayValue on a container object.

2. Use Lists for Multiple Meshes

3. Tessellate to Appropriate Detail

4. Preserve Material Information

Materials and colors directly affect how objects are rendered in the Speckle viewer. There are multiple ways to control appearance:

Method 1: Per-Vertex Colors in Mesh

The simplest approach - embed colors directly in the mesh:

Method 2: RenderMaterial for Physically-Based Rendering

For more sophisticated materials with metallic, roughness, and emissive properties:
RenderMaterial Properties:
  • diffuse - Base color (ARGB integer format: 0xAARRGGBB)
  • metalness - How metallic the surface appears (0.0-1.0)
  • roughness - Surface roughness for reflections (0.0-1.0)
  • opacity - Transparency level (0.0-1.0)
  • emissive - Self-illumination color (ARGB format)
These map to PBR (Physically Based Rendering) in the viewer, based on Three.js MeshStandardMaterial.

Method 3: Material and Color Proxies

For organizational purposes when multiple objects share materials or colors, use proxies (typically created by connectors):
ColorProxy and Viewer “Shaded” Mode: ColorProxies enable the “Shaded” view mode in the Speckle viewer, which provides an alternative presentation of your model:
  • Default rendering - Shows objects with their native materials, textures, and per-vertex colors (the “raw” object appearance)
  • Shaded mode - Applies ColorProxy colors, overriding native materials to show organizational structure (layers, categories, systems)
This allows users to toggle between:
  • Presentation view - Realistic materials and colors for visualization
  • Working view - Color-coded by layer/category/system for organization and analysis
Think of it as switching between “what it looks like” and “how it’s organized.”
When consuming data from connectors:
  • Connectors (Revit, Rhino, etc.) typically use proxies to organize materials
  • The viewer resolves these proxies to apply materials to objects
  • See Proxification for details on how proxies work
When creating data in Python:
  • For simple cases, use per-vertex colors or direct renderMaterial property
  • Only use proxies if you need to organize many objects by shared materials
Prefer the simplest approach that matches your data shape.

Viewer Rendering Priority

The viewer applies materials in this priority order:
  1. Per-vertex colors in the mesh (highest priority)
  2. RenderMaterial assigned to the object
  3. Material from RenderMaterialProxy (if object is referenced)
  4. Color from ColorProxy (if object is referenced)
  5. Default gray (if nothing else specified)
If your mesh has per-vertex colors, they will override any RenderMaterial or proxy colors. To use RenderMaterial, ensure your mesh does not have a colors property, or set it to None.

Common Patterns

Checking for Display Values

Computing Display Bounds

Filtering by Visibility

Troubleshooting: “Why isn’t my geometry visible?”

The Soul-Crushing Experience: You send geometry to Speckle, it uploads successfully, but nothing appears in the 3D viewer. This is the most common mistake for new developers.

Problem: Geometry Primitives Alone Are Invisible

Why: The viewer looks for objects with a displayValue property. Raw geometry primitives don’t have this - they ARE the display geometry, but they need to be attached TO something.

Solution: Always Wrap in Container with displayValue

Quick Checklist: Is My Object Visible?

Use this checklist to debug visibility issues:

Common Patterns That Work

What the Viewer Actually Looks For

The viewer traverses the object graph looking for:
  1. Objects with a displayValue property
  2. That property contains Mesh, Point, Line, or other geometry
  3. Each object with displayValue becomes a selectable item
If you send a Mesh directly, it has no displayValue property on itself, so the viewer doesn’t know it’s meant to be displayed. Think of it this way:
  • Mesh/Point/Line = The paint/canvas (the geometry data)
  • Object with displayValue = The picture frame (makes it displayable)
  • Viewer = The art gallery (only hangs framed pictures)

Summary

Display Values are the key to universal 3D interoperability:
  • Any connector can publish visible data - Just attach tessellated meshes as displayValue
  • Any viewer can render - No knowledge of source application needed
  • Objects are selectable and queryable - Objects with displayValue are atomic viewer elements
  • Automatic optimization - Large meshes detached automatically
  • Coexists with native geometry - Lossless round-trip where needed
Geometry primitives (Mesh, Point, Line) MAY NOT BE VISIBLE when sent directly! The Viewer works very hard to interpret what developers intended, but a hirarchical object graph can have several blind-alleys.Always wrap what you want shown in a DataObject or Base with a displayValue property. This is the most common mistake for new Speckle developers.
Key Points:
  1. Display values are tessellated meshes attached to objects
  2. They enable universal visualization across all connectors
  3. Objects with displayValue are selectable in the viewer
  4. They’re automatically detached for large geometries
  5. Geometry primitives alone are invisible - must be wrapped in displayValue
  6. They’re required for visibility, optional for containers
  7. Objects with displayValue are typically leaf nodes - they don’t have children with displayValues

Next Steps

Understanding Speckle Mesh

Deep dive into mesh structure, faces, vertices, and materials

Data Types

See how display values fit into the three data types

Objects & Base

Learn about detachment and object properties

BIM Data Patterns

Pattern 3: Working with display value proxies

Data Traversal

Pattern 3b: Finding atomic/displayable objects
Last modified on July 18, 2026