mirror of
https://github.com/MapMakersAndProgrammers/io_scene_a3d.git
synced 2025-10-26 09:59:11 -07:00
Store array count fields instead of relying on len
This commit is contained in:
@@ -50,17 +50,21 @@ class A3DMesh:
|
|||||||
self.vertexBuffers = []
|
self.vertexBuffers = []
|
||||||
self.submeshes = []
|
self.submeshes = []
|
||||||
|
|
||||||
|
self.vertexCount = 0
|
||||||
|
self.vertexBufferCount = 0
|
||||||
|
self.submeshCount = 0
|
||||||
|
|
||||||
def read2(self, stream):
|
def read2(self, stream):
|
||||||
# Read vertex buffers
|
# Read vertex buffers
|
||||||
vertexCount, bufferCount = unpackStream("<2I", stream)
|
self.vertexCount, self.vertexBufferCount = unpackStream("<2I", stream)
|
||||||
for _ in range(bufferCount):
|
for _ in range(self.vertexBufferCount):
|
||||||
vertexBuffer = A3DVertexBuffer()
|
vertexBuffer = A3DVertexBuffer()
|
||||||
vertexBuffer.read2(vertexCount, stream)
|
vertexBuffer.read2(self.vertexCount, stream)
|
||||||
self.vertexBuffers.append(vertexBuffer)
|
self.vertexBuffers.append(vertexBuffer)
|
||||||
|
|
||||||
# Read submeshes
|
# Read submeshes
|
||||||
submeshCount, = unpackStream("<I", stream)
|
self.submeshCount, = unpackStream("<I", stream)
|
||||||
for _ in range(submeshCount):
|
for _ in range(self.submeshCount):
|
||||||
submesh = A3DSubmesh()
|
submesh = A3DSubmesh()
|
||||||
submesh.read2(stream)
|
submesh.read2(stream)
|
||||||
self.submeshes.append(submesh)
|
self.submeshes.append(submesh)
|
||||||
@@ -76,15 +80,15 @@ class A3DMesh:
|
|||||||
stream.read(4) # XXX: Unknown float value
|
stream.read(4) # XXX: Unknown float value
|
||||||
|
|
||||||
# Read vertex buffers
|
# Read vertex buffers
|
||||||
vertexCount, bufferCount = unpackStream("<2I", stream)
|
self.vertexCount, self.vertexBufferCount = unpackStream("<2I", stream)
|
||||||
for _ in range(bufferCount):
|
for _ in range(self.vertexBufferCount):
|
||||||
vertexBuffer = A3DVertexBuffer()
|
vertexBuffer = A3DVertexBuffer()
|
||||||
vertexBuffer.read2(vertexCount, stream)
|
vertexBuffer.read2(self.vertexCount, stream)
|
||||||
self.vertexBuffers.append(vertexBuffer)
|
self.vertexBuffers.append(vertexBuffer)
|
||||||
|
|
||||||
# Read submeshes
|
# Read submeshes
|
||||||
submeshCount, = unpackStream("<I", stream)
|
self.submeshCount, = unpackStream("<I", stream)
|
||||||
for _ in range(submeshCount):
|
for _ in range(self.submeshCount):
|
||||||
submesh = A3DSubmesh()
|
submesh = A3DSubmesh()
|
||||||
submesh.read3(stream)
|
submesh.read3(stream)
|
||||||
self.submeshes.append(submesh)
|
self.submeshes.append(submesh)
|
||||||
@@ -125,34 +129,29 @@ class A3DVertexBuffer:
|
|||||||
class A3DSubmesh:
|
class A3DSubmesh:
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
self.indices = []
|
self.indices = []
|
||||||
self.faces = []
|
|
||||||
self.smoothingGroups = []
|
self.smoothingGroups = []
|
||||||
self.materialID = None
|
self.materialID = None
|
||||||
|
|
||||||
|
self.indexCount = 0
|
||||||
|
|
||||||
def read2(self, stream):
|
def read2(self, stream):
|
||||||
faceCount, = unpackStream("<I", stream)
|
self.indexCount, = unpackStream("<I", stream)*3
|
||||||
for _ in range(faceCount):
|
self.indices = list(unpackStream(f"<{self.indexCount}H", stream))
|
||||||
face = unpackStream("<3H", stream)
|
self.smoothingGroups = list(unpackStream(f"<{self.indexCount//3}I", stream))
|
||||||
self.faces.append(face)
|
|
||||||
for _ in range(faceCount):
|
|
||||||
smoothingGroup, = unpackStream("<I", stream)
|
|
||||||
self.smoothingGroups.append(smoothingGroup)
|
|
||||||
self.materialID, = unpackStream("<H", stream)
|
self.materialID, = unpackStream("<H", stream)
|
||||||
|
|
||||||
print(f"[A3DSubmesh indices: {len(self.indices)} faces: {len(self.faces)} smoothing groups: {len(self.smoothingGroups)} materialID: {self.materialID}]")
|
print(f"[A3DSubmesh indices: {len(self.indices)} smoothing groups: {len(self.smoothingGroups)} materialID: {self.materialID}]")
|
||||||
|
|
||||||
def read3(self, stream):
|
def read3(self, stream):
|
||||||
# Read indices
|
# Read indices
|
||||||
indexCount, = unpackStream("<I", stream)
|
self.indexCount, = unpackStream("<I", stream)
|
||||||
for _ in range(indexCount):
|
self.indices = list(unpackStream(f"<{self.indexCount}H", stream))
|
||||||
index, = unpackStream("<H", stream)
|
|
||||||
self.indices.append(index)
|
|
||||||
|
|
||||||
# Padding
|
# Padding
|
||||||
padding = calculatePadding(indexCount*2) # Each index is 2 bytes
|
padding = calculatePadding(self.indexCount*2) # Each index is 2 bytes
|
||||||
stream.read(padding)
|
stream.read(padding)
|
||||||
|
|
||||||
print(f"[A3DSubmesh indices: {len(self.indices)} faces: {len(self.faces)} smoothing groups: {len(self.smoothingGroups)} materialID: {self.materialID}]")
|
print(f"[A3DSubmesh indices: {len(self.indices)} smoothing groups: {len(self.smoothingGroups)} materialID: {self.materialID}]")
|
||||||
|
|
||||||
class A3DTransform:
|
class A3DTransform:
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
@@ -183,6 +182,8 @@ class A3DObject:
|
|||||||
self.transformID = None
|
self.transformID = None
|
||||||
self.materialIDs = []
|
self.materialIDs = []
|
||||||
|
|
||||||
|
self.materialCount = 0
|
||||||
|
|
||||||
def read2(self, stream):
|
def read2(self, stream):
|
||||||
self.name = readNullTerminatedString(stream)
|
self.name = readNullTerminatedString(stream)
|
||||||
self.meshID, self.transformID = unpackStream("<2I", stream)
|
self.meshID, self.transformID = unpackStream("<2I", stream)
|
||||||
@@ -190,10 +191,10 @@ class A3DObject:
|
|||||||
print(f"[A3DObject name: {self.name} meshID: {self.meshID} transformID: {self.transformID} materialIDs: {len(self.materialIDs)}]")
|
print(f"[A3DObject name: {self.name} meshID: {self.meshID} transformID: {self.transformID} materialIDs: {len(self.materialIDs)}]")
|
||||||
|
|
||||||
def read3(self, stream):
|
def read3(self, stream):
|
||||||
self.meshID, self.transformID, materialCount = unpackStream("<3I", stream)
|
self.meshID, self.transformID, self.materialCount = unpackStream("<3I", stream)
|
||||||
|
|
||||||
# Read material IDs
|
# Read material IDs
|
||||||
for _ in range(materialCount):
|
for _ in range(self.materialCount):
|
||||||
materialID, = unpackStream("<I", stream)
|
materialID, = unpackStream("<I", stream)
|
||||||
self.materialIDs.append(materialID)
|
self.materialIDs.append(materialID)
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user