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)
|
return (x, 1-y)
|
||||||
|
|
||||||
class A3DBlenderImporter:
|
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.modelData = modelData
|
||||||
self.directory = directory
|
self.directory = directory
|
||||||
self.materials = []
|
self.materials = []
|
||||||
@@ -48,7 +48,6 @@ class A3DBlenderImporter:
|
|||||||
# User settings
|
# User settings
|
||||||
self.reset_empty_transform = reset_empty_transform
|
self.reset_empty_transform = reset_empty_transform
|
||||||
self.try_import_textures = try_import_textures
|
self.try_import_textures = try_import_textures
|
||||||
self.import_unused_transforms = import_unused_transforms
|
|
||||||
|
|
||||||
def importData(self):
|
def importData(self):
|
||||||
print("Importing A3D model data into blender")
|
print("Importing A3D model data into blender")
|
||||||
@@ -65,52 +64,29 @@ class A3DBlenderImporter:
|
|||||||
|
|
||||||
# Create objects
|
# Create objects
|
||||||
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:
|
for objectData in self.modelData.objects:
|
||||||
|
if objectData.transformID == transformID:
|
||||||
ob = self.buildBlenderObject(objectData)
|
ob = self.buildBlenderObject(objectData)
|
||||||
|
break
|
||||||
|
|
||||||
|
# Empty transform, create an empty object to represent it
|
||||||
|
if ob == None:
|
||||||
|
ob = self.buildBlenderEmptyObject(transformData)
|
||||||
|
|
||||||
objects.append(ob)
|
objects.append(ob)
|
||||||
# Assign object parents and link to collection
|
|
||||||
for obI, ob in enumerate(objects):
|
|
||||||
# Assign parents
|
# Assign parents
|
||||||
parentID = self.modelData.transformParentIDs[obI]
|
for objectID, parentID in enumerate(self.modelData.transformParentIDs):
|
||||||
if self.modelData.version < 3:
|
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
|
parentID -= 1
|
||||||
if parentID == -1:
|
if parentID == -1:
|
||||||
# empty parent
|
|
||||||
continue
|
continue
|
||||||
parentOB = objects[parentID]
|
ob = objects[objectID]
|
||||||
ob.parent = parentOB
|
ob.parent = objects[parentID]
|
||||||
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
|
return objects
|
||||||
|
|
||||||
@@ -269,3 +245,20 @@ class A3DBlenderImporter:
|
|||||||
addImageTextureToMaterial(image, ma.node_tree)
|
addImageTextureToMaterial(image, ma.node_tree)
|
||||||
|
|
||||||
return ob
|
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