128 lines
4.5 KiB
Python
128 lines
4.5 KiB
Python
|
|
import bpy
|
|||
|
|
import os
|
|||
|
|
|
|||
|
|
### GENRATE MLOD ###
|
|||
|
|
|
|||
|
|
plugin_dir = bpy.utils.user_resource('SCRIPTS')
|
|||
|
|
plugin_path = "addons\L1960Tools"
|
|||
|
|
|
|||
|
|
L1960_path = os.path.join(plugin_dir, plugin_path)
|
|||
|
|
colorpalettes = [
|
|||
|
|
"ColorPalette_01.png",
|
|||
|
|
"ColorPalette_02.png"
|
|||
|
|
]
|
|||
|
|
|
|||
|
|
enum_palettes = []
|
|||
|
|
for file in colorpalettes:
|
|||
|
|
enum_palettes.append((file, file[:-4], "Select " + file[:-4] + " for MLOD"))
|
|||
|
|
|
|||
|
|
class EnumColorPalettes(bpy.types.PropertyGroup):
|
|||
|
|
mlod_enum_selection: bpy.props.EnumProperty(
|
|||
|
|
name="Color Palettes for MLOD",
|
|||
|
|
items=enum_palettes,
|
|||
|
|
description="Choose a palette",
|
|||
|
|
default=0
|
|||
|
|
)
|
|||
|
|
|
|||
|
|
class MESH_OT_set_up_mlod(bpy.types.Operator):
|
|||
|
|
"""Set´s up a material to be used for MLOD´s"""
|
|||
|
|
|
|||
|
|
bl_idname = "mesh.set_up_mlod"
|
|||
|
|
bl_label = "Set´s up a material to be used for MLOD´s"
|
|||
|
|
bl_options = {"REGISTER", "UNDO"}
|
|||
|
|
|
|||
|
|
def execute(self, context):
|
|||
|
|
|
|||
|
|
#Load Color Palettes
|
|||
|
|
self.import_palettes_textures()
|
|||
|
|
|
|||
|
|
#Selected Mesh
|
|||
|
|
obj = bpy.context.active_object
|
|||
|
|
|
|||
|
|
if obj not in bpy.context.selected_objects or obj.type != "MESH":
|
|||
|
|
self.report({'WARNING'}, 'Select a Mesh to continue')
|
|||
|
|
return {"CANCELLED"}
|
|||
|
|
|
|||
|
|
arr_layers = obj.data.uv_layers
|
|||
|
|
if not arr_layers.get("MLOD") or len(arr_layers) > 1:
|
|||
|
|
for uv_layer in reversed(arr_layers):
|
|||
|
|
arr_layers.remove(uv_layer)
|
|||
|
|
arr_layers.new(name = 'MLOD')
|
|||
|
|
|
|||
|
|
|
|||
|
|
texture_filepath = os.path.join(L1960_path, colorpalettes[1])
|
|||
|
|
|
|||
|
|
if not len(obj.data.materials) == 0:
|
|||
|
|
obj.data.materials.clear()
|
|||
|
|
|
|||
|
|
palette_enum_selection = context.scene.color_palettes.mlod_enum_selection
|
|||
|
|
mlod_material_name = "MLOD_" + palette_enum_selection[:-4]
|
|||
|
|
|
|||
|
|
if not bpy.data.materials.get(mlod_material_name):
|
|||
|
|
material = bpy.data.materials.new(name=mlod_material_name)
|
|||
|
|
material.use_nodes = True
|
|||
|
|
bsdf_node = material.node_tree.nodes["Principled BSDF"]
|
|||
|
|
texImage = material.node_tree.nodes.new('ShaderNodeTexImage')
|
|||
|
|
texImage.image = bpy.data.images.get(palette_enum_selection)
|
|||
|
|
|
|||
|
|
material.node_tree.links.new(bsdf_node.inputs['Base Color'], texImage.outputs['Color'])
|
|||
|
|
|
|||
|
|
obj.data.materials.append(bpy.data.materials.get(mlod_material_name))
|
|||
|
|
|
|||
|
|
|
|||
|
|
self.report({'INFO'}, 'Mesh configured like MLOD')
|
|||
|
|
return {"FINISHED"}
|
|||
|
|
|
|||
|
|
def import_palettes_textures(self):
|
|||
|
|
for image_name in colorpalettes:
|
|||
|
|
texture_name = image_name.split(".")[0]
|
|||
|
|
if texture_name not in bpy.data.textures:
|
|||
|
|
texture = bpy.data.textures.new(name=texture_name, type='IMAGE')
|
|||
|
|
else:
|
|||
|
|
texture = bpy.data.textures.get(texture_name)
|
|||
|
|
if image_name not in bpy.data.images:
|
|||
|
|
image = bpy.data.images.load(os.path.join(L1960_path, image_name))
|
|||
|
|
else:
|
|||
|
|
image = bpy.data.images.get(image_name)
|
|||
|
|
texture.image = image
|
|||
|
|
|
|||
|
|
### PREPARE LODS ###
|
|||
|
|
|
|||
|
|
class MESH_OT_prepare_lods_decimate(bpy.types.Operator):
|
|||
|
|
"""Copy current Mesh and apply decimate Modifier"""
|
|||
|
|
|
|||
|
|
bl_idname = "mesh.prepare_lods_decimate"
|
|||
|
|
bl_label = "Copy current Mesh and apply decimate Modifier"
|
|||
|
|
bl_options = {"REGISTER", "UNDO"}
|
|||
|
|
|
|||
|
|
def execute(self, context):
|
|||
|
|
|
|||
|
|
#Selected Mesh
|
|||
|
|
obj = bpy.context.active_object
|
|||
|
|
|
|||
|
|
if obj not in bpy.context.selected_objects or obj.type != "MESH":
|
|||
|
|
self.report({'WARNING'}, 'Select a Mesh to continue')
|
|||
|
|
return {"CANCELLED"}
|
|||
|
|
|
|||
|
|
if not obj.name[:-1].endswith('LOD'):
|
|||
|
|
obj.name = obj.name + '_LOD0'
|
|||
|
|
|
|||
|
|
LODnumber = context.scene.lod_slider #Get from Slider
|
|||
|
|
startLODcount = int(obj.name[-1])
|
|||
|
|
endLODcount = startLODcount + LODnumber
|
|||
|
|
|
|||
|
|
for i in range (startLODcount + 1, endLODcount):
|
|||
|
|
new_obj = obj.copy()
|
|||
|
|
new_obj.data = obj.data.copy()
|
|||
|
|
new_obj.name = obj.name[:-1] + str(i)
|
|||
|
|
bpy.context.collection.objects.link(new_obj)
|
|||
|
|
|
|||
|
|
for t in range (startLODcount, i):
|
|||
|
|
newModifierName = 'LOD_Decimate_' + str(t)
|
|||
|
|
new_obj.modifiers.new(type='DECIMATE', name=newModifierName)
|
|||
|
|
mod = new_obj.modifiers[newModifierName]
|
|||
|
|
mod.ratio = 0.49
|
|||
|
|
mod.use_collapse_triangulate = True
|
|||
|
|
|
|||
|
|
self.report({'INFO'}, 'LOD´s created')
|
|||
|
|
return {"FINISHED"}
|