6d7579e6e0
Camera is now centerd when a bfres is selected. This will apply to reseting the camera aswell. The method is based on Smash Forge so thanks to the devs for it. Start on bfsha program linking for bfres materials. Dunno how far i'll take this. Basic ortho mode added. Needs improvements to zoom in and mainly just changes the projection matrix to ortho atm. Controls are not altered.
285 lines
7.9 KiB
C#
285 lines
7.9 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.ComponentModel;
|
|
using System.Drawing;
|
|
using System.Data;
|
|
using System.Linq;
|
|
using System.Text;
|
|
using System.Threading.Tasks;
|
|
using System.Windows.Forms;
|
|
using Switch_Toolbox.Library.Forms;
|
|
using Switch_Toolbox.Library;
|
|
using GL_EditorFramework.Interfaces;
|
|
using GL_EditorFramework.EditorDrawables;
|
|
|
|
namespace FirstPlugin.Forms
|
|
{
|
|
public partial class BfresEditor : STUserControl, IViewportContainer
|
|
{
|
|
private bool _displayViewport = true;
|
|
|
|
public bool DisplayViewport
|
|
{
|
|
get
|
|
{
|
|
return _displayViewport;
|
|
}
|
|
set
|
|
{
|
|
_displayViewport = value;
|
|
SetupViewport();
|
|
}
|
|
}
|
|
|
|
private void SetupViewport()
|
|
{
|
|
if (DisplayViewport == true && Runtime.UseOpenGL)
|
|
{
|
|
stPanel5.Controls.Add(viewport);
|
|
splitContainer1.Panel1Collapsed = false;
|
|
toggleViewportToolStripBtn.Image = Properties.Resources.ViewportIcon;
|
|
|
|
if (viewport != null)
|
|
OnLoadedTab();
|
|
else
|
|
{
|
|
viewport = new Viewport();
|
|
viewport.Dock = DockStyle.Fill;
|
|
OnLoadedTab();
|
|
}
|
|
}
|
|
else
|
|
{
|
|
stPanel5.Controls.Clear();
|
|
splitContainer1.Panel1Collapsed = true;
|
|
toggleViewportToolStripBtn.Image = Properties.Resources.ViewportIconDisable;
|
|
}
|
|
}
|
|
|
|
Viewport viewport
|
|
{
|
|
get
|
|
{
|
|
if (!Runtime.UseOpenGL || !DisplayViewport)
|
|
return null;
|
|
|
|
var editor = LibraryGUI.Instance.GetObjectEditor();
|
|
return editor.GetViewport();
|
|
}
|
|
set
|
|
{
|
|
var editor = LibraryGUI.Instance.GetObjectEditor();
|
|
editor.LoadViewport(value);
|
|
}
|
|
}
|
|
|
|
AnimationPanel animationPanel;
|
|
|
|
public BfresEditor(bool HasModels)
|
|
{
|
|
InitializeComponent();
|
|
|
|
animationPanel = new AnimationPanel();
|
|
animationPanel.CurrentAnimation = null;
|
|
animationPanel.Dock = DockStyle.Fill;
|
|
timelineTabPage.Controls.Add(animationPanel);
|
|
|
|
stTabControl2.myBackColor = FormThemes.BaseTheme.FormBackColor;
|
|
|
|
//Always create an instance of the viewport unless opengl is disabled
|
|
if (viewport == null && Runtime.UseOpenGL)
|
|
{
|
|
viewport = new Viewport();
|
|
viewport.Dock = DockStyle.Fill;
|
|
}
|
|
|
|
//If the option is enabled by settings, and it has models display the viewport
|
|
if (Runtime.UseOpenGL && Runtime.DisplayViewport && HasModels)
|
|
{
|
|
stPanel5.Controls.Add(viewport);
|
|
DisplayViewport = true;
|
|
}
|
|
else
|
|
{
|
|
DisplayViewport = false;
|
|
splitContainer1.Panel1Collapsed = true;
|
|
}
|
|
}
|
|
|
|
public UserControl GetActiveEditor(Type type)
|
|
{
|
|
foreach (var ctrl in splitContainer1.Panel2.Controls)
|
|
{
|
|
if (type == null)
|
|
{
|
|
return (UserControl)ctrl;
|
|
}
|
|
|
|
if (ctrl.GetType() == type)
|
|
{
|
|
return (UserControl)ctrl;
|
|
}
|
|
}
|
|
return null;
|
|
}
|
|
|
|
public void FrameCamera(BFRESRender Renderer)
|
|
{
|
|
if (!Runtime.UseOpenGL || !DisplayViewport)
|
|
return;
|
|
|
|
if (viewport.GL_ControlModern != null)
|
|
{
|
|
Renderer.CenterCamera(viewport.GL_ControlModern);
|
|
viewport.UpdateViewport();
|
|
}
|
|
}
|
|
|
|
public void LoadEditor(UserControl Control)
|
|
{
|
|
Control.Dock = DockStyle.Fill;
|
|
|
|
splitContainer1.Panel2.Controls.Clear();
|
|
splitContainer1.Panel2.Controls.Add(Control);
|
|
}
|
|
|
|
public AnimationPanel GetAnimationPanel() => animationPanel;
|
|
|
|
public Viewport GetViewport() => viewport;
|
|
|
|
public void UpdateViewport()
|
|
{
|
|
if (viewport != null && Runtime.UseOpenGL && Runtime.DisplayViewport)
|
|
viewport.UpdateViewport();
|
|
}
|
|
|
|
|
|
public bool IsLoaded = false;
|
|
|
|
//All drawables for this particular editor
|
|
List<AbstractGlDrawable> Drawables;
|
|
|
|
//Drawables removed but the viewport is toggled off to update
|
|
List<AbstractGlDrawable> RemovedDrawables = new List<AbstractGlDrawable>();
|
|
|
|
public void LoadViewport(List<AbstractGlDrawable> drawables, List<ToolStripMenuItem> customContextMenus = null)
|
|
{
|
|
Drawables = drawables;
|
|
|
|
if (!Runtime.UseOpenGL || !DisplayViewport)
|
|
return;
|
|
|
|
if (customContextMenus != null)
|
|
{
|
|
foreach (var menu in customContextMenus)
|
|
viewport.LoadCustomMenuItem(menu);
|
|
}
|
|
|
|
OnLoadedTab();
|
|
}
|
|
|
|
public void AddDrawable(AbstractGlDrawable draw)
|
|
{
|
|
Drawables.Add(draw);
|
|
|
|
if (!Runtime.UseOpenGL || !Runtime.DisplayViewport || viewport == null)
|
|
{
|
|
IsLoaded = false;
|
|
return;
|
|
}
|
|
|
|
if (!viewport.scene.staticObjects.Contains(draw) &&
|
|
!viewport.scene.objects.Contains(draw))
|
|
{
|
|
viewport.AddDrawable(draw);
|
|
}
|
|
}
|
|
|
|
public void RemoveDrawable(AbstractGlDrawable draw)
|
|
{
|
|
Drawables.Remove(draw);
|
|
|
|
if (!Runtime.UseOpenGL || !Runtime.DisplayViewport || viewport == null)
|
|
{
|
|
IsLoaded = false;
|
|
RemovedDrawables.Add(draw);
|
|
return;
|
|
}
|
|
|
|
viewport.RemoveDrawable(draw);
|
|
}
|
|
|
|
public override void OnControlClosing()
|
|
{
|
|
animationPanel.ClosePanel();
|
|
}
|
|
|
|
private void OnLoadedTab()
|
|
{
|
|
//If a model was loaded we don't need to load the drawables again
|
|
if (IsLoaded || Drawables == null || !Runtime.UseOpenGL || !Runtime.DisplayViewport)
|
|
return;
|
|
|
|
Console.WriteLine("drawables count " + Drawables.Count);
|
|
|
|
foreach (var draw in Drawables)
|
|
{
|
|
if (!viewport.scene.staticObjects.Contains(draw) &&
|
|
!viewport.scene.objects.Contains(draw))
|
|
{
|
|
viewport.AddDrawable(draw);
|
|
}
|
|
}
|
|
|
|
foreach (var draw in RemovedDrawables)
|
|
viewport.RemoveDrawable(draw);
|
|
|
|
viewport.LoadObjects();
|
|
|
|
IsLoaded = true;
|
|
}
|
|
|
|
private void stTabControl1_TabIndexChanged(object sender, EventArgs e)
|
|
{
|
|
|
|
}
|
|
|
|
private void stTabControl1_SelectedIndexChanged(object sender, EventArgs e)
|
|
{
|
|
|
|
}
|
|
|
|
bool IsTimelineVisable = true;
|
|
int controlHeight = 0;
|
|
private void stPanel1_DoubleClick(object sender, EventArgs e)
|
|
{
|
|
if (IsTimelineVisable)
|
|
{
|
|
controlHeight = stTabControl2.Height;
|
|
IsTimelineVisable = false;
|
|
stPanel1.Height -= (controlHeight - 25);
|
|
}
|
|
else
|
|
{
|
|
IsTimelineVisable = true;
|
|
stPanel1.Height += (controlHeight + 25);
|
|
}
|
|
}
|
|
|
|
private void toggleViewportToolStripBtn_Click(object sender, EventArgs e)
|
|
{
|
|
if (Runtime.DisplayViewport)
|
|
{
|
|
Runtime.DisplayViewport = false;
|
|
}
|
|
else
|
|
{
|
|
Runtime.DisplayViewport = true;
|
|
}
|
|
|
|
DisplayViewport = Runtime.DisplayViewport;
|
|
Config.Save();
|
|
}
|
|
}
|
|
}
|