diff options
Diffstat (limited to 'intern/python/modules/beta/Objects.py')
-rw-r--r-- | intern/python/modules/beta/Objects.py | 167 |
1 files changed, 167 insertions, 0 deletions
diff --git a/intern/python/modules/beta/Objects.py b/intern/python/modules/beta/Objects.py new file mode 100644 index 00000000000..0ae56870fd6 --- /dev/null +++ b/intern/python/modules/beta/Objects.py @@ -0,0 +1,167 @@ +from Blender import Scene +import Blender.NMesh as _NMesh +import Blender.Material as Material + + +defaultUV = [(0.0, 0.0), (1.0, 0.0), (1.0, 1.0), (0.0, 1.0)] + +FACEFLAGS = _NMesh.Const +DEFAULTFLAGS = FACEFLAGS.LIGHT + FACEFLAGS.DYNAMIC + +curface = None +tessfaces = None + +def error(): + pass +def beginPolygon(): + global curface + global tessfaces + curface = _NMesh.Face() +def endPolygon(): + global curface + global tessfaces + tessfaces.append(curface) +def addVertex(v): + global curface + curface.v.append(v) + curface.uv.append((v.uvco[0], v.uvco[1])) + +class Face: + def __init__(self, vlist): + self.v= vlist + self.uv = [] + self.mode = 0 + +class shadow: + def __setattr__(self, name, val): + setattr(self.data, name, val) + def __getattr__(self, name): + return getattr(self.data, name) + def __repr__(self): + return repr(self.data) + +########################################## +# replacement xMesh (NMesh shadow class) + +class shadowNVert: #shadow NMVert class for the tesselator + def __init__(self): + self.vert = None + self.uv = [] + def __len__(self): + return 3 + def __getitem__(self, i): + return self.vert.co[i] + +def Color(r, g, b, a = 1.0): + return _NMesh.Col(255 * r, 255 * g, 255 * b, 255 * a) + +class shadowNMesh: + def __init__(self, name = None, default_flags = None): + self.scene = Scene.getCurrent() + self.data = _NMesh.GetRaw() + self.name = name + if default_flags: + flags = default_flags + else: + flags = DEFAULTFLAGS + self.flags = flags + self.smooth = 0 + self.faces = [] + try: + import tess + self.tess = tess.Tess(256, beginPolygon, endPolygon, error, addVertex) + except: + #print "couldn't import tesselator" + self.tess = None + self.curface = None + self.tessfaces = [] + self.recalc_normals = 1 + + def __del__(self): + del self.data + + def __getattr__(self, name): + if name == 'vertices': + return self.data.verts + else: + return getattr(self.data, name) + + def __repr__(self): + return "Mesh: %d faces, %d vertices" % (len(self.faces), len(self.verts)) + def toNMFaces(self, ngon): + # This should be a Publisher only feature...once the tesselation + # is improved. The GLU tesselator of Mesa < 4.0 is crappy... + if not self.tess: + return [] # no faces converted + import tess + i = 0 + global tessfaces + tessfaces = [] + tess.beginPolygon(self.tess) + for v in ngon.v: + if len(ngon.uv) == len(ngon.v): + v.uvco = ngon.uv[i] + tess.vertex(self.tess, (v.co[0], v.co[1], v.co[2]), v) + i += 1 + tess.endPolygon(self.tess) + return tessfaces + + def hasFaceUV(self, true): + self.data.hasFaceUV(true) + + def addVert(self, v): + vert = _NMesh.Vert(v[0], v[1], v[2]) + self.data.verts.append(vert) + return vert + + def addFace(self, vlist, flags = None, makedefaultUV = 0): + n = len(vlist) + if n > 4: + face = Face(vlist) + else: + face = _NMesh.Face() + for v in vlist: + face.v.append(v) + if makedefaultUV: + face.uv = defaultUV[:n] + self.faces.append(face) + # turn on default flags: + if not flags: + face.mode = self.flags + else: + face.mode = flags + return face + + def write(self): + from Blender import Object + # new API style: + self.update() + ob = Object.New(Object.Types.MESH) # create object + ob.link(self.data) # link mesh data to it + self.scene.link(ob) + return ob + + def update(self): + from Blender.Types import NMFaceType + smooth = self.smooth + for f in self.faces: + if type(f) == NMFaceType: + f.smooth = smooth + self.data.faces.append(f) + f.materialIndex = 0 + else: #it's a NGON (shadow face) + faces = self.toNMFaces(f) + for nf in faces: + nf.smooth = smooth + nf.materialIndex = 0 + self.data.faces.append(nf) + + if not self.name: + self.name = "Mesh" + + def assignMaterial(self, material): + self.data.materials = [material._object] + +Mesh = shadowNMesh +Vert = shadowNVert + |