您最多选择25个主题
主题必须以中文或者字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符
61 行
1.8 KiB
61 行
1.8 KiB
using System;
|
|
using UnityEngine;
|
|
using UnityEngine.RMGUI;
|
|
|
|
namespace RMGUI.GraphView
|
|
{
|
|
public class ContentZoomer : Manipulator
|
|
{
|
|
public float zoomStep { get; set; }
|
|
|
|
public Vector3 minScale { get; set; }
|
|
public Vector3 maxScale { get; set; }
|
|
|
|
public ContentZoomer()
|
|
{
|
|
zoomStep = 0.01f;
|
|
minScale = new Vector3(0.1f, 0.1f, 1.0f);
|
|
maxScale = new Vector3(3.0f, 3.0f, 1.0f);
|
|
}
|
|
|
|
public override EventPropagation HandleEvent(Event evt, VisualElement finalTarget)
|
|
{
|
|
var graphView = target as GraphView;
|
|
if (graphView == null)
|
|
{
|
|
throw new InvalidOperationException("Manipulator can only be added to a GraphView");
|
|
}
|
|
|
|
switch (evt.type)
|
|
{
|
|
case EventType.ScrollWheel:
|
|
{
|
|
var transform = graphView.contentViewContainer.transform;
|
|
|
|
// TODO: augment the data to have the position as well, so we don't have to read in data from the target.
|
|
// 0-1 ranged center relative to size
|
|
var zoomCenter = target.ChangeCoordinatesTo(graphView.contentViewContainer, evt.mousePosition);
|
|
float x = zoomCenter.x + graphView.contentViewContainer.position.x;
|
|
float y = zoomCenter.y + graphView.contentViewContainer.position.y;
|
|
|
|
transform *= Matrix4x4.Translate(new Vector3(x, y, 0));
|
|
Vector3 s = Vector3.one - Vector3.one*evt.delta.y*zoomStep;
|
|
s.z = 1;
|
|
transform *= Matrix4x4.TRS(Vector3.zero, Quaternion.identity, s);
|
|
|
|
// Limit scale
|
|
transform.m00 = Mathf.Max(Mathf.Min(maxScale.x, transform.m00), minScale.x);
|
|
transform.m11 = Mathf.Max(Mathf.Min(maxScale.y, transform.m11), minScale.y);
|
|
transform.m22 = Mathf.Max(Mathf.Min(maxScale.z, transform.m22), minScale.z);
|
|
|
|
transform *= Matrix4x4.Translate(new Vector3(-x, -y, 0));
|
|
|
|
graphView.contentViewContainer.transform = transform;
|
|
|
|
return EventPropagation.Stop;
|
|
}
|
|
}
|
|
return EventPropagation.Continue;
|
|
}
|
|
}
|
|
}
|