Ynv polygon properties editing

This commit is contained in:
dexyfex
2018-03-10 04:58:44 +11:00
Unverified
parent 68273e7dca
commit ab64a82791
13 changed files with 1545 additions and 115 deletions
@@ -63,7 +63,7 @@ namespace CodeWalker.GameFiles
{
//direct load from a raw, compressed ynd file (openIV-compatible format)
RpfFile.LoadResourceFile(this, data, 2);
RpfFile.LoadResourceFile(this, data, 1);
Loaded = true;
LoadQueued = true;
+180 -41
View File
@@ -17,6 +17,7 @@ namespace CodeWalker.GameFiles
public List<YnvPoly> Polys { get; set; }
public EditorVertex[] PathVertices { get; set; }
public EditorVertex[] TriangleVerts { get; set; }
public Vector4[] NodePositions { get; set; }
@@ -33,7 +34,13 @@ namespace CodeWalker.GameFiles
{
return (int)(Nav?.AreaID ?? 0);
}
set
{
if (Nav != null) Nav.AreaID = (uint)value;
}
}
public int CellX { get { return AreaID % 100; } set { AreaID = (CellY * 100) + value; } }
public int CellY { get { return AreaID / 100; } set { AreaID = (value * 100) + CellX; } }
@@ -45,6 +52,15 @@ namespace CodeWalker.GameFiles
{
}
public void Load(byte[] data)
{
//direct load from a raw, compressed ynv file (openIV-compatible format)
RpfFile.LoadResourceFile(this, data, 2);
Loaded = true;
}
public void Load(byte[] data, RpfFileEntry entry)
{
Name = entry.Name;
@@ -135,8 +151,68 @@ namespace CodeWalker.GameFiles
}
public byte[] Save()
{
BuildStructs();
byte[] data = ResourceBuilder.Build(Nav, 2); //ynv is version 2...
return data;
}
public void BuildStructs()
{
Vector3 posoffset = Nav.SectorTree?.AABBMin.XYZ() ?? Vector3.Zero;
Vector3 aabbsize = Nav.AABBSize;
Vector3 aabbsizeinv = 1.0f / aabbsize;
var vertlist = new List<NavMeshVertex>();
if (Vertices != null)
{
for (int i = 0; i < Vertices.Count; i++)
{
var ov = (Vertices[i] - posoffset) * aabbsizeinv;
vertlist.Add(NavMeshVertex.Create(ov));
}
}
if (Nav.Vertices == null)
{
Nav.Vertices = new NavMeshList<NavMeshVertex>();
Nav.Vertices.VFT = 1080158456;
}
Nav.Vertices.RebuildList(vertlist);
if (Nav.Indices == null)
{
Nav.Indices = new NavMeshList<ushort>();
Nav.Indices.VFT = 1080158424;
}
Nav.Indices.RebuildList(Indices);
var polylist = new List<NavMeshPoly>();
if (Polys != null)
{
for (int i = 0; i < Polys.Count; i++)
{
polylist.Add(Polys[i].RawData);
}
}
if (Nav.Polys == null)
{
Nav.Polys = new NavMeshList<NavMeshPoly>();
Nav.Polys.VFT = 1080158408;
}
Nav.Polys.RebuildList(polylist);
if (Nav.AdjPolys == null)
{
Nav.AdjPolys = new NavMeshList<NavMeshAdjPoly>();
Nav.AdjPolys.VFT = 1080158440;
}
//Nav.AdjPolys.RebuildList(...)
}
@@ -175,6 +251,62 @@ namespace CodeWalker.GameFiles
np[i] = new Vector4(posoffset + pv * aabbsize, 1.0f);
}
NodePositions = np;
int lcnt = Nav.PortalLinks?.Length ?? 0;
if (lcnt <= 0)
{
PathVertices = null;
return;
}
//var lv = new EditorVertex[lcnt];
//for (int i = 0; i < lcnt; i++)
//{
// var pl = Nav.PortalLinks[i];
// if (pl >= np.Length) lv[i] = new EditorVertex();
// else
// {
// lv[i].Position = np[pl].XYZ();
// lv[i].Colour = 0xFF0000FF;
// }
//}
//PathVertices = lv;
EditorVertex v = new EditorVertex();
v.Colour = 0xFF0000FF;
var lv = new List<EditorVertex>();
//int cind = 0;
var plinks = Nav.PortalLinks;
for (int i = 0; i < cnt; i++)
{
var portal = Nav.Portals[i];
//var plcnt = 2;
v.Position = posoffset + portal.Position1.ToVector3() * aabbsize;
lv.Add(v);
v.Position = posoffset + portal.Position2.ToVector3() * aabbsize;
lv.Add(v);
//var plcnt = portal.LinkCount;
//if (plcnt < 2) continue;
//var plink = (cind < plinks.Length) ? plinks[cind] : 0xFFFF;
//var ppos = (plink < np.Length) ? np[plink].XYZ() : Vector3.Zero;
//for (int pl = 1; pl < plcnt; pl++)
//{
// var ind2 = cind + pl;
// var plink2 = (ind2 < plinks.Length) ? plinks[ind2] : 0xFFFF;
// var ppos2 = (plink2 < np.Length) ? np[plink2].XYZ() : Vector3.Zero;
// v.Position = ppos; lv.Add(v);
// v.Position = ppos2; lv.Add(v);
//}
//cind += plcnt;
}
PathVertices = lv.ToArray();
}
public void UpdateTriangleVertices()
@@ -259,7 +391,7 @@ namespace CodeWalker.GameFiles
public EditorVertex[] GetPathVertices()
{
return null;
return PathVertices;
}
public EditorVertex[] GetTriangleVertices()
{
@@ -280,46 +412,52 @@ namespace CodeWalker.GameFiles
public YnvFile Ynv { get; set; }
public NavMeshPoly RawData { get { return _RawData; } set { _RawData = value; } }
public ushort AreaID { get { return _RawData.AreaID; } }
public bool B00_AvoidUnk { get { return (_RawData.Unknown_00h & 1) > 0; } }
public bool B01_AvoidUnk { get { return (_RawData.Unknown_00h & 2) > 0; } }
public bool B02_IsFootpath { get { return (_RawData.Unknown_00h & 4) > 0; } }
public bool B03_IsUnderground { get { return (_RawData.Unknown_00h & 8) > 0; } }
//public bool B04_Unused { get { return (_RawData.Unknown_00h & 16) > 0; } }
//public bool B05_Unused { get { return (_RawData.Unknown_00h & 32) > 0; } }
public bool B06_SteepSlope { get { return (_RawData.Unknown_00h & 64) > 0; } }
public bool B07_IsWater { get { return (_RawData.Unknown_00h & 128) > 0; } }
public bool B08_UndergroundUnk1 { get { return (_RawData.Unknown_24h.Value & 1) > 0; } }
public bool B09_UndergroundUnk2 { get { return (_RawData.Unknown_24h.Value & 2) > 0; } }
public bool B10_UndergroundUnk3 { get { return (_RawData.Unknown_24h.Value & 4) > 0; } }
public bool B11_UndergroundUnk4 { get { return (_RawData.Unknown_24h.Value & 8) > 0; } }
//public bool B12_Unused { get { return (_RawData.Unknown_24h.Value & 16) > 0; } }
public bool B13_HasPathNode { get { return (_RawData.Unknown_24h.Value & 32) > 0; } }
public bool B14_IsInterior { get { return (_RawData.Unknown_24h.Value & 64) > 0; } }
public bool B15_InteractionUnk { get { return (_RawData.Unknown_24h.Value & 128) > 0; } }
//public bool B16_Unused { get { return (_RawData.Unknown_24h.Value & 256) > 0; } }
public bool B17_IsFlatGround { get { return (_RawData.Unknown_24h.Value & 512) > 0; } }
public bool B18_IsRoad { get { return (_RawData.Unknown_24h.Value & 1024) > 0; } }
public bool B19_IsCellEdge { get { return (_RawData.Unknown_24h.Value & 2048) > 0; } }
public bool B20_IsTrainTrack { get { return (_RawData.Unknown_24h.Value & 4096) > 0; } }
public bool B21_IsShallowWater { get { return (_RawData.Unknown_24h.Value & 8192) > 0; } }
public bool B22_FootpathUnk1 { get { return (_RawData.Unknown_24h.Value & 16384) > 0; } }
public bool B23_FootpathUnk2 { get { return (_RawData.Unknown_24h.Value & 32768) > 0; } }
public bool B24_FootpathMall { get { return (_RawData.Unknown_24h.Value & 65536) > 0; } }
public bool B25_SlopeSouth { get { return (_RawData.Unknown_28h.Value & 65536) > 0; } }
public bool B26_SlopeSouthEast { get { return (_RawData.Unknown_28h.Value & 131072) > 0; } }
public bool B27_SlopeEast { get { return (_RawData.Unknown_28h.Value & 262144) > 0; } }
public bool B28_SlopeNorthEast { get { return (_RawData.Unknown_28h.Value & 524288) > 0; } }
public bool B29_SlopeNorth { get { return (_RawData.Unknown_28h.Value & 1048576) > 0; } }
public bool B30_SlopeNorthWest { get { return (_RawData.Unknown_28h.Value & 2097152) > 0; } }
public bool B31_SlopeWest { get { return (_RawData.Unknown_28h.Value & 4194304) > 0; } }
public bool B32_SlopeSouthWest { get { return (_RawData.Unknown_28h.Value & 8388608) > 0; } }
public bool B33_PortalUnk1 { get { return (_RawData.PartUnk2 & 1) > 0; } }
public bool B34_PortalUnk2 { get { return (_RawData.PartUnk2 & 2) > 0; } }
public bool B35_PortalUnk3 { get { return (_RawData.PartUnk2 & 4) > 0; } }
public bool B36_PortalUnk4 { get { return (_RawData.PartUnk2 & 8) > 0; } }
public byte HeuristicXUnk { get { return (byte)_RawData.Unknown_28h_8a; } }
public byte HeuristicYUnk { get { return (byte)_RawData.Unknown_28h_8b; } }
public ushort AreaID { get { return _RawData.AreaID; } set { _RawData.AreaID = value; } }
public ushort PartID { get { return _RawData.PartID; } set { _RawData.PartID = value; } }
public ushort PortalID { get { return _RawData.PortalID; } set { _RawData.PortalID = value; } }
public byte Flags1 { get { return (byte)(_RawData.Unknown_00h & 0xFF); } set { _RawData.Unknown_00h = (ushort)((_RawData.Unknown_00h & 0xFF00) | (value & 0xFF)); } }
public byte Flags2 { get { return (byte)((_RawData.Unknown_24h.Value >> 0) & 0xFF); } set { _RawData.Unknown_24h = ((_RawData.Unknown_24h.Value & 0xFFFFFF00u) | ((value & 0xFFu) << 0)); } }
public byte Flags3 { get { return (byte)((_RawData.Unknown_24h.Value >> 9) & 0xFF); } set { _RawData.Unknown_24h = ((_RawData.Unknown_24h.Value & 0xFFFE01FFu) | ((value & 0xFFu) << 9)); } }
public byte Flags4 { get { return (byte)((_RawData.Unknown_28h.Value >> 16) & 0xFF); } set { _RawData.Unknown_28h = ((_RawData.Unknown_28h.Value & 0x0000FFFFu) | ((value & 0xFFu) << 16)); } }
public bool B00_AvoidUnk { get { return (_RawData.Unknown_00h & 1) > 0; } set { _RawData.Unknown_00h = (ushort)BitUtil.UpdateBit(_RawData.Unknown_00h, 0, value); } }
public bool B01_AvoidUnk { get { return (_RawData.Unknown_00h & 2) > 0; } set { _RawData.Unknown_00h = (ushort)BitUtil.UpdateBit(_RawData.Unknown_00h, 1, value); } }
public bool B02_IsFootpath { get { return (_RawData.Unknown_00h & 4) > 0; } set { _RawData.Unknown_00h = (ushort)BitUtil.UpdateBit(_RawData.Unknown_00h, 2, value); } }
public bool B03_IsUnderground { get { return (_RawData.Unknown_00h & 8) > 0; } set { _RawData.Unknown_00h = (ushort)BitUtil.UpdateBit(_RawData.Unknown_00h, 3, value); } }
//public bool B04_Unused { get { return (_RawData.Unknown_00h & 16) > 0; } set { _RawData.Unknown_00h = (ushort)BitUtil.UpdateBit(_RawData.Unknown_00h, 4, value); } }
//public bool B05_Unused { get { return (_RawData.Unknown_00h & 32) > 0; } set { _RawData.Unknown_00h = (ushort)BitUtil.UpdateBit(_RawData.Unknown_00h, 5, value); } }
public bool B06_SteepSlope { get { return (_RawData.Unknown_00h & 64) > 0; } set { _RawData.Unknown_00h = (ushort)BitUtil.UpdateBit(_RawData.Unknown_00h, 6, value); } }
public bool B07_IsWater { get { return (_RawData.Unknown_00h & 128) > 0; } set { _RawData.Unknown_00h = (ushort)BitUtil.UpdateBit(_RawData.Unknown_00h, 7, value); } }
public bool B08_UndergroundUnk0 { get { return (_RawData.Unknown_24h.Value & 1) > 0; } set { _RawData.Unknown_24h = BitUtil.UpdateBit(_RawData.Unknown_24h.Value, 0, value); } }
public bool B09_UndergroundUnk1 { get { return (_RawData.Unknown_24h.Value & 2) > 0; } set { _RawData.Unknown_24h = BitUtil.UpdateBit(_RawData.Unknown_24h.Value, 1, value); } }
public bool B10_UndergroundUnk2 { get { return (_RawData.Unknown_24h.Value & 4) > 0; } set { _RawData.Unknown_24h = BitUtil.UpdateBit(_RawData.Unknown_24h.Value, 2, value); } }
public bool B11_UndergroundUnk3 { get { return (_RawData.Unknown_24h.Value & 8) > 0; } set { _RawData.Unknown_24h = BitUtil.UpdateBit(_RawData.Unknown_24h.Value, 3, value); } }
//public bool B12_Unused { get { return (_RawData.Unknown_24h.Value & 16) > 0; } set { _RawData.Unknown_24h = BitUtil.UpdateBit(_RawData.Unknown_24h.Value, 4, value); } }
public bool B13_HasPathNode { get { return (_RawData.Unknown_24h.Value & 32) > 0; } set { _RawData.Unknown_24h = BitUtil.UpdateBit(_RawData.Unknown_24h.Value, 5, value); } }
public bool B14_IsInterior { get { return (_RawData.Unknown_24h.Value & 64) > 0; } set { _RawData.Unknown_24h = BitUtil.UpdateBit(_RawData.Unknown_24h.Value, 6, value); } }
public bool B15_InteractionUnk { get { return (_RawData.Unknown_24h.Value & 128) > 0; } set { _RawData.Unknown_24h = BitUtil.UpdateBit(_RawData.Unknown_24h.Value, 7, value); } }
//public bool B16_Unused { get { return (_RawData.Unknown_24h.Value & 256) > 0; } set { _RawData.Unknown_24h = BitUtil.UpdateBit(_RawData.Unknown_24h.Value, 8, value); } }
public bool B17_IsFlatGround { get { return (_RawData.Unknown_24h.Value & 512) > 0; } set { _RawData.Unknown_24h = BitUtil.UpdateBit(_RawData.Unknown_24h.Value, 9, value); } }
public bool B18_IsRoad { get { return (_RawData.Unknown_24h.Value & 1024) > 0; } set { _RawData.Unknown_24h = BitUtil.UpdateBit(_RawData.Unknown_24h.Value, 10, value); } }
public bool B19_IsCellEdge { get { return (_RawData.Unknown_24h.Value & 2048) > 0; } set { _RawData.Unknown_24h = BitUtil.UpdateBit(_RawData.Unknown_24h.Value, 11, value); } }
public bool B20_IsTrainTrack { get { return (_RawData.Unknown_24h.Value & 4096) > 0; } set { _RawData.Unknown_24h = BitUtil.UpdateBit(_RawData.Unknown_24h.Value, 12, value); } }
public bool B21_IsShallowWater { get { return (_RawData.Unknown_24h.Value & 8192) > 0; } set { _RawData.Unknown_24h = BitUtil.UpdateBit(_RawData.Unknown_24h.Value, 13, value); } }
public bool B22_FootpathUnk1 { get { return (_RawData.Unknown_24h.Value & 16384) > 0; } set { _RawData.Unknown_24h = BitUtil.UpdateBit(_RawData.Unknown_24h.Value, 14, value); } }
public bool B23_FootpathUnk2 { get { return (_RawData.Unknown_24h.Value & 32768) > 0; } set { _RawData.Unknown_24h = BitUtil.UpdateBit(_RawData.Unknown_24h.Value, 15, value); } }
public bool B24_FootpathMall { get { return (_RawData.Unknown_24h.Value & 65536) > 0; } set { _RawData.Unknown_24h = BitUtil.UpdateBit(_RawData.Unknown_24h.Value, 16, value); } }
public bool B25_SlopeSouth { get { return (_RawData.Unknown_28h.Value & 65536) > 0; } set { _RawData.Unknown_28h = BitUtil.UpdateBit(_RawData.Unknown_28h.Value, 16, value); } }
public bool B26_SlopeSouthEast { get { return (_RawData.Unknown_28h.Value & 131072) > 0; } set { _RawData.Unknown_28h = BitUtil.UpdateBit(_RawData.Unknown_28h.Value, 17, value); } }
public bool B27_SlopeEast { get { return (_RawData.Unknown_28h.Value & 262144) > 0; } set { _RawData.Unknown_28h = BitUtil.UpdateBit(_RawData.Unknown_28h.Value, 18, value); } }
public bool B28_SlopeNorthEast { get { return (_RawData.Unknown_28h.Value & 524288) > 0; } set { _RawData.Unknown_28h = BitUtil.UpdateBit(_RawData.Unknown_28h.Value, 19, value); } }
public bool B29_SlopeNorth { get { return (_RawData.Unknown_28h.Value & 1048576) > 0; } set { _RawData.Unknown_28h = BitUtil.UpdateBit(_RawData.Unknown_28h.Value, 20, value); } }
public bool B30_SlopeNorthWest { get { return (_RawData.Unknown_28h.Value & 2097152) > 0; } set { _RawData.Unknown_28h = BitUtil.UpdateBit(_RawData.Unknown_28h.Value, 21, value); } }
public bool B31_SlopeWest { get { return (_RawData.Unknown_28h.Value & 4194304) > 0; } set { _RawData.Unknown_28h = BitUtil.UpdateBit(_RawData.Unknown_28h.Value, 22, value); } }
public bool B32_SlopeSouthWest { get { return (_RawData.Unknown_28h.Value & 8388608) > 0; } set { _RawData.Unknown_28h = BitUtil.UpdateBit(_RawData.Unknown_28h.Value, 23, value); } }
//public bool B33_PortalUnk1 { get { return (_RawData.PartUnk2 & 1) > 0; } }
//public bool B34_PortalUnk2 { get { return (_RawData.PartUnk2 & 2) > 0; } }
//public bool B35_PortalUnk3 { get { return (_RawData.PartUnk2 & 4) > 0; } }
//public bool B36_PortalUnk4 { get { return (_RawData.PartUnk2 & 8) > 0; } }
public byte UnkX { get { return _RawData.Unknown_28h_8a; } set { _RawData.Unknown_28h_8a = value; } }
public byte UnkY { get { return _RawData.Unknown_28h_8b; } set { _RawData.Unknown_28h_8b = value; } }
public Vector3 Position { get; set; }
@@ -346,6 +484,7 @@ namespace CodeWalker.GameFiles
////if ((u0 & 32) > 0) colour.Green += 1.0f;//not used?
if ((u0 & 64) > 0) colour.Red += 0.25f; //steep slope
if ((u0 & 128) > 0) colour.Blue += 0.25f; //water
//if (u0 >= 256) colour.Green += 1.0f;//other bits unused...
var u2 = _RawData.Unknown_24h.Value;
//colour.Green = (u2 & 15) / 15.0f; //maybe underground amount..?
+104 -15
View File
@@ -287,6 +287,42 @@ namespace CodeWalker.GameFiles
}
return vals;
}
set
{
Count = (uint)value.Length;
v00 = (Count > 0) ? value[0] : 0;
v01 = (Count > 1) ? value[1] : 0;
v02 = (Count > 2) ? value[2] : 0;
v03 = (Count > 3) ? value[3] : 0;
v04 = (Count > 4) ? value[4] : 0;
v05 = (Count > 5) ? value[5] : 0;
v06 = (Count > 6) ? value[6] : 0;
v07 = (Count > 7) ? value[7] : 0;
v08 = (Count > 8) ? value[8] : 0;
v09 = (Count > 9) ? value[9] : 0;
v10 = (Count > 10) ? value[10] : 0;
v11 = (Count > 11) ? value[11] : 0;
v12 = (Count > 12) ? value[12] : 0;
v13 = (Count > 13) ? value[13] : 0;
v14 = (Count > 14) ? value[14] : 0;
v15 = (Count > 15) ? value[15] : 0;
v16 = (Count > 16) ? value[16] : 0;
v17 = (Count > 17) ? value[17] : 0;
v18 = (Count > 18) ? value[18] : 0;
v19 = (Count > 19) ? value[19] : 0;
v20 = (Count > 20) ? value[20] : 0;
v21 = (Count > 21) ? value[21] : 0;
v22 = (Count > 22) ? value[22] : 0;
v23 = (Count > 23) ? value[23] : 0;
v24 = (Count > 24) ? value[24] : 0;
v25 = (Count > 25) ? value[25] : 0;
v26 = (Count > 26) ? value[26] : 0;
v27 = (Count > 27) ? value[27] : 0;
v28 = (Count > 28) ? value[28] : 0;
v29 = (Count > 29) ? value[29] : 0;
v30 = (Count > 30) ? value[30] : 0;
v31 = (Count > 31) ? value[31] : 0;
}
}
@@ -319,7 +355,8 @@ namespace CodeWalker.GameFiles
public uint[] ListOffsets { get; set; }
private ResourceSystemStructBlock<uint> ListOffsetsBlock = null;
public int ItemSize { get { return System.Runtime.InteropServices.Marshal.SizeOf<T>(); } }
//public int BytesPerPart { get; private set; }
public override void Read(ResourceDataReader reader, params object[] parameters)
{
@@ -337,6 +374,11 @@ namespace CodeWalker.GameFiles
ListParts = reader.ReadBlockAt<ResourceSimpleArray<NavMeshListPart<T>>>(ListPartsPointer, ListPartsCount);
ListOffsets = reader.ReadUintsAt(ListOffsetsPointer, ListPartsCount);
//if (ListParts.Count > 0)
//{
// BytesPerPart = (int)ListParts[0].Count * ItemSize;
//}
}
public override void Write(ResourceDataWriter writer, params object[] parameters)
@@ -392,6 +434,40 @@ namespace CodeWalker.GameFiles
}
public void RebuildList(List<T> items)
{
//max bytes per part: 16384
int maxpartbytes = 16384; //0x4000
int itembytes = ItemSize;
int itemsperpart = maxpartbytes / itembytes;
int currentitem = 0;
var parts = new ResourceSimpleArray<NavMeshListPart<T>>();
var partitems = new List<T>();
var offsets = new List<uint>();
while (currentitem < items.Count)
{
partitems.Clear();
int lastitem = currentitem + itemsperpart;
if (lastitem > items.Count) lastitem = items.Count;
for (int i = currentitem; i < lastitem; i++)
{
partitems.Add(items[i]);
}
var part = new NavMeshListPart<T>();
part.Items = partitems.ToArray();
part.Unknown_0Ch = 0;
parts.Add(part);
offsets.Add((uint)currentitem);
currentitem = lastitem;
}
ListParts = parts;
ListOffsets = offsets.ToArray();
}
public override string ToString()
{
@@ -478,6 +554,13 @@ namespace CodeWalker.GameFiles
Z = (ushort)(v.Z * usmax);
}
public static NavMeshVertex Create(Vector3 v)
{
var nmv = new NavMeshVertex();
nmv.FromVector3(v);
return nmv;
}
public override string ToString()
{
return X.ToString() + ", " + Y.ToString() + ", " + Z.ToString();
@@ -514,7 +597,7 @@ namespace CodeWalker.GameFiles
public override string ToString()
{
return Unknown_0h.Bin + " | " + Unknown_4h.Bin + " | " +
return //Unknown_0h.Bin + " | " + Unknown_4h.Bin + " | " +
Unknown_0h.ToString() + " | " + Unknown_4h.ToString();
}
}
@@ -565,13 +648,13 @@ namespace CodeWalker.GameFiles
public int IndexCount { get { return (IndexFlags >> 5); } }
//public int PartUnk1 { get { return (PartFlags >> 0) & 0xF; } } //always 0
public int PartID { get { return (PartFlags >> 4) & 0xFF; } }
public int PartUnk2 { get { return (PartFlags >> 12) & 0xF; } }
public ushort PartID { get { return (ushort)((PartFlags >> 4) & 0xFF); } set { PartFlags = (ushort)((PartFlags & 0xF00F) | ((value & 0xFF) << 4)); } }
public byte PartUnk2 { get { return (byte)((PartFlags >> 12) & 0xF); } set { PartFlags = (ushort)((PartFlags & 0x0FFF) | ((value & 0xF) << 12)); } }
public uint Unknown_28h_16 { get { return ((Unknown_28h.Value & 65535)); } }
public uint Unknown_28h_8a { get { return ((Unknown_28h.Value >> 0) & 255); } }
public uint Unknown_28h_8b { get { return ((Unknown_28h.Value >> 8) & 255); } }
public ushort Unknown_28h_16 { get { return (ushort)((Unknown_28h.Value & 0xFFFF)); } set { Unknown_28h = (Unknown_28h.Value & 0xFFFF0000) | (value & 0xFFFFu); } }
public byte Unknown_28h_8a { get { return (byte)((Unknown_28h.Value >> 0) & 0xFF); } set { Unknown_28h = (Unknown_28h.Value & 0xFFFFFF00) | ((value & 0xFFu)<<0); } }
public byte Unknown_28h_8b { get { return (byte)((Unknown_28h.Value >> 8) & 0xFF); } set { Unknown_28h = (Unknown_28h.Value & 0xFFFF00FF) | ((value & 0xFFu)<<8); } }
public override string ToString()
@@ -686,7 +769,7 @@ namespace CodeWalker.GameFiles
get { return 32; }
}
public uint UnkOffset { get; set; }
public uint UnkDataStartID { get; set; }
public uint Unused_04h { get; set; } // 0x00000000
public ulong PolyIDsPointer { get; set; }
public ulong UnkDataPointer { get; set; }
@@ -702,7 +785,7 @@ namespace CodeWalker.GameFiles
public override void Read(ResourceDataReader reader, params object[] parameters)
{
UnkOffset = reader.ReadUInt32();
UnkDataStartID = reader.ReadUInt32();
Unused_04h = reader.ReadUInt32();
PolyIDsPointer = reader.ReadUInt64();
UnkDataPointer = reader.ReadUInt64();
@@ -723,7 +806,7 @@ namespace CodeWalker.GameFiles
UnkDataCount = (ushort)(UnkData?.Length ?? 0);
writer.Write(UnkOffset);
writer.Write(UnkDataStartID);
writer.Write(Unused_04h);
writer.Write(PolyIDsPointer);
writer.Write(UnkDataPointer);
@@ -753,7 +836,7 @@ namespace CodeWalker.GameFiles
public override string ToString()
{
return "(Polys: " + PolyIDsCount.ToString() + ", UnkOffset: " + UnkOffset.ToString() + ", UnkCount: " + UnkDataCount.ToString() + ")";
return "(Polys: " + PolyIDsCount.ToString() + ", UnkOffset: " + UnkDataStartID.ToString() + ", UnkCount: " + UnkDataCount.ToString() + ")";
}
}
@@ -783,17 +866,22 @@ namespace CodeWalker.GameFiles
public ushort Unknown_16h { get; set; }
public ushort Unknown_18h { get; set; }
public ushort Unknown_1Ah { get; set; }
//public NavMeshAABB AABB1 { get; set; }
//public NavMeshAABB AABB2 { get; set; }
//public NavMeshAABB AABB { get; set; }
public uint Type1 { get { return Unknown_00h & 0xFF; } }
public uint Type2 { get { return (Unknown_00h >> 8) & 0xF; } }
public uint Type3 { get { return (Unknown_00h >> 12) & 0xF; } }
public uint Type4 { get { return (Unknown_00h >> 16) & 0xFFFF; } }
public override string ToString()
{
return Unknown_00h.ToString() + ", " +
return //Unknown_00h.ToString() + ", " + Unknown_01h.ToString() + ", " + Unknown_02h.ToString() + ", " +
Type1.ToString() + ", " + Type2.ToString() + ", " + Type3.ToString() + ", " + Type4.ToString() + ", " +
Position1.ToString() + ", " + Position2.ToString() + ", " +
Unknown_10h.ToString() + ", " + Unknown_12h.ToString() + ", " +
Unknown_14h.ToString() + ", " + Unknown_16h.ToString() + ", " +
Unknown_18h.ToString() + ", " + Unknown_1Ah.ToString();
//AABB1.ToString() + ", " + AABB2.ToString();
//AABB.ToString();
}
}
@@ -802,6 +890,7 @@ namespace CodeWalker.GameFiles
[Flags] public enum NavMeshFlags : uint
{
None = 0,
Vertices = 1,
Portals = 2,
Vehicle = 4,