Handle transforms, parents and objects better

This commit is contained in:
Pyogenics
2025-05-21 18:18:14 +01:00
parent c2580a4273
commit 3655a0c79d

View File

@@ -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