Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'release/scripts/ac3d_import.py')
-rw-r--r--release/scripts/ac3d_import.py832
1 files changed, 449 insertions, 383 deletions
diff --git a/release/scripts/ac3d_import.py b/release/scripts/ac3d_import.py
index 07e8540798a..d2505022adf 100644
--- a/release/scripts/ac3d_import.py
+++ b/release/scripts/ac3d_import.py
@@ -2,7 +2,7 @@
""" Registration info for Blender menus:
Name: 'AC3D (.ac)...'
-Blender: 232
+Blender: 236
Group: 'Import'
Tip: 'Import an AC3D (.ac) file.'
"""
@@ -10,40 +10,46 @@ 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.34 07/26/04"
+__version__ = "2.36 2005-04-14"
__bpydoc__ = """\
This script imports AC3D models into Blender.
AC3D is a simple and affordable commercial 3d modeller also built with OpenGL.
The .ac file format is an easy to parse text format well supported,
-for example, by the PLib 3d gaming library (AC3D v3.x).
+for example, by the PLib 3d gaming library.
Supported:<br>
UV-textured meshes with hierarchy (grouping) information.
Missing:<br>
- Support for AC3D 4's crease tag (simple, will be added soon).
+ The url tag is irrelevant for Blender.
Known issues:<br>
None.
+Config Options:<br>
+ - group (toggle): if "on", grouped objects in the .ac file are parented to
+Empties.
+ - textures dir (string): if non blank, when imported texture paths are
+wrong in the .ac file, Blender will also look for them at this dir.
+
Notes:<br>
- Check script's source code for options that can be tweaked (using Blender
-empties to emulate AC3D's grouping info and setting a default folder for
-textures, for the case of wrong paths in the .ac file(s).
+ - when looking for assigned textures, Blender tries in order: the actual
+paths from the .ac file, the .ac file's dir and the default textures dir path
+users can configure (see config options above).
"""
# $Id$
#
# --------------------------------------------------------------------------
-# AC3DImport version 2.34 Jul 26, 2004
-# Program versions: Blender 2.32+ and AC3Db files (means version 0xb)
-# small update to allow a default path for textures, see TEXDIR below.
+# AC3DImport version 2.36 Apr 14, 2005
+# Program versions: Blender 2.36+ and AC3Db files (means version 0xb)
+# changed: updated to use the Scripts Config Editor facilities
# --------------------------------------------------------------------------
# ***** BEGIN GPL LICENSE BLOCK *****
#
-# Copyright (C) 2004: Willian P. Germano, wgermano _at_ ig.com.br
+# Copyright (C) 2005: Willian P. Germano, wgermano _at_ ig.com.br
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
@@ -52,7 +58,7 @@ textures, for the case of wrong paths in the .ac file(s).
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
@@ -64,394 +70,454 @@ textures, for the case of wrong paths in the .ac file(s).
# Note:
# Blender doesn't handle n-gons (polygons with more than 4 vertices):
-# The script triangulates them, but concave polygons come out wrong and need
-# fixing. Avoiding or triangulating concave n-gons in AC3D is a simple way to
-# avoid problems.
+# The script triangulates them, but concave polygons come out wrong and need
+# fixing. Avoiding or triangulating concave n-gons in AC3D is a simple way to
+# avoid problems.
+
+import Blender
+from Blender import Registry
+from Blender.sys import dirsep
# Default folder for AC3D textures, to override wrong paths, change to your
# liking or leave as "":
-TEXDIR = ""
+TEXTURES_DIR = ""
-# Set 'GROUP' to 1 to make Blender group imported objects using Empties,
+# Set 'GROUP' to True to make Blender group imported objects using Empties,
# to reproduce the object hierarchy in the .ac file
-GROUP = 0
+GROUP = False
-import Blender
+tooltips = {
+ 'TEXTURES_DIR': 'additional dir to look for missing textures',
+ 'GROUP': 'mimick grouping information by parenting grouped meshes to empties'
+}
+
+def update_registry():
+ global GROUP, TEXTURES_DIR
+ rd = dict([('GROUP', GROUP), ('TEXTURES_DIR', TEXTURES_DIR)])
+ Registry.SetKey('ac3d_import', rd, True)
+
+rd = Registry.GetKey('ac3d_import', True)
+
+if rd:
+ TEXTURES_DIR = rd['TEXTURES_DIR']
+ GROUP = rd['GROUP']
+else: update_registry()
-if TEXDIR:
- TEXDIR = TEXDIR.replace('\\','/')
- if TEXDIR[-1] != '/': TEXDIR += '/'
+if TEXTURES_DIR:
+ oldtexdir = TEXTURES_DIR
+ if dirsep == '/': TEXTURES_DIR = TEXTURES_DIR.replace('\\', '/')
+ if TEXTURES_DIR[-1] != dirsep: TEXTURES_DIR = "%s%s" % (TEXTURES_DIR, dirsep)
+ if oldtexdir != TEXTURES_DIR: update_registry()
+
+VERBOSE = True
+rd = Registry.GetKey('General', True)
+if rd:
+ if rd.has_key('verbose'):
+ VERBOSE = rd['verbose']
+
+
errmsg = ""
+
+def inform(msg):
+ global VERBOSE
+ if VERBOSE: print msg
+
+
class Obj:
-
- def __init__(self, type):
- self.type = type
- self.dad = None
- self.name = ''
- self.data = ''
- self.tex = ''
- self.texrep = [1,1]
- self.texoff = None
- self.loc = [0, 0, 0]
- self.rot = []
- self.vlist = []
- self.flist = []
- self.matlist = []
- self.kids = 0
+
+ def __init__(self, type):
+ self.type = type
+ self.dad = None
+ self.name = ''
+ self.data = ''
+ self.tex = ''
+ self.texrep = [1,1]
+ self.texoff = None
+ self.loc = [0, 0, 0]
+ self.rot = []
+ self.crease = 30
+ self.vlist = []
+ self.flist = []
+ self.matlist = []
+ self.kids = 0
class AC3DImport:
- def __init__(self, filename):
-
- global errmsg
-
- print "Trying to import AC3D model(s) from %s ..." % filename
-
- self.i = 0
- errmsg = ''
- self.importdir = Blender.sys.dirname(filename)
- try:
- file = open(filename, 'r')
- except IOError, (errno, strerror):
- errmsg = "IOError #%s: %s" % (errno, strerror)
- print errmsg
- return None
- header = file.read(5)
- header, version = header[:4], header[-1]
- if header != 'AC3D':
- file.close()
- errmsg = 'Invalid file -- AC3D header not found.'
- print errmsg
- return None
- elif version != 'b':
- print 'AC3D file version 0x%s.' % version
- print 'This importer is for version 0xb, so it may fail.'
-
- self.token = {'OBJECT': self.parse_obj,
- 'numvert': self.parse_vert,
- 'numsurf': self.parse_surf,
- 'name': self.parse_name,
- 'data': self.parse_data,
- 'kids': self.parse_kids,
- 'loc': self.parse_loc,
- 'rot': self.parse_rot,
- 'MATERIAL': self.parse_mat,
- 'texture': self.parse_tex,
- 'texrep': self.parse_texrep,
- 'texoff': self.parse_texoff}
-
- self.objlist = []
- self.mlist = []
- self.dads = []
- self.kids = []
- self.dad = None
-
- self.lines = file.readlines()
- self.lines.append('')
- self.parse_file()
- file.close()
-
- self.testAC3DImport()
-
- def parse_obj(self, value):
- if self.kids:
- while not self.kids[-1]:
- self.kids.pop()
- self.dad = self.dad.dad
- self.kids[-1] -= 1
- new = Obj(value)
- new.dad = self.dad
- new.name = value
- self.objlist.append(new)
-
- def parse_kids(self, value):
- kids = int(value)
- if kids:
- self.kids.append(kids)
- self.dad = self.objlist[-1]
- self.objlist[-1].kids = kids
-
- def parse_name(self, value):
- name = value.split('"')[1]
- self.objlist[-1].name = name
-
- def parse_data(self, value):
- data = self.lines[self.i].strip()
- self.objlist[-1].data = data
-
- def parse_tex(self, value):
- texture = value.split('"')[1]
- self.objlist[-1].tex = texture
-
- def parse_texrep(self, trash):
- trep = self.lines[self.i - 1]
- trep = trep.split()
- trep = [float(trep[1]), float(trep[2])]
- self.objlist[-1].texrep = trep
- self.objlist[-1].texoff = [0, 0]
-
- def parse_texoff(self, trash):
- toff = self.lines[self.i - 1]
- toff = toff.split()
- toff = [float(toff[1]), float(toff[2])]
- self.objlist[-1].texoff = toff
-
- def parse_mat(self, value):
- i = self.i - 1
- lines = self.lines
- line = lines[i].split()
- mat_name = ''
- mat_col = mat_spec_col = [0,0,0]
- mat_alpha = 1
-
- while line[0] == 'MATERIAL':
- mat_name = line[1].split('"')[1]
- mat_col = map(float,[line[3],line[4],line[5]])
- mat_spec_col = map(float,[line[15],line[16],line[17]])
- mat_alpha = float(line[-1])
- mat_alpha = 1 - mat_alpha
- self.mlist.append([mat_name, mat_col, mat_spec_col, mat_alpha])
- i += 1
- line = lines[i].split()
-
- self.i = i
-
- def parse_rot(self, trash):
- i = self.i - 1
- rot = self.lines[i].split(' ', 1)[1]
- rot = map(float, rot.split())
- self.objlist[-1].rot = rot
-
- def parse_loc(self, trash):
- i = self.i - 1
- loc = self.lines[i].split(' ', 1)[1]
- loc = map(float, loc.split())
- self.objlist[-1].loc = loc
-
- def parse_vert(self, value):
- i = self.i
- lines = self.lines
- obj = self.objlist[-1]
- vlist = obj.vlist
- n = int(value)
-
- while n:
- line = lines[i].split()
- line = map(float, line)
- vlist.append(line)
- n -= 1
- i += 1
-
- self.i = i
-
- rot = obj.rot
- if rot:
- nv = len(vlist)
- for j in range(nv):
- v = vlist[j]
- t = [0,0,0]
- t[0] = rot[0]*v[0] + rot[3]*v[1] + rot[6]*v[2]
- t[1] = rot[1]*v[0] + rot[4]*v[1] + rot[7]*v[2]
- t[2] = rot[2]*v[0] + rot[5]*v[1] + rot[8]*v[2]
- vlist[j] = t
-
- loc = obj.loc
- dad = obj.dad
- while dad:
- for j in [0, 1, 2]:
- loc[j] += dad.loc[j]
- dad = dad.dad
-
- for v in vlist:
- for j in [0, 1, 2]:
- v[j] += loc[j]
-
- def parse_surf(self, value):
- i = self.i
- is_smooth = 0
- double_sided = 0
- lines = self.lines
- obj = self.objlist[-1]
- matlist = obj.matlist
- numsurf = int(value)
-
- while numsurf:
- flags = lines[i].split()
- flaglow = 0
- if len(flags[1]) > 3: flaglow = int(flags[1][3])
- flaghigh = int(flags[1][2])
- is_smooth = flaghigh & 1
- twoside = flaghigh & 2
- mat = lines[i+1].split()
- mat = int(mat[1])
- if not mat in matlist: matlist.append(mat)
- refs = lines[i+2].split()
- refs = int(refs[1])
- i += 3
- face = []
- faces = []
- fuv = []
- rfs = refs
-
- while rfs:
- line = lines[i].split()
- v = int(line[0])
- uv = [float(line[1]), float(line[2])]
- face.append([v, uv])
- rfs -= 1
- i += 1
-
- if flaglow:
- while len(face) >= 2:
- cut = face[:2]
- faces.append(cut)
- face = face[1:]
-
- if flaglow == 1:
- face = [faces[-1][-1], faces[0][0]]
- faces.append(face)
-
- else:
- while len(face) > 4:
- cut = face[:4]
- face = face[3:]
- face.insert(0, cut[0])
- faces.append(cut)
-
- faces.append(face)
-
- for f in faces:
- f.append(mat)
- f.append(is_smooth)
- f.append(twoside)
- self.objlist[-1].flist.append(f)
-
- numsurf -= 1
-
-
- self.i = i
-
- def parse_file(self):
- i = 1
- lines = self.lines
- line = lines[i].split()
-
- while line:
- kw = ''
- for k in self.token.keys():
- if line[0] == k:
- kw = k
- break
- i += 1
- if kw:
- self.i = i
- self.token[kw](line[1])
- i = self.i
- line = lines[i].split()
-
- def testAC3DImport(self):
- global GROUP
- scene = Blender.Scene.GetCurrent()
-
- bmat = []
- for mat in self.mlist:
- name = mat[0]
- m = Blender.Material.New(name)
- m.rgbCol = (mat[1][0], mat[1][1], mat[1][2])
- m.specCol = (mat[2][0], mat[2][1], mat[2][2])
- m.alpha = mat[3]
- bmat.append(m)
-
- for obj in self.objlist:
- if obj.type == 'world':
- continue
- elif obj.type == 'group':
- if not GROUP: continue
- empty = Blender.Object.New('Empty')
- empty.name = obj.name
- scene.link(empty)
- if self.dads:
- dadobj = Blender.Object.get(self.dads.pop())
- dadobj.makeParent([empty])
- while obj.kids:
- self.dads.append(empty.name)
- obj.kids -= 1
- continue
- mesh = Blender.NMesh.New()
- if (obj.data): mesh.name = obj.data
- mesh.hasFaceUV(1)
-
- tex = None
- if obj.tex != '':
- try:
- tex = Blender.Image.Load(obj.tex)
- # Commented because it's unnecessary:
- #tex.xrep = int(obj.texrep[0])
- #tex.yrep = int(obj.texrep[1])
- except:
- basetexname = Blender.sys.basename(obj.tex)
- try:
- obj.tex = self.importdir + '/' + basetexname
- tex = Blender.Image.Load(obj.tex)
- except:
- try:
- obj.tex = TEXDIR + basetexname
- tex = Blender.Image.Load(obj.tex)
- except:
- print "Couldn't load texture: %s" % basetexname
-
- for v in obj.vlist:
- bvert = Blender.NMesh.Vert(v[0],v[1],v[2])
- mesh.verts.append(bvert)
-
- objmat_indices = []
- for mat in bmat:
- if bmat.index(mat) in obj.matlist:
- objmat_indices.append(bmat.index(mat))
- mesh.materials.append(mat)
- for f in obj.flist:
- twoside = f[-1]
- is_smooth = f[-2]
- fmat = f[-3]
- f=f[:-3]
- bface = Blender.NMesh.Face()
- bface.smooth = is_smooth
- if twoside: bface.mode |= Blender.NMesh.FaceModes['TWOSIDE']
- if tex:
- bface.mode |= Blender.NMesh.FaceModes['TEX']
- bface.image = tex
- bface.materialIndex = objmat_indices.index(fmat)
- if obj.texoff:
- uoff = obj.texoff[0]
- voff = obj.texoff[1]
- urep = obj.texrep[0]
- vrep = obj.texrep[1]
- for vi in range(len(f)):
- f[vi][1][0] *= urep
- f[vi][1][1] *= vrep
- f[vi][1][0] += uoff
- f[vi][1][1] += voff
-
- for vi in range(len(f)):
- bface.v.append(mesh.verts[f[vi][0]])
- bface.uv.append((f[vi][1][0], f[vi][1][1]))
- mesh.faces.append(bface)
-
- mesh.mode = 0
- object = Blender.NMesh.PutRaw(mesh)
- object.setName(obj.name)
- object.setEuler([1.5707963,0,0]) # align ac3d w/ Blender
- if self.dads:
- dadobj = Blender.Object.get(self.dads.pop())
- dadobj.makeParent([object])
-
- print '...done!'
+ def __init__(self, filename):
+
+ global errmsg
+
+ self.i = 0
+ errmsg = ''
+ self.importdir = Blender.sys.dirname(filename)
+ try:
+ file = open(filename, 'r')
+ except IOError, (errno, strerror):
+ errmsg = "IOError #%s: %s" % (errno, strerror)
+ Blender.Draw.PupMenu('ERROR: %s' % errmsg)
+ inform(errmsg)
+ return None
+ header = file.read(5)
+ header, version = header[:4], header[-1]
+ if header != 'AC3D':
+ file.close()
+ errmsg = 'AC3D header not found (invalid file)'
+ Blender.Draw.PupMenu('ERROR: %s' % errmsg)
+ inform(errmsg)
+ return None
+ elif version != 'b':
+ inform('AC3D file version 0x%s.' % version)
+ inform('This importer is for version 0xb, so it may fail.')
+
+ self.token = {'OBJECT': self.parse_obj,
+ 'numvert': self.parse_vert,
+ 'numsurf': self.parse_surf,
+ 'name': self.parse_name,
+ 'data': self.parse_data,
+ 'kids': self.parse_kids,
+ 'loc': self.parse_loc,
+ 'rot': self.parse_rot,
+ 'MATERIAL': self.parse_mat,
+ 'texture': self.parse_tex,
+ 'texrep': self.parse_texrep,
+ 'texoff': self.parse_texoff,
+ 'crease': self.parse_crease}
+
+ self.objlist = []
+ self.mlist = []
+ self.dads = []
+ self.kids = []
+ self.dad = None
+
+ self.lines = file.readlines()
+ self.lines.append('')
+ self.parse_file()
+ file.close()
+
+ self.testAC3DImport()
+
+ def parse_obj(self, value):
+ if self.kids:
+ while not self.kids[-1]:
+ self.kids.pop()
+ self.dad = self.dad.dad
+ self.kids[-1] -= 1
+ new = Obj(value)
+ new.dad = self.dad
+ new.name = value
+ self.objlist.append(new)
+
+ def parse_kids(self, value):
+ kids = int(value)
+ if kids:
+ self.kids.append(kids)
+ self.dad = self.objlist[-1]
+ self.objlist[-1].kids = kids
+
+ def parse_name(self, value):
+ name = value.split('"')[1]
+ self.objlist[-1].name = name
+
+ def parse_data(self, value):
+ data = self.lines[self.i].strip()
+ self.objlist[-1].data = data
+
+ def parse_tex(self, value):
+ texture = value.split('"')[1]
+ self.objlist[-1].tex = texture
+
+ def parse_texrep(self, trash):
+ trep = self.lines[self.i - 1]
+ trep = trep.split()
+ trep = [float(trep[1]), float(trep[2])]
+ self.objlist[-1].texrep = trep
+ self.objlist[-1].texoff = [0, 0]
+
+ def parse_texoff(self, trash):
+ toff = self.lines[self.i - 1]
+ toff = toff.split()
+ toff = [float(toff[1]), float(toff[2])]
+ self.objlist[-1].texoff = toff
+
+ def parse_mat(self, value):
+ i = self.i - 1
+ lines = self.lines
+ line = lines[i].split()
+ mat_name = ''
+ mat_col = mat_amb = mat_emit = mat_spec_col = [0,0,0]
+ mat_alpha = 1
+ mat_spec = 1.0
+
+ while line[0] == 'MATERIAL':
+ mat_name = line[1].split('"')[1]
+ mat_col = map(float,[line[3],line[4],line[5]])
+ v = map(float,[line[7],line[8],line[9]])
+ mat_amb = (v[0]+v[1]+v[2]) / 3.0
+ v = map(float,[line[11],line[12],line[13]])
+ mat_emit = (v[0]+v[1]+v[2]) / 3.0
+ mat_spec_col = map(float,[line[15],line[16],line[17]])
+ mat_spec = float(line[19]) / 64.0
+ mat_alpha = float(line[-1])
+ mat_alpha = 1 - mat_alpha
+ self.mlist.append([mat_name, mat_col, mat_amb, mat_emit, mat_spec_col, mat_spec, mat_alpha])
+ i += 1
+ line = lines[i].split()
+
+ self.i = i
+
+ def parse_rot(self, trash):
+ i = self.i - 1
+ rot = self.lines[i].split(' ', 1)[1]
+ rot = map(float, rot.split())
+ self.objlist[-1].rot = rot
+
+ def parse_loc(self, trash):
+ i = self.i - 1
+ loc = self.lines[i].split(' ', 1)[1]
+ loc = map(float, loc.split())
+ self.objlist[-1].loc = loc
+
+ def parse_crease(self, value):
+ # AC3D: range is [0.0, 180.0]; Blender: [1, 80]
+ try:
+ value = int(value)
+ except ValueError:
+ value = int(float(value)) # duh
+ self.objlist[-1].crease = value
+
+ def parse_vert(self, value):
+ i = self.i
+ lines = self.lines
+ obj = self.objlist[-1]
+ vlist = obj.vlist
+ n = int(value)
+
+ while n:
+ line = lines[i].split()
+ line = map(float, line)
+ vlist.append(line)
+ n -= 1
+ i += 1
+
+ self.i = i
+
+ rot = obj.rot
+ if rot:
+ nv = len(vlist)
+ for j in range(nv):
+ v = vlist[j]
+ t = [0,0,0]
+ t[0] = rot[0]*v[0] + rot[3]*v[1] + rot[6]*v[2]
+ t[1] = rot[1]*v[0] + rot[4]*v[1] + rot[7]*v[2]
+ t[2] = rot[2]*v[0] + rot[5]*v[1] + rot[8]*v[2]
+ vlist[j] = t
+
+ loc = obj.loc
+ dad = obj.dad
+ while dad:
+ for j in [0, 1, 2]:
+ loc[j] += dad.loc[j]
+ dad = dad.dad
+
+ for v in vlist:
+ for j in [0, 1, 2]:
+ v[j] += loc[j]
+
+ def parse_surf(self, value):
+ i = self.i
+ is_smooth = 0
+ double_sided = 0
+ lines = self.lines
+ obj = self.objlist[-1]
+ matlist = obj.matlist
+ numsurf = int(value)
+
+ while numsurf:
+ flags = lines[i].split()
+ flaglow = 0
+ if len(flags[1]) > 3: flaglow = int(flags[1][3])
+ flaghigh = int(flags[1][2])
+ is_smooth = flaghigh & 1
+ twoside = flaghigh & 2
+ mat = lines[i+1].split()
+ mat = int(mat[1])
+ if not mat in matlist: matlist.append(mat)
+ refs = lines[i+2].split()
+ refs = int(refs[1])
+ i += 3
+ face = []
+ faces = []
+ fuv = []
+ rfs = refs
+
+ while rfs:
+ line = lines[i].split()
+ v = int(line[0])
+ uv = [float(line[1]), float(line[2])]
+ face.append([v, uv])
+ rfs -= 1
+ i += 1
+
+ if flaglow:
+ while len(face) >= 2:
+ cut = face[:2]
+ faces.append(cut)
+ face = face[1:]
+
+ if flaglow == 1:
+ face = [faces[-1][-1], faces[0][0]]
+ faces.append(face)
+
+ else:
+ while len(face) > 4:
+ cut = face[:4]
+ face = face[3:]
+ face.insert(0, cut[0])
+ faces.append(cut)
+
+ faces.append(face)
+
+ for f in faces:
+ f.append(mat)
+ f.append(is_smooth)
+ f.append(twoside)
+ self.objlist[-1].flist.append(f)
+
+ numsurf -= 1
+
+
+ self.i = i
+
+ def parse_file(self):
+ i = 1
+ lines = self.lines
+ line = lines[i].split()
+
+ while line:
+ kw = ''
+ for k in self.token.keys():
+ if line[0] == k:
+ kw = k
+ break
+ i += 1
+ if kw:
+ self.i = i
+ self.token[kw](line[1])
+ i = self.i
+ line = lines[i].split()
+
+ def testAC3DImport(self):
+ global GROUP
+ scene = Blender.Scene.GetCurrent()
+
+ bmat = []
+ for mat in self.mlist:
+ name = mat[0]
+ m = Blender.Material.New(name)
+ m.rgbCol = (mat[1][0], mat[1][1], mat[1][2])
+ m.amb = mat[2]
+ m.emit = mat[3]
+ m.specCol = (mat[4][0], mat[4][1], mat[4][2])
+ m.spec = mat[5]
+ m.alpha = mat[6]
+ bmat.append(m)
+
+ for obj in self.objlist:
+ if obj.type == 'world':
+ continue
+ elif obj.type == 'group':
+ if not GROUP: continue
+ empty = Blender.Object.New('Empty')
+ empty.name = obj.name
+ scene.link(empty)
+ if self.dads:
+ dadobj = Blender.Object.get(self.dads.pop())
+ dadobj.makeParent([empty])
+ while obj.kids:
+ self.dads.append(empty.name)
+ obj.kids -= 1
+ continue
+ mesh = Blender.NMesh.New()
+ if obj.data: mesh.name = obj.data
+ mesh.setMaxSmoothAngle(obj.crease) # will clamp to [1, 80]
+ mesh.hasFaceUV(1)
+
+ tex = None
+ if obj.tex != '':
+ try:
+ tex = Blender.Image.Load(obj.tex)
+ # Commented because it's unnecessary:
+ #tex.xrep = int(obj.texrep[0])
+ #tex.yrep = int(obj.texrep[1])
+ except:
+ basetexname = Blender.sys.basename(obj.tex)
+ try:
+ obj.tex = self.importdir + '/' + basetexname
+ tex = Blender.Image.Load(obj.tex)
+ except:
+ try:
+ obj.tex = TEXTURES_DIR + basetexname
+ tex = Blender.Image.Load(obj.tex)
+ except:
+ inform("Couldn't load texture: %s" % basetexname)
+
+ for v in obj.vlist:
+ bvert = Blender.NMesh.Vert(v[0],v[1],v[2])
+ mesh.verts.append(bvert)
+
+ objmat_indices = []
+ for mat in bmat:
+ if bmat.index(mat) in obj.matlist:
+ objmat_indices.append(bmat.index(mat))
+ mesh.materials.append(mat)
+ for f in obj.flist:
+ twoside = f[-1]
+ is_smooth = f[-2]
+ fmat = f[-3]
+ f=f[:-3]
+ bface = Blender.NMesh.Face()
+ bface.smooth = is_smooth
+ if twoside: bface.mode |= Blender.NMesh.FaceModes['TWOSIDE']
+ if tex:
+ bface.mode |= Blender.NMesh.FaceModes['TEX']
+ bface.image = tex
+ bface.materialIndex = objmat_indices.index(fmat)
+ if obj.texoff:
+ uoff = obj.texoff[0]
+ voff = obj.texoff[1]
+ urep = obj.texrep[0]
+ vrep = obj.texrep[1]
+ for vi in range(len(f)):
+ f[vi][1][0] *= urep
+ f[vi][1][1] *= vrep
+ f[vi][1][0] += uoff
+ f[vi][1][1] += voff
+
+ for vi in range(len(f)):
+ bface.v.append(mesh.verts[f[vi][0]])
+ bface.uv.append((f[vi][1][0], f[vi][1][1]))
+ mesh.faces.append(bface)
+
+ mesh.mode = 0
+ object = Blender.NMesh.PutRaw(mesh)
+ object.setName(obj.name)
+ object.setEuler([1.5707963,0,0]) # align ac3d w/ Blender
+ if self.dads:
+ dadobj = Blender.Object.get(self.dads.pop())
+ dadobj.makeParent([object])
# End of class AC3DImport
def filesel_callback(filename):
- test = AC3DImport(filename)
+
+ inform("Trying to import AC3D model(s) from %s ..." % filename)
+ Blender.Window.WaitCursor(1)
+ starttime = Blender.sys.time()
+ test = AC3DImport(filename)
+ Blender.Window.WaitCursor(0)
+ endtime = Blender.sys.time() - starttime
+ inform('... done! Data imported in %.3f seconds.\n' % endtime)
Blender.Window.FileSelector(filesel_callback, "Import AC3D", "*.ac")