public CNode(EndianBinaryReaderEx reader, CPSSGFile file) { this.file = file; id = reader.ReadInt32(); int size = reader.ReadInt32(); long end = reader.BaseStream.Position + size; int attributeSize = reader.ReadInt32(); long attributeEnd = reader.BaseStream.Position + attributeSize; // Each attr is at least 8 bytes (id + size), so take a conservative guess attributes = new Dictionary <string, CAttribute>(); CAttribute attr; while (reader.BaseStream.Position < attributeEnd) { attr = new CAttribute(reader, file); attributes.Add(attr.name, attr); } switch (name) { case "BOUNDINGBOX": case "DATA": case "DATABLOCKDATA": case "DATABLOCKBUFFERED": case "INDEXSOURCEDATA": case "INVERSEBINDMATRIX": case "MODIFIERNETWORKINSTANCEUNIQUEMODIFIERINPUT": case "NeAnimPacketData_B1": case "NeAnimPacketData_B4": case "RENDERINTERFACEBOUNDBUFFERED": case "SHADERINPUT": case "TEXTUREIMAGEBLOCKDATA": case "TRANSFORM": isDataNode = true; break; } if (isDataNode) { data = reader.ReadBytes((int)(end - reader.BaseStream.Position)); } else { // Each node at least 12 bytes (id + size + arg size) subNodes = new CNode[(end - reader.BaseStream.Position) / 12]; int nodeCount = 0; while (reader.BaseStream.Position < end) { subNodes[nodeCount] = new CNode(reader, file); nodeCount++; } Array.Resize(ref subNodes, nodeCount); } }
public CNode(EndianBinaryReaderEx reader, CPSSGFile file) { this.file = file; id = reader.ReadInt32(); int size = reader.ReadInt32(); long end = reader.BaseStream.Position + size; int attributeSize = reader.ReadInt32(); long attributeEnd = reader.BaseStream.Position + attributeSize; // Each attr is at least 8 bytes (id + size), so take a conservative guess attributes = new Dictionary<string, CAttribute>(); CAttribute attr; while (reader.BaseStream.Position < attributeEnd) { attr = new CAttribute(reader, file); attributes.Add(attr.name, attr); } switch (name) { case "BOUNDINGBOX": case "DATABLOCKDATA": case "DATABLOCKBUFFERED": case "INDEXSOURCEDATA": case "INVERSEBINDMATRIX": case "MODIFIERNETWORKINSTANCEUNIQUEMODIFIERINPUT": case "RENDERINTERFACEBOUNDBUFFERED": case "SHADERINPUT": case "TEXTUREIMAGEBLOCKDATA": case "TRANSFORM": isDataNode = true; break; } if (isDataNode) { data = reader.ReadBytes((int)(end - reader.BaseStream.Position)); } else { // Each node at least 12 bytes (id + size + arg size) subNodes = new CNode[(end - reader.BaseStream.Position) / 12]; int nodeCount = 0; while (reader.BaseStream.Position < end) { subNodes[nodeCount] = new CNode(reader, file); nodeCount++; } Array.Resize(ref subNodes, nodeCount); } }