1
0
mirror of synced 2024-12-04 20:08:00 +01:00
Switch-Toolbox/Switch_Toolbox_Library/Forms/Viewport.cs

427 lines
14 KiB
C#

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using Switch_Toolbox.Library.Forms;
using Switch_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 Switch_Toolbox.Library
{
public partial class Viewport : UserControl
{
public EditorScene scene = new EditorScene();
public GL_ControlLegacy GL_ControlLegacy;
public GL_ControlModern GL_ControlModern;
Runtime.ViewportEditor editor;
public Viewport(bool LoadDrawables = true)
{
this.DoubleBuffered = true;
InitializeComponent();
LoadViewport();
LoadViewportRuntimeValues();
LoadShadingModes();
editor = new Runtime.ViewportEditor();
Runtime.viewportEditors.Add(editor);
perspectiveToolStripMenuItem.Checked = Runtime.ViewportCameraMode == Runtime.CameraMode.Perspective;
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();
}
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 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()
{
var floor = new DrawableFloor();
scene.staticObjects.Add(floor);
var xyzLnes = new DrawableXyzLines();
scene.staticObjects.Add(xyzLnes);
var skybox = new DrawableSkybox();
scene.staticObjects.Add(skybox);
var background = new DrawableBackground();
scene.staticObjects.Add(background);
// scene.objects.Add(new SingleObject(new Vector3(0, 0, 0)));
// LoadFog();
Runtime.OpenTKInitialized = true;
}
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 (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.Instance.GetAnimationPanel();
if (animationPanel1 != null)
{
if (animationPanel1.CurrentAnimation != null)
animationPanel1.ResetModels();
}
}
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();
}
}
}
}