Switch-Toolbox/Switch_Toolbox_Library/Forms/Viewport.cs
KillzXGaming b225c942e5 A few fixes.
Fix viewport not loading base drawables.
Fix animation player having issues with new animation classes.
Fix gfmdl for pkmn lets go.
Disable vertex color loading for gfmdl for now till fixed.
2019-11-12 16:29:00 -05:00

683 lines
22 KiB
C#

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using Toolbox.Library.Forms;
using Toolbox.Library.Rendering;
using System.Windows.Forms;
using GL_EditorFramework.GL_Core;
using GL_EditorFramework.Interfaces;
using GL_EditorFramework.StandardCameras;
using GL_EditorFramework.EditorDrawables;
using OpenTK.Graphics.OpenGL;
using OpenTK;
namespace Toolbox.Library
{
public partial class Viewport : UserControl
{
public bool DisplayAll
{
get
{
return chkDisplayAllModels.Checked;
}
set
{
chkDisplayAllModels.Checked = value;
}
}
public bool SuppressUpdating = false;
public List<DrawableContainer> DrawableContainers;
public EditorScene scene = new EditorScene();
public GL_ControlLegacy GL_ControlLegacy;
public GL_ControlModern GL_ControlModern;
Runtime.ViewportEditor editor;
public void DisplayAllDDrawables() { drawContainersCB.SelectedIndex = 0; }
public Viewport(List<DrawableContainer> container, bool LoadDrawables = true)
{
DrawableContainers = container;
if (DrawableContainers == null)
DrawableContainers = new List<DrawableContainer>();
this.DoubleBuffered = true;
InitializeComponent();
BackColor = FormThemes.BaseTheme.FormBackColor;
ForeColor = FormThemes.BaseTheme.FormForeColor;
LoadViewport();
LoadViewportRuntimeValues();
LoadShadingModes();
editor = new Runtime.ViewportEditor();
Runtime.viewportEditors.Add(editor);
perspectiveToolStripMenuItem.Checked = Runtime.ViewportCameraMode == Runtime.CameraMode.Perspective;
orbitToolStripMenuItem.Checked = Runtime.cameraMovement == Runtime.CameraMovement.Inspect;
walkToolStripMenuItem.Checked = Runtime.cameraMovement == Runtime.CameraMovement.Walk;
foreach (var type in Enum.GetValues(typeof(Runtime.ViewportShading)).Cast<Runtime.ViewportShading>())
{
if (type == Runtime.viewportShading)
shadingToolStripMenuItem.DropDownItems.Add(new ToolStripMenuItem(type.ToString()) { Checked = true });
else
shadingToolStripMenuItem.DropDownItems.Add(new ToolStripMenuItem(type.ToString()));
}
shadingToolStripMenuItem.Text = $"Shading: [{Runtime.viewportShading.ToString()}]";
if (LoadDrawables)
LoadBaseDrawables();
}
//Reloads drawable containers without an active object being selected
public void ReloadDrawables()
{
drawContainersCB.Items.Clear();
drawContainersCB.Items.Add("All Active Drawables");
for (int i = 0; i < DrawableContainers.Count; i++)
{
drawContainersCB.Items.Add(DrawableContainers[i].Name);
for (int a = 0; a < DrawableContainers[i].Drawables.Count; a++)
{
if (!ContainsDrawable(DrawableContainers[i].Drawables[a]))
AddDrawable((DrawableContainers[i].Drawables[a]));
}
}
}
public List<DrawableContainer> GetActiveContainers()
{
if (drawContainersCB.SelectedIndex < 0)
return null;
if (drawContainersCB.SelectedIndex == 0 || DisplayAll)
return DrawableContainers;
return new List<DrawableContainer>()
{ DrawableContainers[drawContainersCB.SelectedIndex - 1], };
}
//Reloads drawable containers with the active container selected
public void ReloadDrawables(DrawableContainer ActiveContainer)
{
drawContainersCB.Items.Clear();
drawContainersCB.Items.Add("All Active Drawables");
for (int i = 0; i < DrawableContainers.Count; i++)
{
drawContainersCB.Items.Add(DrawableContainers[i].Name);
for (int a = 0; a < DrawableContainers[i].Drawables.Count; a++)
{
if (DrawableContainers[i] != ActiveContainer)
DrawableContainers[i].Drawables[a].Visible = false;
else
DrawableContainers[i].Drawables[a].Visible = true;
if (!ContainsDrawable(DrawableContainers[i].Drawables[a]))
AddDrawable((DrawableContainers[i].Drawables[a]));
}
}
drawContainersCB.SelectItemByText(ActiveContainer.Name);
UpdateViewport();
}
public bool ContainsDrawable(AbstractGlDrawable Drawable)
{
if (Drawable is GL_EditorFramework.EditorDrawables.IEditableObject)
{
return scene.staticObjects.Contains(Drawable) ||
scene.objects.Contains((GL_EditorFramework.EditorDrawables.IEditableObject)Drawable);
}
else
return scene.staticObjects.Contains(Drawable);
}
private void shadingToolStripMenuItem_DropDownItemClicked(object sender, ToolStripItemClickedEventArgs e)
{
int i = 0;
foreach (ToolStripMenuItem item in shadingToolStripMenuItem.DropDownItems)
{
if (item.Selected)
{
item.Checked = true;
Runtime.viewportShading = (Runtime.ViewportShading)i;
shadingToolStripMenuItem.Text = $"Shading: [{item.Text}]";
UpdateViewport();
}
else
{
item.Checked = false;
}
i++;
}
}
public Bitmap CaptureScreenshot(int width, int height, bool enableAlpha)
{
GLControl control = null;
if (GL_ControlModern != null)
control = GL_ControlModern;
else
control = GL_ControlLegacy;
Bitmap bitmap = new Bitmap(width, height);
return bitmap;
}
public void LoadCustomMenuItem(ToolStripMenuItem menu)
{
foreach (ToolStripMenuItem item in stContextMenuStrip1.Items)
if (item.Text == menu.Text)
return;
if (!stContextMenuStrip1.Items.Contains(menu))
stContextMenuStrip1.Items.Add(menu);
}
private void LoadViewport()
{
if (Runtime.UseLegacyGL)
{
GL_ControlLegacy = new GL_ControlLegacy();
GL_ControlLegacy.Dock = DockStyle.Fill;
panelViewport.Controls.Add(GL_ControlLegacy);
}
else
{
GL_ControlModern = new GL_ControlModern();
GL_ControlModern.Dock = DockStyle.Fill;
GL_ControlModern.VSync = true;
panelViewport.Controls.Add(GL_ControlModern);
}
}
public void UpdateGrid()
{
foreach (var obj in scene.staticObjects)
{
if (obj is DrawableFloor)
((DrawableFloor)obj).UpdateVertexData();
}
UpdateViewport();
}
public void AddDrawable(AbstractGlDrawable Drawabale)
{
if (Drawabale is EditableObject)
scene.objects.Add((EditableObject)Drawabale);
else
scene.staticObjects.Add(Drawabale);
UpdateScene();
}
public void RemoveDrawable(AbstractGlDrawable Drawabale)
{
if (Drawabale is EditableObject)
scene.objects.Remove((EditableObject)Drawabale);
else
scene.staticObjects.Remove(Drawabale);
}
private void LoadBaseDrawables()
{
Runtime.OpenTKInitialized = true;
var floor = new DrawableFloor();
var xyzLnes = new DrawableXyzLines();
var skybox = new DrawableSkybox();
var background = new DrawableBackground();
scene.staticObjects.Add(floor);
scene.staticObjects.Add(xyzLnes);
scene.staticObjects.Add(skybox);
scene.staticObjects.Add(background);
// scene.objects.Add(new SingleObject(new Vector3(0, 0, 0)));
// LoadFog();
}
public int FogStart = 1;
public void LoadFog()
{
}
public void LoadObjects()
{
foreach (var drawable in editor.editableDrawables)
{
scene.objects.Add(drawable);
}
foreach (var drawable in editor.staticDrawables)
scene.staticObjects.Add(drawable);
UpdateScene();
}
private void UpdateScene()
{
if (GL_ControlModern != null)
GL_ControlModern.MainDrawable = scene;
if (GL_ControlLegacy != null)
GL_ControlLegacy.MainDrawable = scene;
}
public void UpdateViewport()
{
if (SuppressUpdating) return;
if (GL_ControlModern != null)
GL_ControlModern.Refresh();
if (GL_ControlLegacy != null)
GL_ControlLegacy.Refresh();
}
public void RenderToTexture()
{
if (GL_ControlModern == null)
return;
int Framebuffer = 0;
}
private void LoadShadingModes()
{
foreach (var type in Enum.GetValues(typeof(Runtime.ViewportShading)).Cast<Runtime.ViewportShading>())
{
ToolStripMenuItem item = new ToolStripMenuItem();
item.Text = $"Shading: {type.ToString()}";
item.TextImageRelation = TextImageRelation.ImageAboveText;
switch (type)
{
case Runtime.ViewportShading.Default:
item.Image = Properties.Resources.diffuseSphere;
break;
case Runtime.ViewportShading.Normal:
item.Image = Properties.Resources.normalsSphere;
break;
case Runtime.ViewportShading.NormalMap:
item.Image = Properties.Resources.normalMapSphere;
break;
}
}
}
public void LoadViewportRuntimeValues()
{
if (GL_ControlLegacy != null)
{
switch (Runtime.cameraMovement)
{
case Runtime.CameraMovement.Inspect:
GL_ControlLegacy.ActiveCamera = new InspectCamera(Runtime.MaxCameraSpeed);
break;
case Runtime.CameraMovement.Walk:
GL_ControlLegacy.ActiveCamera = new WalkaroundCamera(Runtime.MaxCameraSpeed);
break;
}
GL_ControlLegacy.Stereoscopy = Runtime.stereoscopy;
GL_ControlLegacy.ZNear = Runtime.CameraNear;
GL_ControlLegacy.ZFar = Runtime.CameraFar;
}
else
{
switch (Runtime.cameraMovement)
{
case Runtime.CameraMovement.Inspect:
GL_ControlModern.ActiveCamera = new InspectCamera(Runtime.MaxCameraSpeed);
break;
case Runtime.CameraMovement.Walk:
GL_ControlModern.ActiveCamera = new WalkaroundCamera(Runtime.MaxCameraSpeed);
break;
}
GL_ControlModern.Stereoscopy = Runtime.stereoscopy;
GL_ControlModern.ZNear = Runtime.CameraNear;
GL_ControlModern.ZFar = Runtime.CameraFar;
}
}
public void SetupViewportRuntimeValues()
{
if (GL_ControlLegacy != null)
{
if (GL_ControlLegacy.ActiveCamera is InspectCamera)
Runtime.cameraMovement = Runtime.CameraMovement.Inspect;
if (GL_ControlLegacy.ActiveCamera is WalkaroundCamera)
Runtime.cameraMovement = Runtime.CameraMovement.Walk;
Runtime.stereoscopy = GL_ControlLegacy.Stereoscopy;
}
else
{
if (GL_ControlModern.ActiveCamera is InspectCamera)
Runtime.cameraMovement = Runtime.CameraMovement.Inspect;
if (GL_ControlModern.ActiveCamera is WalkaroundCamera)
Runtime.cameraMovement = Runtime.CameraMovement.Walk;
Runtime.stereoscopy = GL_ControlModern.Stereoscopy;
}
}
private void contextMenuStripDark1_ItemClicked(object sender, ToolStripItemClickedEventArgs e)
{
}
public void FormClosing()
{
}
private void animationPanelToolStripMenuItem_Click(object sender, EventArgs e)
{
}
private void animationLoaderToolStripMenuItem_Click(object sender, EventArgs e)
{
}
private void reloadShadersToolStripMenuItem_Click(object sender, EventArgs e)
{
if (GL_ControlModern != null)
GL_ControlModern.ReloadShaders();
}
private void resetPoseToolStripMenuItem_Click(object sender, EventArgs e)
{
var animationPanel1 = LibraryGUI.GetAnimationPanel();
if (animationPanel1 != null)
{
if (animationPanel1.CurrentAnimation != null)
animationPanel1.ResetModels();
UpdateViewport();
}
}
private void perspectiveToolStripMenuItem_Click(object sender, EventArgs e)
{
if (perspectiveToolStripMenuItem.Checked)
{
perspectiveToolStripMenuItem.Checked = false;
orthographicToolStripMenuItem.Checked = true;
}
else
{
orthographicToolStripMenuItem.Checked = false;
perspectiveToolStripMenuItem.Checked = true;
}
bool IsOrtho = orthographicToolStripMenuItem.Checked;
// if (GL_ControlModern != null)
// GL_ControlModern.UseOrthographicView = IsOrtho;
// else
// GL_ControlLegacy.UseOrthographicView = IsOrtho;
UpdateViewport();
}
private void orthographicToolStripMenuItem_Click(object sender, EventArgs e)
{
if (orthographicToolStripMenuItem.Checked)
{
orthographicToolStripMenuItem.Checked = false;
perspectiveToolStripMenuItem.Checked = true;
}
else
{
perspectiveToolStripMenuItem.Checked = false;
orthographicToolStripMenuItem.Checked = true;
}
bool IsOrtho = orthographicToolStripMenuItem.Checked;
// if (GL_ControlModern != null)
// GL_ControlModern.UseOrthographicView = IsOrtho;
// else
// GL_ControlLegacy.UseOrthographicView = IsOrtho;
UpdateViewport();
}
private enum CameraPickBuffer
{
Top = 1,
Bottom = 2,
Front = 3,
Back = 4,
Left = 5,
Right = 6,
}
private void frontToolStripMenuItem_Click(object sender, EventArgs e) {
ApplyCameraOrientation(CameraPickBuffer.Front);
}
private void backToolStripMenuItem_Click(object sender, EventArgs e) {
ApplyCameraOrientation(CameraPickBuffer.Back);
}
private void topToolStripMenuItem_Click(object sender, EventArgs e) {
ApplyCameraOrientation(CameraPickBuffer.Top);
}
private void bottomToolStripMenuItem_Click(object sender, EventArgs e) {
ApplyCameraOrientation(CameraPickBuffer.Bottom);
}
private void rightToolStripMenuItem_Click(object sender, EventArgs e) {
ApplyCameraOrientation(CameraPickBuffer.Right);
}
private void leftToolStripMenuItem_Click(object sender, EventArgs e) {
ApplyCameraOrientation(CameraPickBuffer.Left);
}
private void ApplyCameraOrientation(CameraPickBuffer CameraPick)
{
int pickingBuffer = (int)CameraPick;
if (GL_ControlModern != null)
GL_ControlModern.ApplyCameraOrientation(pickingBuffer);
else
GL_ControlModern.ApplyCameraOrientation(pickingBuffer);
UpdateViewport();
}
private void toOriginToolStripMenuItem_Click(object sender, EventArgs e)
{
if (GL_ControlLegacy != null)
{
GL_ControlLegacy.ResetCamera(false);
GL_ControlLegacy.Refresh();
}
else
{
GL_ControlModern.ResetCamera(false);
GL_ControlModern.Refresh();
}
}
private void toActiveModelToolStripMenuItem_Click(object sender, EventArgs e)
{
if (GL_ControlLegacy != null)
{
GL_ControlLegacy.ResetCamera(true);
GL_ControlLegacy.Refresh();
}
else
{
GL_ControlModern.ResetCamera(true);
GL_ControlModern.Refresh();
}
}
private void drawContainersCB_SelectedIndexChanged(object sender, EventArgs e)
{
if (chkDisplayAllModels.Checked)
{
DrawAllActive();
return;
}
if (drawContainersCB.SelectedIndex == 0)
DrawAllActive();
else if (drawContainersCB.SelectedIndex > 0)
{
int index = drawContainersCB.SelectedIndex - 1;
for (int i = 0; i < DrawableContainers.Count; i++)
{
for (int a = 0; a < DrawableContainers[i].Drawables.Count; a++)
{
if (i == index)
SetDrawableVisibilty(DrawableContainers[i].Drawables[a], true);
else
SetDrawableVisibilty(DrawableContainers[i].Drawables[a], false);
}
}
}
UpdateViewport();
}
private void SetDrawableVisibilty(AbstractGlDrawable drawable, bool show)
{
if (drawable is EditableObject)
((EditableObject)drawable).Visible = show;
else
((AbstractGlDrawable)drawable).Visible = show;
}
private void DrawAllActive()
{
for (int i = 0; i < DrawableContainers.Count; i++)
{
for (int a = 0; a < DrawableContainers[i].Drawables.Count; a++)
{
DrawableContainers[i].Drawables[a].Visible = true;
}
}
}
private void drawContainersCB_MouseDown(object sender, MouseEventArgs e)
{
ReloadDrawables();
}
private void chkDisplayAllModels_CheckedChanged(object sender, EventArgs e)
{
if (chkDisplayAllModels.Checked)
{
drawContainersCB.SelectedIndex = 0;
DrawAllActive();
}
}
private void uVViewerToolStripMenuItem_Click(object sender, EventArgs e)
{
if (!Runtime.UseOpenGL)
return;
var containers = GetActiveContainers();
if (containers?.Count == 0) return;
UVEditorForm uvEditor1 = new UVEditorForm();
uvEditor1.LoadEditor(containers);
uvEditor1.Show(this);
}
public GLControl GetActiveControl()
{
if (GL_ControlModern != null)
return GL_ControlModern;
else
return GL_ControlLegacy;
}
public void SaveScreenshot()
{
var control = GetActiveControl();
SaveFileDialog sfd = new SaveFileDialog();
sfd.Filter = BitmapExtension.FileFilter;
if (sfd.ShowDialog() == DialogResult.OK)
{
CreateScreenshot(control.Width, control.Height, false).Save(sfd.FileName);
}
}
public Bitmap CreateScreenshot(int width, int height, bool useAlpha = false)
{
int imageSize = width * height * 4;
GL.BindFramebuffer(FramebufferTarget.Framebuffer, 0);
byte[] output = new byte[imageSize];
GL.ReadPixels(0, 0, width, height, PixelFormat.Bgra, PixelType.UnsignedByte, output);
var bitmap = BitmapExtension.GetBitmap(output, width, height);
bitmap.RotateFlip(System.Drawing.RotateFlipType.RotateNoneFlipY);
return bitmap;
}
private void UpdateCameraMovement()
{
if (orbitToolStripMenuItem.Checked)
{
walkToolStripMenuItem.Checked = true;
orbitToolStripMenuItem.Checked = false;
Runtime.cameraMovement = Runtime.CameraMovement.Walk;
}
else
{
orbitToolStripMenuItem.Checked = true;
walkToolStripMenuItem.Checked = false;
Runtime.cameraMovement = Runtime.CameraMovement.Inspect;
}
if (GL_ControlModern != null)
GL_ControlModern.ResetCamera(Runtime.FrameCamera);
else
GL_ControlModern.ResetCamera(Runtime.FrameCamera);
LoadViewportRuntimeValues();
UpdateViewport();
}
private void walkToolStripMenuItem_Click(object sender, EventArgs e) {
UpdateCameraMovement();
}
private void orbitToolStripMenuItem_Click(object sender, EventArgs e) {
UpdateCameraMovement();
}
private void createScreenshotToolStripMenuItem_Click(object sender, EventArgs e) {
SaveScreenshot();
}
}
}