Initial commit
[vrm.git] / vrm.py
1 #!BPY
2
3 """
4 Name: 'VRM'
5 Blender: 228
6 Group: 'Export'
7 Tooltip: 'Vector Rendering Method Export Script'
8 """
9
10
11 import Blender
12 from Blender import Scene, Object, Lamp, Camera
13 from math import *
14 from Blender.Window import *
15    
16 def init():
17
18     print "Init\n"
19
20     renderDir = scena.getRenderdir()
21
22 # distance from camera Z'
23 def Distance(PX,PY,PZ):
24     
25     dist = sqrt(PX*PX+PY*PY+PZ*PZ)
26     return dist
27
28 def Dodaj(x,y,z):
29     
30     print ""
31
32 def RotatePoint(PX,PY,PZ,AngleX,AngleY,AngleZ):
33     
34     NewPoint = []
35     # Rotate X
36     NewY = (PY * cos(AngleX))-(PZ * sin(AngleX))
37     NewZ = (PZ * cos(AngleX))+(PY * sin(AngleX))
38     # Rotate Y
39     PZ = NewZ
40     PY = NewY
41     NewZ = (PZ * cos(AngleY))-(PX * sin(AngleY))
42     NewX = (PX * cos(AngleY))+(PZ * sin(AngleY))
43     PX = NewX
44     PZ = NewZ
45     # Rotate Z
46     NewX = (PX * cos(AngleZ))-(PY * sin(AngleZ))
47     NewY = (PY * cos(AngleZ))+(PX * sin(AngleZ))
48     NewPoint.append(NewX)
49     NewPoint.append(NewY)
50     NewPoint.append(NewZ)
51     return NewPoint
52
53 def flatern(vertx, verty, vertz):
54
55     cam = Camera.get()            # Get the cameras in scene
56     Lens = cam[0].getLens()       # The First Blender camera lens
57
58     camTyp = cam[0].getType()
59
60     msize = scena.getWinSize()
61     xres = msize[0]             # X res for output
62     yres = msize[1]                # Y res for output
63     ratio = xres/yres
64
65     screenxy=[0,0]
66     x=-vertx
67     y=verty
68     z=vertz
69
70     fov = atan(ratio * 16.0 / Lens)  # Get fov stuff
71     dist = xres/2*tan(fov)         # Calculate dist from pinhole camera to image plane
72 #----------------------------        
73 # calculate x'=dist*x/z & y'=dist*x/z
74 #----------------------------
75     screenxy[0]=int(xres/2+4*x*dist/z)
76     screenxy[1]=int(yres/2+4*y*dist/z)
77     return screenxy
78
79 def writesvg(ob):
80
81     for i in range(0, ob[0]+1):
82       print ob[i], "\n"
83     print "WriteSVG\n"
84
85 ########
86 # Main #
87 ########
88
89 scena = Scene.GetCurrent()
90 init()
91
92 tacka = [0,0,0]
93 lice = [3,tacka,tacka,tacka,tacka]
94
95 msize = scena.getWinSize()
96
97 file=open("d:\proba.svg","w")
98
99 file.write("<svg width=\"" + `msize[0]` + "\" height=\"" + `msize[1]` + "\"\n")
100 file.write("xmlns=\"http://www.w3.org/2000/svg\" version=\"1.2\" streamable=\"true\">\n")
101 #file.write("<pageSet>\n")
102
103 Objects = Blender.Object.Get()
104 NUMobjects = len(Objects)
105
106 startFrm = scena.startFrame()
107 endFrm = scena.endFrame()
108 camera = scena.getCurrentCamera() # Get the current camera
109
110 for f in range(startFrm, endFrm+1):
111   #scena.currentFrame(f)
112   Blender.Set('curframe', f)
113
114   DrawProgressBar (f/(endFrm+1-startFrm),"Rendering ..." + str(scena.currentFrame()))
115
116   print "Frame: ", f, "\n"
117   if startFrm <> endFrm: file.write("<g id=\"Frame" + str(f) + "\" style=\"visibility:hidden\">\n")
118   for o in range(NUMobjects):
119
120     if Objects[o].getType() == "Mesh":
121
122       obj = Objects[o]                  # Get the first selected object
123       objname = obj.name                # The object name
124
125
126       OBJmesh = obj.getData()           # Get the mesh data for the object
127       numfaces=len(OBJmesh.faces)         # The number of faces in the object
128       numEachVert=len(OBJmesh.faces[0])    # The number of verts in each face
129
130       #------------
131       # Get the Material Colors
132       #------------
133 #      MATinfo = OBJmesh.getMaterials()
134 #    
135 #      if len(MATinfo) > 0:
136 #          RGB=MATinfo[0].rgbCol
137 #          R=int(RGB[0]*255)
138 #          G=int(RGB[1]*255)
139 #          B=int(RGB[2]*255)
140 #          color=`R`+"."+`G`+"."+`B`
141 #          print color
142 #      else:
143 #          color="100.100.100"
144
145       objekat = []
146
147       objekat.append(0)
148
149       for face in range(numfaces):
150         numvert = len(OBJmesh.faces[face])
151         objekat.append(numvert)
152         objekat[0] += 1
153         
154 # backface cutting
155         a = []
156         a.append(OBJmesh.faces[face][0][0])
157         a.append(OBJmesh.faces[face][0][1])
158         a.append(OBJmesh.faces[face][0][2])
159         a = RotatePoint(a[0], a[1], a[2], obj.RotX, obj.RotY, obj.RotZ)
160         a[0] += obj.LocX - camera.LocX
161         a[1] += obj.LocY - camera.LocY
162         a[2] += obj.LocZ - camera.LocZ
163         b = []
164         b.append(OBJmesh.faces[face][1][0])
165         b.append(OBJmesh.faces[face][1][1])
166         b.append(OBJmesh.faces[face][1][2])
167         b = RotatePoint(b[0], b[1], b[2], obj.RotX, obj.RotY, obj.RotZ)
168         b[0] += obj.LocX - camera.LocX
169         b[1] += obj.LocY - camera.LocY
170         b[2] += obj.LocZ - camera.LocZ
171         c = []
172         c.append(OBJmesh.faces[face][numvert-1][0])
173         c.append(OBJmesh.faces[face][numvert-1][1])
174         c.append(OBJmesh.faces[face][numvert-1][2])
175         c = RotatePoint(c[0], c[1], c[2], obj.RotX, obj.RotY, obj.RotZ)
176         c[0] += obj.LocX - camera.LocX
177         c[1] += obj.LocY - camera.LocY
178         c[2] += obj.LocZ - camera.LocZ
179
180         norm = [0,0,0]
181         norm[0] = (b[1] - a[1])*(c[2] - a[2]) - (c[1] - a[1])*(b[2] - a[2])
182         norm[1] = -((b[0] - a[0])*(c[2] - a[2]) - (c[0] - a[0])*(b[2] - a[2]))
183         norm[2] = (b[0] - a[0])*(c[1] - a[1]) - (c[0] - a[0])*(b[1] - a[1])
184
185         d = norm[0]*a[0] + norm[1]*a[1] + norm[2]*a[2]
186
187         if d < 0:
188           file.write("<polygon points=\"")
189           for vert in range(numvert):
190
191             objekat[0] += 3
192
193             vertxyz = []
194
195             if vert != 0: file.write(", ")
196
197             vertxyz.append(OBJmesh.faces[face][vert][0])
198             vertxyz.append(OBJmesh.faces[face][vert][1])
199             vertxyz.append(OBJmesh.faces[face][vert][2])
200
201 # rotate object
202
203             vertxyz = RotatePoint(vertxyz[0], vertxyz[1], vertxyz[2], obj.RotX, obj.RotY, obj.RotZ)
204
205             vertxyz[0] += obj.LocX - camera.LocX
206             vertxyz[1] += obj.LocY - camera.LocY
207             vertxyz[2] += obj.LocZ - camera.LocZ
208
209 # rotate camera
210
211             vertxyz = RotatePoint(vertxyz[0], vertxyz[1], vertxyz[2], -camera.RotX, -camera.RotY, -camera.RotZ)
212
213             objekat.append(Distance(vertxyz[0], vertxyz[1], vertxyz[2]))
214 #            dist = Distance(vertxyz[0], vertxyz[1], vertxyz[2])
215             xy = flatern(vertxyz[0], vertxyz[1], vertxyz[2])
216             px = int(xy[0])
217             py = int(xy[1])
218             objekat.append(px)
219             objekat.append(py)
220             # add/sorting in Z' direction
221             #Dodaj(px,py,Distance(vertxyz[0], vertxyz[1], vertxyz[2]))
222             file.write(`px` + ", " + `py`)
223 #          svetla = Blender.Lamp.Get()
224 #          svetlo = svetla[0]
225 #          print svetlo.LocX
226           ambient = -200
227           svetlo = [1,1,-1]
228           vektori = (norm[0]*svetlo[0]+norm[1]*svetlo[1]+norm[2]*svetlo[2])
229           vduzine = fabs(sqrt(pow(norm[0],2)+pow(norm[1],2)+pow(norm[2],2))*sqrt(pow(svetlo[0],2)+pow(svetlo[1],2)+pow(svetlo[2],2)))
230           intensity = floor(ambient + 255 * acos(vektori/vduzine))
231           print vektori/vduzine
232           if intensity < 0: intensity = 0
233           file.write("\"\n style=\"fill:rgb("+str(intensity)+","+str(intensity)+","+str(intensity)+");stroke:rgb(0,0,0);stroke-width:1\"/>\n")
234   if startFrm <> endFrm:
235     file.write("<animate attributeName=\"visibility\" begin=\""+str(f*0.08)+"s\" dur=\"0.08s\" fill=\"remove\" to=\"visible\">\n")
236     file.write("</animate>\n")
237     file.write("</g>\n")
238
239 #flatern()
240 #writesvg(objekat)
241 file.write("</svg>")
242 file.close()
243 DrawProgressBar (1.0,"Finished.")
244 print "Finished\n"