blender/intern/python/modules/beta/Objects.py
2002-10-12 11:37:38 +00:00

168 lines
3.7 KiB
Python

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