Asset Naming & Content Organization Standard¶
Summary: Authoritative naming and folder conventions for everything under
Content/. Aligns with the UE5 community style guide, with project-specific deviations called out per section. Companion to the C++ Style Guide; adopted 2026-05-24 to lock the standard before the Phase 3 history rewrite so renames land in clean history.
Table of Contents¶
- Template Rules
- Asset Type Prefixes
- Texture Channel Suffixes
- Folder Organization
- Vendor / Marketplace / Generated / Engine-Managed Content
- The
Anim_Library Exception - Legacy / Cleanup Targets
- C++ Source Naming
- Enforcement
- Related Systems
- Recent Changes
1. Template rules¶
- PascalCase, always.
T_Rock_BaseColor, nevert_rock/t_Rock/rock_basecolor. Prefixes are uppercase. - Every asset has a type prefix (table §2). No bare names (
DefaultDiffuse→T_DefaultDiffuse). - No cruft suffixes in committed assets: no
_Old,_Copy,_New,_Test, dangling_2. Iteration artifacts get deleted or renamed before commit. - One concept, one home. Don't split the same concept across competing roots (§4).
- Marketplace/vendor content is namespaced, never loose at
Content/root (§5).
2. Asset type prefixes¶
| Type | Prefix | Notes |
|---|---|---|
| Static Mesh | SM_ |
|
| Skeletal Mesh | SK_ |
Project standard. SKM_ is deprecated — rename to SK_. |
| Texture | T_ |
suffixes in §3. (TX_ Quixel imports → re-prefix T_ when promoted out of vendor folder) |
| Material | M_ |
|
| Material Instance | MI_ |
|
| Material Function | MF_ |
|
| Material Parameter Collection | MPC_ |
|
| Blueprint | BP_ |
|
| Widget Blueprint | W_ |
project standard (not WBP_) |
| Anim Sequence (project-authored) | AS_ |
see §6 for the Anim_ library exception |
| Anim Montage | AM_ |
|
| Anim Blueprint | ABP_ |
|
| Blend Space | BS_ |
|
| Control Rig | CR_ |
|
| Niagara System | NS_ |
|
| Niagara Emitter | NE_ |
|
Level / Map (.umap) |
L_ |
|
| Data Asset | DA_ |
|
| Primary Data Asset | PDA_ |
|
| Data Table | DT_ |
|
| Curve Table / Curve | CT_ / CF_ |
|
| Behavior Tree / Blackboard / EQS | BT_ / BB_ / EQS_ |
|
| Input Action / Mapping Context | IA_ / IMC_ |
project convention — correct, keep |
| Gameplay Ability / Effect | GA_ / GE_ |
project convention — correct, keep |
| Sound Wave | SW_ |
audio standard (D7), enforced by Eternal.Audio.Audit |
| Sound Cue / MetaSound Source / MetaSound Patch | SC_ / MSS_ / MSP_ |
SC_ legacy-only — new work uses MetaSounds |
| Sound Attenuation / Submix / SoundClass | SAT_ / SMX_ / SCL_ |
|
| Sound Concurrency / Control Bus | SCC_ / SCB_ |
|
| Reverb Effect / Submix Effect Preset | RVB_ / SFXP_ |
|
| Enum (BP) / Struct (BP) | E / F |
matches C++ |
External audio source-file naming (sfx_/mus_/amb_/ui_/vox_, lowercase) is a separate
convention — see Documentation/09_Audio/03_External_Deliverable_Spec.md.
3. Texture channel suffixes¶
Standard set (explicit, PBR/Quixel-aligned):
| Channel | Suffix |
|---|---|
| Base Color / Albedo | _BaseColor |
| Normal | _Normal |
| Occlusion+Roughness+Metallic (packed) | _ORM |
| Ambient Occlusion (standalone) | _AO |
| Roughness / Metallic / Emissive (standalone) | _Roughness / _Metallic / _Emissive |
| Mask | _Mask |
Deprecated/forbidden (rename when touched): _D, _BC, _Color, _N, _NRM, _RMA, _AORM, _ALB.
Sampler type must match compression + sRGB¶
A material texture-sample node's sampler_type must match the source texture's compression setting and sRGB
flag. A mismatch either fails to compile ([SM6] (Node TextureSample) Sampler type is Grayscale, should be Linear
Grayscale) or samples the wrong color space (double gamma correction). Decide compression first, then match the
sampler — this holds for placeholder textures too, so the swap to final art keeps compiling.
| Compression | sRGB | sampler_type |
|---|---|---|
TC_DEFAULT |
On | SAMPLERTYPE_COLOR |
TC_DEFAULT |
Off | SAMPLERTYPE_LINEAR_COLOR |
TC_NORMALMAP |
— | SAMPLERTYPE_NORMAL |
TC_MASKS |
Off | SAMPLERTYPE_MASKS |
TC_GRAYSCALE |
On | SAMPLERTYPE_GRAYSCALE |
TC_GRAYSCALE |
Off | SAMPLERTYPE_LINEAR_GRAYSCALE |
TC_ALPHA |
— | SAMPLERTYPE_ALPHA |
Rule of thumb: srgb = False → use the LINEAR_* variant; BaseColor/Emissive are the only sRGB-on channels; ORM/Masks
are always masks/linear. Verify against [SM6]/[SM5] errors in the editor Output Log after compile.
4. Folder organization¶
Top-level Content/ is for project systems only. Each major system folder is PascalCase and plural where it's a collection (Animations, Widgets, Weapons). Uncountable stays singular (Audio, Input). Don't pluralize for its own sake.
Per-system internal layout (be consistent within a system):
SystemName/
_Common/ # shared-within-system assets (underscore prefix; NOT "_Commons"/"Shared"/"Mix")
<Category>/ # e.g. Sword/, Hammer/ under GameplayAbilities
Shared-folder convention: _Common for within-system shared assets; Shared/ is acceptable for cross-kit / cross-system art (e.g. Art/Levels/Shared, Art/Characters/Shared). Do not use the plural _Commons — normalize to _Common (one known instance: Effects/_Commons, deferred low-priority rename). Note: the project mix graph (submixes/classes/concurrency/control buses) lives in
Audio/_Common/Mix/ per this convention; Audio/Movement/Mix/ holds the legacy foley submixes
(SMX_Final etc., parented under SMX_SFXWorld) pending their Phase 1 consolidation.
One home per concept.
- Levels (confirmed model, not competing roots): Maps/ owns all .umaps — no maps live outside it. Art/Levels/<Kit>/ owns level art kits. Gameplay/Level/ owns level Blueprints. These are split by role on purpose; an audit flagging them as "competing" is a false positive. (Level/ singular is a small misc folder — fold into the above only if it grows.)
- Mannequin anims: role-split by design, not duplicated — Animations/Mannequin (player library, ~255), Animations/Enemies/Mannequin (enemy variants), Animations/Shared/Mannequin (shared base: CopyPose ABP + Locomotion). Leave as-is. (The top-level Mannequin is implicitly "player"; renaming it for clarity is a 255-asset churn — not worth it.)
- Equipment: Art/Armor + Art/Weapons siblings are fine; keep character body under Art/Characters.
Texture/material placement: textures live under a Textures/ subfolder, materials under Materials/, near their consumer. No loose textures at a folder root.
Raw texture sources never live under Content/. UE scans Content/ and cooks anything it recognizes, so a raw
.png/.tga/.exr/.psd placed there — even under Content/Python/ or a nested Source/ folder — pollutes the
asset registry and gets baked into packaged builds. Keep source files at the project root, outside Content/, in
ArtSource/Textures/<feature>/. Python texture generators write there; import scripts read from that path into
/Game/... uasset destinations. Only imported uassets should ever be visible under Content/.
5. Vendor / marketplace / generated / engine-managed content¶
| Source | Where it goes | Rule |
|---|---|---|
| Marketplace / FAB / Megascans | Content/Vendor/<PackName>/ (namespaced) |
Never loose at Content/ root. Per the repo-health plan, prefer keeping full packs in the separate library project and migrating only what's used. Megascans/MSPresets bulk packs removed 2026-05-24 — only referenced placeholder textures (used by M_PBR) + one level rock retained. |
| Modeling Mode output | a real folder with real names | Set Project Settings → Plugins → Modeling Mode → New Asset Location = "Current Folder" (or a fixed path), NOT "AutoGenerated". Stops the _GENERATED/<user>/<hash> sprawl. Promote+rename keepers to proper mesh folders; delete orphans. |
USD import (UsdAssets/, UsdAssetCache) |
migrate baked meshes out to real mesh folders | USD cache assets that are now referenced by levels are first-class geometry — move + rename them out of UsdAssets/. If the Blender↔USD iteration loop is finished, delete UsdAssetCache + cache-only orphans. Do per-level, deliberately. |
OFPA (__ExternalActors__, __ExternalObjects__) |
leave alone — auto-managed | Hidden in Content Browser by design (World Partition / one-file-per-actor). Only delete subfolders orphaned from deleted maps (e.g. TopDown/, ThirdPerson/ template residue). Never hand-edit OFPA for live maps. |
| Developer scratch | gitignore, don't commit | Content/Developers/<user>/ should not be tracked. |
6. The Anim_ library exception¶
Project decision: imported / library animations (ALS, Game Animation Sample origin) keep their Anim_ prefix — they're a coherent imported set and mass-renaming them is churn with no payoff. Project-authored new animations use the standard AS_ (sequence) / AM_ (montage) / ABP_ (anim blueprint). Don't author new Anim_-prefixed sequences.
7. Legacy / cleanup targets (resolve before Phase 3 rewrite)¶
Folders with real assets that need a decision (keep+rename, archive, or delete):
- Widgets/_Menu_Old/ (4), Art/Characters/Mannequin_UE4/ (1) — legacy, likely delete.
- Art/Prototyping/ (67), MeshLibrary/Blockout/ (6) — blockout/proto; archive or keep if still placed.
- Developers/Oliwer/ (0 assets) — remove from tracking.
- __External*__/{TopDown,ThirdPerson} — orphaned template OFPA, delete.
8. C++ source naming¶
This doc does not own C++ naming. Canonical source: C++ Style Guide §Naming Conventions and Core Architecture §Naming Philosophy (A/U/F/E/I prefixes + the Eternal core-framework prefix). Source-side items from the 2026-05-24 audit:
- Eternal prefix is core-framework-only (per the canonical docs) — except where it disambiguates from a third-party plugin base class. The Dungeon classes (UEternalDungeonGenerator, AEternalDungeonActor, AEternalDoor, UEternalRoomData) keep Eternal on purpose: they extend the Procedural Dungeon plugin bases (ADungeonGenerator, ADoor, URoomData, ATriggerDoor), so dropping the prefix would collide. Do not "fix" these.
- Folder casing: Subsystems/ (not SubSystems/); interfaces in Interfaces/; Private mirrors Public.
9. Enforcement¶
- New assets: follow this doc at creation. PRs/reviews check naming.
- Bulk migration of existing violations: do as a dedicated pass before the Phase 3 history rewrite so redirectors don't accumulate in rewritten history. After each batch of renames/moves, Fix Up Redirectors in Folder.
- Audit baseline (counts as of 2026-05-24): ~239 lowercase-prefixed, 41
SKM_, mixed texture suffixes,Anim_library 227. Track these down as the migration backlog.
Related Systems¶
- C++ Style Guide — source-side naming, formatting, patterns (owns C++ class naming)
- Core Architecture —
Eternalprefix +A/U/F/E/Irules - Data Authoring Pipeline — JSON-vs-UASSET storage decision
- Repo-health plan:
ImplementationDocs/AssetManagement_RepoHealth.plan.md(Phase 3 history rewrite ordering)
Recent Changes¶
| Date | Change | Impact |
|---|---|---|
| 2026-05-24 | Standard adopted | Locks SK_, _BaseColor/_Normal/_ORM, Anim_ library exception, folder org; Modeling Mode autogen path fixed to stop _GENERATED/<user>/<hash> sprawl |
| 2026-05-24 | Dungeon Eternal exception |
Recorded plugin-disambiguation reason; relocated QuestParticipant/ISkillSlotDisplayInfo to Interfaces/; SubSystems→Subsystems |
| 2026-05-24 | Level model confirmed; Shared/ allowed |
Maps/Art/Levels/Gameplay/Level are role-split (not competing); softened shared-folder rule to allow Shared/, only _Commons plural is a defect |
| 2026-05-24 | Megascans pruned | 98 unused MS assets removed; placeholders + 1 level rock kept |
| 2026-07-03 | Sampler table + source-file rule | Added full compression↔SAMPLERTYPE_* mapping table (§3) and the raw-texture-sources-outside-Content/ rule (ArtSource/Textures/<feature>/, §4) |