mirror of
https://mirror.ghproxy.com/https://github.com/dexyfex/CodeWalker
synced 2026-05-14 11:54:32 +08:00
Ynv polygon properties editing
This commit is contained in:
@@ -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;
|
||||
|
||||
@@ -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..?
|
||||
|
||||
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user