mirror of
https://github.com/lighttransport/tinyusdz.git
synced 2026-01-18 01:11:17 +01:00
Created a comprehensive environment for comparing TinyUSDZ with OpenUSD: - Setup scripts for building OpenUSD with Python bindings using clang-20 - Python comparison script (compare_usd_example.py) for testing both libraries - C++ build examples using both Makefile and CMake - Example C++ code that loads USD files with both libraries - Comprehensive documentation for setup and usage The environment allows side-by-side comparison of USD file parsing, metadata extraction, and scene traversal between TinyUSDZ and OpenUSD. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
165 lines
5.4 KiB
Python
Executable File
165 lines
5.4 KiB
Python
Executable File
#!/usr/bin/env python
|
|
"""
|
|
Compare USD file parsing between OpenUSD and TinyUSDZ
|
|
"""
|
|
|
|
import sys
|
|
import os
|
|
import json
|
|
import subprocess
|
|
|
|
def analyze_with_openusd(filepath):
|
|
"""Analyze USD file with OpenUSD Python API"""
|
|
try:
|
|
from pxr import Usd, UsdGeom, Sdf
|
|
|
|
stage = Usd.Stage.Open(filepath)
|
|
if not stage:
|
|
return None
|
|
|
|
result = {
|
|
"library": "OpenUSD",
|
|
"file": filepath,
|
|
"root_layer": stage.GetRootLayer().identifier,
|
|
"prim_count": len(list(stage.Traverse())),
|
|
"up_axis": str(UsdGeom.GetStageUpAxis(stage)),
|
|
"meters_per_unit": UsdGeom.GetStageMetersPerUnit(stage),
|
|
"prims": []
|
|
}
|
|
|
|
for prim in stage.Traverse():
|
|
prim_info = {
|
|
"path": str(prim.GetPath()),
|
|
"type": str(prim.GetTypeName()),
|
|
"attributes": []
|
|
}
|
|
|
|
# Get attributes
|
|
for attr in prim.GetAttributes():
|
|
attr_info = {
|
|
"name": attr.GetName(),
|
|
"type": str(attr.GetTypeName()),
|
|
"has_value": attr.HasValue()
|
|
}
|
|
prim_info["attributes"].append(attr_info)
|
|
|
|
result["prims"].append(prim_info)
|
|
|
|
return result
|
|
|
|
except ImportError as e:
|
|
print(f"Error: OpenUSD Python bindings not available: {e}")
|
|
return None
|
|
except Exception as e:
|
|
print(f"Error analyzing with OpenUSD: {e}")
|
|
return None
|
|
|
|
def analyze_with_tinyusdz(filepath):
|
|
"""Analyze USD file with TinyUSDZ tusdcat tool"""
|
|
try:
|
|
# Use tusdcat to dump the file
|
|
tusdcat_path = os.path.join(os.path.dirname(os.path.dirname(filepath)), "build", "tusdcat")
|
|
if not os.path.exists(tusdcat_path):
|
|
tusdcat_path = "../build/tusdcat" # Try relative path
|
|
|
|
# Suppress debug output by redirecting stderr
|
|
result = subprocess.run(
|
|
[tusdcat_path, filepath],
|
|
capture_output=True,
|
|
text=True
|
|
)
|
|
|
|
if result.returncode != 0:
|
|
print(f"Error running tusdcat: {result.stderr}")
|
|
return None
|
|
|
|
# Parse the output
|
|
lines = result.stdout.strip().split('\n')
|
|
|
|
# Extract metadata from the header
|
|
tinyusdz_result = {
|
|
"library": "TinyUSDZ",
|
|
"file": filepath,
|
|
"output": result.stdout[:1000], # First 1000 chars
|
|
"exit_code": result.returncode
|
|
}
|
|
|
|
# Try to parse some basic info from output
|
|
for line in lines:
|
|
if "metersPerUnit" in line:
|
|
try:
|
|
tinyusdz_result["meters_per_unit"] = float(line.split('=')[1].strip())
|
|
except:
|
|
pass
|
|
elif "upAxis" in line:
|
|
try:
|
|
tinyusdz_result["up_axis"] = line.split('=')[1].strip().strip('"')
|
|
except:
|
|
pass
|
|
|
|
return tinyusdz_result
|
|
|
|
except Exception as e:
|
|
print(f"Error analyzing with TinyUSDZ: {e}")
|
|
return None
|
|
|
|
def main():
|
|
if len(sys.argv) < 2:
|
|
print("Usage: python compare_usd_example.py <usd_file>")
|
|
sys.exit(1)
|
|
|
|
filepath = sys.argv[1]
|
|
|
|
if not os.path.exists(filepath):
|
|
print(f"File not found: {filepath}")
|
|
sys.exit(1)
|
|
|
|
print("=" * 60)
|
|
print(f"Comparing USD file: {filepath}")
|
|
print("=" * 60)
|
|
|
|
# Analyze with OpenUSD
|
|
print("\n### OpenUSD Analysis ###")
|
|
openusd_result = analyze_with_openusd(filepath)
|
|
if openusd_result:
|
|
print(f"Prim count: {openusd_result['prim_count']}")
|
|
print(f"Up axis: {openusd_result['up_axis']}")
|
|
print(f"Meters per unit: {openusd_result['meters_per_unit']}")
|
|
print(f"\nFirst 3 prims:")
|
|
for prim in openusd_result['prims'][:3]:
|
|
print(f" {prim['path']}: {prim['type']} ({len(prim['attributes'])} attributes)")
|
|
|
|
# Analyze with TinyUSDZ
|
|
print("\n### TinyUSDZ Analysis ###")
|
|
tinyusdz_result = analyze_with_tinyusdz(filepath)
|
|
if tinyusdz_result:
|
|
print(f"Exit code: {tinyusdz_result['exit_code']}")
|
|
if 'up_axis' in tinyusdz_result:
|
|
print(f"Up axis: {tinyusdz_result['up_axis']}")
|
|
if 'meters_per_unit' in tinyusdz_result:
|
|
print(f"Meters per unit: {tinyusdz_result['meters_per_unit']}")
|
|
print(f"\nOutput preview:")
|
|
print(tinyusdz_result['output'][:500])
|
|
|
|
# Compare results
|
|
print("\n### Comparison ###")
|
|
if openusd_result and tinyusdz_result:
|
|
print("Both libraries successfully parsed the file")
|
|
|
|
# Compare metadata if available
|
|
if 'up_axis' in tinyusdz_result:
|
|
if openusd_result['up_axis'] == tinyusdz_result['up_axis']:
|
|
print(f"✓ Up axis matches: {openusd_result['up_axis']}")
|
|
else:
|
|
print(f"✗ Up axis differs - OpenUSD: {openusd_result['up_axis']}, TinyUSDZ: {tinyusdz_result['up_axis']}")
|
|
|
|
if 'meters_per_unit' in tinyusdz_result:
|
|
if abs(openusd_result['meters_per_unit'] - tinyusdz_result['meters_per_unit']) < 0.001:
|
|
print(f"✓ Meters per unit matches: {openusd_result['meters_per_unit']}")
|
|
else:
|
|
print(f"✗ Meters per unit differs - OpenUSD: {openusd_result['meters_per_unit']}, TinyUSDZ: {tinyusdz_result['meters_per_unit']}")
|
|
|
|
print("=" * 60)
|
|
|
|
if __name__ == "__main__":
|
|
main() |