274 lines
8.7 KiB
C#
274 lines
8.7 KiB
C#
using GL_EditorFramework.GL_Core;
|
|
using GL_EditorFramework.Interfaces;
|
|
using OpenTK;
|
|
using OpenTK.Graphics.OpenGL;
|
|
using Switch_Toolbox.Library.IO;
|
|
using static GL_EditorFramework.EditorDrawables.EditorSceneBase;
|
|
using FirstPlugin.Turbo.CourseMuuntStructs;
|
|
using FirstPlugin.Turbo;
|
|
|
|
namespace GL_EditorFramework.EditorDrawables
|
|
{
|
|
public class RenderablePathPoint : EditableObject
|
|
{
|
|
public bool CanConnect = true;
|
|
|
|
public object NodeObject;
|
|
|
|
public bool IsNormalTanTransform = false;
|
|
|
|
protected Vector3 position = new Vector3(0, 0, 0);
|
|
protected Vector3 scale = new Vector3(1, 1, 1);
|
|
protected Vector3 rotate = new Vector3(0, 0, 0);
|
|
|
|
protected Vector3 Normal = new Vector3(0, 0, 0);
|
|
protected Vector3 Tangent = new Vector3(0, 0, 0);
|
|
|
|
protected bool Selected = false;
|
|
|
|
public override bool IsSelected() => Selected;
|
|
|
|
public override bool IsSelected(int partIndex) => Selected;
|
|
|
|
public Vector4 Color = new Vector4(0f, 0.25f, 1f, 1f);
|
|
|
|
public RenderablePathPoint(Vector4 color, Vector3 pos, Vector3 rot, Vector3 sca, object nodeObject) {
|
|
NodeObject = nodeObject;
|
|
|
|
Color = color;
|
|
UpdateTransform(pos, rot, sca);
|
|
}
|
|
|
|
public RenderablePathPoint(Vector3 pos, Vector3 normal, Vector3 tangent, Vector3 sca) {
|
|
UpdateTransform(pos, normal, tangent, sca);
|
|
}
|
|
|
|
public void UpdateTransform(Vector3 pos, Vector3 rot, Vector3 sca)
|
|
{
|
|
position = pos;
|
|
rotate = rot;
|
|
scale = new Vector3(sca / 2);
|
|
}
|
|
|
|
public void UpdateTransform(Vector3 pos, Vector3 normal, Vector3 tangent, Vector3 scale)
|
|
{
|
|
IsNormalTanTransform = true;
|
|
Normal = normal;
|
|
Tangent = tangent;
|
|
scale = new Vector3(scale / 2);
|
|
}
|
|
|
|
public override void Draw(GL_ControlModern control, Pass pass, EditorSceneBase editorScene)
|
|
{
|
|
if (pass == Pass.TRANSPARENT)
|
|
return;
|
|
|
|
bool hovered = editorScene.Hovered == this;
|
|
|
|
if (IsNormalTanTransform)
|
|
{
|
|
control.UpdateModelMatrix(Matrix4.CreateScale(scale) *
|
|
MatrixExenstion.CreateRotation(Normal, Tangent) *
|
|
Matrix4.CreateTranslation(Selected ? editorScene.CurrentAction.NewPos(Position) : Position));
|
|
}
|
|
else
|
|
{
|
|
control.UpdateModelMatrix(Matrix4.CreateScale(scale) *
|
|
(Matrix4.CreateRotationX(rotate.X) *
|
|
Matrix4.CreateRotationY(rotate.Y) *
|
|
Matrix4.CreateRotationZ(rotate.Z)) *
|
|
Matrix4.CreateTranslation(Selected ? editorScene.CurrentAction.NewPos(Position) : Position));
|
|
}
|
|
|
|
Vector4 blockColor;
|
|
Vector4 lineColor;
|
|
|
|
if (hovered && Selected)
|
|
lineColor = hoverColor;
|
|
else if (hovered || Selected)
|
|
lineColor = selectColor;
|
|
else
|
|
lineColor = Color;
|
|
|
|
if (hovered && Selected)
|
|
blockColor = Color * 0.5f + hoverColor * 0.5f;
|
|
else if (hovered || Selected)
|
|
blockColor = Color * 0.5f + selectColor * 0.5f;
|
|
else
|
|
blockColor = Color;
|
|
|
|
Renderers.ColorBlockRenderer.Draw(control, pass, blockColor, lineColor, control.NextPickingColor());
|
|
|
|
}
|
|
|
|
public override void Draw(GL_ControlModern control, Pass pass)
|
|
{
|
|
if (pass == Pass.TRANSPARENT)
|
|
return;
|
|
|
|
control.UpdateModelMatrix(Matrix4.CreateScale(0.5f) *
|
|
Matrix4.CreateTranslation(position));
|
|
|
|
Renderers.ColorBlockRenderer.Draw(control, pass, Color, Color, control.NextPickingColor());
|
|
|
|
}
|
|
|
|
public override void Draw(GL_ControlLegacy control, Pass pass, EditorSceneBase editorScene)
|
|
{
|
|
if (pass == Pass.TRANSPARENT)
|
|
return;
|
|
|
|
bool hovered = editorScene.Hovered == this;
|
|
|
|
control.UpdateModelMatrix(Matrix4.CreateScale(0.5f) *
|
|
Matrix4.CreateTranslation(Selected ? editorScene.CurrentAction.NewPos(position) : position));
|
|
|
|
Vector4 blockColor;
|
|
Vector4 lineColor;
|
|
|
|
if (hovered && Selected)
|
|
lineColor = hoverColor;
|
|
else if (hovered || Selected)
|
|
lineColor = selectColor;
|
|
else
|
|
lineColor = Color;
|
|
|
|
if (hovered && Selected)
|
|
blockColor = Color * 0.5f + hoverColor * 0.5f;
|
|
else if (hovered || Selected)
|
|
blockColor = Color * 0.5f + selectColor * 0.5f;
|
|
else
|
|
blockColor = Color;
|
|
|
|
Renderers.ColorBlockRenderer.Draw(control, pass, blockColor, lineColor, control.NextPickingColor());
|
|
}
|
|
|
|
public override void Draw(GL_ControlLegacy control, Pass pass)
|
|
{
|
|
if (pass == Pass.TRANSPARENT)
|
|
return;
|
|
|
|
control.UpdateModelMatrix(Matrix4.CreateScale(0.5f) *
|
|
Matrix4.CreateTranslation(position));
|
|
|
|
Renderers.ColorBlockRenderer.Draw(control, pass, Color, Color, control.NextPickingColor());
|
|
|
|
}
|
|
|
|
public override void Prepare(GL_ControlModern control)
|
|
{
|
|
Renderers.ColorBlockRenderer.Initialize(control);
|
|
}
|
|
|
|
public override void Prepare(GL_ControlLegacy control)
|
|
{
|
|
|
|
}
|
|
|
|
public virtual void Translate(Vector3 lastPos, Vector3 translate, int subObj)
|
|
{
|
|
position = lastPos + translate;
|
|
UpdateNodePosition();
|
|
}
|
|
|
|
public virtual void UpdatePosition(int subObj) {
|
|
}
|
|
|
|
public override BoundingBox GetSelectionBox() => new BoundingBox(
|
|
position.X - scale.X,
|
|
position.X + scale.X,
|
|
position.Y - scale.Y,
|
|
position.Y + scale.Y,
|
|
position.Z - scale.Z,
|
|
position.Z + scale.Z
|
|
);
|
|
|
|
public override uint SelectAll(GL_ControlBase control)
|
|
{
|
|
Selected = true;
|
|
return REDRAW;
|
|
}
|
|
|
|
public override uint SelectDefault(GL_ControlBase control)
|
|
{
|
|
Selected = true;
|
|
return REDRAW;
|
|
}
|
|
|
|
public override uint Select(int partIndex, GL_ControlBase control)
|
|
{
|
|
Selected = true;
|
|
return REDRAW;
|
|
}
|
|
|
|
public override uint Deselect(int partIndex, GL_ControlBase control)
|
|
{
|
|
Selected = false;
|
|
return REDRAW;
|
|
}
|
|
|
|
public override uint DeselectAll(GL_ControlBase control)
|
|
{
|
|
Selected = false;
|
|
return REDRAW;
|
|
}
|
|
|
|
public override LocalOrientation GetLocalOrientation(int partIndex)
|
|
{
|
|
return new LocalOrientation(position);
|
|
}
|
|
|
|
public override bool TryStartDragging(DragActionType actionType, int hoveredPart, out LocalOrientation localOrientation, out bool dragExclusively)
|
|
{
|
|
localOrientation = new LocalOrientation(position);
|
|
dragExclusively = false;
|
|
return Selected;
|
|
}
|
|
|
|
public override bool IsInRange(float range, float rangeSquared, Vector3 pos)
|
|
{
|
|
return (pos - position).LengthSquared < rangeSquared;
|
|
}
|
|
|
|
private void UpdateNodePosition()
|
|
{
|
|
if (NodeObject is BasePathPoint)
|
|
{
|
|
((BasePathPoint)NodeObject).Translate = position;
|
|
((BasePathPoint)NodeObject).Scale = scale;
|
|
((BasePathPoint)NodeObject).Rotate = rotate;
|
|
|
|
if (((BasePathPoint)NodeObject).OnPathMoved != null)
|
|
((BasePathPoint)NodeObject).OnPathMoved();
|
|
}
|
|
if (NodeObject is Course_MapCamera_bin)
|
|
{
|
|
if (Color == new Vector4(1, 0, 0, 1))
|
|
{
|
|
((Course_MapCamera_bin)NodeObject).cameraData.PositionX = position.X;
|
|
((Course_MapCamera_bin)NodeObject).cameraData.PositionY = position.Y;
|
|
((Course_MapCamera_bin)NodeObject).cameraData.PositionZ = position.Z;
|
|
}
|
|
else
|
|
{
|
|
((Course_MapCamera_bin)NodeObject).cameraData.TargetX = position.X;
|
|
((Course_MapCamera_bin)NodeObject).cameraData.TargetY = position.Y;
|
|
((Course_MapCamera_bin)NodeObject).cameraData.TargetZ = position.Z;
|
|
}
|
|
}
|
|
}
|
|
|
|
public override Vector3 Position
|
|
{
|
|
get
|
|
{
|
|
return position;
|
|
}
|
|
set
|
|
{
|
|
position = value;
|
|
}
|
|
}
|
|
}
|
|
}
|