mirror of
https://github.com/MapMakersAndProgrammers/io_scene_a3d.git
synced 2025-10-26 01:49:13 -07:00
Handle transforms, parents and objects better
This commit is contained in:
@@ -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 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]
|
||||
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
|
||||
|
||||
@@ -269,3 +245,20 @@ class A3DBlenderImporter:
|
||||
addImageTextureToMaterial(image, ma.node_tree)
|
||||
|
||||
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
|
||||
|
||||
Reference in New Issue
Block a user