Skip to content

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


1. Template rules

  1. PascalCase, always. T_Rock_BaseColor, never t_rock / t_Rock / rock_basecolor. Prefixes are uppercase.
  2. Every asset has a type prefix (table §2). No bare names (DefaultDiffuseT_DefaultDiffuse).
  3. No cruft suffixes in committed assets: no _Old, _Copy, _New, _Test, dangling _2. Iteration artifacts get deleted or renamed before commit.
  4. One concept, one home. Don't split the same concept across competing roots (§4).
  5. 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 duplicatedAnimations/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.

  • C++ Style Guide — source-side naming, formatting, patterns (owns C++ class naming)
  • Core ArchitectureEternal prefix + A/U/F/E/I rules
  • 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/; SubSystemsSubsystems
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)