Store array count fields instead of relying on len

This commit is contained in:
Pyogenics
2024-11-25 14:27:24 +00:00
parent 696a65e5a2
commit 643d23d6e7

View File

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