Skip to content

GridService ​

Renders an infinite-style shader grid in the scene using a custom ShaderMaterial. Supports orientation-aligned placement, per-cell and section line styling, fade-by-distance, follow-camera mode, and automatic fitting to loaded models or specific objects.

Access ​

Registered under the name "grid". No service dependencies.

GridService is not exported from the SDK entry point. Reach it by its registered name and use the class only as a type.

ts
import type { GridService } from "@optellix/xviewr-sdk";

await viewer.ready();
const grid = viewer.getService<GridService>("grid");
grid?.createGrid();

The grid mesh is not created on init. Call createGrid() once to add it to the scene, then use updateConfig or orientation methods to adjust it.

Public API ​

Lifecycle ​

  • init(context: ServiceContext): Promise<void>
  • destroy(): Promise<void>
  • getStatus(): ServiceStatus

Grid setup ​

  • createGrid(): void — creates the grid mesh and adds it to the scene. Replaces any existing grid.
  • updateConfig(config: Partial<GridConfig>): void — merges changes into the current config and updates shader uniforms. No geometry rebuild.
  • setOrientation(orientation: GridOrientation): void — rotates the grid plane to align with the named axis.
  • setTargetObject(object: THREE.Object3D): void — sets the reference object used by auto-sizing. Triggers immediate size update if a grid exists.

Visibility ​

  • setVisible(visible: boolean): void
  • isVisible(): boolean

Fitting ​

  • fitGridToScene(): void — fits grid size and position to the viewer's root scene object.
  • fitGridToObject(object: THREE.Object3D): void — fits to a specific object.
  • calculateGridParameters(object: THREE.Object3D): GridParams — returns the computed size, position, cell sizes, and thicknesses without applying them.

Per-frame update ​

  • update(): void — updates camera-projection uniforms and camera-follow position. Called by the viewer render loop; call manually only in custom loops.

Types ​

GridConfig ​

ts
interface GridConfig {
  gridSize: [number, number];
  position: [number, number, number];
  cellColor: string;
  sectionColor: string;
  cellSize: number;
  sectionSize: number;
  followCamera: boolean;
  infiniteGrid: boolean;
  fadeDistance: number;
  fadeStrength: number;
  fadeFrom: number;
  cellThickness: number;
  sectionThickness: number;
  side: THREE.Side;
  visible: boolean;
  autoFit: boolean;       // when true, grid auto-fits on model:loaded
}

Default values: gridSize [1000, 1000], cellColor "#aaaaaa", sectionColor "#888888", cellSize 0.6, sectionSize 3.3, fadeDistance 10, fadeStrength 1, side THREE.BackSide.

GridOrientation ​

ts
type GridOrientation = "X" | "Y" | "Z" | "-X" | "-Y" | "-Z";

Determines the rotation of the grid plane. "Y" (default) places the grid on the XZ plane.

GridParams ​

ts
interface GridParams {
  size: [number, number];
  position: [number, number, number];
  cellSize: number;
  sectionSize: number;
  cellThickness: number;
  sectionThickness: number;
}

Events ​

EventPayload
grid:created{ config: GridConfig }
grid:config-changed{ config: GridConfig }
grid:visibility-changed{ visible: boolean }
grid:orientation-changed{ orientation: GridOrientation }
grid:target-set{ object: THREE.Object3D }
grid:fitted-to-scene{}
grid:fitted-to-object{ object: THREE.Object3D }

Example ​

ts
const grid = viewer.getService<GridService>("grid");
if (!grid) return;

// Create a Y-aligned grid with custom colors
grid.updateConfig({
  cellColor: "#cccccc",
  sectionColor: "#666666",
  followCamera: true,
  autoFit: true,
});
grid.createGrid();

// Fit manually after loading a model
viewer.on("model:loaded", ({ model }) => {
  grid.fitGridToObject(model);
});

// Switch to Z-up orientation
grid.setOrientation("Z");

// Toggle visibility
grid.setVisible(false);

XViewr SDK and xConvert CLI documentation.