Introduction

OpenCAGE's script editor comes paired with a level viewer, which links to the script editor over a websocket connection to render your changes in a 3D space. It's great for positioning triggers, models, markers, and anything else that benefits from seeing the level in context.

The level viewer is bundled with OpenCAGE as a standalone application — open it from the toolbar, load a level, and your edits sync live between the two windows.

Read this guide to get familiar with how to set up and use the viewer, how to navigate the scene, and how to use features like selection, deep select, transform gizmos, and render filters.

OpenCAGE Level Viewer showing Advanced Deep Select with a nested entity selected

Setting Up

Setting up the level viewer is simple! When you open OpenCAGE, the Level Viewer menu is already in the toolbar.

If you're running OpenCAGE via Steam, the level viewer is included automatically — you should see "Open Level Viewer" straight away and can skip ahead to the next section.

If you're not on Steam, you'll need to install the level viewer first. Choose "Enable Level Viewer" from the menu. OpenCAGE will prompt you to confirm — make sure you've saved your work first, as the process will relaunch the tool to install.

After relaunching, "Open Level Viewer" will appear in the same menu and you're ready to go.

Using the Level Viewer

Launching & Connecting

To launch the level viewer, select Level Viewer, then Open Level Viewer from the toolbar. Make sure you have the Connect to Level Viewer option ticked in this same menu — this keeps the websocket link alive between OpenCAGE and the viewer.

After the viewer opens, load a level in the script editor. It should begin loading in the viewer, and eventually you'll see the full level rendered in 3D.

Now, changes you make in the script editor are reflected in the level viewer — and any changes you make in the viewer (like selecting or moving entities) are reflected back in the script editor too.

Top tip: make sure to launch the level viewer before you make changes (or save first if you've already made some), otherwise things can get out of sync.

If you start to notice things syncing incorrectly, close the level viewer, save in the script editor, and press "Open Level Viewer" again.

Moving the Camera

To look around the scene, hold the right mouse button and drag. Whilst doing this, you can use W, A, S, and D to move the camera in 3D space. Q and E move down and up.

Hold the middle mouse button and drag to pan the camera without changing your viewing angle.

Scroll the mouse wheel to adjust movement speed — a small readout appears in the corner when you change it.

Press Z to recenter the camera on whatever is currently selected. You can also enable the "Focus on Selected" option in the script editor's Level Viewer menu to have this happen automatically whenever you select something in either window.

When a level first loads, the camera will frame the level automatically unless you're already drilled into a nested composite with something selected.

Selection

Selection works in both directions. Click something in the script editor and it will highlight in the level viewer; click something in the level viewer and the script editor hierarchy will update to match.

Left-click an object in the level viewer to select it. By default, this selects the relevant entity in the composite you're currently viewing in the script editor — for example, clicking a model inside a composite instance will select that composite instance entity, not the inner model directly.

Selected entities are highlighted in green in the viewer. You can click empty space or press escape to deselect.

Entities outside the composite you're currently editing are dimmed and can't be picked, which makes it easier to focus on the area you're working on. Step into a nested composite in the script editor and the viewer will update to show that scope.

If "Highlight Aliases" is enabled in the script editor (on by default), entities targeted by parameterized aliases in the active composite are shown with an orange highlight. The selected entity itself shows green rather than orange.

You can click on render previews too — not just model references. Box volumes, position markers, character previews, spline paths, sound icons, and other filtered entity types are all selectable in the viewer (see more below).

Deep Select

Sometimes you want to select something deeper in the hierarchy — an entity inside a nested composite, for example. That's what deep select is for.

Press 0 (the number row key, not numpad) to cycle through select modes. A label appears in the viewer showing the current mode:

  • Normal — left-click selects the entity in the active composite, as described above.
  • Deep Select — left-clicking the same target repeatedly steps one composite level deeper each time. Ctrl + middle-click steps into one composite instance at a time.
  • Advanced Deep Select — left-click jumps straight to the deepest entity on the pick chain. Ctrl + middle-click drills through the full hierarchy in one go.

Press - (minus) to step back out one level in the hierarchy — useful if you've drilled in too far. You can see the full hierarchy in the bar at the bottom of the OpenCAGE window, and also navigate back there too.

How aliases work with deep select

In Cathode scripts, entities inside a nested composite aren't directly selectable from the parent composite you're viewing — the script editor needs a path to reach them. That's what aliases are for: an alias in your current composite points at a chain of entities through composite instances, ending at the thing you actually want to work with.

Deep select creates that path for you automatically. When you deep-select something, the viewer looks for an existing alias in the active composite whose path matches the entity chain you clicked through. If one already exists, it selects that. If not, it creates a new alias pointing at the right depth.

In Deep Select mode, each left-click on the same piece of geometry goes one composite level deeper — first click might select the composite instance, the next click the entity inside it, and so on. The alias's path grows to match. In Advanced Deep Select mode, a single click builds the full alias path straight to the deepest entity in one go.

Aliases created this way start out parameter-free — they're temporary helpers for navigation. If you click something else without having done anything to the alias, OpenCAGE removes it again so your composite doesn't fill up with unused aliases. Once you move an alias with the transform gizmo (which adds a position override), or otherwise give it parameters in the main editor window, it becomes a permanent part of your scripts — the same as if you'd created it manually in the flowgraph.

This is separate from the orange Highlight Aliases option, which shows entities that already have parameterized aliases in the composite you're editing. Deep select is about creating and navigating through aliases on the fly; the orange highlight is about visualizing overrides you've already set up.

Note - moving an entity via deep select (an alias) will override the position defined within the child composite. This works in a hierarchy, so aliases at the root level will override ones below. Read more about aliases in the Scripting Intro

Moving Entities

Once you've selected an entity, you can move and rotate it directly in the level viewer using the transform gizmo. Changes sync back to the script editor and update the entity's position parameters.

With an entity selected, press a number key to choose a gizmo mode:

  • 1 — Translate (move along X/Y/Z axes or on axis planes)
  • 2 — Rotate (local axes)
  • 3 — Rotate (world axes)
  • 4 — Disable the gizmo

Click and drag the coloured gizmo handles to transform the entity. The current mode is shown in a small HUD in the viewer.

Optionally, enable Transform Grid Snap and/or Rotation Snap from the script editor's Level Viewer menu to snap movement and rotation to stepped values while dragging.

Hiding Entities

Need to temporarily get something out of the way while you work on geometry behind it? With an entity selected, press H to hide it in the viewer. This is a viewer-only hide — it doesn't delete or modify anything in your scripts.

Press Shift + H to unhide everything you've hidden in the current composite scope.

Hides reset automatically when you navigate to a different composite or step into/out of a composite instance, so you won't accidentally carry hidden state across contexts.

Previews & Render Filters

Not everything in a Cathode level is a rendered model. The level viewer draws previews for many function entity types so you can see triggers, markers, splines, characters, and more.

Preview types include:

  • Box volumes — semi-transparent boxes for triggers, nav areas, collision barriers, fog boxes, and similar volume entities
  • Position markers — torus-and-axis gizmos for position markers, pathfinding nodes, and related point entities
  • Character previews — simple capsule figures for character entities
  • Spline paths — point markers, connecting lines, and direction arrows
  • Icon billboards — icons for sounds, lights, particles, cameras, and sound objects
  • Environment maps — coloured spheres at probe positions

Each preview type has an associated render filter. Open Level Viewer → Render Filters in the script editor to toggle individual function types on or off. This is useful for decluttering busy levels — hide box volumes you don't care about, for example, while keeping position markers visible. You can also enable the Hide Nested Script Entities option to stop showing any of these entity previews outside of the current composite.

ModelReference entities are always shown regardless of render filter settings.

Script Editor Options

Most level viewer behaviour is controlled from the Level Viewer dropdown in the toolbar. Here's a quick rundown of the available options:

  • Open Level Viewer — launch the viewer application
  • Connect to Level Viewer — enable/disable the live websocket sync (keep this on while working)
  • Focus on Selected — automatically frame the camera on selected entities
  • Highlight Aliases — show orange highlights on aliases in the active composite
  • Show Camera Position — display camera X/Y/Z coordinates while moving
  • Render Wireframe — draw ModelReference meshes as wireframe overlays
  • Hide Nested Script Entities — hide render previews for entities defined in nested composites (ModelReferences are unaffected; only previews for the active composite are shown)
  • Transform Grid Snap / Rotation Snap — snap gizmo movement and rotation
  • Render Filters — toggle previews per function type

A full list of viewer controls are also available from the script editor via Help → Controls.