mirror of
https://mirror.ghproxy.com/https://github.com/dexyfex/CodeWalker
synced 2024-11-30 10:52:55 +08:00
BoundGeomOctants reading/writing/padding improvements
This commit is contained in:
parent
b30853b6a3
commit
82338b6a88
@ -947,8 +947,8 @@ namespace CodeWalker.GameFiles
|
|||||||
public float Unknown_ACh { get; set; }
|
public float Unknown_ACh { get; set; }
|
||||||
public ulong VerticesPointer { get; set; }
|
public ulong VerticesPointer { get; set; }
|
||||||
public ulong VertexColoursPointer { get; set; }
|
public ulong VertexColoursPointer { get; set; }
|
||||||
public ulong Unknown1CountsPointer { get; set; }
|
public ulong OctantsPointer { get; set; }
|
||||||
public ulong Unknown1DataPointer { get; set; }
|
public ulong OctantItemsPointer { get; set; }
|
||||||
public uint VerticesCount { get; set; }
|
public uint VerticesCount { get; set; }
|
||||||
public uint PolygonsCount { get; set; }
|
public uint PolygonsCount { get; set; }
|
||||||
public uint Unknown_D8h { get; set; } // 0x00000000
|
public uint Unknown_D8h { get; set; } // 0x00000000
|
||||||
@ -978,8 +978,7 @@ namespace CodeWalker.GameFiles
|
|||||||
public BoundPolygon[] Polygons { get; set; }
|
public BoundPolygon[] Polygons { get; set; }
|
||||||
public Vector3[] Vertices { get; set; }
|
public Vector3[] Vertices { get; set; }
|
||||||
public BoundMaterialColour[] VertexColours { get; set; }//not sure, it seems like colours anyway, see eg. prologue03_10.ybn
|
public BoundMaterialColour[] VertexColours { get; set; }//not sure, it seems like colours anyway, see eg. prologue03_10.ybn
|
||||||
public uint[] Unknown1Counts { get; set; }
|
public BoundGeomOctants Octants { get; set; }
|
||||||
public BoundGeomUnknown1 Unknown1Data { get; set; }
|
|
||||||
public BoundMaterial_s[] Materials { get; set; }
|
public BoundMaterial_s[] Materials { get; set; }
|
||||||
public BoundMaterialColour[] MaterialColours { get; set; }
|
public BoundMaterialColour[] MaterialColours { get; set; }
|
||||||
public byte[] PolygonMaterialIndices { get; set; }
|
public byte[] PolygonMaterialIndices { get; set; }
|
||||||
@ -988,7 +987,6 @@ namespace CodeWalker.GameFiles
|
|||||||
private ResourceSystemDataBlock PolygonsBlock = null;
|
private ResourceSystemDataBlock PolygonsBlock = null;
|
||||||
private ResourceSystemStructBlock<BoundVertex_s> VerticesBlock = null;
|
private ResourceSystemStructBlock<BoundVertex_s> VerticesBlock = null;
|
||||||
private ResourceSystemStructBlock<BoundMaterialColour> VertexColoursBlock = null;
|
private ResourceSystemStructBlock<BoundMaterialColour> VertexColoursBlock = null;
|
||||||
private ResourceSystemStructBlock<uint> Unknown1CountsBlock = null;
|
|
||||||
private ResourceSystemStructBlock<BoundMaterial_s> MaterialsBlock = null;
|
private ResourceSystemStructBlock<BoundMaterial_s> MaterialsBlock = null;
|
||||||
private ResourceSystemStructBlock<BoundMaterialColour> MaterialColoursBlock = null;
|
private ResourceSystemStructBlock<BoundMaterialColour> MaterialColoursBlock = null;
|
||||||
private ResourceSystemStructBlock<byte> PolygonMaterialIndicesBlock = null;
|
private ResourceSystemStructBlock<byte> PolygonMaterialIndicesBlock = null;
|
||||||
@ -1013,8 +1011,8 @@ namespace CodeWalker.GameFiles
|
|||||||
this.Unknown_ACh = reader.ReadSingle();
|
this.Unknown_ACh = reader.ReadSingle();
|
||||||
this.VerticesPointer = reader.ReadUInt64();
|
this.VerticesPointer = reader.ReadUInt64();
|
||||||
this.VertexColoursPointer = reader.ReadUInt64();
|
this.VertexColoursPointer = reader.ReadUInt64();
|
||||||
this.Unknown1CountsPointer = reader.ReadUInt64();
|
this.OctantsPointer = reader.ReadUInt64();
|
||||||
this.Unknown1DataPointer = reader.ReadUInt64();
|
this.OctantItemsPointer = reader.ReadUInt64();
|
||||||
this.VerticesCount = reader.ReadUInt32();
|
this.VerticesCount = reader.ReadUInt32();
|
||||||
this.PolygonsCount = reader.ReadUInt32();
|
this.PolygonsCount = reader.ReadUInt32();
|
||||||
this.Unknown_D8h = reader.ReadUInt32();
|
this.Unknown_D8h = reader.ReadUInt32();
|
||||||
@ -1066,11 +1064,7 @@ namespace CodeWalker.GameFiles
|
|||||||
|
|
||||||
this.VertexColours = reader.ReadStructsAt<BoundMaterialColour>(this.VertexColoursPointer, this.VerticesCount);
|
this.VertexColours = reader.ReadStructsAt<BoundMaterialColour>(this.VertexColoursPointer, this.VerticesCount);
|
||||||
|
|
||||||
this.Unknown1Counts = reader.ReadUintsAt(this.Unknown1CountsPointer, 8);//item counts
|
this.Octants = reader.ReadBlockAt<BoundGeomOctants>(this.OctantsPointer, this.OctantItemsPointer);
|
||||||
if (this.Unknown1Counts != null)
|
|
||||||
{
|
|
||||||
this.Unknown1Data = reader.ReadBlockAt<BoundGeomUnknown1>(this.Unknown1DataPointer, this.Unknown1Counts);
|
|
||||||
}
|
|
||||||
|
|
||||||
this.Materials = reader.ReadStructsAt<BoundMaterial_s>(this.MaterialsPointer, this.MaterialsCount);
|
this.Materials = reader.ReadStructsAt<BoundMaterial_s>(this.MaterialsPointer, this.MaterialsCount);
|
||||||
|
|
||||||
@ -1080,21 +1074,27 @@ namespace CodeWalker.GameFiles
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
if (Vertices2Count != VerticesCount)
|
//if (Vertices2Count != VerticesCount)
|
||||||
{ }//no hit here
|
//{ }//no hit here
|
||||||
if (Unknown_9Ch != 0)
|
//if (Unknown_9Ch != 0)
|
||||||
{ }
|
//{ }
|
||||||
if (Unknown_ACh != 0)
|
//if (Unknown_ACh != 0)
|
||||||
{ }
|
//{ }
|
||||||
|
|
||||||
switch (Unknown_82h)
|
//switch (Unknown_82h)
|
||||||
{
|
//{
|
||||||
case 0:
|
// case 0:
|
||||||
case 1://ybns
|
// case 1://ybns
|
||||||
break;
|
// break;
|
||||||
default://des_.ydr's? some extra data to read..?? is this some extra poly count?
|
// default://des_.ydr's? some extra data to read..?? is this some extra poly count?
|
||||||
break;
|
// break;
|
||||||
}
|
//}
|
||||||
|
|
||||||
|
//if (OctantsPointer != 0)
|
||||||
|
//{
|
||||||
|
// if (OctantItemsPointer != OctantsPointer + 32)
|
||||||
|
// { }//no hit
|
||||||
|
//}
|
||||||
|
|
||||||
}
|
}
|
||||||
public override void Write(ResourceDataWriter writer, params object[] parameters)
|
public override void Write(ResourceDataWriter writer, params object[] parameters)
|
||||||
@ -1106,8 +1106,8 @@ namespace CodeWalker.GameFiles
|
|||||||
this.PolygonsPointer = (ulong)(this.PolygonsBlock != null ? this.PolygonsBlock.FilePosition : 0);
|
this.PolygonsPointer = (ulong)(this.PolygonsBlock != null ? this.PolygonsBlock.FilePosition : 0);
|
||||||
this.VerticesPointer = (ulong)(this.VerticesBlock != null ? this.VerticesBlock.FilePosition : 0);
|
this.VerticesPointer = (ulong)(this.VerticesBlock != null ? this.VerticesBlock.FilePosition : 0);
|
||||||
this.VertexColoursPointer = (ulong)(this.VertexColoursBlock != null ? this.VertexColoursBlock.FilePosition : 0);
|
this.VertexColoursPointer = (ulong)(this.VertexColoursBlock != null ? this.VertexColoursBlock.FilePosition : 0);
|
||||||
this.Unknown1CountsPointer = (ulong)(this.Unknown1CountsBlock != null ? this.Unknown1CountsBlock.FilePosition : 0);
|
this.OctantsPointer = (ulong)(this.Octants != null ? this.Octants.FilePosition : 0);
|
||||||
this.Unknown1DataPointer = (ulong)(this.Unknown1Data != null ? this.Unknown1Data.FilePosition : 0);
|
this.OctantItemsPointer = (OctantsPointer != 0) ? OctantsPointer + 32 : 0;
|
||||||
this.VerticesCount = (uint)(this.VerticesBlock != null ? this.VerticesBlock.ItemCount : 0);
|
this.VerticesCount = (uint)(this.VerticesBlock != null ? this.VerticesBlock.ItemCount : 0);
|
||||||
this.Vertices2Count = this.VerticesCount;
|
this.Vertices2Count = this.VerticesCount;
|
||||||
this.PolygonsCount = (uint)(this.Polygons != null ? this.Polygons.Length : 0);
|
this.PolygonsCount = (uint)(this.Polygons != null ? this.Polygons.Length : 0);
|
||||||
@ -1132,8 +1132,8 @@ namespace CodeWalker.GameFiles
|
|||||||
writer.Write(this.Unknown_ACh);
|
writer.Write(this.Unknown_ACh);
|
||||||
writer.Write(this.VerticesPointer);
|
writer.Write(this.VerticesPointer);
|
||||||
writer.Write(this.VertexColoursPointer);
|
writer.Write(this.VertexColoursPointer);
|
||||||
writer.Write(this.Unknown1CountsPointer);
|
writer.Write(this.OctantsPointer);
|
||||||
writer.Write(this.Unknown1DataPointer);
|
writer.Write(this.OctantItemsPointer);
|
||||||
writer.Write(this.VerticesCount);
|
writer.Write(this.VerticesCount);
|
||||||
writer.Write(this.PolygonsCount);
|
writer.Write(this.PolygonsCount);
|
||||||
writer.Write(this.Unknown_D8h);
|
writer.Write(this.Unknown_D8h);
|
||||||
@ -1190,11 +1190,11 @@ namespace CodeWalker.GameFiles
|
|||||||
{
|
{
|
||||||
YbnXml.WriteCustomItemArray(sb, Polygons, indent, "Polygons");
|
YbnXml.WriteCustomItemArray(sb, Polygons, indent, "Polygons");
|
||||||
}
|
}
|
||||||
if (Unknown1Data != null)
|
if (Octants != null)
|
||||||
{
|
{
|
||||||
YbnXml.OpenTag(sb, indent, "UnkData");
|
YbnXml.OpenTag(sb, indent, "Octants");
|
||||||
Unknown1Data.WriteXml(sb, indent + 1);
|
Octants.WriteXml(sb, indent + 1);
|
||||||
YbnXml.CloseTag(sb, indent, "UnkData");
|
YbnXml.CloseTag(sb, indent, "Octants");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
public override void ReadXml(XmlNode node)
|
public override void ReadXml(XmlNode node)
|
||||||
@ -1233,18 +1233,17 @@ namespace CodeWalker.GameFiles
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
var unode = node.SelectSingleNode("UnkData");
|
var onode = node.SelectSingleNode("Octants");
|
||||||
if (unode != null)
|
if (onode != null)
|
||||||
{
|
{
|
||||||
Unknown1Data = new BoundGeomUnknown1();
|
Octants = new BoundGeomOctants();
|
||||||
Unknown1Data.ReadXml(unode);
|
Octants.ReadXml(onode);
|
||||||
}
|
}
|
||||||
|
|
||||||
BuildMaterials();
|
BuildMaterials();
|
||||||
CalculateQuantum();
|
CalculateQuantum();
|
||||||
UpdateEdgeIndices();
|
UpdateEdgeIndices();
|
||||||
UpdateTriangleAreas();
|
UpdateTriangleAreas();
|
||||||
UpdateUnknown1Counts();
|
|
||||||
|
|
||||||
FileVFT = 1080226408;
|
FileVFT = 1080226408;
|
||||||
}
|
}
|
||||||
@ -1311,14 +1310,9 @@ namespace CodeWalker.GameFiles
|
|||||||
VertexColoursBlock = new ResourceSystemStructBlock<BoundMaterialColour>(VertexColours);
|
VertexColoursBlock = new ResourceSystemStructBlock<BoundMaterialColour>(VertexColours);
|
||||||
list.Add(VertexColoursBlock);
|
list.Add(VertexColoursBlock);
|
||||||
}
|
}
|
||||||
if (Unknown1Counts != null)
|
if (Octants != null)
|
||||||
{
|
{
|
||||||
Unknown1CountsBlock = new ResourceSystemStructBlock<uint>(Unknown1Counts);
|
list.Add(Octants);//this one is already a resource block!
|
||||||
list.Add(Unknown1CountsBlock);
|
|
||||||
}
|
|
||||||
if (Unknown1Data != null)
|
|
||||||
{
|
|
||||||
list.Add(Unknown1Data);//this one is already a resource block!
|
|
||||||
}
|
}
|
||||||
if (Materials != null)
|
if (Materials != null)
|
||||||
{
|
{
|
||||||
@ -1896,18 +1890,6 @@ namespace CodeWalker.GameFiles
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void UpdateUnknown1Counts()
|
|
||||||
{
|
|
||||||
if (Unknown1Data?.Items != null)
|
|
||||||
{
|
|
||||||
Unknown1Counts = new uint[8];
|
|
||||||
for (int i = 0; i < 8; i++)
|
|
||||||
{
|
|
||||||
Unknown1Counts[i] = (i < Unknown1Data.Items.Length) ? (uint)(Unknown1Data.Items[i]?.Length ?? 0) : 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public bool DeletePolygon(BoundPolygon p)
|
public bool DeletePolygon(BoundPolygon p)
|
||||||
{
|
{
|
||||||
if (Polygons != null)
|
if (Polygons != null)
|
||||||
@ -4073,25 +4055,23 @@ namespace CodeWalker.GameFiles
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
[TC(typeof(EXP))] public class BoundGeomUnknown1 : ResourceSystemBlock, IMetaXmlItem
|
[TC(typeof(EXP))] public class BoundGeomOctants : ResourceSystemBlock, IMetaXmlItem
|
||||||
{
|
{
|
||||||
public uint[][] Items { get; private set; }
|
public uint[] Counts { get; set; } = new uint[8];
|
||||||
|
public uint[][] Items { get; private set; } = new uint[8][];
|
||||||
private ResourceSystemStructBlock<uint>[] ItemBlocks = null;
|
|
||||||
|
|
||||||
|
|
||||||
public override long BlockLength
|
public override long BlockLength
|
||||||
{
|
{
|
||||||
get
|
get
|
||||||
{
|
{
|
||||||
return Items != null ? (Items.Length*8) : 0; //main pointer array has 8 items, 8 bytes each
|
long len = 128; // (8*(4 + 8)) + 32
|
||||||
}
|
for (int i = 0; i < 8; i++)
|
||||||
}
|
|
||||||
|
|
||||||
public BoundGeomUnknown1() { }
|
|
||||||
public BoundGeomUnknown1(uint[][] items)
|
|
||||||
{
|
{
|
||||||
Items = items;
|
len += (Counts[i] * 4);
|
||||||
|
}
|
||||||
|
return len;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public override void Read(ResourceDataReader reader, params object[] parameters)
|
public override void Read(ResourceDataReader reader, params object[] parameters)
|
||||||
@ -4099,31 +4079,61 @@ namespace CodeWalker.GameFiles
|
|||||||
if ((parameters?.Length ?? 0) < 1)
|
if ((parameters?.Length ?? 0) < 1)
|
||||||
{ return; } //shouldn't happen!
|
{ return; } //shouldn't happen!
|
||||||
|
|
||||||
var itemcounts = (uint[])parameters[0];
|
ulong ptr = (ulong)parameters[0]; //pointer array pointer
|
||||||
ulong ptr = (ulong)reader.Position; //pointer array pointer
|
|
||||||
|
|
||||||
if (itemcounts != null)
|
for (int i = 0; i < 8; i++)
|
||||||
{
|
{
|
||||||
ulong[] ptrlist = reader.ReadUlongsAt(ptr, (uint)itemcounts.Length);
|
Counts[i] = reader.ReadUInt32();
|
||||||
Items = new uint[itemcounts.Length][];
|
}
|
||||||
for (int i = 0; i < itemcounts.Length; i++)
|
|
||||||
|
ulong[] ptrlist = reader.ReadUlongsAt(ptr, 8);
|
||||||
|
|
||||||
|
//if (ptr != (ulong)reader.Position)
|
||||||
|
//{ }//no hit
|
||||||
|
//ptr += 64;
|
||||||
|
|
||||||
|
for (int i = 0; i < 8; i++)
|
||||||
{
|
{
|
||||||
Items[i] = reader.ReadUintsAt(ptrlist[i], itemcounts[i]);
|
Items[i] = reader.ReadUintsAt(ptrlist[i], Counts[i]);
|
||||||
}
|
|
||||||
|
//if (ptrlist[i] != ptr)
|
||||||
|
//{ ptr = ptrlist[i]; }//no hit
|
||||||
|
//ptr += (Counts[i] * 4);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//reader.Position = (long)ptr;
|
||||||
|
//var b = reader.ReadBytes(32);
|
||||||
|
//for (int i = 0; i < b.Length; i++)
|
||||||
|
//{
|
||||||
|
// if (b[i] != 0)
|
||||||
|
// { }//no hit
|
||||||
|
//}
|
||||||
}
|
}
|
||||||
public override void Write(ResourceDataWriter writer, params object[] parameters)
|
public override void Write(ResourceDataWriter writer, params object[] parameters)
|
||||||
{
|
{
|
||||||
|
var ptr = writer.Position + 96;
|
||||||
//just write the pointer array.
|
for (int i = 0; i < 8; i++)
|
||||||
if (ItemBlocks != null)
|
|
||||||
{
|
{
|
||||||
foreach (var item in ItemBlocks)
|
writer.Write(Counts[i]);
|
||||||
|
}
|
||||||
|
for (int i = 0; i < 8; i++)
|
||||||
{
|
{
|
||||||
writer.Write((ulong)item.FilePosition);
|
writer.Write((ulong)ptr);
|
||||||
|
ptr += (Counts[i] * 4);
|
||||||
|
}
|
||||||
|
for (int i = 0; i < 8; i++)
|
||||||
|
{
|
||||||
|
var items = (i < Items.Length) ? Items[i] : null;
|
||||||
|
if (items == null)
|
||||||
|
{ continue; }
|
||||||
|
var c = Counts[i];
|
||||||
|
for (int n = 0; n < c; n++)
|
||||||
|
{
|
||||||
|
var v = (n < items.Length) ? items[n] : 0;
|
||||||
|
writer.Write(v);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
writer.Write(new byte[32]);
|
||||||
}
|
}
|
||||||
public void WriteXml(StringBuilder sb, int indent)
|
public void WriteXml(StringBuilder sb, int indent)
|
||||||
{
|
{
|
||||||
@ -4168,29 +4178,24 @@ namespace CodeWalker.GameFiles
|
|||||||
collist.Add(rowlist.ToArray());
|
collist.Add(rowlist.ToArray());
|
||||||
}
|
}
|
||||||
Items = collist.ToArray();
|
Items = collist.ToArray();
|
||||||
|
|
||||||
|
UpdateCounts();
|
||||||
}
|
}
|
||||||
|
|
||||||
public override IResourceBlock[] GetReferences()
|
|
||||||
{
|
|
||||||
var list = new List<IResourceBlock>(base.GetReferences());
|
|
||||||
|
|
||||||
var ilist = new List<ResourceSystemStructBlock<uint>>();
|
|
||||||
if (Items != null)
|
|
||||||
{
|
|
||||||
foreach (var item in Items)
|
|
||||||
{
|
|
||||||
var block = new ResourceSystemStructBlock<uint>(item);
|
|
||||||
ilist.Add(block);
|
|
||||||
list.Add(block);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
ItemBlocks = ilist.ToArray();
|
|
||||||
|
|
||||||
return list.ToArray();
|
public void UpdateCounts()
|
||||||
|
{
|
||||||
|
for (int i = 0; i < 8; i++)
|
||||||
|
{
|
||||||
|
Counts[i] = (i < (Items?.Length ?? 0)) ? (uint)(Items[i]?.Length ?? 0) : 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
[Flags] public enum EBoundCompositeFlags : uint
|
[Flags] public enum EBoundCompositeFlags : uint
|
||||||
{
|
{
|
||||||
NONE = 0u,
|
NONE = 0u,
|
||||||
|
Loading…
Reference in New Issue
Block a user