7.0.1 — The Ten Rules
Ground Rules#
These ten rules apply to every node in every asset scene. Memorise them before opening a scene. The only exception is the top node itself: it is named
TYPE_AssetName by rule 01, so it carries neither a type suffix (rule 04) nor the asset-name prefix (rule 05). QC exempts the root from those two rules and from nothing else.01
Exactly one top node
A single root in the outliner, named
TYPE_AssetName. Nothing else at world level except Maya defaults. Example: CHR_Scion, VHC_Skiff, BLD_SanctumTower.02
Top node pivot at world origin
Pivot sits at the base of the asset — XZ centre, Y minimum — and at world origin (0, 0, 0). Every published asset lands at the same predictable position.
03
Real-world scale, centimetres
All assets are authored at real-world scale in centimetres. Transforms are frozen on everything published. A character standing 175 cm tall must measure 175 units in Maya.
04
Every node carries a type suffix
No bare names, ever. A mesh ends in
_geo. A group ends in _grp. A joint ends in _jnt. See the Suffix Dictionary for the full set.05
Every node carries the asset name as prefix
Scion_head_geo, not head_geo. This is not optional — see "Why the Asset Prefix" for the two independent reasons this rule cannot be relaxed.06
Node names follow §6.1
Lowercase tokens,
_ as separator, PascalCase for the asset name. The asset name is Scion (capital S), the part token is lowercase: Scion_head_geo.07
Sides are prefixes on the part token
l_, r_, c_ for left, right, centre. Placed after the asset name and before the part: Skiff_l_thruster_geo. Never before the asset name, never after the part.08
Only meshes carry _geo
Groups carry
_grp. A mesh named Scion_head_geo is a leaf node, not a container. One exception: the asset's top-level geometry group is <Asset>_geo_grp and is required. Any other group ending _geo_grp stutters and is a QC warning — Scion_l_arm_geo_grp should be Scion_l_arm_grp.09
Geometry is a sibling of the rig
Never parent geometry under the rig group. Skinned geometry parented inside a rig hierarchy double-transforms through the skinCluster. The hierarchy prevents this structurally.
10
Nothing published carries namespace, duplicate, or history
Published assets must have zero namespaces, zero duplicate node names, and zero construction history. QC blocks publish on any of these three conditions.
7.0.2 — The Mandatory Prefix
Why the Asset Prefix#
Two independent reasons, either one sufficient to make this rule mandatory. A third reason (tool wildcard collision) is in the Reserved Names section.
Node name anatomy — every production node
Scion_head_geo
ScionAsset name prefix — makes this node globally unique across every referenced asset
headPart token — what this node represents, in camelCase for compounds
geoType suffix — the Maya node type. Mesh = geo, group = grp, joint = jnt
Correct vs incorrect
Scion_head_geo
Correct — globally unique, asset name prefix present
head_geo
Wrong — bare name collides when Rhea is also referenced
A
Namespace-free referencing
§7.1 mandates namespace-free referencing. Without namespaces, two referenced assets that both contain
head_geo collide in the same scene. The prefix keeps them apart: Scion_head_geo and Rhea_head_geo are unambiguous.B
FBX export strips namespaces
UE5 is where all assets land. Even if namespaced referencing were used,
Scion:head_geo and Rhea:head_geo both arrive in Unreal as head_geo. The namespace does not survive the FBX round-trip; the prefix does.Applies to CHR (humanoid heroes and supporting cast) and CRT (non-humanoid creatures). The hierarchy is the same for both types. The split that matters most is geo as a sibling of the rig — never a child of it.
CHR_Scion ← single top node, pivot at world origin, base of asset (REQUIRED) ├── Scion_geo_grp ← EXPORTS to UE5 (together with the skeleton) (REQUIRED · exports: fbx) │ ├── Scion_body_grp ← main body; required once the asset has >1 mesh (conditional) │ │ ├── Scion_head_grp │ │ ├── Scion_torso_grp │ │ ├── Scion_arms_grp │ │ └── Scion_legs_grp │ ├── Scion_cloth_grp ← garments, separable for CFX │ │ ├── Scion_upper_grp │ │ ├── Scion_lower_grp │ │ └── Scion_outer_grp ← coats, capes │ ├── Scion_acc_grp ← accessories, jewellery, gear │ │ ├── Scion_accHead_grp ← renamed from _head_grp — collided with the body group │ │ ├── Scion_accHands_grp │ │ ├── Scion_accFeet_grp │ │ └── Scion_gear_grp │ └── Scion_hair_grp ← mesh/card hair only — XGen lives in the groom group ├── Scion_rig_grp ← NEVER exports to UE5 (container only) │ ├── Scion_skeleton_grp ← EXCEPTION: joints DO export alongside geo_grp (REQUIRED · exports: fbx) │ ├── Scion_ctrl_grp ← animation controls, does not export (REQUIRED) │ ├── Scion_systems_grp ← ikHandles, constraints, utility nodes — suffix rule exempt │ └── Scion_deform_grp ← lattices, wraps, blendshape targets — suffix rule exempt ├── Scion_grm_grp ← grooming — EXPORTS via Alembic, not FBX (exports: abc) │ ├── Scion_desc_grp ← XGen descriptions (_desc) │ └── Scion_guides_grp ← guides, density and region maps ├── Scion_cfx_grp ← sim setups, colliders — EXPORTS via Alembic (exports: abc) ├── Scion_prx_grp ← animator stand-in — sibling of geo, never inside it └── Scion_util_grp ← refs, scale figure — never rendered, never exported
Concrete node name examples — CHR_Scion
CHR_Scion
Root — the one and only top-level node
Scion_l_eye_geo
Left eye mesh — side prefix between asset name and part
Scion_l_upperArm_jnt
Left upper arm joint — camelCase compound part
Scion_l_wrist_ctrl
Left wrist animation control
Scion_l_arm_geo_grp
Wrong — a PART group stutters. Only the asset top-level group is _geo_grp
Why geo is a sibling of the rig, not a child
Skinned geometry parented under the rig hierarchy double-transforms through the skinCluster. It is the most common rigging failure there is, and this hierarchy prevents it structurally rather than by discipline.Scion_geo_grp and Scion_rig_grp must always be siblings directly under the root.
CC5 / Auto-Setup caveat
Characters largely arrive from Character Creator 5 via Auto-Setup, which imposes its own internal structure. The hierarchy above is what Maya cleanup conforms the asset to — it is not what CC5 hands you. Confirm against a real CC5 export before assuming a one-to-one match, and report drift to the VFX Supervisor rather than inventing a local variant.Same skeleton as CHR/CRT, but simpler. The key split for hard-surface assets is what moves versus what does not. Drop any group that does not apply to the specific asset.
VHC_Skiff ← single top node, pivot at world origin, base of asset (REQUIRED) ├── Skiff_geo_grp ← EXPORTS to UE5 (together with the skeleton) (REQUIRED · exports: fbx) │ ├── Skiff_body_grp ← main body; required once the asset has >1 mesh (conditional) │ │ ├── Skiff_shell_grp ← outer skin │ │ ├── Skiff_frame_grp ← chassis / structure │ │ └── Skiff_detail_grp ← greebles, small fixtures │ ├── Skiff_moving_grp ← *** NOT FROZEN — pivots stay on the axle/hinge *** │ │ ├── Skiff_wheels_grp ← pivot at the axle centre │ │ ├── Skiff_doors_grp ← pivot on the hinge line │ │ └── Skiff_mech_grp │ ├── Skiff_int_grp ← interior, separable for cutaways │ │ ├── Skiff_cockpit_grp │ │ └── Skiff_fixtures_grp │ ├── Skiff_mod_grp ← modular kit pieces destined for UE5 instancing │ │ ├── Skiff_walls_grp │ │ ├── Skiff_floors_grp │ │ └── Skiff_roof_grp │ └── Skiff_dressing_grp ← set dressing bolted onto the shell ├── Skiff_rig_grp ← NEVER exports to UE5 (container only) ├── Skiff_prx_grp ← animator stand-in — sibling of geo, never inside it └── Skiff_util_grp ← refs, scale figure — never rendered, never exported
Variations by type
BLD_SanctumTower
BLD root — replace moving_grp with mod_grp + dressing_grp for modular pieces
SanctumTower_mod_grp
BLD — modular repeating pieces destined for UE5 instancing
PRO_ContainerA
PRO with no moving parts — needs only geo_grp and util_grp
ContainerA_body_geo
Single static mesh inside a minimal PRO hierarchy
WPN_HeroSword
WPN — weapons usually need rig + per-shot anim, so rig_grp is typically present
The
grm department is defined and canonical but is not in use at this time. The convention is documented here so the first groom task on the show has a structure to land in rather than inventing one under deadline. Confirm with the VFX Supervisor before starting any groom work.Status: defined-but-dormant
No groom tasks are currently open on Thresholds. The foldergrm/ exists under every CHR and CRT asset folder. Do not open tasks in it, and do not populate Scion_grm_grp in a published scene, without VFX Supervisor sign-off.
Scion_grm_grp ← child of CHR_Scion, sibling of geo_grp and rig_grp ├── Scion_hairMain_desc ← XGen description, suffix _desc ├── Scion_brows_desc ├── Scion_lashes_desc └── Scion_grm_util_grp ← guides, density maps, region maps
XGen naming rules
XGen descriptions take the_desc suffix. XGen collections take _col. Groom geometry that is rendered as mesh (card hair, painted strands) rather than as splines is not a groom node — it is Scion_hair_grp under Scion_geo_grp (see Character & Creature above).
Environments have a different shape because worlds are assembled rather than modelled, and Gaussian Splats are not meshes. The splat group and lighting group are unique to ENV — no other asset type carries them at this level.
ENV_RustGorge ← single top node, pivot at world origin, base of asset (REQUIRED) ├── RustGorge_splat_grp ← Gaussian Splat PLY placement nulls ├── RustGorge_geo_grp ← EXPORTS to UE5 (together with the skeleton) (conditional · exports: fbx) │ ├── RustGorge_hero_grp ← close to camera, full detail │ │ ├── RustGorge_terrain_grp │ │ └── RustGorge_structures_grp │ ├── RustGorge_mid_grp ← mid-distance, reduced detail │ ├── RustGorge_bg_grp │ └── RustGorge_scatter_grp ├── RustGorge_set_grp │ ├── RustGorge_props_grp │ └── RustGorge_veg_grp ├── RustGorge_lgt_grp ← environment lighting — groups mirror the AOV split └── RustGorge_util_grp ← refs, scale figure — never rendered, never exported
Environment node examples across the ten worlds
ENV_RustGorge
Root — matches the Drive asset name exactly
RustGorge_cliffFace_geo
Hero mesh inside hero_grp — camelCase compound part name
ENV_BurialSea
Second environment root — name matches Drive slug burialSea/ PascalCase
BurialSea_waterSurface_geo
Hero mesh for the Burial Sea environment
Scale rule — environments must match character scale exactly
All environment assets are authored at real-world scale in centimetres, identical to characters. A mismatch discovered downstream costs the entire environment department a re-export pass. When in doubt, drop a scale reference figure intoRustGorge_util_grp and compare against CHR_Scion before publishing.
The following names are permanently off-limits for any production node on this show. Using any of them will break the PXLtools TurnTable for every artist running it — not just yours.
Why this breaks things
Wildcard collision in the TurnTable
The PXLtools TurnTable performs unqualified wildcard lookups:cmds.ls("*:mainModel_grp"), cmds.ls("*:cloth_geo"), cmds.ls("*:main_CAM"). A production node carrying any reserved name collides across namespaces and breaks the TurnTable for everyone. This is also the third reason the asset name prefix is mandatory: Scion_cloth_geo cannot collide; cloth_geo will. The reserved list below is exhaustive — it matches the reserved array in THS.convention.json.
RESERVED — do not use any of these names on any production node: TT_SCENE_grp _TT_setup_grp mainModel_grp charts_grp macbeth_grp refBall_grp scaleMove_GRP shaderBall_grp ENV_grp utilities_grp rotations_grp sizeRef_grp CAM_grp lights_grp asset_ROT lights_ROT main_CAM chart_CAM aiSkyDome_HDRI aiSwitchHDRI cloth_geo liquid_geo TT_userRigs_grp Reserved prefix — any name beginning with this prefix is off-limits: TT_loc_*
Also off-limits — these already exist in the TurnTable
Do not rebuild what the TurnTable provides
The TurnTable already provides a Macbeth ColorChart, the reference balls (Chrome, Grey, White), a shader ball, and scale references. Do not build your own versions of these in your asset scene, and do not name yours after them. The lookdev rule ("validated against MacBeth ColorChart, Chrome Ball, Grey Ball, White Ball") refers specifically to the ones in the shipped TurnTable scene.Correct names vs reserved collision
Scion_cloth_grp
Correct — asset prefix prevents wildcard collision
cloth_geo
RESERVED — wildcard match breaks TurnTable immediately
Scion_key_cam
Correct — production camera with asset prefix
main_CAM
RESERVED — TurnTable looks for exactly this name
Material, shading-group, and texture-node naming is already enforced in code by the PXLtools PBR Material Manager and duplicated in the GLB Manager. The Bible adopts the tool convention rather than competing with it. Map tokens are the same set used for texture files on disk (§6.5a) — one vocabulary end to end.
| Node type | Pattern | Concrete example — Scion body |
|---|---|---|
| Material | {asset}_{part}_MAT |
Scion_body_MAT |
| Shading group | {asset}_{part}_MAT_SG |
Scion_body_MAT_SG |
| Texture file node | {asset}_{part}_{MAP}_tex |
Scion_body_DIFF_tex |
| place2dTexture | {asset}_{part}_place2d |
Scion_body_place2d |
Uppercase exception: _MAT and _SG
These two suffixes are deliberately uppercase, against the lowercase-tokens rule in §6.1 rule 6. They ship this way from the PXLtools PBR Material Manager and from the GLB Manager. Changing them means editing two tools to match a document. Until that tool update happens, _MAT and _SG stay uppercase. Every other suffix on this show is lowercase.
ORM — Packed AO · Roughness · Metallic
ORM is a single RGB image carrying three greyscale maps in its channels. It is a games convention, not a VFX one — but it is valid on Thresholds for two reasons: the show renders in Unreal, where packed maps are the native efficiency, and suppliers (notably Basam's texture sets) deliver this way.| Channel | Contains | Notes |
|---|---|---|
| R | Ambient Occlusion (AO) | In Maya: drive into AO slot if the look calls for it, or ignore. Never into a colour input. |
| G | Roughness (RGH) | Wire G directly to the roughness / specularRoughness input at the shader. |
| B | Metallic (MTL) | Wire B directly to the metalness input at the shader. |
ORM handling rules
Accept ORM. Do not demand a repack from a supplier who delivers it, and do not repack separate maps into ORM without a reason. In Maya, an ORM map must be decomposed at the shader: R ignored or driven into an AO slot, G to roughness, B to metalness. Never plug an ORM straight into a colour input. Set the file node to raw / non-colour — ORM is data, not colour. An sRGB transform on it silently corrupts all three channels. If both ORM and separate RGH/MTL exist for the same asset, the separate maps win and the ORM is redundant.Material node examples — Scion
Scion_skin_MAT
Skin material — uppercase _MAT is the deliberate exception
Scion_skin_MAT_SG
Corresponding shading group
Scion_skin_DIFF_tex
Base colour file node — map token in uppercase, node suffix _tex in lowercase
Scion_skin_ORM_tex
Packed ORM file node — must be set to raw/non-colour, then decomposed
Tool Gap
PBR Material Manager — ORM not yet handled
The PXLtools PBR Material Manager does not currently handle ORM. It needs an ORM flag that creates the file node as raw and auto-wires G to roughness and B to metalness. Until then this is a manual shader connection. Tracked in PXLtools. The workaround is to create the file node manually, set colour space to raw, and hand-connect the individual channels.Tool Gap
Token divergence — PBR Material Manager vs canonical set
PXLtools_PBR_Material_v1_5_6.py ships a MAP_SUFFIX list containing OPC, TRANS, SPC and SHEEN, and is missing AO, ORM, HGT, THICK, CAV and MASK#. The canonical set is §6.5a, enforced by PXLflow/src/constants.js TEXTURE_MAP_TOKENS. Where the tool disagrees with §6.5a, §6.5a wins — the tool is the thing that needs updating. Tracked in PXLtools.
7.0.9 — Reference
Suffix Dictionary#
The complete list of node type suffixes for Maya. Every node must end in one of these. Two entries (
_MAT and _SG) are uppercase by deliberate tool convention — all others are lowercase.Suffix
Node Type Suffixes
_geo
Renderable mesh
Any polygon mesh that renders. Leaf nodes only — never a container. Example:
Scion_head_geo_grp
Group / null
Any transform node used as a container or organisational group. Example:
Scion_body_grp_jnt
Joint
Skeleton joint. Example:
Scion_l_upperArm_jnt_ctrl
Animation control
NURBS curve used as an animator's control handle. Does not export. Example:
Scion_l_wrist_ctrl_loc
Locator
Maya locator. Used for pivot references, aim targets, attach points. Example:
Skiff_thrustPoint_loc_prx
Proxy / stand-in
Low-resolution stand-in mesh for layout and instancing. Never rendered in production shots. Example:
Skiff_body_prx_cam
Camera
Maya camera node. Example:
Scion_key_cam_crv
NURBS curve (non-control)
NURBS curve that is not an animation control — motion path, reference curve, guide. Example:
Scion_motionPath_crv_lgt
Light
Any Maya light node. Example:
key_lgt, fill_lgt_set
Selection set
Maya objectSet. Example:
Scion_face_set_desc
XGen description
XGen description node (groom). Example:
Scion_hairMain_desc_col
XGen collection
XGen palette / collection that groups multiple descriptions. Example:
Scion_head_col_MAT
Material
Uppercase exception
Arnold / surface shader node. Uppercase by tool convention. Example:
Scion_body_MAT_SG
Shading group
Uppercase exception
Maya shadingEngine node. Uppercase by tool convention. Example:
Scion_body_MAT_SGThe two uppercase exceptions and why they exist
_grp is lowercase — the general rule. Two in-house exceptions exist and are not to be copied or extended: the TurnTable's scaleMove_GRP and the GLB Manager's <Asset>_GRP import root. These are legacy artifacts. Do not add new uppercase suffix variants.
7.0.10 — lgt
Lighting Setups#
Shot lighting uses the same naming vocabulary as everything else. The critical constraint is that light groups must mirror the AOV split exactly — this is not cosmetic and missing it means manual reconstruction per shot.
SEQ010_sh0010_lgt_grp ← shot light rig root, matches shot naming convention ├── char_lgt_grp ← ALL lights that contribute to the char AOV │ ├── key_lgt │ ├── fill_lgt │ └── rim_lgt ├── env_lgt_grp ← ALL lights that contribute to the env AOV │ ├── sky_lgt │ └── bounce_lgt └── fx_lgt_grp ← ALL lights that contribute to the fx AOV └── prac_window_lgt
Individual light name examples
key_lgt
Key light — role-based name, suffix _lgt
fill_lgt
Fill light
rim_lgt
Rim / back light
l_bounce_lgt
Left-side bounce light — side prefix on the role token
prac_window_lgt
Practical window source — compound role name
Light groups must mirror the AOV split exactly
The required AOV passes arechar, env, and fx (see §7.2). Light groups on every shot must be named char_lgt_grp, env_lgt_grp, and fx_lgt_grp — and every light must live inside the group that matches the pass it contributes to. If the light groups do not match the AOV structure, the pass separation has to be rebuilt by hand for every shot at composite time. This is not a naming preference; it is the mechanism by which the comp receives isolatable passes.
7.0.11 — Maya to Unreal
UE5 Export Contract#
Unreal requires a single root and — for skeletal meshes — only joints and bound mesh in the FBX. The hierarchy in §7.0.3–7.0.4 is designed so that the correct export selection is always a single group, not a manual cleanup pass.
Static mesh
Export <Asset>_geo_grp → SM_<Asset> in Unreal
Skeletal mesh
Export <Asset>_geo_grp + <Asset>_skeleton_grp together → SK_<Asset> in Unreal
NEVER export
_ctrl · _crv · _loc · _systems_grp · _deform_grp · _util_grp · _prx_grp
Resulting Unreal asset names — using §7.2 naming
SM_Skiff_Body
Static mesh from Skiff body group — Unreal PascalCase descriptor
SK_Scion
Skeletal mesh — geo_grp + skeleton_grp exported together
SKEL_Scion
Skeleton asset created by Unreal on import from the joint hierarchy
Why the hierarchy makes this one click
Controllers, IK handles, and constraints must not be in the FBX export selection. If geometry were parented under the rig (violating rule 09), a clean export would require manually picking individual meshes. With the §7.0.3 hierarchy, selectingScion_geo_grp and Scion_skeleton_grp gives exactly the right content — nothing more.
For the full Unreal naming convention (prefixes, content folder structure, texture naming, level and sequence names) see Unreal Conventions.
7.0.12 — Known Gap
GLB Import Gap#
The PXLtools GLB Manager produces a scene that does not conform to this hierarchy. Its output is a starting point, not a compliant published asset. Manual cleanup is required before publishing.
GLB OUT
What the GLB Manager produces
Root named
Flat meshes named
Transforms not frozen
<Asset>_GRP (uppercase, no type prefix)Flat meshes named
<Asset>, <Asset>_1, <Asset>_2… (no _geo suffix, no sub-groups)Transforms not frozen
TARGET
What publish requires
Root named
Meshes named
All transforms frozen
TYPE_AssetName (e.g. CHR_Rhea)Meshes named
<Asset>_<part>_geo inside a _geo_grp / _util_grp structureAll transforms frozen
Before and after — GLB import cleanup for CHR_Rhea
Rhea_GRP
GLB Manager output root — wrong case, no type prefix, not compliant
CHR_Rhea
Correct root after rename — type prefix + PascalCase asset name
Rhea_1
GLB Manager mesh — no suffix, part identity unknown
Rhea_torso_geo
Correct mesh name after cleanup — asset prefix, part token, _geo suffix
Cleanup steps — in order, before publishing
- Rename the root from
<Asset>_GRPtoTYPE_AssetName(e.g.CHR_Rhea). - Rename all meshes from
<Asset>/<Asset>_Nto<Asset>_<part>_geo. The PXLtools Batch Renamer automates this step once parts are identified. - Build the group structure:
<Asset>_geo_grp,<Asset>_body_grp, and additional groups per §7.0.3–7.0.6 as applicable. - Freeze all transforms.
- Confirm pivot is at world origin, at the base of the asset.
Candidate Fix
Flagged to VFX Supervisor for automation
This cleanup sequence is a strong candidate for automation in the GLB Manager: rename root toTYPE_AssetName, add _geo suffix to all flat meshes, auto-build the _geo_grp / _util_grp structure, and freeze transforms on import. Until that tool update is confirmed, the manual steps above are mandatory before publish.