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
The Solution: Display Values
Display Value = A simplified, viewer-ready geometric representation attached to any object.- 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:- Connector reads native geometry (Revit solid, Rhino NURBS, etc.)
- Converts to triangulated mesh(es)
- Attaches as
displayValueproperty - Sends both the object data AND display geometry
2. Viewer Receives and Renders
The Speckle 3D viewer:- Reads the
displayValueproperty - 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:- 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:- 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:- Display value - Universal visualization (all viewers)
- Native geometry - Lossless round-trip (same app)
When to Use Each
| Use Case | Display Value | Native Geometry |
|---|---|---|
| 3D Viewer | ✅ Always used | ❌ Not used |
| Cross-application | ✅ Works everywhere | ❌ App-specific |
| Round-trip | ⚠️ Lossy (tessellated) | ✅ Lossless |
| Required | ✅ For visibility | ❌ Optional |
Display Values for Interoperability
Atomic Viewer Objects
Objects withdisplayValue are atomic in the viewer - they can be clicked, selected, and queried:
- 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:- 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.- 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:- SDK detects large
displayValuemeshes - 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)
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” ModeColorProxies 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)
- Presentation view - Realistic materials and colors for visualization
- Working view - Color-coded by layer/category/system for organization and analysis
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
- For simple cases, use per-vertex colors or direct
renderMaterialproperty - Only use proxies if you need to organize many objects by shared materials
Viewer Rendering Priority
The viewer applies materials in this priority order:- Per-vertex colors in the mesh (highest priority)
- RenderMaterial assigned to the object
- Material from RenderMaterialProxy (if object is referenced)
- Color from ColorProxy (if object is referenced)
- 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
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:- Objects with a
displayValueproperty - That property contains Mesh, Point, Line, or other geometry
- Each object with
displayValuebecomes a selectable item
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
displayValueare 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.- Display values are tessellated meshes attached to objects
- They enable universal visualization across all connectors
- Objects with
displayValueare selectable in the viewer - They’re automatically detached for large geometries
- Geometry primitives alone are invisible - must be wrapped in displayValue
- They’re required for visibility, optional for containers
- Objects with
displayValueare 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