Getting art in
Blender / AI model → in-game, correct scale & facing.
Two-stage flow: Blender headless emits Y-up OBJ, then pure Python writes vmats/vmdls and a C# model catalog.
bpy.ops.wm.obj_export can reorder face lines across runs on the same mesh — diff the manifest, not the raw OBJ bytes.
Census tris × instances first — silhouette fails before UVs; inject usemtl after scripted OBJ export.
ModelRenderer.CastShadows doesn't exist as a settable property — use renderer.SceneObject.Flags.CastShadows instead.
Forge delivery job errors out but the build stage's previewGlbUrl stays downloadable — recover the GLB through Blender into your standard delivery shape instead of re-spending.
A near-white chalky sky stays mid-grey or blue — fixing the sky texture alone isn't enough because the default tonemapping curve crushes highlights.
CC0 kits import like any OBJ+vmdl; city kits share colormap.png, nature kits need per-color vmats, and facing is a per-model yaw guess.
RenderMeshFile alone compiles clean with zero physics — ModelCollider needs PhysicsMeshFile/PhysicsHullFile in the vmdl.
Blender +X becomes world −Y after OBJ import; yaw +90° faces +X — and Blender +Y rotation tips the +X edge down.
CapsuleCollider and ModelCollider ignore WorldScale; BoxCollider follows it — bake scale into import_scale instead.
1 m = 39.37 engine units — design in SI, convert once at the engine boundary, and audit every consumer.
Scenes never load raw OBJ/GLB — always wrap with a .vmdl and remap materials under both bare and .vmat names.
Shader field support is unknown and no .shader source exists — check the install's templates/ folder for authoritative syntax instead of grepping sibling projects.
AI mesh generators (Tripo, Meshy, Rodin) deliver textured OBJ+vmdl — but modeldoc32 headers, ~1m normalize, corrupt textures, bare texture paths, and missing colliders will ERROR the asset until patched.
Source engine convention: Forward = +X, Left = +Y, Right = -Y. Using Vector3.Right for '+X' silently slides geometry the wrong way.