diff --git a/io_scene_a3d/A3DBlenderImporter.py b/io_scene_a3d/A3DBlenderImporter.py index db1f12e..a06b6aa 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, import_unused_transforms=True): + def __init__(self, modelData, directory, reset_empty_transform=True, try_import_textures=True): self.modelData = modelData self.directory = directory self.materials = [] @@ -48,7 +48,6 @@ 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") @@ -65,52 +64,29 @@ class A3DBlenderImporter: # Create objects objects = [] - for objectData in self.modelData.objects: - ob = self.buildBlenderObject(objectData) + for transformID, transformData in enumerate(self.modelData.transforms): + # Find out if this transform is used by an object + ob = None + for objectData in self.modelData.objects: + if objectData.transformID == transformID: + ob = self.buildBlenderObject(objectData) + break + + # Empty transform, create an empty object to represent it + if ob == None: + ob = self.buildBlenderEmptyObject(transformData) + objects.append(ob) - # Assign object parents and link to collection - for obI, ob in enumerate(objects): - # Assign parents - parentID = self.modelData.transformParentIDs[obI] + + # Assign parents + for objectID, parentID in enumerate(self.modelData.transformParentIDs): if self.modelData.version < 3: - # version 2 models use 0 to signify empty parent + # version 2 models use 0 to signify empty parent so everything is shifted up parentID -= 1 if parentID == -1: - # empty parent 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 + ob = objects[objectID] + ob.parent = objects[parentID] return objects @@ -268,4 +244,21 @@ class A3DBlenderImporter: # Apply image addImageTextureToMaterial(image, ma.node_tree) - return ob \ No newline at end of file + return ob + + def buildBlenderEmptyObject(self, transformData): + # Create the object + ob = bpy.data.objects.new(transformData.name, None) + ob.empty_display_size = 10 # Assume that the model is in alternativa scale (x100) + + # Set transform + ob.location = transformData.position + ob.scale = transformData.scale + ob.rotation_mode = "QUATERNION" + x, y, z, w = transformData.rotation + ob.rotation_quaternion = (w, x, y, z) + if self.reset_empty_transform: + if transformData.scale == (0.0, 0.0, 0.0): ob.scale = (1.0, 1.0, 1.0) + if transformData.rotation == (0.0, 0.0, 0.0, 0.0): ob.rotation_quaternion = (1.0, 0.0, 0.0, 0.0) + + return ob