Multi-selection, move, undo/redo

This commit is contained in:
dexyfex 2017-09-26 10:27:18 +10:00
parent 1a2af6af9e
commit bac531208c
7 changed files with 885 additions and 471 deletions

View File

@ -46,6 +46,7 @@
this.ToolsDetailsTabPage = new System.Windows.Forms.TabPage(); this.ToolsDetailsTabPage = new System.Windows.Forms.TabPage();
this.DetailsPropertyGrid = new CodeWalker.WinForms.ReadOnlyPropertyGrid(); this.DetailsPropertyGrid = new CodeWalker.WinForms.ReadOnlyPropertyGrid();
this.ToolsOptionsTabPage = new System.Windows.Forms.TabPage(); this.ToolsOptionsTabPage = new System.Windows.Forms.TabPage();
this.SkeletonsCheckBox = new System.Windows.Forms.CheckBox();
this.TimeOfDayLabel = new System.Windows.Forms.Label(); this.TimeOfDayLabel = new System.Windows.Forms.Label();
this.label19 = new System.Windows.Forms.Label(); this.label19 = new System.Windows.Forms.Label();
this.TimeOfDayTrackBar = new System.Windows.Forms.TrackBar(); this.TimeOfDayTrackBar = new System.Windows.Forms.TrackBar();
@ -72,7 +73,6 @@
this.ToolsPanelHideButton = new System.Windows.Forms.Button(); this.ToolsPanelHideButton = new System.Windows.Forms.Button();
this.ToolsDragPanel = new System.Windows.Forms.Panel(); this.ToolsDragPanel = new System.Windows.Forms.Panel();
this.ToolsPanelShowButton = new System.Windows.Forms.Button(); this.ToolsPanelShowButton = new System.Windows.Forms.Button();
this.SkeletonsCheckBox = new System.Windows.Forms.CheckBox();
this.StatusStrip.SuspendLayout(); this.StatusStrip.SuspendLayout();
this.ConsolePanel.SuspendLayout(); this.ConsolePanel.SuspendLayout();
this.ToolsPanel.SuspendLayout(); this.ToolsPanel.SuspendLayout();
@ -284,6 +284,19 @@
this.ToolsOptionsTabPage.Text = "Options"; this.ToolsOptionsTabPage.Text = "Options";
this.ToolsOptionsTabPage.UseVisualStyleBackColor = true; this.ToolsOptionsTabPage.UseVisualStyleBackColor = true;
// //
// SkeletonsCheckBox
//
this.SkeletonsCheckBox.AutoSize = true;
this.SkeletonsCheckBox.Checked = true;
this.SkeletonsCheckBox.CheckState = System.Windows.Forms.CheckState.Checked;
this.SkeletonsCheckBox.Location = new System.Drawing.Point(19, 444);
this.SkeletonsCheckBox.Name = "SkeletonsCheckBox";
this.SkeletonsCheckBox.Size = new System.Drawing.Size(103, 17);
this.SkeletonsCheckBox.TabIndex = 21;
this.SkeletonsCheckBox.Text = "Show Skeletons";
this.SkeletonsCheckBox.UseVisualStyleBackColor = true;
this.SkeletonsCheckBox.CheckedChanged += new System.EventHandler(this.SkeletonsCheckBox_CheckedChanged);
//
// TimeOfDayLabel // TimeOfDayLabel
// //
this.TimeOfDayLabel.AutoSize = true; this.TimeOfDayLabel.AutoSize = true;
@ -591,19 +604,6 @@
this.ToolsPanelShowButton.UseVisualStyleBackColor = true; this.ToolsPanelShowButton.UseVisualStyleBackColor = true;
this.ToolsPanelShowButton.Click += new System.EventHandler(this.ToolsPanelShowButton_Click); this.ToolsPanelShowButton.Click += new System.EventHandler(this.ToolsPanelShowButton_Click);
// //
// SkeletonsCheckBox
//
this.SkeletonsCheckBox.AutoSize = true;
this.SkeletonsCheckBox.Checked = true;
this.SkeletonsCheckBox.CheckState = System.Windows.Forms.CheckState.Checked;
this.SkeletonsCheckBox.Location = new System.Drawing.Point(19, 444);
this.SkeletonsCheckBox.Name = "SkeletonsCheckBox";
this.SkeletonsCheckBox.Size = new System.Drawing.Size(103, 17);
this.SkeletonsCheckBox.TabIndex = 21;
this.SkeletonsCheckBox.Text = "Show Skeletons";
this.SkeletonsCheckBox.UseVisualStyleBackColor = true;
this.SkeletonsCheckBox.CheckedChanged += new System.EventHandler(this.SkeletonsCheckBox_CheckedChanged);
//
// ModelForm // ModelForm
// //
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
@ -618,6 +618,7 @@
this.KeyPreview = true; this.KeyPreview = true;
this.Name = "ModelForm"; this.Name = "ModelForm";
this.Text = "View Model - CodeWalker by dexyfex"; this.Text = "View Model - CodeWalker by dexyfex";
this.Deactivate += new System.EventHandler(this.ModelForm_Deactivate);
this.Load += new System.EventHandler(this.ModelForm_Load); this.Load += new System.EventHandler(this.ModelForm_Load);
this.KeyDown += new System.Windows.Forms.KeyEventHandler(this.ModelForm_KeyDown); this.KeyDown += new System.Windows.Forms.KeyEventHandler(this.ModelForm_KeyDown);
this.KeyUp += new System.Windows.Forms.KeyEventHandler(this.ModelForm_KeyUp); this.KeyUp += new System.Windows.Forms.KeyEventHandler(this.ModelForm_KeyUp);

View File

@ -2277,28 +2277,6 @@ namespace CodeWalker.Forms
} }
private void StatsUpdateTimer_Tick(object sender, EventArgs e)
{
int rgc = (shaders != null) ? shaders.RenderedGeometries : 0;
int crc = renderableCache.LoadedRenderableCount;
int ctc = renderableCache.LoadedTextureCount;
int tcrc = renderableCache.MemCachedRenderableCount;
int tctc = renderableCache.MemCachedTextureCount;
long vr = renderableCache.TotalGraphicsMemoryUse + (shaders != null ? shaders.TotalGraphicsMemoryUse : 0);
string vram = TextUtil.GetBytesReadable(vr);
//StatsLabel.Text = string.Format("Drawn: {0} geom, Loaded: {1}/{5} dr, {2}/{6} tx, Vram: {3}, Fps: {4}", rgc, crc, ctc, vram, fps, tcrc, tctc);
StatsLabel.Text = string.Format("Drawn: {0} geom, Loaded: {1} dr, {2} tx, Vram: {3}, Fps: {4}", rgc, crc, ctc, vram, fps);
if (timerunning)
{
float fv = timeofday * 60.0f;
//TimeOfDayTrackBar.Value = (int)fv;
UpdateTimeOfDayLabel();
}
//CameraPositionTextBox.Text = FloatUtil.GetVector3String(camera.Position, "0.##");
}
private void ModelForm_KeyDown(object sender, KeyEventArgs e) private void ModelForm_KeyDown(object sender, KeyEventArgs e)
{ {
if (ActiveControl is TextBox) if (ActiveControl is TextBox)
@ -2470,6 +2448,40 @@ namespace CodeWalker.Forms
//} //}
} }
private void ModelForm_Deactivate(object sender, EventArgs e)
{
//try not to lock keyboard movement if the form loses focus.
kbmovefwd = false;
kbmovebck = false;
kbmovelft = false;
kbmovergt = false;
kbmoveup = false;
kbmovedn = false;
kbjump = false;
}
private void StatsUpdateTimer_Tick(object sender, EventArgs e)
{
int rgc = (shaders != null) ? shaders.RenderedGeometries : 0;
int crc = renderableCache.LoadedRenderableCount;
int ctc = renderableCache.LoadedTextureCount;
int tcrc = renderableCache.MemCachedRenderableCount;
int tctc = renderableCache.MemCachedTextureCount;
long vr = renderableCache.TotalGraphicsMemoryUse + (shaders != null ? shaders.TotalGraphicsMemoryUse : 0);
string vram = TextUtil.GetBytesReadable(vr);
//StatsLabel.Text = string.Format("Drawn: {0} geom, Loaded: {1}/{5} dr, {2}/{6} tx, Vram: {3}, Fps: {4}", rgc, crc, ctc, vram, fps, tcrc, tctc);
StatsLabel.Text = string.Format("Drawn: {0} geom, Loaded: {1} dr, {2} tx, Vram: {3}, Fps: {4}", rgc, crc, ctc, vram, fps);
if (timerunning)
{
float fv = timeofday * 60.0f;
//TimeOfDayTrackBar.Value = (int)fv;
UpdateTimeOfDayLabel();
}
//CameraPositionTextBox.Text = FloatUtil.GetVector3String(camera.Position, "0.##");
}
private void ToolsPanelShowButton_Click(object sender, EventArgs e) private void ToolsPanelShowButton_Click(object sender, EventArgs e)
{ {
ToolsPanel.Visible = true; ToolsPanel.Visible = true;

View File

@ -13,14 +13,64 @@ namespace CodeWalker.Project
{ {
//revert the object to the state marked at the start of this step //revert the object to the state marked at the start of this step
public abstract void Undo(WorldForm wf, ProjectForm pf, ref MapSelection sel); public abstract void Undo(WorldForm wf, ref MapSelection sel);
//revert the object to the state marked at the end of this step //revert the object to the state marked at the end of this step
public abstract void Redo(WorldForm wf, ProjectForm pf, ref MapSelection sel); public abstract void Redo(WorldForm wf, ref MapSelection sel);
} }
public class MultiPositionUndoStep : UndoStep
{
private MapSelection Selection;
private MapSelection[] Items;
public Vector3 StartPosition { get; set; }
public Vector3 EndPosition { get; set; }
public MultiPositionUndoStep(MapSelection multiSel, MapSelection[] items, Vector3 startpos)
{
Selection = multiSel;
Items = items;
StartPosition = startpos;
EndPosition = multiSel.WidgetPosition;
}
private void Update(WorldForm wf, ref MapSelection sel, Vector3 p, Vector3 o)
{
//update selection items positions for new widget position p
Vector3 dp = p - o;
for (int i = 0; i < Items.Length; i++)
{
var refpos = Items[i].WidgetPosition;
Items[i].SetPosition(refpos + dp, refpos, false);
}
sel.MultipleSelectionCenter = p; //center used for widget pos...
wf.SelectMulti(Items);
wf.SetWidgetPosition(p);
}
public override void Undo(WorldForm wf, ref MapSelection sel)
{
Update(wf, ref sel, StartPosition, EndPosition);
}
public override void Redo(WorldForm wf, ref MapSelection sel)
{
Update(wf, ref sel, EndPosition, StartPosition);
}
public override string ToString()
{
return (Items?.Length ?? 0).ToString() + " items: Position";
}
}
public class EntityPositionUndoStep : UndoStep public class EntityPositionUndoStep : UndoStep
{ {
public YmapEntityDef Entity { get; set; } public YmapEntityDef Entity { get; set; }
@ -34,26 +84,22 @@ namespace CodeWalker.Project
EndPosition = ent?.WidgetPosition ?? Vector3.Zero; EndPosition = ent?.WidgetPosition ?? Vector3.Zero;
} }
private void Update(WorldForm wf, ProjectForm pf, ref MapSelection sel, Vector3 p) private void Update(WorldForm wf, ref MapSelection sel, Vector3 p)
{ {
Entity?.SetPositionFromWidget(p); Entity?.SetPositionFromWidget(p);
if (Entity != sel.EntityDef) wf.SelectEntity(Entity); if (Entity != sel.EntityDef) wf.SelectEntity(Entity);
wf.SetWidgetPosition(Entity.WidgetPosition); wf.SetWidgetPosition(Entity.WidgetPosition);
if ((Entity != null) && (pf != null))
{
pf.OnWorldEntityModified(Entity);
}
} }
public override void Undo(WorldForm wf, ProjectForm pf, ref MapSelection sel) public override void Undo(WorldForm wf, ref MapSelection sel)
{ {
Update(wf, pf, ref sel, StartPosition); Update(wf, ref sel, StartPosition);
} }
public override void Redo(WorldForm wf, ProjectForm pf, ref MapSelection sel) public override void Redo(WorldForm wf, ref MapSelection sel)
{ {
Update(wf, pf, ref sel, EndPosition); Update(wf, ref sel, EndPosition);
} }
public override string ToString() public override string ToString()
@ -76,27 +122,23 @@ namespace CodeWalker.Project
} }
private void Update(WorldForm wf, ProjectForm pf, ref MapSelection sel, Quaternion q) private void Update(WorldForm wf, ref MapSelection sel, Quaternion q)
{ {
Entity?.SetOrientationFromWidget(q); Entity?.SetOrientationFromWidget(q);
if (Entity != sel.EntityDef) wf.SelectEntity(Entity); if (Entity != sel.EntityDef) wf.SelectEntity(Entity);
wf.SetWidgetRotation(q); wf.SetWidgetRotation(q);
if ((Entity != null) && (pf != null))
{
pf.OnWorldEntityModified(Entity);
}
} }
public override void Undo(WorldForm wf, ProjectForm pf, ref MapSelection sel) public override void Undo(WorldForm wf, ref MapSelection sel)
{ {
Update(wf, pf, ref sel, StartRotation); Update(wf, ref sel, StartRotation);
} }
public override void Redo(WorldForm wf, ProjectForm pf, ref MapSelection sel) public override void Redo(WorldForm wf, ref MapSelection sel)
{ {
Update(wf, pf, ref sel, EndRotation); Update(wf, ref sel, EndRotation);
} }
public override string ToString() public override string ToString()
@ -119,27 +161,23 @@ namespace CodeWalker.Project
} }
private void Update(WorldForm wf, ProjectForm pf, ref MapSelection sel, Vector3 s) private void Update(WorldForm wf, ref MapSelection sel, Vector3 s)
{ {
Entity?.SetScale(s); Entity?.SetScale(s);
if (Entity != sel.EntityDef) wf.SelectEntity(Entity); if (Entity != sel.EntityDef) wf.SelectEntity(Entity);
wf.SetWidgetScale(s); wf.SetWidgetScale(s);
if ((Entity != null) && (pf != null))
{
pf.OnWorldEntityModified(Entity);
}
} }
public override void Undo(WorldForm wf, ProjectForm pf, ref MapSelection sel) public override void Undo(WorldForm wf, ref MapSelection sel)
{ {
Update(wf, pf, ref sel, StartScale); Update(wf, ref sel, StartScale);
} }
public override void Redo(WorldForm wf, ProjectForm pf, ref MapSelection sel) public override void Redo(WorldForm wf, ref MapSelection sel)
{ {
Update(wf, pf, ref sel, EndScale); Update(wf, ref sel, EndScale);
} }
public override string ToString() public override string ToString()
@ -162,26 +200,22 @@ namespace CodeWalker.Project
EndPosition = ent?.WidgetPosition ?? Vector3.Zero; EndPosition = ent?.WidgetPosition ?? Vector3.Zero;
} }
private void Update(WorldForm wf, ProjectForm pf, ref MapSelection sel, Vector3 p) private void Update(WorldForm wf, ref MapSelection sel, Vector3 p)
{ {
Entity?.SetPivotPositionFromWidget(p); Entity?.SetPivotPositionFromWidget(p);
if (Entity != sel.EntityDef) wf.SelectEntity(Entity); if (Entity != sel.EntityDef) wf.SelectEntity(Entity);
wf.SetWidgetPosition(p); wf.SetWidgetPosition(p);
if ((Entity != null) && (pf != null))
{
pf.OnWorldEntityModified(Entity);
}
} }
public override void Undo(WorldForm wf, ProjectForm pf, ref MapSelection sel) public override void Undo(WorldForm wf, ref MapSelection sel)
{ {
Update(wf, pf, ref sel, StartPosition); Update(wf, ref sel, StartPosition);
} }
public override void Redo(WorldForm wf, ProjectForm pf, ref MapSelection sel) public override void Redo(WorldForm wf, ref MapSelection sel)
{ {
Update(wf, pf, ref sel, EndPosition); Update(wf, ref sel, EndPosition);
} }
public override string ToString() public override string ToString()
@ -204,27 +238,23 @@ namespace CodeWalker.Project
} }
private void Update(WorldForm wf, ProjectForm pf, ref MapSelection sel, Quaternion q) private void Update(WorldForm wf, ref MapSelection sel, Quaternion q)
{ {
Entity?.SetPivotOrientationFromWidget(q); Entity?.SetPivotOrientationFromWidget(q);
if (Entity != sel.EntityDef) wf.SelectEntity(Entity); if (Entity != sel.EntityDef) wf.SelectEntity(Entity);
wf.SetWidgetRotation(q); wf.SetWidgetRotation(q);
if ((Entity != null) && (pf != null))
{
pf.OnWorldEntityModified(Entity);
}
} }
public override void Undo(WorldForm wf, ProjectForm pf, ref MapSelection sel) public override void Undo(WorldForm wf, ref MapSelection sel)
{ {
Update(wf, pf, ref sel, StartRotation); Update(wf, ref sel, StartRotation);
} }
public override void Redo(WorldForm wf, ProjectForm pf, ref MapSelection sel) public override void Redo(WorldForm wf, ref MapSelection sel)
{ {
Update(wf, pf, ref sel, EndRotation); Update(wf, ref sel, EndRotation);
} }
public override string ToString() public override string ToString()
@ -248,26 +278,22 @@ namespace CodeWalker.Project
EndPosition = cargen?.Position ?? Vector3.Zero; EndPosition = cargen?.Position ?? Vector3.Zero;
} }
private void Update(WorldForm wf, ProjectForm pf, ref MapSelection sel, Vector3 p) private void Update(WorldForm wf, ref MapSelection sel, Vector3 p)
{ {
CarGen?.SetPosition(p); CarGen?.SetPosition(p);
if (CarGen != sel.CarGenerator) wf.SelectCarGen(CarGen); if (CarGen != sel.CarGenerator) wf.SelectCarGen(CarGen);
wf.SetWidgetPosition(p); wf.SetWidgetPosition(p);
if ((CarGen != null) && (pf != null))
{
pf.OnWorldCarGenModified(CarGen);
}
} }
public override void Undo(WorldForm wf, ProjectForm pf, ref MapSelection sel) public override void Undo(WorldForm wf, ref MapSelection sel)
{ {
Update(wf, pf, ref sel, StartPosition); Update(wf, ref sel, StartPosition);
} }
public override void Redo(WorldForm wf, ProjectForm pf, ref MapSelection sel) public override void Redo(WorldForm wf, ref MapSelection sel)
{ {
Update(wf, pf, ref sel, EndPosition); Update(wf, ref sel, EndPosition);
} }
public override string ToString() public override string ToString()
@ -290,26 +316,22 @@ namespace CodeWalker.Project
} }
private void Update(WorldForm wf, ProjectForm pf, ref MapSelection sel, Quaternion q) private void Update(WorldForm wf, ref MapSelection sel, Quaternion q)
{ {
CarGen?.SetOrientation(q); CarGen?.SetOrientation(q);
if (CarGen != sel.CarGenerator) wf.SelectCarGen(CarGen); if (CarGen != sel.CarGenerator) wf.SelectCarGen(CarGen);
wf.SetWidgetRotation(q); wf.SetWidgetRotation(q);
if ((CarGen != null) && (pf != null))
{
pf.OnWorldCarGenModified(CarGen);
}
} }
public override void Undo(WorldForm wf, ProjectForm pf, ref MapSelection sel) public override void Undo(WorldForm wf, ref MapSelection sel)
{ {
Update(wf, pf, ref sel, StartRotation); Update(wf, ref sel, StartRotation);
} }
public override void Redo(WorldForm wf, ProjectForm pf, ref MapSelection sel) public override void Redo(WorldForm wf, ref MapSelection sel)
{ {
Update(wf, pf, ref sel, EndRotation); Update(wf, ref sel, EndRotation);
} }
public override string ToString() public override string ToString()
@ -331,27 +353,23 @@ namespace CodeWalker.Project
EndScale = new Vector3(cargen?._CCarGen.perpendicularLength ?? 1.0f); EndScale = new Vector3(cargen?._CCarGen.perpendicularLength ?? 1.0f);
} }
private void Update(WorldForm wf, ProjectForm pf, ref MapSelection sel, Vector3 s) private void Update(WorldForm wf, ref MapSelection sel, Vector3 s)
{ {
CarGen?.SetScale(s); CarGen?.SetScale(s);
if (CarGen != sel.CarGenerator) wf.SelectCarGen(CarGen); if (CarGen != sel.CarGenerator) wf.SelectCarGen(CarGen);
wf.SetWidgetScale(s); wf.SetWidgetScale(s);
if ((CarGen != null) && (pf != null))
{
pf.OnWorldCarGenModified(CarGen);
}
} }
public override void Undo(WorldForm wf, ProjectForm pf, ref MapSelection sel) public override void Undo(WorldForm wf, ref MapSelection sel)
{ {
Update(wf, pf, ref sel, StartScale); Update(wf, ref sel, StartScale);
} }
public override void Redo(WorldForm wf, ProjectForm pf, ref MapSelection sel) public override void Redo(WorldForm wf, ref MapSelection sel)
{ {
Update(wf, pf, ref sel, EndScale); Update(wf, ref sel, EndScale);
} }
public override string ToString() public override string ToString()
@ -368,16 +386,16 @@ namespace CodeWalker.Project
public Vector3 StartPosition { get; set; } public Vector3 StartPosition { get; set; }
public Vector3 EndPosition { get; set; } public Vector3 EndPosition { get; set; }
public PathNodePositionUndoStep(YndNode pathnode, Vector3 startpos, WorldForm wf, ProjectForm pf) public PathNodePositionUndoStep(YndNode pathnode, Vector3 startpos, WorldForm wf)
{ {
PathNode = pathnode; PathNode = pathnode;
StartPosition = startpos; StartPosition = startpos;
EndPosition = pathnode?.Position ?? Vector3.Zero; EndPosition = pathnode?.Position ?? Vector3.Zero;
UpdateGraphics(wf, pf); //forces the update of the path graphics when it's moved... UpdateGraphics(wf); //forces the update of the path graphics when it's moved...
} }
private void Update(WorldForm wf, ProjectForm pf, ref MapSelection sel, Vector3 p) private void Update(WorldForm wf, ref MapSelection sel, Vector3 p)
{ {
PathNode?.SetPosition(p); PathNode?.SetPosition(p);
@ -395,31 +413,27 @@ namespace CodeWalker.Project
wf.SetWidgetPosition(p); wf.SetWidgetPosition(p);
UpdateGraphics(wf, pf); UpdateGraphics(wf);
} }
private void UpdateGraphics(WorldForm wf, ProjectForm pf) private void UpdateGraphics(WorldForm wf)
{ {
if (PathNode != null) if (PathNode != null)
{ {
//Ynd graphics needs to be updated..... //Ynd graphics needs to be updated.....
wf.UpdatePathNodeGraphics(PathNode, false); wf.UpdatePathNodeGraphics(PathNode, false);
if (pf != null) //make sure to update the project form UI..
{
pf.OnWorldPathNodeModified(PathNode, null);
}
} }
} }
public override void Undo(WorldForm wf, ProjectForm pf, ref MapSelection sel) public override void Undo(WorldForm wf, ref MapSelection sel)
{ {
Update(wf, pf, ref sel, StartPosition); Update(wf, ref sel, StartPosition);
} }
public override void Redo(WorldForm wf, ProjectForm pf, ref MapSelection sel) public override void Redo(WorldForm wf, ref MapSelection sel)
{ {
Update(wf, pf, ref sel, EndPosition); Update(wf, ref sel, EndPosition);
} }
public override string ToString() public override string ToString()
@ -435,16 +449,16 @@ namespace CodeWalker.Project
public Vector3 StartPosition { get; set; } public Vector3 StartPosition { get; set; }
public Vector3 EndPosition { get; set; } public Vector3 EndPosition { get; set; }
public TrainTrackNodePositionUndoStep(TrainTrackNode node, Vector3 startpos, WorldForm wf, ProjectForm pf) public TrainTrackNodePositionUndoStep(TrainTrackNode node, Vector3 startpos, WorldForm wf)
{ {
Node = node; Node = node;
StartPosition = startpos; StartPosition = startpos;
EndPosition = node?.Position ?? Vector3.Zero; EndPosition = node?.Position ?? Vector3.Zero;
UpdateGraphics(wf, pf); //forces the update of the path graphics when it's moved... UpdateGraphics(wf); //forces the update of the path graphics when it's moved...
} }
private void Update(WorldForm wf, ProjectForm pf, ref MapSelection sel, Vector3 p) private void Update(WorldForm wf, ref MapSelection sel, Vector3 p)
{ {
Node?.SetPosition(p); Node?.SetPosition(p);
@ -455,31 +469,27 @@ namespace CodeWalker.Project
wf.SetWidgetPosition(p); wf.SetWidgetPosition(p);
UpdateGraphics(wf, pf); UpdateGraphics(wf);
} }
private void UpdateGraphics(WorldForm wf, ProjectForm pf) private void UpdateGraphics(WorldForm wf)
{ {
if (Node != null) if (Node != null)
{ {
//Ynd graphics needs to be updated..... //Ynd graphics needs to be updated.....
wf.UpdateTrainTrackNodeGraphics(Node, false); wf.UpdateTrainTrackNodeGraphics(Node, false);
if (pf != null) //make sure to update the project form UI..
{
pf.OnWorldTrainNodeModified(Node);
}
} }
} }
public override void Undo(WorldForm wf, ProjectForm pf, ref MapSelection sel) public override void Undo(WorldForm wf, ref MapSelection sel)
{ {
Update(wf, pf, ref sel, StartPosition); Update(wf, ref sel, StartPosition);
} }
public override void Redo(WorldForm wf, ProjectForm pf, ref MapSelection sel) public override void Redo(WorldForm wf, ref MapSelection sel)
{ {
Update(wf, pf, ref sel, EndPosition); Update(wf, ref sel, EndPosition);
} }
public override string ToString() public override string ToString()
@ -497,46 +507,42 @@ namespace CodeWalker.Project
public Vector3 StartPosition { get; set; } public Vector3 StartPosition { get; set; }
public Vector3 EndPosition { get; set; } public Vector3 EndPosition { get; set; }
public ScenarioNodePositionUndoStep(ScenarioNode node, Vector3 startpos, WorldForm wf, ProjectForm pf) public ScenarioNodePositionUndoStep(ScenarioNode node, Vector3 startpos, WorldForm wf)
{ {
ScenarioNode = node; ScenarioNode = node;
StartPosition = startpos; StartPosition = startpos;
EndPosition = node?.Position ?? Vector3.Zero; EndPosition = node?.Position ?? Vector3.Zero;
UpdateGraphics(wf, pf); //forces the update of the path graphics when it's moved... UpdateGraphics(wf); //forces the update of the path graphics when it's moved...
} }
private void Update(WorldForm wf, ProjectForm pf, ref MapSelection sel, Vector3 p) private void Update(WorldForm wf, ref MapSelection sel, Vector3 p)
{ {
ScenarioNode?.SetPosition(p); ScenarioNode?.SetPosition(p);
if (ScenarioNode != sel.ScenarioNode) wf.SelectScenarioNode(ScenarioNode); if (ScenarioNode != sel.ScenarioNode) wf.SelectScenarioNode(ScenarioNode);
wf.SetWidgetPosition(p); wf.SetWidgetPosition(p);
UpdateGraphics(wf, pf); UpdateGraphics(wf);
} }
private void UpdateGraphics(WorldForm wf, ProjectForm pf) private void UpdateGraphics(WorldForm wf)
{ {
if (ScenarioNode != null) if (ScenarioNode != null)
{ {
//Ymt graphics needs to be updated..... //Ymt graphics needs to be updated.....
wf.UpdateScenarioGraphics(ScenarioNode.Ymt, false); wf.UpdateScenarioGraphics(ScenarioNode.Ymt, false);
if (pf != null) //make sure to update the project form UI..
{
pf.OnWorldScenarioNodeModified(ScenarioNode);
}
} }
} }
public override void Undo(WorldForm wf, ProjectForm pf, ref MapSelection sel) public override void Undo(WorldForm wf, ref MapSelection sel)
{ {
Update(wf, pf, ref sel, StartPosition); Update(wf, ref sel, StartPosition);
} }
public override void Redo(WorldForm wf, ProjectForm pf, ref MapSelection sel) public override void Redo(WorldForm wf, ref MapSelection sel)
{ {
Update(wf, pf, ref sel, EndPosition); Update(wf, ref sel, EndPosition);
} }
public override string ToString() public override string ToString()
@ -551,48 +557,44 @@ namespace CodeWalker.Project
public Quaternion StartRotation { get; set; } public Quaternion StartRotation { get; set; }
public Quaternion EndRotation { get; set; } public Quaternion EndRotation { get; set; }
public ScenarioNodeRotationUndoStep(ScenarioNode node, Quaternion startrot, WorldForm wf, ProjectForm pf) public ScenarioNodeRotationUndoStep(ScenarioNode node, Quaternion startrot, WorldForm wf)
{ {
ScenarioNode = node; ScenarioNode = node;
StartRotation = startrot; StartRotation = startrot;
EndRotation = node?.Orientation ?? Quaternion.Identity; EndRotation = node?.Orientation ?? Quaternion.Identity;
//UpdateGraphics(wf, pf); //UpdateGraphics(wf);
} }
private void Update(WorldForm wf, ProjectForm pf, ref MapSelection sel, Quaternion q) private void Update(WorldForm wf, ref MapSelection sel, Quaternion q)
{ {
ScenarioNode?.SetOrientation(q); ScenarioNode?.SetOrientation(q);
if (ScenarioNode != sel.ScenarioNode) wf.SelectScenarioNode(ScenarioNode); if (ScenarioNode != sel.ScenarioNode) wf.SelectScenarioNode(ScenarioNode);
wf.SetWidgetRotation(q); wf.SetWidgetRotation(q);
//UpdateGraphics(wf, pf); //UpdateGraphics(wf);
} }
private void UpdateGraphics(WorldForm wf, ProjectForm pf) private void UpdateGraphics(WorldForm wf)
{ {
////this function shouldn't actually be needed for rotating... ////this function shouldn't actually be needed for rotating...
//if (ScenarioNode != null) //if (ScenarioNode != null)
//{ //{
// //Ymt graphics needs to be updated..... // //Ymt graphics needs to be updated.....
// wf.UpdateScenarioGraphics(ScenarioNode.Ymt, false); // wf.UpdateScenarioGraphics(ScenarioNode.Ymt, false);
// if (pf != null) //make sure to update the project form UI..
// {
// pf.OnWorldScenarioNodeModified(ScenarioNode);
// }
//} //}
} }
public override void Undo(WorldForm wf, ProjectForm pf, ref MapSelection sel) public override void Undo(WorldForm wf, ref MapSelection sel)
{ {
Update(wf, pf, ref sel, StartRotation); Update(wf, ref sel, StartRotation);
} }
public override void Redo(WorldForm wf, ProjectForm pf, ref MapSelection sel) public override void Redo(WorldForm wf, ref MapSelection sel)
{ {
Update(wf, pf, ref sel, EndRotation); Update(wf, ref sel, EndRotation);
} }
public override string ToString() public override string ToString()

View File

@ -744,7 +744,7 @@ namespace CodeWalker
if (WorldForm != null) if (WorldForm != null)
{ {
WorldForm.SelectItem(null, null, null);//make sure current selected item isn't still selected... WorldForm.SelectItem(null);//make sure current selected item isn't still selected...
} }
} }
@ -1909,7 +1909,7 @@ namespace CodeWalker
if (WorldForm != null) if (WorldForm != null)
{ {
WorldForm.SelectItem(CurrentEntity, CurrentEntity.Archetype, null); //hopefully the drawable is already loaded - this will try get from cache WorldForm.SelectEntity(CurrentEntity); //hopefully the drawable is already loaded - this will try get from cache
} }
////struct CEntityDef: ////struct CEntityDef:
@ -5033,7 +5033,7 @@ namespace CodeWalker
WorldForm.UpdateScenarioGraphics(cs, false); WorldForm.UpdateScenarioGraphics(cs, false);
if (delpoints) if (delpoints)
{ {
WorldForm.SelectItem(null, null, null); WorldForm.SelectItem(null);
} }
} }
else if (cs?.ScenarioRegion != null) else if (cs?.ScenarioRegion != null)
@ -5222,7 +5222,7 @@ namespace CodeWalker
WorldForm.UpdateScenarioGraphics(cs, false); WorldForm.UpdateScenarioGraphics(cs, false);
if (delpoints || ((cn != null) && (cn.MyPoint == null))) if (delpoints || ((cn != null) && (cn.MyPoint == null)))
{ {
WorldForm.SelectItem(null, null, null); WorldForm.SelectItem(null);
} }
} }
else if (cs?.ScenarioRegion != null) else if (cs?.ScenarioRegion != null)
@ -5441,7 +5441,7 @@ namespace CodeWalker
if (WorldForm != null) if (WorldForm != null)
{ {
WorldForm.UpdateScenarioGraphics(cs, false); WorldForm.UpdateScenarioGraphics(cs, false);
WorldForm.SelectItem(null, null, null); WorldForm.SelectItem(null);
} }
else if (cs?.ScenarioRegion != null) else if (cs?.ScenarioRegion != null)
{ {
@ -5621,7 +5621,7 @@ namespace CodeWalker
cent.rotation = placement.Rotation; cent.rotation = placement.Rotation;
cent.scaleXY = 1.0f; cent.scaleXY = 1.0f;
cent.scaleZ = 1.0f; cent.scaleZ = 1.0f;
cent.flags = placement.Dynamic ? 32u : 0; //1572872; //? cent.flags = placement.Dynamic ? 32u : 0;// 1572872; //?
cent.parentIndex = -1; cent.parentIndex = -1;
cent.lodDist = placement.LodDistance; cent.lodDist = placement.LodDistance;
cent.lodLevel = Unk_1264241711.LODTYPES_DEPTH_ORPHANHD; cent.lodLevel = Unk_1264241711.LODTYPES_DEPTH_ORPHANHD;
@ -5993,7 +5993,39 @@ namespace CodeWalker
catch { } catch { }
} }
public void OnWorldEntityModified(YmapEntityDef ent) public void OnWorldSelectionModified(MapSelection sel, List<MapSelection> items)
{
if (sel.MultipleSelection)
{
}
else if (sel.EntityDef != null)
{
OnWorldEntityModified(sel.EntityDef);
}
else if (sel.CarGenerator != null)
{
OnWorldCarGenModified(sel.CarGenerator);
}
else if (sel.PathNode != null)
{
OnWorldPathNodeModified(sel.PathNode, sel.PathLink);
}
else if (sel.NavPoly != null)
{
OnWorldNavPolyModified(sel.NavPoly);
}
else if (sel.TrainTrackNode != null)
{
OnWorldTrainNodeModified(sel.TrainTrackNode);
}
else if (sel.ScenarioNode != null)
{
OnWorldScenarioNodeModified(sel.ScenarioNode);
}
}
private void OnWorldEntityModified(YmapEntityDef ent)
{ {
try try
{ {
@ -6040,7 +6072,7 @@ namespace CodeWalker
catch { } catch { }
} }
public void OnWorldCarGenModified(YmapCarGen cargen) private void OnWorldCarGenModified(YmapCarGen cargen)
{ {
try try
{ {
@ -6087,7 +6119,7 @@ namespace CodeWalker
catch { } catch { }
} }
public void OnWorldPathNodeModified(YndNode node, YndLink link) private void OnWorldPathNodeModified(YndNode node, YndLink link)
{ {
try try
{ {
@ -6141,7 +6173,7 @@ namespace CodeWalker
catch { } catch { }
} }
public void OnWorldNavPolyModified(YnvPoly poly) private void OnWorldNavPolyModified(YnvPoly poly)
{ {
try try
{ {
@ -6188,7 +6220,7 @@ namespace CodeWalker
catch { } catch { }
} }
public void OnWorldTrainNodeModified(TrainTrackNode node) private void OnWorldTrainNodeModified(TrainTrackNode node)
{ {
try try
{ {
@ -6232,7 +6264,7 @@ namespace CodeWalker
catch { } catch { }
} }
public void OnWorldScenarioNodeModified(ScenarioNode node) private void OnWorldScenarioNodeModified(ScenarioNode node)
{ {
try try
{ {

25
WorldForm.Designer.cs generated
View File

@ -145,6 +145,7 @@ namespace CodeWalker
this.WaitForChildrenCheckBox = new System.Windows.Forms.CheckBox(); this.WaitForChildrenCheckBox = new System.Windows.Forms.CheckBox();
this.label14 = new System.Windows.Forms.Label(); this.label14 = new System.Windows.Forms.Label();
this.tabPage9 = new System.Windows.Forms.TabPage(); this.tabPage9 = new System.Windows.Forms.TabPage();
this.PopZonesCheckBox = new System.Windows.Forms.CheckBox();
this.NavMeshesCheckBox = new System.Windows.Forms.CheckBox(); this.NavMeshesCheckBox = new System.Windows.Forms.CheckBox();
this.TrainPathsCheckBox = new System.Windows.Forms.CheckBox(); this.TrainPathsCheckBox = new System.Windows.Forms.CheckBox();
this.PathsDepthClipCheckBox = new System.Windows.Forms.CheckBox(); this.PathsDepthClipCheckBox = new System.Windows.Forms.CheckBox();
@ -274,7 +275,6 @@ namespace CodeWalker
this.ToolbarCameraMapViewButton = new System.Windows.Forms.ToolStripMenuItem(); this.ToolbarCameraMapViewButton = new System.Windows.Forms.ToolStripMenuItem();
this.ToolbarCameraOrthographicButton = new System.Windows.Forms.ToolStripMenuItem(); this.ToolbarCameraOrthographicButton = new System.Windows.Forms.ToolStripMenuItem();
this.ToolbarPanel = new System.Windows.Forms.Panel(); this.ToolbarPanel = new System.Windows.Forms.Panel();
this.PopZonesCheckBox = new System.Windows.Forms.CheckBox();
this.StatusStrip.SuspendLayout(); this.StatusStrip.SuspendLayout();
this.ToolsPanel.SuspendLayout(); this.ToolsPanel.SuspendLayout();
this.ToolsTabControl.SuspendLayout(); this.ToolsTabControl.SuspendLayout();
@ -1769,6 +1769,17 @@ namespace CodeWalker
this.tabPage9.Text = "Helpers"; this.tabPage9.Text = "Helpers";
this.tabPage9.UseVisualStyleBackColor = true; this.tabPage9.UseVisualStyleBackColor = true;
// //
// PopZonesCheckBox
//
this.PopZonesCheckBox.AutoSize = true;
this.PopZonesCheckBox.Location = new System.Drawing.Point(10, 388);
this.PopZonesCheckBox.Name = "PopZonesCheckBox";
this.PopZonesCheckBox.Size = new System.Drawing.Size(136, 17);
this.PopZonesCheckBox.TabIndex = 52;
this.PopZonesCheckBox.Text = "Show population zones";
this.PopZonesCheckBox.UseVisualStyleBackColor = true;
this.PopZonesCheckBox.CheckedChanged += new System.EventHandler(this.PopZonesCheckBox_CheckedChanged);
//
// NavMeshesCheckBox // NavMeshesCheckBox
// //
this.NavMeshesCheckBox.AutoSize = true; this.NavMeshesCheckBox.AutoSize = true;
@ -3104,17 +3115,6 @@ namespace CodeWalker
this.ToolbarPanel.TabIndex = 7; this.ToolbarPanel.TabIndex = 7;
this.ToolbarPanel.Visible = false; this.ToolbarPanel.Visible = false;
// //
// PopZonesCheckBox
//
this.PopZonesCheckBox.AutoSize = true;
this.PopZonesCheckBox.Location = new System.Drawing.Point(10, 388);
this.PopZonesCheckBox.Name = "PopZonesCheckBox";
this.PopZonesCheckBox.Size = new System.Drawing.Size(136, 17);
this.PopZonesCheckBox.TabIndex = 52;
this.PopZonesCheckBox.Text = "Show population zones";
this.PopZonesCheckBox.UseVisualStyleBackColor = true;
this.PopZonesCheckBox.CheckedChanged += new System.EventHandler(this.PopZonesCheckBox_CheckedChanged);
//
// WorldForm // WorldForm
// //
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
@ -3131,6 +3131,7 @@ namespace CodeWalker
this.KeyPreview = true; this.KeyPreview = true;
this.Name = "WorldForm"; this.Name = "WorldForm";
this.Text = "CodeWalker"; this.Text = "CodeWalker";
this.Deactivate += new System.EventHandler(this.WorldForm_Deactivate);
this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.WorldForm_FormClosing); this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.WorldForm_FormClosing);
this.Load += new System.EventHandler(this.WorldForm_Load); this.Load += new System.EventHandler(this.WorldForm_Load);
this.KeyDown += new System.Windows.Forms.KeyEventHandler(this.WorldForm_KeyDown); this.KeyDown += new System.Windows.Forms.KeyEventHandler(this.WorldForm_KeyDown);

File diff suppressed because it is too large Load Diff

View File

@ -22,6 +22,7 @@ namespace CodeWalker
{ {
WorldForm WorldForm; WorldForm WorldForm;
MapSelection Selection; MapSelection Selection;
List<MapSelection> SelectionItems;
string SelectionMode = ""; string SelectionMode = "";
bool MouseSelectEnable = false; bool MouseSelectEnable = false;
@ -59,9 +60,10 @@ namespace CodeWalker
MouseSelectCheckBox.Checked = enable; MouseSelectCheckBox.Checked = enable;
} }
public void SetSelection(MapSelection item) public void SetSelection(MapSelection item, List<MapSelection> multiItems)
{ {
Selection = item; Selection = item;
SelectionItems = multiItems;
SelectionNameTextBox.Text = item.GetNameString("Nothing selected"); SelectionNameTextBox.Text = item.GetNameString("Nothing selected");
//SelEntityPropertyGrid.SelectedObject = item.EntityDef; //SelEntityPropertyGrid.SelectedObject = item.EntityDef;
@ -87,8 +89,12 @@ namespace CodeWalker
AddSelectionEntityHierarchyNodes(item.EntityDef); AddSelectionEntityHierarchyNodes(item.EntityDef);
} }
if (item.MultipleSelection)
if (item.TimeCycleModifier != null) {
SelectionEntityTabPage.Text = "Multiple items";
SelEntityPropertyGrid.SelectedObject = multiItems.ToArray();
}
else if (item.TimeCycleModifier != null)
{ {
SelectionEntityTabPage.Text = "Time Cycle Modifier"; SelectionEntityTabPage.Text = "Time Cycle Modifier";
SelEntityPropertyGrid.SelectedObject = item.TimeCycleModifier; SelEntityPropertyGrid.SelectedObject = item.TimeCycleModifier;
@ -414,7 +420,7 @@ namespace CodeWalker
private void WorldInfoForm_Load(object sender, EventArgs e) private void WorldInfoForm_Load(object sender, EventArgs e)
{ {
SetSelection(Selection); SetSelection(Selection, SelectionItems);
} }
private void WorldInfoForm_FormClosed(object sender, FormClosedEventArgs e) private void WorldInfoForm_FormClosed(object sender, FormClosedEventArgs e)