Optimize TreeNode rendering
This commit is contained in:
@@ -712,6 +712,71 @@ namespace FlaxEditor.GUI.Tree
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <inheritdoc />
|
||||||
|
protected override void DrawChildren()
|
||||||
|
{
|
||||||
|
// Draw all visible child controls
|
||||||
|
var children = _children;
|
||||||
|
if (children.Count == 0)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (CullChildren)
|
||||||
|
{
|
||||||
|
Render2D.PeekClip(out var globalClipping);
|
||||||
|
Render2D.PeekTransform(out var globalTransform);
|
||||||
|
|
||||||
|
// Try to estimate the rough location of the first node, assuming the node height is constant
|
||||||
|
var firstChildGlobalRect = GetChildGlobalRectangle(children[0], ref globalTransform);
|
||||||
|
var firstVisibleChild = Math.Clamp((int)Math.Floor((globalClipping.Y - firstChildGlobalRect.Top) / firstChildGlobalRect.Height) + 1, 0, children.Count - 1);
|
||||||
|
if (GetChildGlobalRectangle(children[firstVisibleChild], ref globalTransform).Top > globalClipping.Top)
|
||||||
|
{
|
||||||
|
// Overshoot...
|
||||||
|
for (; firstVisibleChild > 0; firstVisibleChild--)
|
||||||
|
{
|
||||||
|
var child = children[firstVisibleChild];
|
||||||
|
if (GetChildGlobalRectangle(child, ref globalTransform).Top < globalClipping.Top)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for (int i = firstVisibleChild; i < children.Count; i++)
|
||||||
|
{
|
||||||
|
var child = children[i];
|
||||||
|
if (child.Visible)
|
||||||
|
{
|
||||||
|
var childGlobalRect = GetChildGlobalRectangle(child, ref globalTransform);
|
||||||
|
if (globalClipping.Intersects(ref childGlobalRect))
|
||||||
|
{
|
||||||
|
Render2D.PushTransform(ref child._cachedTransform);
|
||||||
|
child.Draw();
|
||||||
|
Render2D.PopTransform();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static Rectangle GetChildGlobalRectangle(Control control, ref Matrix3x3 globalTransform)
|
||||||
|
{
|
||||||
|
Matrix3x3.Multiply(ref control._cachedTransform, ref globalTransform, out var globalChildTransform);
|
||||||
|
return new Rectangle(globalChildTransform.M31, globalChildTransform.M32, control.Width * globalChildTransform.M11, control.Height * globalChildTransform.M22);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
for (int i = 0; i < children.Count; i++)
|
||||||
|
{
|
||||||
|
var child = children[i];
|
||||||
|
if (child.Visible)
|
||||||
|
{
|
||||||
|
Render2D.PushTransform(ref child._cachedTransform);
|
||||||
|
child.Draw();
|
||||||
|
Render2D.PopTransform();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// <inheritdoc />
|
/// <inheritdoc />
|
||||||
public override bool OnMouseDown(Float2 location, MouseButton button)
|
public override bool OnMouseDown(Float2 location, MouseButton button)
|
||||||
{
|
{
|
||||||
|
|||||||
Reference in New Issue
Block a user