1.8.4 Hotfix
This commit is contained in:
Binary file not shown.
@@ -15,7 +15,7 @@ def get_uv_layers(self, context):
|
|||||||
return items
|
return items
|
||||||
|
|
||||||
class UVEnumProperties(bpy.types.PropertyGroup):
|
class UVEnumProperties(bpy.types.PropertyGroup):
|
||||||
uv_enum: bpy.props.EnumProperty(name="UV Map", description="Select UV-Layer", items=get_uv_layers, default=0)
|
uv_enum: bpy.props.EnumProperty(name="MASK UV Map", description="Select Mask UV-Layer", items=get_uv_layers, default=0)
|
||||||
|
|
||||||
class MESH_OT_merge_materials_to_mask(bpy.types.Operator):
|
class MESH_OT_merge_materials_to_mask(bpy.types.Operator):
|
||||||
"""Merges 4 Materials into one Material (Mask)"""
|
"""Merges 4 Materials into one Material (Mask)"""
|
||||||
@@ -26,11 +26,15 @@ class MESH_OT_merge_materials_to_mask(bpy.types.Operator):
|
|||||||
|
|
||||||
def execute(self, context):
|
def execute(self, context):
|
||||||
scene = context.scene
|
scene = context.scene
|
||||||
|
ts = scene.tool_settings
|
||||||
arr_obj = context.selected_objects
|
arr_obj = context.selected_objects
|
||||||
activeObj = context.active_object
|
activeObj = context.active_object
|
||||||
|
|
||||||
|
# Get all inputs from user
|
||||||
|
selected_uv = context.scene.settings_uv_enum_props.uv_enum
|
||||||
ignore_custom = context.scene.settings_multi_ignor
|
ignore_custom = context.scene.settings_multi_ignor
|
||||||
island_margin_custom = context.scene.uv_island_margin_slider
|
mat_nameing = context.scene.settings_mat_nameing
|
||||||
|
island_margin_custom = context.scene.settings_uv_island_margin_slider
|
||||||
|
|
||||||
# Scale and offset for UV allignment
|
# Scale and offset for UV allignment
|
||||||
SCALE = 0.5
|
SCALE = 0.5
|
||||||
@@ -42,8 +46,7 @@ class MESH_OT_merge_materials_to_mask(bpy.types.Operator):
|
|||||||
]
|
]
|
||||||
IGNORE = ["glass", "glas", "grass", "gras", "atlas"]
|
IGNORE = ["glass", "glas", "grass", "gras", "atlas"]
|
||||||
if ignore_custom.strip():
|
if ignore_custom.strip():
|
||||||
CUSTOM_IGNORE = ignore_custom.split(",")
|
IGNORE.extend(ignore_custom.split(","))
|
||||||
IGNORE.extend(CUSTOM_IGNORE)
|
|
||||||
|
|
||||||
# No Mesh selected
|
# No Mesh selected
|
||||||
if not arr_obj:
|
if not arr_obj:
|
||||||
@@ -56,7 +59,6 @@ class MESH_OT_merge_materials_to_mask(bpy.types.Operator):
|
|||||||
return {"CANCELLED"}
|
return {"CANCELLED"}
|
||||||
|
|
||||||
obj = arr_obj[0]
|
obj = arr_obj[0]
|
||||||
selected_uv = context.scene.uv_enum_props.uv_enum
|
|
||||||
|
|
||||||
# UV Maps present?
|
# UV Maps present?
|
||||||
if not obj.data.uv_layers or not selected_uv:
|
if not obj.data.uv_layers or not selected_uv:
|
||||||
@@ -65,8 +67,13 @@ class MESH_OT_merge_materials_to_mask(bpy.types.Operator):
|
|||||||
|
|
||||||
obj.data.uv_layers.active_index = int(selected_uv)
|
obj.data.uv_layers.active_index = int(selected_uv)
|
||||||
|
|
||||||
|
# Deactivate uv Select Sync in UV Editor. Makes Problems
|
||||||
|
old_ts_state = ts.use_uv_select_sync
|
||||||
|
ts.use_uv_select_sync = False
|
||||||
|
|
||||||
skip = 0
|
skip = 0
|
||||||
idx_multi = None
|
idx_multi = None
|
||||||
|
idx_multi_name = 1
|
||||||
delete = []
|
delete = []
|
||||||
|
|
||||||
# Loop through all Materials
|
# Loop through all Materials
|
||||||
@@ -123,7 +130,8 @@ class MESH_OT_merge_materials_to_mask(bpy.types.Operator):
|
|||||||
mat["1. Black "] = mat.name
|
mat["1. Black "] = mat.name
|
||||||
|
|
||||||
# Change name and use as base to merge
|
# Change name and use as base to merge
|
||||||
mat.name = "Multi_" + mat.name
|
mat.name = str(mat_nameing).replace("$MeshName", obj.name.replace("L1960_", "").replace("KB3D_AMC_", "")) + "_" + str(idx_multi_name)
|
||||||
|
idx_multi_name += 1
|
||||||
idx_multi = i
|
idx_multi = i
|
||||||
self.report({'INFO'}, f'Material "{mat.name}" created.')
|
self.report({'INFO'}, f'Material "{mat.name}" created.')
|
||||||
continue
|
continue
|
||||||
@@ -161,6 +169,9 @@ class MESH_OT_merge_materials_to_mask(bpy.types.Operator):
|
|||||||
uv_layers = mesh.uv_layers
|
uv_layers = mesh.uv_layers
|
||||||
for i, layer in enumerate(uv_layers):
|
for i, layer in enumerate(uv_layers):
|
||||||
layer.name = f"UVMap{i + 1}"
|
layer.name = f"UVMap{i + 1}"
|
||||||
|
|
||||||
|
# Activate Select Sync in UV Editor
|
||||||
|
ts.use_uv_select_sync = old_ts_state
|
||||||
|
|
||||||
self.report({'INFO'}, 'Merged Materials to Multitextures.')
|
self.report({'INFO'}, 'Merged Materials to Multitextures.')
|
||||||
return {"FINISHED"}
|
return {"FINISHED"}
|
||||||
@@ -190,9 +201,13 @@ class MESH_OT_merge_materials_to_mask(bpy.types.Operator):
|
|||||||
bpy.ops.object.mode_set(mode='OBJECT')
|
bpy.ops.object.mode_set(mode='OBJECT')
|
||||||
|
|
||||||
def put_UV_first(self, obj, target_index):
|
def put_UV_first(self, obj, target_index):
|
||||||
|
target_index = int(target_index)
|
||||||
mesh = obj.data
|
mesh = obj.data
|
||||||
uv_layers = mesh.uv_layers
|
uv_layers = mesh.uv_layers
|
||||||
|
|
||||||
|
if target_index < 0 or target_index >= len(uv_layers):
|
||||||
|
return
|
||||||
|
|
||||||
if len(uv_layers) <= 1:
|
if len(uv_layers) <= 1:
|
||||||
return
|
return
|
||||||
|
|
||||||
@@ -200,7 +215,7 @@ class MESH_OT_merge_materials_to_mask(bpy.types.Operator):
|
|||||||
if obj.mode != 'OBJECT':
|
if obj.mode != 'OBJECT':
|
||||||
bpy.ops.object.mode_set(mode='OBJECT')
|
bpy.ops.object.mode_set(mode='OBJECT')
|
||||||
|
|
||||||
# UV-Daten + Namen sichern
|
# Backup aller UV-Layer
|
||||||
uv_backup = []
|
uv_backup = []
|
||||||
for layer in uv_layers:
|
for layer in uv_layers:
|
||||||
uv_backup.append({
|
uv_backup.append({
|
||||||
@@ -208,9 +223,10 @@ class MESH_OT_merge_materials_to_mask(bpy.types.Operator):
|
|||||||
"data": [loop.uv.copy() for loop in layer.data]
|
"data": [loop.uv.copy() for loop in layer.data]
|
||||||
})
|
})
|
||||||
|
|
||||||
# Neue Reihenfolge
|
# Neue Reihenfolge: target_index zuerst
|
||||||
indices = list(range(len(uv_layers)))
|
new_order = [target_index] + [
|
||||||
new_order = [i for i in indices if i != target_index]
|
i for i in range(len(uv_layers)) if i != target_index
|
||||||
|
]
|
||||||
|
|
||||||
# Alle UV-Layer löschen (rückwärts!)
|
# Alle UV-Layer löschen (rückwärts!)
|
||||||
for i in range(len(uv_layers) - 1, -1, -1):
|
for i in range(len(uv_layers) - 1, -1, -1):
|
||||||
@@ -223,5 +239,6 @@ class MESH_OT_merge_materials_to_mask(bpy.types.Operator):
|
|||||||
for i, uv in enumerate(info["data"]):
|
for i, uv in enumerate(info["data"]):
|
||||||
new_layer.data[i].uv = uv
|
new_layer.data[i].uv = uv
|
||||||
|
|
||||||
# Ersten UV-Layer aktiv setzen
|
# Ersten UV-Layer aktiv & render setzen
|
||||||
uv_layers.active_index = 0
|
uv_layers.active_index = 0
|
||||||
|
uv_layers[0].active_render = True
|
||||||
@@ -83,10 +83,11 @@ class L1960_PT_dekogon(bpy.types.Panel):
|
|||||||
emboss=False)
|
emboss=False)
|
||||||
if context.scene.section2:
|
if context.scene.section2:
|
||||||
row = box.row()
|
row = box.row()
|
||||||
props = context.scene.uv_enum_props
|
props = context.scene.settings_uv_enum_props
|
||||||
row.prop(props, "uv_enum", text="Use UV")
|
row.prop(props, "uv_enum", text="UV Mask")
|
||||||
box.prop(context.scene, "settings_multi_ignor", text="Ignore")
|
box.prop(context.scene, "settings_multi_ignor", text="Ignore")
|
||||||
box.prop(context.scene, "uv_island_margin_slider", text="Island Margin")
|
box.prop(context.scene, "settings_mat_nameing", text="Naming")
|
||||||
|
box.prop(context.scene, "settings_uv_island_margin_slider", text="Island Margin")
|
||||||
|
|
||||||
class L1960_PT_tools(bpy.types.Panel):
|
class L1960_PT_tools(bpy.types.Panel):
|
||||||
#where to add the panel
|
#where to add the panel
|
||||||
@@ -194,9 +195,10 @@ def register():
|
|||||||
bpy.types.Scene.dekogon_settings_prefix = bpy.props.StringProperty(name="Prefix", default="TX")
|
bpy.types.Scene.dekogon_settings_prefix = bpy.props.StringProperty(name="Prefix", default="TX")
|
||||||
bpy.types.Scene.dekogon_settings_suffix = bpy.props.StringProperty(name="Suffix", default="ALB")
|
bpy.types.Scene.dekogon_settings_suffix = bpy.props.StringProperty(name="Suffix", default="ALB")
|
||||||
bpy.types.Scene.dekogon_settings_filetype = bpy.props.StringProperty(name="File Type", default="tga")
|
bpy.types.Scene.dekogon_settings_filetype = bpy.props.StringProperty(name="File Type", default="tga")
|
||||||
bpy.types.Scene.settings_multi_ignor = bpy.props.StringProperty(name="Ignore", default="", description="Ignore material when string is in name (split by comma)")
|
bpy.types.Scene.settings_mat_nameing = bpy.props.StringProperty(name="Naming", default="Multi_$MeshName", description="Naming for new multi materials, use $MeshName as placeholder")
|
||||||
bpy.types.Scene.uv_enum_props = bpy.props.PointerProperty(type=UVEnumProperties)
|
bpy.types.Scene.settings_multi_ignor = bpy.props.StringProperty(name="Ignore", default="", description="Ignore material when string is in name (split by comma) | Default: grass, glass, atlas")
|
||||||
bpy.types.Scene.uv_island_margin_slider = bpy.props.FloatProperty(name="Island Margin", default=0.02, min=0.01, max=0.1)
|
bpy.types.Scene.settings_uv_enum_props = bpy.props.PointerProperty(type=UVEnumProperties)
|
||||||
|
bpy.types.Scene.settings_uv_island_margin_slider = bpy.props.FloatProperty(name="Island Margin", default=0.02, min=0.01, max=0.1)
|
||||||
|
|
||||||
def unregister():
|
def unregister():
|
||||||
for mod in modules:
|
for mod in modules:
|
||||||
@@ -211,9 +213,10 @@ def unregister():
|
|||||||
del bpy.types.Scene.dekogon_settings_prefix
|
del bpy.types.Scene.dekogon_settings_prefix
|
||||||
del bpy.types.Scene.dekogon_settings_suffix
|
del bpy.types.Scene.dekogon_settings_suffix
|
||||||
del bpy.types.Scene.dekogon_settings_filetype
|
del bpy.types.Scene.dekogon_settings_filetype
|
||||||
|
del bpy.types.Scene.settings_mat_nameing
|
||||||
del bpy.types.Scene.settings_multi_ignor
|
del bpy.types.Scene.settings_multi_ignor
|
||||||
del bpy.types.Scene.uv_enum_props
|
del bpy.types.Scene.settings_uv_enum_props
|
||||||
del bpy.types.Scene.uv_island_margin_slider
|
del bpy.types.Scene.settings_uv_island_margin_slider
|
||||||
|
|
||||||
if __name__== "__main__":
|
if __name__== "__main__":
|
||||||
register()
|
register()
|
||||||
Reference in New Issue
Block a user