+ # Ambient component
+ Ia = 1.0
+ ka = mat.getAmb() * Vector([0.1, 0.1, 0.1])
+ Iamb = Ia * ka
+
+ # Diffuse component (add light.col for kd)
+ kd = mat.getRef() * Vector(mat.getRGBCol())
+ Ip = light.getEnergy()
+ Idiff = Ip * kd * (N*L)
+
+ # Specular component
+ ks = mat.getSpec() * Vector(mat.getSpecCol())
+ ns = mat.getHardness()
+ Ispec = Ip * ks * pow((V * R), ns)
+
+ # Emissive component
+ ki = Vector([mat.getEmit()]*3)
+
+ I = ki + Iamb + Idiff + Ispec
+
+ # Set Alpha component
+ I = list(I)
+ I.append(mat.getAlpha())
+
+ # Clamp I values between 0 and 1
+ I = [ min(c, 1) for c in I]
+ I = [ max(0, c) for c in I]
+ tmp_col = [ int(c * 255.0) for c in I]
+
+ for c in f.col:
+ c.r = tmp_col[0]
+ c.g = tmp_col[1]
+ c.b = tmp_col[2]
+ c.a = tmp_col[3]
+
+ def _doEdgesStyle(self, mesh, edgestyleSelect):
+ """Process Mesh Edges accroding to a given selection style.
+
+ Examples of algorithms:
+
+ Contours:
+ given an edge if its adjacent faces have the same normal (that is
+ they are complanar), than deselect it.
+
+ Silhouettes:
+ given an edge if one its adjacent faces is frontfacing and the
+ other is backfacing, than select it, else deselect.
+ """
+
+ Mesh.Mode(Mesh.SelectModes['EDGE'])
+
+ for e in mesh.edges:
+
+ if edgestyleSelect(e, mesh):
+ e.sel = 1
+ else:
+ e.sel = 0
+
+ def _doProjection(self, mesh, projector):
+ """Calculate the Projection for the object.
+ """
+ # TODO: maybe using the object.transform() can be faster?
+
+ for v in mesh.verts:
+ p = projector.doProjection(v.co)
+ v.co[0] = p[0]
+ v.co[1] = p[1]
+ v.co[2] = p[2]
+
+
+
+# ---------------------------------------------------------------------
+#
+## Main Program
+#
+# ---------------------------------------------------------------------
+
+# A dictionary to collect all the different edge styles and their edge
+# selection criteria
+edgeSelectionStyles = {
+ 'normal': MeshUtils().isVisibleEdge,
+ 'silhouette': MeshUtils().isSilhouetteEdge
+ }
+
+# A dictionary to collect the supported output formats
+outputWriters = {
+ 'SVG': SVGVectorWriter,
+ }
+
+
+# A wrapper function for the vectorizing process
+def vectorize(filename):
+ """The vectorizing process is as follows:
+
+ - Instanciate the writer and the renderer
+ - Render!
+ """
+ from Blender import Window
+ editmode = Window.EditMode()
+ if editmode: Window.EditMode(0)
+
+ writer = outputWriters[OUTPUT_FORMAT](filename)
+
+ renderer = Renderer()
+ renderer.doRendering(writer, RENDER_ANIMATION)
+
+ if editmode: Window.EditMode(1)