Multi-select update graphics, fix for multi-move path nodes

This commit is contained in:
dexyfex 2017-09-26 12:07:45 +10:00
parent bac531208c
commit 24370c1b5d
3 changed files with 59 additions and 7 deletions

View File

@ -827,9 +827,9 @@ namespace CodeWalker.GameFiles
_RawData.PositionZ = (short)(pos.Z * 32.0f); _RawData.PositionZ = (short)(pos.Z * 32.0f);
Vector3 newpos = pos; Vector3 newpos = pos;
newpos.X = _RawData.PositionX / 4.0f; //newpos.X = _RawData.PositionX / 4.0f;
newpos.Y = _RawData.PositionY / 4.0f; //newpos.Y = _RawData.PositionY / 4.0f;
newpos.Z = _RawData.PositionZ / 32.0f; //newpos.Z = _RawData.PositionZ / 32.0f;
Position = newpos; Position = newpos;
UpdateLinkLengths(); UpdateLinkLengths();

View File

@ -29,12 +29,14 @@ namespace CodeWalker.Project
public Vector3 StartPosition { get; set; } public Vector3 StartPosition { get; set; }
public Vector3 EndPosition { get; set; } public Vector3 EndPosition { get; set; }
public MultiPositionUndoStep(MapSelection multiSel, MapSelection[] items, Vector3 startpos) public MultiPositionUndoStep(MapSelection multiSel, MapSelection[] items, Vector3 startpos, WorldForm wf)
{ {
Selection = multiSel; Selection = multiSel;
Items = items; Items = items;
StartPosition = startpos; StartPosition = startpos;
EndPosition = multiSel.WidgetPosition; EndPosition = multiSel.WidgetPosition;
UpdateGraphics(wf);
} }
private void Update(WorldForm wf, ref MapSelection sel, Vector3 p, Vector3 o) private void Update(WorldForm wf, ref MapSelection sel, Vector3 p, Vector3 o)
@ -51,8 +53,54 @@ namespace CodeWalker.Project
wf.SelectMulti(Items); wf.SelectMulti(Items);
wf.SetWidgetPosition(p); wf.SetWidgetPosition(p);
UpdateGraphics(wf);
} }
private void UpdateGraphics(WorldForm wf)
{
Dictionary<YndFile, int> pathYnds = new Dictionary<YndFile, int>();
Dictionary<TrainTrack, int> trainTracks = new Dictionary<TrainTrack, int>();
Dictionary<YmtFile, int> scenarioYmts = new Dictionary<YmtFile, int>();
if (Items != null)
{
foreach (var item in Items)
{
if (item.PathNode != null)
{
pathYnds[item.PathNode.Ynd] = 1;
}
if (item.TrainTrackNode != null)
{
trainTracks[item.TrainTrackNode.Track] = 1;
}
if (item.ScenarioNode != null)
{
scenarioYmts[item.ScenarioNode.Ymt] = 1;
}
}
}
foreach (var kvp in pathYnds)
{
wf.UpdatePathYndGraphics(kvp.Key, true);
}
foreach (var kvp in trainTracks)
{
wf.UpdateTrainTrackGraphics(kvp.Key, false);
}
foreach (var kvp in scenarioYmts)
{
wf.UpdateScenarioGraphics(kvp.Key, false);
}
}
public override void Undo(WorldForm wf, ref MapSelection sel) public override void Undo(WorldForm wf, ref MapSelection sel)
{ {
Update(wf, ref sel, StartPosition, EndPosition); Update(wf, ref sel, StartPosition, EndPosition);

View File

@ -3470,11 +3470,11 @@ namespace CodeWalker
} }
else else
{ {
var dpos = newpos - oldpos;
for (int i = 0; i < SelectedItems.Count; i++) for (int i = 0; i < SelectedItems.Count; i++)
{ {
var refpos = SelectedItems[i].WidgetPosition; var refpos = SelectedItems[i].WidgetPosition;
var relpos = refpos - oldpos; SelectedItems[i].SetPosition(refpos + dpos, refpos, false);
SelectedItems[i].SetPosition(relpos + newpos, refpos, false);
} }
SelectedItem.MultipleSelectionCenter = newpos; SelectedItem.MultipleSelectionCenter = newpos;
} }
@ -3586,6 +3586,9 @@ namespace CodeWalker
{ {
if (fullupdate) if (fullupdate)
{ {
ynd.UpdateAllNodePositions();
ynd.BuildBVH();
space.BuildYndData(ynd); space.BuildYndData(ynd);
} }
else else
@ -3618,6 +3621,7 @@ namespace CodeWalker
public void UpdateTrainTrackGraphics(TrainTrack tt, bool fullupdate) public void UpdateTrainTrackGraphics(TrainTrack tt, bool fullupdate)
{ {
tt.BuildVertices(); tt.BuildVertices();
tt.BuildBVH();
//if (fullupdate) //if (fullupdate)
//{ //{
// //space.BuildYndData(ynd); // //space.BuildYndData(ynd);
@ -6347,7 +6351,7 @@ namespace CodeWalker
{ {
switch (tw.Mode) switch (tw.Mode)
{ {
case WidgetMode.Position: s = new MultiPositionUndoStep(SelectedItem, SelectedItems.ToArray(), UndoStartPosition); break; case WidgetMode.Position: s = new MultiPositionUndoStep(SelectedItem, SelectedItems.ToArray(), UndoStartPosition, this); break;
} }
} }
else if (ent != null) else if (ent != null)