LAPS

LAPS — Llama Asset Pipeline System

A modular Python pipeline tool built across multiple shipped titles. Each module was added because production needed it — not because it looked good on a CV.


The Story

LAPS started as a single naming convention script on a shipped title. Across multiple productions it grew into a full pipeline system covering asset validation, FBX export, texture processing, and Unreal Engine automation. Every module exists because a real bottleneck demanded it.

The architecture is intentional: one shared config file defines all studio rules, a common validator base class means every module speaks the same language, and a unified HTML reporter means leads and producers can read results without opening Maya or Unreal.


Pipeline Flow

Author
Validate
Export
Import
Optimize
Report

Architecture

LAPS is structured in three layers. The core is DCC-agnostic — it runs anywhere Python runs. DCC-specific modules sit on top of it and only add what the environment provides.

# LAPS folder structure LAPS/ ├── core/ # shared — no DCC dependency │ ├── config.py # studio rules (naming, budgets, limits) │ ├── validator.py # base validator class all modules inherit │ └── reporter.py # unified HTML report generator │ ├── maya/ # runs inside Autodesk Maya │ ├── mesh_validator.py │ ├── uv_validator.py │ └── fbx_exporter.py │ ├── unreal/ # runs inside Unreal Engine Python │ ├── asset_validator.py │ ├── mi_generator.py │ └── vfx_validator.py │ └── standalone/ # runs anywhere — CLI, CI/CD ├── texture_analyzer.py └── channel_packer.py

Modules

Phase 1 — Core

Config Loader

Standalone

Reads laps_config.json from the project root. Defines naming rules, mesh budgets, texture specs, and export settings in one place. Every module reads from here — change one file, update the whole pipeline.

Base Validator

Standalone

Abstract base class every LAPS validator inherits. Enforces a common interface: validate() runs checks, _pass() / _warn() / _error() record findings. The reporter talks to this interface — not to individual validators.

HTML Reporter

Standalone

Collects results from any number of validators and writes a single HTML report. Runs on any machine — no Maya, no Unreal needed to open it. Producers and leads get a clean pass/fail overview with per-module detail.

Naming Validator

Standalone

Validates asset names against studio conventions: correct prefix (SM_, T_, M_...), no forbidden characters, name length within budget. The first thing to run in any pre-export pass.

Phase 2 — Standalone Tools

Texture Analyzer

Standalone

Validates texture files using Pillow: power-of-two resolution, max size enforcement, format compliance, and sRGB heuristic detection by naming suffix (_D, _N, _R...). Runs on a single file or an entire folder.

Channel Pack Processor

Standalone

JSON recipe-driven channel packing — define source→output channel mapping in a config file. Supports dry-run mode to preview output before writing. Built on the same principles as the channel packing blog post.

Phase 3 — Maya

Mesh Quality Analyzer

Maya

OpenMaya API 2.0 mesh traversal — detects non-manifold edges and vertices, degenerate triangles (zero-area faces computed via cross product), and triangle/vertex count against studio budgets.

UV Validator

Maya

Checks UV set count, flags UVs outside the 0-1 tile, detects overlapping shells, and calculates per-face texel density using the shoelace formula — flagging faces that deviate more than 40% from the mesh average.

FBX Export Manager

Maya

Pre-flight checks before every export: frozen transforms, deleted history, no unknown nodes, material assignments. Auto-fixes what it can, blocks export on hard errors. Exports with UE5-optimised FBX settings and writes a JSON audit log.

Maya Shelf Button

Maya

One-click entry point — runs all three Maya modules in sequence with a progress window, writes the report next to the scene file, and opens it in the browser automatically.

Phase 4 — Unreal Engine

UE Asset Validator

unreal/asset_validator.py

Post-import validation inside Unreal Engine's Python API. Checks naming conventions, LOD chain completeness, material slot count, and texture sRGB / compression settings — all against the same laps_config.json used in Maya.

Material Instance Generator

unreal/mi_generator.py

JSON recipe-driven batch creation of MaterialInstanceConstant assets. Wires texture parameters, scalar overrides, and vector tints in one pass. Supports dry_run mode to validate the recipe before touching the project.

Niagara VFX Validator

unreal/vfx_validator.py

Validates Niagara systems against configurable platform budgets (PC / Mobile). Checks emitter count, estimated peak particle count, CPU vs GPU simulation mode, Ribbon/Mesh renderer cost, and warm-up time hitches.


Report Output

Every LAPS module feeds into a single HTML report. No DCC required to open it — producers, leads, and QA can read it in any browser.

laps_report.html — Naming Convention Validator · 1 module · 3 errors · 5 warnings · 25 passed

The report below was generated by running demo_phase1.py against a set of test asset names — clean ones and intentionally broken ones. Open it live in your browser:

📸 A screenshot of the report will replace this area once captured — for now, click above to see the real output.


Using LAPS

Any module can be run from a single entry point. The same call works from a terminal, a Maya shelf button, or a CI/CD pipeline:

from LAPS.core import load_config, LAPSReporter from LAPS.standalone import NamingValidator # Load studio rules from laps_config.json config = load_config() # Run the naming validator validator = NamingValidator(config) validator.validate(asset_names) # Write the unified HTML report LAPSReporter(studio_name=config.studio_name) \ .add(validator) \ .generate("laps_report.html")