ModelTranslator: dedupe sanitized material names, set alphaIsTransparency for alpha-test textures
This commit is contained in:
@@ -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()
|
||||
|
||||
Reference in New Issue
Block a user