CodeWalker/Project/Panels/EditYndNodePanel.cs
2020-01-15 17:48:27 +11:00

1257 lines
47 KiB
C#

using CodeWalker.GameFiles;
using SharpDX;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace CodeWalker.Project.Panels
{
public partial class EditYndNodePanel : ProjectPanel
{
public ProjectForm ProjectForm;
public YndNode CurrentPathNode { get; set; }
public YndLink CurrentPathLink { get; set; }
public YndFile CurrentYndFile { get; set; }
private bool populatingui = false;
public EditYndNodePanel(ProjectForm projectForm)
{
ProjectForm = projectForm;
InitializeComponent();
}
public void SetPathNode(YndNode node)
{
CurrentPathNode = node;
CurrentPathLink = null;
CurrentYndFile = node?.Ynd;
Tag = node;
UpdateFormTitle();
UpdateYndNodeUI();
}
private void UpdateFormTitle()
{
var sn = CurrentPathNode.StreetName.Hash == 0 ? "Path node" : CurrentPathNode.StreetName.ToString();
Text = sn + " " + CurrentPathNode.NodeID.ToString();
}
public void UpdateYndNodeUI()
{
LoadPathNodeTabPage();
LoadPathNodeJunctionPage();
LoadPathNodeLinkPage();
}
private void LoadPathNodeTabPage()
{
CurrentPathLink = null;
if (CurrentPathNode == null)
{
//YndNodePanel.Enabled = false;
PathNodeDeleteButton.Enabled = false;
PathNodeAddToProjectButton.Enabled = false;
PathNodeAreaIDUpDown.Value = 0;
PathNodeNodeIDUpDown.Value = 0;
PathNodePositionTextBox.Text = string.Empty;
PathNodeStreetHashTextBox.Text = string.Empty;
PathNodeStreetNameLabel.Text = "Name: [None]";
UpdatePathNodeFlagsUI(true, true);
PathNodeLinkCountLabel.Text = "Link Count: 0";
PathNodeLinksListBox.Items.Clear();
}
else
{
populatingui = true;
var n = CurrentPathNode.RawData;
//YndNodePanel.Enabled = true;
PathNodeDeleteButton.Enabled = ProjectForm.YndExistsInProject(CurrentYndFile);
PathNodeAddToProjectButton.Enabled = !PathNodeDeleteButton.Enabled;
var streetname = GlobalText.TryGetString(n.StreetName.Hash);
PathNodeAreaIDUpDown.Value = n.AreaID;
PathNodeNodeIDUpDown.Value = n.NodeID;
PathNodePositionTextBox.Text = FloatUtil.GetVector3String(CurrentPathNode.Position);
PathNodeStreetHashTextBox.Text = n.StreetName.Hash.ToString();
PathNodeStreetNameLabel.Text = "Name: " + ((n.StreetName.Hash == 0) ? "[None]" : (string.IsNullOrEmpty(streetname) ? "[Not found]" : streetname));
UpdatePathNodeFlagsUI(true, true);
PathNodeLinkCountLabel.Text = "Link Count: " + CurrentPathNode.LinkCount.ToString();
PathNodeLinksListBox.Items.Clear();
if (CurrentPathNode.Links != null)
{
foreach (var link in CurrentPathNode.Links)
{
PathNodeLinksListBox.Items.Add(link);
}
}
populatingui = false;
if (ProjectForm.WorldForm != null)
{
ProjectForm.WorldForm.SelectObject(CurrentPathNode);
}
}
}
private void LoadPathNodeLinkPage()
{
if (CurrentPathLink == null)
{
PathNodeLinkPanel.Enabled = false;
PathNodeLinkAreaIDUpDown.Value = 0;
PathNodeLinkNodeIDUpDown.Value = 0;
UpdatePathNodeLinkFlagsUI(true, true);
PathNodeLinkLengthUpDown.Value = 0;
PathNodeLinkageStatusLabel.Text = "";
}
else
{
populatingui = true;
PathNodeLinkPanel.Enabled = true;
PathNodeLinkAreaIDUpDown.Value = CurrentPathLink._RawData.AreaID;
PathNodeLinkNodeIDUpDown.Value = CurrentPathLink._RawData.NodeID;
UpdatePathNodeLinkFlagsUI(true, true);
PathNodeLinkLengthUpDown.Value = CurrentPathLink.LinkLength.Value;
PathNodeLinkageStatusLabel.Text = "";
populatingui = false;
if (ProjectForm.WorldForm != null)
{
ProjectForm.WorldForm.SelectObject(CurrentPathLink);
}
}
}
private void LoadPathNodeJunctionPage()
{
var junc = CurrentPathNode?.Junction;
if (junc == null)
{
PathNodeJunctionEnableCheckBox.Checked = false;
PathNodeJunctionPanel.Enabled = false;
PathNodeJunctionMaxZUpDown.Value = 0;
PathNodeJunctionMinZUpDown.Value = 0;
PathNodeJunctionPosXUpDown.Value = 0;
PathNodeJunctionPosYUpDown.Value = 0;
PathNodeJunctionHeightmapDimXUpDown.Value = 1;
PathNodeJunctionHeightmapDimYUpDown.Value = 1;
PathNodeJunctionHeightmapBytesTextBox.Text = string.Empty;
}
else
{
populatingui = true;
PathNodeJunctionEnableCheckBox.Checked = CurrentPathNode.HasJunction;
PathNodeJunctionPanel.Enabled = PathNodeJunctionEnableCheckBox.Checked;
PathNodeJunctionMaxZUpDown.Value = junc.MaxZ;
PathNodeJunctionMinZUpDown.Value = junc.MinZ;
PathNodeJunctionPosXUpDown.Value = junc.PositionX;
PathNodeJunctionPosYUpDown.Value = junc.PositionY;
PathNodeJunctionHeightmapDimXUpDown.Value = junc.Heightmap.CountX;
PathNodeJunctionHeightmapDimYUpDown.Value = junc.Heightmap.CountY;
PathNodeJunctionHeightmapBytesTextBox.Text = junc.Heightmap?.GetDataString() ?? "";
populatingui = false;
}
}
private void UpdatePathNodeFlagsUI(bool updateCheckboxes, bool updateUpDowns)
{
var flags0 = CurrentPathNode?.Flags0.Value ?? 0;
var flags1 = CurrentPathNode?.Flags1.Value ?? 0;
var flags2 = CurrentPathNode?.Flags2.Value ?? 0;
var flags3 = CurrentPathNode?.Flags3.Value ?? 0;
var flags4 = CurrentPathNode?.Flags4.Value ?? 0;
var flags5 = (uint)(CurrentPathNode?.LinkCountUnk ?? 0);
if (updateCheckboxes)
{
PathNodeFlags01CheckBox.Checked = BitUtil.IsBitSet(flags0, 0);
PathNodeFlags02CheckBox.Checked = BitUtil.IsBitSet(flags0, 1);
PathNodeFlags03CheckBox.Checked = BitUtil.IsBitSet(flags0, 2);
PathNodeFlags04CheckBox.Checked = BitUtil.IsBitSet(flags0, 3);
PathNodeFlags05CheckBox.Checked = BitUtil.IsBitSet(flags0, 4);
PathNodeFlags06CheckBox.Checked = BitUtil.IsBitSet(flags0, 5);
PathNodeFlags07CheckBox.Checked = BitUtil.IsBitSet(flags0, 6);
PathNodeFlags08CheckBox.Checked = BitUtil.IsBitSet(flags0, 7);
PathNodeFlags11CheckBox.Checked = BitUtil.IsBitSet(flags1, 0);
PathNodeFlags12CheckBox.Checked = BitUtil.IsBitSet(flags1, 1);
PathNodeFlags13CheckBox.Checked = BitUtil.IsBitSet(flags1, 2);
PathNodeFlags14CheckBox.Checked = BitUtil.IsBitSet(flags1, 3);
PathNodeFlags15CheckBox.Checked = BitUtil.IsBitSet(flags1, 4);
PathNodeFlags16CheckBox.Checked = BitUtil.IsBitSet(flags1, 5);
PathNodeFlags17CheckBox.Checked = BitUtil.IsBitSet(flags1, 6);
PathNodeFlags18CheckBox.Checked = BitUtil.IsBitSet(flags1, 7);
PathNodeFlags21CheckBox.Checked = BitUtil.IsBitSet(flags2, 0);
PathNodeFlags22CheckBox.Checked = BitUtil.IsBitSet(flags2, 1);
PathNodeFlags23CheckBox.Checked = BitUtil.IsBitSet(flags2, 2);
PathNodeFlags24CheckBox.Checked = BitUtil.IsBitSet(flags2, 3);
PathNodeFlags25CheckBox.Checked = BitUtil.IsBitSet(flags2, 4);
PathNodeFlags26CheckBox.Checked = BitUtil.IsBitSet(flags2, 5);
PathNodeFlags27CheckBox.Checked = BitUtil.IsBitSet(flags2, 6);
PathNodeFlags28CheckBox.Checked = BitUtil.IsBitSet(flags2, 7);
PathNodeFlags31CheckBox.Checked = BitUtil.IsBitSet(flags3, 0);
PathNodeFlags32UpDown.Value = (flags3 >> 1) & 127;
PathNodeFlags41CheckBox.Checked = BitUtil.IsBitSet(flags4, 0);
PathNodeFlags42UpDown.Value = (flags4 >> 1) & 7;
PathNodeFlags45CheckBox.Checked = BitUtil.IsBitSet(flags4, 4);
PathNodeFlags46CheckBox.Checked = BitUtil.IsBitSet(flags4, 5);
PathNodeFlags47CheckBox.Checked = BitUtil.IsBitSet(flags4, 6);
PathNodeFlags48CheckBox.Checked = BitUtil.IsBitSet(flags4, 7);
PathNodeFlags51CheckBox.Checked = BitUtil.IsBitSet(flags5, 0);
PathNodeFlags52CheckBox.Checked = BitUtil.IsBitSet(flags5, 1);
PathNodeFlags53CheckBox.Checked = BitUtil.IsBitSet(flags5, 2);
}
if (updateUpDowns)
{
PathNodeFlags0UpDown.Value = flags0;
PathNodeFlags1UpDown.Value = flags1;
PathNodeFlags2UpDown.Value = flags2;
PathNodeFlags3UpDown.Value = flags3;
PathNodeFlags4UpDown.Value = flags4;
PathNodeFlags5UpDown.Value = flags5;
}
var n = CurrentPathNode;
if (n != null)
{
PathNodeFlags0Label.Text = n.Flags0.ToHexString();
PathNodeFlags1Label.Text = n.Flags1.ToHexString();
PathNodeFlags2Label.Text = n.Flags2.ToHexString();
PathNodeFlags3Label.Text = n.Flags3.ToHexString();
PathNodeFlags4Label.Text = n.Flags4.ToHexString();
}
else
{
PathNodeFlags0Label.Text = "0x00";
PathNodeFlags1Label.Text = "0x00";
PathNodeFlags2Label.Text = "0x00";
PathNodeFlags3Label.Text = "0x00";
PathNodeFlags4Label.Text = "0x00";
}
}
private void UpdatePathNodeLinkFlagsUI(bool updateCheckboxes, bool updateUpDowns)
{
var flags0 = CurrentPathLink?.Flags0.Value ?? 0;
var flags1 = CurrentPathLink?.Flags1.Value ?? 0;
var flags2 = CurrentPathLink?.Flags2.Value ?? 0;
if (updateCheckboxes)
{
PathNodeLinkFlags01CheckBox.Checked = BitUtil.IsBitSet(flags0, 0);
PathNodeLinkFlags02CheckBox.Checked = BitUtil.IsBitSet(flags0, 1);
PathNodeLinkFlags03UpDown.Value = (flags0 >> 2) & 7;
PathNodeLinkFlags04UpDown.Value = (flags0 >> 5) & 7;
PathNodeLinkFlags11CheckBox.Checked = BitUtil.IsBitSet(flags1, 0);
PathNodeLinkFlags12CheckBox.Checked = BitUtil.IsBitSet(flags1, 1);
PathNodeLinkFlags13CheckBox.Checked = BitUtil.IsBitSet(flags1, 2);
PathNodeLinkFlags14CheckBox.Checked = BitUtil.IsBitSet(flags1, 3);
PathNodeLinkOffsetSizeUpDown.Value = (flags1 >> 4) & 7;
PathNodeLinkFlags18CheckBox.Checked = BitUtil.IsBitSet(flags1, 7);
PathNodeLinkFlags21CheckBox.Checked = BitUtil.IsBitSet(flags2, 0);
PathNodeLinkFlags22CheckBox.Checked = BitUtil.IsBitSet(flags2, 1);
PathNodeLinkBackLanesUpDown.Value = (flags2 >> 2) & 7;
PathNodeLinkFwdLanesUpDown.Value = (flags2 >> 5) & 7;
}
if (updateUpDowns)
{
PathNodeLinkFlags0UpDown.Value = flags0;
PathNodeLinkFlags1UpDown.Value = flags1;
PathNodeLinkFlags2UpDown.Value = flags2;
}
var l = CurrentPathLink;
if (l != null)
{
PathNodeLinkFlags0Label.Text = l.Flags0.ToHexString();
PathNodeLinkFlags1Label.Text = l.Flags1.ToHexString();
PathNodeLinkFlags2Label.Text = l.Flags2.ToHexString();
}
else
{
PathNodeLinkFlags0Label.Text = "0x00";
PathNodeLinkFlags1Label.Text = "0x00";
PathNodeLinkFlags2Label.Text = "0x00";
}
}
private void SetPathNodeFlagsFromCheckBoxes()
{
if (populatingui) return;
if (CurrentPathNode == null) return;
uint flags0 = 0;
uint flags1 = 0;
uint flags2 = 0;
uint flags3 = 0;
uint flags4 = 0;
uint flags5 = 0;
flags0 = BitUtil.UpdateBit(flags0, 0, PathNodeFlags01CheckBox.Checked);
flags0 = BitUtil.UpdateBit(flags0, 1, PathNodeFlags02CheckBox.Checked);
flags0 = BitUtil.UpdateBit(flags0, 2, PathNodeFlags03CheckBox.Checked);
flags0 = BitUtil.UpdateBit(flags0, 3, PathNodeFlags04CheckBox.Checked);
flags0 = BitUtil.UpdateBit(flags0, 4, PathNodeFlags05CheckBox.Checked);
flags0 = BitUtil.UpdateBit(flags0, 5, PathNodeFlags06CheckBox.Checked);
flags0 = BitUtil.UpdateBit(flags0, 6, PathNodeFlags07CheckBox.Checked);
flags0 = BitUtil.UpdateBit(flags0, 7, PathNodeFlags08CheckBox.Checked);
flags1 = BitUtil.UpdateBit(flags1, 0, PathNodeFlags11CheckBox.Checked);
flags1 = BitUtil.UpdateBit(flags1, 1, PathNodeFlags12CheckBox.Checked);
flags1 = BitUtil.UpdateBit(flags1, 2, PathNodeFlags13CheckBox.Checked);
flags1 = BitUtil.UpdateBit(flags1, 3, PathNodeFlags14CheckBox.Checked);
flags1 = BitUtil.UpdateBit(flags1, 4, PathNodeFlags15CheckBox.Checked);
flags1 = BitUtil.UpdateBit(flags1, 5, PathNodeFlags16CheckBox.Checked);
flags1 = BitUtil.UpdateBit(flags1, 6, PathNodeFlags17CheckBox.Checked);
flags1 = BitUtil.UpdateBit(flags1, 7, PathNodeFlags18CheckBox.Checked);
flags2 = BitUtil.UpdateBit(flags2, 0, PathNodeFlags21CheckBox.Checked);
flags2 = BitUtil.UpdateBit(flags2, 1, PathNodeFlags22CheckBox.Checked);
flags2 = BitUtil.UpdateBit(flags2, 2, PathNodeFlags23CheckBox.Checked);
flags2 = BitUtil.UpdateBit(flags2, 3, PathNodeFlags24CheckBox.Checked);
flags2 = BitUtil.UpdateBit(flags2, 4, PathNodeFlags25CheckBox.Checked);
flags2 = BitUtil.UpdateBit(flags2, 5, PathNodeFlags26CheckBox.Checked);
flags2 = BitUtil.UpdateBit(flags2, 6, PathNodeFlags27CheckBox.Checked);
flags2 = BitUtil.UpdateBit(flags2, 7, PathNodeFlags28CheckBox.Checked);
flags3 = BitUtil.UpdateBit(flags3, 0, PathNodeFlags31CheckBox.Checked);
flags3 += (((uint)PathNodeFlags32UpDown.Value & 127u) << 1);
flags4 = BitUtil.UpdateBit(flags4, 0, PathNodeFlags41CheckBox.Checked);
flags4 += (((uint)PathNodeFlags42UpDown.Value & 7u) << 1);
flags4 = BitUtil.UpdateBit(flags4, 4, PathNodeFlags45CheckBox.Checked);
flags4 = BitUtil.UpdateBit(flags4, 5, PathNodeFlags46CheckBox.Checked);
flags4 = BitUtil.UpdateBit(flags4, 6, PathNodeFlags47CheckBox.Checked);
flags4 = BitUtil.UpdateBit(flags4, 7, PathNodeFlags48CheckBox.Checked);
flags5 = BitUtil.UpdateBit(flags5, 0, PathNodeFlags51CheckBox.Checked);
flags5 = BitUtil.UpdateBit(flags5, 1, PathNodeFlags52CheckBox.Checked);
flags5 = BitUtil.UpdateBit(flags5, 2, PathNodeFlags53CheckBox.Checked);
lock (ProjectForm.ProjectSyncRoot)
{
if (CurrentPathNode.Flags0.Value != flags0)
{
CurrentPathNode.Flags0 = (byte)flags0;
ProjectForm.SetYndHasChanged(true);
}
if (CurrentPathNode.Flags1.Value != flags1)
{
CurrentPathNode.Flags1 = (byte)flags1;
ProjectForm.SetYndHasChanged(true);
}
if (CurrentPathNode.Flags2.Value != flags2)
{
CurrentPathNode.Flags2 = (byte)flags2;
ProjectForm.SetYndHasChanged(true);
}
if (CurrentPathNode.Flags3.Value != flags3)
{
CurrentPathNode.Flags3 = (byte)flags3;
ProjectForm.SetYndHasChanged(true);
}
if (CurrentPathNode.Flags4.Value != flags4)
{
CurrentPathNode.Flags4 = (byte)flags4;
ProjectForm.SetYndHasChanged(true);
}
if (CurrentPathNode.LinkCountUnk != flags5)
{
CurrentPathNode.LinkCountUnk = (byte)flags5;
ProjectForm.SetYndHasChanged(true);
}
}
populatingui = true;
UpdatePathNodeFlagsUI(false, true); //update updowns
populatingui = false;
}
private void SetPathNodeFlagsFromUpDowns()
{
if (populatingui) return;
if (CurrentPathNode == null) return;
uint flags0 = (uint)PathNodeFlags0UpDown.Value;
uint flags1 = (uint)PathNodeFlags1UpDown.Value;
uint flags2 = (uint)PathNodeFlags2UpDown.Value;
uint flags3 = (uint)PathNodeFlags3UpDown.Value;
uint flags4 = (uint)PathNodeFlags4UpDown.Value;
uint flags5 = (uint)PathNodeFlags5UpDown.Value;
lock (ProjectForm.ProjectSyncRoot)
{
if (CurrentPathNode.Flags0.Value != flags0)
{
CurrentPathNode.Flags0 = (byte)flags0;
ProjectForm.SetYndHasChanged(true);
}
if (CurrentPathNode.Flags1.Value != flags1)
{
CurrentPathNode.Flags1 = (byte)flags1;
ProjectForm.SetYndHasChanged(true);
}
if (CurrentPathNode.Flags2.Value != flags2)
{
CurrentPathNode.Flags2 = (byte)flags2;
ProjectForm.SetYndHasChanged(true);
}
if (CurrentPathNode.Flags3.Value != flags3)
{
CurrentPathNode.Flags3 = (byte)flags3;
ProjectForm.SetYndHasChanged(true);
}
if (CurrentPathNode.Flags4.Value != flags4)
{
CurrentPathNode.Flags4 = (byte)flags4;
ProjectForm.SetYndHasChanged(true);
}
if (CurrentPathNode.LinkCountUnk != flags5)
{
CurrentPathNode.LinkCountUnk = (byte)flags5;
ProjectForm.SetYndHasChanged(true);
}
}
populatingui = true;
UpdatePathNodeFlagsUI(true, false); //update checkboxes
populatingui = false;
}
private void SetPathNodeLinkFlagsFromCheckBoxes()
{
if (populatingui) return;
if (CurrentPathLink == null) return;
uint flags0 = 0;
uint flags1 = 0;
uint flags2 = 0;
flags0 = BitUtil.UpdateBit(flags0, 0, PathNodeLinkFlags01CheckBox.Checked);
flags0 = BitUtil.UpdateBit(flags0, 1, PathNodeLinkFlags02CheckBox.Checked);
flags0 += (((uint)PathNodeLinkFlags03UpDown.Value & 7u) << 2);
flags0 += (((uint)PathNodeLinkFlags04UpDown.Value & 7u) << 5);
flags1 = BitUtil.UpdateBit(flags1, 0, PathNodeLinkFlags11CheckBox.Checked);
flags1 = BitUtil.UpdateBit(flags1, 1, PathNodeLinkFlags12CheckBox.Checked);
flags1 = BitUtil.UpdateBit(flags1, 2, PathNodeLinkFlags13CheckBox.Checked);
flags1 = BitUtil.UpdateBit(flags1, 3, PathNodeLinkFlags14CheckBox.Checked);
flags1 += (((uint)PathNodeLinkOffsetSizeUpDown.Value & 7u) << 4);
flags1 = BitUtil.UpdateBit(flags1, 7, PathNodeLinkFlags18CheckBox.Checked);
flags2 = BitUtil.UpdateBit(flags2, 0, PathNodeLinkFlags21CheckBox.Checked);
flags2 = BitUtil.UpdateBit(flags2, 1, PathNodeLinkFlags22CheckBox.Checked);
flags2 += (((uint)PathNodeLinkBackLanesUpDown.Value & 7u) << 2);
flags2 += (((uint)PathNodeLinkFwdLanesUpDown.Value & 7u) << 5);
bool updgfx = false;
lock (ProjectForm.ProjectSyncRoot)
{
if (CurrentPathLink.Flags0.Value != flags0)
{
CurrentPathLink.Flags0 = (byte)flags0;
ProjectForm.SetYndHasChanged(true);
}
if (CurrentPathLink.Flags1.Value != flags1)
{
CurrentPathLink.Flags1 = (byte)flags1;
ProjectForm.SetYndHasChanged(true);
updgfx = true;
}
if (CurrentPathLink.Flags2.Value != flags2)
{
CurrentPathLink.Flags2 = (byte)flags2;
ProjectForm.SetYndHasChanged(true);
updgfx = true;
}
}
populatingui = true;
UpdatePathNodeLinkFlagsUI(false, true); //update updowns
populatingui = false;
if (updgfx && (ProjectForm.WorldForm != null) && (CurrentYndFile != null))
{
ProjectForm.WorldForm.UpdatePathYndGraphics(CurrentYndFile, false);
}
}
private void SetPathNodeLinkFlagsFromUpDowns()
{
if (populatingui) return;
if (CurrentPathLink == null) return;
uint flags0 = (uint)PathNodeLinkFlags0UpDown.Value;
uint flags1 = (uint)PathNodeLinkFlags1UpDown.Value;
uint flags2 = (uint)PathNodeLinkFlags2UpDown.Value;
bool updgfx = false;
lock (ProjectForm.ProjectSyncRoot)
{
if (CurrentPathLink.Flags0.Value != flags0)
{
CurrentPathLink.Flags0 = (byte)flags0;
ProjectForm.SetYndHasChanged(true);
}
if (CurrentPathLink.Flags1.Value != flags1)
{
CurrentPathLink.Flags1 = (byte)flags1;
ProjectForm.SetYndHasChanged(true);
}
if (CurrentPathLink.Flags2.Value != flags2)
{
CurrentPathLink.Flags2 = (byte)flags2;
ProjectForm.SetYndHasChanged(true);
updgfx = true;
}
}
populatingui = true;
UpdatePathNodeLinkFlagsUI(true, false); //update checkboxes
populatingui = false;
if (updgfx && (ProjectForm.WorldForm != null) && (CurrentYndFile != null))
{
ProjectForm.WorldForm.UpdatePathYndGraphics(CurrentYndFile, false);
}
}
private void AddPathLink()
{
if (CurrentPathNode == null) return;
var l = CurrentPathNode.AddLink();
LoadPathNodeTabPage();
PathNodeLinksListBox.SelectedItem = l;
if (ProjectForm.WorldForm != null)
{
ProjectForm.WorldForm.UpdatePathNodeGraphics(CurrentPathNode, false);
}
}
private void RemovePathLink()
{
if (CurrentPathLink == null) return;
if (CurrentPathNode == null) return;
var r = CurrentPathNode.RemoveLink(CurrentPathLink);
if (!r) return;
LoadPathNodeTabPage();
if (ProjectForm.WorldForm != null)
{
ProjectForm.WorldForm.UpdatePathNodeGraphics(CurrentPathNode, false);
}
}
private void UpdatePathNodeLinkage()
{
if (CurrentPathLink == null) return;
if (CurrentYndFile == null) return;
YndNode linknode = null;
ushort areaid = CurrentPathLink._RawData.AreaID;
ushort nodeid = CurrentPathLink._RawData.NodeID;
if (areaid == CurrentYndFile.AreaID)
{
//link to the same ynd. find the new node in the current ynd.
if ((CurrentYndFile.Nodes != null) && (nodeid < CurrentYndFile.Nodes.Length))
{
linknode = CurrentYndFile.Nodes[nodeid];
}
}
else
{
//try lookup the link node from the space.
if (ProjectForm.WorldForm != null)
{
linknode = ProjectForm.WorldForm.GetPathNodeFromSpace(areaid, nodeid);
}
}
if (linknode == null)
{
PathNodeLinkageStatusLabel.Text = "Unable to find node " + areaid.ToString() + ":" + nodeid.ToString() + ".";
}
else
{
PathNodeLinkageStatusLabel.Text = "";
}
CurrentPathLink.Node2 = linknode;
CurrentPathLink.UpdateLength();
////need to rebuild the link verts.. updating the graphics should do it...
if (ProjectForm.WorldForm != null)
{
ProjectForm.WorldForm.UpdatePathYndGraphics(CurrentYndFile, false);
}
}
private void PathNodeAreaIDUpDown_ValueChanged(object sender, EventArgs e)
{
if (populatingui) return;
if (CurrentPathNode == null) return;
ushort areaid = (ushort)PathNodeAreaIDUpDown.Value;
lock (ProjectForm.ProjectSyncRoot)
{
if (CurrentPathNode.AreaID != areaid)
{
CurrentPathNode.AreaID = areaid;
ProjectForm.SetYndHasChanged(true);
}
}
ProjectForm.ProjectExplorer?.UpdatePathNodeTreeNode(CurrentPathNode);
}
private void PathNodeNodeIDUpDown_ValueChanged(object sender, EventArgs e)
{
if (populatingui) return;
if (CurrentPathNode == null) return;
ushort nodeid = (ushort)PathNodeNodeIDUpDown.Value;
lock (ProjectForm.ProjectSyncRoot)
{
if (CurrentPathNode.NodeID != nodeid)
{
CurrentPathNode.NodeID = nodeid;
ProjectForm.SetYndHasChanged(true);
}
}
ProjectForm.ProjectExplorer?.UpdatePathNodeTreeNode(CurrentPathNode);
}
private void PathNodePositionTextBox_TextChanged(object sender, EventArgs e)
{
if (populatingui) return;
if (CurrentPathNode == null) return;
Vector3 v = FloatUtil.ParseVector3String(PathNodePositionTextBox.Text);
bool change = false;
lock (ProjectForm.ProjectSyncRoot)
{
if (CurrentPathNode.Position != v)
{
CurrentPathNode.SetPosition(v);
ProjectForm.SetYndHasChanged(true);
change = true;
}
}
if (change)
{
if (ProjectForm.WorldForm != null)
{
ProjectForm.WorldForm.SetWidgetPosition(CurrentPathNode.Position);
ProjectForm.WorldForm.UpdatePathNodeGraphics(CurrentPathNode, false);
}
//PathNodePositionTextBox.Text = FloatUtil.GetVector3String(CurrentPathNode.Position);
}
}
private void PathNodeGoToButton_Click(object sender, EventArgs e)
{
if (CurrentPathNode == null) return;
if (ProjectForm.WorldForm == null) return;
ProjectForm.WorldForm.GoToPosition(CurrentPathNode.Position);
}
private void PathNodeAddToProjectButton_Click(object sender, EventArgs e)
{
if (CurrentPathNode?.Ynd != null)
{
ProjectForm.AddYndToProject(CurrentPathNode.Ynd);
}
}
private void PathNodeDeleteButton_Click(object sender, EventArgs e)
{
ProjectForm.SetProjectItem(CurrentPathNode);
ProjectForm.DeletePathNode();
}
private void PathNodeStreetHashTextBox_TextChanged(object sender, EventArgs e)
{
if (populatingui) return;
if (CurrentPathNode == null) return;
uint hash;
uint.TryParse(PathNodeStreetHashTextBox.Text, out hash);
var streetname = GlobalText.TryGetString(hash);
PathNodeStreetNameLabel.Text = "Name: " + ((hash == 0) ? "[None]" : (string.IsNullOrEmpty(streetname) ? "[Not found]" : streetname));
lock (ProjectForm.ProjectSyncRoot)
{
if (CurrentPathNode.StreetName.Hash != hash)
{
CurrentPathNode.StreetName = hash;
ProjectForm.SetYndHasChanged(true);
}
}
ProjectForm.ProjectExplorer?.UpdatePathNodeTreeNode(CurrentPathNode);
}
private void PathNodeFlags0UpDown_ValueChanged(object sender, EventArgs e)
{
SetPathNodeFlagsFromUpDowns();
}
private void PathNodeFlags1UpDown_ValueChanged(object sender, EventArgs e)
{
SetPathNodeFlagsFromUpDowns();
}
private void PathNodeFlags2UpDown_ValueChanged(object sender, EventArgs e)
{
SetPathNodeFlagsFromUpDowns();
}
private void PathNodeFlags3UpDown_ValueChanged(object sender, EventArgs e)
{
SetPathNodeFlagsFromUpDowns();
}
private void PathNodeFlags4UpDown_ValueChanged(object sender, EventArgs e)
{
SetPathNodeFlagsFromUpDowns();
}
private void PathNodeFlags5UpDown_ValueChanged(object sender, EventArgs e)
{
SetPathNodeFlagsFromUpDowns();
}
private void PathNodeFlags01CheckBox_CheckedChanged(object sender, EventArgs e)
{
SetPathNodeFlagsFromCheckBoxes();
}
private void PathNodeFlags02CheckBox_CheckedChanged(object sender, EventArgs e)
{
SetPathNodeFlagsFromCheckBoxes();
}
private void PathNodeFlags03CheckBox_CheckedChanged(object sender, EventArgs e)
{
SetPathNodeFlagsFromCheckBoxes();
}
private void PathNodeFlags04CheckBox_CheckedChanged(object sender, EventArgs e)
{
SetPathNodeFlagsFromCheckBoxes();
}
private void PathNodeFlags05CheckBox_CheckedChanged(object sender, EventArgs e)
{
SetPathNodeFlagsFromCheckBoxes();
}
private void PathNodeFlags06CheckBox_CheckedChanged(object sender, EventArgs e)
{
SetPathNodeFlagsFromCheckBoxes();
}
private void PathNodeFlags07CheckBox_CheckedChanged(object sender, EventArgs e)
{
SetPathNodeFlagsFromCheckBoxes();
}
private void PathNodeFlags08CheckBox_CheckedChanged(object sender, EventArgs e)
{
SetPathNodeFlagsFromCheckBoxes();
}
private void PathNodeFlags11CheckBox_CheckedChanged(object sender, EventArgs e)
{
SetPathNodeFlagsFromCheckBoxes();
}
private void PathNodeFlags12CheckBox_CheckedChanged(object sender, EventArgs e)
{
SetPathNodeFlagsFromCheckBoxes();
}
private void PathNodeFlags13CheckBox_CheckedChanged(object sender, EventArgs e)
{
SetPathNodeFlagsFromCheckBoxes();
}
private void PathNodeFlags14CheckBox_CheckedChanged(object sender, EventArgs e)
{
SetPathNodeFlagsFromCheckBoxes();
}
private void PathNodeFlags15CheckBox_CheckedChanged(object sender, EventArgs e)
{
SetPathNodeFlagsFromCheckBoxes();
}
private void PathNodeFlags16CheckBox_CheckedChanged(object sender, EventArgs e)
{
SetPathNodeFlagsFromCheckBoxes();
}
private void PathNodeFlags17CheckBox_CheckedChanged(object sender, EventArgs e)
{
SetPathNodeFlagsFromCheckBoxes();
}
private void PathNodeFlags18CheckBox_CheckedChanged(object sender, EventArgs e)
{
SetPathNodeFlagsFromCheckBoxes();
}
private void PathNodeFlags21CheckBox_CheckedChanged(object sender, EventArgs e)
{
SetPathNodeFlagsFromCheckBoxes();
}
private void PathNodeFlags22CheckBox_CheckedChanged(object sender, EventArgs e)
{
SetPathNodeFlagsFromCheckBoxes();
}
private void PathNodeFlags23CheckBox_CheckedChanged(object sender, EventArgs e)
{
SetPathNodeFlagsFromCheckBoxes();
}
private void PathNodeFlags24CheckBox_CheckedChanged(object sender, EventArgs e)
{
SetPathNodeFlagsFromCheckBoxes();
}
private void PathNodeFlags25CheckBox_CheckedChanged(object sender, EventArgs e)
{
SetPathNodeFlagsFromCheckBoxes();
}
private void PathNodeFlags26CheckBox_CheckedChanged(object sender, EventArgs e)
{
SetPathNodeFlagsFromCheckBoxes();
}
private void PathNodeFlags27CheckBox_CheckedChanged(object sender, EventArgs e)
{
SetPathNodeFlagsFromCheckBoxes();
}
private void PathNodeFlags28CheckBox_CheckedChanged(object sender, EventArgs e)
{
SetPathNodeFlagsFromCheckBoxes();
}
private void PathNodeFlags31CheckBox_CheckedChanged(object sender, EventArgs e)
{
SetPathNodeFlagsFromCheckBoxes();
}
private void PathNodeFlags32UpDown_ValueChanged(object sender, EventArgs e)
{
SetPathNodeFlagsFromCheckBoxes(); //treat this one like checkboxes
}
private void PathNodeFlags51CheckBox_CheckedChanged(object sender, EventArgs e)
{
SetPathNodeFlagsFromCheckBoxes();
}
private void PathNodeFlags41CheckBox_CheckedChanged(object sender, EventArgs e)
{
SetPathNodeFlagsFromCheckBoxes();
}
private void PathNodeFlags45CheckBox_CheckedChanged(object sender, EventArgs e)
{
SetPathNodeFlagsFromCheckBoxes();
}
private void PathNodeFlags46CheckBox_CheckedChanged(object sender, EventArgs e)
{
SetPathNodeFlagsFromCheckBoxes();
}
private void PathNodeFlags47CheckBox_CheckedChanged(object sender, EventArgs e)
{
SetPathNodeFlagsFromCheckBoxes();
}
private void PathNodeFlags48CheckBox_CheckedChanged(object sender, EventArgs e)
{
SetPathNodeFlagsFromCheckBoxes();
}
private void PathNodeFlags42UpDown_ValueChanged(object sender, EventArgs e)
{
SetPathNodeFlagsFromCheckBoxes(); //treat this one like checkboxes
}
private void PathNodeFlags52CheckBox_CheckedChanged(object sender, EventArgs e)
{
SetPathNodeFlagsFromCheckBoxes();
}
private void PathNodeFlags53CheckBox_CheckedChanged(object sender, EventArgs e)
{
SetPathNodeFlagsFromCheckBoxes();
}
private void PathNodeLinksListBox_SelectedIndexChanged(object sender, EventArgs e)
{
CurrentPathLink = PathNodeLinksListBox.SelectedItem as YndLink;
LoadPathNodeLinkPage();
}
private void PathNodeAddLinkButton_Click(object sender, EventArgs e)
{
AddPathLink();
}
private void PathNodeRemoveLinkButton_Click(object sender, EventArgs e)
{
RemovePathLink();
}
private void PathNodeLinkAreaIDUpDown_ValueChanged(object sender, EventArgs e)
{
if (populatingui) return;
if (CurrentPathLink == null) return;
ushort areaid = (ushort)PathNodeLinkAreaIDUpDown.Value;
bool change = false;
lock (ProjectForm.ProjectSyncRoot)
{
if (CurrentPathLink._RawData.AreaID != areaid)
{
CurrentPathLink._RawData.AreaID = areaid;
ProjectForm.SetYndHasChanged(true);
change = true;
}
}
if (change)
{
UpdatePathNodeLinkage();
//refresh the selected item in the list box, to update the text, and the other controls.
PathNodeLinksListBox.Items[PathNodeLinksListBox.SelectedIndex] = PathNodeLinksListBox.SelectedItem;
}
}
private void PathNodeLinkNodeIDUpDown_ValueChanged(object sender, EventArgs e)
{
if (populatingui) return;
if (CurrentPathLink == null) return;
ushort nodeid = (ushort)PathNodeLinkNodeIDUpDown.Value;
bool change = false;
lock (ProjectForm.ProjectSyncRoot)
{
if (CurrentPathLink._RawData.NodeID != nodeid)
{
CurrentPathLink._RawData.NodeID = nodeid;
ProjectForm.SetYndHasChanged(true);
change = true;
}
}
if (change)
{
UpdatePathNodeLinkage();
//refresh the selected item in the list box, to update the text, and the other controls.
PathNodeLinksListBox.Items[PathNodeLinksListBox.SelectedIndex] = PathNodeLinksListBox.SelectedItem;
}
}
private void PathNodeLinkFlags0UpDown_ValueChanged(object sender, EventArgs e)
{
SetPathNodeLinkFlagsFromUpDowns();
}
private void PathNodeLinkFlags1UpDown_ValueChanged(object sender, EventArgs e)
{
SetPathNodeLinkFlagsFromUpDowns();
}
private void PathNodeLinkFlags2UpDown_ValueChanged(object sender, EventArgs e)
{
SetPathNodeLinkFlagsFromUpDowns();
}
private void PathNodeLinkFlags01CheckBox_CheckedChanged(object sender, EventArgs e)
{
SetPathNodeLinkFlagsFromCheckBoxes();
}
private void PathNodeLinkFlags02CheckBox_CheckedChanged(object sender, EventArgs e)
{
SetPathNodeLinkFlagsFromCheckBoxes();
}
private void PathNodeLinkFlags03UpDown_ValueChanged(object sender, EventArgs e)
{
SetPathNodeLinkFlagsFromCheckBoxes();
}
private void PathNodeLinkFlags04UpDown_ValueChanged(object sender, EventArgs e)
{
SetPathNodeLinkFlagsFromCheckBoxes();
}
private void PathNodeLinkFlags11CheckBox_CheckedChanged(object sender, EventArgs e)
{
SetPathNodeLinkFlagsFromCheckBoxes();
}
private void PathNodeLinkFlags12CheckBox_CheckedChanged(object sender, EventArgs e)
{
SetPathNodeLinkFlagsFromCheckBoxes();
}
private void PathNodeLinkFlags13CheckBox_CheckedChanged(object sender, EventArgs e)
{
SetPathNodeLinkFlagsFromCheckBoxes();
}
private void PathNodeLinkFlags14CheckBox_CheckedChanged(object sender, EventArgs e)
{
SetPathNodeLinkFlagsFromCheckBoxes();
}
private void PathNodeLinkFlags18CheckBox_CheckedChanged(object sender, EventArgs e)
{
SetPathNodeLinkFlagsFromCheckBoxes();
}
private void PathNodeLinkOffsetSizeUpDown_ValueChanged(object sender, EventArgs e)
{
SetPathNodeLinkFlagsFromCheckBoxes();
}
private void PathNodeLinkFlags21CheckBox_CheckedChanged(object sender, EventArgs e)
{
SetPathNodeLinkFlagsFromCheckBoxes();
}
private void PathNodeLinkFlags22CheckBox_CheckedChanged(object sender, EventArgs e)
{
SetPathNodeLinkFlagsFromCheckBoxes();
}
private void PathNodeLinkFwdLanesUpDown_ValueChanged(object sender, EventArgs e)
{
SetPathNodeLinkFlagsFromCheckBoxes();
}
private void PathNodeLinkBackLanesUpDown_ValueChanged(object sender, EventArgs e)
{
SetPathNodeLinkFlagsFromCheckBoxes();
}
private void PathNodeLinkLengthUpDown_ValueChanged(object sender, EventArgs e)
{
if (populatingui) return;
if (CurrentPathLink == null) return;
byte length = (byte)PathNodeLinkLengthUpDown.Value;
lock (ProjectForm.ProjectSyncRoot)
{
if (CurrentPathLink.LinkLength.Value != length)
{
CurrentPathLink.LinkLength = length;
CurrentPathLink._RawData.LinkLength = length;
ProjectForm.SetYndHasChanged(true);
}
}
}
private void PathNodeJunctionEnableCheckBox_CheckedChanged(object sender, EventArgs e)
{
if (populatingui) return;
if (CurrentPathNode == null) return;
lock (ProjectForm.ProjectSyncRoot)
{
if (CurrentPathNode.HasJunction != PathNodeJunctionEnableCheckBox.Checked)
{
CurrentPathNode.HasJunction = PathNodeJunctionEnableCheckBox.Checked;
if (CurrentPathNode.HasJunction && (CurrentPathNode.Junction == null))
{
var j = new YndJunction();
//init new junction
j._RawData.HeightmapDimX = 1;
j._RawData.HeightmapDimY = 1;
j.Heightmap = new YndJunctionHeightmap(new byte[] { 255 }, j);
j.RefData = new NodeJunctionRef() { AreaID = (ushort)CurrentPathNode.AreaID, NodeID = (ushort)CurrentPathNode.NodeID };
CurrentPathNode.Junction = j;
}
ProjectForm.SetYndHasChanged(true);
}
}
LoadPathNodeJunctionPage();
}
private void PathNodeJunctionMaxZUpDown_ValueChanged(object sender, EventArgs e)
{
if (populatingui) return;
if (CurrentPathNode == null) return;
if (CurrentPathNode.Junction == null) return;
short val = (short)PathNodeJunctionMaxZUpDown.Value;
lock (ProjectForm.ProjectSyncRoot)
{
if (CurrentPathNode.Junction.MaxZ != val)
{
CurrentPathNode.Junction.MaxZ = val;
CurrentPathNode.Junction._RawData.MaxZ = val;
ProjectForm.SetYndHasChanged(true);
}
}
}
private void PathNodeJunctionMinZUpDown_ValueChanged(object sender, EventArgs e)
{
if (populatingui) return;
if (CurrentPathNode == null) return;
if (CurrentPathNode.Junction == null) return;
short val = (short)PathNodeJunctionMinZUpDown.Value;
lock (ProjectForm.ProjectSyncRoot)
{
if (CurrentPathNode.Junction.MinZ != val)
{
CurrentPathNode.Junction.MinZ = val;
CurrentPathNode.Junction._RawData.MinZ = val;
ProjectForm.SetYndHasChanged(true);
}
}
}
private void PathNodeJunctionPosXUpDown_ValueChanged(object sender, EventArgs e)
{
if (populatingui) return;
if (CurrentPathNode == null) return;
if (CurrentPathNode.Junction == null) return;
short val = (short)PathNodeJunctionPosXUpDown.Value;
lock (ProjectForm.ProjectSyncRoot)
{
if (CurrentPathNode.Junction.PositionX != val)
{
CurrentPathNode.Junction.PositionX = val;
CurrentPathNode.Junction._RawData.PositionX = val;
ProjectForm.SetYndHasChanged(true);
}
}
}
private void PathNodeJunctionPosYUpDown_ValueChanged(object sender, EventArgs e)
{
if (populatingui) return;
if (CurrentPathNode == null) return;
if (CurrentPathNode.Junction == null) return;
short val = (short)PathNodeJunctionPosYUpDown.Value;
lock (ProjectForm.ProjectSyncRoot)
{
if (CurrentPathNode.Junction.PositionY != val)
{
CurrentPathNode.Junction.PositionY = val;
CurrentPathNode.Junction._RawData.PositionY = val;
ProjectForm.SetYndHasChanged(true);
}
}
}
private void PathNodeJunctionHeightmapDimXUpDown_ValueChanged(object sender, EventArgs e)
{
if (populatingui) return;
if (CurrentPathNode == null) return;
if (CurrentPathNode.Junction == null) return;
byte val = (byte)PathNodeJunctionHeightmapDimXUpDown.Value;
lock (ProjectForm.ProjectSyncRoot)
{
if (CurrentPathNode.Junction._RawData.HeightmapDimX != val)
{
CurrentPathNode.Junction._RawData.HeightmapDimX = val;
CurrentPathNode.Junction.ResizeHeightmap();
ProjectForm.SetYndHasChanged(true);
}
}
LoadPathNodeJunctionPage();
}
private void PathNodeJunctionHeightmapDimYUpDown_ValueChanged(object sender, EventArgs e)
{
if (populatingui) return;
if (CurrentPathNode == null) return;
if (CurrentPathNode.Junction == null) return;
byte val = (byte)PathNodeJunctionHeightmapDimYUpDown.Value;
lock (ProjectForm.ProjectSyncRoot)
{
if (CurrentPathNode.Junction._RawData.HeightmapDimY != val)
{
CurrentPathNode.Junction._RawData.HeightmapDimY = val;
CurrentPathNode.Junction.ResizeHeightmap();
ProjectForm.SetYndHasChanged(true);
}
}
LoadPathNodeJunctionPage();
}
private void PathNodeJunctionHeightmapBytesTextBox_TextChanged(object sender, EventArgs e)
{
if (populatingui) return;
if (CurrentPathNode == null) return;
if (CurrentPathNode.Junction == null) return;
lock (ProjectForm.ProjectSyncRoot)
{
CurrentPathNode.Junction.SetHeightmap(PathNodeJunctionHeightmapBytesTextBox.Text);
ProjectForm.SetYndHasChanged(true);
}
//LoadPathNodeJunctionPage();
}
}
}