mirror of
https://github.com/MapMakersAndProgrammers/io_scene_a3d.git
synced 2025-10-25 17:39:10 -07:00
Correct transform parent reading and implement parent assignment
Thanks to tubixpvp for pointing out the error with transform parent reading
This commit is contained in:
7
.gitignore
vendored
7
.gitignore
vendored
@@ -1,2 +1,7 @@
|
|||||||
|
# Build and cache
|
||||||
__pycache__/
|
__pycache__/
|
||||||
*.zip
|
*.zip
|
||||||
|
|
||||||
|
# Editor files
|
||||||
|
.venv/
|
||||||
|
.vscode/
|
||||||
@@ -38,9 +38,12 @@ A3D model object
|
|||||||
'''
|
'''
|
||||||
class A3D:
|
class A3D:
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
|
self.version = 0
|
||||||
|
|
||||||
self.materials = []
|
self.materials = []
|
||||||
self.meshes = []
|
self.meshes = []
|
||||||
self.transforms = {}
|
self.transforms = []
|
||||||
|
self.transformParentIDs = []
|
||||||
self.objects = []
|
self.objects = []
|
||||||
|
|
||||||
'''
|
'''
|
||||||
@@ -53,14 +56,14 @@ class A3D:
|
|||||||
raise RuntimeError(f"Invalid A3D signature: {signature}")
|
raise RuntimeError(f"Invalid A3D signature: {signature}")
|
||||||
|
|
||||||
# Read file version and read version specific data
|
# Read file version and read version specific data
|
||||||
version, _ = unpackStream("<2H", stream) # Likely major.minor version code
|
self.version, _ = unpackStream("<2H", stream) # Likely major.minor version code
|
||||||
print(f"Reading A3D version {version}")
|
print(f"Reading A3D version {self.version}")
|
||||||
|
|
||||||
if version == 1:
|
if self.version == 1:
|
||||||
self.readRootBlock1(stream)
|
self.readRootBlock1(stream)
|
||||||
elif version == 2:
|
elif self.version == 2:
|
||||||
self.readRootBlock2(stream)
|
self.readRootBlock2(stream)
|
||||||
elif version == 3:
|
elif self.version == 3:
|
||||||
self.readRootBlock3(stream)
|
self.readRootBlock3(stream)
|
||||||
|
|
||||||
'''
|
'''
|
||||||
@@ -175,15 +178,14 @@ class A3D:
|
|||||||
|
|
||||||
# Read data
|
# Read data
|
||||||
print(f"Reading transform block with {transformCount} transforms")
|
print(f"Reading transform block with {transformCount} transforms")
|
||||||
transforms = []
|
|
||||||
for _ in range(transformCount):
|
for _ in range(transformCount):
|
||||||
transform = A3DObjects.A3DTransform()
|
transform = A3DObjects.A3DTransform()
|
||||||
transform.read2(stream)
|
transform.read2(stream)
|
||||||
transforms.append(transform)
|
self.transforms.append(transform)
|
||||||
# Read and assign transform ids
|
# Read parent ids
|
||||||
for transformI in range(transformCount):
|
for _ in range(transformCount):
|
||||||
transformID, = unpackStream("<I", stream)
|
parentID, = unpackStream("<i", stream)
|
||||||
self.transforms[transformID] = transforms[transformI]
|
self.transformParentIDs.append(parentID)
|
||||||
|
|
||||||
def readTransformBlock3(self, stream):
|
def readTransformBlock3(self, stream):
|
||||||
# Verify signature
|
# Verify signature
|
||||||
@@ -197,11 +199,11 @@ class A3D:
|
|||||||
for _ in range(transformCount):
|
for _ in range(transformCount):
|
||||||
transform = A3DObjects.A3DTransform()
|
transform = A3DObjects.A3DTransform()
|
||||||
transform.read3(stream)
|
transform.read3(stream)
|
||||||
transforms.append(transform)
|
self.transforms.append(transform)
|
||||||
# Read and assign transform ids
|
# Read parent ids
|
||||||
for transformI in range(transformCount):
|
for _ in range(transformCount):
|
||||||
transformID, = unpackStream("<I", stream)
|
parentID, = unpackStream("<i", stream)
|
||||||
self.transforms[transformI] = transforms[transformI] #XXX: The IDs seem to be incorrect and instead map to index?
|
self.transformParentIDs.append(parentID)
|
||||||
|
|
||||||
# Padding
|
# Padding
|
||||||
padding = calculatePadding(length)
|
padding = calculatePadding(length)
|
||||||
|
|||||||
@@ -78,9 +78,24 @@ class A3DBlenderImporter:
|
|||||||
if self.create_collection:
|
if self.create_collection:
|
||||||
collection = bpy.data.collections.new("Object")
|
collection = bpy.data.collections.new("Object")
|
||||||
bpy.context.collection.children.link(collection)
|
bpy.context.collection.children.link(collection)
|
||||||
|
objects = []
|
||||||
for objectData in self.modelData.objects:
|
for objectData in self.modelData.objects:
|
||||||
ob = self.buildBlenderObject(objectData)
|
ob = self.buildBlenderObject(objectData)
|
||||||
|
objects.append(ob)
|
||||||
|
# Assign object parents and link to collection
|
||||||
|
for obI, ob in enumerate(objects):
|
||||||
collection.objects.link(ob)
|
collection.objects.link(ob)
|
||||||
|
|
||||||
|
# Assign parents
|
||||||
|
parentID = self.modelData.transformParentIDs[obI]
|
||||||
|
if parentID == 0 and self.modelData.version < 3:
|
||||||
|
# version 2 models use 0 to signify empty parent
|
||||||
|
continue
|
||||||
|
elif parentID == -1:
|
||||||
|
# version 3 models use -1 to signify empty parent
|
||||||
|
continue
|
||||||
|
parentOB = objects[parentID]
|
||||||
|
ob.parent = parentOB
|
||||||
|
|
||||||
'''
|
'''
|
||||||
Blender data builders
|
Blender data builders
|
||||||
|
|||||||
Reference in New Issue
Block a user