Introduction

After loading a level, open View → Model Editor to launch the Model Editor, shown below. It browses and edits the level's mesh package under RENDERABLE (e.g. LEVEL_MODELS.PAK / MODELS_LEVEL.BIN) — CS2 models used by ModelReference entities and other renderables.

The same window can open as a picker (with Select This Model) from a renderable instance's Change Model button.

The Model Editor window: the model tree on the left scrolled to SHOTGUN_PICKUP_DISPLAY.cs2, a textured 3D preview of the shotgun pickup in the centre with Use Material Data ticked, and on the right the Preview Render Filter's submesh checkboxes with their i buttons, the Model Render Flags checkboxes and the Edit, Export and Delete buttons.

The Model Editor with SHOTGUN_PICKUP_DISPLAY.cs2 selected: the Preview Render Filter lists the SHOTGUN LOD's submeshes, each with an i button; the model's other LOD groups sit further down the same panel.

Browsing & Preview

The left tree lists the level's models, grouped into folders by their names, as shown above. Use Search / Clear to filter. Select a model (its .cs2 entry) to preview all of it in the centre 3D view, or one of the numbered components beneath it to preview just that part; the preview's title shows what's selected, and Edit, Export and Delete on the right act on the selected model.

  • Use Material Data — textured preview when possible (same preference as Options → Misc → Use Textured Model View); materials come from the Material Editor package, textures from the Texture Editor.
  • Preview Render Filter — one group per LOD, with a checkbox per submesh (Show All / Hide All toggle a whole group). Only each component's first LOD is shown to begin with, and COL_ collision hulls start hidden even then. The i button beside a submesh opens a small info window (vertices, indices, triangles, and what its vertex format carries).

Import & Export

Supported mesh formats: FBX, glTF (.gltf / .glb), COLLADA (.dae) and Wavefront OBJ.

FBX and glTF are written by OpenCAGE itself rather than through Assimp, because Assimp's exporters mangle exactly the things you care about — it resamples animation down to a handful of keys in FBX, and damages animated content badly in glTF. Those two carry everything OpenCAGE writes; COLLADA and OBJ go through Assimp and carry progressively less (OBJ has no skinning and only one UV set).

Models export at their real size. FBX, COLLADA and OBJ all treat one unit as a centimetre while CATHODE and glTF work in metres, so OpenCAGE applies the right unit scale per format — a model no longer arrives in Blender at a hundredth of its size.

Import New

Click Import New, pick a file, then use the import preview (shown below) to choose which meshes to bring in — tick or untick them in the tree on the left, and the preview follows. The line across the top says what was found: whether an OpenCAGE sidecar was read, how many components, LODs and submeshes the model will have, and how many materials will be built from the model's own textures, with how many textures that imports or reuses. You settle the model's name and any folders it should live in here too (use \ for folders), with clashes checked as you type — nothing gets silently renamed after the fact.

The model import preview for TOOLBOX_DISPLAY: the status line, name, scale and composite rows across the top, the mesh tree with a [generate ...] material tag per submesh on the left, the Model Preview on the right showing the toolbox drawn with its own base colour texture, and the Pick material for selected, Edit generated material, Import and Cancel buttons along the bottom.

Importing a glTF with no sidecar: each submesh is tagged [generate …], so it gets a material built from the model's own textures unless you pick a level material for it; the Model Preview draws the toolbox with the base colour maps those materials will use, and the status line counts the materials and textures that will be created.

Also create a composite that places it is ticked by default: the import then also creates a composite named after the model (rename it, folders included) holding a ModelReference for it, so the model can be dragged into the level the moment it lands. A mesh skinned to one of the game's skeletons gets a DisplayModel composite with an EnvironmentModelReference on that skeleton instead, which is what a character's display_model looks up.

If a .cs2meta.json sidecar sits beside the file (see below), OpenCAGE reads it and rebuilds the model with the structure it had when it was exported, and pre-selects the materials each submesh used if the level still has them.

Imports need triangles (Assimp triangulates where needed), a usable bounding box, and under 32,768 vertices per converted mesh. Models are keyed by name when a level is read back, so a name that already exists is adjusted and you're told what it became — anything already placed still points at the original.

Scale

The Scale box multiplies the model as it comes in (the default of 1 keeps the file's real size, with the per-format unit conversion above already applied). The preview follows the value as you type. Resizing a skinned mesh pulls it away from the skeleton it's weighted to, so the box warns you when the model has bone weights.

Skeletons & Animations

A file that's skinned, or that carries animations, gets an extra row describing what OpenCAGE found:

  • Skinned to a rig the game already has — the mesh is bound to that skeleton on import, with its bone weights intact, so it can play that skeleton's animations.
  • Skinned to a rig the game doesn't have — the mesh comes in, the bone weights don't. There's nowhere to put a new skeleton: the engine wants bone groups, a mirror table, a ragdoll and an animation set before it will spawn a character, none of which can be authored here. To bring a character in with its skinning, bind it to one of the game's skeletons before exporting it.
  • Also import the animation(s) — if the file carries clips, tick this and each one goes through the animation import window in turn, which asks which set and rig to build it against.

Both need the game's animation data loaded; without it the row just says so and the mesh imports on its own.

Materials

Every submesh needs a CATHODE material. There are two ways to get one:

  • Pick material for selected — choose an existing level material for the selected meshes (opens the Material Editor as a picker).
  • Generate one from the model — the default for any submesh you haven't pointed at a material. OpenCAGE reads the textures, colours and skinning the model's own material carries and plans a new CATHODE material from them, one per source material, named after it. Each submesh in the tree says what it will draw with — [generate …] for a planned material, or […] naming a level material you picked. The preview shows the base colour a planned material will use. Click Edit generated material… to see or change the plan for the selected mesh.

The Generate Material dialog shows the shader type (family) OpenCAGE picked for the mesh and lets you change it, the material's name, and the textures taken from the model — which map fills which sampler, how it will be imported, and where it came from. A texture the level already has under the same name is reused rather than imported again. The shader features list shows what the chosen permutation turns on. OpenCAGE asks for a feature exactly when its map is present, which is how every shipped material is built, but only a permutation the level ships (or the shader database holds) can be used — when that exact combination isn't compiled here, the nearest shipped permutation is taken instead and the list follows it rather than the maps, so it can carry features no map asked for (the toolbox below gets EMISSIVE and RADIOSITY_STATIC that way). The summary underneath says when that has happened; building the shader database, or installing an HLSL compiler, widens what can be built. Tick Always create a new material to force a fresh material even where an identical one could be reused. Create Material hands the plan back to the import preview.

The Generate Material dialog for the toolbox's first submesh: the shader type CA_ENVIRONMENT, the suggested name TOOLBOX_DISPLAY\Metal_Painted_Yellow-_Metal_Painted_Yellow, one base colour texture row mapped to DIFFUSE_MAP and imported as BC7 sRGB, the shader features EMISSIVE and RADIOSITY_STATIC, a summary saying one texture will be imported and the nearest shipped permutation will be used, and the Always create a new material tickbox at the bottom left with Cancel and Create Material at the bottom right.

Editing the generated material for one submesh: the name is suggested from the model's file name and its own material name (characters a name can't hold become underscores), the base colour map was found beside the model and will be imported as BC7 sRGB (the From column shows the path as the glTF wrote it, spaces percent-encoded), and the summary explains that the exact feature combination isn't compiled here so the nearest shipped permutation is used — which is where its EMISSIVE and RADIOSITY_STATIC features come from.

Textures are imported in the format and colour space their role needs (diffuse maps as sRGB, normal maps as two-channel linear data, and so on), and everything a model can't tell you — roughness, radiosity behaviour, priority — is taken from a similar material already in the level, so a generated material starts from values known to work there. Nothing is written until you click Import; if a material can't be generated you're told why and can import without it, in which case those submeshes use the fallback material.

Export & Delete

  • Export — writes the selected model out, with normals and skin weights carried across in the formats that support them. Related textures (diffuse, normal, and so on) can be written beside the file under a textures folder (sourced via the model's materials — see the Texture Editor).
  • Delete — removes the model from the level after confirmation.

Exporting a skinned model asks which skeleton to bind it to first, before the file dialog — a skinned model is only half a model without the rig its weights point at. The Choose a skeleton window (below) lists every skeleton in the game's animation data with its bone count and a Fit score — how far, on average, its bones sit from the vertices weighted to them — best fit first and pre-selected; skeletons with too few bones are greyed out. Search filters the list, Export uses the selected rig, and Export without one writes the mesh alone. The chosen skeleton is written into the file with the mesh bound to it.

The Choose a skeleton window shown when exporting a skinned model: a line saying the model uses 158 bone slots and that SAMUELS fits its skin weights best, a Search box, the list of skeletons with their bone counts and fit scores best fit first with SAMUELS pre-selected, and the Export without one, Export and Cancel buttons.

Exporting a mesh that uses 158 bone slots: the rigs that can hold it come first, best fit at the top, and SAMUELS is already selected; further down the list, a rig with too few bones is greyed out and marked too small.

Every export also writes a .cs2meta.json sidecar next to the model, holding everything the mesh formats can't carry: the component / LOD / submesh structure, render flags, vertex formats, and skinning data. Keep it beside the model and leave the object names intact, and the model can be imported straight back in as it was.

Editing

Render Flags

On the main window, the Model Render Flags group (on the right, under the Preview Render Filter in the first screenshot) toggles the engine's per-submesh flags — DYNAMIC GEOM, HELPER NODE, IS LOD, TOP LOD OVERRIDE, IS SHADOW LOD, NEVER LOADED and so on. A box is ticked when every submesh of the previewed model carries that flag, and ticking or unticking it applies to all of them. Changes apply in memory immediately.

Geometry Editor

Select a model and click Edit to open a second window, titled with the model's name, for that CS2's hierarchy: Component N → Part N: <LOD name> → Mesh N. Whatever you select is drawn in the Selected Preview (tick Materials for a textured view), Selected Info gives its name and vertex count, and the Utilities buttons change with the selection, as shown below:

The geometry editor for SHOTGUN_PICKUP_DISPLAY.cs2: the fully expanded Component, Part and Mesh tree on the left with Mesh 0 selected, and on the right the Selected Preview with its Materials checkbox, the Selected Info panel showing the name, vertex count and Resize by box, and the Utilities buttons Replace Selected, Edit Material and Delete Selected.

With a submesh selected, Utilities offers Replace Selected, Edit Material and Delete Selected; the Add buttons appear when a model, component or part is selected instead.

  • Replace Selected (submesh selected) — swap the submesh's geometry for the first mesh in a model file of any supported format; the material and render flags of the submesh it replaces are kept
  • Edit Material (submesh selected) — assign a material via the Material Editor
  • Add New Component (model selected) / Add New LOD (component selected) / Add New Submesh (part selected) — grow the hierarchy from an imported mesh (first mesh in the file); a new LOD is named after the file
  • Delete Selected — remove a component, part or submesh (anything but the model itself)
  • Resize by (submesh selected) — type a factor (2 doubles it, 0.5 halves it) and click Apply to rewrite the submesh's geometry at that size. The box goes back to 1 afterwards because the resize is baked into the vertices, so apply it once rather than re-entering the same number

For multi-mesh sources, prefer Import New with the mesh checkboxes; the per-submesh add/replace path only uses the first mesh in the file.

Saving

The Model Editor has no separate Save button. Persist changes with File → Save Level (Ctrl+S), which writes the level's model PAK/BIN (and related assets) back to disk.

Saving closes the game if it's running so install files aren't locked.

Related Tools

  • Material Editor — materials assigned to submeshes and used during textured preview / import
  • Texture Editor — textures sampled by those materials
  • Animation Editor — the clips that play on these models, and the rigs they use
  • Save and Build — giving newly imported geometry lighting, collision and navmesh
  • Material Mapping Editor — From→To remaps that can swap materials on model instances
  • Viewport — in-level 3D view of ModelReferences (separate from this editor window)
  • Renderable Instance Change Model — picks a CS2 from this editor for script/renderable placement