ModelTranslator: dedupe sanitized material names, set alphaIsTransparency for alpha-test textures

This commit is contained in:
ud18010
2026-07-15 12:00:50 +08:00
parent 073ae48a61
commit 0b068dbaa0
4 changed files with 29 additions and 10 deletions
+15 -5
View File
@@ -132,7 +132,7 @@ def _channel(pixels, ch):
return pixels[..., ch if ch is not None else 0]
def _save_png(path, rgba, srgb_view=False):
def _save_png(path, rgba):
"""float32 (h,w,4) -> PNG。写原始值(Non-Color,避免色彩管理改写数据)。"""
import bpy
h, w = rgba.shape[:2]
@@ -146,7 +146,7 @@ def _save_png(path, rgba, srgb_view=False):
bpy.data.images.remove(img)
def _convert_material(mat, model_name, outdir, max_size):
def _convert_material(mat, model_name, outdir, max_size, used_snames):
warnings = []
maps, consts = _material_maps(mat, warnings)
tw, th = _target_size(maps, max_size)
@@ -192,7 +192,15 @@ def _convert_material(mat, model_name, outdir, max_size):
else:
mix[..., 3] = consts["roughness"]
sname = safe_name(mat.name)
# 中文等非 ASCII 材质名会同样退化(如都变 "mat"),加序号防止互相覆盖
sname = base_sname = safe_name(mat.name)
n = 1
while sname in used_snames:
n += 1
sname = "%s_%d" % (base_sname, n)
used_snames.add(sname)
if sname != base_sname:
warnings.append("材质名 %s 清洗后与其它材质重名,输出改用 %s" % (mat.name, sname))
base_png = os.path.abspath(os.path.join(outdir, "%s_%s_base.png" % (model_name, sname)))
mix_png = os.path.abspath(os.path.join(outdir, "%s_%s_mix.png" % (model_name, sname)))
_save_png(base_png, base)
@@ -242,7 +250,9 @@ def main():
if slot.material and slot.material not in used_mats:
used_mats.append(slot.material)
results = [_convert_material(m, model_name, outdir, max_size) for m in used_mats]
used_snames = set()
results = [_convert_material(m, model_name, outdir, max_size, used_snames)
for m in used_mats]
_strip_textures()
fbx_out = os.path.join(outdir, model_name + ".fbx")
@@ -253,5 +263,5 @@ def main():
ensure_ascii=False))
if __name__ == "__main__" and "--" in __import__("sys").argv:
if __name__ == "__main__" and "--" in sys.argv:
main()