diff --git a/renderdocui/Windows/ShaderViewer.Designer.cs b/renderdocui/Windows/ShaderViewer.Designer.cs
index ab51f5ae8..32d509ece 100644
--- a/renderdocui/Windows/ShaderViewer.Designer.cs
+++ b/renderdocui/Windows/ShaderViewer.Designer.cs
@@ -28,6 +28,7 @@
///
private void InitializeComponent()
{
+ this.components = new System.ComponentModel.Container();
WeifenLuo.WinFormsUI.Docking.DockPanelSkin dockPanelSkin1 = new WeifenLuo.WinFormsUI.Docking.DockPanelSkin();
WeifenLuo.WinFormsUI.Docking.AutoHideStripSkin autoHideStripSkin1 = new WeifenLuo.WinFormsUI.Docking.AutoHideStripSkin();
WeifenLuo.WinFormsUI.Docking.DockPanelGradient dockPanelGradient1 = new WeifenLuo.WinFormsUI.Docking.DockPanelGradient();
@@ -98,6 +99,8 @@
this.VarName = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
this.Type = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
this.Value = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
+ this.variableHover = new System.Windows.Forms.ToolTip(this.components);
+ this.hoverTimer = new System.Windows.Forms.Timer(this.components);
this.outSig = new TreelistView.TreeListView();
this.inSig = new TreelistView.TreeListView();
this.variableRegs = new TreelistView.TreeListView();
@@ -213,20 +216,20 @@
// autosToolStripMenuItem
//
this.autosToolStripMenuItem.Name = "autosToolStripMenuItem";
- this.autosToolStripMenuItem.Size = new System.Drawing.Size(152, 22);
+ this.autosToolStripMenuItem.Size = new System.Drawing.Size(124, 22);
this.autosToolStripMenuItem.Text = "Autos";
this.autosToolStripMenuItem.Click += new System.EventHandler(this.autosToolStripMenuItem_Click);
//
// resourcesToolStripMenuItem
//
this.resourcesToolStripMenuItem.Name = "resourcesToolStripMenuItem";
- this.resourcesToolStripMenuItem.Size = new System.Drawing.Size(152, 22);
+ this.resourcesToolStripMenuItem.Size = new System.Drawing.Size(124, 22);
this.resourcesToolStripMenuItem.Text = "Resources";
//
// watchToolStripMenuItem
//
this.watchToolStripMenuItem.Name = "watchToolStripMenuItem";
- this.watchToolStripMenuItem.Size = new System.Drawing.Size(152, 22);
+ this.watchToolStripMenuItem.Size = new System.Drawing.Size(124, 22);
this.watchToolStripMenuItem.Text = "Watch";
this.watchToolStripMenuItem.Click += new System.EventHandler(this.watchToolStripMenuItem_Click);
//
@@ -246,7 +249,7 @@
this.debuggingStrip.Location = new System.Drawing.Point(0, 0);
this.debuggingStrip.Margin = new System.Windows.Forms.Padding(0, 0, 12, 0);
this.debuggingStrip.Name = "debuggingStrip";
- this.debuggingStrip.Size = new System.Drawing.Size(234, 25);
+ this.debuggingStrip.Size = new System.Drawing.Size(203, 25);
this.debuggingStrip.TabIndex = 0;
this.debuggingStrip.Text = "Debugging";
//
@@ -359,7 +362,7 @@
this.editStrip.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
this.saveButton,
this.snippetDropDown});
- this.editStrip.Location = new System.Drawing.Point(246, 0);
+ this.editStrip.Location = new System.Drawing.Point(215, 0);
this.editStrip.Name = "editStrip";
this.editStrip.Size = new System.Drawing.Size(55, 25);
this.editStrip.TabIndex = 2;
@@ -515,6 +518,22 @@
//
this.Value.Text = "Value";
//
+ // variableHover
+ //
+ this.variableHover.AutoPopDelay = 5000;
+ this.variableHover.InitialDelay = 1000;
+ this.variableHover.OwnerDraw = true;
+ this.variableHover.ReshowDelay = 100;
+ this.variableHover.UseAnimation = false;
+ this.variableHover.UseFading = false;
+ this.variableHover.Draw += new System.Windows.Forms.DrawToolTipEventHandler(this.variableHover_Draw);
+ this.variableHover.Popup += new System.Windows.Forms.PopupEventHandler(this.variableHover_Popup);
+ //
+ // hoverTimer
+ //
+ this.hoverTimer.Interval = 500;
+ this.hoverTimer.Tick += new System.EventHandler(this.hoverTimer_Tick);
+ //
// outSig
//
treeListColumn14.AutoSize = true;
@@ -715,5 +734,7 @@
private System.Windows.Forms.ColumnHeader VarName;
private System.Windows.Forms.ColumnHeader Type;
private System.Windows.Forms.ColumnHeader Value;
+ private System.Windows.Forms.ToolTip variableHover;
+ private System.Windows.Forms.Timer hoverTimer;
}
}
diff --git a/renderdocui/Windows/ShaderViewer.cs b/renderdocui/Windows/ShaderViewer.cs
index 1c5ca94e5..5873888e5 100644
--- a/renderdocui/Windows/ShaderViewer.cs
+++ b/renderdocui/Windows/ShaderViewer.cs
@@ -505,6 +505,8 @@ namespace renderdocui.Windows
m_DisassemblyView.Margins.Margin1.Mask = (int)m_DisassemblyView.Markers[BREAKPOINT_MARKER + 1].Mask;
m_DisassemblyView.Margins.Margin3.Mask &= ~((int)m_DisassemblyView.Markers[BREAKPOINT_MARKER + 1].Mask);
+ m_DisassemblyView.MouseMove += new MouseEventHandler(scintilla1_MouseMove);
+ m_DisassemblyView.Leave += new EventHandler(scintilla1_Leave);
m_DisassemblyView.KeyDown += new KeyEventHandler(scintilla1_DebuggingKeyDown);
watchRegs.Items.Add(new ListViewItem(new string[] { "", "", "" }));
@@ -611,6 +613,138 @@ namespace renderdocui.Windows
}
}
+ private Point m_HoverPos = Point.Empty;
+ private string m_HoverReg = "";
+ private ScintillaNET.Scintilla m_HoverScintilla = null;
+
+ void scintilla1_MouseMove(object sender, MouseEventArgs e)
+ {
+ if (m_Trace == null || m_Trace.states.Length == 0) return;
+
+ ScintillaNET.Scintilla scintilla1 = sender as ScintillaNET.Scintilla;
+
+ var pt = scintilla1.PointToClient(Cursor.Position);
+
+ if (pt.X == m_HoverPos.X && pt.Y == m_HoverPos.Y) return;
+
+ m_HoverPos = pt;
+
+ variableHover.Hide(scintilla1);
+ hoverTimer.Enabled = false;
+ m_HoverScintilla = null;
+
+ int pos = scintilla1.PositionFromPoint(pt.X, pt.Y);
+
+ string word = scintilla1.GetWordFromPosition(pos);
+
+ var match = Regex.Match(word, "^[rvo][0-9]+$");
+
+ if (match.Success)
+ {
+ m_HoverReg = word;
+ m_HoverScintilla = scintilla1;
+
+ hoverTimer.Enabled = true;
+ hoverTimer.Start();
+ }
+ }
+
+ void scintilla1_Leave(object sender, EventArgs e)
+ {
+ ScintillaNET.Scintilla scintilla1 = sender as ScintillaNET.Scintilla;
+
+ System.Diagnostics.Trace.WriteLine("leave");
+
+ variableHover.Hide(scintilla1);
+ hoverTimer.Enabled = false;
+ m_HoverScintilla = null;
+ m_HoverPos = Point.Empty;
+ }
+
+ private void hoverTimer_Tick(object sender, EventArgs e)
+ {
+ if (m_Trace == null || m_Trace.states.Length == 0) return;
+
+ hoverTimer.Enabled = false;
+
+ if (m_HoverScintilla != null && m_HoverReg != "")
+ {
+ var pt = m_HoverScintilla.PointToClient(Cursor.Position);
+
+ var state = m_Trace.states[CurrentStep];
+
+ string regtype = m_HoverReg.Substring(0, 1);
+ string regidx = m_HoverReg.Substring(1);
+
+ ShaderVariable[] vars = null;
+
+ if (regtype == "r")
+ {
+ vars = state.registers;
+ }
+ else if (regtype == "v")
+ {
+ vars = m_Trace.inputs;
+ }
+ else if (regtype == "o")
+ {
+ vars = state.outputs;
+ }
+
+ int regindex = -1;
+
+ if (vars != null && int.TryParse(regidx, out regindex))
+ {
+ if (regindex >= 0 && regindex < vars.Length)
+ {
+ ShaderVariable vr = vars[regindex];
+
+ var fmt =
+ @"{0,5} | X Y Z W" + Environment.NewLine +
+ @"----------------------------------------------------" + Environment.NewLine +
+ @"float | {1,10} {2,10} {3,10} {4,10}" + Environment.NewLine +
+ @"uint | {5,10} {6,10} {7,10} {8,10}" + Environment.NewLine +
+ @"int | {9,10} {10,10} {11,10} {12,10}";
+
+ var tooltip = String.Format(fmt, m_HoverReg,
+ Formatter.Format(vr.value.fv[0]), Formatter.Format(vr.value.fv[1]), Formatter.Format(vr.value.fv[2]), Formatter.Format(vr.value.fv[3]),
+ vr.value.uv[0], vr.value.uv[1], vr.value.uv[2], vr.value.uv[3],
+ vr.value.iv[0], vr.value.iv[1], vr.value.iv[2], vr.value.iv[3]);
+
+ variableHover.Show(tooltip, m_HoverScintilla,
+ m_HoverScintilla.ClientRectangle.Left + pt.X + 10, m_HoverScintilla.ClientRectangle.Top + pt.Y + 10);
+ }
+ }
+ }
+ }
+
+ private const int ToolTipFontSize = 9;
+
+ private void variableHover_Popup(object sender, PopupEventArgs e)
+ {
+ using (Font fw = new Font(FontFamily.GenericMonospace, ToolTipFontSize))
+ {
+ SizeF size = TextRenderer.MeasureText(variableHover.GetToolTip(m_HoverScintilla), fw);
+
+ e.ToolTipSize = new Size((int)size.Width, (int)size.Height);
+ }
+ }
+
+ private void variableHover_Draw(object sender, DrawToolTipEventArgs e)
+ {
+ using (Font fw = new Font(FontFamily.GenericMonospace, ToolTipFontSize))
+ {
+ var g = e.Graphics;
+
+ DrawToolTipEventArgs args = new DrawToolTipEventArgs(g, e.AssociatedWindow, e.AssociatedControl, e.Bounds, e.ToolTipText,
+ variableHover.BackColor, variableHover.ForeColor, fw);
+
+ args.DrawBackground();
+ args.DrawBorder();
+ args.DrawText(TextFormatFlags.TextBoxControl);
+ }
+ }
+
public void ShowErrors(string errs)
{
errors.Text = errs.Replace("\n", Environment.NewLine);
diff --git a/renderdocui/Windows/ShaderViewer.resx b/renderdocui/Windows/ShaderViewer.resx
index f458a9a0a..32eeb878f 100644
--- a/renderdocui/Windows/ShaderViewer.resx
+++ b/renderdocui/Windows/ShaderViewer.resx
@@ -154,4 +154,10 @@
261, 17
+
+ 354, 17
+
+
+ 474, 17
+
\ No newline at end of file