Nav mesh progress

This commit is contained in:
dexyfex 2018-05-02 00:28:47 +10:00
parent bab6668021
commit b18b1e7672
4 changed files with 64 additions and 38 deletions

View File

@ -115,14 +115,6 @@ namespace CodeWalker.GameFiles
poly.Init(this, polys[i]); poly.Init(this, polys[i]);
poly.Index = i; poly.Index = i;
Polys.Add(poly); Polys.Add(poly);
if (poly.PortalType > 0)
{
if (poly.PortalType != 2) //seems to be what portal links need to understand..
{ }
}
} }
} }
if (Nav.Portals != null) if (Nav.Portals != null)
@ -212,6 +204,7 @@ namespace CodeWalker.GameFiles
var edgelist = new List<NavMeshEdge>(); var edgelist = new List<NavMeshEdge>();
var polylist = new List<NavMeshPoly>(); var polylist = new List<NavMeshPoly>();
var portallist = new List<NavMeshPortal>(); var portallist = new List<NavMeshPortal>();
var portallinks = new List<ushort>();
var vertdict = new Dictionary<Vector3, ushort>(); var vertdict = new Dictionary<Vector3, ushort>();
var blankedgepart1 = new NavMeshEdgePart() { Value = 0x0FFFE1 };//1, -, 1, 0 var blankedgepart1 = new NavMeshEdgePart() { Value = 0x0FFFE1 };//1, -, 1, 0
@ -243,6 +236,12 @@ namespace CodeWalker.GameFiles
edgelist.Add(e); edgelist.Add(e);
} }
poly._RawData.IndexCount = vc; poly._RawData.IndexCount = vc;
poly._RawData.PortalLinkID = (uint)portallinks.Count;//these shouldn't be directly editable!
poly._RawData.PortalLinkCount = (byte)(poly.PortalLinks?.Length ?? 0);
if (poly.PortalLinks != null)
{
portallinks.AddRange(poly.PortalLinks);
}
poly.Index = i;//this should be redundant... poly.Index = i;//this should be redundant...
polylist.Add(poly.RawData); polylist.Add(poly.RawData);
} }
@ -303,7 +302,8 @@ namespace CodeWalker.GameFiles
Nav.Portals = (portallist.Count > 0) ? portallist.ToArray() : null; Nav.Portals = (portallist.Count > 0) ? portallist.ToArray() : null;
Nav.PortalsCount = (uint)(Nav.Portals?.Length ?? 0); Nav.PortalsCount = (uint)(Nav.Portals?.Length ?? 0);
//TODO: update portal links data..... Nav.PortalLinks = (portallinks.Count > 0) ? portallinks.ToArray() : null;
Nav.PortalLinksCount = (uint)(Nav.PortalLinks?.Length ?? 0);
for (int i = 0; i < Nav.Polys.ListParts.Count; i++) //reassign part id's on all the polys... for (int i = 0; i < Nav.Polys.ListParts.Count; i++) //reassign part id's on all the polys...
@ -572,8 +572,8 @@ namespace CodeWalker.GameFiles
public ushort AreaID { get { return _RawData.AreaID; } set { _RawData.AreaID = value; } } public ushort AreaID { get { return _RawData.AreaID; } set { _RawData.AreaID = value; } }
public ushort PartID { get { return _RawData.PartID; } set { _RawData.PartID = value; } } public ushort PartID { get { return _RawData.PartID; } set { _RawData.PartID = value; } }
public ushort PortalLinkID { get { return _RawData.PortalLinkID; } set { _RawData.PortalLinkID = value; } } public uint PortalLinkID { get { return _RawData.PortalLinkID; } set { _RawData.PortalLinkID = value; } }
public byte PortalType { get { return _RawData.PortalType; } set { _RawData.PortalType = value; } } public byte PortalLinkCount { get { return _RawData.PortalLinkCount; } set { _RawData.PortalLinkCount = value; } }
public byte Flags1 { get { return (byte)(_RawData.Unknown_00h & 0xFF); } set { _RawData.Unknown_00h = (ushort)((_RawData.Unknown_00h & 0xFF00) | (value & 0xFF)); } } 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 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 Flags3 { get { return (byte)((_RawData.Unknown_24h.Value >> 9) & 0xFF); } set { _RawData.Unknown_24h = ((_RawData.Unknown_24h.Value & 0xFFFE01FFu) | ((value & 0xFFu) << 9)); } }
@ -621,6 +621,7 @@ namespace CodeWalker.GameFiles
public ushort[] Indices { get; set; } public ushort[] Indices { get; set; }
public Vector3[] Vertices { get; set; } public Vector3[] Vertices { get; set; }
public NavMeshEdge[] Edges { get; set; } public NavMeshEdge[] Edges { get; set; }
public ushort[] PortalLinks { get; set; }
public void Init(YnvFile ynv, NavMeshPoly poly) public void Init(YnvFile ynv, NavMeshPoly poly)
@ -629,6 +630,7 @@ namespace CodeWalker.GameFiles
RawData = poly; RawData = poly;
LoadIndices(); LoadIndices();
LoadPortalLinks();
CalculatePosition(); //calc poly center for display purposes.. CalculatePosition(); //calc poly center for display purposes..
} }
@ -669,6 +671,30 @@ namespace CodeWalker.GameFiles
} }
} }
public void LoadPortalLinks()
{
if (PortalLinkCount == 0)
{ return; }
var links = Ynv.Nav?.PortalLinks;
if (links == null)
{ return; }
var ll = links.Length;
PortalLinks = new ushort[PortalLinkCount];
int offset = (int)PortalLinkID;
for (int i = 0; i < PortalLinkCount; i++)
{
int idx = offset + i;
PortalLinks[i] = (idx < ll) ? links[idx] : (ushort)0;
}
if (PortalLinkCount != 2)
{ }//debug
}
public void SetPosition(Vector3 pos) public void SetPosition(Vector3 pos)
{ {
@ -725,7 +751,7 @@ namespace CodeWalker.GameFiles
//if ((u5 & 8388608) > 0) colour.Red += 1.0f; //slope facing -X,-Y (southwest) //if ((u5 & 8388608) > 0) colour.Red += 1.0f; //slope facing -X,-Y (southwest)
//if (u5 >= 16777216) { } //other bits unused //if (u5 >= 16777216) { } //other bits unused
var u1 = _RawData.PortalType; var u1 = _RawData.PortalLinkCount;
//if ((u1 & 1) > 0) colour.Red += 1.0f; //portal - don't interact? //if ((u1 & 1) > 0) colour.Red += 1.0f; //portal - don't interact?
//if ((u1 & 2) > 0) colour.Green += 1.0f; //portal - ladder/fence interaction? //if ((u1 & 2) > 0) colour.Green += 1.0f; //portal - ladder/fence interaction?
//if ((u1 & 4) > 0) colour.Blue += 1.0f; //portal - fence interaction / go away from? //if ((u1 & 4) > 0) colour.Blue += 1.0f; //portal - fence interaction / go away from?

View File

@ -643,16 +643,16 @@ namespace CodeWalker.GameFiles
public NavMeshAABB CellAABB { get; set; } public NavMeshAABB CellAABB { get; set; }
public FlagsUint Unknown_24h { get; set; } public FlagsUint Unknown_24h { get; set; }
public FlagsUint Unknown_28h { get; set; } public FlagsUint Unknown_28h { get; set; }
public ushort PartFlags { get; set; } public uint PartFlags { get; set; }
public ushort PortalLinkID { get; set; }
//public int IndexUnk { get { return (IndexFlags >> 0) & 31; } } //always 0 //public int IndexUnk { get { return (IndexFlags >> 0) & 31; } } //always 0
public int IndexCount { get { return (IndexFlags >> 5); } set { IndexFlags = (ushort)((IndexFlags & 31) | ((value & 0x7FF) << 5)); } } public int IndexCount { get { return (IndexFlags >> 5); } set { IndexFlags = (ushort)((IndexFlags & 31) | ((value & 0x7FF) << 5)); } }
//public int PartUnk1 { get { return (PartFlags >> 0) & 0xF; } } //always 0 //public int PartUnk1 { get { return (PartFlags >> 0) & 0xF; } } //always 0
public ushort PartID { get { return (ushort)((PartFlags >> 4) & 0xFF); } set { PartFlags = (ushort)((PartFlags & 0xF00F) | ((value & 0xFF) << 4)); } } public ushort PartID { get { return (ushort)((PartFlags >> 4) & 0xFF); } set { PartFlags = ((PartFlags & 0xFFFFF00F) | (((uint)value & 0xFF) << 4)); } }
public byte PortalType { get { return (byte)((PartFlags >> 12) & 0xF); } set { PartFlags = (ushort)((PartFlags & 0x0FFF) | ((value & 0xF) << 12)); } } public byte PortalLinkCount { get { return (byte)((PartFlags >> 12) & 0x7); } set { PartFlags = ((PartFlags & 0xFFFF8FFF) | (((uint)value & 0x7) << 12)); } }
public uint PortalLinkID { get { return ((PartFlags >> 15) & 0x1FFFF); } set { PartFlags = ((PartFlags & 0x7FFF) | ((value & 0x1FFFF) << 15)); } }
public ushort Unknown_28h_16 { get { return (ushort)((Unknown_28h.Value & 0xFFFF)); } set { Unknown_28h = (Unknown_28h.Value & 0xFFFF0000) | (value & 0xFFFFu); } } public ushort Unknown_28h_16 { get { return (ushort)((Unknown_28h.Value & 0xFFFF)); } set { Unknown_28h = (Unknown_28h.Value & 0xFFFF0000) | (value & 0xFFFFu); } }
@ -673,7 +673,7 @@ namespace CodeWalker.GameFiles
Unknown_28h.Hex + ", " + Unknown_28h.Hex + ", " +
//PartFlags.ToString() + ", " + //PartUnk1.ToString() + ", " + //PartFlags.ToString() + ", " + //PartUnk1.ToString() + ", " +
PartID.ToString() + ", " + PartID.ToString() + ", " +
PortalType.ToString() + ", " + PortalLinkCount.ToString() + ", " +
PortalLinkID.ToString(); PortalLinkID.ToString();
} }
} }

View File

@ -46,14 +46,14 @@
this.label4 = new System.Windows.Forms.Label(); this.label4 = new System.Windows.Forms.Label();
this.DeletePolyButton = new System.Windows.Forms.Button(); this.DeletePolyButton = new System.Windows.Forms.Button();
this.AddToProjectButton = new System.Windows.Forms.Button(); this.AddToProjectButton = new System.Windows.Forms.Button();
this.PortalTypeUpDown = new System.Windows.Forms.NumericUpDown(); this.PortalCountUpDown = new System.Windows.Forms.NumericUpDown();
this.label6 = new System.Windows.Forms.Label(); this.label6 = new System.Windows.Forms.Label();
((System.ComponentModel.ISupportInitialize)(this.AreaIDUpDown)).BeginInit(); ((System.ComponentModel.ISupportInitialize)(this.AreaIDUpDown)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.PartIDUpDown)).BeginInit(); ((System.ComponentModel.ISupportInitialize)(this.PartIDUpDown)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.PortalIDUpDown)).BeginInit(); ((System.ComponentModel.ISupportInitialize)(this.PortalIDUpDown)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.UnkXUpDown)).BeginInit(); ((System.ComponentModel.ISupportInitialize)(this.UnkXUpDown)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.UnkYUpDown)).BeginInit(); ((System.ComponentModel.ISupportInitialize)(this.UnkYUpDown)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.PortalTypeUpDown)).BeginInit(); ((System.ComponentModel.ISupportInitialize)(this.PortalCountUpDown)).BeginInit();
this.SuspendLayout(); this.SuspendLayout();
// //
// AreaIDUpDown // AreaIDUpDown
@ -273,34 +273,34 @@
this.AddToProjectButton.UseVisualStyleBackColor = true; this.AddToProjectButton.UseVisualStyleBackColor = true;
this.AddToProjectButton.Click += new System.EventHandler(this.AddToProjectButton_Click); this.AddToProjectButton.Click += new System.EventHandler(this.AddToProjectButton_Click);
// //
// PortalTypeUpDown // PortalCountUpDown
// //
this.PortalTypeUpDown.Location = new System.Drawing.Point(495, 12); this.PortalCountUpDown.Location = new System.Drawing.Point(495, 12);
this.PortalTypeUpDown.Maximum = new decimal(new int[] { this.PortalCountUpDown.Maximum = new decimal(new int[] {
15, 15,
0, 0,
0, 0,
0}); 0});
this.PortalTypeUpDown.Name = "PortalTypeUpDown"; this.PortalCountUpDown.Name = "PortalCountUpDown";
this.PortalTypeUpDown.Size = new System.Drawing.Size(57, 20); this.PortalCountUpDown.Size = new System.Drawing.Size(57, 20);
this.PortalTypeUpDown.TabIndex = 8; this.PortalCountUpDown.TabIndex = 8;
this.PortalTypeUpDown.ValueChanged += new System.EventHandler(this.PortalTypeUpDown_ValueChanged); this.PortalCountUpDown.ValueChanged += new System.EventHandler(this.PortalCountUpDown_ValueChanged);
// //
// label6 // label6
// //
this.label6.AutoSize = true; this.label6.AutoSize = true;
this.label6.Location = new System.Drawing.Point(429, 14); this.label6.Location = new System.Drawing.Point(424, 14);
this.label6.Name = "label6"; this.label6.Name = "label6";
this.label6.Size = new System.Drawing.Size(60, 13); this.label6.Size = new System.Drawing.Size(67, 13);
this.label6.TabIndex = 7; this.label6.TabIndex = 7;
this.label6.Text = "Portal type:"; this.label6.Text = "Portal count:";
// //
// EditYnvPolyPanel // EditYnvPolyPanel
// //
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(562, 404); this.ClientSize = new System.Drawing.Size(562, 404);
this.Controls.Add(this.PortalTypeUpDown); this.Controls.Add(this.PortalCountUpDown);
this.Controls.Add(this.label6); this.Controls.Add(this.label6);
this.Controls.Add(this.DeletePolyButton); this.Controls.Add(this.DeletePolyButton);
this.Controls.Add(this.AddToProjectButton); this.Controls.Add(this.AddToProjectButton);
@ -327,7 +327,7 @@
((System.ComponentModel.ISupportInitialize)(this.PortalIDUpDown)).EndInit(); ((System.ComponentModel.ISupportInitialize)(this.PortalIDUpDown)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.UnkXUpDown)).EndInit(); ((System.ComponentModel.ISupportInitialize)(this.UnkXUpDown)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.UnkYUpDown)).EndInit(); ((System.ComponentModel.ISupportInitialize)(this.UnkYUpDown)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.PortalTypeUpDown)).EndInit(); ((System.ComponentModel.ISupportInitialize)(this.PortalCountUpDown)).EndInit();
this.ResumeLayout(false); this.ResumeLayout(false);
this.PerformLayout(); this.PerformLayout();
@ -352,7 +352,7 @@
private System.Windows.Forms.Label label4; private System.Windows.Forms.Label label4;
private System.Windows.Forms.Button DeletePolyButton; private System.Windows.Forms.Button DeletePolyButton;
private System.Windows.Forms.Button AddToProjectButton; private System.Windows.Forms.Button AddToProjectButton;
private System.Windows.Forms.NumericUpDown PortalTypeUpDown; private System.Windows.Forms.NumericUpDown PortalCountUpDown;
private System.Windows.Forms.Label label6; private System.Windows.Forms.Label label6;
} }
} }

View File

@ -48,7 +48,7 @@ namespace CodeWalker.Project.Panels
AreaIDUpDown.Value = 0; AreaIDUpDown.Value = 0;
PartIDUpDown.Value = 0; PartIDUpDown.Value = 0;
PortalIDUpDown.Value = 0; PortalIDUpDown.Value = 0;
PortalTypeUpDown.Value = 0; PortalCountUpDown.Value = 0;
SetCheckedListBoxValues(FlagsCheckedListBox1, 0); SetCheckedListBoxValues(FlagsCheckedListBox1, 0);
SetCheckedListBoxValues(FlagsCheckedListBox2, 0); SetCheckedListBoxValues(FlagsCheckedListBox2, 0);
SetCheckedListBoxValues(FlagsCheckedListBox3, 0); SetCheckedListBoxValues(FlagsCheckedListBox3, 0);
@ -65,7 +65,7 @@ namespace CodeWalker.Project.Panels
AreaIDUpDown.Value = YnvPoly.AreaID; AreaIDUpDown.Value = YnvPoly.AreaID;
PartIDUpDown.Value = YnvPoly.PartID; PartIDUpDown.Value = YnvPoly.PartID;
PortalIDUpDown.Value = YnvPoly.PortalLinkID; PortalIDUpDown.Value = YnvPoly.PortalLinkID;
PortalTypeUpDown.Value = YnvPoly.PortalType; PortalCountUpDown.Value = YnvPoly.PortalLinkCount;
SetCheckedListBoxValues(FlagsCheckedListBox1, YnvPoly.Flags1); SetCheckedListBoxValues(FlagsCheckedListBox1, YnvPoly.Flags1);
SetCheckedListBoxValues(FlagsCheckedListBox2, YnvPoly.Flags2); SetCheckedListBoxValues(FlagsCheckedListBox2, YnvPoly.Flags2);
SetCheckedListBoxValues(FlagsCheckedListBox3, YnvPoly.Flags3); SetCheckedListBoxValues(FlagsCheckedListBox3, YnvPoly.Flags3);
@ -152,16 +152,16 @@ namespace CodeWalker.Project.Panels
} }
} }
private void PortalTypeUpDown_ValueChanged(object sender, EventArgs e) private void PortalCountUpDown_ValueChanged(object sender, EventArgs e)
{ {
if (populatingui) return; if (populatingui) return;
if (YnvPoly == null) return; if (YnvPoly == null) return;
byte portalunk = (byte)PortalTypeUpDown.Value; byte portalcount = (byte)PortalCountUpDown.Value;
lock (ProjectForm.ProjectSyncRoot) lock (ProjectForm.ProjectSyncRoot)
{ {
if (YnvPoly.PortalType != portalunk) if (YnvPoly.PortalLinkCount != portalcount)
{ {
YnvPoly.PortalType = portalunk; YnvPoly.PortalLinkCount = portalcount;
ProjectForm.SetYnvHasChanged(true); ProjectForm.SetYnvHasChanged(true);
} }
} }