PMob format reference¶
Status: implemented for the record families and traits documented below. Unrecognized records remain unsupported rather than being interpreted by name or file extension alone.
Binary structure¶
PMob is a little-endian recursive record tree. The file itself is the root PMob record; there is no separate magic signature.
Each record begins with:
Offset |
Width |
Meaning |
|---|---|---|
|
4 |
Signed payload byte count |
|
4 |
Signed child count |
|
|
Child entries: signed type ID and absolute file offset |
after table |
payload count |
Record payload |
Child records can appear elsewhere in the file and are addressed by absolute offset. Integers and IEEE-754 single-precision floats are little-endian. Names and texture strings are UTF-16LE. A transform matrix contains 16 floats.
Implemented record families include document identity, primitive hierarchy,
animation transforms, layers, meshes, vertices, triangle indices, normals, UV
coordinates, line indices, smoothing groups, material assignments, and observed
material properties in type IDs 0x1a through 0x38.
Transform convention¶
The serialized convention is:
16 row-major floats;
row-vector points (
point * matrix);translation in
M41,M42, andM43;local-to-world composition as
local * parent; andZ as the up axis in supported assets.
Transposing each matrix produces Blender’s column-vector local matrix and normal
parent @ local composition. Translation and mesh coordinates are converted
from millimetres to metres at the Blender boundary. Linear matrix terms are not
unit-scaled, so authored object scale is preserved.
Layer primitives reference geometry by layer name. The Blender adapter creates a mesh datablock once and instances it for each primitive reference.
Geometry and smoothing¶
Mesh indices describe consecutive triangles. Texture coordinates are one UV per serialized vertex when present.
The smoothing-group payload is a sequence of little-endian lists. Each list is a signed 32-bit vertex count followed by that many signed 32-bit indices. Negative counts, truncation, and out-of-range indices are invalid. These are vertex-membership groups, not conventional per-face smoothing-group numbers.
Producers can duplicate a position when adjacent face corners need different UVs, then place those indices in one smoothing group. Blender stores UVs and custom normals on face corners, so the importer can compact compatible smooth duplicates while retaining UV seams.
The reconstruction priority is:
Complete serialized normals.
Explicit smoothing groups, including omissions that preserve hard edges.
Authored vertex connectivity when neither source is available.
Position and face angle alone are not enough to distinguish a UV seam from a disconnected hard boundary. The importer therefore does not weld authored splits merely because their positions are equal. Resulting normals are written to face corners and compatible polygons use smooth shading.
PMob faces remain triangles. Optional Blender-side triangle-to-quad conversion joins only compatible, nearly coplanar pairs while checking UVs, materials, sharp/seam state, vertex colors, and shape quality. This is an editing convenience, not a PMob semantic, and is disabled by default.
Texture mapping¶
Some meshes omit serialized UV coordinates. Others contain UVs for an authored size but are later resized by package metadata.
For cubic mapping, material metadata supplies physical texture width and height in millimetres. Mooblender projects after primitive transforms and size correction, stores physical coordinates in metres on Blender’s corner domain, and derives UV scale from the material dimensions. Reusing a material therefore retains consistent texel density across differently sized parts.
Serialized UVs remain authoritative for non-cubic mappings. Fixed and planar
MAPPING_SCALE values are normalized UV scales, not millimetre dimensions.
Observed numeric mapping types are 0 fixed, 1 cubic, and 2 planar.
Spherical variants are not established.
Materials¶
Material color payloads are four bytes in RGBA order. Supported packages can embed diffuse, metallic, and transparency images named by or derived from PMob material records.
The diffuse image Alpha is multiplied by serialized material opacity.
A separate transparency image is multiplied as an additional mask.
The observed specular-texture channel maps to Principled Metallic.
Normalized specular strength maps to Principled Specular IOR Level.
Refraction factors above
1.0are treated as optical IOR in supported material records.
Blender transmission depends on renderer settings. To keep refractive shells usable in default viewport and render configurations, Mooblender preserves IOR and uses bounded alpha blending as a fallback. It avoids accumulating opacity across overlapping transparent surfaces and retains supported ambient tint.
Exactly equal generated materials are reused. A material edited by the user is not silently replaced by a later import.
Safety validation¶
The reader validates record bounds, child counts, offsets, string lengths, matrix widths, index ranges, and recursive traversal before consuming payloads. Malformed data raises a format error rather than producing partial geometry.
Unknown or incomplete¶
semantics for every mesh source type;
line-index rendering rules;
texture resolution outside PContent;
animation time units and interpolation;
spherical mapping variants; and
compatibility across all PMob producer versions.