diff --git a/Tools/ModelTranslator/model_decimate.py b/Tools/ModelTranslator/model_decimate.py index 4b5109b8..80b91d7b 100644 --- a/Tools/ModelTranslator/model_decimate.py +++ b/Tools/ModelTranslator/model_decimate.py @@ -5,6 +5,7 @@ import argparse import os from mt_run import find_blender, run_blender_script +from qr_bridge import QR_INPUT_CAP def main(): @@ -16,6 +17,8 @@ def main(): help="UV 展开:seam=锐边接缝整岛展开(默认),smart=Smart UV Project") ap.add_argument("--reducer", choices=("collapse", "quad"), default="quad", help="减面后端:quad=Quad Remesher 四边重拓扑(默认,失败自动回退 collapse),collapse=Decimate 塌陷") + ap.add_argument("--qr-input-cap", type=int, default=QR_INPUT_CAP, + help="quad 后端 QR 前预 collapse 的中等密度目标面数(默认 50000);高密度模型直接 QR 会破洞") ap.add_argument("--max-overlap", type=float, default=None, help="UV 重叠容忍上限(0-1,默认内置 0.08);调高可让更高 seam 角度过门、减少碎岛") ap.add_argument("--blender", default=None) @@ -24,6 +27,8 @@ def main(): ap.error("--tris 必须为正整数") if args.max_overlap is not None and not (0.0 < args.max_overlap <= 1.0): ap.error("--max-overlap 必须在 (0, 1] 内") + if args.qr_input_cap <= 0: + ap.error("--qr-input-cap 必须为正整数") blender = find_blender(args.blender) name = os.path.splitext(os.path.basename(args.input))[0] @@ -33,7 +38,7 @@ def main(): s = run_blender_script(blender, "bl_decimate.py", [args.input, out_fbx, str(args.tris), args.unwrap, "" if args.max_overlap is None else str(args.max_overlap), - args.reducer]) + args.reducer, str(args.qr_input_cap)]) print("== %s: %d -> %d 面(目标 %d)-> %s" % (s["src"], s["tris_before"], s["tris_after"], s["target"], out_fbx)) diff --git a/Tools/ModelTranslator/tests/test_model_decimate_cli.py b/Tools/ModelTranslator/tests/test_model_decimate_cli.py index def9fb48..17d8d653 100644 --- a/Tools/ModelTranslator/tests/test_model_decimate_cli.py +++ b/Tools/ModelTranslator/tests/test_model_decimate_cli.py @@ -32,7 +32,9 @@ class TestModelDecimateCli(unittest.TestCase): model_decimate.main() args = run.call_args.args[2] - self.assertEqual(args[-1], "quad") + # argv 顺序:input, out, tris, unwrap, overlap, reducer, qr_input_cap + self.assertEqual(args[5], "quad") # reducer 默认 quad + self.assertEqual(args[6], "50000") # qr_input_cap 默认 50000 if __name__ == "__main__":