63 lines
1.9 KiB
Python
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])
|