2025-09-12 04:08:56 +00:00
|
|
|
# dif2gltf.py
|
|
|
|
|
import bpy, sys, os, addon_utils
|
|
|
|
|
|
|
|
|
|
def die(msg, code=2):
|
|
|
|
|
print(f"[dif2gltf] ERROR: {msg}", file=sys.stderr); sys.exit(code)
|
|
|
|
|
|
|
|
|
|
# ---- args ----
|
|
|
|
|
argv = sys.argv
|
2025-09-12 14:40:22 +00:00
|
|
|
if "--" not in argv: die("Usage: blender -b -P dif2gltf.py -- <in.dif> <out.glb|.gltf> [--addon io_dif] [--op import_scene.dif|wm.dif_import] [--format GLB|GLTF_SEPARATE]")
|
2025-09-12 04:08:56 +00:00
|
|
|
argv = argv[argv.index("--")+1:]
|
|
|
|
|
if len(argv) < 2: die("Need <in.dif> and <out.glb|.gltf>")
|
|
|
|
|
in_path, out_path = map(os.path.abspath, argv[:2])
|
|
|
|
|
|
|
|
|
|
addon_mod = "io_dif"
|
|
|
|
|
forced_op = None
|
2025-09-12 14:40:22 +00:00
|
|
|
export_format = "GLTF_SEPARATE"
|
2025-09-12 04:08:56 +00:00
|
|
|
i = 2
|
|
|
|
|
while i < len(argv):
|
|
|
|
|
if argv[i] == "--addon" and i+1 < len(argv): addon_mod = argv[i+1]; i += 2
|
|
|
|
|
elif argv[i] == "--op" and i+1 < len(argv): forced_op = argv[i+1]; i += 2
|
|
|
|
|
elif argv[i] == "--format" and i+1 < len(argv): export_format = argv[i+1]; i += 2
|
|
|
|
|
else: die(f"Unknown arg: {argv[i]}")
|
|
|
|
|
if not os.path.isfile(in_path): die(f"Input not found: {in_path}")
|
|
|
|
|
|
|
|
|
|
# ---- reset FIRST (so we don't lose the add-on afterward) ----
|
|
|
|
|
bpy.ops.wm.read_factory_settings(use_empty=True)
|
|
|
|
|
|
|
|
|
|
# ---- enable add-on ----
|
|
|
|
|
addon_utils.enable(addon_mod, default_set=True, handle_error=None)
|
|
|
|
|
loaded, enabled = addon_utils.check(addon_mod)
|
|
|
|
|
if not enabled:
|
|
|
|
|
mods = [m.__name__ for m in addon_utils.modules()]
|
|
|
|
|
die(f"Could not enable '{addon_mod}'. Installed add-ons: {mods}")
|
|
|
|
|
|
|
|
|
|
try:
|
2025-11-13 03:22:29 +00:00
|
|
|
op_id, op_call = "import_scene.dif", bpy.ops.import_scene.dif
|
2025-09-12 04:08:56 +00:00
|
|
|
except Exception as e:
|
|
|
|
|
die(str(e))
|
|
|
|
|
|
|
|
|
|
print(f"[dif2gltf] Using importer: {op_id}")
|
|
|
|
|
|
|
|
|
|
# ---- import ----
|
|
|
|
|
res = op_call(filepath=in_path)
|
|
|
|
|
if "FINISHED" not in res: die(f"Import failed via {op_id}: {in_path}")
|
|
|
|
|
|
|
|
|
|
# ---- export ----
|
|
|
|
|
res = bpy.ops.export_scene.gltf(
|
|
|
|
|
filepath=out_path,
|
2025-11-13 03:22:29 +00:00
|
|
|
export_format=export_format, # GLB | GLTF_SEPARATE
|
2025-09-12 04:08:56 +00:00
|
|
|
use_selection=False,
|
|
|
|
|
export_apply=True,
|
|
|
|
|
)
|
|
|
|
|
if "FINISHED" not in res: die(f"Export failed: {out_path}")
|
|
|
|
|
print(f"[dif2gltf] OK: {in_path} -> {out_path}")
|