glTF 2.0 structural validator
In your harnessAsset contractMIT
Check that a .gltf or .glb file is internally consistent before an engine loads it: buffers, views, accessors, indices, materials, textures, the node graph, skins and animation samplers. Run it after every export and before every import.
ATTRIBUTION.mdLICENSEREADME.mdasset_report.pycomponent.jsonfixtures/bad_accessor_out_of_bounds.gltffixtures/bad_attribute_counts.gltffixtures/bad_buffer_length.gltffixtures/bad_cubic_output_count.gltffixtures/bad_index_out_of_range.gltffixtures/bad_inverse_bind_count.gltffixtures/bad_key_times.gltffixtures/bad_node_cycle.gltffixtures/bad_position_bounds.gltffixtures/bad_rotation_not_unit.gltffixtures/bad_skin_attributes_missing.gltffixtures/bad_texture_reference.gltffixtures/good_door.gltffixtures/good_skinned_strip.gltfgltf_structural_validator.pygltfio.pypngio.pyschema_lite.pytest_gltf_structural_validator.pytest_package.pyverification/native.json
Full files in your harness.
What it takes and gives
- Entry points
- validate_file, validate, run, main
- Proves
- Every index the file uses points at an existing entry; every accessor lies inside its buffer view and buffer, is aligned, and its declared min and max equal the data; primitives have consistent attribute counts and in-range indices; the node graph is a forest with one parent per node; skins and animation samplers have the counts and types the glTF 2.0 data model requires.
- Does not prove
- That the asset looks right, has sensible dimensions, names or materials, that its extensions are supported by a given engine, that textures decode, or that animation motion is plausible. It is not the Khronos glTF-Validator and does not implement every rule of the specification.
- Catches
- file_unreadable, json_invalid, asset_header_invalid, asset_version_unsupported, property_type_invalid, extension_required_not_used, buffer_invalid, buffer_unresolved and 61 more
Limits. Pure Python: an asset with one million vertices and one million indices took about 8 seconds on the build host under load (October 9, 2026). Extension contents (KHR_*, EXT_*) are not validated, only extensionsRequired against extensionsUsed. Images are checked for existence and PNG or JPEG magic bytes, not decoded. Sparse accessors, matrix column padding and GLB containers are supported. Animation pointer targets are accepted without further checks. Rules of the specification outside the listed failure codes are not checked.
Details
- Kind
- Asset contract
- Engine
- Python 3.10 or later
- Files
- 26 files, 300.0 KB
- Licence
- MIT
- Declared effects
- reads files, runs commands
- Checks
- checker matches contract, godot agrees on known good, blender agrees on known good, known wrong refused with engine reactions
- Techniques
- glTF 2.0 specification: buffers, buffer views and accessors (alignment, byte stride, sparse storage, min and max), glTF 2.0 specification: meshes, primitives, attribute semantics and morph targets, glTF 2.0 specification: nodes, scenes, skins and animations (samplers, interpolation, output counts), Iterative depth-first search with open and done marks for cycle detection
- Tags
- gltf, validator, 3d asset, accessor, skin, animation, scene graph, export check
- Identity
library.supply.creative_originals.ddd810c65b3eb99b2cb16900.3e4c2290897a4b07- Version
3e4c2290897a4b070714ae56fd52e93f492f00bddfbc4e87012b3128ea1ea759
The version is the SHA-256 of the item your harness downloads; every file in it names its own checksum.
Something wrong with this item, its rights or its safety? Report it on the support page, or from your harness after a download.