[ { "name": "GBXModelGeometryPart", "fields": [ { "type": "pad", "size": 1 }, { "type": "pad", "size": 1 }, { "type": "pad", "size": 1 }, { "name": "local node count", "type": "uint8", "maximum": 22, "read_only": true }, { "name": "local node indices", "type": "uint8", "count": 22, "hidden": true, "comment": "Local nodes are used to indirectly refer to a real node. So, if local nodes are used, a vertex says node #4, and local node #4 refers to node #5, then the vertex is node #5. There really doesn't seem to be any benefit to using local nodes, considering compressed vertices (which can only address 42 nodes) don't even use them. They just make the models unnecessarily more convoluted while taking up more space." }, { "type": "pad", "size": 2 } ], "type": "struct", "inherits": "ModelGeometryPart", "unsafe_to_dedupe": true, "read_only": true, "size": 132, "needs_preprocessed": true, "needs_reprocessed_on_extraction": true }, { "name": "GBXModelGeometry", "fields": [ { "name": "flags", "type": "IsUnusedFlag" }, { "type": "pad", "size": 32 }, { "name": "parts", "type": "Reflexive", "struct": "GBXModelGeometryPart", "maximum": { "default": 32, "extended": 32767 } } ], "type": "struct", "read_only": true, "size": 48 }, { "name": "GBXModel", "groups": [ { "name": "gbxmodel", "first": "flags", "description": "This type of tag is used for Gearbox maps (but not Xbox) and features local nodes. When the cache file is compiled, then the compressed vertices are discarded when copied into the map.\n\nFlags:\n- blend shared normals: On map compilation, vertices with the same positions have their normals linearly averaged.\n- parts have local nodes: Use local nodes. Geometries with local nodes are flagged as \"ZONER\" in this case.\n- ignore skinning: Unknown?\n\nNote that compressed vertices can only address up to 42 nodes and cannot use local nodes." } ], "fields": [ { "name": "flags", "read_only": false, "type": "ModelFlags" }, { "name": "node list checksum", "type": "int32" }, { "name": "super high detail cutoff", "unit": "pixels", "read_only": false, "type": "float" }, { "name": "high detail cutoff", "unit": "pixels", "read_only": false, "type": "float" }, { "name": "medium detail cutoff", "unit": "pixels", "read_only": false, "type": "float" }, { "name": "low detail cutoff", "unit": "pixels", "read_only": false, "type": "float" }, { "name": "super low detail cutoff", "unit": "pixels", "read_only": false, "type": "float" }, { "name": "super low detail node count", "unit": "nodes", "type": "uint16", "cache_only": true }, { "name": "low detail node count", "unit": "nodes", "type": "uint16", "cache_only": true }, { "name": "medium detail node count", "unit": "nodes", "type": "uint16", "cache_only": true }, { "name": "high detail node count", "unit": "nodes", "type": "uint16", "cache_only": true }, { "name": "super high detail node count", "unit": "nodes", "type": "uint16", "cache_only": true }, { "type": "pad", "size": 2 }, { "type": "pad", "size": 8 }, { "name": "base map u scale", "type": "float", "default": 1.0 }, { "name": "base map v scale", "type": "float", "default": 1.0 }, { "type": "pad", "size": 116 }, { "name": "markers", "type": "Reflexive", "struct": "ModelMarker", "hidden": true, "retcon_note": "This field was originally cache only and the maximum was 256, however we define it this way so we can detect erroneous tags generated by HEK+ and Refinery", "maximum": 0 }, { "name": "nodes", "type": "Reflexive", "struct": "ModelNode", "maximum": { "default": 64, "extended": 255 } }, { "name": "regions", "type": "Reflexive", "struct": "ModelRegion", "maximum": { "default": 32, "extended": 255 } }, { "name": "geometries", "type": "Reflexive", "struct": "GBXModelGeometry", "maximum": { "default": 256, "extended": 32767 } }, { "name": "shaders", "type": "Reflexive", "struct": "ModelShaderReference", "maximum": { "default": 32, "extended": 32767 } } ], "type": "struct", "read_only": true, "size": 232, "group": "gbxmodel", "needs_preprocessed": true, "needs_postprocessed": true, "needs_reprocessed_on_extraction": true } ]