2025-07-01

This commit is contained in:
2026-03-17 14:30:01 -06:00
parent f9a22056dd
commit 62b5978595
4579 changed files with 1257472 additions and 0 deletions
+873
View File
@@ -0,0 +1,873 @@
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful, but
# WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTIBILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
# General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
bl_info = {
"name" : "Legolizer",
"author" : "Alberrvfx, Al-Dezel",
"description" : " Convert all your 3D models into Lego brick style.",
"blender" : (4, 0, 0),
"version" : (2, 0, 1),
"location" : "",
"warning" : "",
"doc_url": "",
"tracker_url": "",
"category" : "3D View"
}
import bpy
import bpy.utils.previews
import os
from bpy.app.handlers import persistent
addon_keymaps = {}
_icons = None
visual_scripting_editor = {'sna_new_variable': False, }
def property_exists(prop_path, glob, loc):
try:
eval(prop_path, glob, loc)
return True
except:
return False
def find_user_keyconfig(key):
km, kmi = addon_keymaps[key]
for item in bpy.context.window_manager.keyconfigs.user.keymaps[km.name].keymap_items:
found_item = False
if kmi.idname == item.idname:
found_item = True
for name in dir(kmi.properties):
if not name in ["bl_rna", "rna_type"] and not name[0] == "_":
if name in kmi.properties and name in item.properties and not kmi.properties[name] == item.properties[name]:
found_item = False
if found_item:
return item
print(f"Couldn't find keymap item for {key}, using addon keymap instead. This won't be saved across sessions!")
return kmi
def ShowMessageBoxer(title, icon, message):
scene = bpy.context.scene
# Access the 2D cursor location
cursor_location = scene.cursor.location
def draw(self, context):
self.layout.label(text=message)
bpy.context.window_manager.popup_menu(draw, title=title, icon=icon)
def sna_update_sna_legolizer_material_9D59F(self, context):
sna_updated_prop = self.sna_legolizer_material
bpy.data.node_groups[bpy.context.object.modifiers.active.node_group.name].nodes['Set Material'].inputs[2].default_value = sna_updated_prop
bpy.context.view_layer.objects.active.update_tag(refresh={'DATA'}, )
def sna_update_sna_landscape_material_E64B9(self, context):
sna_updated_prop = self.sna_landscape_material
bpy.data.node_groups[bpy.context.object.modifiers.active.node_group.name].nodes['Switch'].inputs[23].default_value = sna_updated_prop
bpy.context.view_layer.objects.active.update_tag(refresh={'DATA'}, )
class SNA_OT_Operator_88521(bpy.types.Operator):
bl_idname = "sna.operator_88521"
bl_label = "Operator"
bl_description = ""
bl_options = {"REGISTER", "UNDO"}
@classmethod
def poll(cls, context):
if bpy.app.version >= (3, 0, 0) and True:
cls.poll_message_set('')
return not False
def execute(self, context):
for i_F4E5A in range(len(bpy.context.screen.areas)):
if (bpy.context.screen.areas[i_F4E5A].type == 'PROPERTIES'):
for i_EE2BD in range(len(bpy.context.screen.areas[i_F4E5A].regions)):
if (bpy.context.screen.areas[i_F4E5A].regions[i_EE2BD].type == 'WINDOW'):
area_07961 = bpy.context.screen.areas[i_F4E5A]
region_07961 = bpy.context.screen.areas[i_F4E5A].regions[i_EE2BD]
with bpy.context.temp_override(area=area_07961, region=region_07961, ):
bpy.context.scene.cycles.bake_type = 'DIFFUSE'
bpy.context.scene.render.bake.use_pass_direct = False
bpy.context.scene.render.bake.use_pass_indirect = False
bpy.context.scene.render.bake.margin = 4
bpy.ops.object.bake('INVOKE_DEFAULT', type='DIFFUSE')
bpy.ops.object.light_add('INVOKE_DEFAULT', type='SUN', location=(1.0, 1.0, 10.0))
bpy.ops.object.delete()
if bpy.context and bpy.context.screen:
for a in bpy.context.screen.areas:
a.tag_redraw()
return {"FINISHED"}
def invoke(self, context, event):
return self.execute(context)
def sna_function_interface_7D9FC(layout_function, ):
op = layout_function.operator('sna.operator_88521', text='Bake', icon_value=192, emboss=True, depress=False)
class SNA_PT_LEGOLIZER_D7609(bpy.types.Panel):
bl_label = 'Legolizer'
bl_idname = 'SNA_PT_LEGOLIZER_D7609'
bl_space_type = 'VIEW_3D'
bl_region_type = 'UI'
bl_context = ''
bl_category = 'Legolizer'
bl_order = 0
bl_ui_units_x=0
@classmethod
def poll(cls, context):
return not (False)
def draw_header(self, context):
layout = self.layout
def draw(self, context):
layout = self.layout
col_CDA22 = layout.column(heading='', align=False)
col_CDA22.alert = False
col_CDA22.enabled = bool(len(bpy.context.view_layer.objects.selected))
col_CDA22.active = True
col_CDA22.use_property_split = False
col_CDA22.use_property_decorate = False
col_CDA22.scale_x = 1.0
col_CDA22.scale_y = 1.0
col_CDA22.alignment = 'Expand'.upper()
if not True: col_CDA22.operator_context = "EXEC_DEFAULT"
op = col_CDA22.operator('sna.operator_79c5b', text='Legolize', icon_value=0, emboss=True, depress=False)
op = col_CDA22.operator('sna.operator002_5e694', text='Lego Landscape Generator', icon_value=0, emboss=True, depress=False)
col_3E229 = layout.column(heading='', align=False)
col_3E229.alert = False
col_3E229.enabled = True
col_3E229.active = True
col_3E229.use_property_split = False
col_3E229.use_property_decorate = False
col_3E229.scale_x = 1.0
col_3E229.scale_y = 1.149999976158142
col_3E229.alignment = 'Expand'.upper()
if not True: col_3E229.operator_context = "EXEC_DEFAULT"
if (not bpy.context.scene.sna_new_property):
col_70AAD = col_3E229.column(heading='', align=False)
col_70AAD.alert = False
col_70AAD.enabled = True
col_70AAD.active = True
col_70AAD.use_property_split = False
col_70AAD.use_property_decorate = False
col_70AAD.scale_x = 1.0
col_70AAD.scale_y = 1.0
col_70AAD.alignment = 'Expand'.upper()
if not True: col_70AAD.operator_context = "EXEC_DEFAULT"
op = col_70AAD.operator('sna.add_legolizer_setup_b16ae', text='Add Setup', icon_value=0, emboss=True, depress=True)
col_70AAD.separator(factor=2.049999952316284)
class SNA_OT_Operator_79C5B(bpy.types.Operator):
bl_idname = "sna.operator_79c5b"
bl_label = "Operator"
bl_description = ""
bl_options = {"REGISTER", "UNDO"}
@classmethod
def poll(cls, context):
if bpy.app.version >= (3, 0, 0) and True:
cls.poll_message_set('')
return not False
def execute(self, context):
if property_exists("bpy.data.node_groups['Legolizer']", globals(), locals()):
modifier_EC83B = bpy.context.active_object.modifiers.new(name='Legolizer', type='NODES', )
modifier_EC83B.node_group = bpy.data.node_groups['Legolizer']
else:
before_data = list(bpy.data.node_groups)
bpy.ops.wm.append(directory=os.path.join(os.path.dirname(__file__), 'assets', 'Legolizer_Full_Version3 main.blend') + r'\NodeTree', filename='Legolizer', link=False)
new_data = list(filter(lambda d: not d in before_data, list(bpy.data.node_groups)))
appended_54BCA = None if not new_data else new_data[0]
modifier_45945 = bpy.context.active_object.modifiers.new(name='Legolizer', type='NODES', )
modifier_45945.node_group = appended_54BCA
sna_legolizer_function_AA320()
bpy.context.view_layer.objects.active.modifiers['Legolizer']['Input_6'] = bpy.context.view_layer.objects.active.data.uv_layers.active.name
bpy.context.view_layer.objects.active.active_material.node_tree.nodes['Attribute'].attribute_name = bpy.context.view_layer.objects.active.data.uv_layers.active.name
return {"FINISHED"}
def invoke(self, context, event):
return self.execute(context)
class SNA_OT_Operator002_5E694(bpy.types.Operator):
bl_idname = "sna.operator002_5e694"
bl_label = "Operator.002"
bl_description = ""
bl_options = {"REGISTER", "UNDO"}
@classmethod
def poll(cls, context):
if bpy.app.version >= (3, 0, 0) and True:
cls.poll_message_set('')
return not False
def execute(self, context):
if property_exists("bpy.data.node_groups['Lego_Landscape_Generator']", globals(), locals()):
modifier_095E3 = bpy.context.active_object.modifiers.new(name='Lego_Landscape_Generator', type='NODES', )
modifier_095E3.node_group = bpy.data.node_groups['Lego_Landscape_Generator']
else:
before_data = list(bpy.data.node_groups)
bpy.ops.wm.append(directory=os.path.join(os.path.dirname(__file__), 'assets', 'Legolizer_Full_Version3 main.blend') + r'\NodeTree', filename='Lego_Landscape_Generator', link=False)
new_data = list(filter(lambda d: not d in before_data, list(bpy.data.node_groups)))
appended_1A324 = None if not new_data else new_data[0]
modifier_3345B = bpy.context.active_object.modifiers.new(name='Lego_Landscape_Generator', type='NODES', )
modifier_3345B.node_group = appended_1A324
sna_landscape_material_function_5D422()
return {"FINISHED"}
def invoke(self, context, event):
return self.execute(context)
class SNA_AddonPreferences_2E6BD(bpy.types.AddonPreferences):
bl_idname = 'legolizer'
def draw(self, context):
if not (False):
layout = self.layout
row_A16F5 = layout.row(heading='', align=False)
row_A16F5.alert = False
row_A16F5.enabled = True
row_A16F5.active = True
row_A16F5.use_property_split = False
row_A16F5.use_property_decorate = False
row_A16F5.scale_x = 1.0
row_A16F5.scale_y = 1.0
row_A16F5.alignment = 'Expand'.upper()
if not True: row_A16F5.operator_context = "EXEC_DEFAULT"
op = row_A16F5.operator('wm.url_open', text='Alberrvfx (Blender Market)', icon_value=72, emboss=True, depress=False)
op.url = 'https://blendermarket.com/creators/alberrvfx'
op = row_A16F5.operator('wm.url_open', text='Addon Developer (Al-Dezel)', icon_value=72, emboss=True, depress=False)
op.url = 'https://blendermarket.com/creators/13lfh3mn4gnlm7q_umj3vf34yueooo8q8'
col_ACBFB = layout.column(heading='', align=True)
col_ACBFB.alert = False
col_ACBFB.enabled = True
col_ACBFB.active = True
col_ACBFB.use_property_split = False
col_ACBFB.use_property_decorate = False
col_ACBFB.scale_x = 1.0
col_ACBFB.scale_y = 1.0
col_ACBFB.alignment = 'Expand'.upper()
if not True: col_ACBFB.operator_context = "EXEC_DEFAULT"
col_ACBFB.prop(find_user_keyconfig('27F5F'), 'type', text='Apply Legolizer Shortcut', full_event=True)
col_ACBFB.prop(find_user_keyconfig('94A0F'), 'type', text='Apply Lego Landscape Gen. Shortcut', full_event=True)
col_ACBFB.prop(find_user_keyconfig('4D60F'), 'type', text='Add Set Up Shortcut', full_event=True)
class SNA_OT_Material_Properties_A10D8(bpy.types.Operator):
bl_idname = "sna.material_properties_a10d8"
bl_label = "Material Properties"
bl_description = ""
bl_options = {"REGISTER", "UNDO"}
@classmethod
def poll(cls, context):
if bpy.app.version >= (3, 0, 0) and True:
cls.poll_message_set('')
return not False
def execute(self, context):
ShowMessageBoxer('Info',
'NONE',
'The properties of the Materials will appear if you select the object that has the Material applied to it.')
return {"FINISHED"}
def invoke(self, context, event):
return self.execute(context)
class SNA_OT_Geometry_Properties_87F4A(bpy.types.Operator):
bl_idname = "sna.geometry_properties_87f4a"
bl_label = "Geometry Properties"
bl_description = ""
bl_options = {"REGISTER", "UNDO"}
@classmethod
def poll(cls, context):
if bpy.app.version >= (3, 0, 0) and True:
cls.poll_message_set('')
return not False
def execute(self, context):
ShowMessageBoxer('Info',
'NONE',
'The properties of the Geometry node will appear if you select the object that has the Geo Modifier applied to it.')
return {"FINISHED"}
def invoke(self, context, event):
return self.execute(context)
@persistent
def load_post_handler_E1A6F(dummy):
visual_scripting_editor['sna_new_variable'] = False
class SNA_OT_Add_Legolizer_Setup_B16Ae(bpy.types.Operator):
bl_idname = "sna.add_legolizer_setup_b16ae"
bl_label = "Add Legolizer Setup?"
bl_description = ""
bl_options = {"REGISTER", "UNDO"}
@classmethod
def poll(cls, context):
if bpy.app.version >= (3, 0, 0) and True:
cls.poll_message_set('')
return not visual_scripting_editor['sna_new_variable']
def execute(self, context):
before_data = list(bpy.data.node_groups)
bpy.ops.wm.append(directory=os.path.join(os.path.dirname(__file__), 'assets', 'Legolizer_Full_Version.blend') + r'\NodeTree', filename='Legolizer', link=False)
new_data = list(filter(lambda d: not d in before_data, list(bpy.data.node_groups)))
appended_67BC6 = None if not new_data else new_data[0]
bpy.ops.object.move_to_collection('INVOKE_DEFAULT', collection_index=0, is_new=True, new_collection_name='Bricks')
bpy.ops.object.hide_view_set()
bpy.context.view_layer.layer_collection.children['Bricks'].exclude = True
visual_scripting_editor['sna_new_variable'] = True
before_data = list(bpy.data.node_groups)
bpy.ops.wm.append(directory=os.path.join(os.path.dirname(__file__), 'assets', 'Legolizer_Full_Version.blend') + r'\NodeTree', filename='Lego_Landscape_Generator', link=False)
new_data = list(filter(lambda d: not d in before_data, list(bpy.data.node_groups)))
appended_34A26 = None if not new_data else new_data[0]
bpy.ops.object.delete()
bpy.context.scene.sna_new_property = True
before_data = list(bpy.data.materials)
bpy.ops.wm.append(directory=os.path.join(os.path.dirname(__file__), 'assets', 'Legolizer_Full_Version.blend') + r'\Material', filename='PBR_Plastic_Material', link=False)
new_data = list(filter(lambda d: not d in before_data, list(bpy.data.materials)))
appended_2A67E = None if not new_data else new_data[0]
before_data = list(bpy.data.materials)
bpy.ops.wm.append(directory=os.path.join(os.path.dirname(__file__), 'assets', 'Legolizer_Full_Version3 main.blend') + r'\Material', filename='PBR_Trans_Plastic_Material_v03', link=False)
new_data = list(filter(lambda d: not d in before_data, list(bpy.data.materials)))
appended_85DEE = None if not new_data else new_data[0]
before_data = list(bpy.data.materials)
bpy.ops.wm.append(directory=os.path.join(os.path.dirname(__file__), 'assets', 'Legolizer_Full_Version.blend') + r'\Material', filename='legolizer_tools', link=False)
new_data = list(filter(lambda d: not d in before_data, list(bpy.data.materials)))
appended_3381B = None if not new_data else new_data[0]
ShowMessageBoxer('Info',
'INFO',
'Completed')
return {"FINISHED"}
def invoke(self, context, event):
return context.window_manager.invoke_confirm(self, event)
def sna_landscape_material_function_5D422():
if False:
bpy.context.scene.sna_landscape_material = bpy.data.node_groups[bpy.context.object.modifiers.active.node_group.name].nodes['Switch'].inputs[23].default_value
def sna_legolizer_function_AA320():
if False:
bpy.context.scene.sna_legolizer_material = bpy.data.node_groups[bpy.context.object.modifiers.active.node_group.name].nodes['Set Material'].inputs[2].default_value
class SNA_OT_Operator001_67831(bpy.types.Operator):
bl_idname = "sna.operator001_67831"
bl_label = "Operator.001"
bl_description = ""
bl_options = {"REGISTER", "UNDO"}
@classmethod
def poll(cls, context):
if bpy.app.version >= (3, 0, 0) and True:
cls.poll_message_set('')
return not False
def execute(self, context):
bpy.ops.object.mode_set('INVOKE_DEFAULT', mode='EDIT')
bpy.ops.mesh.select_all('INVOKE_DEFAULT', action='SELECT')
bpy.ops.uv.smart_project(angle_limit=66.0, margin_method='SCALED', island_margin=0.0010000000474974513, area_weight=0.0, correct_aspect=True, scale_to_bounds=False)
bpy.ops.object.mode_set('INVOKE_DEFAULT', mode='OBJECT')
return {"FINISHED"}
def invoke(self, context, event):
return self.execute(context)
class SNA_OT_Operator_E20D3(bpy.types.Operator):
bl_idname = "sna.operator_e20d3"
bl_label = "Operator"
bl_description = ""
bl_options = {"REGISTER", "UNDO"}
@classmethod
def poll(cls, context):
if bpy.app.version >= (3, 0, 0) and True:
cls.poll_message_set('')
return not False
def execute(self, context):
exec('bpy.ops.node.add_node(use_transform=True, type="ShaderNodeTexImage")')
image_0DB6A = bpy.data.images.new(name=bpy.context.active_object.name, width=bpy.context.scene.sna_resolution_width, height=bpy.context.scene.sna_resolution_height, alpha=True, )
bpy.ops.transform.translate('INVOKE_DEFAULT', )
bpy.context.scene.render.engine = 'CYCLES'
bpy.context.scene.cycles.device = 'GPU'
bpy.context.scene.cycles.samples = 10
return {"FINISHED"}
def invoke(self, context, event):
return self.execute(context)
class SNA_PT_BAKE_79642(bpy.types.Panel):
bl_label = 'Bake'
bl_idname = 'SNA_PT_BAKE_79642'
bl_space_type = 'NODE_EDITOR'
bl_region_type = 'UI'
bl_context = ''
bl_category = 'Bake Legolizer'
bl_order = 1
bl_ui_units_x=0
@classmethod
def poll(cls, context):
return not (False)
def draw_header(self, context):
layout = self.layout
def draw(self, context):
layout = self.layout
col_F1A82 = layout.column(heading='', align=False)
col_F1A82.alert = False
col_F1A82.enabled = True
col_F1A82.active = True
col_F1A82.use_property_split = False
col_F1A82.use_property_decorate = False
col_F1A82.scale_x = 1.0
col_F1A82.scale_y = 1.5
col_F1A82.alignment = 'Expand'.upper()
if not True: col_F1A82.operator_context = "EXEC_DEFAULT"
op = col_F1A82.operator('sna.operator_e20d3', text='Add Texture', icon_value=126, emboss=True, depress=False)
op = col_F1A82.operator('sna.operator001_67831', text='Smart UV', icon_value=128, emboss=True, depress=False)
layout_function = col_F1A82
sna_function_interface_7D9FC(layout_function, )
col_7419D = layout.column(heading='', align=False)
col_7419D.alert = False
col_7419D.enabled = True
col_7419D.active = True
col_7419D.use_property_split = False
col_7419D.use_property_decorate = False
col_7419D.scale_x = 1.0
col_7419D.scale_y = 1.2000000476837158
col_7419D.alignment = 'Center'.upper()
if not True: col_7419D.operator_context = "EXEC_DEFAULT"
col_7419D.label(text='Resolution', icon_value=0)
col_7419D.prop(bpy.context.scene, 'sna_resolution_width', text='Resolution Width', icon_value=0, emboss=True)
col_7419D.prop(bpy.context.scene, 'sna_resolution_height', text='Resolution Height', icon_value=0, emboss=True)
class SNA_PT_MATERIAL_PROPERTIES_63A83(bpy.types.Panel):
bl_label = 'Material Properties'
bl_idname = 'SNA_PT_MATERIAL_PROPERTIES_63A83'
bl_space_type = 'VIEW_3D'
bl_region_type = 'UI'
bl_context = ''
bl_order = 2
bl_options = {'DEFAULT_CLOSED'}
bl_parent_id = 'SNA_PT_LEGOLIZER_D7609'
bl_ui_units_x=0
@classmethod
def poll(cls, context):
return not (False)
def draw_header(self, context):
layout = self.layout
def draw(self, context):
layout = self.layout
box_5AE89 = layout.box()
box_5AE89.alert = False
box_5AE89.enabled = True
box_5AE89.active = True
box_5AE89.use_property_split = False
box_5AE89.use_property_decorate = False
box_5AE89.alignment = 'Expand'.upper()
box_5AE89.scale_x = 1.0
box_5AE89.scale_y = 1.0
if not True: box_5AE89.operator_context = "EXEC_DEFAULT"
if (bpy.context.view_layer.objects.active and bpy.context.object.active_material):
if bpy.context.object.active_material.use_nodes:
for i_53F1C in range(len(bpy.context.active_object.active_material.node_tree.nodes)):
if (bpy.context.active_object.active_material.node_tree.nodes[i_53F1C].type == 'GROUP'):
box_5AE89.separator(factor=0.10000000149011612)
col_9F17B = box_5AE89.column(heading='', align=False)
col_9F17B.alert = False
col_9F17B.enabled = True
col_9F17B.active = True
col_9F17B.use_property_split = False
col_9F17B.use_property_decorate = False
col_9F17B.scale_x = 1.0
col_9F17B.scale_y = 1.0
col_9F17B.alignment = 'Center'.upper()
if not True: col_9F17B.operator_context = "EXEC_DEFAULT"
for i_99B79 in range(len(bpy.context.active_object.active_material.node_tree.nodes[i_53F1C].inputs)):
row_7FA06 = col_9F17B.row(heading='', align=True)
row_7FA06.alert = False
row_7FA06.enabled = True
row_7FA06.active = True
row_7FA06.use_property_split = False
row_7FA06.use_property_decorate = False
row_7FA06.scale_x = 1.0
row_7FA06.scale_y = 1.0
row_7FA06.alignment = 'Expand'.upper()
if not True: row_7FA06.operator_context = "EXEC_DEFAULT"
row_7FA06.label(text=bpy.context.active_object.active_material.node_tree.nodes[i_53F1C].inputs[i_99B79].name, icon_value=0)
if ((bpy.context.active_object.active_material.node_tree.nodes[i_53F1C].inputs[i_99B79].type == 'VALUE') or (bpy.context.active_object.active_material.node_tree.nodes[i_53F1C].inputs[i_99B79].type == 'RGB') or (bpy.context.active_object.active_material.node_tree.nodes[i_53F1C].inputs[i_99B79].type == 'VECTOR') or (bpy.context.active_object.active_material.node_tree.nodes[i_53F1C].inputs[i_99B79].type == 'STRING') or (bpy.context.active_object.active_material.node_tree.nodes[i_53F1C].inputs[i_99B79].type == 'BOOLEAN') or (bpy.context.active_object.active_material.node_tree.nodes[i_53F1C].inputs[i_99B79].type == 'INT') or (bpy.context.active_object.active_material.node_tree.nodes[i_53F1C].inputs[i_99B79].type == 'RGBA') or (bpy.context.active_object.active_material.node_tree.nodes[i_53F1C].inputs[i_99B79].type == 'SHADER')):
row_7FA06.prop(bpy.context.active_object.active_material.node_tree.nodes[i_53F1C].inputs[i_99B79], 'default_value', text='', icon_value=0, emboss=True, expand=False)
row_1B3AF = box_5AE89.row(heading='', align=False)
row_1B3AF.alert = False
row_1B3AF.enabled = True
row_1B3AF.active = True
row_1B3AF.use_property_split = False
row_1B3AF.use_property_decorate = False
row_1B3AF.scale_x = 1.0
row_1B3AF.scale_y = 1.0
row_1B3AF.alignment = 'Center'.upper()
if not True: row_1B3AF.operator_context = "EXEC_DEFAULT"
row_1B3AF.label(text='Material Properties', icon_value=0)
op = row_1B3AF.operator('sna.material_properties_a10d8', text='', icon_value=1, emboss=False, depress=False)
class SNA_PT_PROPERTIES_1DA39(bpy.types.Panel):
bl_label = 'Properties'
bl_idname = 'SNA_PT_PROPERTIES_1DA39'
bl_space_type = 'VIEW_3D'
bl_region_type = 'UI'
bl_context = ''
bl_order = 1
bl_parent_id = 'SNA_PT_LEGOLIZER_D7609'
bl_ui_units_x=0
@classmethod
def poll(cls, context):
return not ((not ((len(bpy.context.active_object.modifiers) > 0) and bool(len(bpy.context.view_layer.objects.selected)))))
def draw_header(self, context):
layout = self.layout
def draw(self, context):
layout = self.layout
box_A3043 = layout.box()
box_A3043.alert = False
box_A3043.enabled = True
box_A3043.active = True
box_A3043.use_property_split = False
box_A3043.use_property_decorate = False
box_A3043.alignment = 'Expand'.upper()
box_A3043.scale_x = 1.0
box_A3043.scale_y = 1.0
if not True: box_A3043.operator_context = "EXEC_DEFAULT"
if (len(bpy.context.active_object.modifiers) > 0):
if (bpy.context.active_object.modifiers.active.name == 'Legolizer'):
col_F7B09 = box_A3043.column(heading='', align=False)
col_F7B09.alert = False
col_F7B09.enabled = True
col_F7B09.active = True
col_F7B09.use_property_split = False
col_F7B09.use_property_decorate = False
col_F7B09.scale_x = 1.0
col_F7B09.scale_y = 1.0
col_F7B09.alignment = 'Expand'.upper()
if not True: col_F7B09.operator_context = "EXEC_DEFAULT"
row_D7469 = col_F7B09.row(heading='', align=False)
row_D7469.alert = False
row_D7469.enabled = True
row_D7469.active = True
row_D7469.use_property_split = False
row_D7469.use_property_decorate = False
row_D7469.scale_x = 1.0
row_D7469.scale_y = 0.949999988079071
row_D7469.alignment = 'Center'.upper()
if not True: row_D7469.operator_context = "EXEC_DEFAULT"
row_D7469.label(text='Legolizer', icon_value=0)
col_F7B09.prop(bpy.context.scene, 'sna_legolizer_material', text='Material', icon_value=0, emboss=True)
attr_C45D9 = '["' + str('Input_5' + '"]')
col_F7B09.prop(bpy.context.view_layer.objects.active.modifiers[bpy.context.active_object.modifiers.active.name], attr_C45D9, text='Brick Size (Render)', icon_value=0, emboss=True)
col_F7B09.separator(factor=0.5)
attr_E30E8 = '["' + str('Input_2' + '"]')
col_F7B09.prop(bpy.context.view_layer.objects.active.modifiers[bpy.context.active_object.modifiers.active.name], attr_E30E8, text='Brick Size (Viewport)', icon_value=0, emboss=True)
col_F7B09.separator(factor=0.5)
attr_533AF = '["' + str('Input_46' + '"]')
col_F7B09.prop(bpy.context.view_layer.objects.active.modifiers[bpy.context.active_object.modifiers.active.name], attr_533AF, text='Mesh Resolution', icon_value=0, emboss=True)
col_F7B09.separator(factor=0.5)
attr_2308D = '["' + str('Input_29' + '"]')
col_F7B09.prop(bpy.context.view_layer.objects.active.modifiers[bpy.context.active_object.modifiers.active.name], attr_2308D, text='Brick Length X', icon_value=0, emboss=True)
col_F7B09.separator(factor=0.5)
attr_56D47 = '["' + str('Input_30' + '"]')
col_F7B09.prop(bpy.context.view_layer.objects.active.modifiers[bpy.context.active_object.modifiers.active.name], attr_56D47, text='Brick Length Y', icon_value=0, emboss=True)
col_F7B09.separator(factor=0.5)
attr_5BBD2 = '["' + str('Input_31' + '"]')
col_F7B09.prop(bpy.context.view_layer.objects.active.modifiers[bpy.context.active_object.modifiers.active.name], attr_5BBD2, text='Brick Length Z', icon_value=0, emboss=True)
col_F7B09.separator(factor=0.5)
attr_FED9E = '["' + str('Input_10' + '"]')
col_F7B09.prop(bpy.context.view_layer.objects.active.modifiers[bpy.context.active_object.modifiers.active.name], attr_FED9E, text='Fill Volume', icon_value=0, emboss=True)
col_F7B09.separator(factor=0.5)
attr_3700D = '["' + str('Input_6' + '"]')
col_F7B09.prop(bpy.context.view_layer.objects.active.modifiers[bpy.context.active_object.modifiers.active.name], attr_3700D, text='UV´s Name', icon_value=0, emboss=True)
col_F7B09.separator(factor=0.5)
attr_DCF90 = '["' + str('Input_8' + '"]')
col_F7B09.prop(bpy.context.view_layer.objects.active.modifiers[bpy.context.active_object.modifiers.active.name], attr_DCF90, text='LAYERS DESINTEGRATION', icon_value=0, emboss=True)
col_F7B09.separator(factor=0.5)
attr_C7F28 = '["' + str('Input_9' + '"]')
col_F7B09.prop(bpy.context.view_layer.objects.active.modifiers[bpy.context.active_object.modifiers.active.name], attr_C7F28, text='Animate Layers', icon_value=0, emboss=True)
col_F7B09.separator(factor=0.5)
attr_D11ED = '["' + str('Input_44' + '"]')
col_F7B09.prop(bpy.context.view_layer.objects.active.modifiers[bpy.context.active_object.modifiers.active.name], attr_D11ED, text='Randomness', icon_value=0, emboss=True)
col_F7B09.separator(factor=0.5)
attr_F5B3C = '["' + str('Input_43' + '"]')
col_F7B09.prop(bpy.context.view_layer.objects.active.modifiers[bpy.context.active_object.modifiers.active.name], attr_F5B3C, text='Animation Axis', icon_value=0, emboss=True)
col_F7B09.separator(factor=0.5)
attr_58C85 = '["' + str('Input_45' + '"]')
col_F7B09.prop(bpy.context.view_layer.objects.active.modifiers[bpy.context.active_object.modifiers.active.name], attr_58C85, text='Switch Direction', icon_value=0, emboss=True)
col_F7B09.separator(factor=0.5)
attr_1EB3A = '["' + str('Input_47' + '"]')
col_F7B09.prop(bpy.context.view_layer.objects.active.modifiers[bpy.context.active_object.modifiers.active.name], attr_1EB3A, text='Seed', icon_value=0, emboss=True)
col_F7B09.separator(factor=0.5)
attr_A9DB5 = '["' + str('Input_25' + '"]')
col_F7B09.prop(bpy.context.view_layer.objects.active.modifiers[bpy.context.active_object.modifiers.active.name], attr_A9DB5, text='Animation Speed', icon_value=0, emboss=True)
col_F7B09.separator(factor=0.5)
attr_1BC78 = '["' + str('Input_32' + '"]')
col_F7B09.prop(bpy.context.view_layer.objects.active.modifiers[bpy.context.active_object.modifiers.active.name], attr_1BC78, text='LEGO BRICKS ASSEMBLY', icon_value=0, emboss=True)
col_F7B09.separator(factor=0.5)
attr_A3B13 = '["' + str('Input_38' + '"]')
col_F7B09.prop(bpy.context.view_layer.objects.active.modifiers[bpy.context.active_object.modifiers.active.name], attr_A3B13, text='Anim. Effector', icon_value=0, emboss=True)
col_F7B09.separator(factor=0.5)
attr_36233 = '["' + str('Input_40' + '"]')
col_F7B09.prop(bpy.context.view_layer.objects.active.modifiers[bpy.context.active_object.modifiers.active.name], attr_36233, text='Animate Assembly', icon_value=0, emboss=True)
col_F7B09.separator(factor=0.5)
attr_E7A47 = '["' + str('Input_35' + '"]')
col_F7B09.prop(bpy.context.view_layer.objects.active.modifiers[bpy.context.active_object.modifiers.active.name], attr_E7A47, text='Randomness', icon_value=0, emboss=True)
col_F7B09.separator(factor=0.5)
attr_B380A = '["' + str('Input_37' + '"]')
col_F7B09.prop(bpy.context.view_layer.objects.active.modifiers[bpy.context.active_object.modifiers.active.name], attr_B380A, text='Spread Max. Distance', icon_value=0, emboss=True)
col_F7B09.separator(factor=0.5)
attr_9A02E = '["' + str('Input_42' + '"]')
col_F7B09.prop(bpy.context.view_layer.objects.active.modifiers[bpy.context.active_object.modifiers.active.name], attr_9A02E, text='Animation Axis', icon_value=0, emboss=True)
col_F7B09.separator(factor=0.5)
attr_D9D9B = '["' + str('Input_39' + '"]')
col_F7B09.prop(bpy.context.view_layer.objects.active.modifiers[bpy.context.active_object.modifiers.active.name], attr_D9D9B, text='Switch Direction', icon_value=0, emboss=True)
col_F7B09.separator(factor=0.5)
attr_EA9D3 = '["' + str('Input_48' + '"]')
col_F7B09.prop(bpy.context.view_layer.objects.active.modifiers[bpy.context.active_object.modifiers.active.name], attr_EA9D3, text='Seed', icon_value=0, emboss=True)
col_F7B09.separator(factor=0.5)
attr_FEF16 = '["' + str('Input_41' + '"]')
col_F7B09.prop(bpy.context.view_layer.objects.active.modifiers[bpy.context.active_object.modifiers.active.name], attr_FEF16, text='Animation Speed', icon_value=0, emboss=True)
else:
if (bpy.context.active_object.modifiers.active.name == 'Lego_Landscape_Generator'):
col_258B7 = box_A3043.column(heading='', align=False)
col_258B7.alert = False
col_258B7.enabled = True
col_258B7.active = True
col_258B7.use_property_split = False
col_258B7.use_property_decorate = False
col_258B7.scale_x = 1.0
col_258B7.scale_y = 1.0
col_258B7.alignment = 'Expand'.upper()
if not True: col_258B7.operator_context = "EXEC_DEFAULT"
row_9BF52 = col_258B7.row(heading='', align=False)
row_9BF52.alert = False
row_9BF52.enabled = True
row_9BF52.active = True
row_9BF52.use_property_split = False
row_9BF52.use_property_decorate = False
row_9BF52.scale_x = 1.0
row_9BF52.scale_y = 0.949999988079071
row_9BF52.alignment = 'Center'.upper()
if not True: row_9BF52.operator_context = "EXEC_DEFAULT"
row_9BF52.label(text='Lego_Landscape_Generator', icon_value=0)
col_258B7.prop(bpy.context.scene, 'sna_landscape_material', text='Material', icon_value=0, emboss=True)
attr_3DD35 = '["' + str('Input_2' + '"]')
col_258B7.prop(bpy.context.view_layer.objects.active.modifiers[bpy.context.active_object.modifiers.active.name], attr_3DD35, text='Brick Length X', icon_value=0, emboss=True)
col_258B7.separator(factor=0.5)
attr_FD116 = '["' + str('Input_3' + '"]')
col_258B7.prop(bpy.context.view_layer.objects.active.modifiers[bpy.context.active_object.modifiers.active.name], attr_FD116, text='Brick Length Y', icon_value=0, emboss=True)
col_258B7.separator(factor=0.5)
attr_7E942 = '["' + str('Input_4' + '"]')
col_258B7.prop(bpy.context.view_layer.objects.active.modifiers[bpy.context.active_object.modifiers.active.name], attr_7E942, text='Brick Length Z', icon_value=0, emboss=True)
col_258B7.separator(factor=0.5)
attr_9808F = '["' + str('Input_8' + '"]')
col_258B7.prop(bpy.context.view_layer.objects.active.modifiers[bpy.context.active_object.modifiers.active.name], attr_9808F, text='Landscape Size', icon_value=0, emboss=True)
col_258B7.separator(factor=0.5)
attr_4476E = '["' + str('Input_40' + '"]')
col_258B7.prop(bpy.context.view_layer.objects.active.modifiers[bpy.context.active_object.modifiers.active.name], attr_4476E, text='Biome Toggle', icon_value=0, emboss=True)
col_258B7.separator(factor=0.5)
attr_622A9 = '["' + str('Input_12' + '"]')
col_258B7.prop(bpy.context.view_layer.objects.active.modifiers[bpy.context.active_object.modifiers.active.name], attr_622A9, text='Scale', icon_value=0, emboss=True)
col_258B7.separator(factor=0.5)
attr_9DCE5 = '["' + str('Input_11' + '"]')
col_258B7.prop(bpy.context.view_layer.objects.active.modifiers[bpy.context.active_object.modifiers.active.name], attr_9DCE5, text='Seed', icon_value=0, emboss=True)
col_258B7.separator(factor=0.5)
attr_F166A = '["' + str('Input_10' + '"]')
col_258B7.prop(bpy.context.view_layer.objects.active.modifiers[bpy.context.active_object.modifiers.active.name], attr_F166A, text='Base Level', icon_value=0, emboss=True)
col_258B7.separator(factor=0.5)
attr_CFFC7 = '["' + str('Input_13' + '"]')
col_258B7.prop(bpy.context.view_layer.objects.active.modifiers[bpy.context.active_object.modifiers.active.name], attr_CFFC7, text='Depression', icon_value=0, emboss=True)
col_258B7.separator(factor=0.5)
attr_A2D6E = '["' + str('Input_42' + '"]')
col_258B7.prop(bpy.context.view_layer.objects.active.modifiers[bpy.context.active_object.modifiers.active.name], attr_A2D6E, text='Maximum Height', icon_value=0, emboss=True)
col_258B7.separator(factor=0.5)
attr_7041F = '["' + str('Input_14' + '"]')
col_258B7.prop(bpy.context.view_layer.objects.active.modifiers[bpy.context.active_object.modifiers.active.name], attr_7041F, text='Micro-relief', icon_value=0, emboss=True)
col_258B7.separator(factor=0.5)
attr_A591F = '["' + str('Socket_2' + '"]')
col_258B7.prop(bpy.context.view_layer.objects.active.modifiers[bpy.context.active_object.modifiers.active.name], attr_A591F, text='Rotate', icon_value=0, emboss=True)
col_258B7.separator(factor=0.5)
attr_9B939 = '["' + str('Input_43' + '"]')
col_258B7.prop(bpy.context.view_layer.objects.active.modifiers[bpy.context.active_object.modifiers.active.name], attr_9B939, text='Material Replace', icon_value=0, emboss=True)
col_258B7.separator(factor=0.5)
attr_54B13 = '["' + str('Input_17' + '"]')
col_258B7.prop(bpy.context.view_layer.objects.active.modifiers[bpy.context.active_object.modifiers.active.name], attr_54B13, text='LANDSCAPE ANIMATION', icon_value=0, emboss=True)
col_258B7.separator(factor=0.5)
attr_CA5F6 = '["' + str('Input_16' + '"]')
col_258B7.prop(bpy.context.view_layer.objects.active.modifiers[bpy.context.active_object.modifiers.active.name], attr_CA5F6, text='Animate Landscape', icon_value=0, emboss=True)
col_258B7.separator(factor=0.5)
attr_5F8CE = '["' + str('Input_19' + '"]')
col_258B7.prop(bpy.context.view_layer.objects.active.modifiers[bpy.context.active_object.modifiers.active.name], attr_5F8CE, text='Switch Direction', icon_value=0, emboss=True)
col_258B7.separator(factor=0.5)
attr_B33FE = '["' + str('Input_18' + '"]')
col_258B7.prop(bpy.context.view_layer.objects.active.modifiers[bpy.context.active_object.modifiers.active.name], attr_B33FE, text='Animation Speed', icon_value=0, emboss=True)
col_258B7.separator(factor=0.5)
attr_5394A = '["' + str('Input_36' + '"]')
col_258B7.prop(bpy.context.view_layer.objects.active.modifiers[bpy.context.active_object.modifiers.active.name], attr_5394A, text='LAYER DESINTEGRATION', icon_value=0, emboss=True)
col_258B7.separator(factor=0.5)
attr_BE2B6 = '["' + str('Input_30' + '"]')
col_258B7.prop(bpy.context.view_layer.objects.active.modifiers[bpy.context.active_object.modifiers.active.name], attr_BE2B6, text='Animate Layers', icon_value=0, emboss=True)
col_258B7.separator(factor=0.5)
attr_A0D48 = '["' + str('Input_31' + '"]')
col_258B7.prop(bpy.context.view_layer.objects.active.modifiers[bpy.context.active_object.modifiers.active.name], attr_A0D48, text='Randomness', icon_value=0, emboss=True)
col_258B7.separator(factor=0.5)
attr_B3B38 = '["' + str('Input_32' + '"]')
col_258B7.prop(bpy.context.view_layer.objects.active.modifiers[bpy.context.active_object.modifiers.active.name], attr_B3B38, text='Animation Axis', icon_value=0, emboss=True)
col_258B7.separator(factor=0.5)
attr_B19C2 = '["' + str('Input_33' + '"]')
col_258B7.prop(bpy.context.view_layer.objects.active.modifiers[bpy.context.active_object.modifiers.active.name], attr_B19C2, text='Switch Direction', icon_value=0, emboss=True)
col_258B7.separator(factor=0.5)
attr_DEAF4 = '["' + str('Input_34' + '"]')
col_258B7.prop(bpy.context.view_layer.objects.active.modifiers[bpy.context.active_object.modifiers.active.name], attr_DEAF4, text='Seed', icon_value=0, emboss=True)
col_258B7.separator(factor=0.5)
attr_247D8 = '["' + str('Input_35' + '"]')
col_258B7.prop(bpy.context.view_layer.objects.active.modifiers[bpy.context.active_object.modifiers.active.name], attr_247D8, text='Animation Speed', icon_value=0, emboss=True)
col_258B7.separator(factor=0.5)
attr_33F3D = '["' + str('Input_23' + '"]')
col_258B7.prop(bpy.context.view_layer.objects.active.modifiers[bpy.context.active_object.modifiers.active.name], attr_33F3D, text='BRICKS ASSEMBLY', icon_value=0, emboss=True)
col_258B7.separator(factor=0.5)
attr_80F00 = '["' + str('Input_38' + '"]')
col_258B7.prop(bpy.context.view_layer.objects.active.modifiers[bpy.context.active_object.modifiers.active.name], attr_80F00, text='Anim. Effector', icon_value=0, emboss=True)
col_258B7.separator(factor=0.5)
attr_6353D = '["' + str('Input_24' + '"]')
col_258B7.prop(bpy.context.view_layer.objects.active.modifiers[bpy.context.active_object.modifiers.active.name], attr_6353D, text='Animate Assembly', icon_value=0, emboss=True)
col_258B7.separator(factor=0.5)
attr_5996A = '["' + str('Input_37' + '"]')
col_258B7.prop(bpy.context.view_layer.objects.active.modifiers[bpy.context.active_object.modifiers.active.name], attr_5996A, text='Randomness', icon_value=0, emboss=True)
col_258B7.separator(factor=0.5)
attr_36F9C = '["' + str('Input_25' + '"]')
col_258B7.prop(bpy.context.view_layer.objects.active.modifiers[bpy.context.active_object.modifiers.active.name], attr_36F9C, text='Spread Max. Distance', icon_value=0, emboss=True)
col_258B7.separator(factor=0.5)
attr_95ECF = '["' + str('Input_26' + '"]')
col_258B7.prop(bpy.context.view_layer.objects.active.modifiers[bpy.context.active_object.modifiers.active.name], attr_95ECF, text='Animation Axis', icon_value=0, emboss=True)
col_258B7.separator(factor=0.5)
attr_FBB2C = '["' + str('Input_27' + '"]')
col_258B7.prop(bpy.context.view_layer.objects.active.modifiers[bpy.context.active_object.modifiers.active.name], attr_FBB2C, text='Switch Direction', icon_value=0, emboss=True)
col_258B7.separator(factor=0.5)
attr_B5DAF = '["' + str('Input_28' + '"]')
col_258B7.prop(bpy.context.view_layer.objects.active.modifiers[bpy.context.active_object.modifiers.active.name], attr_B5DAF, text='Seed', icon_value=0, emboss=True)
col_258B7.separator(factor=0.5)
attr_75D9A = '["' + str('Input_29' + '"]')
col_258B7.prop(bpy.context.view_layer.objects.active.modifiers[bpy.context.active_object.modifiers.active.name], attr_75D9A, text='Animation Speed', icon_value=0, emboss=True)
else:
box_A3043.label(text='Please Select Legolizer/Landscape Modifier', icon_value=0)
else:
box_A3043.label(text='Please Add Legolizer/Landscape Modifier', icon_value=0)
def register():
global _icons
_icons = bpy.utils.previews.new()
bpy.types.Scene.sna_new_property = bpy.props.BoolProperty(name='New Property', description='', default=False)
bpy.types.Scene.sna_resolution_width = bpy.props.IntProperty(name='Resolution Width', description='', default=1024, subtype='NONE')
bpy.types.Scene.sna_aldezel_properties = bpy.props.StringProperty(name='Al-Dezel Properties', description='Al-Dezel Properties', default='', subtype='NONE', maxlen=0)
bpy.types.Scene.sna_resolution_height = bpy.props.IntProperty(name='Resolution Height', description='', default=1024, subtype='NONE')
bpy.types.Scene.sna_legolizer_material = bpy.props.PointerProperty(name='Legolizer Material', description='', type=bpy.types.Material, update=sna_update_sna_legolizer_material_9D59F)
bpy.types.Scene.sna_landscape_material = bpy.props.PointerProperty(name='Landscape Material', description='', type=bpy.types.Material, update=sna_update_sna_landscape_material_E64B9)
bpy.utils.register_class(SNA_OT_Operator_88521)
bpy.utils.register_class(SNA_PT_LEGOLIZER_D7609)
bpy.utils.register_class(SNA_OT_Operator_79C5B)
bpy.utils.register_class(SNA_OT_Operator002_5E694)
bpy.utils.register_class(SNA_AddonPreferences_2E6BD)
bpy.utils.register_class(SNA_OT_Material_Properties_A10D8)
bpy.utils.register_class(SNA_OT_Geometry_Properties_87F4A)
bpy.app.handlers.load_post.append(load_post_handler_E1A6F)
bpy.utils.register_class(SNA_OT_Add_Legolizer_Setup_B16Ae)
bpy.utils.register_class(SNA_OT_Operator001_67831)
bpy.utils.register_class(SNA_OT_Operator_E20D3)
bpy.utils.register_class(SNA_PT_BAKE_79642)
bpy.utils.register_class(SNA_PT_MATERIAL_PROPERTIES_63A83)
bpy.utils.register_class(SNA_PT_PROPERTIES_1DA39)
kc = bpy.context.window_manager.keyconfigs.addon
km = kc.keymaps.new(name='Window', space_type='EMPTY')
kmi = km.keymap_items.new('sna.operator_79c5b', 'L', 'PRESS',
ctrl=False, alt=False, shift=False, repeat=False)
addon_keymaps['27F5F'] = (km, kmi)
kc = bpy.context.window_manager.keyconfigs.addon
km = kc.keymaps.new(name='Window', space_type='EMPTY')
kmi = km.keymap_items.new('sna.operator002_5e694', 'P', 'PRESS',
ctrl=False, alt=False, shift=False, repeat=False)
addon_keymaps['94A0F'] = (km, kmi)
kc = bpy.context.window_manager.keyconfigs.addon
km = kc.keymaps.new(name='Window', space_type='EMPTY')
kmi = km.keymap_items.new('sna.add_legolizer_setup_b16ae', 'A', 'PRESS',
ctrl=True, alt=False, shift=True, repeat=False)
addon_keymaps['4D60F'] = (km, kmi)
def unregister():
global _icons
bpy.utils.previews.remove(_icons)
wm = bpy.context.window_manager
kc = wm.keyconfigs.addon
for km, kmi in addon_keymaps.values():
km.keymap_items.remove(kmi)
addon_keymaps.clear()
del bpy.types.Scene.sna_landscape_material
del bpy.types.Scene.sna_legolizer_material
del bpy.types.Scene.sna_resolution_height
del bpy.types.Scene.sna_aldezel_properties
del bpy.types.Scene.sna_resolution_width
del bpy.types.Scene.sna_new_property
bpy.utils.unregister_class(SNA_OT_Operator_88521)
bpy.utils.unregister_class(SNA_PT_LEGOLIZER_D7609)
bpy.utils.unregister_class(SNA_OT_Operator_79C5B)
bpy.utils.unregister_class(SNA_OT_Operator002_5E694)
bpy.utils.unregister_class(SNA_AddonPreferences_2E6BD)
bpy.utils.unregister_class(SNA_OT_Material_Properties_A10D8)
bpy.utils.unregister_class(SNA_OT_Geometry_Properties_87F4A)
bpy.app.handlers.load_post.remove(load_post_handler_E1A6F)
bpy.utils.unregister_class(SNA_OT_Add_Legolizer_Setup_B16Ae)
bpy.utils.unregister_class(SNA_OT_Operator001_67831)
bpy.utils.unregister_class(SNA_OT_Operator_E20D3)
bpy.utils.unregister_class(SNA_PT_BAKE_79642)
bpy.utils.unregister_class(SNA_PT_MATERIAL_PROPERTIES_63A83)
bpy.utils.unregister_class(SNA_PT_PROPERTIES_1DA39)