Slope rotation feature: Dupli rotation gets aligned to the ground
[blender-addons-contrib.git] / object_physics_meadow / settings.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 # <pep8 compliant>
20
21 import bpy
22 from bpy.types import AddonPreferences, PropertyGroup
23 from bpy.props import *
24
25 def copy_rna_enum_items(type, prop):
26     return [(item.identifier, item.name, item.description) for item in type.bl_rna.properties[prop].enum_items]
27
28 def find_meadow_object(context, type):
29     scene = context.scene
30     for ob in scene.objects:
31         if ob.meadow.type == type:
32             return ob
33
34 #-----------------------------------------------------------------------
35
36 class MeadowAddonPreferences(AddonPreferences):
37     bl_idname = __package__
38
39     patch_groupname = StringProperty(
40         name="Patch Group Name",
41         description="Object group for storing patch copies of templates",
42         default="Patches"
43         )
44     blob_groupname = StringProperty(
45         name="Blob Group Name",
46         description="Object group for storing blob duplicators",
47         default="Blobs"
48         )
49
50     def patch_group(self, context):
51         return bpy.data.groups.get(self.patch_groupname)
52     def blob_group(self, context):
53         return bpy.data.groups.get(self.blob_groupname)
54
55     def draw_ex(self, layout, context):
56         layout.prop(self, "patch_groupname")
57         layout.prop(self, "blob_groupname")
58
59     def draw(self, context):
60         self.draw_ex(self, self.layout, context)
61
62 def get(context):
63     userprefs = context.user_preferences
64     return userprefs.addons[__package__].preferences
65
66 #-----------------------------------------------------------------------
67
68 type_items = [
69     ('NONE', 'None', ''),
70     ('GROUND', 'Ground', 'Base mesh defining the ground surface'),
71     ('BLOBGRID', 'Blob Grid', 'Grid vertex positions for simulated blobs'),
72     ('TEMPLATE', 'Template', 'Template for copies and instancing'),
73     ]
74 unique_types = {'GROUND', 'BLOBGRID'}
75
76 def type_update(self, context):
77     # ensure unique types
78     if self.type in unique_types:
79         scene = context.scene
80         for ob in scene.objects:
81             if ob != self.id_data and ob.meadow.type == self.type:
82                 ob.meadow.type = 'NONE'
83
84 def vgroup_items(self, context):
85     groundob = find_meadow_object(context, 'GROUND')
86     if groundob:
87         return [(v.name, v.name, "", 'NONE', v.index) for v in groundob.vertex_groups]
88     return []
89
90 def use_layers_update(self, context):
91     if self.use_layers:
92         # copy layer settings from the object when enabling for the first time
93         if all(layer == False for layer in self.layers):
94             self.layers = self.id_data.layers
95
96 def used_layers_get(self):
97     # XXX dummy property
98     return tuple(False for i in range(20))
99
100 class MeadowObjectSettings(PropertyGroup):
101     type = EnumProperty(
102         name="Type",
103         description="Role of the object in the meadow simulation",
104         items=type_items,
105         update=type_update
106         )
107     
108     use_as_dupli = BoolProperty(
109         name="Use as Dupli",
110         description="Use the object for dupli instances",
111         default=True
112         )
113
114     hide = BoolProperty(
115         name="Hide",
116         description="Hide copies in the viewport",
117         default=False
118         )
119
120     use_layers = BoolProperty(
121         name="Use Layers",
122         description="Put new objects into custom layers",
123         default=False,
124         update=use_layers_update
125         )
126     
127     layers = BoolVectorProperty(
128         name="Layers",
129         description="Object copies and duplicators will be placed in these layers",
130         size=20,
131         options=set()
132         )
133
134     used_layers = BoolVectorProperty(
135         name="Used Layers",
136         description="Object copies and duplicators will be placed in these layers",
137         size=20,
138         get=used_layers_get,
139         options={'HIDDEN'}
140         )
141     
142     use_centered = BoolProperty(
143         name="Use Centered",
144         description="Move copies to the center before duplifying (use with particle instance)",
145         default=False
146         )
147     
148     seed = IntProperty(
149         name="Seed",
150         description="General random number seed value",
151         default=12345
152         )
153
154     sampling_levels = IntProperty(
155         name="Sampling Levels",
156         description="Maximum number of sampling subdivision levels",
157         default=4
158         )
159
160     sample_distance = FloatProperty(
161         name="Sample Distance",
162         description="Minimum distance between samples to prevent overlap",
163         default=1.0,
164         min=0.01
165         )
166
167     slope_rotation = FloatProperty(
168         name="Slope Rotation",
169         description="Influence of the slope on dupli rotation",
170         subtype='FACTOR',
171         default=0.0,
172         min=0.0,
173         max=1.0,
174         )
175
176     max_samples = IntProperty(
177         name="Maximum Samples",
178         description="Maximum number of samples",
179         default=1000,
180         max=1000000,
181         soft_max=10000
182         )
183     
184     density_vgroup_name = StringProperty(
185         name="Density Vertex Group Name",
186         description="Name of the vertex group to use for patch density",
187         default=""
188         )
189
190     # XXX enum wrapper would be more convenient, but harder to manage
191 #    density_vgroup = EnumProperty(
192 #        name="Density Vertex Group",
193 #        description="Vertex group to use for patch density",
194 #        items=vgroup_items
195 #        )
196
197     # internal
198     blob_index = IntProperty(
199         name="Blob Index",
200         description="Unique blob index of the object",
201         default=-1,
202         options={'HIDDEN'}
203         )
204
205 #-----------------------------------------------------------------------
206
207 def register():
208     bpy.utils.register_class(MeadowAddonPreferences)
209     
210     bpy.utils.register_class(MeadowObjectSettings)
211     bpy.types.Object.meadow = PointerProperty(type=MeadowObjectSettings)
212
213 def unregister():
214     bpy.utils.unregister_class(MeadowAddonPreferences)
215     
216     del bpy.types.Object.meadow
217     bpy.utils.unregister_class(MeadowObjectSettings)