Skip to content
Snippets Groups Projects
__init__.py 17.2 KiB
Newer Older
  • Learn to ignore specific revisions
  • # ##### BEGIN GPL LICENSE BLOCK #####
    #
    #  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 2
    #  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
    #  MERCHANTABILITY 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, write to the Free Software Foundation,
    #  Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
    #
    # ##### END GPL LICENSE BLOCK #####
    
    # Contributed to by:
    # meta-androcto, Bill Currie, Jorge Hernandez - Melenedez  Jacob Morris, Oscurart  #
    # Rebellion, Antonis Karvelas, Eleanor Howick, lijenstina, Daniel Schalla, Domlysz #
    # Unnikrishnan(kodemax), Florian Meyer, Omar ahmed, Brian Hinton (Nichod), liero   #
    
    # Atom, Dannyboy, Mano-Wii, Kursad Karatas, teldredge, Phil Cote #
    
    
    bl_info = {
        "name": "Add Advanced Objects",
    
        "author": "Meta Androcto",
    
        "blender": (2, 78, 0),
        "location": "View3D > Add ",
        "description": "Add Object & Camera extras",
        "warning": "",
        "wiki_url": "https://wiki.blender.org/index.php/Extensions:2.6"
    
                    "/Py/Scripts/Object/Add_Advanced",
    
        "category": "Object"}
    
    if "bpy" in locals():
        import importlib
    
        importlib.reload(add_light_template)
        importlib.reload(scene_objects_bi)
        importlib.reload(scene_objects_cycles)
        importlib.reload(scene_texture_render)
        importlib.reload(trilighting)
        importlib.reload(pixelate_3d)
        importlib.reload(object_add_chain)
    
        importlib.reload(oscurart_chain_maker)
    
        importlib.reload(circle_array)
        importlib.reload(copy2)
        importlib.reload(make_struts)
        importlib.reload(random_box_structure)
        importlib.reload(cubester)
        importlib.reload(rope_alpha)
        importlib.reload(add_mesh_aggregate)
        importlib.reload(arrange_on_curve)
        importlib.reload(mesh_easylattice)
    
        from . import add_light_template
        from . import scene_objects_bi
        from . import scene_objects_cycles
        from . import scene_texture_render
        from . import trilighting
        from . import pixelate_3d
        from . import object_add_chain
    
        from . import oscurart_chain_maker
    
        from . import circle_array
        from . import copy2
        from . import make_struts
        from . import random_box_structure
        from . import cubester
        from . import rope_alpha
        from . import add_mesh_aggregate
        from . import arrange_on_curve
        from . import mesh_easylattice
    
    
    
    import bpy
    from bpy.types import (
    
        AddonPreferences,
        Menu,
        PropertyGroup,
    )
    
    from bpy.props import (
    
        BoolProperty,
        EnumProperty,
        FloatProperty,
        IntProperty,
        StringProperty,
        PointerProperty,
    )
    
    # Define the "Scenes" menu
    
    class VIEW3D_MT_scene_elements_add(Menu):
        bl_idname = "VIEW3D_MT_scene_elements"
    
        bl_label = "Test Scenes"
    
    
        def draw(self, context):
            layout = self.layout
            layout.operator_context = 'INVOKE_REGION_WIN'
            layout.operator("bi.add_scene",
                            text="Scene_Objects_BI")
            layout.operator("objects_cycles.add_scene",
                            text="Scene_Objects_Cycles")
            layout.operator("objects_texture.add_scene",
                            text="Scene_Textures_Cycles")
    
    
    
    # Define the "Lights" menu
    
    class VIEW3D_MT_mesh_lights_add(Menu):
        bl_idname = "VIEW3D_MT_scene_lights"
    
        bl_label = "Lighting Sets"
    
        def draw(self, context):
            layout = self.layout
            layout.operator_context = 'INVOKE_REGION_WIN'
            layout.operator("object.add_light_template",
                            text="Add Light Template")
            layout.operator("object.trilighting",
                            text="Add Tri Lighting")
    
    
    
    # Define the "Chains" menu
    
    class VIEW3D_MT_mesh_chain_add(Menu):
        bl_idname = "VIEW3D_MT_mesh_chain"
    
        bl_label = "Chains"
    
        def draw(self, context):
            layout = self.layout
            layout.operator_context = 'INVOKE_REGION_WIN'
            layout.operator("mesh.primitive_chain_add", icon="LINKED")
            layout.operator("mesh.primitive_oscurart_chain_add", icon="LINKED")
    
    
    
    # Define the "Array" Menu
    
    class VIEW3D_MT_array_mods_add(Menu):
        bl_idname = "VIEW3D_MT_array_mods"
    
        bl_label = "Array Mods"
    
        def draw(self, context):
            layout = self.layout
            layout.operator_context = 'INVOKE_REGION_WIN'
    
            layout.menu("VIEW3D_MT_mesh_chain", icon="LINKED")
    
            layout.operator("objects.circle_array_operator",
    
                            text="Circle Array", icon="MOD_ARRAY")
    
            layout.operator("object.agregate_mesh",
    
                            text="Aggregate Mesh", icon="MOD_ARRAY")
            layout.operator("mesh.copy2",
                    text="Copy To Vert/Edge", icon="MOD_ARRAY")
    
    # Define the "Blocks" Menu
    
    class VIEW3D_MT_quick_blocks_add(Menu):
        bl_idname = "VIEW3D_MT_quick_tools"
    
        bl_label = "Block Tools"
    
        def draw(self, context):
            layout = self.layout
            layout.operator_context = 'INVOKE_REGION_WIN'
    
    
            layout.operator("object.pixelate", icon="MESH_GRID")
            layout.operator("mesh.generate_struts",
                        text="Struts", icon="GRID")
            layout.operator("object.make_structure",
                        text="Random Boxes", icon="SEQ_SEQUENCER")
            layout.operator("object.easy_lattice",
                        text="Easy Lattice", icon="MOD_LATTICE")
    
    
    # Define the "Phsysics Tools" Menu
    
    class VIEW3D_MT_Physics_tools_add(Menu):
        bl_idname = "VIEW3D_MT_physics_tools"
    
        bl_label = "Physics Tools"
    
        def draw(self, context):
            layout = self.layout
            layout.operator_context = 'INVOKE_REGION_WIN'
    
            layout.operator("ball.rope",
                            text="Wrecking Ball", icon='PHYSICS')
            layout.operator("clot.rope",
                            text="Cloth Rope", icon='PHYSICS')
    
    
    # Define "Extras" menu
    def menu(self, context):
        layout = self.layout
        layout.operator_context = 'INVOKE_REGION_WIN'
        self.layout.separator()
    
        self.layout.menu("VIEW3D_MT_scene_elements", icon="SCENE_DATA")
        self.layout.menu("VIEW3D_MT_scene_lights", icon="LIGHT_SPOT")
    
        self.layout.separator()
    
        self.layout.menu("VIEW3D_MT_array_mods", icon="MOD_ARRAY")
        self.layout.menu("VIEW3D_MT_quick_tools", icon="MOD_BUILD")
        self.layout.menu("VIEW3D_MT_physics_tools", icon="PHYSICS")
    
    class AdvancedObjPreferences(AddonPreferences):
    
        show_menu_list: BoolProperty(
    
            name="Menu List",
            description="Show/Hide the Add Menu items",
            default=False
        )
    
        show_panel_list: BoolProperty(
    
            name="Panels List",
            description="Show/Hide the Panel items",
            default=False
        )
    
        def draw(self, context):
            layout = self.layout
    
    
            icon_1 = "TRIA_RIGHT" if not self.show_menu_list else "TRIA_DOWN"
            box = layout.box()
            box.prop(self, "show_menu_list", emboss=False, icon=icon_1)
    
            if self.show_menu_list:
                box.label(text="Items located in the Add Menu (default shortcut Ctrl + A):",
                          icon="LAYER_USED")
                box.label(text="Test Scenes:", icon="LAYER_ACTIVE")
                box.label(text="Scene Objects BI, Scene Objects Cycles, Scene Textures Cycles",
                          icon="LAYER_USED")
                box.label(text="Lighting Sets:", icon="LAYER_ACTIVE")
                box.label(text="Add Light Template, Add Tri Lighting", icon="LAYER_USED")
                box.label(text="Array Mods:", icon="LAYER_ACTIVE")
                box.label(text="Circle Array, Chains submenu, Copy Vert/Edge and Aggregate Mesh",
                             icon="LAYER_ACTIVE")
                box.label(text="Chains Submenu - Add Chain, Chain to Bones",
                          icon="LAYER_ACTIVE")
                box.label(text="Block Tools:", icon="LAYER_ACTIVE")
                box.label(text="Pixelate Object, Struts, Random Boxes, Easy Lattice",
                          icon="LAYER_USED")
                box.label(text="Physics Tools:", icon="LAYER_ACTIVE")
    
                box.label(text="Wrecking Ball and Cloth Rope", icon="LAYER_USED")
    
    
            icon_2 = "TRIA_RIGHT" if not self.show_panel_list else "TRIA_DOWN"
            box = layout.box()
            box.prop(self, "show_panel_list", emboss=False, icon=icon_2)
    
            if self.show_panel_list:
                box.label(text="Panels located in 3D View Tools Region > Create",
                          icon="LAYER_ACTIVE")
                box.label(text="CubeSter", icon="LAYER_USED")
    
                box.label(text="Arrange on Curve  (Shown if an Active Curve Object is it the 3D View)",
    
    
    
    # Cubester update functions
    def find_audio_length(self, context):
        adv_obj = context.scene.advanced_objects
        audio_file = adv_obj.cubester_audio_path
        length = 0
    
        if audio_file != "":
            # confirm that strip hasn't been loaded yet
            get_sequence = getattr(context.scene.sequence_editor, "sequences_all", [])
            for strip in get_sequence:
                if type(strip) == bpy.types.SoundSequence and strip.sound.filepath == audio_file:
                    length = strip.frame_final_duration
    
            if length == 0:
                area = context.area
                old_type = area.type
                area.type = "SEQUENCE_EDITOR"
                try:
                    bpy.ops.sequencer.sound_strip_add(filepath=audio_file)
                    adv_obj.cubester_check_audio = True
                except Exception as e:
                    print("\n[Add Advanced Objects]\n Function: "
                          "find_audio_length\n {}\n".format(e))
                    adv_obj.cubester_check_audio = False
                    pass
    
                area.type = old_type
    
            # find audio file
            for strip in context.scene.sequence_editor.sequences_all:
                if type(strip) == bpy.types.SoundSequence and strip.sound.filepath == audio_file:
                    adv_obj.cubester_check_audio = True
                    length = strip.frame_final_duration
    
        adv_obj.cubester_audio_file_length = length
    
    
    # load image if possible
    def adjust_selected_image(self, context):
        scene = context.scene.advanced_objects
        try:
            image = bpy.data.images.load(scene.cubester_load_image)
            scene.cubester_image = image.name
        except Exception as e:
            print("\n[Add Advanced Objects]\n Function: "
                  "adjust_selected_image\n {}\n".format(e))
    
    
    # load color image if possible
    def adjust_selected_color_image(self, context):
        scene = context.scene.advanced_objects
        try:
            image = bpy.data.images.load(scene.cubester_load_color_image)
            scene.cubester_color_image = image.name
        except Exception as e:
            print("\nAdd Advanced Objects]\n Function: "
                  "adjust_selected_color_image\n {}\n".format(e))
    
    
    class AdvancedObjProperties(PropertyGroup):
        # cubester
        # main properties
    
        cubester_check_audio: BoolProperty(
    
        cubester_audio_image: EnumProperty(
    
            name="Input Type",
            items=(("image", "Image",
                    "Use an Image as input for generating Geometry", "IMAGE_COL", 0),
                   ("audio", "Audio",
                    "Use a Sound Strip as input for generating Geometry", "FILE_SOUND", 1))
        )
    
        cubester_audio_file_length: IntProperty(
    
        cubester_audio_path: StringProperty(
    
            default="",
            name="Audio File",
            subtype="FILE_PATH",
            update=find_audio_length
        )
    
        cubester_audio_min_freq: IntProperty(
    
            name="Minimum Frequency",
            min=20, max=100000,
            default=20
        )
    
        cubester_audio_max_freq: IntProperty(
    
            name="Maximum Frequency",
            min=21, max=999999,
            default=5000
        )
    
        cubester_audio_offset_type: EnumProperty(
    
            name="Offset Type",
            items=(("freq", "Frequency Offset", ""),
                   ("frame", "Frame Offset", "")),
            description="Type of offset per row of mesh"
        )
    
        cubester_audio_frame_offset: IntProperty(
    
            name="Frame Offset",
            min=0, max=10,
            default=2
        )
    
        cubester_audio_block_layout: EnumProperty(
    
            name="Block Layout",
            items=(("rectangle", "Rectangular", ""),
                  ("radial", "Radial", ""))
        )
    
        cubester_audio_width_blocks: IntProperty(
    
            name="Width Block Count",
            min=1, max=10000,
            default=5
        )
    
        cubester_audio_length_blocks: IntProperty(
    
            name="Length Block Count",
            min=1, max=10000,
            default=50
        )
    
        cubester_load_type: EnumProperty(
    
            name="Image Input Type",
            items=(("single", "Single Image", ""),
                  ("multiple", "Image Sequence", ""))
        )
    
        cubester_image: StringProperty(
    
        cubester_load_image: StringProperty(
    
            default="",
            name="Load Image",
            subtype="FILE_PATH",
            update=adjust_selected_image
        )
    
        cubester_skip_images: IntProperty(
    
            name="Image Step",
            min=1, max=30,
            default=1,
            description="Step from image to image by this number"
        )
    
        cubester_max_images: IntProperty(
    
            name="Max Number Of Images",
            min=2, max=1000,
            default=10,
            description="Maximum number of images to be used"
        )
    
        cubester_frame_step: IntProperty(
    
            name="Frame Step Size",
            min=1, max=10,
            default=4,
            description="The number of frames each picture is used"
        )
    
        cubester_skip_pixels: IntProperty(
    
            name="Skip # Pixels",
            min=0, max=256,
            default=64,
            description="Skip this number of pixels before placing the next"
        )
    
        cubester_mesh_style: EnumProperty(
    
            name="Mesh Type",
            items=(("blocks", "Blocks", ""),
                   ("plane", "Plane", "")),
            description="Compose mesh of multiple blocks or of a single plane"
        )
    
        cubester_block_style: EnumProperty(
    
            name="Block Style",
            items=(("size", "Vary Size", ""),
                   ("position", "Vary Position", "")),
            description="Vary Z-size of block, or vary Z-position"
        )
    
        cubester_height_scale: FloatProperty(
    
            name="Height Scale",
            subtype="DISTANCE",
            min=0.1, max=2,
            default=0.2
        )
    
        cubester_invert: BoolProperty(
    
        cubester_size_per_hundred_pixels: FloatProperty(
    
            name="Size Per 100 Blocks/Points",
            subtype="DISTANCE",
            min=0.001, max=5,
            default=1
        )
    
        cubester_materials: EnumProperty(
    
            name="Material",
            items=(("vertex", "Vertex Colors", ""),
                   ("image", "Image", "")),
            description="Color with vertex colors, or uv unwrap and use an image"
        )
    
        cubester_use_image_color: BoolProperty(
    
            name="Use Original Image Colors'?",
            default=True,
            description="Use original image colors, or replace with an another one"
        )
    
        cubester_color_image: StringProperty(
    
        cubester_load_color_image: StringProperty(
    
            default="",
            name="Load Color Image",
            subtype="FILE_PATH",
            update=adjust_selected_color_image
        )
    
        cubester_vertex_colors = {}
        # advanced
    
        cubester_advanced: BoolProperty(
    
            name="Advanced Options",
            default=False
        )
    
        cubester_random_weights: BoolProperty(
    
            name="Random Weights",
            default=False
        )
    
        cubester_weight_r: FloatProperty(
    
            name="Red",
            subtype="FACTOR",
            min=0.01, max=1.0,
            default=0.25
        )
    
        cubester_weight_g: FloatProperty(
    
            name="Green",
            subtype="FACTOR",
            min=0.01, max=1.0,
            default=0.25
        )
    
        cubester_weight_b: FloatProperty(
    
            name="Blue",
            subtype="FACTOR",
            min=0.01, max=1.0,
            default=0.25
        )
    
        cubester_weight_a: FloatProperty(
    
            name="Alpha",
            subtype="FACTOR",
            min=0.01, max=1.0,
            default=0.25
        )
    
        arrange_c_use_selected: BoolProperty(
    
            name="Use Selected",
            description="Use the selected objects to duplicate",
            default=True,
        )
    
        arrange_c_obj_arranjar: StringProperty(
    
        arrange_c_select_type: EnumProperty(
    
            name="Type",
            description="Select object or group",
            items=[
                ('O', "Object", "Make duplicates of a specific object"),
                ('G', "Group", "Make duplicates of the objects in a group"),
            ],
            default='O',
        )
    
    
    
    def register():
        bpy.utils.register_module(__name__)
    
    
        bpy.types.Scene.advanced_objects = PointerProperty(
    
        # Add "Extras" menu to the "Add" menu
    
        try:
            bpy.types.VIEW3D_MT_AddMenu.append(menu)
        except:
            pass
    
    
    def unregister():
        # Remove "Extras" menu from the "Add" menu.
    
        try:
            bpy.types.VIEW3D_MT_AddMenu.remove(menu)
        except:
            pass
    
        bpy.utils.unregister_module(__name__)
    
        del bpy.types.Scene.advanced_objects
    
    
    
    if __name__ == "__main__":
        register()