- Fixed a few bugs in the ac3d importer, found by Melchior Franz (thanks!). Also automatically turning on ztransp for materials with alpha < 1.0 and then also transp shadows for all imported materials.
This commit is contained in:
Willian Padovani Germano 2007-01-28 20:03:42 +00:00
parent f354b9c697
commit cd2e2d231f

@ -10,7 +10,7 @@ Tip: 'Import an AC3D (.ac) file.'
__author__ = "Willian P. Germano"
__url__ = ("blender", "elysiun", "AC3D's homepage, http://www.ac3d.org",
"PLib 3d gaming lib, http://plib.sf.net")
__version__ = "2.43 2007-01-14"
__version__ = "2.43 2007-01-28"
__bpydoc__ = """\
This script imports AC3D models into Blender.
@ -425,11 +425,10 @@ class AC3DImport:
l = [o for o in olist if o.type == AC_POLY \
and not o.kids and not o.rot and not o.loc]
if l:
if len(l) > 1:
for o in l:
if o.name == groupname:
return o
return l[0]
for o in l:
if o.name == groupname:
return o
#return l[0]
return None
def build_hierarchy(self):
@ -462,20 +461,21 @@ class AC3DImport:
for child in children:
blob = child.bl_obj
if not blob: continue
if child.loc:
blob.setLocation(child.loc)
if child.rot:
eul = euler_in_radians(child.rot.toEuler())
blob.setEuler(eul)
if child.size:
blob.size = child.size
if not child.loc:
child.loc = Vector(0.0, 0.0, 0.0)
blob.setLocation(child.loc)
newlist.append(o)
for o in newlist: # newlist now only has objs w/o parents
blob = o.bl_obj
if o.loc:
blob.setLocation(o.loc * blmatrix)
if not blob:
continue
if o.size:
o.bl_obj.size = o.size
if not o.rot:
@ -484,6 +484,11 @@ class AC3DImport:
matrix = o.rot * blmatrix
eul = euler_in_radians(matrix.toEuler())
blob.setEuler(eul)
if o.loc:
o.loc *= blmatrix
else:
o.loc = Vector(0.0, 0.0, 0.0)
blob.setLocation(o.loc) # forces DAG update, so we do it even for 0, 0, 0
def testAC3DImport(self):
@ -491,6 +496,9 @@ class AC3DImport:
FACE_TEX = Mesh.FaceModes['TEX']
MESH_AUTOSMOOTH = Mesh.Modes['AUTOSMOOTH']
MAT_MODE_ZTRANSP = Material.Modes['ZTRANSP']
MAT_MODE_TRANSPSHADOW = Material.Modes['TRANSPSHADOW']
scene = self.scene
bl_images = {} # loaded texture images
@ -498,6 +506,7 @@ class AC3DImport:
objlist = self.objlist[1:] # skip 'world'
bmat = []
has_transp_mats = False
for mat in self.mlist:
name = mat[0]
m = Material.New(name)
@ -507,8 +516,15 @@ class AC3DImport:
m.specCol = (mat[4][0], mat[4][1], mat[4][2])
m.spec = mat[5]
m.alpha = mat[6]
if m.alpha < 1.0:
m.mode |= MAT_MODE_ZTRANSP
has_transp_mats = True
bmat.append(m)
if has_transp_mats:
for mat in bmat:
mat.mode |= MAT_MODE_TRANSPSHADOW
obj_idx = 0 # index of current obj in loop
for obj in objlist:
if obj.type == AC_GROUP:
@ -525,7 +541,7 @@ class AC3DImport:
# type AC_POLY:
# old .ac files used empty meshes as groups, convert to a real ac group
if not obj.vlist:
if not obj.vlist and obj.kids:
obj.type = AC_GROUP
continue
@ -536,6 +552,9 @@ class AC3DImport:
if obj.data: mesh.name = obj.data
mesh.degr = obj.crease # will auto clamp to [1, 80]
if not obj.vlist: # no vertices? nothing more to do
continue
mesh.verts.extend(obj.vlist)
objmat_indices = []
@ -551,8 +570,10 @@ class AC3DImport:
mesh.faces.extend(obj.flist_v)
mesh.faceUV = True
facesnum = len(mesh.faces)
# checking if the .ac file had duplicate faces (Blender ignores them):
if len(mesh.faces) != len(obj.flist_v):
if facesnum != len(obj.flist_v):
# it has, ugh. Let's clean the uv list:
lenfl = len(obj.flist_v)
flist = obj.flist_v
@ -560,18 +581,18 @@ class AC3DImport:
cfglist = obj.flist_cfg
for f in flist:
f.sort()
for fi in range(lenfl - 1):
if flist[fi] in flist[fi+1:]:
fi = lenfl
while fi > 0:
fi -= 1
if flist[fi] in flist[:fi]:
uvlist.pop(fi)
cfglist.pop(fi)
img = None
tex = None
if obj.tex != '':
baseimgname = bsys.basename(obj.tex)
if obj.tex in bl_images.keys():
img = bl_images[obj.txt]
tex = bl_textures[img]
img = bl_images[obj.tex]
else:
try:
img = Image.Load(obj.tex)
@ -591,8 +612,8 @@ class AC3DImport:
if img:
bl_images[obj.tex] = img
i = 0
for f in obj.flist_cfg:
for i in range(facesnum):
f = obj.flist_cfg[i]
fmat = f[0]
is_smooth = f[1]
twoside = f[2]
@ -617,8 +638,6 @@ class AC3DImport:
mesh.faces[i].uv = fuv
i += 1
mesh.calcNormals()
mesh.mode = MESH_AUTOSMOOTH