forked from bartvdbraak/blender
168 lines
3.7 KiB
Python
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
|
|
|