public byte[] ThisToArray(uint pccExportDataOffset, ME2PCCObject pcc)
{
MemoryStream buffer = new MemoryStream();
buffer.Write(headerData, 0, headerData.Length);
if (properties.ContainsKey("LODGroup"))
{
properties["LODGroup"].Value.StringValue = "TEXTUREGROUP_LightAndShadowMap";
properties["LODGroup"].Value.String2 = pcc.Names[0];
}
else
{
buffer.WriteValueS64(pcc.AddName("LODGroup"));
buffer.WriteValueS64(pcc.AddName("ByteProperty"));
buffer.WriteValueS64(8);
buffer.WriteValueS64(pcc.AddName("TEXTUREGROUP_LightAndShadowMap"));
}
int count = 0;
foreach (KeyValuePair<string, SaltPropertyReader.Property> kvp in properties)
{
SaltPropertyReader.Property prop = kvp.Value;
if (prop.Name == "UnpackMin")
{
for (int j = 0; j < UnpackNum; j++)
{
buffer.WriteValueS64(pcc.AddName(prop.Name));
buffer.WriteValueS64(pcc.AddName(prop.TypeVal.ToString()));
buffer.WriteValueS32(prop.Size);
buffer.WriteValueS32(j);
buffer.WriteValueF32(prop.Value.FloatValue, Endian.Little);
}
continue;
}
buffer.WriteValueS64(pcc.AddName(prop.Name));
if (prop.Name == "None")
{
for (int j = 0; j < 12; j++)
buffer.WriteByte(0);
}
else
{
buffer.WriteValueS64(pcc.AddName(prop.TypeVal.ToString()));
buffer.WriteValueS64(prop.Size);
switch (prop.TypeVal)
{
case SaltPropertyReader.Type.IntProperty:
buffer.WriteValueS32(prop.Value.IntValue);
break;
case SaltPropertyReader.Type.BoolProperty:
buffer.WriteValueS32(prop.Value.IntValue);
break;
case SaltPropertyReader.Type.NameProperty:
buffer.WriteValueS64(pcc.AddName(prop.Value.StringValue));
// Heff: Modified to handle name references.
//var index = pcc.AddName(prop.Value.StringValue);
//buffer.WriteValueS32(index);
//buffer.WriteValueS32(prop.Value.NameValue.count);
break;
case SaltPropertyReader.Type.StrProperty:
buffer.WriteValueS32(prop.Value.StringValue.Length + 1);
foreach (char c in prop.Value.StringValue)
buffer.WriteByte((byte)c);
buffer.WriteByte(0);
break;
case SaltPropertyReader.Type.StructProperty:
string strVal = prop.Value.StringValue;
if (prop.Name.ToLowerInvariant().Contains("guid"))
strVal = "Guid";
buffer.WriteValueS64(pcc.AddName(strVal));
foreach (SaltPropertyReader.PropertyValue value in prop.Value.Array)
buffer.WriteValueS32(value.IntValue);
break;
case SaltPropertyReader.Type.ByteProperty:
buffer.WriteValueS32(pcc.AddName(prop.Value.StringValue));
buffer.WriteValueS32(pcc.AddName(prop.Value.String2));
break;
case SaltPropertyReader.Type.FloatProperty:
buffer.WriteValueF32(prop.Value.FloatValue, Endian.Little);
break;
default:
throw new FormatException("unknown property");
}
}
}
buffer.WriteValueS32((int)buffer.Position + (int)pccExportDataOffset);
//Remove empty textures
List<ImageInfo> tempList = new List<ImageInfo>();
foreach (ImageInfo imgInfo in privateimgList)
{
if (imgInfo.storageType != storage.empty)
tempList.Add(imgInfo);
}
privateimgList = tempList;
numMipMaps = (uint)privateimgList.Count;
buffer.WriteValueU32(numMipMaps);
foreach (ImageInfo imgInfo in privateimgList)
{
buffer.WriteValueS32((int)imgInfo.storageType);
buffer.WriteValueS32(imgInfo.uncSize);
buffer.WriteValueS32(imgInfo.cprSize);
if (imgInfo.storageType == storage.pccSto)
{
buffer.WriteValueS32((int)(buffer.Position + pccExportDataOffset));
buffer.Write(imageData, imgInfo.offset, imgInfo.uncSize);
}
else
buffer.WriteValueS32(imgInfo.offset);
if (imgInfo.imgSize.width < 4)
buffer.WriteValueU32(4);
else
buffer.WriteValueU32(imgInfo.imgSize.width);
if (imgInfo.imgSize.height < 4)
buffer.WriteValueU32(4);
else
buffer.WriteValueU32(imgInfo.imgSize.height);
}
buffer.WriteBytes(footerData);
return buffer.ToArray();
}