Skip to Content
ScriptingOriginal Asset Authoring Lab

Build an original FiveM asset from mesh to resource

This walkthrough uses a real, owned Gen8 fixture—not imaginary filenames or extracted GTA assets. It creates a small beveled bollard, an original checker texture, simplified LODs, embedded collision, an archetype and a map placement. The exported binaries were reopened and inspected with CodeWalker.Core. That proves serialization/parser compatibility for the fixture, not loading or collision behavior inside FiveM.

Download the development resource, download its authoring source and blend file, or inspect the binary validation results. The related collision and LOD guide uses deliberate faulty exports to show what changes.

Exact toolchain and scope

Tool or inputVerified version / revision
Blender4.5.14 LTS, Linux x64, checksum-verified official archive
Sollumz2.9.0, revision 389bd9bd1f7bfe9e73bc291eb473175848d2b567
szio1.3.0.dev9, dependency hash pinned in the workflow
CodeWalker.Core485d56bec00262ed7fa472261cce7bbc6202b96e
.NET compilerSDK 10.0.401 in the recorded validation run
Asset targetGen8 / Legacy; not an Enhanced-converted package

The generation pipeline uses open-source XML export and CodeWalker serialization. It does not install or silently accept the terms for Materia/Alchemist. Modern Sollumz versions have different export capabilities from older tutorials; the source download and toolchain record identify the exact path tested here.

1. Inspect the original geometry and texture

Open source/fd_lab_bollard.blend from the authoring download in the pinned Blender/Sollumz environment. The prop is 0.6 × 0.6 × 1.2 metres, with its origin at ground contact. The high mesh has 108 triangles; the simplified mesh has 12. The generator assigns the simpler mesh to medium, low and very-low LOD slots so those levels actually contain geometry.

make_fixture.py is the reproducible source of these choices. Its cube_object helper creates the original vertices, adds a small bevel to the high mesh, creates UV/color attributes and attaches a default.sps material. The DiffuseSampler references fd_lab_checker, the generated 16×16 DDS texture with five mip levels. This tiny texture is a controlled teaching input, not a production-resolution recommendation.

Generated original prop, with aligned diagnostic collision outline

Actual Blender render of the generated geometry. The outline is an authoring diagnostic, not a FiveM screenshot.

Change one dimension or bevel parameter and regenerate to see which bounds and meshes must change together. Do not enlarge a mesh without recalculating its collision and archetype bounds. For your own production texture, choose dimensions/compression/mips appropriate to the material rather than copying this fixture’s size.

2. Understand the five exported formats

Generated fileRole in this fixtureVerification performed
fd_lab_bollard.ydrDrawable, shader reference, LOD meshes and embedded collisionReloaded; high/low meshes populated and collision present.
fd_lab_bollard.ytdExternal original texture dictionaryReloaded; one texture present.
fd_lab_collision.ybnSeparate export of the same collision, for inspectionReloaded; bounds present. Kept outside active streaming to avoid duplicate collision.
fd_lab.ytypArchetype linking name, drawable, texture dictionary and boundsReloaded; one archetype present.
fd_lab_map.ymapA test placement at (0, 0, 75)Reloaded; one entity present. This is not a guaranteed safe player-spawn position.

The first three are exported from generated Blender/Sollumz data. The original YTYP/YMAP XML is constructed explicitly by the fixture generator, then all five formats are serialized into binary resources. An .xml export is an intermediate file, not the binary file you place in the resource’s stream/ folder.

The converter rejects empty/missing structures and checks the binary resource header; it does not rely only on a loader’s Loaded flag. It records hashes for the five good files and two faulty YDR variants. The validation JSON keeps that distinction explicit.

3. Reproduce the exporter and binary round trip

The source package includes make_fixture.py, package_fixture.py, Converter/, the resource scripts, original .blend/DDS and evidence. Install the exact Sollumz/szio versions into the Blender environment and obtain the pinned CodeWalker source. Keep third-party tool checkouts outside the resource you distribute.

From the authoring package directory, with the paths adapted to your installed tools:

"$BLENDER" --background --factory-startup --python-exit-code 1 \ --python make_fixture.py -- "$ADDON_PARENT" "$PWD/out" dotnet run --project Converter/Converter.csproj -c Release \ --property:CodeWalkerRoot="$CODEWALKER_ROOT" -- "$PWD/out" python3 package_fixture.py "$PWD/out"

BLENDER points to the 4.5.14 executable; ADDON_PARENT contains the sollumz add-on directory; CODEWALKER_ROOT is the pinned checkout containing CodeWalker.Core. The included workflow documents the exact installation and checksum commands. Do not ignore a nonzero exit or silently swap a newer API into a pinned source example.

Expected results: five good binaries, two faulty drawable variants, authoring-observations.json, binary-validation.json, authoring renders and fd-asset-lab.zip. A successful round trip says the files can be parsed—not that GTA streaming, physics and rendering are correct in a live game.

4. Install the development resource

Extract the resource download as resources/[local]/fd_asset_lab. Its manifest registers the actual YTYP:

fx_version 'cerulean' game 'gta5' this_is_a_map 'yes' files { 'stream/fd_lab.ytyp' } data_file 'DLC_ITYP_REQUEST' 'stream/fd_lab.ytyp' client_script 'client.lua'

Run ensure fd_asset_lab in the development server console. On a compatible Legacy client, /fd_spawn_bollard attempts a bounded model load and creates a local, frozen prop near the player; running it again removes that prop. The YMAP fixture is a separate fixed placement. Test those paths separately rather than assuming a local command proves the map placement loaded.

The command reports invalid models/timeouts and cleans up its owned entity on resource stop. No network ownership, money, inventory or player teleport is implemented. The reference YBN and faulty drawables are not streamed by default.

5. Complete the in-game acceptance separately

Record server artifact, client track, game build, fixture hashes and client/server errors. Check model load, external texture, map placement, ground contact, collision from each side, all LOD transitions, resource restart and cleanup. Use the fault diagnosis guide to compare controlled failures and restore the known-good YDR afterwards.

The automated run completed generation, actual binary conversion, reloading and authoring rendering. FiveM engine loading, collision and LOD transitions remain unexecuted acceptance checks. Do not turn the download into a production-ready or Enhanced-compatible claim without those observations.

Sources: official asset-authoring series , Sollumz 2.9.0 source , pinned CodeWalker source . Related: streaming basics, data files, Alchemist conversion.