diff --git a/Blender/AR_WorkbenchCustomScripts.zip b/Blender/AR_WorkbenchCustomScripts.zip deleted file mode 100644 index 87f121b..0000000 Binary files a/Blender/AR_WorkbenchCustomScripts.zip and /dev/null differ diff --git a/Blender/L1960_Tools/_Release/L1960_Tools_1_8_3.zip b/Blender/L1960_Tools/_Release/L1960_Tools_1_8_3.zip new file mode 100644 index 0000000..8434b71 Binary files /dev/null and b/Blender/L1960_Tools/_Release/L1960_Tools_1_8_3.zip differ diff --git a/Blender/L1960_Tools/_Source/L1960_Tools_1_8_3/AutoColorPalette.py b/Blender/L1960_Tools/_Source/L1960_Tools_1_8_3/AutoColorPalette.py new file mode 100644 index 0000000..e9199f4 --- /dev/null +++ b/Blender/L1960_Tools/_Source/L1960_Tools_1_8_3/AutoColorPalette.py @@ -0,0 +1,333 @@ +import bpy +import math +import csv +import os +import json +from mathutils import Vector + +### GENRATE MLOD ### + +plugin_dir = bpy.utils.user_resource('SCRIPTS') +plugin_path = "addons\L1960Tools" +L1960_path = os.path.join(plugin_dir, plugin_path) + +colorpalettes = [ + json.dumps(["ColorPalette_01.png", "BF1BC94A0DE4398F"]), + json.dumps(["ColorPalette_02.png", "A95B2794A0EE8340"]) +] + +enum_palettes = [] +for palettes in colorpalettes: + file = json.loads(palettes)[0] + enum_palettes.append((palettes, 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') + + if not len(obj.data.materials) == 0: + obj.data.materials.clear() + + palette_enum_selection = json.loads(context.scene.color_palettes.mlod_enum_selection) + mlod_material_name = "MLOD_" + palette_enum_selection[0][:-4] + "_" + palette_enum_selection[1] + + 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[0]) + + 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: + image_name = json.loads(image_name)[0] + 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 + +# texture_filepath = os.path.join(L1960_path, colorpalettes[1]) + +### Palette MLOD ### +# class MESH_OT_bake_basic_mlod(bpy.types.Operator): +# """Set´s up a basic MLOD via Bake""" + +# bl_idname = "mesh.bake_basic_mlod" +# bl_label = "Set´s up a basic MLOD via Bake" +# bl_options = {"REGISTER", "UNDO"} + +# def execute(self, context): +# obj = context.active_object + +# #Palette selection +# palette_enum_selection = json.loads(context.scene.color_palettes.mlod_enum_selection) + +# if obj not in bpy.context.selected_objects or obj.type != "MESH": +# self.report({'WARNING'}, 'Select a Mesh to continue') +# return {"CANCELLED"} + +# faces_with_color = self.get_faces_with_color(obj) + +# grouped_colors = self.groupe_colors(faces_with_color, threshold=50) + +# matched_colors = self.find_matching_color(grouped_colors, palette_enum_selection[0][:-4]) + +# self.adjust_UV(obj, matched_colors) + +# #Entfernen des referenz Bake Image +# #bpy.data.images.remove(bpy.data.images["MLOD_Temp"]) + +# # Entfernen aller Meterials +# if not len(obj.data.materials) == 0: +# obj.data.materials.clear() + +# # Create new Material with selected Palette +# mlod_material_name = "MLOD_" + palette_enum_selection[0][:-4] + palette_enum_selection[1] + +# texture_filepath = os.path.join(L1960_path, palette_enum_selection[0]) +# image = bpy.data.images.load(texture_filepath) + +# 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 = image +# 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'}, f'MLOD sucessfully created with {palette_enum_selection[0][:-4]}.') +# return {"FINISHED"} + +# def get_faces_with_color(self, obj): + +# #Bake Image +# image = self.bake_diffuse(obj) + +# mesh = obj.data +# uv_layer = mesh.uv_layers.active.data # direct UV access + +# colors = [] + +# for poly in mesh.polygons: # same as "face" in BMesh +# # Durchschnittliche UV-Koordinaten berechnen +# uv = Vector((0.0, 0.0)) +# for loop_index in poly.loop_indices: +# uv += uv_layer[loop_index].uv +# uv /= len(poly.loop_indices) + +# # UV → Pixel-Koordinaten (Bildgröße) +# x = int(uv.x * (image.size[0] - 1)) +# y = int(uv.y * (image.size[1] - 1)) + +# # RGBA Pixel holen +# index = (y * image.size[0] + x) * 4 +# pixel = image.pixels[index:index+4] + +# # In 0–255 Werte umwandeln +# rgb_255 = [round(c * 255) for c in pixel][:3] + +# colors.append({ +# "face": poly.index, +# "rgb": rgb_255 +# }) + +# # print(colors[-1]) # -> [{'face': , 'rgb': [0, 0, 0]}] + +# return colors + +# def groupe_colors(self, color_list, threshold = 10): +# groups = [] + +# for color in color_list: +# found_group = False +# for group in groups: +# # Compute average color of the group +# avg_color = [sum(c["rgb"][i] for c in group)/len(group) for i in range(3)] +# if self.color_distance(color["rgb"], avg_color) <= threshold: +# group.append(color) +# found_group = True +# break +# if not found_group: +# groups.append([color]) + +# # Compute the average color for each group +# grouped_colors = [{ +# "face": [c["face"] for c in group], +# "rgb": [round(sum(c["rgb"][i] for c in group) / len(group)) for i in range(3)] +# } +# for group in groups +# ] + +# return grouped_colors + +# def color_distance(self, c1, c2): +# return math.sqrt( +# (c1[0]-c2[0])**2 + +# (c1[1]-c2[1])**2 + +# (c1[2]-c2[2])**2 +# ) + +# def read_color_csv(self, palette): +# colors = [] +# try: +# with open(f"{palette}.csv", newline="") as datei: +# reader = csv.DictReader(datei) +# for row in reader: +# colors.append({ +# "rgb": [int(row["r"]), int(row["g"]), int(row["b"])], +# "norm_x": float(row["norm_x"]), +# "norm_y": float(row["norm_y"]) +# }) +# return colors +# except: +# return [] + +# def find_matching_color(self, colors, palette): +# match = [] +# for color in colors: +# best = None +# min_dist = float("inf") + +# for target in self.read_color_csv(palette): +# dist = self.color_distance(target["rgb"], color["rgb"]) +# if dist < min_dist: +# min_dist = dist +# best = { +# "face": color["face"], +# "rgb": color["rgb"], +# "norm_x": target["norm_x"], +# "norm_y": target["norm_y"] +# } +# match.append(best) +# return match + +# def adjust_UV(self, obj, new_face_coords): +# scale = 0.001 # Skalierung + +# mesh = obj.data + +# 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') +# uv_layer = arr_layers.get("MLOD") +# mesh.uv_layers.active = uv_layer + +# for poly in mesh.polygons: +# for coords in new_face_coords: +# if poly.index in coords["face"]: + +# # Mittelpunkt der UVs dieses Polygons berechnen +# uvs = [uv_layer.data[i].uv.copy() for i in poly.loop_indices] +# center = sum(uvs, Vector((0.0, 0.0))) / len(uvs) + +# # Skalieren + Verschieben +# for i in poly.loop_indices: +# uv = uv_layer.data[i].uv +# uv -= center +# uv *= scale +# uv += Vector((float(coords["norm_x"]), float(coords["norm_y"]))) + +# # Mesh updaten +# mesh.update() + +# def bake_diffuse(self, selected_obj, res = 1024): + +# source_obj = None +# for obj in bpy.data.objects: +# if obj.type == 'MESH' and obj.name.endswith("_LOD0"): +# print(obj.name) +# source_obj = obj.copy() +# source_obj.data = obj.data.copy() +# bpy.context.collection.objects.link(source_obj) +# break + +# if source_obj is None: +# source_obj = selected_obj.copy() +# source_obj.data = selected_obj.data.copy() +# bpy.context.collection.objects.link(source_obj) + +# # Material erstellen +# if "MLOD_Temp" in bpy.data.materials: +# mat = bpy.data.materials.remove["MLOD_Temp"] +# mat = bpy.data.materials.new(name="MLOD_Temp") +# source_obj.data.materials.clear() +# source_obj.data.materials.append(mat) + +# # WICHTIG: Material als aktives Material setzen +# mat.use_nodes = True +# source_obj.active_material = mat + +# # Ziel Image Node konfigurieren +# nodes = mat.node_tree.nodes +# links = mat.node_tree.links +# nodes.clear() +# tex_node = nodes.new(type="ShaderNodeTexImage") +# bsdf = nodes.new(type="ShaderNodeBsdfPrincipled") +# output = nodes.new(type="ShaderNodeOutputMaterial") +# links.new(bsdf.outputs["BSDF"], output.inputs["Surface"]) +# links.new(tex_node.outputs["Color"], bsdf.inputs["Base Color"]) +# nodes.active = tex_node + +# # Erstellen des Images +# if "MLOD_Temp" in bpy.data.images: +# bpy.data.images.remove(bpy.data.images["MLOD_Temp"]) +# image = bpy.data.images.new("MLOD_Temp", res, res) +# tex_node.image = image + +# # Selected Object = Quelle +# bpy.context.view_layer.objects.active = source_obj +# # Active Object = Ziel +# selected_obj.select_set(True) + +# # Bake +# bpy.context.scene.render.engine = 'CYCLES' +# bpy.ops.object.bake(type='COMBINED', width=512, height=512, cage_extrusion=0.5, pass_filter={'COLOR'}, margin=16, use_selected_to_active=True) + +# # Temporäre Helfer entfernen +# bpy.data.objects.remove(source_obj, do_unlink=True) +# if "MLOD_Temp" in bpy.data.materials: +# bpy.data.materials.remove(mat) + +# bpy.context.view_layer.objects.active = selected_obj + +# return image \ No newline at end of file diff --git a/Blender/L1960_Tools/_Source/L1960_Tools_1_8_3/ColorPalette_01.csv b/Blender/L1960_Tools/_Source/L1960_Tools_1_8_3/ColorPalette_01.csv new file mode 100644 index 0000000..853a0f3 --- /dev/null +++ b/Blender/L1960_Tools/_Source/L1960_Tools_1_8_3/ColorPalette_01.csv @@ -0,0 +1,1025 @@ +norm_x,norm_y,r,g,b +0.015625,0.984375,255,196,181 +0.046875,0.984375,255,234,176 +0.078125,0.984375,255,253,190 +0.109375,0.984375,237,255,190 +0.140625,0.984375,207,255,186 +0.171875,0.984375,188,255,192 +0.203125,0.984375,188,255,217 +0.234375,0.984375,190,255,245 +0.265625,0.984375,190,245,255 +0.296875,0.984375,188,217,255 +0.328125,0.984375,188,192,253 +0.359375,0.984375,207,187,255 +0.390625,0.984375,238,190,255 +0.421875,0.984375,255,190,253 +0.453125,0.984375,255,190,225 +0.484375,0.984375,254,193,201 +0.515625,0.984375,238,212,207 +0.546875,0.984375,238,224,204 +0.578125,0.984375,238,237,206 +0.609375,0.984375,229,238,206 +0.640625,0.984375,212,237,203 +0.671875,0.984375,204,238,207 +0.703125,0.984375,204,238,218 +0.734375,0.984375,206,238,233 +0.765625,0.984375,206,233,238 +0.796875,0.984375,204,218,238 +0.828125,0.984375,204,206,237 +0.859375,0.984375,213,204,238 +0.890625,0.984375,229,206,238 +0.921875,0.984375,238,206,237 +0.953125,0.984375,238,206,223 +0.984375,0.984375,239,207,212 +0.015625,0.953125,254,181,167 +0.046875,0.953125,255,217,163 +0.078125,0.953125,255,252,164 +0.109375,0.953125,230,255,163 +0.140625,0.953125,188,254,158 +0.171875,0.953125,160,255,167 +0.203125,0.953125,160,255,203 +0.234375,0.953125,163,255,241 +0.265625,0.953125,164,241,255 +0.296875,0.953125,160,200,254 +0.328125,0.953125,160,166,254 +0.359375,0.953125,188,159,255 +0.390625,0.953125,232,163,255 +0.421875,0.953125,255,163,249 +0.453125,0.953125,255,163,215 +0.484375,0.953125,254,167,181 +0.515625,0.953125,232,195,188 +0.546875,0.953125,232,212,186 +0.578125,0.953125,232,230,187 +0.609375,0.953125,218,232,186 +0.640625,0.953125,197,230,182 +0.671875,0.953125,184,231,187 +0.703125,0.953125,184,231,204 +0.734375,0.953125,186,232,225 +0.765625,0.953125,187,225,232 +0.796875,0.953125,184,203,230 +0.828125,0.953125,182,186,230 +0.859375,0.953125,197,182,231 +0.890625,0.953125,219,186,232 +0.921875,0.953125,232,186,229 +0.953125,0.953125,232,186,212 +0.984375,0.953125,232,190,195 +0.015625,0.921875,254,159,141 +0.046875,0.921875,255,206,136 +0.078125,0.921875,255,250,135 +0.109375,0.921875,221,255,135 +0.140625,0.921875,167,254,131 +0.171875,0.921875,132,254,140 +0.203125,0.921875,134,255,188 +0.234375,0.921875,135,255,239 +0.265625,0.921875,135,238,255 +0.296875,0.921875,134,185,254 +0.328125,0.921875,133,139,254 +0.359375,0.921875,169,131,254 +0.390625,0.921875,224,136,255 +0.421875,0.921875,255,136,248 +0.453125,0.921875,255,136,204 +0.484375,0.921875,254,141,158 +0.515625,0.921875,226,178,170 +0.546875,0.921875,225,201,166 +0.578125,0.921875,225,223,165 +0.609375,0.921875,207,225,165 +0.640625,0.921875,180,223,162 +0.671875,0.921875,162,223,166 +0.703125,0.921875,164,224,190 +0.734375,0.921875,165,225,217 +0.765625,0.921875,165,216,225 +0.796875,0.921875,164,188,224 +0.828125,0.921875,163,166,223 +0.859375,0.921875,181,162,223 +0.890625,0.921875,210,166,225 +0.921875,0.921875,225,166,222 +0.953125,0.921875,225,166,200 +0.984375,0.921875,226,170,178 +0.015625,0.890625,255,137,116 +0.046875,0.890625,255,193,109 +0.078125,0.890625,255,249,109 +0.109375,0.890625,213,255,110 +0.140625,0.890625,146,255,102 +0.171875,0.890625,105,254,115 +0.203125,0.890625,106,255,172 +0.234375,0.890625,109,255,236 +0.265625,0.890625,108,234,255 +0.296875,0.890625,106,170,255 +0.328125,0.890625,107,114,255 +0.359375,0.890625,150,103,254 +0.390625,0.890625,217,108,255 +0.421875,0.890625,255,109,248 +0.453125,0.890625,255,109,192 +0.484375,0.890625,254,116,134 +0.515625,0.890625,219,160,150 +0.546875,0.890625,217,187,145 +0.578125,0.890625,217,215,145 +0.609375,0.890625,197,217,146 +0.640625,0.890625,162,216,140 +0.671875,0.890625,141,216,146 +0.703125,0.890625,143,217,176 +0.734375,0.890625,145,217,207 +0.765625,0.890625,145,207,217 +0.796875,0.890625,143,175,217 +0.828125,0.890625,144,146,217 +0.859375,0.890625,164,141,216 +0.890625,0.890625,198,145,217 +0.921875,0.890625,217,145,215 +0.953125,0.890625,217,145,186 +0.984375,0.890625,218,150,159 +0.015625,0.859375,255,115,91 +0.046875,0.859375,255,182,83 +0.078125,0.859375,255,248,83 +0.109375,0.859375,207,255,83 +0.140625,0.859375,128,255,75 +0.171875,0.859375,78,254,90 +0.203125,0.859375,78,255,157 +0.234375,0.859375,82,255,231 +0.265625,0.859375,82,230,255 +0.296875,0.859375,78,153,255 +0.328125,0.859375,80,88,254 +0.359375,0.859375,131,76,254 +0.390625,0.859375,210,82,255 +0.421875,0.859375,255,82,247 +0.453125,0.859375,255,82,181 +0.484375,0.859375,255,91,114 +0.515625,0.859375,212,144,132 +0.546875,0.859375,212,176,126 +0.578125,0.859375,212,208,126 +0.609375,0.859375,188,212,126 +0.640625,0.859375,146,210,120 +0.671875,0.859375,122,210,128 +0.703125,0.859375,122,210,160 +0.734375,0.859375,125,211,198 +0.765625,0.859375,125,198,211 +0.796875,0.859375,122,159,210 +0.828125,0.859375,123,127,210 +0.859375,0.859375,146,120,208 +0.890625,0.859375,188,125,211 +0.921875,0.859375,211,125,207 +0.953125,0.859375,211,125,174 +0.984375,0.859375,212,132,143 +0.015625,0.828125,254,94,65 +0.046875,0.828125,255,172,56 +0.078125,0.828125,255,247,55 +0.109375,0.828125,198,255,55 +0.140625,0.828125,108,254,47 +0.171875,0.828125,50,254,64 +0.203125,0.828125,51,255,141 +0.234375,0.828125,54,255,227 +0.265625,0.828125,56,226,255 +0.296875,0.828125,51,137,255 +0.328125,0.828125,51,62,253 +0.359375,0.828125,111,47,254 +0.390625,0.828125,203,55,255 +0.421875,0.828125,255,55,246 +0.453125,0.828125,255,55,169 +0.484375,0.828125,255,65,91 +0.515625,0.828125,207,127,113 +0.546875,0.828125,204,164,106 +0.578125,0.828125,204,201,105 +0.609375,0.828125,177,204,105 +0.640625,0.828125,129,201,99 +0.671875,0.828125,101,203,108 +0.703125,0.828125,102,204,146 +0.734375,0.828125,104,204,190 +0.765625,0.828125,106,190,204 +0.796875,0.828125,102,145,204 +0.828125,0.828125,101,107,201 +0.859375,0.828125,131,99,201 +0.890625,0.828125,179,105,204 +0.921875,0.828125,204,105,200 +0.953125,0.828125,204,105,162 +0.984375,0.828125,207,113,125 +0.015625,0.796875,255,70,39 +0.046875,0.796875,255,160,25 +0.078125,0.796875,255,248,26 +0.109375,0.796875,192,255,26 +0.140625,0.796875,87,255,15 +0.171875,0.796875,19,255,35 +0.203125,0.796875,20,255,126 +0.234375,0.796875,26,255,227 +0.265625,0.796875,27,223,255 +0.296875,0.796875,20,121,255 +0.328125,0.796875,20,34,255 +0.359375,0.796875,91,15,255 +0.390625,0.796875,197,26,255 +0.421875,0.796875,255,26,246 +0.453125,0.796875,255,26,157 +0.484375,0.796875,255,38,67 +0.515625,0.796875,201,108,93 +0.546875,0.796875,197,150,82 +0.578125,0.796875,197,193,83 +0.609375,0.796875,165,197,83 +0.640625,0.796875,111,195,75 +0.671875,0.796875,78,195,86 +0.703125,0.796875,79,195,132 +0.734375,0.796875,83,197,182 +0.765625,0.796875,84,182,198 +0.796875,0.796875,79,129,195 +0.828125,0.796875,79,86,195 +0.859375,0.796875,113,75,195 +0.890625,0.796875,167,83,197 +0.921875,0.796875,197,83,193 +0.953125,0.796875,197,83,148 +0.984375,0.796875,200,92,107 +0.015625,0.765625,255,50,15 +0.046875,0.765625,255,149,1 +0.078125,0.765625,255,247,2 +0.109375,0.765625,184,255,2 +0.140625,0.765625,67,254,0 +0.171875,0.765625,0,255,13 +0.203125,0.765625,0,255,110 +0.234375,0.765625,2,255,223 +0.265625,0.765625,1,217,255 +0.296875,0.765625,0,106,255 +0.328125,0.765625,0,8,255 +0.359375,0.765625,72,0,254 +0.390625,0.765625,188,1,255 +0.421875,0.765625,255,1,245 +0.453125,0.765625,255,1,145 +0.484375,0.765625,255,14,46 +0.515625,0.765625,193,92,75 +0.546875,0.765625,190,138,64 +0.578125,0.765625,190,187,65 +0.609375,0.765625,155,190,65 +0.640625,0.765625,96,190,63 +0.671875,0.765625,64,190,70 +0.703125,0.765625,64,190,119 +0.734375,0.765625,65,190,175 +0.765625,0.765625,64,172,190 +0.796875,0.765625,64,117,190 +0.828125,0.765625,64,68,190 +0.859375,0.765625,99,63,190 +0.890625,0.765625,158,64,190 +0.921875,0.765625,190,64,186 +0.953125,0.765625,190,64,136 +0.984375,0.765625,193,74,90 +0.015625,0.734375,234,43,13 +0.046875,0.734375,239,135,0 +0.078125,0.734375,238,226,0 +0.109375,0.734375,167,242,0 +0.140625,0.734375,59,232,0 +0.171875,0.734375,0,233,7 +0.203125,0.734375,0,235,99 +0.234375,0.734375,0,246,203 +0.265625,0.734375,0,198,245 +0.296875,0.734375,0,94,234 +0.328125,0.734375,0,5,233 +0.359375,0.734375,63,0,234 +0.390625,0.734375,171,0,244 +0.421875,0.734375,239,0,223 +0.453125,0.734375,239,0,130 +0.484375,0.734375,235,13,41 +0.515625,0.734375,178,83,68 +0.546875,0.734375,179,127,60 +0.578125,0.734375,178,171,59 +0.609375,0.734375,144,182,61 +0.640625,0.734375,87,174,58 +0.671875,0.734375,58,174,62 +0.703125,0.734375,59,176,108 +0.734375,0.734375,61,184,162 +0.765625,0.734375,61,160,182 +0.796875,0.734375,58,105,175 +0.828125,0.734375,58,60,174 +0.859375,0.734375,90,58,175 +0.890625,0.734375,146,61,182 +0.921875,0.734375,180,60,171 +0.953125,0.734375,179,60,125 +0.984375,0.734375,179,68,82 +0.015625,0.703125,207,41,13 +0.046875,0.703125,207,118,1 +0.078125,0.703125,208,197,0 +0.109375,0.703125,148,212,0 +0.140625,0.703125,52,204,0 +0.171875,0.703125,0,204,8 +0.203125,0.703125,0,204,87 +0.234375,0.703125,0,213,176 +0.265625,0.703125,0,174,215 +0.296875,0.703125,0,83,204 +0.328125,0.703125,0,7,203 +0.359375,0.703125,56,0,204 +0.390625,0.703125,150,0,213 +0.421875,0.703125,208,0,195 +0.453125,0.703125,208,0,115 +0.484375,0.703125,207,13,40 +0.515625,0.703125,158,75,61 +0.546875,0.703125,156,111,53 +0.578125,0.703125,156,149,52 +0.609375,0.703125,127,159,53 +0.640625,0.703125,77,153,51 +0.671875,0.703125,51,153,55 +0.703125,0.703125,51,153,94 +0.734375,0.703125,53,160,141 +0.765625,0.703125,54,140,160 +0.796875,0.703125,51,92,153 +0.828125,0.703125,51,55,152 +0.859375,0.703125,79,51,153 +0.890625,0.703125,128,53,160 +0.921875,0.703125,156,52,149 +0.953125,0.703125,156,52,109 +0.984375,0.703125,158,61,75 +0.015625,0.671875,181,37,13 +0.046875,0.671875,181,102,1 +0.078125,0.671875,181,170,1 +0.109375,0.671875,127,182,1 +0.140625,0.671875,46,177,0 +0.171875,0.671875,0,176,7 +0.203125,0.671875,0,178,76 +0.234375,0.671875,0,186,152 +0.265625,0.671875,1,150,185 +0.296875,0.671875,0,71,178 +0.328125,0.671875,0,6,176 +0.359375,0.671875,49,0,176 +0.390625,0.671875,129,0,184 +0.421875,0.671875,181,0,170 +0.453125,0.671875,181,0,100 +0.484375,0.671875,181,13,35 +0.515625,0.671875,138,66,55 +0.546875,0.671875,136,96,46 +0.578125,0.671875,136,130,46 +0.609375,0.671875,109,137,46 +0.640625,0.671875,67,132,44 +0.671875,0.671875,44,132,47 +0.703125,0.671875,44,133,82 +0.734375,0.671875,46,139,122 +0.765625,0.671875,47,121,139 +0.796875,0.671875,44,79,133 +0.828125,0.671875,44,47,132 +0.859375,0.671875,68,44,132 +0.890625,0.671875,110,46,138 +0.921875,0.671875,135,45,129 +0.953125,0.671875,135,45,95 +0.984375,0.671875,138,55,65 +0.015625,0.640625,155,33,13 +0.046875,0.640625,152,88,0 +0.078125,0.640625,153,144,1 +0.109375,0.640625,108,155,0 +0.140625,0.640625,39,149,0 +0.171875,0.640625,0,149,6 +0.203125,0.640625,0,150,64 +0.234375,0.640625,0,157,129 +0.265625,0.640625,1,127,156 +0.296875,0.640625,0,61,150 +0.328125,0.640625,0,5,150 +0.359375,0.640625,41,0,148 +0.390625,0.640625,110,0,155 +0.421875,0.640625,153,0,143 +0.453125,0.640625,153,0,85 +0.484375,0.640625,155,13,31 +0.515625,0.640625,119,59,48 +0.546875,0.640625,114,82,38 +0.578125,0.640625,115,110,39 +0.609375,0.640625,93,116,39 +0.640625,0.640625,56,111,37 +0.671875,0.640625,37,111,40 +0.703125,0.640625,38,113,70 +0.734375,0.640625,39,117,103 +0.765625,0.640625,40,102,117 +0.796875,0.640625,38,68,113 +0.828125,0.640625,37,40,112 +0.859375,0.640625,58,37,111 +0.890625,0.640625,93,39,116 +0.921875,0.640625,114,38,109 +0.953125,0.640625,114,38,80 +0.984375,0.640625,119,48,57 +0.015625,0.609375,129,29,14 +0.046875,0.609375,125,72,0 +0.078125,0.609375,127,118,1 +0.109375,0.609375,88,127,0 +0.140625,0.609375,30,122,0 +0.171875,0.609375,0,122,5 +0.203125,0.609375,0,123,51 +0.234375,0.609375,1,129,106 +0.265625,0.609375,0,104,129 +0.296875,0.609375,0,50,122 +0.328125,0.609375,0,3,123 +0.359375,0.609375,32,0,122 +0.390625,0.609375,90,0,128 +0.421875,0.609375,127,0,119 +0.453125,0.609375,125,0,69 +0.484375,0.609375,130,13,27 +0.515625,0.609375,99,50,42 +0.546875,0.609375,93,67,31 +0.578125,0.609375,95,90,32 +0.609375,0.609375,76,95,32 +0.640625,0.609375,45,91,30 +0.671875,0.609375,30,91,32 +0.703125,0.609375,31,92,56 +0.734375,0.609375,33,97,85 +0.765625,0.609375,32,83,96 +0.796875,0.609375,30,55,91 +0.828125,0.609375,31,32,92 +0.859375,0.609375,46,30,91 +0.890625,0.609375,77,32,96 +0.921875,0.609375,95,32,91 +0.953125,0.609375,93,31,65 +0.984375,0.609375,100,42,49 +0.015625,0.578125,103,26,13 +0.046875,0.578125,98,55,0 +0.078125,0.578125,99,93,0 +0.109375,0.578125,68,100,0 +0.140625,0.578125,24,96,0 +0.171875,0.578125,0,95,4 +0.203125,0.578125,0,95,40 +0.234375,0.578125,1,100,83 +0.265625,0.578125,0,82,101 +0.296875,0.578125,0,38,96 +0.328125,0.578125,0,3,96 +0.359375,0.578125,26,0,97 +0.390625,0.578125,70,0,101 +0.421875,0.578125,99,0,92 +0.453125,0.578125,98,0,54 +0.484375,0.578125,103,13,24 +0.515625,0.578125,80,42,36 +0.546875,0.578125,73,51,24 +0.578125,0.578125,74,71,25 +0.609375,0.578125,59,75,25 +0.640625,0.578125,36,72,24 +0.671875,0.578125,24,71,26 +0.703125,0.578125,24,71,44 +0.734375,0.578125,26,75,66 +0.765625,0.578125,25,65,75 +0.796875,0.578125,24,43,72 +0.828125,0.578125,24,25,72 +0.859375,0.578125,37,24,72 +0.890625,0.578125,60,25,75 +0.921875,0.578125,74,25,70 +0.953125,0.578125,73,24,51 +0.984375,0.578125,80,36,41 +0.015625,0.546875,78,22,13 +0.046875,0.546875,69,40,0 +0.078125,0.546875,69,67,1 +0.109375,0.546875,49,72,1 +0.140625,0.546875,18,69,0 +0.171875,0.546875,0,69,3 +0.203125,0.546875,0,69,29 +0.234375,0.546875,1,72,60 +0.265625,0.546875,1,59,73 +0.296875,0.546875,0,28,70 +0.328125,0.546875,0,2,68 +0.359375,0.546875,18,0,70 +0.390625,0.546875,50,0,72 +0.421875,0.546875,71,0,65 +0.453125,0.546875,70,0,38 +0.484375,0.546875,78,13,22 +0.515625,0.546875,61,34,29 +0.546875,0.546875,51,37,17 +0.578125,0.546875,52,51,18 +0.609375,0.546875,43,54,19 +0.640625,0.546875,26,51,17 +0.671875,0.546875,17,51,18 +0.703125,0.546875,17,51,31 +0.734375,0.546875,19,54,48 +0.765625,0.546875,19,48,55 +0.796875,0.546875,17,31,52 +0.828125,0.546875,17,18,51 +0.859375,0.546875,26,17,52 +0.890625,0.546875,43,18,54 +0.921875,0.546875,53,18,50 +0.953125,0.546875,52,17,36 +0.984375,0.546875,61,29,34 +0.015625,0.515625,41,5,0 +0.046875,0.515625,41,24,0 +0.078125,0.515625,41,40,1 +0.109375,0.515625,29,44,0 +0.140625,0.515625,10,41,0 +0.171875,0.515625,0,41,2 +0.203125,0.515625,0,41,17 +0.234375,0.515625,1,42,36 +0.265625,0.515625,0,35,43 +0.296875,0.515625,0,17,41 +0.328125,0.515625,0,2,41 +0.359375,0.515625,10,0,41 +0.390625,0.515625,30,0,42 +0.421875,0.515625,42,0,39 +0.453125,0.515625,41,0,23 +0.484375,0.515625,41,0,5 +0.515625,0.515625,30,12,10 +0.546875,0.515625,30,22,10 +0.578125,0.515625,31,30,11 +0.609375,0.515625,25,33,11 +0.640625,0.515625,15,30,10 +0.671875,0.515625,10,30,11 +0.703125,0.515625,10,30,18 +0.734375,0.515625,11,31,28 +0.765625,0.515625,11,28,32 +0.796875,0.515625,10,18,30 +0.828125,0.515625,10,11,30 +0.859375,0.515625,15,10,30 +0.890625,0.515625,25,10,31 +0.921875,0.515625,31,10,29 +0.953125,0.515625,30,10,21 +0.984375,0.515625,30,10,12 +0.015625,0.484375,221,204,201 +0.046875,0.484375,232,224,212 +0.078125,0.484375,232,231,212 +0.109375,0.484375,226,232,212 +0.140625,0.484375,216,231,210 +0.171875,0.484375,211,231,212 +0.203125,0.484375,212,232,221 +0.234375,0.484375,212,232,229 +0.265625,0.484375,212,229,232 +0.296875,0.484375,212,219,232 +0.328125,0.484375,211,212,230 +0.359375,0.484375,217,211,231 +0.390625,0.484375,227,212,232 +0.421875,0.484375,232,212,231 +0.453125,0.484375,232,212,223 +0.484375,0.484375,221,203,204 +0.515625,0.484375,215,208,207 +0.546875,0.484375,225,222,217 +0.578125,0.484375,226,226,218 +0.609375,0.484375,224,226,218 +0.640625,0.484375,218,224,217 +0.671875,0.484375,217,225,217 +0.703125,0.484375,217,225,221 +0.734375,0.484375,218,226,225 +0.765625,0.484375,218,225,226 +0.796875,0.484375,217,221,225 +0.828125,0.484375,217,217,224 +0.859375,0.484375,218,217,224 +0.890625,0.484375,224,218,226 +0.921875,0.484375,226,218,226 +0.953125,0.484375,226,218,223 +0.984375,0.484375,215,208,210 +0.015625,0.453125,224,201,197 +0.046875,0.453125,223,211,195 +0.078125,0.453125,223,222,195 +0.109375,0.453125,215,223,195 +0.140625,0.453125,200,219,190 +0.171875,0.453125,193,222,195 +0.203125,0.453125,193,222,206 +0.234375,0.453125,195,223,218 +0.265625,0.453125,195,218,223 +0.296875,0.453125,193,204,221 +0.328125,0.453125,193,195,221 +0.359375,0.453125,201,192,221 +0.390625,0.453125,216,195,223 +0.421875,0.453125,223,195,221 +0.453125,0.453125,223,195,211 +0.484375,0.453125,224,198,201 +0.515625,0.453125,213,207,206 +0.546875,0.453125,212,208,204 +0.578125,0.453125,213,213,204 +0.609375,0.453125,211,212,204 +0.640625,0.453125,204,211,201 +0.671875,0.453125,201,212,203 +0.703125,0.453125,203,212,207 +0.734375,0.453125,204,212,212 +0.765625,0.453125,204,212,213 +0.796875,0.453125,203,207,212 +0.828125,0.453125,201,203,212 +0.859375,0.453125,204,201,212 +0.890625,0.453125,211,204,212 +0.921875,0.453125,212,204,212 +0.953125,0.453125,212,204,208 +0.984375,0.453125,215,207,207 +0.015625,0.421875,213,186,181 +0.046875,0.421875,212,198,177 +0.078125,0.421875,212,212,177 +0.109375,0.421875,203,212,177 +0.140625,0.421875,185,211,174 +0.171875,0.421875,174,211,176 +0.203125,0.421875,176,212,192 +0.234375,0.421875,177,212,207 +0.265625,0.421875,177,207,212 +0.296875,0.421875,176,190,212 +0.328125,0.421875,175,177,211 +0.359375,0.421875,185,174,211 +0.390625,0.421875,204,177,212 +0.421875,0.421875,212,177,211 +0.453125,0.421875,212,177,198 +0.484375,0.421875,213,181,186 +0.515625,0.421875,204,193,192 +0.546875,0.421875,201,195,188 +0.578125,0.421875,201,201,188 +0.609375,0.421875,198,201,188 +0.640625,0.421875,190,198,186 +0.671875,0.421875,187,198,188 +0.703125,0.421875,188,200,193 +0.734375,0.421875,188,201,198 +0.765625,0.421875,188,198,201 +0.796875,0.421875,188,193,200 +0.828125,0.421875,187,188,198 +0.859375,0.421875,190,186,198 +0.890625,0.421875,198,188,201 +0.921875,0.421875,201,188,200 +0.953125,0.421875,201,188,195 +0.984375,0.421875,204,192,193 +0.015625,0.390625,207,171,165 +0.046875,0.390625,204,185,160 +0.078125,0.390625,204,201,160 +0.109375,0.390625,190,204,160 +0.140625,0.390625,167,201,155 +0.171875,0.390625,157,201,160 +0.203125,0.390625,158,203,178 +0.234375,0.390625,160,204,198 +0.265625,0.390625,159,197,203 +0.296875,0.390625,158,177,203 +0.328125,0.390625,158,160,203 +0.359375,0.390625,170,156,201 +0.390625,0.390625,192,159,203 +0.421875,0.390625,204,160,201 +0.453125,0.390625,204,160,185 +0.484375,0.390625,206,164,170 +0.515625,0.390625,192,180,178 +0.546875,0.390625,188,182,174 +0.578125,0.390625,188,188,174 +0.609375,0.390625,186,190,175 +0.640625,0.390625,175,186,170 +0.671875,0.390625,172,187,173 +0.703125,0.390625,173,188,180 +0.734375,0.390625,174,188,187 +0.765625,0.390625,174,187,188 +0.796875,0.390625,173,179,188 +0.828125,0.390625,173,174,188 +0.859375,0.390625,176,171,186 +0.890625,0.390625,185,174,188 +0.921875,0.390625,188,174,188 +0.953125,0.390625,188,174,182 +0.984375,0.390625,192,178,180 +0.015625,0.359375,197,155,148 +0.046875,0.359375,195,173,143 +0.078125,0.359375,195,193,143 +0.109375,0.359375,180,195,143 +0.140625,0.359375,153,192,138 +0.171875,0.359375,139,192,143 +0.203125,0.359375,140,193,164 +0.234375,0.359375,141,193,187 +0.265625,0.359375,141,186,193 +0.296875,0.359375,140,163,193 +0.328125,0.359375,141,143,193 +0.359375,0.359375,155,138,192 +0.390625,0.359375,180,141,193 +0.421875,0.359375,193,141,192 +0.453125,0.359375,193,141,172 +0.484375,0.359375,197,148,153 +0.515625,0.359375,181,167,164 +0.546875,0.359375,177,170,160 +0.578125,0.359375,177,176,160 +0.609375,0.359375,172,177,160 +0.640625,0.359375,160,174,156 +0.671875,0.359375,157,175,158 +0.703125,0.359375,157,175,165 +0.734375,0.359375,159,177,174 +0.765625,0.359375,159,174,177 +0.796875,0.359375,157,165,175 +0.828125,0.359375,158,159,176 +0.859375,0.359375,162,156,174 +0.890625,0.359375,172,159,177 +0.921875,0.359375,177,159,176 +0.953125,0.359375,177,159,169 +0.984375,0.359375,181,164,166 +0.015625,0.328125,188,139,131 +0.046875,0.328125,185,160,125 +0.078125,0.328125,185,182,125 +0.109375,0.328125,167,185,125 +0.140625,0.328125,137,181,119 +0.171875,0.328125,121,182,125 +0.203125,0.328125,122,182,149 +0.234375,0.328125,124,184,175 +0.265625,0.328125,125,176,185 +0.296875,0.328125,122,148,182 +0.328125,0.328125,121,124,182 +0.359375,0.328125,138,119,181 +0.390625,0.328125,169,125,185 +0.421875,0.328125,185,125,182 +0.453125,0.328125,185,125,159 +0.484375,0.328125,188,132,139 +0.515625,0.328125,169,153,150 +0.546875,0.328125,165,157,145 +0.578125,0.328125,165,164,145 +0.609375,0.328125,159,165,145 +0.640625,0.328125,146,160,140 +0.671875,0.328125,141,162,141 +0.703125,0.328125,141,163,150 +0.734375,0.328125,144,164,160 +0.765625,0.328125,145,162,165 +0.796875,0.328125,141,150,163 +0.828125,0.328125,141,141,162 +0.859375,0.328125,146,140,160 +0.890625,0.328125,160,145,165 +0.921875,0.328125,165,145,164 +0.953125,0.328125,165,145,156 +0.984375,0.328125,170,150,153 +0.015625,0.296875,179,123,114 +0.046875,0.296875,174,146,105 +0.078125,0.296875,175,173,106 +0.109375,0.296875,156,175,106 +0.140625,0.296875,121,171,99 +0.171875,0.296875,101,172,106 +0.203125,0.296875,102,173,134 +0.234375,0.296875,106,175,166 +0.265625,0.296875,106,165,175 +0.296875,0.296875,102,133,173 +0.328125,0.296875,102,106,173 +0.359375,0.296875,122,99,171 +0.390625,0.296875,157,106,175 +0.421875,0.296875,175,106,172 +0.453125,0.296875,175,106,145 +0.484375,0.296875,179,114,122 +0.515625,0.296875,157,138,135 +0.546875,0.296875,150,141,128 +0.578125,0.296875,152,150,129 +0.609375,0.296875,146,152,129 +0.640625,0.296875,130,146,123 +0.671875,0.296875,125,149,127 +0.703125,0.296875,125,149,136 +0.734375,0.296875,129,152,149 +0.765625,0.296875,129,149,152 +0.796875,0.296875,125,135,149 +0.828125,0.296875,125,126,149 +0.859375,0.296875,131,123,146 +0.890625,0.296875,146,129,152 +0.921875,0.296875,152,129,150 +0.953125,0.296875,152,129,141 +0.984375,0.296875,157,135,138 +0.015625,0.265625,171,109,98 +0.046875,0.265625,166,134,90 +0.078125,0.265625,166,164,90 +0.109375,0.265625,144,166,90 +0.140625,0.265625,109,165,89 +0.171875,0.265625,89,166,93 +0.203125,0.265625,89,166,122 +0.234375,0.265625,90,166,156 +0.265625,0.265625,90,155,166 +0.296875,0.265625,89,121,166 +0.328125,0.265625,89,91,166 +0.359375,0.265625,110,89,165 +0.390625,0.265625,146,90,166 +0.421875,0.265625,166,90,163 +0.453125,0.265625,166,90,133 +0.484375,0.265625,171,98,108 +0.515625,0.265625,146,126,122 +0.546875,0.265625,141,130,115 +0.578125,0.265625,141,140,115 +0.609375,0.265625,134,141,115 +0.640625,0.265625,121,140,114 +0.671875,0.265625,114,140,115 +0.703125,0.265625,114,140,125 +0.734375,0.265625,115,141,138 +0.765625,0.265625,115,137,141 +0.796875,0.265625,114,125,140 +0.828125,0.265625,114,115,140 +0.859375,0.265625,121,114,140 +0.890625,0.265625,134,115,141 +0.921875,0.265625,141,115,140 +0.953125,0.265625,141,115,130 +0.984375,0.265625,146,122,125 +0.015625,0.234375,156,99,90 +0.046875,0.234375,155,123,83 +0.078125,0.234375,155,150,83 +0.109375,0.234375,135,158,85 +0.140625,0.234375,99,150,81 +0.171875,0.234375,81,150,83 +0.203125,0.234375,82,153,112 +0.234375,0.234375,86,160,146 +0.265625,0.234375,85,145,159 +0.296875,0.234375,82,110,152 +0.328125,0.234375,81,82,150 +0.359375,0.234375,101,82,152 +0.390625,0.234375,136,85,158 +0.421875,0.234375,156,84,150 +0.453125,0.234375,155,83,122 +0.484375,0.234375,157,91,99 +0.515625,0.234375,134,115,112 +0.546875,0.234375,131,120,107 +0.578125,0.234375,131,130,107 +0.609375,0.234375,126,134,109 +0.640625,0.234375,110,128,104 +0.671875,0.234375,104,128,105 +0.703125,0.234375,105,129,115 +0.734375,0.234375,110,135,131 +0.765625,0.234375,110,130,135 +0.796875,0.234375,105,115,129 +0.828125,0.234375,104,104,128 +0.859375,0.234375,111,105,129 +0.890625,0.234375,126,109,134 +0.921875,0.234375,132,108,130 +0.953125,0.234375,131,107,120 +0.984375,0.234375,135,113,115 +0.015625,0.203125,138,89,80 +0.046875,0.203125,135,108,73 +0.078125,0.203125,136,132,73 +0.109375,0.203125,118,138,74 +0.140625,0.203125,86,132,71 +0.171875,0.203125,71,132,73 +0.203125,0.203125,71,133,97 +0.234375,0.203125,75,139,127 +0.265625,0.203125,75,127,140 +0.296875,0.203125,71,96,133 +0.328125,0.203125,71,73,132 +0.359375,0.203125,88,71,132 +0.390625,0.203125,120,75,139 +0.421875,0.203125,136,73,132 +0.453125,0.203125,136,73,107 +0.484375,0.203125,138,80,88 +0.515625,0.203125,119,102,99 +0.546875,0.203125,115,106,94 +0.578125,0.203125,115,114,94 +0.609375,0.203125,110,117,95 +0.640625,0.203125,96,112,91 +0.671875,0.203125,91,112,92 +0.703125,0.203125,92,113,101 +0.734375,0.203125,96,118,114 +0.765625,0.203125,96,114,118 +0.796875,0.203125,92,100,113 +0.828125,0.203125,91,92,112 +0.859375,0.203125,97,91,112 +0.890625,0.203125,111,96,118 +0.921875,0.203125,115,94,114 +0.953125,0.203125,115,94,105 +0.984375,0.203125,119,99,102 +0.015625,0.171875,122,78,72 +0.046875,0.171875,118,94,64 +0.078125,0.171875,118,114,64 +0.109375,0.171875,102,119,64 +0.140625,0.171875,76,115,62 +0.171875,0.171875,61,114,63 +0.203125,0.171875,62,116,85 +0.234375,0.171875,65,121,110 +0.265625,0.171875,65,109,120 +0.296875,0.171875,62,84,116 +0.328125,0.171875,61,63,114 +0.359375,0.171875,76,61,114 +0.390625,0.171875,102,64,119 +0.421875,0.171875,117,63,114 +0.453125,0.171875,117,63,93 +0.484375,0.171875,122,72,78 +0.515625,0.171875,105,91,88 +0.546875,0.171875,100,92,82 +0.578125,0.171875,100,99,82 +0.609375,0.171875,95,101,83 +0.640625,0.171875,84,97,79 +0.671875,0.171875,79,97,80 +0.703125,0.171875,80,98,88 +0.734375,0.171875,83,102,98 +0.765625,0.171875,83,98,102 +0.796875,0.171875,80,87,98 +0.828125,0.171875,79,80,97 +0.859375,0.171875,84,79,97 +0.890625,0.171875,95,82,101 +0.921875,0.171875,99,81,98 +0.953125,0.171875,99,81,91 +0.984375,0.171875,105,88,90 +0.015625,0.140625,105,68,62 +0.046875,0.140625,99,80,53 +0.078125,0.140625,100,97,54 +0.109375,0.140625,87,101,54 +0.140625,0.140625,64,97,52 +0.171875,0.140625,52,97,54 +0.203125,0.140625,53,98,72 +0.234375,0.140625,55,102,94 +0.265625,0.140625,55,93,102 +0.296875,0.140625,53,71,98 +0.328125,0.140625,52,54,97 +0.359375,0.140625,63,51,96 +0.390625,0.140625,87,54,101 +0.421875,0.140625,99,53,96 +0.453125,0.140625,99,53,79 +0.484375,0.140625,105,62,68 +0.515625,0.140625,91,78,77 +0.546875,0.140625,83,77,68 +0.578125,0.140625,84,83,69 +0.609375,0.140625,80,85,69 +0.640625,0.140625,71,82,67 +0.671875,0.140625,67,82,68 +0.703125,0.140625,68,83,74 +0.734375,0.140625,70,86,83 +0.765625,0.140625,70,83,86 +0.796875,0.140625,68,74,83 +0.828125,0.140625,67,68,82 +0.859375,0.140625,70,66,81 +0.890625,0.140625,80,69,85 +0.921875,0.140625,84,68,83 +0.953125,0.140625,84,68,77 +0.984375,0.140625,91,77,78 +0.015625,0.109375,88,59,54 +0.046875,0.109375,81,65,43 +0.078125,0.109375,83,80,45 +0.109375,0.109375,70,82,44 +0.140625,0.109375,51,79,42 +0.171875,0.109375,42,79,43 +0.203125,0.109375,43,80,58 +0.234375,0.109375,46,84,77 +0.265625,0.109375,45,76,84 +0.296875,0.109375,42,57,79 +0.328125,0.109375,43,44,80 +0.359375,0.109375,52,42,79 +0.390625,0.109375,72,45,83 +0.421875,0.109375,82,44,79 +0.453125,0.109375,81,43,64 +0.484375,0.109375,89,54,58 +0.515625,0.109375,77,67,65 +0.546875,0.109375,69,63,56 +0.578125,0.109375,70,69,57 +0.609375,0.109375,66,70,57 +0.640625,0.109375,58,67,55 +0.671875,0.109375,55,67,55 +0.703125,0.109375,55,67,60 +0.734375,0.109375,58,71,69 +0.765625,0.109375,58,68,71 +0.796875,0.109375,55,60,67 +0.828125,0.109375,55,55,67 +0.859375,0.109375,58,55,67 +0.890625,0.109375,66,57,70 +0.921875,0.109375,70,57,69 +0.953125,0.109375,69,56,63 +0.984375,0.109375,77,65,66 +0.015625,0.078125,72,48,44 +0.046875,0.078125,63,50,34 +0.078125,0.078125,64,62,34 +0.109375,0.078125,55,65,35 +0.140625,0.078125,40,62,33 +0.171875,0.078125,33,62,34 +0.203125,0.078125,33,62,45 +0.234375,0.078125,35,65,60 +0.265625,0.078125,35,59,65 +0.296875,0.078125,33,44,62 +0.328125,0.078125,33,34,62 +0.359375,0.078125,42,34,63 +0.390625,0.078125,56,35,65 +0.421875,0.078125,64,34,62 +0.453125,0.078125,63,34,50 +0.484375,0.078125,72,44,48 +0.515625,0.078125,62,54,53 +0.546875,0.078125,54,50,44 +0.578125,0.078125,54,53,44 +0.609375,0.078125,52,55,45 +0.640625,0.078125,45,53,43 +0.671875,0.078125,42,52,42 +0.703125,0.078125,42,52,46 +0.734375,0.078125,45,55,53 +0.765625,0.078125,45,53,55 +0.796875,0.078125,43,47,53 +0.828125,0.078125,43,43,53 +0.859375,0.078125,46,43,53 +0.890625,0.078125,52,45,55 +0.921875,0.078125,54,44,53 +0.953125,0.078125,54,44,50 +0.984375,0.078125,62,53,54 +0.015625,0.046875,56,39,36 +0.046875,0.046875,45,36,24 +0.078125,0.046875,45,44,25 +0.109375,0.046875,40,47,26 +0.140625,0.046875,29,45,24 +0.171875,0.046875,24,45,25 +0.203125,0.046875,24,45,33 +0.234375,0.046875,26,47,43 +0.265625,0.046875,26,44,48 +0.296875,0.046875,24,32,45 +0.328125,0.046875,24,25,44 +0.359375,0.046875,29,24,45 +0.390625,0.046875,40,25,47 +0.421875,0.046875,46,25,44 +0.453125,0.046875,45,24,35 +0.484375,0.046875,55,36,39 +0.515625,0.046875,49,43,42 +0.546875,0.046875,38,35,31 +0.578125,0.046875,38,38,31 +0.609375,0.046875,38,40,33 +0.640625,0.046875,33,38,31 +0.671875,0.046875,31,38,31 +0.703125,0.046875,31,38,34 +0.734375,0.046875,33,40,39 +0.765625,0.046875,33,39,40 +0.796875,0.046875,31,34,38 +0.828125,0.046875,30,30,37 +0.859375,0.046875,33,31,38 +0.890625,0.046875,37,32,39 +0.921875,0.046875,39,32,38 +0.953125,0.046875,38,31,35 +0.984375,0.046875,48,41,42 +0.015625,0.015625,0,0,0 +0.046875,0.015625,4,4,4 +0.078125,0.015625,9,9,9 +0.109375,0.015625,15,15,15 +0.140625,0.015625,21,21,21 +0.171875,0.015625,28,28,28 +0.203125,0.015625,36,36,36 +0.234375,0.015625,44,44,44 +0.265625,0.015625,52,52,52 +0.296875,0.015625,60,60,60 +0.328125,0.015625,69,69,69 +0.359375,0.015625,79,79,79 +0.390625,0.015625,88,88,88 +0.421875,0.015625,98,98,98 +0.453125,0.015625,108,108,108 +0.484375,0.015625,118,118,118 +0.515625,0.015625,128,128,128 +0.546875,0.015625,137,137,137 +0.578125,0.015625,146,146,146 +0.609375,0.015625,157,157,157 +0.640625,0.015625,167,167,167 +0.671875,0.015625,176,176,176 +0.703125,0.015625,186,186,186 +0.734375,0.015625,195,195,195 +0.765625,0.015625,203,203,203 +0.796875,0.015625,211,211,211 +0.828125,0.015625,218,218,218 +0.859375,0.015625,227,227,227 +0.890625,0.015625,234,234,234 +0.921875,0.015625,239,239,239 +0.953125,0.015625,246,246,246 +0.984375,0.015625,250,250,250 diff --git a/Blender/L1960_Tools/_Source/L1960_Tools_1_8_3/ColorPalette_01.png b/Blender/L1960_Tools/_Source/L1960_Tools_1_8_3/ColorPalette_01.png new file mode 100644 index 0000000..a1bae62 Binary files /dev/null and b/Blender/L1960_Tools/_Source/L1960_Tools_1_8_3/ColorPalette_01.png differ diff --git a/Blender/L1960_Tools/_Source/L1960_Tools_1_8_3/ColorPalette_02.csv b/Blender/L1960_Tools/_Source/L1960_Tools_1_8_3/ColorPalette_02.csv new file mode 100644 index 0000000..fc4857e --- /dev/null +++ b/Blender/L1960_Tools/_Source/L1960_Tools_1_8_3/ColorPalette_02.csv @@ -0,0 +1,1025 @@ +norm_x,norm_y,r,g,b +0.015625,0.984375,239,201,192 +0.046875,0.984375,239,207,192 +0.078125,0.984375,239,211,192 +0.109375,0.984375,239,213,192 +0.140625,0.984375,239,221,192 +0.171875,0.984375,239,232,192 +0.203125,0.984375,239,239,192 +0.234375,0.984375,227,239,192 +0.265625,0.984375,213,239,192 +0.296875,0.984375,193,239,192 +0.328125,0.984375,192,239,207 +0.359375,0.984375,192,239,224 +0.390625,0.984375,192,224,239 +0.421875,0.984375,192,190,239 +0.453125,0.984375,217,190,239 +0.484375,0.984375,239,192,212 +0.515625,0.984375,233,204,198 +0.546875,0.984375,233,208,198 +0.578125,0.984375,233,212,198 +0.609375,0.984375,233,215,198 +0.640625,0.984375,233,219,198 +0.671875,0.984375,233,228,198 +0.703125,0.984375,232,233,198 +0.734375,0.984375,224,233,198 +0.765625,0.984375,215,233,198 +0.796875,0.984375,201,233,198 +0.828125,0.984375,198,233,210 +0.859375,0.984375,198,233,221 +0.890625,0.984375,198,221,233 +0.921875,0.984375,198,198,233 +0.953125,0.984375,217,198,233 +0.984375,0.984375,233,198,213 +0.015625,0.953125,234,178,165 +0.046875,0.953125,234,186,165 +0.078125,0.953125,234,192,165 +0.109375,0.953125,234,197,165 +0.140625,0.953125,234,207,165 +0.171875,0.953125,234,223,165 +0.203125,0.953125,233,234,165 +0.234375,0.953125,215,234,165 +0.265625,0.953125,198,234,165 +0.296875,0.953125,167,234,165 +0.328125,0.953125,165,234,188 +0.359375,0.953125,165,234,211 +0.390625,0.953125,165,210,234 +0.421875,0.953125,166,165,234 +0.453125,0.953125,201,165,234 +0.484375,0.953125,234,165,195 +0.515625,0.953125,224,184,175 +0.546875,0.953125,224,190,175 +0.578125,0.953125,224,193,175 +0.609375,0.953125,224,198,175 +0.640625,0.953125,224,204,175 +0.671875,0.953125,224,216,175 +0.703125,0.953125,223,224,176 +0.734375,0.953125,211,224,175 +0.765625,0.953125,198,224,175 +0.796875,0.953125,177,224,175 +0.828125,0.953125,175,224,190 +0.859375,0.953125,175,224,207 +0.890625,0.953125,175,207,224 +0.921875,0.953125,175,175,224 +0.953125,0.953125,201,175,224 +0.984375,0.953125,224,175,197 +0.015625,0.921875,225,146,129 +0.046875,0.921875,226,160,131 +0.078125,0.921875,226,167,131 +0.109375,0.921875,226,175,131 +0.140625,0.921875,226,188,131 +0.171875,0.921875,226,212,131 +0.203125,0.921875,223,225,129 +0.234375,0.921875,200,226,131 +0.265625,0.921875,175,225,129 +0.296875,0.921875,134,226,131 +0.328125,0.921875,131,226,160 +0.359375,0.921875,129,225,192 +0.390625,0.921875,131,193,226 +0.421875,0.921875,131,131,226 +0.453125,0.921875,182,131,226 +0.484375,0.921875,226,131,173 +0.515625,0.921875,212,157,144 +0.546875,0.921875,212,164,144 +0.578125,0.921875,212,171,144 +0.609375,0.921875,211,175,143 +0.640625,0.921875,211,185,143 +0.671875,0.921875,211,201,143 +0.703125,0.921875,210,211,143 +0.734375,0.921875,193,211,143 +0.765625,0.921875,175,212,144 +0.796875,0.921875,146,212,144 +0.828125,0.921875,143,211,166 +0.859375,0.921875,144,212,188 +0.890625,0.921875,144,188,212 +0.921875,0.921875,143,144,211 +0.953125,0.921875,180,143,211 +0.984375,0.921875,212,144,174 +0.015625,0.890625,217,116,95 +0.046875,0.890625,217,131,93 +0.078125,0.890625,217,143,93 +0.109375,0.890625,217,152,95 +0.140625,0.890625,217,170,95 +0.171875,0.890625,217,198,95 +0.203125,0.890625,215,217,95 +0.234375,0.890625,182,217,95 +0.265625,0.890625,152,217,95 +0.296875,0.890625,99,217,95 +0.328125,0.890625,95,217,135 +0.359375,0.890625,95,217,175 +0.390625,0.890625,93,175,217 +0.421875,0.890625,93,94,217 +0.453125,0.890625,160,93,217 +0.484375,0.890625,217,95,149 +0.515625,0.890625,200,129,113 +0.546875,0.890625,200,140,113 +0.578125,0.890625,200,146,113 +0.609375,0.890625,200,153,113 +0.640625,0.890625,200,166,113 +0.671875,0.890625,200,186,113 +0.703125,0.890625,198,200,113 +0.734375,0.890625,176,200,113 +0.765625,0.890625,153,200,113 +0.796875,0.890625,117,200,113 +0.828125,0.890625,111,198,140 +0.859375,0.890625,113,200,170 +0.890625,0.890625,113,170,200 +0.921875,0.890625,113,113,200 +0.953125,0.890625,160,113,200 +0.984375,0.890625,200,113,152 +0.015625,0.859375,211,94,68 +0.046875,0.859375,211,110,66 +0.078125,0.859375,211,125,68 +0.109375,0.859375,211,134,66 +0.140625,0.859375,211,155,66 +0.171875,0.859375,211,188,66 +0.203125,0.859375,208,211,66 +0.234375,0.859375,171,211,66 +0.265625,0.859375,134,211,66 +0.296875,0.859375,73,211,66 +0.328125,0.859375,68,211,114 +0.359375,0.859375,66,211,162 +0.390625,0.859375,68,162,211 +0.421875,0.859375,66,66,211 +0.453125,0.859375,144,66,211 +0.484375,0.859375,211,66,131 +0.515625,0.859375,190,106,87 +0.546875,0.859375,190,119,88 +0.578125,0.859375,190,128,87 +0.609375,0.859375,190,135,87 +0.640625,0.859375,190,150,87 +0.671875,0.859375,190,174,87 +0.703125,0.859375,188,190,87 +0.734375,0.859375,162,190,88 +0.765625,0.859375,136,190,87 +0.796875,0.859375,93,190,87 +0.828125,0.859375,87,190,121 +0.859375,0.859375,88,190,155 +0.890625,0.859375,88,155,190 +0.921875,0.859375,88,87,190 +0.953125,0.859375,143,87,190 +0.984375,0.859375,190,87,133 +0.015625,0.828125,198,75,46 +0.046875,0.828125,198,92,46 +0.078125,0.828125,198,107,46 +0.109375,0.828125,198,117,46 +0.140625,0.828125,198,139,46 +0.171875,0.828125,198,174,46 +0.203125,0.828125,195,198,46 +0.234375,0.828125,156,198,46 +0.265625,0.828125,117,198,46 +0.296875,0.828125,53,198,46 +0.328125,0.828125,46,198,96 +0.359375,0.828125,46,198,146 +0.390625,0.828125,46,146,198 +0.421875,0.828125,46,46,198 +0.453125,0.828125,128,46,198 +0.484375,0.828125,198,46,114 +0.515625,0.828125,176,88,68 +0.546875,0.828125,176,101,68 +0.578125,0.828125,176,111,68 +0.609375,0.828125,176,119,68 +0.640625,0.828125,176,134,68 +0.671875,0.828125,176,159,68 +0.703125,0.828125,174,177,68 +0.734375,0.828125,146,176,68 +0.765625,0.828125,119,177,68 +0.796875,0.828125,73,176,68 +0.828125,0.828125,68,177,103 +0.859375,0.828125,68,176,139 +0.890625,0.828125,68,139,176 +0.921875,0.828125,68,68,177 +0.953125,0.828125,126,68,176 +0.984375,0.828125,176,68,116 +0.015625,0.796875,173,65,40 +0.046875,0.796875,173,80,40 +0.078125,0.796875,173,93,40 +0.109375,0.796875,172,102,40 +0.140625,0.796875,173,121,40 +0.171875,0.796875,173,152,40 +0.203125,0.796875,171,172,40 +0.234375,0.796875,136,173,40 +0.265625,0.796875,102,173,40 +0.296875,0.796875,46,172,40 +0.328125,0.796875,40,173,83 +0.359375,0.796875,40,173,127 +0.390625,0.796875,40,127,172 +0.421875,0.796875,40,40,173 +0.453125,0.796875,111,40,172 +0.484375,0.796875,172,40,99 +0.515625,0.796875,153,78,60 +0.546875,0.796875,153,88,60 +0.578125,0.796875,153,97,59 +0.609375,0.796875,153,104,60 +0.640625,0.796875,153,117,60 +0.671875,0.796875,153,139,60 +0.703125,0.796875,152,153,59 +0.734375,0.796875,128,153,60 +0.765625,0.796875,103,153,59 +0.796875,0.796875,64,153,60 +0.828125,0.796875,59,153,90 +0.859375,0.796875,60,153,121 +0.890625,0.796875,59,121,153 +0.921875,0.796875,59,59,153 +0.953125,0.796875,110,59,153 +0.984375,0.796875,153,59,101 +0.015625,0.765625,150,57,35 +0.046875,0.765625,150,70,35 +0.078125,0.765625,150,81,35 +0.109375,0.765625,150,90,35 +0.140625,0.765625,150,106,35 +0.171875,0.765625,150,134,35 +0.203125,0.765625,150,150,35 +0.234375,0.765625,119,152,35 +0.265625,0.765625,90,150,35 +0.296875,0.765625,40,152,35 +0.328125,0.765625,35,150,73 +0.359375,0.765625,35,152,111 +0.390625,0.765625,35,112,150 +0.421875,0.765625,35,35,150 +0.453125,0.765625,98,35,150 +0.484375,0.765625,150,35,87 +0.515625,0.765625,135,67,52 +0.546875,0.765625,134,77,52 +0.578125,0.765625,134,84,52 +0.609375,0.765625,134,91,52 +0.640625,0.765625,134,102,52 +0.671875,0.765625,134,122,52 +0.703125,0.765625,134,134,52 +0.734375,0.765625,112,134,52 +0.765625,0.765625,91,134,52 +0.796875,0.765625,56,135,52 +0.828125,0.765625,52,134,79 +0.859375,0.765625,52,134,106 +0.890625,0.765625,52,106,134 +0.921875,0.765625,52,52,134 +0.953125,0.765625,97,52,134 +0.984375,0.765625,134,52,89 +0.015625,0.734375,129,49,30 +0.046875,0.734375,131,60,30 +0.078125,0.734375,131,70,30 +0.109375,0.734375,129,77,30 +0.140625,0.734375,131,91,30 +0.171875,0.734375,129,114,30 +0.203125,0.734375,127,129,30 +0.234375,0.734375,102,129,30 +0.265625,0.734375,77,129,30 +0.296875,0.734375,35,129,30 +0.328125,0.734375,30,129,62 +0.359375,0.734375,30,129,95 +0.390625,0.734375,30,96,129 +0.421875,0.734375,30,30,131 +0.453125,0.734375,84,30,131 +0.484375,0.734375,129,30,74 +0.515625,0.734375,115,57,44 +0.546875,0.734375,115,66,44 +0.578125,0.734375,115,72,44 +0.609375,0.734375,117,78,45 +0.640625,0.734375,115,88,44 +0.671875,0.734375,115,104,44 +0.703125,0.734375,115,117,45 +0.734375,0.734375,97,117,45 +0.765625,0.734375,78,115,44 +0.796875,0.734375,48,115,44 +0.828125,0.734375,44,115,67 +0.859375,0.734375,45,117,92 +0.890625,0.734375,44,90,115 +0.921875,0.734375,44,44,115 +0.953125,0.734375,83,44,115 +0.984375,0.734375,115,44,76 +0.015625,0.703125,110,42,26 +0.046875,0.703125,110,52,26 +0.078125,0.703125,110,59,26 +0.109375,0.703125,110,65,26 +0.140625,0.703125,110,77,26 +0.171875,0.703125,110,97,26 +0.203125,0.703125,108,110,26 +0.234375,0.703125,87,110,26 +0.265625,0.703125,65,110,26 +0.296875,0.703125,30,110,26 +0.328125,0.703125,26,110,54 +0.359375,0.703125,26,110,81 +0.390625,0.703125,26,81,110 +0.421875,0.703125,26,26,110 +0.453125,0.703125,72,26,110 +0.484375,0.703125,110,26,63 +0.515625,0.703125,98,49,38 +0.546875,0.703125,98,57,38 +0.578125,0.703125,98,62,38 +0.609375,0.703125,98,66,38 +0.640625,0.703125,98,75,38 +0.671875,0.703125,98,89,38 +0.703125,0.703125,97,98,38 +0.734375,0.703125,82,98,38 +0.765625,0.703125,66,98,38 +0.796875,0.703125,41,98,38 +0.828125,0.703125,38,98,58 +0.859375,0.703125,38,98,78 +0.890625,0.703125,38,78,98 +0.921875,0.703125,38,38,98 +0.953125,0.703125,71,38,98 +0.984375,0.703125,98,38,65 +0.015625,0.671875,91,34,21 +0.046875,0.671875,91,42,21 +0.078125,0.671875,92,49,21 +0.109375,0.671875,91,54,21 +0.140625,0.671875,91,64,21 +0.171875,0.671875,92,80,21 +0.203125,0.671875,91,92,21 +0.234375,0.671875,73,92,21 +0.265625,0.671875,55,91,21 +0.296875,0.671875,24,92,21 +0.328125,0.671875,21,92,45 +0.359375,0.671875,21,91,68 +0.390625,0.671875,21,67,91 +0.421875,0.671875,21,21,91 +0.453125,0.671875,59,21,92 +0.484375,0.671875,92,21,53 +0.515625,0.671875,82,41,32 +0.546875,0.671875,82,47,32 +0.578125,0.671875,82,52,32 +0.609375,0.671875,80,55,31 +0.640625,0.671875,82,63,32 +0.671875,0.671875,80,73,31 +0.703125,0.671875,79,80,31 +0.734375,0.671875,67,80,31 +0.765625,0.671875,55,80,31 +0.796875,0.671875,33,80,31 +0.828125,0.671875,32,82,48 +0.859375,0.671875,32,82,65 +0.890625,0.671875,32,65,82 +0.921875,0.671875,31,31,80 +0.953125,0.671875,58,31,80 +0.984375,0.671875,80,31,53 +0.015625,0.640625,74,27,17 +0.046875,0.640625,74,34,17 +0.078125,0.640625,74,40,17 +0.109375,0.640625,74,43,17 +0.140625,0.640625,74,52,17 +0.171875,0.640625,74,65,17 +0.203125,0.640625,73,74,17 +0.234375,0.640625,58,74,17 +0.265625,0.640625,45,76,18 +0.296875,0.640625,19,74,17 +0.328125,0.640625,17,74,35 +0.359375,0.640625,17,74,55 +0.390625,0.640625,17,55,74 +0.421875,0.640625,17,17,74 +0.453125,0.640625,48,17,74 +0.484375,0.640625,74,17,42 +0.515625,0.640625,66,33,25 +0.546875,0.640625,66,37,25 +0.578125,0.640625,66,41,25 +0.609375,0.640625,66,44,25 +0.640625,0.640625,67,50,26 +0.671875,0.640625,66,60,25 +0.703125,0.640625,65,66,25 +0.734375,0.640625,55,66,25 +0.765625,0.640625,44,66,25 +0.796875,0.640625,27,66,25 +0.828125,0.640625,26,67,39 +0.859375,0.640625,25,66,52 +0.890625,0.640625,25,52,66 +0.921875,0.640625,25,25,66 +0.953125,0.640625,47,25,66 +0.984375,0.640625,66,25,43 +0.015625,0.609375,61,23,14 +0.046875,0.609375,61,28,14 +0.078125,0.609375,61,33,14 +0.109375,0.609375,61,36,14 +0.140625,0.609375,61,42,14 +0.171875,0.609375,61,53,14 +0.203125,0.609375,60,61,14 +0.234375,0.609375,48,61,14 +0.265625,0.609375,36,61,14 +0.296875,0.609375,16,61,14 +0.328125,0.609375,14,61,29 +0.359375,0.609375,14,61,45 +0.390625,0.609375,14,45,61 +0.421875,0.609375,14,14,61 +0.453125,0.609375,39,14,61 +0.484375,0.609375,61,14,35 +0.515625,0.609375,55,27,21 +0.546875,0.609375,55,31,21 +0.578125,0.609375,55,34,21 +0.609375,0.609375,55,37,21 +0.640625,0.609375,55,41,21 +0.671875,0.609375,55,50,21 +0.703125,0.609375,54,55,21 +0.734375,0.609375,46,55,21 +0.765625,0.609375,37,55,21 +0.796875,0.609375,23,55,21 +0.828125,0.609375,21,55,32 +0.859375,0.609375,21,55,43 +0.890625,0.609375,21,43,55 +0.921875,0.609375,21,21,55 +0.953125,0.609375,39,21,55 +0.984375,0.609375,55,21,36 +0.015625,0.578125,48,18,11 +0.046875,0.578125,50,22,11 +0.078125,0.578125,50,27,11 +0.109375,0.578125,50,29,11 +0.140625,0.578125,50,35,11 +0.171875,0.578125,50,44,11 +0.203125,0.578125,49,50,11 +0.234375,0.578125,39,50,11 +0.265625,0.578125,29,48,11 +0.296875,0.578125,13,50,11 +0.328125,0.578125,11,50,23 +0.359375,0.578125,11,48,36 +0.390625,0.578125,11,37,50 +0.421875,0.578125,11,11,50 +0.453125,0.578125,32,11,50 +0.484375,0.578125,50,11,29 +0.515625,0.578125,43,22,17 +0.546875,0.578125,44,25,17 +0.578125,0.578125,43,27,17 +0.609375,0.578125,44,30,17 +0.640625,0.578125,44,33,17 +0.671875,0.578125,43,40,17 +0.703125,0.578125,42,43,17 +0.734375,0.578125,36,43,17 +0.765625,0.578125,30,44,17 +0.796875,0.578125,18,43,17 +0.828125,0.578125,17,44,26 +0.859375,0.578125,17,43,35 +0.890625,0.578125,17,35,44 +0.921875,0.578125,17,17,43 +0.953125,0.578125,31,17,44 +0.984375,0.578125,44,17,29 +0.015625,0.546875,39,15,9 +0.046875,0.546875,40,18,9 +0.078125,0.546875,39,21,9 +0.109375,0.546875,40,24,9 +0.140625,0.546875,40,27,9 +0.171875,0.546875,39,35,9 +0.203125,0.546875,38,39,9 +0.234375,0.546875,31,40,9 +0.265625,0.546875,24,40,9 +0.296875,0.546875,10,39,9 +0.328125,0.546875,9,40,19 +0.359375,0.546875,9,39,30 +0.390625,0.546875,9,29,40 +0.421875,0.546875,9,9,39 +0.453125,0.546875,25,9,40 +0.484375,0.546875,39,9,22 +0.515625,0.546875,36,18,14 +0.546875,0.546875,34,20,13 +0.578125,0.546875,34,22,13 +0.609375,0.546875,36,24,14 +0.640625,0.546875,36,27,14 +0.671875,0.546875,34,31,13 +0.703125,0.546875,35,36,14 +0.734375,0.546875,29,36,14 +0.765625,0.546875,23,34,13 +0.796875,0.546875,14,34,13 +0.828125,0.546875,14,36,21 +0.859375,0.546875,14,36,28 +0.890625,0.546875,13,27,34 +0.921875,0.546875,13,13,34 +0.953125,0.546875,24,13,34 +0.984375,0.546875,36,14,23 +0.015625,0.515625,31,11,7 +0.046875,0.515625,31,15,7 +0.078125,0.515625,31,16,7 +0.109375,0.515625,31,18,7 +0.140625,0.515625,32,21,7 +0.171875,0.515625,32,27,7 +0.203125,0.515625,32,31,7 +0.234375,0.515625,25,31,7 +0.265625,0.515625,18,31,7 +0.296875,0.515625,8,31,7 +0.328125,0.515625,7,32,15 +0.359375,0.515625,7,31,23 +0.390625,0.515625,7,23,31 +0.421875,0.515625,7,7,31 +0.453125,0.515625,21,7,31 +0.484375,0.515625,31,7,18 +0.515625,0.515625,27,13,10 +0.546875,0.515625,29,16,11 +0.578125,0.515625,27,17,10 +0.609375,0.515625,27,18,10 +0.640625,0.515625,27,20,10 +0.671875,0.515625,27,24,10 +0.703125,0.515625,27,27,10 +0.734375,0.515625,22,27,10 +0.765625,0.515625,18,27,10 +0.796875,0.515625,11,27,10 +0.828125,0.515625,10,27,16 +0.859375,0.515625,10,27,21 +0.890625,0.515625,10,21,27 +0.921875,0.515625,10,10,27 +0.953125,0.515625,20,11,29 +0.984375,0.515625,27,10,18 +0.015625,0.484375,226,207,204 +0.046875,0.484375,226,211,204 +0.078125,0.484375,227,213,204 +0.109375,0.484375,227,215,204 +0.140625,0.484375,226,217,204 +0.171875,0.484375,226,223,204 +0.203125,0.484375,227,227,204 +0.234375,0.484375,221,227,204 +0.265625,0.484375,213,226,204 +0.296875,0.484375,206,227,204 +0.328125,0.484375,204,226,211 +0.359375,0.484375,204,227,218 +0.390625,0.484375,204,217,226 +0.421875,0.484375,204,204,226 +0.453125,0.484375,217,204,227 +0.484375,0.484375,226,204,213 +0.515625,0.484375,221,212,211 +0.546875,0.484375,221,213,211 +0.578125,0.484375,219,213,210 +0.609375,0.484375,219,215,210 +0.640625,0.484375,221,217,211 +0.671875,0.484375,219,217,210 +0.703125,0.484375,221,221,211 +0.734375,0.484375,217,221,211 +0.765625,0.484375,216,221,211 +0.796875,0.484375,211,219,210 +0.828125,0.484375,210,219,212 +0.859375,0.484375,210,219,217 +0.890625,0.484375,210,217,219 +0.921875,0.484375,210,210,219 +0.953125,0.484375,215,210,219 +0.984375,0.484375,219,210,213 +0.015625,0.453125,212,187,181 +0.046875,0.453125,212,190,181 +0.078125,0.453125,212,193,181 +0.109375,0.453125,212,195,181 +0.140625,0.453125,212,200,181 +0.171875,0.453125,212,207,181 +0.203125,0.453125,212,212,181 +0.234375,0.453125,204,212,181 +0.265625,0.453125,195,212,181 +0.296875,0.453125,182,212,181 +0.328125,0.453125,181,212,190 +0.359375,0.453125,181,212,201 +0.390625,0.453125,181,201,212 +0.421875,0.453125,181,181,212 +0.453125,0.453125,198,181,212 +0.484375,0.453125,212,181,195 +0.515625,0.453125,206,193,190 +0.546875,0.453125,206,195,190 +0.578125,0.453125,204,195,190 +0.609375,0.453125,204,197,190 +0.640625,0.453125,204,198,190 +0.671875,0.453125,204,203,190 +0.703125,0.453125,204,204,190 +0.734375,0.453125,201,204,190 +0.765625,0.453125,197,204,190 +0.796875,0.453125,190,204,190 +0.828125,0.453125,190,206,195 +0.859375,0.453125,190,204,200 +0.890625,0.453125,190,200,204 +0.921875,0.453125,190,190,204 +0.953125,0.453125,198,190,204 +0.984375,0.453125,204,190,197 +0.015625,0.421875,197,160,152 +0.046875,0.421875,197,165,152 +0.078125,0.421875,195,169,150 +0.109375,0.421875,197,173,152 +0.140625,0.421875,197,179,152 +0.171875,0.421875,195,188,150 +0.203125,0.421875,195,197,152 +0.234375,0.421875,185,197,152 +0.265625,0.421875,172,195,150 +0.296875,0.421875,153,197,152 +0.328125,0.421875,152,197,167 +0.359375,0.421875,152,197,182 +0.390625,0.421875,150,180,195 +0.421875,0.421875,152,152,197 +0.453125,0.421875,176,152,197 +0.484375,0.421875,195,150,171 +0.515625,0.421875,185,167,164 +0.546875,0.421875,185,170,164 +0.578125,0.421875,185,172,164 +0.609375,0.421875,184,172,162 +0.640625,0.421875,185,177,164 +0.671875,0.421875,185,182,164 +0.703125,0.421875,184,184,162 +0.734375,0.421875,178,184,162 +0.765625,0.421875,174,185,164 +0.796875,0.421875,165,185,164 +0.828125,0.421875,164,185,171 +0.859375,0.421875,164,185,178 +0.890625,0.421875,164,178,185 +0.921875,0.421875,164,164,185 +0.953125,0.421875,175,164,185 +0.984375,0.421875,184,162,172 +0.015625,0.390625,181,133,123 +0.046875,0.390625,181,141,123 +0.078125,0.390625,181,146,123 +0.109375,0.390625,181,150,123 +0.140625,0.390625,181,158,123 +0.171875,0.390625,181,172,123 +0.203125,0.390625,180,181,123 +0.234375,0.390625,164,180,122 +0.265625,0.390625,150,181,123 +0.296875,0.390625,126,181,123 +0.328125,0.390625,123,181,141 +0.359375,0.390625,123,181,160 +0.390625,0.390625,123,160,181 +0.421875,0.390625,122,122,180 +0.453125,0.390625,153,123,181 +0.484375,0.390625,181,123,149 +0.515625,0.390625,166,144,139 +0.546875,0.390625,166,146,139 +0.578125,0.390625,166,150,139 +0.609375,0.390625,165,150,138 +0.640625,0.390625,165,153,138 +0.671875,0.390625,165,160,138 +0.703125,0.390625,166,166,139 +0.734375,0.390625,159,166,139 +0.765625,0.390625,150,166,139 +0.796875,0.390625,140,165,138 +0.828125,0.390625,139,166,148 +0.859375,0.390625,139,166,157 +0.890625,0.390625,138,156,165 +0.921875,0.390625,138,138,165 +0.953125,0.390625,153,138,165 +0.984375,0.390625,165,138,150 +0.015625,0.359375,167,112,99 +0.046875,0.359375,167,120,99 +0.078125,0.359375,167,126,99 +0.109375,0.359375,167,131,99 +0.140625,0.359375,167,140,99 +0.171875,0.359375,167,156,99 +0.203125,0.359375,166,167,99 +0.234375,0.359375,148,167,99 +0.265625,0.359375,131,167,99 +0.296875,0.359375,103,167,99 +0.328125,0.359375,100,167,122 +0.359375,0.359375,99,167,144 +0.390625,0.359375,99,144,167 +0.421875,0.359375,99,99,167 +0.453125,0.359375,136,99,167 +0.484375,0.359375,167,99,129 +0.515625,0.359375,149,123,117 +0.546875,0.359375,149,127,117 +0.578125,0.359375,149,130,117 +0.609375,0.359375,149,132,117 +0.640625,0.359375,149,136,117 +0.671875,0.359375,149,144,117 +0.703125,0.359375,148,149,117 +0.734375,0.359375,140,149,117 +0.765625,0.359375,132,149,117 +0.796875,0.359375,118,149,117 +0.828125,0.359375,117,149,127 +0.859375,0.359375,117,149,138 +0.890625,0.359375,117,138,149 +0.921875,0.359375,117,117,149 +0.953125,0.359375,134,117,149 +0.984375,0.359375,149,117,131 +0.015625,0.328125,148,95,83 +0.046875,0.328125,148,103,83 +0.078125,0.328125,148,109,83 +0.109375,0.328125,148,114,83 +0.140625,0.328125,148,123,83 +0.171875,0.328125,148,138,83 +0.203125,0.328125,148,150,84 +0.234375,0.328125,130,148,83 +0.265625,0.328125,113,148,83 +0.296875,0.328125,86,148,83 +0.328125,0.328125,84,150,105 +0.359375,0.328125,83,148,126 +0.390625,0.328125,83,126,148 +0.421875,0.328125,83,83,148 +0.453125,0.328125,119,84,150 +0.484375,0.328125,148,83,112 +0.515625,0.328125,131,106,100 +0.546875,0.328125,132,110,101 +0.578125,0.328125,131,112,100 +0.609375,0.328125,131,115,100 +0.640625,0.328125,132,120,101 +0.671875,0.328125,131,126,100 +0.703125,0.328125,131,131,100 +0.734375,0.328125,123,132,101 +0.765625,0.328125,115,131,100 +0.796875,0.328125,101,131,100 +0.828125,0.328125,100,131,110 +0.859375,0.328125,101,132,121 +0.890625,0.328125,100,120,131 +0.921875,0.328125,101,101,132 +0.953125,0.328125,118,101,132 +0.984375,0.328125,132,101,115 +0.015625,0.296875,128,82,72 +0.046875,0.296875,129,89,72 +0.078125,0.296875,128,94,72 +0.109375,0.296875,129,98,72 +0.140625,0.296875,129,107,72 +0.171875,0.296875,128,120,72 +0.203125,0.296875,128,128,72 +0.234375,0.296875,113,128,72 +0.265625,0.296875,98,128,72 +0.296875,0.296875,74,128,72 +0.328125,0.296875,72,128,91 +0.359375,0.296875,72,129,109 +0.390625,0.296875,72,109,129 +0.421875,0.296875,72,72,128 +0.453125,0.296875,103,72,129 +0.484375,0.296875,129,72,97 +0.515625,0.296875,113,91,86 +0.546875,0.296875,114,95,87 +0.578125,0.296875,114,98,87 +0.609375,0.296875,113,99,86 +0.640625,0.296875,113,103,86 +0.671875,0.296875,114,109,87 +0.703125,0.296875,114,114,87 +0.734375,0.296875,106,114,87 +0.765625,0.296875,99,113,86 +0.796875,0.296875,88,114,87 +0.828125,0.296875,87,114,96 +0.859375,0.296875,86,113,104 +0.890625,0.296875,86,104,113 +0.921875,0.296875,87,87,114 +0.953125,0.296875,101,87,114 +0.984375,0.296875,114,87,99 +0.015625,0.265625,110,71,62 +0.046875,0.265625,111,77,62 +0.078125,0.265625,111,82,62 +0.109375,0.265625,111,85,62 +0.140625,0.265625,111,92,62 +0.171875,0.265625,111,103,62 +0.203125,0.265625,110,111,62 +0.234375,0.265625,97,110,62 +0.265625,0.265625,85,111,62 +0.296875,0.265625,64,111,62 +0.328125,0.265625,62,111,78 +0.359375,0.265625,62,111,94 +0.390625,0.265625,62,94,110 +0.421875,0.265625,62,62,111 +0.453125,0.265625,88,62,111 +0.484375,0.265625,110,62,84 +0.515625,0.265625,98,79,75 +0.546875,0.265625,97,81,74 +0.578125,0.265625,98,84,75 +0.609375,0.265625,98,86,75 +0.640625,0.265625,98,89,75 +0.671875,0.265625,98,94,75 +0.703125,0.265625,98,98,75 +0.734375,0.265625,92,98,75 +0.765625,0.265625,86,98,75 +0.796875,0.265625,76,98,75 +0.828125,0.265625,75,98,83 +0.859375,0.265625,75,98,90 +0.890625,0.265625,75,90,98 +0.921875,0.265625,74,74,97 +0.953125,0.265625,87,75,98 +0.984375,0.265625,98,75,85 +0.015625,0.234375,95,61,53 +0.046875,0.234375,93,65,52 +0.078125,0.234375,93,68,52 +0.109375,0.234375,93,71,52 +0.140625,0.234375,95,79,53 +0.171875,0.234375,93,87,52 +0.203125,0.234375,92,93,52 +0.234375,0.234375,82,93,52 +0.265625,0.234375,71,93,52 +0.296875,0.234375,54,93,52 +0.328125,0.234375,52,93,65 +0.359375,0.234375,52,93,79 +0.390625,0.234375,53,80,95 +0.421875,0.234375,53,53,95 +0.453125,0.234375,74,52,93 +0.484375,0.234375,93,52,70 +0.515625,0.234375,82,66,63 +0.546875,0.234375,84,70,64 +0.578125,0.234375,82,70,63 +0.609375,0.234375,84,73,64 +0.640625,0.234375,82,75,63 +0.671875,0.234375,82,79,63 +0.703125,0.234375,82,82,63 +0.734375,0.234375,77,82,63 +0.765625,0.234375,72,82,63 +0.796875,0.234375,65,84,64 +0.828125,0.234375,63,82,69 +0.859375,0.234375,63,82,76 +0.890625,0.234375,63,75,82 +0.921875,0.234375,63,63,82 +0.953125,0.234375,75,64,84 +0.984375,0.234375,82,63,72 +0.015625,0.203125,78,50,44 +0.046875,0.203125,77,53,43 +0.078125,0.203125,78,58,44 +0.109375,0.203125,78,60,44 +0.140625,0.203125,78,65,44 +0.171875,0.203125,78,73,44 +0.203125,0.203125,77,78,44 +0.234375,0.203125,68,78,44 +0.265625,0.203125,60,78,44 +0.296875,0.203125,46,78,44 +0.328125,0.203125,43,77,54 +0.359375,0.203125,44,78,66 +0.390625,0.203125,44,66,78 +0.421875,0.203125,44,44,78 +0.453125,0.203125,62,43,77 +0.484375,0.203125,77,43,58 +0.515625,0.203125,68,55,52 +0.546875,0.203125,69,58,53 +0.578125,0.203125,69,59,53 +0.609375,0.203125,69,60,53 +0.640625,0.203125,69,63,53 +0.671875,0.203125,69,66,53 +0.703125,0.203125,69,69,53 +0.734375,0.203125,65,69,53 +0.765625,0.203125,60,69,53 +0.796875,0.203125,54,69,53 +0.828125,0.203125,53,69,58 +0.859375,0.203125,52,68,62 +0.890625,0.203125,52,63,68 +0.921875,0.203125,52,52,68 +0.953125,0.203125,62,53,69 +0.984375,0.203125,69,53,60 +0.015625,0.171875,64,41,36 +0.046875,0.171875,63,44,35 +0.078125,0.171875,63,46,35 +0.109375,0.171875,63,48,35 +0.140625,0.171875,63,52,35 +0.171875,0.171875,63,59,35 +0.203125,0.171875,63,63,35 +0.234375,0.171875,55,63,35 +0.265625,0.171875,48,63,35 +0.296875,0.171875,36,63,35 +0.328125,0.171875,35,63,44 +0.359375,0.171875,35,63,53 +0.390625,0.171875,35,53,63 +0.421875,0.171875,36,36,64 +0.453125,0.171875,50,35,63 +0.484375,0.171875,63,35,47 +0.515625,0.171875,55,44,42 +0.546875,0.171875,55,46,42 +0.578125,0.171875,55,47,42 +0.609375,0.171875,55,48,42 +0.640625,0.171875,55,50,42 +0.671875,0.171875,55,53,42 +0.703125,0.171875,55,55,42 +0.734375,0.171875,51,55,42 +0.765625,0.171875,48,55,42 +0.796875,0.171875,43,55,42 +0.828125,0.171875,42,55,46 +0.859375,0.171875,42,55,51 +0.890625,0.171875,42,51,55 +0.921875,0.171875,42,42,55 +0.953125,0.171875,49,42,55 +0.984375,0.171875,55,42,48 +0.015625,0.140625,51,33,29 +0.046875,0.140625,51,36,29 +0.078125,0.140625,51,38,29 +0.109375,0.140625,51,39,29 +0.140625,0.140625,51,42,29 +0.171875,0.140625,51,47,29 +0.203125,0.140625,50,51,29 +0.234375,0.140625,44,50,28 +0.265625,0.140625,39,51,29 +0.296875,0.140625,30,51,29 +0.328125,0.140625,29,51,36 +0.359375,0.140625,29,51,44 +0.390625,0.140625,29,44,51 +0.421875,0.140625,29,29,51 +0.453125,0.140625,40,28,50 +0.484375,0.140625,50,28,38 +0.515625,0.140625,45,36,34 +0.546875,0.140625,45,37,34 +0.578125,0.140625,45,38,34 +0.609375,0.140625,44,39,34 +0.640625,0.140625,45,41,34 +0.671875,0.140625,45,43,34 +0.703125,0.140625,45,45,34 +0.734375,0.140625,42,45,34 +0.765625,0.140625,39,44,34 +0.796875,0.140625,35,45,34 +0.828125,0.140625,34,44,37 +0.859375,0.140625,34,44,41 +0.890625,0.140625,34,41,45 +0.921875,0.140625,34,34,45 +0.953125,0.140625,40,34,45 +0.984375,0.140625,45,34,39 +0.015625,0.109375,41,26,23 +0.046875,0.109375,41,29,23 +0.078125,0.109375,41,30,23 +0.109375,0.109375,41,31,23 +0.140625,0.109375,39,33,22 +0.171875,0.109375,41,38,23 +0.203125,0.109375,40,40,22 +0.234375,0.109375,36,41,23 +0.265625,0.109375,31,41,23 +0.296875,0.109375,24,41,23 +0.328125,0.109375,23,41,29 +0.359375,0.109375,23,41,35 +0.390625,0.109375,23,35,41 +0.421875,0.109375,23,23,41 +0.453125,0.109375,32,23,41 +0.484375,0.109375,41,23,31 +0.515625,0.109375,36,29,28 +0.546875,0.109375,36,30,28 +0.578125,0.109375,36,31,28 +0.609375,0.109375,36,32,28 +0.640625,0.109375,35,32,27 +0.671875,0.109375,36,35,28 +0.703125,0.109375,36,36,28 +0.734375,0.109375,34,36,28 +0.765625,0.109375,32,36,28 +0.796875,0.109375,28,36,28 +0.828125,0.109375,27,35,30 +0.859375,0.109375,28,36,33 +0.890625,0.109375,28,33,36 +0.921875,0.109375,28,28,36 +0.953125,0.109375,32,28,36 +0.984375,0.109375,36,28,32 +0.015625,0.078125,32,21,18 +0.046875,0.078125,32,22,18 +0.078125,0.078125,32,24,18 +0.109375,0.078125,32,25,18 +0.140625,0.078125,32,27,18 +0.171875,0.078125,32,30,18 +0.203125,0.078125,32,32,18 +0.234375,0.078125,28,32,18 +0.265625,0.078125,25,32,18 +0.296875,0.078125,19,32,18 +0.328125,0.078125,18,33,23 +0.359375,0.078125,18,32,27 +0.390625,0.078125,18,27,32 +0.421875,0.078125,18,18,32 +0.453125,0.078125,26,18,32 +0.484375,0.078125,32,18,24 +0.515625,0.078125,28,22,21 +0.546875,0.078125,28,23,21 +0.578125,0.078125,28,24,21 +0.609375,0.078125,28,24,21 +0.640625,0.078125,28,25,21 +0.671875,0.078125,28,27,21 +0.703125,0.078125,28,28,21 +0.734375,0.078125,26,28,21 +0.765625,0.078125,24,28,21 +0.796875,0.078125,21,28,21 +0.828125,0.078125,21,28,23 +0.859375,0.078125,21,28,26 +0.890625,0.078125,21,26,28 +0.921875,0.078125,21,21,28 +0.953125,0.078125,25,21,28 +0.984375,0.078125,28,21,24 +0.015625,0.046875,25,16,14 +0.046875,0.046875,24,16,13 +0.078125,0.046875,24,17,13 +0.109375,0.046875,24,18,13 +0.140625,0.046875,24,20,13 +0.171875,0.046875,25,23,14 +0.203125,0.046875,25,25,14 +0.234375,0.046875,21,24,13 +0.265625,0.046875,18,24,13 +0.296875,0.046875,14,24,13 +0.328125,0.046875,13,24,17 +0.359375,0.046875,13,24,20 +0.390625,0.046875,14,21,25 +0.421875,0.046875,13,13,24 +0.453125,0.046875,19,13,24 +0.484375,0.046875,24,13,18 +0.515625,0.046875,21,17,16 +0.546875,0.046875,21,18,16 +0.578125,0.046875,21,18,16 +0.609375,0.046875,21,18,16 +0.640625,0.046875,21,19,16 +0.671875,0.046875,21,20,16 +0.703125,0.046875,22,22,17 +0.734375,0.046875,20,21,16 +0.765625,0.046875,18,21,16 +0.796875,0.046875,17,22,17 +0.828125,0.046875,16,21,18 +0.859375,0.046875,16,21,19 +0.890625,0.046875,16,19,21 +0.921875,0.046875,17,17,22 +0.953125,0.046875,20,17,22 +0.984375,0.046875,21,16,18 +0.015625,0.015625,0,0,0 +0.046875,0.015625,4,4,4 +0.078125,0.015625,9,9,9 +0.109375,0.015625,15,15,15 +0.140625,0.015625,21,21,21 +0.171875,0.015625,28,28,28 +0.203125,0.015625,36,36,36 +0.234375,0.015625,44,44,44 +0.265625,0.015625,52,52,52 +0.296875,0.015625,60,60,60 +0.328125,0.015625,69,69,69 +0.359375,0.015625,79,79,79 +0.390625,0.015625,88,88,88 +0.421875,0.015625,98,98,98 +0.453125,0.015625,108,108,108 +0.484375,0.015625,118,118,118 +0.515625,0.015625,128,128,128 +0.546875,0.015625,137,137,137 +0.578125,0.015625,146,146,146 +0.609375,0.015625,157,157,157 +0.640625,0.015625,167,167,167 +0.671875,0.015625,176,176,176 +0.703125,0.015625,186,186,186 +0.734375,0.015625,195,195,195 +0.765625,0.015625,203,203,203 +0.796875,0.015625,211,211,211 +0.828125,0.015625,218,218,218 +0.859375,0.015625,227,227,227 +0.890625,0.015625,234,234,234 +0.921875,0.015625,239,239,239 +0.953125,0.015625,246,246,246 +0.984375,0.015625,250,250,250 diff --git a/Blender/L1960_Tools/_Source/L1960_Tools_1_8_3/ColorPalette_02.png b/Blender/L1960_Tools/_Source/L1960_Tools_1_8_3/ColorPalette_02.png new file mode 100644 index 0000000..630794a Binary files /dev/null and b/Blender/L1960_Tools/_Source/L1960_Tools_1_8_3/ColorPalette_02.png differ diff --git a/Blender/L1960_Tools/_Source/L1960_Tools_1_8_3/CubeProjection.py b/Blender/L1960_Tools/_Source/L1960_Tools_1_8_3/CubeProjection.py new file mode 100644 index 0000000..5e6ca15 --- /dev/null +++ b/Blender/L1960_Tools/_Source/L1960_Tools_1_8_3/CubeProjection.py @@ -0,0 +1,94 @@ +import bpy +from math import pi + +L1960_Arr_PlainData = [ + ["Proj_Empty_01", (0, 0, 2), (0, 0, 0)], + ["Proj_Empty_02", (2, 0, 0), ((pi * 90 / 180), 0, (pi * 90 / 180))], + ["Proj_Empty_03", (0, 2, 0), ((pi * 90 / 180), 0, (pi * 180 / 180))], + ["Proj_Empty_04", (0, 0, -2), ((pi * 180 / 180), 0, 0)], + ["Proj_Empty_05", (-2, 0, 0), ((pi * 90 / 180), 0, (pi * -90 / 180))], + ["Proj_Empty_06", (0, -2, 0), ((pi * 90 / 180), 0, 0)] +] + +class MESH_OT_add_auto_cube_projection(bpy.types.Operator): + """Check Empty´s for projecting, if not existing create new one´s""" + + bl_idname = "mesh.add_auto_cube_projection" + bl_label = "Add Plain_Axes to scene" + bl_options = {"REGISTER", "UNDO"} + + def execute(self, context): + + scene = context.scene + oldSelection = context.selected_objects + oldActive = context.active_object + + for EmptyData in L1960_Arr_PlainData: + + EmptyName = EmptyData[0] + EmptyLocation = EmptyData[1] + EmptyRotation = EmptyData[2] + + if not scene.objects.get(EmptyName): + bpy.ops.object.empty_add(type='PLAIN_AXES', align='WORLD', location=EmptyLocation, scale=(1, 1, 1), rotation=EmptyRotation) + empty = context.active_object + empty.name = EmptyName + empty.hide_select = True + empty.hide_set(True) + + #Change back to old selection and select old active + for obj in oldSelection: + obj.select_set(True) + context.view_layer.objects.active = oldActive + + self.report({'INFO'}, 'Added/Fixed Emptys for Projection to Scene') + return {"FINISHED"} + +class MESH_OT_add_modifier_to_mesh(bpy.types.Operator): + """Add Modifier to selected Mesh´s and prepare UV-Maps""" + + bl_idname = "mesh.add_modifier_to_mesh" + bl_label = "Add Modifier to selected Mesh" + bl_options = {"REGISTER", "UNDO"} + + def execute(self, context): + + newModifierName = "CubeTexModifier" + arr_obj = context.selected_objects + if not arr_obj: + self.report({'WARNING'}, 'Select a mesh to add the UVProject-Modifier') + return {"CANCELLED"} + + empty_objs = [emp_obj for emp_obj in context.scene.objects if emp_obj.name.startswith("Proj_Empty")] + if len(empty_objs) < 6: + self.report({'WARNING'}, 'Create/Recreate projectors, they need to be set up first!') + return {"CANCELLED"}; + + for obj in arr_obj: + + if obj.data.uv_layers.get("UVMap"): + obj.data.uv_layers['UVMap'].name = 'UVMap0' + + if not obj.data.uv_layers.get("UVMap0"): + obj.data.uv_layers.new(name = 'UVMap0') + + if not obj.data.uv_layers.get("UVMap1"): + obj.data.uv_layers.new(name = 'UVMap1') + + + if obj.type == "MESH" and newModifierName not in obj.modifiers: + obj.modifiers.new(type='UV_PROJECT', name=newModifierName) + mod = obj.modifiers[newModifierName] + mod.uv_layer = "UVMap1" + mod.projector_count = 6 + + i = 0 + for p in mod.projectors: + p.object = bpy.data.objects[L1960_Arr_PlainData[i][0]] + i = i+1 + else: + self.report({'INFO'}, 'UVProject-Modifier allready set') + return {"FINISHED"} + + self.report({'INFO'}, 'Added UVProject-Modifier to mesh') + return {"FINISHED"} diff --git a/Blender/L1960_Tools/_Source/L1960_Tools_1_8_3/Dekogon.py b/Blender/L1960_Tools/_Source/L1960_Tools_1_8_3/Dekogon.py new file mode 100644 index 0000000..92688b1 --- /dev/null +++ b/Blender/L1960_Tools/_Source/L1960_Tools_1_8_3/Dekogon.py @@ -0,0 +1,187 @@ +import bpy +import re +import os + +### GROUP OBJECTS TO COLLECTIONS ### + +class MESH_OT_group_objects_in_collections(bpy.types.Operator): + """Groups objects by name into seperate collections, usefull for Unreal Decogon import""" + + bl_idname = "mesh.group_objects_in_collections" + bl_label = "Groups objects by name into seperate collections, usefull for Unreal Decogon import" + bl_options = {"REGISTER", "UNDO"} + + def execute(self, context): + # Erstellen einer leeren Dictionary zur Speicherung der Collections nach Basisnamen + collection_dict = {} + + # Durchlaufen aller Objekte in der Szene + for obj in context.scene.objects: + # Überprüfen, ob das Objekt ein leeres Elternobjekt ist + if obj.type == 'EMPTY': + # Anwenden der Regex auf den Objektnamen + match = re.match(r'^(.*?)_(.*?)_(\d+)([a-zA-Z]+)$', obj.name) + if match: + prefix = match.group(1) + name = match.group(2) + number = match.group(3) + letter = match.group(4) + + # Extrahieren des Basisnamens für die Collection + base_name = f"L1960_{name}" + + # Hinzufügen des Objekts zur entsprechenden Liste in der Dictionary + if base_name not in collection_dict: + collection_dict[base_name] = {} + if number not in collection_dict[base_name]: + collection_dict[base_name][number] = {} + if letter not in collection_dict[base_name][number]: + collection_dict[base_name][number][letter] = {'empty': obj, 'children': []} + + # Durchlaufen der Dictionary und Erstellen der Collections + for base_name, number_dict in collection_dict.items(): + # Erstellen einer neuen Collection für den Basisnamen + base_collection = bpy.data.collections.new(base_name) + bpy.context.scene.collection.children.link(base_collection) + + # Durchlaufen der sortierten Liste der Objekte und Verschieben in die Collections + for number, letter_dict in number_dict.items(): + # Erstellen einer Collection für die Nummer und Verschieben des leeren Elternobjekts dorthin + number_collection = bpy.data.collections.new(f"{base_name}_{number}") + base_collection.children.link(number_collection) + + # Durchlaufen der Buchstaben und Erstellen der Buchstaben-Collection unter der Nummer + for letter, obj_data in letter_dict.items(): + empty = obj_data['empty'] + children = empty.children + + letter_collection = bpy.data.collections.new(f"{base_name}_{number}{letter}") + number_collection.children.link(letter_collection) + + # Verschieben des leeren Elternobjekts in die entsprechende Collection + letter_collection.objects.link(empty) + + # Verschieben der Kinder des leeren Elternobjekts in die entsprechende Collection + for child in children: + letter_collection.objects.link(child) + + # Entfernen des leeren Elternobjekts und seiner Kinder aus der Szene + bpy.context.collection.objects.unlink(empty) + for child in children: + bpy.context.collection.objects.unlink(child) + + # ------------------------------------------------------------------------------------------- + # Regular expression pattern to match any _LOD1, _LOD2, etc., but not _LOD0 + pattern = re.compile(r"_LOD[1-9]\d*$") + + # Loop through all objects in the scene + for obj in bpy.context.scene.objects: + # If the object name matches the pattern, hide it + if pattern.search(obj.name): + obj.hide_set(True) # This hides the object in the viewport + else: + obj.hide_set(False) # Ensure _LOD0 objects remain visible + + # Update the view layer to reflect changes + bpy.context.view_layer.update() + + self.report({'INFO'}, 'All objects sorted') + return {"FINISHED"} + + +### ASSIGN TEXTURES ### + +class MESH_OT_assign_textures(bpy.types.Operator): + """Assign Textures to Mesh´s, usefull for Unreal Decogon import""" + + bl_idname = "mesh.assign_textures" + bl_label = "Assign Textures to Mesh´s, usefull for Unreal Decogon import" + bl_options = {"REGISTER", "UNDO"} + + def execute(self, context): + + # Define the path to the folder containing your textures + texture_folder_path = context.scene.dekogon_file_path + + texture_prefix = context.scene.dekogon_settings_prefix + if texture_prefix != "": + if texture_prefix[-1] != "_": + texture_prefix = texture_prefix + "_" + + texture_suffix = context.scene.dekogon_settings_suffix + if texture_suffix != "": + if texture_suffix[0] != "_": + texture_suffix = "_" + texture_suffix + + texture_filetype = context.scene.dekogon_settings_filetype + + if not os.path.exists(texture_folder_path): + self.report({'ERROR'}, f"The texture folder path '{texture_folder_path}' does not exist.") + return {"FINISHED"} + else: + self.report({'INFO'}, f"Texture folder path: {texture_folder_path}") + # List all files in the texture folder for debugging purposes + #texture_files = os.listdir(texture_folder_path) + #self.report({'INFO'}, "Files in texture folder:") + #for f in texture_files: + # print(f" - {f}") + + # Iterate over all materials in the Blender file + for material in bpy.data.materials: + self.report({'INFO'}, f"Processing material: {material.name}") + # Ensure the material uses nodes + if not material.use_nodes: + material.use_nodes = True + self.report({'INFO'}, f"Enabled nodes for material: {material.name}") + + # Get the node tree of the material + if material.node_tree is None: + self.report({'WARNING'}, f"Material {material.name} has no node tree.") + continue + + nodes = material.node_tree.nodes + + # Find or create an Image Texture node + image_texture_node = None + for node in nodes: + if node.type == 'TEX_IMAGE': + image_texture_node = node + break + if image_texture_node is None: + image_texture_node = nodes.new(type='ShaderNodeTexImage') + self.report({'INFO'}, f"Created new Image Texture node for material: {material.name}") + else: + self.report({'INFO'}, f"Found existing Image Texture node for material: {material.name}") + + # Construct the expected texture filename based on the material name + texture_filename = f"{texture_prefix}{material.name}{texture_suffix}.{texture_filetype}" + texture_filepath = os.path.join(texture_folder_path, texture_filename) + self.report({'INFO'}, f"Looking for texture: {texture_filepath}") + + # Check if the texture file exists + if os.path.exists(texture_filepath): + try: + # Load the image and assign it to the Image Texture node + image = bpy.data.images.load(texture_filepath) + image_texture_node.image = image + self.report({'INFO'}, f"Loaded texture: {texture_filename} for material: {material.name}") + + # Link the Image Texture node to the Base Color of the Principled BSDF shader + principled_node = None + for node in nodes: + if node.type == 'BSDF_PRINCIPLED': + principled_node = node + break + if principled_node is not None: + links = material.node_tree.links + links.new(image_texture_node.outputs['Color'], principled_node.inputs['Base Color']) + self.report({'INFO'}, f"Linked texture to Principled BSDF for material: {material.name}") + else: + self.report({'WARNING'}, f"No Principled BSDF node found for material: {material.name}") + except RuntimeError as e: + self.report({'ERROR'}, f"Failed to load image {texture_filename}: {e}") + else: + self.report({'WARNING'}, "Texture file not found for material {material.name}: {texture_filename}") + + self.report({'INFO'}, 'Texture assignment complete.') + return {"FINISHED"} \ No newline at end of file diff --git a/Blender/L1960_Tools/_Source/L1960_Tools_1_8_3/Helper.py b/Blender/L1960_Tools/_Source/L1960_Tools_1_8_3/Helper.py new file mode 100644 index 0000000..388226a --- /dev/null +++ b/Blender/L1960_Tools/_Source/L1960_Tools_1_8_3/Helper.py @@ -0,0 +1,139 @@ +import bpy +import bmesh + +### FIX MATERIALS ### + +class MESH_OT_fix_material_names(bpy.types.Operator): + """Fixes the material naming, if duplicated are present e.g. Material.001, Material.002 ...""" + + bl_idname = "mesh.fix_material_names" + bl_label = "Fixes the material naming, if duplicated are present" + bl_options = {"REGISTER", "UNDO"} + + def execute(self, context): + #Remove all duplicated materials + self.merge_duplicated_materials() + + #Merge material slots for every mesh in the scene + for obj in bpy.context.scene.objects: + if obj.type == "MESH": + self.merge_material_slots(obj) + + + self.report({'INFO'}, 'All duplicated Materials fixed') + return {"FINISHED"} + + def merge_duplicated_materials(self): + for material in bpy.data.materials: + #Remove MI for Dekogon material names + if material.name.split('_')[0] == 'MI': + material.name = material.name[3:] + #Check for .001 at end and remove + if material.name[-3:].isnumeric(): + opti_matName = material.name[:-4] + if bpy.data.materials.get(opti_matName): #check if og_mat exists + material.user_remap(bpy.data.materials.get(opti_matName)) + print("Removed Material: " + material.name) + bpy.data.materials.remove(material) + else: + material.name = opti_matName + + def merge_material_slots(self, obj): + duplicated_material_list = [] + + #create list with indexes of material slots with the same name and merge them + for og_slot in obj.material_slots: + for slot in obj.material_slots: + if slot.name == og_slot.name: + if slot.slot_index == og_slot.slot_index: + continue + if og_slot.slot_index in duplicated_material_list: + continue + duplicated_material_list.append(int(slot.slot_index)) + + #delete all material slots within list + for slot_index in sorted(duplicated_material_list, reverse=True): + obj.data.materials.pop(index = slot_index) + + +### FIX NAMING CONVENTIONS ### + +class MESH_OT_fix_naming_conventions(bpy.types.Operator): + """Changes . to _ to solve naming issues with workbench""" + + bl_idname = "mesh.fix_naming_convention" + bl_label = "Changes . to _ to solve naming issues with workbench" + bl_options = {"REGISTER", "UNDO"} + + def execute(self, context): + for obj in bpy.data.objects: + obj.name = obj.name.replace(".","_") + + self.report({'INFO'}, 'Fixed Naming') + return {"FINISHED"} + +class MESH_OT_generate_empty_for_mesh(bpy.types.Operator): + """Generates a Empty with the objects name at it´s position""" + + bl_idname = "mesh.generate_empty_for_mesh" + bl_label = "Generates a Empty with the objects name at it´s position" + bl_options = {"REGISTER", "UNDO"} + + def execute(self, context): + scene = bpy.context.scene + Selection = bpy.context.selected_objects + FilteredSelection = [obj for obj in Selection if obj.type != 'EMPTY'] + ActiveObj = bpy.context.active_object + + for obj in FilteredSelection: + oldEmpty = scene.objects.get("Socket_" + obj.name) + if oldEmpty: + oldEmpty.location = obj.location + oldEmpty.rotation_euler = obj.rotation_euler + else: + obj.select_set(True) + bpy.ops.object.empty_add(type='PLAIN_AXES', align='WORLD', location=obj.location, scale=(1, 1, 1), rotation=obj.rotation_euler) + empty = bpy.context.active_object + empty.name = "Socket_" + obj.name + + #Change back to selection and select old active + bpy.ops.object.select_all(action='DESELECT') + + self.report({'INFO'}, 'Generated Emptys for selectes Meshes in Scene') + return {"FINISHED"} + +class MESH_OT_select_face_id(bpy.types.Operator): + """Highlights Face with given ID""" + + bl_idname = "mesh.select_face_id" + bl_label = "Highlight/Select Face with given Index" + bl_options = {"REGISTER", "UNDO"} + + def execute(self, context): + EditObj = bpy.context.active_object + + face_Index = int(context.scene.face_id_field) + + if EditObj != None: + bpy.ops.object.mode_set(mode='EDIT') + bpy.ops.mesh.select_all(action='DESELECT') + bm = bmesh.from_edit_mesh(EditObj.data) + bm.faces.ensure_lookup_table() + + for area in bpy.context.screen.areas: + if area.type == 'VIEW_3D': + for space in area.spaces: + if space.type == 'VIEW_3D': + space.shading.type = 'WIREFRAME' + try: + bm.faces[face_Index].select = True + bmesh.update_edit_mesh(EditObj.data) + + self.report({'INFO'}, f'Highlighted Face with Index: {face_Index}') + return {"FINISHED"} + except IndexError: + self.report({'INFO'}, f'Index: {face_Index} out of range!') + return {"FINISHED"} + else: + self.report({'INFO'}, 'Please select a Mesh first.') + return {"FINISHED"} \ No newline at end of file diff --git a/Blender/L1960_Tools/_Source/L1960_Tools_1_8_3/MaterialToMask.py b/Blender/L1960_Tools/_Source/L1960_Tools_1_8_3/MaterialToMask.py new file mode 100644 index 0000000..d5e614f --- /dev/null +++ b/Blender/L1960_Tools/_Source/L1960_Tools_1_8_3/MaterialToMask.py @@ -0,0 +1,215 @@ +import bpy +import bmesh + +# Callback for Enum Items +def get_uv_layers(self, context): + items = [] + obj = context.object + + if obj and obj.type == 'MESH' and obj.data.uv_layers: + for i, uv in enumerate(obj.data.uv_layers): + items.append((str(i), uv.name, f"UV Layer {i}")) + else: + items.append(("NONE", "No UVs", "No UV available within Mesh")) + + return items + +class UVEnumProperties(bpy.types.PropertyGroup): + uv_enum: bpy.props.EnumProperty(name="UV Map", description="Select UV-Layer", items=get_uv_layers, default=0) + +class MESH_OT_merge_materials_to_mask(bpy.types.Operator): + """Merges 4 Materials into one Material (Mask)""" + + bl_idname = "mesh.merge_materials_to_mask" + bl_label = "Merges 4 Materials into one Material (Mask)" + bl_options = {"REGISTER", "UNDO"} + + def execute(self, context): + scene = context.scene + arr_obj = context.selected_objects + activeObj = context.active_object + + ignore_custom = context.scene.settings_multi_ignor + island_margin_custom = context.scene.uv_island_margin_slider + + # Scale and offset for UV allignment + SCALE = 0.5 + OFFSETS = [ + (0.0, 0.5), + (0.5, 0.5), + (0.0, 0.0), + (0.5, 0.0) + ] + IGNORE = ["glass", "glas", "grass", "gras"] + ignore_custom.split(",") + + # No Mesh selected + if not arr_obj: + self.report({'WARNING'}, 'Select one mesh') + return {"CANCELLED"} + + # Only one Mesh selected? + if len(arr_obj) > 1: + self.report({'WARNING'}, 'Only one Mesh can be selected') + return {"CANCELLED"} + + obj = arr_obj[0] + selected_uv = context.scene.uv_enum_props.uv_enum + + # UV Maps present? + if not obj.data.uv_layers or not selected_uv: + self.report({'WARNING'}, 'No UV-Map selected') + return {"CANCELLED"} + + obj.data.uv_layers.active_index = int(selected_uv) + + skip = 0 + idx_multi = None + delete = [] + + # Loop through all Materials + for i, slot in enumerate(obj.material_slots): + + # Skip Materials in static ignore list or user ignore list + if any(name in slot.material.name.lower() for name in IGNORE): + self.report({'INFO'}, f'Material "{slot.material.name}" skipped.') + skip += 1 + continue + + # Switch to edit mode + bpy.ops.object.mode_set(mode='EDIT') + + # Create bmesh to work with + bm = bmesh.from_edit_mesh(obj.data) + uv_layer = bm.loops.layers.uv.active + + # Deselect all + bpy.ops.mesh.select_all(action='DESELECT') + + if slot.material: + # Select Mat slot + obj.active_material_index = i + + # Select all Faces of Mat + bpy.ops.object.material_slot_select() + + # If UV has assigned faces + if any(f.select for f in bm.faces): + # Repack UV Islands + bpy.ops.uv.select_all(action='SELECT') + bpy.ops.uv.pack_islands(margin=island_margin_custom) + + # Select Offset + group = (i - skip) % len(OFFSETS) + offset = OFFSETS[group] + + # Scale and offset UV + for f in bm.faces: + if f.select: + for loop in f.loops: + uv = loop[uv_layer].uv + uv[0] = offset[0] + uv[0] * SCALE + uv[1] = offset[1] + uv[1] * SCALE + + # Apply Changes + bmesh.update_edit_mesh(obj.data) + + # Create Texture Attributes with previous material names + match group: + case 0: + mat = bpy.data.materials.get(obj.material_slots[i].name) + mat["Black "] = mat.name + + # Change name and use as base to merge + mat.name = "Multi_" + mat.name + idx_multi = i + self.report({'INFO'}, f'Material "{mat.name}" created.') + continue + case 1: + mat = bpy.data.materials.get(obj.material_slots[idx_multi].name) + mat["Red "] = slot.material.name + case 2: + mat = bpy.data.materials.get(obj.material_slots[idx_multi].name) + mat["Green "] = slot.material.name + case 3: + mat = bpy.data.materials.get(obj.material_slots[idx_multi].name) + mat["Blue "] = slot.material.name + case _: + pass + + # Merge Material A -> B + self.merge_mat_A_to_B(obj, i, idx_multi) + + # Add Material B to delete list + delete.insert(0, i) + + # Switch to object mode + bpy.ops.object.mode_set(mode='OBJECT') + + # Delete not used materials from list + for mat in delete: + obj.active_material_index = mat + bpy.ops.object.material_slot_remove() + + # Put UV first + self.put_UV_first(obj, selected_uv) + + # Change UV names like in Reforger Tools + mesh = obj.data + uv_layers = mesh.uv_layers + for i, layer in enumerate(uv_layers): + layer.name = f"UVMap{i + 1}" + + self.report({'INFO'}, 'Merged Materials to Multitextures.') + return {"FINISHED"} + + def merge_mat_A_to_B(self, obj, mat_A, mat_B): + # check if Mat Name is index or string and convert + if type(mat_A) is str: + mat_A = bpy.data.materials.get(mat_A) + mat_A = obj.material_slots.find(mat_A) + if type(mat_B) is str: + mat_B = bpy.data.materials.get(mat_B) + mat_B = obj.material_slots.find(mat_B) + + # Change to Edit Mode + bpy.ops.object.mode_set(mode='EDIT') + bpy.ops.mesh.select_all(action='DESELECT') + + # Select all Faces from Mat B + obj.active_material_index = mat_A + bpy.ops.object.material_slot_select() + + # Select Mat A and assign Faces from Mat B + obj.active_material_index = mat_B + bpy.ops.object.material_slot_assign() # Faces from B → A + + # Switch to object mode + bpy.ops.object.mode_set(mode='OBJECT') + + def put_UV_first(self, obj, target_index): + mesh = obj.data + uv_layers = mesh.uv_layers + + if len(uv_layers) > 1: + # Transform UV-Layers to dict + uv_data_dict = {i: [loop_uv.uv.copy() for loop_uv in layer.data] for i, layer in enumerate(uv_layers)} + + # Order: target_index -> first + indices = list(range(len(uv_layers))) + new_order = [target_index] + [i for i in indices if i != target_index] + + # Delete all UV-layers + while len(uv_layers) > 0: + uv_layers.remove(uv_layers[0]) + + # write new order of UV´s + new_layers = [] + for old_idx in new_order: + new_layer = uv_layers.new(name=f"Temp_{old_idx}") # temp Name + old_data = uv_data_dict[old_idx] + for j, loop_uv in enumerate(old_data): + new_layer.data[j].uv = loop_uv + new_layers.append(new_layer) + + # Set active UV + uv_layers.active_index = 0 \ No newline at end of file diff --git a/Blender/L1960_Tools/_Source/L1960_Tools_1_8_3/PrepareLods.py b/Blender/L1960_Tools/_Source/L1960_Tools_1_8_3/PrepareLods.py new file mode 100644 index 0000000..928f456 --- /dev/null +++ b/Blender/L1960_Tools/_Source/L1960_Tools_1_8_3/PrepareLods.py @@ -0,0 +1,42 @@ +import bpy + +### 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"} \ No newline at end of file diff --git a/Blender/L1960_Tools/_Source/L1960_Tools_1_8_3/_CreateColorPaletteMatrix.py b/Blender/L1960_Tools/_Source/L1960_Tools_1_8_3/_CreateColorPaletteMatrix.py new file mode 100644 index 0000000..0d4debc --- /dev/null +++ b/Blender/L1960_Tools/_Source/L1960_Tools_1_8_3/_CreateColorPaletteMatrix.py @@ -0,0 +1,30 @@ +from PIL import Image +import csv + +palettes = ["ColorPalette_01", "ColorPalette_02"] + +for palette in palettes: + # Bild öffnen (Pfad anpassen) + bild = Image.open(f"{palette}.png").convert("RGB") + + breite, hoehe = bild.size + tiles_x, tiles_y = 32, 32 + + # Auf 32x32 verkleinern (nimmt repräsentative Pixel pro Kachel) + klein = bild.resize((32, 32), Image.NEAREST) + + # CSV-Datei schreiben + with open(f"{palette}.csv", mode="w", newline="") as datei: + writer = csv.writer(datei) + writer.writerow(["norm_x", "norm_y", "r", "g", "b"]) + + for py in range(tiles_y): + for px in range(tiles_x): + # Farbe an diesem Pixel holen + r, g, b = bild.getpixel((int(px), int(py))) + + # Normalisierung [0,1] + norm_x = (px / (breite)) + 1/64 + norm_y = 1.0 - ((py / (hoehe))) - 1/64 + + writer.writerow([f"{norm_x:.6f}", f"{norm_y:.6f}", r, g, b]) diff --git a/Blender/L1960_Tools/_Source/L1960_Tools_1_8_3/__init__.py b/Blender/L1960_Tools/_Source/L1960_Tools_1_8_3/__init__.py new file mode 100644 index 0000000..57a5b6b --- /dev/null +++ b/Blender/L1960_Tools/_Source/L1960_Tools_1_8_3/__init__.py @@ -0,0 +1,207 @@ +bl_info = { + "name": "L1960 Tools", + "author": "Prodeath21", + "version": (1, 8, 3), + "blender": (4, 2, 0), + "location": "3D Viewport > Sidebar > 1960Life category", + "description": "Set´s up the Projection-Modifier automatically and add´s in the Emptys if not allready created.", + "category": "Object", +} + +# ---------------------------------------------- +# Import modules +# ---------------------------------------------- +if "bpy" in locals(): + import imp + imp.reload(Dekogon) + imp.reload(CubeProjection) + imp.reload(Helper) + imp.reload(PrepareLods) + imp.reload(AutoColorPalette) + imp.reload(MaterialToMask) + print("L1960 Tools: Reloaded multifiles") +else: + from . import Dekogon + from . import CubeProjection + from . import Helper + from . import PrepareLods + from . import AutoColorPalette + from . import MaterialToMask + +import bpy + +from . Dekogon import MESH_OT_group_objects_in_collections, MESH_OT_assign_textures +from . CubeProjection import MESH_OT_add_auto_cube_projection, MESH_OT_add_modifier_to_mesh +from . Helper import MESH_OT_fix_material_names, MESH_OT_fix_naming_conventions, MESH_OT_generate_empty_for_mesh, MESH_OT_select_face_id +from . PrepareLods import MESH_OT_prepare_lods_decimate +from . AutoColorPalette import MESH_OT_set_up_mlod, EnumColorPalettes # MESH_OT_bake_basic_mlod, +from . MaterialToMask import UVEnumProperties, MESH_OT_merge_materials_to_mask + +class L1960_PT_dekogon(bpy.types.Panel): + #where to add the panel + bl_space_type = "VIEW_3D" + bl_region_type = "UI" + + #add labels + bl_label = "1960-Life Import" + bl_category = "1960-Life" + bl_options = {'DEFAULT_CLOSED'} + + def draw(self, context): + box = self.layout.box() + # Dekogon-Import + box.label(text="Dekogon-Import") + row = box.row() + row.operator("mesh.group_objects_in_collections", text="Group to Collections") + row = box.row() + split = row.split(factor=0.5) + split.operator("mesh.assign_textures", text="Assign Textures") + split.prop(context.scene, "dekogon_file_path", text="") + row = box.row() + row.prop(context.scene, "section1", + text="Settings", + icon="TRIA_DOWN" if context.scene.section1 else "TRIA_RIGHT", + emboss=False) + if context.scene.section1: + box.prop(context.scene, "dekogon_settings_prefix", text="Prefix") + box.prop(context.scene, "dekogon_settings_suffix", text="Suffix") + box.prop(context.scene, "dekogon_settings_filetype", text="File Type") + self.layout.separator() + + box = self.layout.box() + # Americano-Import + box.label(text="Materials-to-Multi") + row = box.row() + row.operator("mesh.merge_materials_to_mask", text="Merge Materials to Mask") + row = box.row() + row.prop(context.scene, "section2", + text="Settings", + icon="TRIA_DOWN" if context.scene.section2 else "TRIA_RIGHT", + emboss=False) + if context.scene.section2: + row = box.row() + props = context.scene.uv_enum_props + row.prop(props, "uv_enum", text="Use UV") + box.prop(context.scene, "settings_multi_ignor", text="Ignore") + box.prop(context.scene, "uv_island_margin_slider", text="Island Margin") + +class L1960_PT_tools(bpy.types.Panel): + #where to add the panel + bl_space_type = "VIEW_3D" + bl_region_type = "UI" + + #add labels + bl_label = "1960-Life Tools" + bl_category = "1960-Life" + + def draw(self, context): + """define the layout of the panel""" + box = self.layout.box() + # UV-Project helper + box.label(text="UV-Projection") + row = box.row() + row.operator("mesh.add_auto_cube_projection", text="Set up Projectors") + row = box.row() + row.operator("mesh.add_modifier_to_mesh", text="Add Modifier to Mesh") + self.layout.separator() + # Helpers + box = self.layout.box() + box.label(text="Various Helper") + row = box.row() + row.operator("mesh.fix_material_names", text="Fix Material Name´s") + row = box.row() + row.operator("mesh.fix_naming_convention", text="Fix Naming Convention") + row = box.row() + row.operator("mesh.generate_empty_for_mesh", text="Generate Empty") + row = box.row() + split = row.split(factor=0.7) + split.operator("mesh.select_face_id", text="Show Face Index") + split.prop(context.scene, "face_id_field", text="") + self.layout.separator() + # Generate LODs + box = self.layout.box() + box.label(text="LOD´s") + row = box.row() + row.operator("mesh.prepare_lods_decimate", text="Create LOD´s") + box.prop(context.scene, "lod_slider", text="Amount") + box = self.layout.box() + box.prop(context.scene.color_palettes, "mlod_enum_selection", expand=True) + # row = box.row() + # row.operator("mesh.set_up_mlod", text="Set up MLOD") + row = box.row() + row.operator("mesh.set_up_mlod", text="Generate MLOD (Palette)") + self.layout.separator() + ############################### + # Enfusion Blender Tools Linked + box = self.layout.box() + box.label(text="EBT Linked") + row = box.row() + row.operator("view3d.ebt_sort", text="Sort Objects") + # colliders setup is allowed in both OBJECT and EDIT mode + row = box.row() + row.operator("view3d.ebt_colliders_setup", text=" Colliders Setup") + row = box.row() + # Light Setup + row.operator("view3d.ebt_setup_light", text=" Light Setup") + row = box.row() + col = row.column(align=True) + # Update Materials + col.operator("scene.ebt_update_enf_materials",) + row = box.row() + col = row.column(align=True) + +#register the panel with blender +modules = [ L1960_PT_dekogon, + L1960_PT_tools, + MESH_OT_add_auto_cube_projection, + MESH_OT_add_modifier_to_mesh, + MESH_OT_merge_materials_to_mask, + MESH_OT_fix_material_names, + MESH_OT_group_objects_in_collections, + MESH_OT_assign_textures, + MESH_OT_fix_naming_conventions, + MESH_OT_generate_empty_for_mesh, + MESH_OT_prepare_lods_decimate, + # MESH_OT_bake_basic_mlod, + MESH_OT_set_up_mlod, + EnumColorPalettes, + MESH_OT_select_face_id, + UVEnumProperties +] + +def register(): + for mod in modules: + bpy.utils.register_class(mod) + + bpy.types.Scene.lod_slider = bpy.props.IntProperty(name="LOD Number", default=3, min=0, max=10) + bpy.types.Scene.color_palettes = bpy.props.PointerProperty(type=EnumColorPalettes) + bpy.types.Scene.face_id_field = bpy.props.IntProperty(name="Face ID", default=0, min=0) + bpy.types.Scene.section1 = bpy.props.BoolProperty(name="Expand Section", default=False) + bpy.types.Scene.section2 = bpy.props.BoolProperty(name="Expand Section", default=False) + bpy.types.Scene.dekogon_file_path = bpy.props.StringProperty(name="Textures", description="Path to the texture folder, textures to be applied from", subtype="DIR_PATH", default="") + 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_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.uv_enum_props = bpy.props.PointerProperty(type=UVEnumProperties) + bpy.types.Scene.uv_island_margin_slider = bpy.props.FloatProperty(name="Island Margin", default=0.02, min=0.01, max=0.1) + +def unregister(): + for mod in modules: + bpy.utils.unregister_class(mod) + + del bpy.types.Scene.lod_slider + del bpy.types.Scene.color_palettes + del bpy.types.Scene.face_id_field + del bpy.types.Scene.section1 + del bpy.types.Scene.section2 + del bpy.types.Scene.dekogon_file_path + del bpy.types.Scene.dekogon_settings_prefix + del bpy.types.Scene.dekogon_settings_suffix + del bpy.types.Scene.dekogon_settings_filetype + del bpy.types.Scene.settings_multi_ignor + del bpy.types.Scene.uv_enum_props + del bpy.types.Scene.uv_island_margin_slider + +if __name__== "__main__": + register() \ No newline at end of file