Initial commit for the Meadow Generator addon.
[blender-addons-contrib.git] / object_physics_meadow / duplimesh.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 mathutils import *
23
24 def project_on_ground(groundob, co):
25     groundmat4 = groundob.matrix_world
26     groundmat3 = groundmat4.to_3x3()
27     
28     zmin = min(p[2] for p in groundob.bound_box)
29     zmax = max(p[2] for p in groundob.bound_box)
30     
31     ray_start = (co[0], co[1], zmax)
32     ray_end = (co[0], co[1], zmin)
33     
34     hit, nor, index = groundob.ray_cast(ray_start, ray_end)
35     if index >= 0:
36         return True, groundmat4 * hit, groundmat3 * nor
37     else:
38         return False, co, (0.0, 0.0, 1.0)
39
40
41 def make_dupli_mesh(name, obmat, samples):
42     tot = len(samples)
43     scalemat = Matrix()
44     scalemat[0][0] = scalemat[1][1] = scalemat[2][2] = 0.1
45     scalemat[3][3] = 1.0
46     
47     invobmat = obmat.inverted()
48     
49     def verts():
50         for loc, nor in samples:
51             mat = Matrix.Translation(loc) * invobmat * scalemat
52             yield ( mat * Vector((-0.86603, -0.5, 0.0)) )[:]
53             yield ( mat * Vector(( 0.86603, -0.5, 0.0)) )[:]
54             yield ( mat * Vector(( 0.0,      1.0, 0.0)) )[:]
55     
56     def edges():
57         for i in range(tot):
58             yield (i*3 + 0, i*3 + 1)
59             yield (i*3 + 1, i*3 + 2)
60             yield (i*3 + 2, i*3 + 0)
61     
62     def faces():
63         for i in range(tot):
64             yield (i*3 + 0, i*3 + 1, i*3 + 2)
65     
66     mesh = bpy.data.meshes.new(name)
67     # XXX edges somehow are broken, but can be calculated automatically
68     #mesh.from_pydata([v for v in verts()], [e for e in edges()], [f for f in faces()])
69     mesh.from_pydata([v for v in verts()], [], [f for f in faces()])
70     mesh.update()
71     return mesh