Files
workinf_Blender_Wasm/tools/web/blender-check-nonmesh-glb-roundtrip.py
2026-08-12 04:47:48 -04:00

63 lines
1.9 KiB
Python

import json
import os
import sys
import bpy
EXPECTED_OBJECTS = {
"WebCurveObject",
"WebSurfaceObject",
"WebFontObject",
"WebMetaballObject",
"WebPointCloudObject",
"WebCurvesObject",
"WebHairObject",
}
def rounded(values):
return [round(float(value), 7) for value in values]
def main(glb_path, output_path):
bpy.ops.wm.read_factory_settings(use_empty=True)
result = bpy.ops.import_scene.gltf(filepath=os.path.abspath(glb_path))
if "FINISHED" not in result:
raise RuntimeError(f"Blender glTF importer failed: {result}")
report = {}
for name in sorted(EXPECTED_OBJECTS):
obj = bpy.data.objects.get(name)
if obj is None:
raise RuntimeError(f"{name} was not imported")
if obj.type != "MESH":
raise RuntimeError(f"{name} was not imported as a mesh")
mesh = obj.data
mesh.calc_loop_triangles()
report[name] = {
"vertexCount": len(mesh.vertices),
"edgeCount": len(mesh.edges),
"triangleCount": len(mesh.loop_triangles),
"boundsMin": rounded([
min((vertex.co[axis] for vertex in mesh.vertices), default=0.0)
for axis in range(3)
]),
"boundsMax": rounded([
max((vertex.co[axis] for vertex in mesh.vertices), default=0.0)
for axis in range(3)
]),
}
with open(output_path, "w", encoding="ascii") as output:
json.dump(report, output, indent=2, sort_keys=True)
output.write("\n")
print(f"blender-nonmesh-glb-import-ok objects={len(report)}")
if __name__ == "__main__":
arguments = sys.argv[sys.argv.index("--") + 1:]
if len(arguments) != 2:
raise SystemExit("usage: blender -b --python blender-check-nonmesh-glb-roundtrip.py -- input.glb output.json")
main(arguments[0], arguments[1])