Squirrel Transfer Format - Experimental Modular 3D Interchange Format [version 0.0.0]
Intended for (not only) game development use-cases.
In development for for: |
This repository hosts the documentation for the core format and core modules.
Similar to the concept of GLTF 2.0, this format consists of a Json definition and binary buffers. However, this format is firmly intended for interchange & integrity, not runtime loading optimization.
Game-engines are responsible for runtime optimization, not the 3d file format or 3d modeling tool!
STF doesn’t hard-code any specific resource types like GLTF. It consists of a structure of resources which get identified by a 'type' property. Support for any arbitrary type gets implemented by modules, which are pluggable and hot-loadable.
-
Highly modular and extensible
-
Doesn’t impose any descisions on artists and game-developers
-
Prioritizes developer-experience & user-experience over performance
-
Maximizes development speed for STF implementations and additional third party modules
Previously, a proof-of-concept for such a format has been made here: Repository Link
Partial example Json definition
{
"stf": {
"version_major": 0,
"version_minor": 0,
"root": "8a4019a2-ca1d-4f9b-a316-b118cd31dada",
"profiles": [],
"asset_info": {
"asset_name": "Default Cube"
},
"generator": "stfblender",
"timestamp": "2025-02-15T20:41:01.988159+00:00",
"metric_multiplier": 1
},
"resources": {
"ba0f6e23-cb13-4cd5-9f66-8184460befc4": {
"type": "stf.material",
"name": "Material",
"properties": {
"color": {
"value_type": "color",
"value": [
1.0,
1.0,
1.0
]
}
},
"style_hints": [],
"shader_targets": {}
},
"a72729cd-be7d-4b2c-a02e-cf8bfdc97e20": {
"type": "stf.mesh",
"name": "Cube",
"material_slots": [
"ba0f6e23-cb13-4cd5-9f66-8184460befc4"
],
"vertex_count": 8,
"vertex_width": 4,
"vertex_indices_width": 4,
"vertices": "d8e72e40-9006-441b-a0c5-1315700f14ef",
"vertex_color_width": 4,
"colors": [],
"split_count": 24,
"split_indices_width": 4,
"split_normal_width": 4,
"split_tangent_width": 4,
"split_color_width": 4,
"split_uv_width": 4,
"splits": "f36cb7a4-ffd9-48e7-87b3-321c91da6c5a",
"split_normals": "2eb9be5e-b2ad-4df0-9163-942a506ddff8",
"split_tangents": "d12eb259-c0f3-4b0a-bed1-6904e62f8a1b",
"uvs": [
{
"name": "UVMap",
"uv": "4d9ee4ba-a45c-4bba-8a96-1bd79d86eee6"
}
],
"split_colors": [],
"tris_count": 12,
"face_count": 6,
"face_indices_width": 4,
"tris": "a66be574-6ed2-4607-9190-a1ed4e2331c3",
"material_indices_width": 4,
"faces": "cd1688fc-d100-4916-a0c2-dfa5899f010e",
"material_indices": "0a0e9df2-e63e-47b5-acab-1435d5b3579f",
"sharp_face_indices_len": 6,
"sharp_face_indices": "950f09cc-f6e1-4173-bf9a-2054ae233717",
"lines_len": 0,
"lines": "85cc4f16-0934-45f0-9249-304a991ee78a",
"sharp_edges_len": 0,
"sharp_edges": "d86f7202-ad21-4e94-8659-9f17c2be827b",
"armature": "a72729cd-be7d-4b2c-a02e-cf8bfdc97e20",
"bones": [],
"bone_weight_width": 4,
"weights": [],
"components": [
"a72729cd-be7d-4b2c-a02e-cf8bfdc97e20"
]
},
"a72729cd-be7d-4b2c-a02e-cf8bfdc97e20": {
"type": "stf.mesh.seams",
"seams_len": 0,
"seams": "3f877195-7da8-41fc-be16-63833584fc97"
},
"4a76690a-8f1c-4a3c-9135-4bcac5c92831": {
"type": "stf.instance.mesh",
"name": "Cube",
"children": [],
"trs": [
[
0.0,
0.0,
-0.0
],
[
0.0,
0.0,
-0.0,
1.0
],
[
1.0,
1.0,
1.0
]
],
"instance": "0131108d-ea45-4ed7-a427-6c6f1a1a3f7e"
},
"0131108d-ea45-4ed7-a427-6c6f1a1a3f7e": {
"mesh": "a72729cd-be7d-4b2c-a02e-cf8bfdc97e20",
"material_slots": [
{
"name": "Material",
"material": "ba0f6e23-cb13-4cd5-9f66-8184460befc4"
}
],
"blendshape_values": []
},
"8a4019a2-ca1d-4f9b-a316-b118cd31dada": {
"type": "stf.prefab",
"name": "Scene Collection",
"root_nodes": [
"4a76690a-8f1c-4a3c-9135-4bcac5c92831"
],
"animations": []
}
},
"buffers": {
"d8e72e40-9006-441b-a0c5-1315700f14ef": {
"type": "stf.buffer.included",
"index": 0
},
...
}
}
⭐ Star this repo if you would like to not loose half your work between export and import! ⭐
This repository is licensed under CC-BY-4.0 (https://creativecommons.org/licenses/by/4.0/)