Skip to content

Commit 174f3ed

Browse files
committed
Added support for reading BASIC models with normals = null
1 parent e2c94c0 commit 174f3ed

File tree

1 file changed

+20
-3
lines changed

1 file changed

+20
-3
lines changed

src/SA3D.Modeling/Mesh/Basic/BasicAttach.cs

Lines changed: 20 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -159,7 +159,7 @@ public static BasicAttach Read(EndianStackReader reader, uint address, bool DX,
159159
{
160160
BasicAttach onRead()
161161
{
162-
ILabeledArray<T> readArray<T>(uint arrayOffset, uint countOffset, string genPrefix, bool shortCount, uint elementSize, EndianIOExtensions.ReadValueDelegate<T> read)
162+
ILabeledArray<T> readArray<T>(uint arrayOffset, uint countOffset, string genPrefix, bool shortCount, uint elementSize, EndianIOExtensions.ReadValueDelegate<T> read, bool allowNull = false, T? nullDefault = default)
163163
{
164164
uint itemCount = shortCount
165165
? reader.ReadUShort(address + countOffset)
@@ -177,14 +177,31 @@ ILabeledArray<T> readArray<T>(uint arrayOffset, uint countOffset, string genPref
177177
return new LabeledArray<T>(0);
178178
}
179179

180+
/* Same thing for null arrays. Only happens to normals though, fortunately */
181+
180182
uint itemAddr = reader.ReadPointer(address + arrayOffset);
181-
return reader.ReadLabeledArray(itemAddr, itemCount, elementSize, read, genPrefix, lut);
183+
if(itemAddr == 0 && allowNull)
184+
{
185+
LabeledArray<T> result = new(itemCount);
186+
187+
for(int i = 0; i < itemCount; i++)
188+
{
189+
result[i] = nullDefault!;
190+
}
191+
192+
return result;
193+
}
194+
else
195+
{
196+
return reader.ReadLabeledArray(itemAddr, itemCount, elementSize, read, genPrefix, lut);
197+
}
198+
182199
}
183200

184201
uint meshSize = DX ? BasicMesh.StructSizeDX : BasicMesh.StructSize;
185202

186203
ILabeledArray<Vector3> positions /***/ = readArray(0x00, 0x08, "vertex_", false, 12, /*******************/ (r, p) => r.ReadVector3(p));
187-
ILabeledArray<Vector3> normals /*****/ = readArray(0x04, 0x08, "normal_", false, 12, /*******************/ (r, p) => r.ReadVector3(p));
204+
ILabeledArray<Vector3> normals /*****/ = readArray(0x04, 0x08, "normal_", false, 12, /*******************/ (r, p) => r.ReadVector3(p), true, BufferMesh.DefaultNormal);
188205
ILabeledArray<BasicMesh> meshes /****/ = readArray(0x0C, 0x14, "meshlist_", true, meshSize, /************/ (r, p) => BasicMesh.Read(r, p, lut));
189206
ILabeledArray<BasicMaterial> materials = readArray(0x10, 0x16, "matlist_", true, BasicMaterial.StructSize, (r, p) => BasicMaterial.Read(r, p));
190207

0 commit comments

Comments
 (0)