space_view3d_test_scenes: initial commit: move from advanced objects
[blender-addons-contrib.git] / add_advanced_objects_menu / __init__.py
1 # ##### BEGIN GPL LICENSE BLOCK #####
2 #
3 #  This program is free software; you can redistribute it and/or
4 #  modify it under the terms of the GNU General Public License
5 #  as published by the Free Software Foundation; either version 2
6 #  of the License, or (at your option) any later version.
7 #
8 #  This program is distributed in the hope that it will be useful,
9 #  but WITHOUT ANY WARRANTY; without even the implied warranty of
10 #  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11 #  GNU General Public License for more details.
12 #
13 #  You should have received a copy of the GNU General Public License
14 #  along with this program; if not, write to the Free Software Foundation,
15 #  Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
16 #
17 # ##### END GPL LICENSE BLOCK #####
18
19 # Contributed to by:
20 # meta-androcto, Bill Currie, Jorge Hernandez - Melenedez  Jacob Morris, Oscurart  #
21 # Rebellion, Antonis Karvelas, Eleanor Howick, lijenstina, Daniel Schalla, Domlysz #
22 # Unnikrishnan(kodemax), Florian Meyer, Omar ahmed, Brian Hinton (Nichod), liero   #
23 # Atom, Dannyboy, Mano-Wii, Kursad Karatas, teldredge, Phil Cote #
24
25 bl_info = {
26     "name": "Add Advanced Objects",
27     "author": "Meta Androcto",
28     "version": (0, 1, 6),
29     "blender": (2, 78, 0),
30     "location": "View3D > Add ",
31     "description": "Add Object & Camera extras",
32     "warning": "",
33     "wiki_url": "https://wiki.blender.org/index.php/Extensions:2.6"
34                 "/Py/Scripts/Object/Add_Advanced",
35     "category": "Object"}
36
37 if "bpy" in locals():
38     import importlib
39
40     importlib.reload(add_light_template)
41     importlib.reload(scene_objects_bi)
42     importlib.reload(scene_objects_cycles)
43     importlib.reload(scene_texture_render)
44     importlib.reload(trilighting)
45     importlib.reload(pixelate_3d)
46     importlib.reload(object_add_chain)
47     importlib.reload(oscurart_chain_maker)
48     importlib.reload(circle_array)
49     importlib.reload(copy2)
50     importlib.reload(make_struts)
51     importlib.reload(random_box_structure)
52     importlib.reload(cubester)
53     importlib.reload(rope_alpha)
54     importlib.reload(add_mesh_aggregate)
55     importlib.reload(arrange_on_curve)
56     importlib.reload(mesh_easylattice)
57
58 else:
59     from . import add_light_template
60     from . import scene_objects_bi
61     from . import scene_objects_cycles
62     from . import scene_texture_render
63     from . import trilighting
64     from . import pixelate_3d
65     from . import object_add_chain
66     from . import oscurart_chain_maker
67     from . import circle_array
68     from . import copy2
69     from . import make_struts
70     from . import random_box_structure
71     from . import cubester
72     from . import rope_alpha
73     from . import add_mesh_aggregate
74     from . import arrange_on_curve
75     from . import mesh_easylattice
76
77
78 import bpy
79 from bpy.types import (
80     AddonPreferences,
81     Menu,
82     PropertyGroup,
83 )
84 from bpy.props import (
85     BoolProperty,
86     EnumProperty,
87     FloatProperty,
88     IntProperty,
89     StringProperty,
90     PointerProperty,
91 )
92
93
94 # Define the "Scenes" menu
95 class VIEW3D_MT_scene_elements_add(Menu):
96     bl_idname = "VIEW3D_MT_scene_elements"
97     bl_label = "Test Scenes"
98
99     def draw(self, context):
100         layout = self.layout
101         layout.operator_context = 'INVOKE_REGION_WIN'
102         layout.operator("bi.add_scene",
103                         text="Scene_Objects_BI")
104         layout.operator("objects_cycles.add_scene",
105                         text="Scene_Objects_Cycles")
106         layout.operator("objects_texture.add_scene",
107                         text="Scene_Textures_Cycles")
108
109
110 # Define the "Lights" menu
111 class VIEW3D_MT_mesh_lights_add(Menu):
112     bl_idname = "VIEW3D_MT_scene_lights"
113     bl_label = "Lighting Sets"
114
115     def draw(self, context):
116         layout = self.layout
117         layout.operator_context = 'INVOKE_REGION_WIN'
118         layout.operator("object.add_light_template",
119                         text="Add Light Template")
120         layout.operator("object.trilighting",
121                         text="Add Tri Lighting")
122
123
124 # Define the "Chains" menu
125 class VIEW3D_MT_mesh_chain_add(Menu):
126     bl_idname = "VIEW3D_MT_mesh_chain"
127     bl_label = "Chains"
128
129     def draw(self, context):
130         layout = self.layout
131         layout.operator_context = 'INVOKE_REGION_WIN'
132         layout.operator("mesh.primitive_chain_add", icon="LINKED")
133         layout.operator("mesh.primitive_oscurart_chain_add", icon="LINKED")
134
135
136 # Define the "Array" Menu
137 class VIEW3D_MT_array_mods_add(Menu):
138     bl_idname = "VIEW3D_MT_array_mods"
139     bl_label = "Array Mods"
140
141     def draw(self, context):
142         layout = self.layout
143         layout.operator_context = 'INVOKE_REGION_WIN'
144
145         layout.menu("VIEW3D_MT_mesh_chain", icon="LINKED")
146
147         layout.operator("objects.circle_array_operator",
148                         text="Circle Array", icon="MOD_ARRAY")
149         layout.operator("object.agregate_mesh",
150                         text="Aggregate Mesh", icon="MOD_ARRAY")
151         layout.operator("mesh.copy2",
152                 text="Copy To Vert/Edge", icon="MOD_ARRAY")
153
154
155 # Define the "Blocks" Menu
156 class VIEW3D_MT_quick_blocks_add(Menu):
157     bl_idname = "VIEW3D_MT_quick_tools"
158     bl_label = "Block Tools"
159
160     def draw(self, context):
161         layout = self.layout
162         layout.operator_context = 'INVOKE_REGION_WIN'
163
164         layout.operator("object.pixelate", icon="MESH_GRID")
165         layout.operator("mesh.generate_struts",
166                     text="Struts", icon="GRID")
167         layout.operator("object.make_structure",
168                     text="Random Boxes", icon="SEQ_SEQUENCER")
169         layout.operator("object.easy_lattice",
170                     text="Easy Lattice", icon="MOD_LATTICE")
171
172
173 # Define the "Phsysics Tools" Menu
174 class VIEW3D_MT_Physics_tools_add(Menu):
175     bl_idname = "VIEW3D_MT_physics_tools"
176     bl_label = "Physics Tools"
177
178     def draw(self, context):
179         layout = self.layout
180         layout.operator_context = 'INVOKE_REGION_WIN'
181
182         layout.operator("ball.rope",
183                         text="Wrecking Ball", icon='PHYSICS')
184         layout.operator("clot.rope",
185                         text="Cloth Rope", icon='PHYSICS')
186
187
188 # Define "Extras" menu
189 def menu(self, context):
190     layout = self.layout
191     layout.operator_context = 'INVOKE_REGION_WIN'
192     self.layout.separator()
193     self.layout.menu("VIEW3D_MT_scene_elements", icon="SCENE_DATA")
194     self.layout.menu("VIEW3D_MT_scene_lights", icon="LIGHT_SPOT")
195     self.layout.separator()
196     self.layout.menu("VIEW3D_MT_array_mods", icon="MOD_ARRAY")
197     self.layout.menu("VIEW3D_MT_quick_tools", icon="MOD_BUILD")
198     self.layout.menu("VIEW3D_MT_physics_tools", icon="PHYSICS")
199
200
201 # Addons Preferences
202 class AdvancedObjPreferences(AddonPreferences):
203     bl_idname = __name__
204
205     show_menu_list: BoolProperty(
206         name="Menu List",
207         description="Show/Hide the Add Menu items",
208         default=False
209     )
210     show_panel_list: BoolProperty(
211         name="Panels List",
212         description="Show/Hide the Panel items",
213         default=False
214     )
215
216     def draw(self, context):
217         layout = self.layout
218
219         icon_1 = "TRIA_RIGHT" if not self.show_menu_list else "TRIA_DOWN"
220         box = layout.box()
221         box.prop(self, "show_menu_list", emboss=False, icon=icon_1)
222
223         if self.show_menu_list:
224             box.label(text="Items located in the Add Menu (default shortcut Ctrl + A):",
225                       icon="LAYER_USED")
226             box.label(text="Test Scenes:", icon="LAYER_ACTIVE")
227             box.label(text="Scene Objects BI, Scene Objects Cycles, Scene Textures Cycles",
228                       icon="LAYER_USED")
229             box.label(text="Lighting Sets:", icon="LAYER_ACTIVE")
230             box.label(text="Add Light Template, Add Tri Lighting", icon="LAYER_USED")
231             box.label(text="Array Mods:", icon="LAYER_ACTIVE")
232             box.label(text="Circle Array, Chains submenu, Copy Vert/Edge and Aggregate Mesh",
233                          icon="LAYER_ACTIVE")
234             box.label(text="Chains Submenu - Add Chain, Chain to Bones",
235                       icon="LAYER_ACTIVE")
236             box.label(text="Block Tools:", icon="LAYER_ACTIVE")
237             box.label(text="Pixelate Object, Struts, Random Boxes, Easy Lattice",
238                       icon="LAYER_USED")
239             box.label(text="Physics Tools:", icon="LAYER_ACTIVE")
240             box.label(text="Wrecking Ball and Cloth Rope", icon="LAYER_USED")
241
242         icon_2 = "TRIA_RIGHT" if not self.show_panel_list else "TRIA_DOWN"
243         box = layout.box()
244         box.prop(self, "show_panel_list", emboss=False, icon=icon_2)
245
246         if self.show_panel_list:
247             box.label(text="Panels located in 3D View Tools Region > Create",
248                       icon="LAYER_ACTIVE")
249             box.label(text="CubeSter", icon="LAYER_USED")
250             box.label(text="Arrange on Curve  (Shown if an Active Curve Object is it the 3D View)",
251                       icon="LAYER_USED")
252
253
254 # Cubester update functions
255 def find_audio_length(self, context):
256     adv_obj = context.scene.advanced_objects
257     audio_file = adv_obj.cubester_audio_path
258     length = 0
259
260     if audio_file != "":
261         # confirm that strip hasn't been loaded yet
262         get_sequence = getattr(context.scene.sequence_editor, "sequences_all", [])
263         for strip in get_sequence:
264             if type(strip) == bpy.types.SoundSequence and strip.sound.filepath == audio_file:
265                 length = strip.frame_final_duration
266
267         if length == 0:
268             area = context.area
269             old_type = area.type
270             area.type = "SEQUENCE_EDITOR"
271             try:
272                 bpy.ops.sequencer.sound_strip_add(filepath=audio_file)
273                 adv_obj.cubester_check_audio = True
274             except Exception as e:
275                 print("\n[Add Advanced Objects]\n Function: "
276                       "find_audio_length\n {}\n".format(e))
277                 adv_obj.cubester_check_audio = False
278                 pass
279
280             area.type = old_type
281
282         # find audio file
283         for strip in context.scene.sequence_editor.sequences_all:
284             if type(strip) == bpy.types.SoundSequence and strip.sound.filepath == audio_file:
285                 adv_obj.cubester_check_audio = True
286                 length = strip.frame_final_duration
287
288     adv_obj.cubester_audio_file_length = length
289
290
291 # load image if possible
292 def adjust_selected_image(self, context):
293     scene = context.scene.advanced_objects
294     try:
295         image = bpy.data.images.load(scene.cubester_load_image)
296         scene.cubester_image = image.name
297     except Exception as e:
298         print("\n[Add Advanced Objects]\n Function: "
299               "adjust_selected_image\n {}\n".format(e))
300
301
302 # load color image if possible
303 def adjust_selected_color_image(self, context):
304     scene = context.scene.advanced_objects
305     try:
306         image = bpy.data.images.load(scene.cubester_load_color_image)
307         scene.cubester_color_image = image.name
308     except Exception as e:
309         print("\nAdd Advanced Objects]\n Function: "
310               "adjust_selected_color_image\n {}\n".format(e))
311
312
313 class AdvancedObjProperties(PropertyGroup):
314     # cubester
315     # main properties
316     cubester_check_audio: BoolProperty(
317         name="",
318         default=False
319     )
320     cubester_audio_image: EnumProperty(
321         name="Input Type",
322         items=(("image", "Image",
323                 "Use an Image as input for generating Geometry", "IMAGE_COL", 0),
324                ("audio", "Audio",
325                 "Use a Sound Strip as input for generating Geometry", "FILE_SOUND", 1))
326     )
327     cubester_audio_file_length: IntProperty(
328         default=0
329     )
330     # audio
331     cubester_audio_path: StringProperty(
332         default="",
333         name="Audio File",
334         subtype="FILE_PATH",
335         update=find_audio_length
336     )
337     cubester_audio_min_freq: IntProperty(
338         name="Minimum Frequency",
339         min=20, max=100000,
340         default=20
341     )
342     cubester_audio_max_freq: IntProperty(
343         name="Maximum Frequency",
344         min=21, max=999999,
345         default=5000
346     )
347     cubester_audio_offset_type: EnumProperty(
348         name="Offset Type",
349         items=(("freq", "Frequency Offset", ""),
350                ("frame", "Frame Offset", "")),
351         description="Type of offset per row of mesh"
352     )
353     cubester_audio_frame_offset: IntProperty(
354         name="Frame Offset",
355         min=0, max=10,
356         default=2
357     )
358     cubester_audio_block_layout: EnumProperty(
359         name="Block Layout",
360         items=(("rectangle", "Rectangular", ""),
361               ("radial", "Radial", ""))
362     )
363     cubester_audio_width_blocks: IntProperty(
364         name="Width Block Count",
365         min=1, max=10000,
366         default=5
367     )
368     cubester_audio_length_blocks: IntProperty(
369         name="Length Block Count",
370         min=1, max=10000,
371         default=50
372     )
373     # image
374     cubester_load_type: EnumProperty(
375         name="Image Input Type",
376         items=(("single", "Single Image", ""),
377               ("multiple", "Image Sequence", ""))
378     )
379     cubester_image: StringProperty(
380         default="",
381         name=""
382     )
383     cubester_load_image: StringProperty(
384         default="",
385         name="Load Image",
386         subtype="FILE_PATH",
387         update=adjust_selected_image
388     )
389     cubester_skip_images: IntProperty(
390         name="Image Step",
391         min=1, max=30,
392         default=1,
393         description="Step from image to image by this number"
394     )
395     cubester_max_images: IntProperty(
396         name="Max Number Of Images",
397         min=2, max=1000,
398         default=10,
399         description="Maximum number of images to be used"
400     )
401     cubester_frame_step: IntProperty(
402         name="Frame Step Size",
403         min=1, max=10,
404         default=4,
405         description="The number of frames each picture is used"
406     )
407     cubester_skip_pixels: IntProperty(
408         name="Skip # Pixels",
409         min=0, max=256,
410         default=64,
411         description="Skip this number of pixels before placing the next"
412     )
413     cubester_mesh_style: EnumProperty(
414         name="Mesh Type",
415         items=(("blocks", "Blocks", ""),
416                ("plane", "Plane", "")),
417         description="Compose mesh of multiple blocks or of a single plane"
418     )
419     cubester_block_style: EnumProperty(
420         name="Block Style",
421         items=(("size", "Vary Size", ""),
422                ("position", "Vary Position", "")),
423         description="Vary Z-size of block, or vary Z-position"
424     )
425     cubester_height_scale: FloatProperty(
426         name="Height Scale",
427         subtype="DISTANCE",
428         min=0.1, max=2,
429         default=0.2
430     )
431     cubester_invert: BoolProperty(
432         name="Invert Height",
433         default=False
434     )
435     # general adjustments
436     cubester_size_per_hundred_pixels: FloatProperty(
437         name="Size Per 100 Blocks/Points",
438         subtype="DISTANCE",
439         min=0.001, max=5,
440         default=1
441     )
442     # material based stuff
443     cubester_materials: EnumProperty(
444         name="Material",
445         items=(("vertex", "Vertex Colors", ""),
446                ("image", "Image", "")),
447         description="Color with vertex colors, or uv unwrap and use an image"
448     )
449     cubester_use_image_color: BoolProperty(
450         name="Use Original Image Colors'?",
451         default=True,
452         description="Use original image colors, or replace with an another one"
453     )
454     cubester_color_image: StringProperty(
455         default="",
456         name=""
457     )
458     cubester_load_color_image: StringProperty(
459         default="",
460         name="Load Color Image",
461         subtype="FILE_PATH",
462         update=adjust_selected_color_image
463     )
464     cubester_vertex_colors = {}
465     # advanced
466     cubester_advanced: BoolProperty(
467         name="Advanced Options",
468         default=False
469     )
470     cubester_random_weights: BoolProperty(
471         name="Random Weights",
472         default=False
473     )
474     cubester_weight_r: FloatProperty(
475         name="Red",
476         subtype="FACTOR",
477         min=0.01, max=1.0,
478         default=0.25
479     )
480     cubester_weight_g: FloatProperty(
481         name="Green",
482         subtype="FACTOR",
483         min=0.01, max=1.0,
484         default=0.25
485     )
486     cubester_weight_b: FloatProperty(
487         name="Blue",
488         subtype="FACTOR",
489         min=0.01, max=1.0,
490         default=0.25
491     )
492     cubester_weight_a: FloatProperty(
493         name="Alpha",
494         subtype="FACTOR",
495         min=0.01, max=1.0,
496         default=0.25
497     )
498
499     # arrange_on_curve
500     arrange_c_use_selected: BoolProperty(
501         name="Use Selected",
502         description="Use the selected objects to duplicate",
503         default=True,
504     )
505     arrange_c_obj_arranjar: StringProperty(
506         name=""
507     )
508     arrange_c_select_type: EnumProperty(
509         name="Type",
510         description="Select object or group",
511         items=[
512             ('O', "Object", "Make duplicates of a specific object"),
513             ('G', "Group", "Make duplicates of the objects in a group"),
514         ],
515         default='O',
516     )
517
518
519 def register():
520     bpy.utils.register_module(__name__)
521
522     bpy.types.Scene.advanced_objects = PointerProperty(
523         type=AdvancedObjProperties
524     )
525
526     # Add "Extras" menu to the "Add" menu
527     bpy.types.VIEW3D_MT_add.append(menu)
528     try:
529         bpy.types.VIEW3D_MT_AddMenu.append(menu)
530     except:
531         pass
532
533
534 def unregister():
535     # Remove "Extras" menu from the "Add" menu.
536     bpy.types.VIEW3D_MT_add.remove(menu)
537     try:
538         bpy.types.VIEW3D_MT_AddMenu.remove(menu)
539     except:
540         pass
541
542     bpy.utils.unregister_module(__name__)
543     del bpy.types.Scene.advanced_objects
544
545
546 if __name__ == "__main__":
547     register()