5b72c60f541f8efbf39b4831201ccfceeb3a27b9
[blender.git] / release / scripts / CreatePlane.py
1 #!BPY
2
3 """
4 Name: 'Import Plane from Image'
5 Blender: 245
6 Group: 'Add'
7 Tooltip: 'Import a plane topology from a 2d Image'
8 """
9
10 __author__ = "AndrĂ© Pinto"
11 __url__ = ["www.blender.org"]
12 __version__ = "2008-06-06"
13
14 __bpydoc__ = """\
15 This script extracts a plane from an image.
16 """
17
18 # ***** BEGIN GPL LICENSE BLOCK *****
19 #
20 # This program is free software; you can redistribute it and/or
21 # modify it under the terms of the GNU General Public License
22 # as published by the Free Software Foundation; either version 2
23 # of the License, or (at your option) any later version.
24 #
25 # This program is distributed in the hope that it will be useful,
26 # but WITHOUT ANY WARRANTY; without even the implied warranty of
27 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
28 # GNU General Public License for more details.
29 #
30 # You should have received a copy of the GNU General Public License
31 # along with this program; if not, write to the Free Software Foundation,
32 # Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
33 #
34 # The Original Code is Copyright (C) Blender Foundation.
35 # All rights reserved.
36 #
37 # The Original Code is: all of this file.
38 #
39 # Contributor(s): AndrĂ© Pinto
40 #
41 # ***** END GPL LICENSE BLOCK *****
42
43 import Blender, bpy
44
45 def matrix(dima, dimb):
46         return [[0 for b in range(dimb)] for a in range(dima)]
47
48 def makelist(a):
49         res = []
50         for i in a:
51                 res.append(i)
52         return res
53
54 def dotProduct(a):
55         sum = 0.0
56         for i in a:
57                 sum += i*i
58         return sum
59
60 # For now simply decompose in a triangle fan
61 def DecomposePolygon(poly):
62         for i in range(2, len(poly), 1):
63                 yield [ poly[0], poly[i-1], poly[i] ]
64
65
66 def Expand3dCoordsFrom2d(coords):
67         for c in coords:
68                 yield ( c[0] , c[1], 0 )
69
70
71 # For now return the full image
72 def ExtractSections(image):
73         x_samples = 250
74         y_samples = 250
75
76         mdim = max( image.size )
77         dx = float(image.size[0]) / x_samples
78         dy = float(image.size[1]) / y_samples
79         ox = -float(x_samples)*0.5
80         oy = -float(y_samples)*0.5
81
82         def scale(a):
83                 return ( (a[0] + ox)*dx , (a[1] + oy)*dy )
84                         
85         used = matrix(x_samples, y_samples)
86         for a in range(x_samples):
87                 for b in range(y_samples):
88                         if dotProduct(image.getPixelHDR( (int)(a*dx), (int)(b*dy))) <= 1:
89                                 used[a][b] = 1
90
91         for a in range(x_samples-1):
92                 for b in range(y_samples-1):
93                         sum = used[a][b] + used[a+1][b] + used[a][b+1] + used[a+1][b+1]
94                         
95                         if sum == 4:
96                                 yield map( scale, [ (a,b) , (a+1,b), (a+1,b+1), (a,b+1) ] )
97                         elif sum == 3:
98                                 if not used[a][b]:
99                                         yield map( scale, [ (a+1,b), (a+1,b+1) , (a,b+1) ] )
100                                 if not used[a+1][b]:
101                                         yield map( scale, [ (a,b), (a+1,b+1) , (a,b+1) ] )
102                                 if not used[a][b+1]:
103                                         yield map( scale, [ (a,b), (a+1,b) , (a+1,b+1) ] )
104                                 if not used[a+1][b+1]:
105                                         yield map( scale, [ (a,b), (a+1,b) , (a,b+1) ] )
106                                         
107
108 def ImportPlaneFromImage(image, mesh):
109
110         new_verts = []
111         new_faces = []
112
113         vert_dict = {}
114
115         def getVertex(vert):
116                 if vert not in vert_dict:
117                         new_verts.append( (vert[0], vert[1], 0) )
118                         vert_dict[ vert ] = len( new_verts )-1
119
120                 return vert_dict[ vert ]
121
122         for poly in ExtractSections(image):
123                 offset = len(new_verts)
124
125                 poly = map( getVertex, poly )
126                 if len(poly) == 4:
127                         new_faces.append( [poly[0], poly[1], poly[2],poly[3]] )
128                 if len(poly) == 3:
129                         new_faces.append( [ poly[0], poly[1], poly[2] ] )
130
131         # perform a single extend, extend is O( N )
132         mesh.verts.extend( new_verts )
133         mesh.faces.extend( new_faces )
134
135
136
137 #use the current image on the image editor? or ask the user what image to load
138 #image = Blender.Image.GetCurrent()
139
140 def load_image(filename):
141         print "Loading ",filename
142         #for now create a new mesh
143         mesh = bpy.data.meshes.new('Plane')
144         Blender.Scene.GetCurrent().objects.new(mesh)
145
146         image = Blender.Image.Load(filename)
147         print image
148         ImportPlaneFromImage(image, mesh)
149         Blender.Redraw()
150         
151
152 image = Blender.Window.FileSelector(load_image, "Load Image")
153
154