Fix objects parsing #6

Merged
mahalex merged 7 commits from fix-objects-parsing into master 2019-03-03 15:58:34 +00:00
2 changed files with 23 additions and 21 deletions
Showing only changes of commit 262c3a8314 - Show all commits

View File

@ -107,8 +107,8 @@ namespace MatFileHandler
return false;
}
var objectPosition = IndexToObjectId[index];
var objectInfo = subsystemData.ObjectInformation.First(pair => pair.Value.Position == objectPosition).Value;
var objectId = IndexToObjectId[index];
var objectInfo = subsystemData.ObjectInformation[objectId];
var fieldId = objectInfo.FieldLinks[fieldIndex];
output = subsystemData.Data[fieldId];
return true;

View File

@ -51,7 +51,7 @@ namespace MatFileHandler
}
var numberOfObjects = ((offsets[5] - offsets[4]) / 24) - 1;
Dictionary<int, (int, int)> objectClasses = null;
Dictionary<int, (int objectPosition, int loadingOrder, int classId)> objectClasses = null;
using (var stream = new MemoryStream(info, offsets[4], offsets[5] - offsets[4]))
{
using (var reader = new BinaryReader(stream))
@ -60,12 +60,14 @@ namespace MatFileHandler
}
}
Dictionary<int, Dictionary<int, int>> objectToFields = null;
var numberOfObjectPositions = objectClasses.Values.Count(x => x.objectPosition != 0);
Dictionary<int, Dictionary<int, int>> objectPositionsToValues = null;
using (var stream = new MemoryStream(info, offsets[5], offsets[6] - offsets[5]))
{
using (var reader = new BinaryReader(stream))
{
objectToFields = ReadObjectToFieldsMapping(reader, numberOfObjects);
objectPositionsToValues = ReadObjectPositionsToValuesMapping(reader, numberOfObjectPositions);
}
}
@ -74,7 +76,7 @@ namespace MatFileHandler
classIdToName,
fieldNames,
objectClasses,
objectToFields);
objectPositionsToValues);
var allFields = objectInformation.Values.SelectMany(obj => obj.FieldLinks.Values);
var data = new Dictionary<int, IArray>();
@ -107,17 +109,17 @@ namespace MatFileHandler
return array;
}
private static Dictionary<int, (int, int)> ReadObjectClasses(BinaryReader reader, int numberOfObjects)
private static Dictionary<int, (int objectPosition, int loadingOrder, int classId)> ReadObjectClasses(BinaryReader reader, int numberOfObjects)
{
var result = new Dictionary<int, (int, int)>();
var result = new Dictionary<int, (int, int, int)>();
reader.ReadBytes(24);
for (var i = 0; i < numberOfObjects; i++)
{
var classId = reader.ReadInt32();
reader.ReadBytes(12);
var objectPosition = reader.ReadInt32();
var objectId = reader.ReadInt32();
result[objectPosition] = (objectId, classId);
var loadingOrder = reader.ReadInt32();
result[i + 1] = (objectPosition, loadingOrder, classId);
}
return result;
@ -126,23 +128,23 @@ namespace MatFileHandler
private static (Dictionary<int, SubsystemData.ClassInfo>, Dictionary<int, SubsystemData.ObjectInfo>) GatherClassAndObjectInformation(
Dictionary<int, string> classIdToName,
string[] fieldNames,
Dictionary<int, (int, int)> objectClasses,
Dictionary<int, Dictionary<int, int>> objectToFields)
Dictionary<int, (int objectPosition, int loadingOrder, int classId)> objectClasses,
Dictionary<int, Dictionary<int, int>> objectPositionsToValues)
{
var classInfos = new Dictionary<int, SubsystemData.ClassInfo>();
foreach (var classId in classIdToName.Keys)
{
var className = classIdToName[classId];
var fieldIds = new SortedSet<int>();
foreach (var objectPosition in objectToFields.Keys)
foreach (var objectPosition in objectPositionsToValues.Keys)
{
var (_, thisObjectClassId) = objectClasses[objectPosition];
if (thisObjectClassId != classId)
var keyValuePair = objectClasses.First(pair => pair.Value.objectPosition == objectPosition);
if (keyValuePair.Value.classId != classId)
{
continue;
}
foreach (var fieldId in objectToFields[objectPosition].Keys)
foreach (var fieldId in objectPositionsToValues[objectPosition].Keys)
{
fieldIds.Add(fieldId);
}
@ -156,10 +158,10 @@ namespace MatFileHandler
}
var objectInfos = new Dictionary<int, SubsystemData.ObjectInfo>();
foreach (var objectPosition in objectToFields.Keys)
foreach (var objectPosition in objectPositionsToValues.Keys)
{
var (objectId, _) = objectClasses[objectPosition];
objectInfos[objectId] = new SubsystemData.ObjectInfo(objectPosition, objectToFields[objectPosition]);
var keyValuePair = objectClasses.First(pair => pair.Value.objectPosition == objectPosition);
objectInfos[keyValuePair.Key] = new SubsystemData.ObjectInfo(objectPosition, objectPositionsToValues[objectPosition]);
}
return (classInfos, objectInfos);
@ -180,11 +182,11 @@ namespace MatFileHandler
return result;
}
private static Dictionary<int, Dictionary<int, int>> ReadObjectToFieldsMapping(BinaryReader reader, int numberOfObjects)
private static Dictionary<int, Dictionary<int, int>> ReadObjectPositionsToValuesMapping(BinaryReader reader, int numberOfValues)
{
var result = new Dictionary<int, Dictionary<int, int>>();
reader.ReadBytes(8);
for (var objectPosition = 1; objectPosition <= numberOfObjects; objectPosition++)
for (var objectPosition = 1; objectPosition <= numberOfValues; objectPosition++)
{
result[objectPosition] = ReadFieldToFieldDataMapping(reader);
var position = reader.BaseStream.Position;