diff --git a/io_scene_a3d/A3DBlenderExporter.py b/io_scene_a3d/A3DBlenderExporter.py index 08702cc..e4cf8f4 100644 --- a/io_scene_a3d/A3DBlenderExporter.py +++ b/io_scene_a3d/A3DBlenderExporter.py @@ -46,6 +46,17 @@ class A3DBlenderExporter: objects = [] for ob in self.objects: me = ob.data + if me == None: + # Create a transform for this object without the object itself + transform = A3DObjects.A3DTransform() + transform.position = ob.location + rotationW, rotationX, rotationY, rotationZ = ob.rotation_quaternion + transform.rotation = (rotationX, rotationY, rotationZ, rotationW) + transform.scale = ob.scale + transform.name = ob.name + transforms[ob.name] = transform + + continue # Process materials for ma in me.materials: @@ -128,8 +139,12 @@ class A3DBlenderExporter: uv1Vertices[i2] = uv1Data.uv[polygon.loop_start+2].vector uv1Buffer.data = uv1Vertices - mesh.vertexBufferCount = 3 #XXX: We only do coordinate, normal1 and uv1 - mesh.vertexBuffers = [coordinateBuffer, uv1Buffer, normal1Buffer] + normal2Buffer = A3DObjects.A3DVertexBuffer() + normal2Buffer.bufferType = A3D_VERTEXTYPE_NORMAL2 + normal2Buffer.data = normal1Buffer.data + + mesh.vertexBufferCount = 4 #XXX: We only do coordinate, normal1 and uv1 + mesh.vertexBuffers = [coordinateBuffer, uv1Buffer, normal1Buffer, normal2Buffer] # Create submeshes indexArrays = {} # material_index: index array diff --git a/io_scene_a3d/A3DBlenderImporter.py b/io_scene_a3d/A3DBlenderImporter.py index 7635340..db1f12e 100644 --- a/io_scene_a3d/A3DBlenderImporter.py +++ b/io_scene_a3d/A3DBlenderImporter.py @@ -39,7 +39,7 @@ def mirrorUVY(uv): return (x, 1-y) class A3DBlenderImporter: - def __init__(self, modelData, directory, reset_empty_transform=True, try_import_textures=True): + def __init__(self, modelData, directory, reset_empty_transform=True, try_import_textures=True, import_unused_transforms=True): self.modelData = modelData self.directory = directory self.materials = [] @@ -48,6 +48,7 @@ class A3DBlenderImporter: # User settings self.reset_empty_transform = reset_empty_transform self.try_import_textures = try_import_textures + self.import_unused_transforms = import_unused_transforms def importData(self): print("Importing A3D model data into blender") @@ -79,7 +80,38 @@ class A3DBlenderImporter: continue parentOB = objects[parentID] ob.parent = parentOB - + if self.import_unused_transforms: + # First identify which transforms have not been used + unusedTransformIndices = list( + range(len(self.modelData.transforms)) + ) + print(unusedTransformIndices) + for objectData in self.modelData.objects: + unusedTransformIndices.remove(objectData.transformID) + + # Create empty objects for each transform + for transformID in unusedTransformIndices: + transformData = self.modelData.transforms[transformID] + ob = bpy.data.objects.new(transformData.name, None) + ob.empty_display_size = 10 + ob.location = transformData.position + ob.rotation_mode = "QUATERNION" + x, y, z, w = transformData.rotation + ob.rotation_quaternion = (w, x, y, z) + ob.scale = transformData.scale + objects.append(ob) + + # Assign parent + parentID = self.modelData.transformParentIDs[transformID] + if self.modelData.version < 3: + # version 2 models use 0 to signify empty parent + parentID -= 1 + if parentID == -1: + # empty parent + continue + parentOB = objects[parentID] + ob.parent = parentOB + return objects '''