aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Virtools/3dxml.py41
1 files changed, 28 insertions, 13 deletions
diff --git a/Virtools/3dxml.py b/Virtools/3dxml.py
index c95cbf8..a72cf54 100644
--- a/Virtools/3dxml.py
+++ b/Virtools/3dxml.py
@@ -5,7 +5,7 @@ bl_info={
"description":"Import 3D XML 3.0",
"author":"Chris Xiong",
"version":(0,1),
- "blender":(2,80,0),
+ "blender":(2,82,0),
"category":"Import-Export",
"support":"TESTING"
}
@@ -36,7 +36,7 @@ bl_info={
################################################################
import bpy,bmesh,bpy_extras,mathutils
import xml.etree.ElementTree as etree
-import pathlib,zipfile,time,os,tempfile
+import pathlib,zipfile,time,os,tempfile,math
NS="{http://www.3ds.com/xsd/3DXML}"
@@ -90,6 +90,7 @@ def load_meshes(tree):
for rep in tree.findall(f".//{NS}Representation"):
rid=rep.attrib["id"]
verts=unflatten(rep.find(f".//{NS}Positions").text,float,3,unitfactor)
+ normals=unflatten(rep.find(f".//{NS}Normals").text,float,3)
uvs=unflatten(rep.find(f".//{NS}TextureCoordinates").text,float,2)
faces=[]
facemat=[]
@@ -116,15 +117,20 @@ def load_meshes(tree):
faces.extend(unflatten(face.attrib["fans"],int,4))
facemat.extend([fmat]*len(unflatten(face.attrib["fans"],int,4)))
meshmat[rid]=matslots
- create_mesh(verts,faces,facemat,uvs,rid)
+ create_mesh(verts,faces,facemat,normals,uvs,rid)
def load_objects(tree):
rr=tree.findall(f".//{NS}ReferenceRep[@format='TESSELLATED']")
- i3d=tree.findall(f".//{NS}Instance3D")
+ sr=set()
+ for ref in rr:
+ n=ref.attrib["name"]
+ sr.add(n[:n.rfind('_')])
+ ti3d=tree.findall(f".//{NS}Instance3D")
+ i3d=[i3 for i3 in ti3d if i3.attrib["name"][:i3.attrib["name"].rfind('_')] in sr]
for ref,i3 in zip(rr,i3d):
meshid=ref.attrib["associatedFile"].split(":")[-1]
objname=ref.attrib["name"]
- objname=objname[0:objname.rfind('_')]
+ objname=objname[:objname.rfind('_')]
mat=list(map(float,i3.find(f"./{NS}RelativeMatrix").text.split(' ')))
obj=bpy.data.objects.new(objname,meshes[meshid])
_wmat=mathutils.Matrix()
@@ -135,15 +141,18 @@ def load_objects(tree):
obj.matrix_world=_wmat
scn=bpy.context.scene
scn.collection.objects.link(obj)
- bpy.ops.object.shade_smooth()
+ obj.select_set(True)
-def create_mesh(verts,faces,facemat,uvs,meshidx):
- if len(uvs)>len(verts):
+ bpy.ops.object.shade_smooth()
+
+def create_mesh(verts,faces,facemat,norms,uvs,meshidx):
+ if len(uvs)<len(verts):
uvs.append([uvs[0]]*(len(verts)-len(uvs)))
meshname=f"Mesh_{meshidx}"
mesh=bmesh.new()
- for i in verts:
- mesh.verts.new(i)
+ for vert,norm in zip(verts,norms):
+ v=mesh.verts.new(vert)
+ v.normal=norm
mesh.verts.ensure_lookup_table()
mesh.verts.index_update()
for i,m in zip(faces,facemat):
@@ -158,8 +167,10 @@ def create_mesh(verts,faces,facemat,uvs,meshidx):
for lp in face.loops:
lp[uv].uv=mathutils.Vector(uvs[lp.vert.index])
msh=bpy.data.meshes.new(meshname)
+ if usesmooth:
+ msh.use_auto_smooth=True
+ msh.auto_smooth_angle=smoothangle
mesh.to_mesh(msh)
- msh.use_auto_smooth=True
meshes[meshidx]=msh
mesh.free()
@@ -206,12 +217,16 @@ class ImportDialog(bpy.types.Operator,bpy_extras.io_utils.ImportHelper):
filter_glob=bpy.props.StringProperty(default='*.3dxml',options={'HIDDEN'})
pt=bpy.props.StringProperty(name="Texture path",default=texdir)
- uf=bpy.props.FloatProperty(name="Unit factor",default=unitfactor)
+ uf=bpy.props.FloatProperty(name="Unit factor",default=unitfactor,min=0)
+ us=bpy.props.BoolProperty(name="Use auto smooth instead of the normal data in the 3DXML file",default=False)
+ aa=bpy.props.FloatProperty(name="Auto smooth angle",min=0,max=180,default=90)
def execute(self,context):
- global texdir,unitfactor
+ global texdir,unitfactor,usesmooth,smoothangle
texdir=self.pt
unitfactor=self.uf
+ usesmooth=self.us
+ smoothangle=self.aa/180*math.pi
read(self.filepath)
return {'FINISHED'}