AssetStudio/Unity Studio/UnityStudioForm.cs

1953 lines
80 KiB
C#
Raw Normal View History

2015-10-30 02:41:37 +00:00
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;
using System.Threading;
using System.Globalization;
using System.Runtime.InteropServices;
using System.Text.RegularExpressions;
using System.Diagnostics;
using System.Drawing.Text;
using OpenTK;
using OpenTK.Graphics.OpenGL;
2017-02-11 20:57:24 +00:00
using static Unity_Studio.UnityStudio;
2015-10-30 02:41:37 +00:00
namespace Unity_Studio
{
partial class UnityStudioForm : Form
2015-10-30 02:41:37 +00:00
{
2017-02-11 20:57:24 +00:00
private AssetPreloadData lastSelectedItem;
private AssetPreloadData lastLoadedAsset;
private string[] fileTypes = { "globalgamemanagers", "maindata.", "level*.", "*.assets", "*.sharedAssets", "CustomAssetBundle-*", "CAB-*", "BuildPlayer-*" };
private FMOD.System system;
private FMOD.Sound sound;
private FMOD.Channel channel;
private FMOD.SoundGroup masterSoundGroup;
2015-10-30 02:41:37 +00:00
private FMOD.MODE loopMode = FMOD.MODE.LOOP_OFF;
2017-02-11 20:57:24 +00:00
private uint FMODlenms;
2015-10-30 02:41:37 +00:00
private float FMODVolume = 0.8f;
private float FMODfrequency;
2017-02-11 20:57:24 +00:00
private Bitmap imageTexture;
2015-10-30 02:41:37 +00:00
#region OpenTK variables
int pgmID, pgmColorID, pgmBlackID;
int attributeVertexPosition;
int attributeNormalDirection;
int attributeVertexColor;
int uniformModelMatrix;
int uniformViewMatrix;
int vao;
int vboPositions;
int vboNormals;
int vboColors;
int vboModelMatrix;
int vboViewMatrix;
int eboElements;
2017-04-09 19:13:08 +00:00
Vector3[] vertexData;
Vector3[] normalData;
Vector3[] normal2Data;
2017-04-09 19:13:08 +00:00
Vector4[] colorData;
Matrix4 modelMatrixData;
Matrix4 viewMatrixData;
int[] indiceData;
int wireFrameMode;
int shadeMode;
int normalMode;
#endregion
//asset list sorting helpers
private int firstSortColumn = -1;
2017-02-11 20:57:24 +00:00
private int secondSortColumn;
private bool reverseSort;
private bool enableFiltering;
2015-10-30 02:41:37 +00:00
//tree search
2017-02-11 20:57:24 +00:00
private int nextGObject;
private List<GameObject> treeSrcResults = new List<GameObject>();
2017-02-11 20:57:24 +00:00
private PrivateFontCollection pfc = new PrivateFontCollection();
2015-11-02 08:11:26 +00:00
private AssetPreloadData selectasset;
2015-10-30 02:41:37 +00:00
[DllImport("gdi32.dll")]
private static extern IntPtr AddFontMemResourceEx(IntPtr pbFont, uint cbFont, IntPtr pdv, [In] ref uint pcFonts);
2017-04-09 19:13:08 +00:00
private void loadFile_Click(object sender, EventArgs e)
2015-10-30 02:41:37 +00:00
{
if (openFileDialog1.ShowDialog() == DialogResult.OK)
{
resetForm();
2017-02-11 20:57:24 +00:00
ThreadPool.QueueUserWorkItem(state =>
2015-10-30 02:41:37 +00:00
{
2017-11-28 19:57:32 +00:00
mainPath = Path.GetDirectoryName(openFileDialog1.FileNames[0]);
var bundle = false;
if (openFileDialog1.FilterIndex == 1 || openFileDialog1.FilterIndex == 3)
2015-10-30 02:41:37 +00:00
{
2017-11-09 19:36:08 +00:00
if (CheckBundleFile(openFileDialog1.FileNames[0]))
{
2017-11-28 19:57:32 +00:00
if (openFileDialog1.FileNames.Length > 1)
{
MessageBox.Show($"{Path.GetFileName(openFileDialog1.FileNames[0])} is bundle file, please select bundle file type to load this file");
return;
}
else
{
bundle = true;
}
2017-11-09 19:36:08 +00:00
}
2017-11-28 19:57:32 +00:00
}
else
{
bundle = true;
}
if (!bundle)
{
MergeSplitAssets(mainPath);
2017-02-11 20:57:24 +00:00
foreach (var i in openFileDialog1.FileNames)
{
unityFiles.Add(i);
unityFilesHash.Add(Path.GetFileName(i));
}
SetProgressBarValue(0);
SetProgressBarMaximum(unityFiles.Count);
//use a for loop because list size can change
2017-02-11 20:57:24 +00:00
for (int f = 0; f < unityFiles.Count; f++)
{
2017-02-11 20:57:24 +00:00
StatusStripUpdate("Loading " + Path.GetFileName(unityFiles[f]));
LoadAssetsFile(unityFiles[f]);
ProgressBarPerformStep();
}
2017-02-11 20:57:24 +00:00
}
else
2015-10-30 02:41:37 +00:00
{
2017-02-11 20:57:24 +00:00
SetProgressBarValue(0);
SetProgressBarMaximum(unityFiles.Count);
foreach (var filename in openFileDialog1.FileNames)
{
2017-02-11 20:57:24 +00:00
LoadBundleFile(filename);
ProgressBarPerformStep();
}
LoadAssetsFromBundle();
2017-02-11 20:57:24 +00:00
}
BuildAssetStrucutres();
unityFilesHash.Clear();
assetsfileListHash.Clear();
});
2015-10-30 02:41:37 +00:00
}
}
2017-04-09 19:13:08 +00:00
private void loadFolder_Click(object sender, EventArgs e)
2015-10-30 02:41:37 +00:00
{
2017-10-22 15:48:31 +00:00
var openFolderDialog1 = new OpenFolderDialog();
if (openFolderDialog1.ShowDialog(this) == DialogResult.OK)
2015-10-30 02:41:37 +00:00
{
2017-10-22 15:48:31 +00:00
mainPath = openFolderDialog1.Folder;
resetForm();
2017-10-22 15:48:31 +00:00
MergeSplitAssets(mainPath);
2017-10-22 15:48:31 +00:00
for (int t = 0; t < fileTypes.Length; t++)
{
string[] fileNames = Directory.GetFiles(mainPath, fileTypes[t], SearchOption.AllDirectories);
#region sort specific types alphanumerically
if (fileNames.Length > 0 && (t == 1 || t == 2))
2015-10-30 02:41:37 +00:00
{
2017-10-22 15:48:31 +00:00
var sortedList = fileNames.ToList();
sortedList.Sort((s1, s2) =>
2015-10-30 02:41:37 +00:00
{
2017-10-22 15:48:31 +00:00
string pattern = "([A-Za-z\\s]*)([0-9]*)";
string h1 = Regex.Match(Path.GetFileNameWithoutExtension(s1), pattern).Groups[1].Value;
string h2 = Regex.Match(Path.GetFileNameWithoutExtension(s2), pattern).Groups[1].Value;
if (h1 != h2)
return h1.CompareTo(h2);
string t1 = Regex.Match(Path.GetFileNameWithoutExtension(s1), pattern).Groups[2].Value;
string t2 = Regex.Match(Path.GetFileNameWithoutExtension(s2), pattern).Groups[2].Value;
if (t1 != "" && t2 != "")
return int.Parse(t1).CompareTo(int.Parse(t2));
return 0;
});
foreach (var i in sortedList)
{
2017-10-22 15:48:31 +00:00
unityFiles.Add(i);
unityFilesHash.Add(Path.GetFileName(i));
}
2015-10-30 02:41:37 +00:00
2017-10-22 15:48:31 +00:00
}
#endregion
else
2015-10-30 02:41:37 +00:00
{
2017-10-22 15:48:31 +00:00
foreach (var i in fileNames)
{
2017-10-22 15:48:31 +00:00
unityFiles.Add(i);
unityFilesHash.Add(Path.GetFileName(i));
}
2017-10-22 15:48:31 +00:00
}
2015-10-30 02:41:37 +00:00
}
2017-10-22 15:48:31 +00:00
unityFiles = unityFiles.Distinct().ToList();
progressBar1.Value = 0;
progressBar1.Maximum = unityFiles.Count;
ThreadPool.QueueUserWorkItem(delegate
{
//use a for loop because list size can change
for (int f = 0; f < unityFiles.Count; f++)
{
var fileName = unityFiles[f];
StatusStripUpdate("Loading " + Path.GetFileName(fileName));
LoadAssetsFile(fileName);
ProgressBarPerformStep();
}
unityFilesHash.Clear();
assetsfileListHash.Clear();
BuildAssetStrucutres();
});
2015-10-30 02:41:37 +00:00
}
}
private void extractBundleToolStripMenuItem_Click(object sender, EventArgs e)
{
OpenFileDialog openBundleDialog = new OpenFileDialog();
2017-11-09 19:36:08 +00:00
openBundleDialog.Filter = "Unity bundle files|*.*";
2015-10-30 02:41:37 +00:00
openBundleDialog.FilterIndex = 1;
openBundleDialog.RestoreDirectory = true;
openBundleDialog.Multiselect = true;
if (openBundleDialog.ShowDialog() == DialogResult.OK)
{
progressBar1.Value = 0;
progressBar1.Maximum = openBundleDialog.FileNames.Length;
int extractedCount = 0;
ThreadPool.QueueUserWorkItem(delegate
{
foreach (var fileName in openBundleDialog.FileNames)
{
2017-02-11 20:57:24 +00:00
extractedCount += extractBundleFile(fileName);
ProgressBarPerformStep();
}
2017-02-11 20:57:24 +00:00
StatusStripUpdate("Finished extracting " + extractedCount + " files.");
});
2015-10-30 02:41:37 +00:00
}
}
private void extractFolderToolStripMenuItem_Click(object sender, EventArgs e)
{
int extractedCount = 0;
List<string> bundleFiles = new List<string>();
2017-10-22 15:48:31 +00:00
var openFolderDialog1 = new OpenFolderDialog();
if (openFolderDialog1.ShowDialog(this) == DialogResult.OK)
2015-10-30 02:41:37 +00:00
{
2017-10-22 15:48:31 +00:00
string startPath = openFolderDialog1.Folder;
2015-10-30 02:41:37 +00:00
string[] fileTypes = new string[6] { "*.unity3d", "*.unity3d.lz4", "*.assetbundle", "*.assetbundle-*", "*.bundle", "*.bytes" };
foreach (var fileType in fileTypes)
{
string[] fileNames = Directory.GetFiles(startPath, fileType, SearchOption.AllDirectories);
bundleFiles.AddRange(fileNames);
}
progressBar1.Value = 0;
progressBar1.Maximum = bundleFiles.Count;
ThreadPool.QueueUserWorkItem(delegate
2015-10-30 02:41:37 +00:00
{
foreach (var fileName in bundleFiles)
{
2017-02-11 20:57:24 +00:00
extractedCount += extractBundleFile(fileName);
ProgressBarPerformStep();
}
2017-02-11 20:57:24 +00:00
StatusStripUpdate("Finished extracting " + extractedCount + " files.");
});
2015-10-30 02:41:37 +00:00
}
}
private void BuildAssetStrucutres()
2015-10-30 02:41:37 +00:00
{
bool optionLoadAssetsMenuItem = !dontLoadAssetsMenuItem.Checked;
bool optionDisplayAll = displayAll.Checked;
bool optionBuildHierarchyMenuItem = !dontBuildHierarchyMenuItem.Checked;
bool optionBuildClassStructuresMenuItem = buildClassStructuresMenuItem.Checked;
2015-10-30 02:41:37 +00:00
BuildAssetStructures(optionLoadAssetsMenuItem, optionDisplayAll, optionBuildHierarchyMenuItem, optionBuildClassStructuresMenuItem, displayOriginalName.Checked);
2015-10-30 02:41:37 +00:00
BeginInvoke(new Action(() =>
2015-10-30 02:41:37 +00:00
{
2017-02-11 20:57:24 +00:00
if (productName != "")
2015-10-30 02:41:37 +00:00
{
2017-04-09 19:13:08 +00:00
Text = "Unity Studio - " + productName + " - " + assetsfileList[0].m_Version + " - " + assetsfileList[0].platformStr;
}
2017-02-11 20:57:24 +00:00
else if (assetsfileList.Count > 0)
{
2017-04-09 19:13:08 +00:00
Text = "Unity Studio - no productName - " + assetsfileList[0].m_Version + " - " + assetsfileList[0].platformStr;
}
if (!dontLoadAssetsMenuItem.Checked)
{
2017-02-11 20:57:24 +00:00
assetListView.VirtualListSize = visibleAssets.Count;
resizeAssetListColumns();
}
if (!dontBuildHierarchyMenuItem.Checked)
{
sceneTreeView.BeginUpdate();
2017-02-11 20:57:24 +00:00
sceneTreeView.Nodes.AddRange(fileNodes.ToArray());
fileNodes.Clear();
sceneTreeView.EndUpdate();
}
if (buildClassStructuresMenuItem.Checked)
{
classesListView.BeginUpdate();
2017-02-11 20:57:24 +00:00
foreach (var version in AllClassStructures)
{
ListViewGroup versionGroup = new ListViewGroup(version.Key);
classesListView.Groups.Add(versionGroup);
foreach (var uclass in version.Value)
{
uclass.Value.Group = versionGroup;
classesListView.Items.Add(uclass.Value);
}
2015-10-30 02:41:37 +00:00
}
classesListView.EndUpdate();
2015-10-30 02:41:37 +00:00
}
2017-02-11 20:57:24 +00:00
StatusStripUpdate("Finished loading " + assetsfileList.Count + " files with " + (assetListView.Items.Count + sceneTreeView.Nodes.Count) + " exportable assets.");
treeSearch.Select();
}));
2015-10-30 02:41:37 +00:00
}
2015-11-02 08:11:26 +00:00
private void UnityStudioForm_KeyDown(object sender, KeyEventArgs e)
{
if (e.Control && e.Alt && e.KeyCode == Keys.D)
{
debugMenuItem.Visible = !debugMenuItem.Visible;
buildClassStructuresMenuItem.Checked = debugMenuItem.Visible;
dontLoadAssetsMenuItem.Checked = debugMenuItem.Visible;
dontBuildHierarchyMenuItem.Checked = debugMenuItem.Visible;
if (tabControl1.TabPages.Contains(tabPage3)) { tabControl1.TabPages.Remove(tabPage3); }
else { tabControl1.TabPages.Add(tabPage3); }
}
if (glControl1.Visible == true)
{
// --> Right
if (e.KeyCode == Keys.D)
{
if (e.Shift) //Move
{
viewMatrixData *= Matrix4.CreateTranslation(0.1f, 0, 0);
}
else //Rotate
{
viewMatrixData *= Matrix4.CreateRotationY(0.1f);
}
glControl1.Invalidate();
}
// <-- Left
if (e.KeyCode == Keys.A)
{
if (e.Shift) //Move
{
viewMatrixData *= Matrix4.CreateTranslation(-0.1f, 0, 0);
}
else //Rotate
{
viewMatrixData *= Matrix4.CreateRotationY(-0.1f);
}
glControl1.Invalidate();
}
// Up
if (e.KeyCode == Keys.W)
{
if (e.Control) //Toggle WireFrame
{
wireFrameMode = (wireFrameMode + 1) % 3;
glControl1.Invalidate();
}
else if (e.Shift) //Move
{
viewMatrixData *= Matrix4.CreateTranslation(0, 0.1f, 0);
}
else //Rotate
{
viewMatrixData *= Matrix4.CreateRotationX(0.1f);
}
glControl1.Invalidate();
}
// Down
if (e.KeyCode == Keys.S)
{
if (e.Control) //Toggle Shade
{
shadeMode = (shadeMode + 1) % 2;
glControl1.Invalidate();
}
else if (e.Shift) //Move
{
viewMatrixData *= Matrix4.CreateTranslation(0, -0.1f, 0);
}
else //Rotate
{
viewMatrixData *= Matrix4.CreateRotationX(-0.1f);
}
glControl1.Invalidate();
}
// Zoom Out
if (e.KeyCode == Keys.Q)
{
viewMatrixData *= Matrix4.CreateScale(0.9f);
glControl1.Invalidate();
}
// Zoom In
if (e.KeyCode == Keys.E)
{
viewMatrixData *= Matrix4.CreateScale(1.1f);
glControl1.Invalidate();
}
// Normal mode
if (e.Control && e.KeyCode == Keys.N)
{
normalMode = (normalMode + 1) % 2;
createVAO();
glControl1.Invalidate();
}
// Toggle Timer
if (e.KeyCode == Keys.T)
{
timerOpenTK.Enabled = !timerOpenTK.Enabled;
}
}
2015-11-02 08:11:26 +00:00
}
private void dontLoadAssetsMenuItem_CheckedChanged(object sender, EventArgs e)
{
if (dontLoadAssetsMenuItem.Checked)
{
dontBuildHierarchyMenuItem.Checked = true;
dontBuildHierarchyMenuItem.Enabled = false;
}
else { dontBuildHierarchyMenuItem.Enabled = true; }
}
2015-11-02 08:11:26 +00:00
private void exportClassStructuresMenuItem_Click(object sender, EventArgs e)
{
2017-02-11 20:57:24 +00:00
if (AllClassStructures.Count > 0)
2015-11-02 08:11:26 +00:00
{
2017-10-22 15:48:31 +00:00
var saveFolderDialog1 = new OpenFolderDialog();
if (saveFolderDialog1.ShowDialog(this) == DialogResult.OK)
2015-11-02 08:11:26 +00:00
{
progressBar1.Value = 0;
2017-02-11 20:57:24 +00:00
progressBar1.Maximum = AllClassStructures.Count;
2015-11-02 08:11:26 +00:00
2017-10-22 15:48:31 +00:00
var savePath = saveFolderDialog1.Folder;
2017-02-11 20:57:24 +00:00
foreach (var version in AllClassStructures)
2015-11-02 08:11:26 +00:00
{
if (version.Value.Count > 0)
{
string versionPath = savePath + "\\" + version.Key;
Directory.CreateDirectory(versionPath);
foreach (var uclass in version.Value)
{
string saveFile = versionPath + "\\" + uclass.Key + " " + uclass.Value.Text + ".txt";
using (StreamWriter TXTwriter = new StreamWriter(saveFile))
{
2017-01-25 11:38:44 +00:00
TXTwriter.Write(uclass.Value.membersstr);
2015-11-02 08:11:26 +00:00
}
}
}
progressBar1.PerformStep();
}
StatusStripUpdate("Finished exporting class structures");
progressBar1.Value = 0;
}
}
}
2015-10-30 02:41:37 +00:00
private void enablePreview_Check(object sender, EventArgs e)
{
if (lastLoadedAsset != null)
{
switch (lastLoadedAsset.Type2)
{
case 28:
{
if (enablePreview.Checked && imageTexture != null)
{
previewPanel.BackgroundImage = imageTexture;
}
else
{
previewPanel.BackgroundImage = Properties.Resources.preview;
previewPanel.BackgroundImageLayout = ImageLayout.Center;
2015-10-30 02:41:37 +00:00
}
}
break;
case 48:
case 49:
2017-01-15 15:20:40 +00:00
case 114:
2015-10-30 02:41:37 +00:00
textPreviewBox.Visible = !textPreviewBox.Visible;
break;
case 128:
fontPreviewBox.Visible = !fontPreviewBox.Visible;
break;
case 83:
{
FMODpanel.Visible = !FMODpanel.Visible;
if (sound != null && channel != null)
2015-10-30 02:41:37 +00:00
{
FMOD.RESULT result;
2015-10-30 02:41:37 +00:00
bool playing = false;
result = channel.isPlaying(out playing);
if (result == FMOD.RESULT.OK && playing)
2015-10-30 02:41:37 +00:00
{
result = channel.stop();
FMODreset();
2015-10-30 02:41:37 +00:00
}
}
else if (FMODpanel.Visible)
{
PreviewAsset(lastLoadedAsset);
2015-10-30 02:41:37 +00:00
}
break;
}
}
}
else if (lastSelectedItem != null && enablePreview.Checked)
{
lastLoadedAsset = lastSelectedItem;
PreviewAsset(lastLoadedAsset);
}
Properties.Settings.Default["enablePreview"] = enablePreview.Checked;
Properties.Settings.Default.Save();
}
private void displayAssetInfo_Check(object sender, EventArgs e)
{
if (displayInfo.Checked && assetInfoLabel.Text != null) { assetInfoLabel.Visible = true; }
else { assetInfoLabel.Visible = false; }
Properties.Settings.Default["displayInfo"] = displayInfo.Checked;
Properties.Settings.Default.Save();
}
private void MenuItem_CheckedChanged(object sender, EventArgs e)
{
Properties.Settings.Default[((ToolStripMenuItem)sender).Name] = ((ToolStripMenuItem)sender).Checked;
Properties.Settings.Default.Save();
}
private void assetGroupOptions_SelectedIndexChanged(object sender, EventArgs e)
{
Properties.Settings.Default["assetGroupOption"] = ((ToolStripComboBox)sender).SelectedIndex;
Properties.Settings.Default.Save();
}
private void showExpOpt_Click(object sender, EventArgs e)
{
ExportOptions exportOpt = new ExportOptions();
exportOpt.ShowDialog();
}
private void assetListView_RetrieveVirtualItem(object sender, RetrieveVirtualItemEventArgs e)
{
2017-02-11 20:57:24 +00:00
e.Item = visibleAssets[e.ItemIndex];
2015-10-30 02:41:37 +00:00
}
2015-10-30 02:41:37 +00:00
private void tabPageSelected(object sender, TabControlEventArgs e)
{
2015-11-02 08:11:26 +00:00
switch (e.TabPageIndex)
{
2017-09-23 23:14:18 +00:00
case 0:
treeSearch.Select();
_3DToolStripMenuItem.Visible = true;
exportToolStripMenuItem.Visible = false;
break;
2015-11-02 08:11:26 +00:00
case 1:
2017-09-23 23:14:18 +00:00
_3DToolStripMenuItem.Visible = false;
exportToolStripMenuItem.Visible = true;
resizeAssetListColumns(); //required because the ListView is not visible on app launch
2015-11-02 08:11:26 +00:00
classPreviewPanel.Visible = false;
previewPanel.Visible = true;
listSearch.Select();
break;
case 2:
2017-09-23 23:14:18 +00:00
_3DToolStripMenuItem.Visible = false;
exportToolStripMenuItem.Visible = false;
2015-11-02 08:11:26 +00:00
previewPanel.Visible = false;
classPreviewPanel.Visible = true;
break;
}
2015-10-30 02:41:37 +00:00
}
private void treeSearch_MouseEnter(object sender, EventArgs e)
{
treeTip.Show("Search with * ? widcards. Enter to scroll through results, Ctrl+Enter to select all results.", treeSearch, 5000);
}
private void treeSearch_Enter(object sender, EventArgs e)
{
if (treeSearch.Text == " Search ")
{
treeSearch.Text = "";
2017-04-09 19:13:08 +00:00
treeSearch.ForeColor = SystemColors.WindowText;
2015-10-30 02:41:37 +00:00
}
}
private void treeSearch_Leave(object sender, EventArgs e)
{
if (treeSearch.Text == "")
{
treeSearch.Text = " Search ";
2017-04-09 19:13:08 +00:00
treeSearch.ForeColor = SystemColors.GrayText;
2015-10-30 02:41:37 +00:00
}
}
private void recurseTreeCheck(TreeNodeCollection start)
{
foreach (GameObject GObject in start)
{
if (GObject.Text.Like(treeSearch.Text))
{
GObject.Checked = !GObject.Checked;
if (GObject.Checked) { GObject.EnsureVisible(); }
}
else { recurseTreeCheck(GObject.Nodes); }
}
}
private void treeSearch_TextChanged(object sender, EventArgs e)
{
treeSrcResults.Clear();
nextGObject = 0;
}
2015-10-30 02:41:37 +00:00
private void treeSearch_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyCode == Keys.Enter)
{
if (treeSrcResults.Count == 0)
2015-10-30 02:41:37 +00:00
{
2017-02-11 20:57:24 +00:00
foreach (var aFile in assetsfileList)
2015-10-30 02:41:37 +00:00
{
foreach (var GObject in aFile.GameObjectList.Values)
2015-10-30 02:41:37 +00:00
{
if (GObject.Text.Like(treeSearch.Text)) { treeSrcResults.Add(GObject); }
2015-10-30 02:41:37 +00:00
}
}
}
2015-10-30 02:41:37 +00:00
if (e.Control) //toggle all matching nodes
{
sceneTreeView.BeginUpdate();
//loop TreeView recursively to avoid children already checked by parent
2015-10-30 02:41:37 +00:00
recurseTreeCheck(sceneTreeView.Nodes);
sceneTreeView.EndUpdate();
}
else //make visible one by one
{
if (treeSrcResults.Count > 0)
2015-10-30 02:41:37 +00:00
{
if (nextGObject >= treeSrcResults.Count) { nextGObject = 0; }
treeSrcResults[nextGObject].EnsureVisible();
sceneTreeView.SelectedNode = treeSrcResults[nextGObject];
nextGObject++;
2015-10-30 02:41:37 +00:00
}
}
}
}
private void sceneTreeView_AfterCheck(object sender, TreeViewEventArgs e)
{
foreach (GameObject childNode in e.Node.Nodes)
{
childNode.Checked = e.Node.Checked;
}
}
private void resizeAssetListColumns()
{
assetListView.AutoResizeColumn(1, ColumnHeaderAutoResizeStyle.HeaderSize);
assetListView.AutoResizeColumn(1, ColumnHeaderAutoResizeStyle.ColumnContent);
assetListView.AutoResizeColumn(2, ColumnHeaderAutoResizeStyle.HeaderSize);
assetListView.AutoResizeColumn(2, ColumnHeaderAutoResizeStyle.ColumnContent);
var vscrollwidth = SystemInformation.VerticalScrollBarWidth;
2017-02-11 20:57:24 +00:00
var hasvscroll = (visibleAssets.Count / (float)assetListView.Height) > 0.0567f;
columnHeaderName.Width = assetListView.Width - columnHeaderType.Width - columnHeaderSize.Width - (hasvscroll ? (5 + vscrollwidth) : 5);
}
private void tabPage2_Resize(object sender, EventArgs e)
2015-10-30 02:41:37 +00:00
{
resizeAssetListColumns();
}
2015-10-30 02:41:37 +00:00
private void listSearch_Enter(object sender, EventArgs e)
{
if (listSearch.Text == " Filter ")
{
listSearch.Text = "";
2017-04-09 19:13:08 +00:00
listSearch.ForeColor = SystemColors.WindowText;
enableFiltering = true;
2015-10-30 02:41:37 +00:00
}
}
private void listSearch_Leave(object sender, EventArgs e)
{
if (listSearch.Text == "")
{
enableFiltering = false;
2015-10-30 02:41:37 +00:00
listSearch.Text = " Filter ";
2017-04-09 19:13:08 +00:00
listSearch.ForeColor = SystemColors.GrayText;
2015-10-30 02:41:37 +00:00
}
}
private void ListSearchTextChanged(object sender, EventArgs e)
{
if (enableFiltering)
{
assetListView.BeginUpdate();
assetListView.SelectedIndices.Clear();
2017-04-09 19:13:08 +00:00
visibleAssets = exportableAssets.FindAll(ListAsset => ListAsset.Text.IndexOf(listSearch.Text, StringComparison.CurrentCultureIgnoreCase) >= 0);
2017-02-11 20:57:24 +00:00
assetListView.VirtualListSize = visibleAssets.Count;
assetListView.EndUpdate();
}
}
2015-10-30 02:41:37 +00:00
private void assetListView_ColumnClick(object sender, ColumnClickEventArgs e)
{
if (firstSortColumn != e.Column)
{
//sorting column has been changed
reverseSort = false;
secondSortColumn = firstSortColumn;
}
else { reverseSort = !reverseSort; }
firstSortColumn = e.Column;
2015-10-30 02:41:37 +00:00
assetListView.BeginUpdate();
assetListView.SelectedIndices.Clear();
switch (e.Column)
{
case 0:
2017-02-11 20:57:24 +00:00
visibleAssets.Sort(delegate (AssetPreloadData a, AssetPreloadData b)
2015-10-30 02:41:37 +00:00
{
int xdiff = reverseSort ? b.Text.CompareTo(a.Text) : a.Text.CompareTo(b.Text);
if (xdiff != 0) return xdiff;
2017-11-09 16:04:27 +00:00
return secondSortColumn == 1 ? a.TypeString.CompareTo(b.TypeString) : a.fullSize.CompareTo(b.fullSize);
});
2015-10-30 02:41:37 +00:00
break;
case 1:
2017-02-11 20:57:24 +00:00
visibleAssets.Sort(delegate (AssetPreloadData a, AssetPreloadData b)
2015-10-30 02:41:37 +00:00
{
int xdiff = reverseSort ? b.TypeString.CompareTo(a.TypeString) : a.TypeString.CompareTo(b.TypeString);
if (xdiff != 0) return xdiff;
2017-11-09 16:04:27 +00:00
return secondSortColumn == 2 ? a.fullSize.CompareTo(b.fullSize) : a.Text.CompareTo(b.Text);
});
2015-10-30 02:41:37 +00:00
break;
case 2:
2017-02-11 20:57:24 +00:00
visibleAssets.Sort(delegate (AssetPreloadData a, AssetPreloadData b)
2015-10-30 02:41:37 +00:00
{
2017-11-09 16:04:27 +00:00
int xdiff = reverseSort ? b.fullSize.CompareTo(a.fullSize) : a.fullSize.CompareTo(b.fullSize);
if (xdiff != 0) return xdiff;
2017-04-09 19:13:08 +00:00
return secondSortColumn == 1 ? a.TypeString.CompareTo(b.TypeString) : a.Text.CompareTo(b.Text);
});
2015-10-30 02:41:37 +00:00
break;
}
2015-10-30 02:41:37 +00:00
assetListView.EndUpdate();
resizeAssetListColumns();
2015-10-30 02:41:37 +00:00
}
private void selectAsset(object sender, ListViewItemSelectionChangedEventArgs e)
{
2016-11-08 12:31:07 +00:00
previewPanel.BackgroundImage = Properties.Resources.preview;
2017-04-09 19:13:08 +00:00
previewPanel.BackgroundImageLayout = ImageLayout.Center;
2015-10-30 02:41:37 +00:00
assetInfoLabel.Visible = false;
assetInfoLabel.Text = null;
textPreviewBox.Visible = false;
fontPreviewBox.Visible = false;
pfc.Dispose();
2015-10-30 02:41:37 +00:00
FMODpanel.Visible = false;
glControl1.Visible = false;
2015-10-30 02:41:37 +00:00
lastLoadedAsset = null;
StatusStripUpdate("");
2015-10-30 02:41:37 +00:00
FMODreset();
2015-10-30 02:41:37 +00:00
lastSelectedItem = (AssetPreloadData)e.Item;
if (e.IsSelected)
{
assetInfoLabel.Text = lastSelectedItem.InfoText;
if (displayInfo.Checked && assetInfoLabel.Text != null) { assetInfoLabel.Visible = true; } //only display the label if asset has info text
if (enablePreview.Checked)
{
lastLoadedAsset = lastSelectedItem;
PreviewAsset(lastLoadedAsset);
}
}
}
2015-11-02 08:11:26 +00:00
private void classesListView_ItemSelectionChanged(object sender, ListViewItemSelectionChangedEventArgs e)
{
if (e.IsSelected)
{
2017-01-25 11:38:44 +00:00
classTextBox.Text = ((ClassStruct)classesListView.SelectedItems[0]).membersstr;
2015-11-02 08:11:26 +00:00
}
}
2015-10-30 02:41:37 +00:00
private void PreviewAsset(AssetPreloadData asset)
2017-02-11 20:57:24 +00:00
{
2015-10-30 02:41:37 +00:00
switch (asset.Type2)
{
#region Texture2D
case 28: //Texture2D
{
2016-11-08 12:31:07 +00:00
if (imageTexture != null)
imageTexture.Dispose();
var m_Texture2D = new Texture2D(asset, true);
imageTexture = m_Texture2D.ConvertToBitmap(true);
if (imageTexture != null)
{
2015-10-30 02:41:37 +00:00
previewPanel.BackgroundImage = imageTexture;
if (imageTexture.Width > previewPanel.Width || imageTexture.Height > previewPanel.Height)
previewPanel.BackgroundImageLayout = ImageLayout.Zoom;
else
previewPanel.BackgroundImageLayout = ImageLayout.Center;
2015-10-30 02:41:37 +00:00
}
else
{
2017-10-23 14:22:24 +00:00
StatusStripUpdate("Unsupported image for preview");
}
2015-10-30 02:41:37 +00:00
break;
}
#endregion
#region AudioClip
case 83: //AudioClip
{
AudioClip m_AudioClip = new AudioClip(asset, true);
2017-11-13 09:04:29 +00:00
if (m_AudioClip.m_AudioData == null)
break;
FMOD.RESULT result;
FMOD.CREATESOUNDEXINFO exinfo = new FMOD.CREATESOUNDEXINFO();
exinfo.cbsize = Marshal.SizeOf(exinfo);
exinfo.length = (uint)m_AudioClip.m_Size;
2015-10-30 02:41:37 +00:00
result = system.createSound(m_AudioClip.m_AudioData, (FMOD.MODE.OPENMEMORY | loopMode), ref exinfo, out sound);
if (ERRCHECK(result)) { break; }
2015-10-30 02:41:37 +00:00
FMOD.Sound subsound;
result = sound.getSubSound(0, out subsound);
if (result == FMOD.RESULT.OK)
{
sound = subsound;
}
2015-10-30 02:41:37 +00:00
result = sound.getLength(out FMODlenms, FMOD.TIMEUNIT.MS);
if (ERRCHECK(result)) { break; }
result = system.playSound(sound, null, true, out channel);
if (ERRCHECK(result)) { break; }
2015-10-30 02:41:37 +00:00
FMODpanel.Visible = true;
2015-10-30 02:41:37 +00:00
result = channel.getFrequency(out FMODfrequency);
if (ERRCHECK(result)) { break; }
2015-10-30 02:41:37 +00:00
2017-02-11 20:57:24 +00:00
FMODinfoLabel.Text = FMODfrequency + " Hz";
FMODtimerLabel.Text = "0:0.0 / " + (FMODlenms / 1000 / 60) + ":" + (FMODlenms / 1000 % 60) + "." + (FMODlenms / 10 % 100);
2015-10-30 02:41:37 +00:00
break;
}
#endregion
2017-01-15 11:57:41 +00:00
#region Shader
2015-10-30 02:41:37 +00:00
case 48:
2017-01-15 11:57:41 +00:00
{
Shader m_TextAsset = new Shader(asset, true);
string m_Script_Text = Encoding.UTF8.GetString(m_TextAsset.m_Script);
m_Script_Text = Regex.Replace(m_Script_Text, "(?<!\r)\n", "\r\n");
2017-08-21 14:00:28 +00:00
m_Script_Text = m_Script_Text.Replace("\0", "\\0");
2017-01-15 11:57:41 +00:00
textPreviewBox.Text = m_Script_Text;
textPreviewBox.Visible = true;
break;
}
#endregion
#region TextAsset
2015-10-30 02:41:37 +00:00
case 49:
{
TextAsset m_TextAsset = new TextAsset(asset, true);
2017-01-15 11:57:41 +00:00
string m_Script_Text = Encoding.UTF8.GetString(m_TextAsset.m_Script);
2015-10-30 02:41:37 +00:00
m_Script_Text = Regex.Replace(m_Script_Text, "(?<!\r)\n", "\r\n");
textPreviewBox.Text = m_Script_Text;
textPreviewBox.Visible = true;
break;
}
#endregion
2017-01-15 15:20:40 +00:00
#region MonoBehaviour
case 114:
{
MonoBehaviour m_MonoBehaviour = new MonoBehaviour(asset, true);
textPreviewBox.Text = m_MonoBehaviour.serializedText;
textPreviewBox.Visible = true;
break;
}
#endregion
2015-10-30 02:41:37 +00:00
#region Font
case 128: //Font
{
unityFont m_Font = new unityFont(asset, true);
if (m_Font.m_FontData != null)
2015-10-30 02:41:37 +00:00
{
IntPtr data = Marshal.AllocCoTaskMem(m_Font.m_FontData.Length);
Marshal.Copy(m_Font.m_FontData, 0, data, m_Font.m_FontData.Length);
// We HAVE to do this to register the font to the system (Weird .NET bug !)
uint cFonts = 0;
var re = AddFontMemResourceEx(data, (uint)m_Font.m_FontData.Length, IntPtr.Zero, ref cFonts);
if (re != IntPtr.Zero)
{
pfc = new PrivateFontCollection();
pfc.AddMemoryFont(data, m_Font.m_FontData.Length);
Marshal.FreeCoTaskMem(data);
if (pfc.Families.Length > 0)
{
//textPreviewBox.Font = new Font(pfc.Families[0], 16, FontStyle.Regular);
//textPreviewBox.Text = "abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWYZ\r\n1234567890.:,;'\"(!?)+-*/=\r\nThe quick brown fox jumps over the lazy dog. 1234567890";
fontPreviewBox.SelectionStart = 0;
fontPreviewBox.SelectionLength = 80;
fontPreviewBox.SelectionFont = new Font(pfc.Families[0], 16, FontStyle.Regular);
fontPreviewBox.SelectionStart = 81;
fontPreviewBox.SelectionLength = 56;
fontPreviewBox.SelectionFont = new Font(pfc.Families[0], 12, FontStyle.Regular);
fontPreviewBox.SelectionStart = 138;
fontPreviewBox.SelectionLength = 56;
fontPreviewBox.SelectionFont = new Font(pfc.Families[0], 18, FontStyle.Regular);
fontPreviewBox.SelectionStart = 195;
fontPreviewBox.SelectionLength = 56;
fontPreviewBox.SelectionFont = new Font(pfc.Families[0], 24, FontStyle.Regular);
fontPreviewBox.SelectionStart = 252;
fontPreviewBox.SelectionLength = 56;
fontPreviewBox.SelectionFont = new Font(pfc.Families[0], 36, FontStyle.Regular);
fontPreviewBox.SelectionStart = 309;
fontPreviewBox.SelectionLength = 56;
fontPreviewBox.SelectionFont = new Font(pfc.Families[0], 48, FontStyle.Regular);
fontPreviewBox.SelectionStart = 366;
fontPreviewBox.SelectionLength = 56;
fontPreviewBox.SelectionFont = new Font(pfc.Families[0], 60, FontStyle.Regular);
fontPreviewBox.SelectionStart = 423;
fontPreviewBox.SelectionLength = 55;
fontPreviewBox.SelectionFont = new Font(pfc.Families[0], 72, FontStyle.Regular);
fontPreviewBox.Visible = true;
}
break;
}
2015-10-30 02:41:37 +00:00
}
StatusStripUpdate("Unsupported font for preview. Try to export.");
2015-10-30 02:41:37 +00:00
break;
}
#endregion
#region Mesh
case 43: //Mesh
{
var m_Mesh = new Mesh(asset, true);
if (m_Mesh.m_VertexCount > 0)
{
2017-11-09 23:11:27 +00:00
glControl1.Visible = true;
viewMatrixData = Matrix4.CreateRotationY(-(float)Math.PI / 4) * Matrix4.CreateRotationX(-(float)Math.PI / 6);
#region Vertices
int count = 3;
if (m_Mesh.m_Vertices.Length == m_Mesh.m_VertexCount * 4)
{
count = 4;
}
2017-04-09 19:13:08 +00:00
vertexData = new Vector3[m_Mesh.m_VertexCount];
// Calculate Bounding
float[] min = new float[3];
float[] max = new float[3];
for (int i = 0; i < 3; i++)
{
min[i] = m_Mesh.m_Vertices[i];
max[i] = m_Mesh.m_Vertices[i];
}
for (int v = 0; v < m_Mesh.m_VertexCount; v++)
{
for (int i = 0; i < 3; i++)
{
min[i] = Math.Min(min[i], m_Mesh.m_Vertices[v * count + i]);
max[i] = Math.Max(max[i], m_Mesh.m_Vertices[v * count + i]);
}
vertexData[v] = new Vector3(
m_Mesh.m_Vertices[v * count],
m_Mesh.m_Vertices[v * count + 1],
m_Mesh.m_Vertices[v * count + 2]);
}
// Calculate modelMatrix
Vector3 dist = Vector3.One, offset = Vector3.Zero;
for (int i = 0; i < 3; i++)
{
dist[i] = max[i] - min[i];
offset[i] = (max[i] + min[i]) / 2;
}
float d = Math.Max(1e-5f, dist.Length);
Vector3 scale = new Vector3(2f / d);
2017-09-30 07:32:09 +00:00
modelMatrixData = Matrix4.CreateTranslation(-offset) * Matrix4.CreateScale(2f / d);
#endregion
#region Indicies
indiceData = new int[m_Mesh.m_Indices.Count];
for (int i = 0; i < m_Mesh.m_Indices.Count; i = i + 3)
{
indiceData[i] = (int)m_Mesh.m_Indices[i];
indiceData[i + 1] = (int)m_Mesh.m_Indices[i + 1];
indiceData[i + 2] = (int)m_Mesh.m_Indices[i + 2];
}
#endregion
#region Normals
if (m_Mesh.m_Normals != null && m_Mesh.m_Normals.Length > 0)
{
if (m_Mesh.m_Normals.Length == m_Mesh.m_VertexCount * 3)
count = 3;
else if (m_Mesh.m_Normals.Length == m_Mesh.m_VertexCount * 4)
count = 4;
2017-04-09 19:13:08 +00:00
normalData = new Vector3[m_Mesh.m_VertexCount];
for (int n = 0; n < m_Mesh.m_VertexCount; n++)
{
2017-04-09 19:13:08 +00:00
normalData[n] = new Vector3(
m_Mesh.m_Normals[n * count],
m_Mesh.m_Normals[n * count + 1],
m_Mesh.m_Normals[n * count + 2]);
}
}
2017-04-12 06:43:41 +00:00
else
normalData = null;
// calculate normal by ourself
normal2Data = new Vector3[m_Mesh.m_VertexCount];
int[] normalCalculatedCount = new int[m_Mesh.m_VertexCount];
for (int i = 0; i < m_Mesh.m_VertexCount; i++)
{
normal2Data[i] = Vector3.Zero;
normalCalculatedCount[i] = 0;
}
for (int i = 0; i < m_Mesh.m_Indices.Count; i = i + 3)
{
Vector3 dir1 = vertexData[indiceData[i + 1]] - vertexData[indiceData[i]];
Vector3 dir2 = vertexData[indiceData[i + 2]] - vertexData[indiceData[i]];
Vector3 normal = Vector3.Cross(dir1, dir2);
normal.Normalize();
for (int j = 0; j < 3; j++)
{
normal2Data[indiceData[i + j]] += normal;
2017-10-22 15:48:31 +00:00
normalCalculatedCount[indiceData[i + j]]++;
}
}
for (int i = 0; i < m_Mesh.m_VertexCount; i++)
{
2017-10-22 15:48:31 +00:00
if (normalCalculatedCount[i] == 0)
normal2Data[i] = new Vector3(0, 1, 0);
else
normal2Data[i] /= normalCalculatedCount[i];
}
#endregion
#region Colors
if (m_Mesh.m_Colors == null)
{
2017-04-09 19:13:08 +00:00
colorData = new Vector4[m_Mesh.m_VertexCount];
for (int c = 0; c < m_Mesh.m_VertexCount; c++)
{
colorData[c] = new Vector4(0.5f, 0.5f, 0.5f, 1.0f);
}
}
else if (m_Mesh.m_Colors.Length == m_Mesh.m_VertexCount * 3)
{
2017-04-09 19:13:08 +00:00
colorData = new Vector4[m_Mesh.m_VertexCount];
for (int c = 0; c < m_Mesh.m_VertexCount; c++)
{
2017-04-09 19:13:08 +00:00
colorData[c] = new Vector4(
2017-04-13 07:21:57 +00:00
m_Mesh.m_Colors[c * 3],
m_Mesh.m_Colors[c * 3 + 1],
m_Mesh.m_Colors[c * 3 + 2],
1.0f);
}
}
else
{
2017-04-09 19:13:08 +00:00
colorData = new Vector4[m_Mesh.m_VertexCount];
for (int c = 0; c < m_Mesh.m_VertexCount; c++)
{
2017-04-09 19:13:08 +00:00
colorData[c] = new Vector4(
m_Mesh.m_Colors[c * 4],
m_Mesh.m_Colors[c * 4 + 1],
m_Mesh.m_Colors[c * 4 + 2],
m_Mesh.m_Colors[c * 4 + 3]);
}
}
#endregion
2017-11-09 23:11:27 +00:00
createVAO();
}
StatusStripUpdate("Using OpenGL Version: " + GL.GetString(StringName.Version) + "\n"
+ "'T'=Start/Stop Rotation | 'WASD'=Manual Rotate | 'Shift WASD'=Move | 'Q/E'=Zoom \n"
+ "'Ctrl W'=Wireframe | 'Ctrl S'=Shade | 'Ctrl N'=ReNormal ");
}
break;
#endregion
2017-11-10 14:00:09 +00:00
#region VideoClip
case 329:
2017-11-13 09:46:26 +00:00
case 152: //MovieTexture
2017-11-10 14:00:09 +00:00
{
2017-11-13 09:46:26 +00:00
StatusStripUpdate("Only supported export.");
2017-11-10 14:00:09 +00:00
break;
}
#endregion
default:
{
2017-11-13 09:04:29 +00:00
var str = asset.ViewStruct();
2017-11-10 14:00:09 +00:00
if (str != null)
2017-03-31 16:41:18 +00:00
{
textPreviewBox.Text = str;
textPreviewBox.Visible = true;
}
2017-04-03 21:49:26 +00:00
else
StatusStripUpdate("Only supported export the raw file.");
break;
}
2015-10-30 02:41:37 +00:00
}
}
private void FMODinit()
{
FMODreset();
2015-10-30 02:41:37 +00:00
FMOD.RESULT result;
2015-10-30 02:41:37 +00:00
uint version = 0;
result = FMOD.Factory.System_Create(out system);
if (ERRCHECK(result)) { return; }
2015-10-30 02:41:37 +00:00
result = system.getVersion(out version);
2015-10-30 02:41:37 +00:00
ERRCHECK(result);
if (version < FMOD.VERSION.number)
{
MessageBox.Show("Error! You are using an old version of FMOD " + version.ToString("X") + ". This program requires " + FMOD.VERSION.number.ToString("X") + ".");
Application.Exit();
}
2017-11-09 18:27:36 +00:00
result = system.init(1, FMOD.INITFLAGS.NORMAL, IntPtr.Zero);
if (ERRCHECK(result)) { return; }
2015-10-30 02:41:37 +00:00
result = system.getMasterSoundGroup(out masterSoundGroup);
if (ERRCHECK(result)) { return; }
2015-10-30 02:41:37 +00:00
result = masterSoundGroup.setVolume(FMODVolume);
if (ERRCHECK(result)) { return; }
}
private void FMODreset()
{
timer.Stop();
FMODprogressBar.Value = 0;
FMODtimerLabel.Text = "0:00.0 / 0:00.0";
FMODstatusLabel.Text = "Stopped";
FMODinfoLabel.Text = "";
2018-01-08 15:53:15 +00:00
if (sound != null && sound.isValid())
{
var result = sound.release();
2017-11-09 18:27:36 +00:00
ERRCHECK(result);
sound = null;
}
2015-10-30 02:41:37 +00:00
}
private void FMODplayButton_Click(object sender, EventArgs e)
{
FMOD.RESULT result;
if (sound != null && channel != null)
2015-10-30 02:41:37 +00:00
{
timer.Start();
bool playing = false;
result = channel.isPlaying(out playing);
2015-10-30 02:41:37 +00:00
if ((result != FMOD.RESULT.OK) && (result != FMOD.RESULT.ERR_INVALID_HANDLE))
{
if (ERRCHECK(result)) { return; }
2015-10-30 02:41:37 +00:00
}
if (playing)
{
result = channel.stop();
if (ERRCHECK(result)) { return; }
2015-10-30 02:41:37 +00:00
result = system.playSound(sound, null, false, out channel);
if (ERRCHECK(result)) { return; }
2015-10-30 02:41:37 +00:00
FMODpauseButton.Text = "Pause";
}
else
{
result = system.playSound(sound, null, false, out channel);
if (ERRCHECK(result)) { return; }
2015-10-30 02:41:37 +00:00
FMODstatusLabel.Text = "Playing";
if (FMODprogressBar.Value > 0)
{
uint newms = FMODlenms / 1000 * (uint)FMODprogressBar.Value;
2015-10-30 02:41:37 +00:00
result = channel.setPosition(newms, FMOD.TIMEUNIT.MS);
if ((result != FMOD.RESULT.OK) && (result != FMOD.RESULT.ERR_INVALID_HANDLE))
{
if (ERRCHECK(result)) { return; }
}
2015-10-30 02:41:37 +00:00
}
}
}
}
private void FMODpauseButton_Click(object sender, EventArgs e)
{
FMOD.RESULT result;
if (sound != null && channel != null)
2015-10-30 02:41:37 +00:00
{
bool playing = false;
bool paused = false;
result = channel.isPlaying(out playing);
2015-10-30 02:41:37 +00:00
if ((result != FMOD.RESULT.OK) && (result != FMOD.RESULT.ERR_INVALID_HANDLE))
{
if (ERRCHECK(result)) { return; }
2015-10-30 02:41:37 +00:00
}
if (playing)
{
result = channel.getPaused(out paused);
if (ERRCHECK(result)) { return; }
2015-10-30 02:41:37 +00:00
result = channel.setPaused(!paused);
if (ERRCHECK(result)) { return; }
2015-10-30 02:41:37 +00:00
if (paused)
{
FMODstatusLabel.Text = (playing ? "Playing" : "Stopped");
FMODpauseButton.Text = "Pause";
timer.Start();
}
else
{
FMODstatusLabel.Text = "Paused";
FMODpauseButton.Text = "Resume";
timer.Stop();
}
}
}
}
private void FMODstopButton_Click(object sender, EventArgs e)
{
FMOD.RESULT result;
if (channel != null)
{
bool playing = false;
result = channel.isPlaying(out playing);
2015-10-30 02:41:37 +00:00
if ((result != FMOD.RESULT.OK) && (result != FMOD.RESULT.ERR_INVALID_HANDLE))
{
if (ERRCHECK(result)) { return; }
2015-10-30 02:41:37 +00:00
}
if (playing)
{
result = channel.stop();
if (ERRCHECK(result)) { return; }
2015-10-30 02:41:37 +00:00
//channel = null;
//don't FMODreset, it will nullify the sound
2015-10-30 02:41:37 +00:00
timer.Stop();
FMODprogressBar.Value = 0;
FMODtimerLabel.Text = "0:00.0 / 0:00.0";
FMODstatusLabel.Text = "Stopped";
2015-10-30 02:41:37 +00:00
FMODpauseButton.Text = "Pause";
}
}
}
private void FMODloopButton_CheckedChanged(object sender, EventArgs e)
{
FMOD.RESULT result;
if (FMODloopButton.Checked)
{
loopMode = FMOD.MODE.LOOP_NORMAL;
}
else
{
loopMode = FMOD.MODE.LOOP_OFF;
}
if (sound != null)
{
result = sound.setMode(loopMode);
if (ERRCHECK(result)) { return; }
2015-10-30 02:41:37 +00:00
}
if (channel != null)
{
bool playing = false;
result = channel.isPlaying(out playing);
2015-10-30 02:41:37 +00:00
if ((result != FMOD.RESULT.OK) && (result != FMOD.RESULT.ERR_INVALID_HANDLE))
{
if (ERRCHECK(result)) { return; }
2015-10-30 02:41:37 +00:00
}
bool paused = false;
result = channel.getPaused(out paused);
2015-10-30 02:41:37 +00:00
if ((result != FMOD.RESULT.OK) && (result != FMOD.RESULT.ERR_INVALID_HANDLE))
{
if (ERRCHECK(result)) { return; }
2015-10-30 02:41:37 +00:00
}
if (playing || paused)
{
result = channel.setMode(loopMode);
if (ERRCHECK(result)) { return; }
2015-10-30 02:41:37 +00:00
}
}
}
private void FMODvolumeBar_ValueChanged(object sender, EventArgs e)
{
FMOD.RESULT result;
FMODVolume = Convert.ToSingle(FMODvolumeBar.Value) / 10;
result = masterSoundGroup.setVolume(FMODVolume);
if (ERRCHECK(result)) { return; }
2015-10-30 02:41:37 +00:00
}
private void FMODprogressBar_Scroll(object sender, EventArgs e)
{
if (channel != null)
{
uint newms = FMODlenms / 1000 * (uint)FMODprogressBar.Value;
2015-10-30 02:41:37 +00:00
FMODtimerLabel.Text = (newms / 1000 / 60) + ":" + (newms / 1000 % 60) + "." + (newms / 10 % 100) + "/" + (FMODlenms / 1000 / 60) + ":" + (FMODlenms / 1000 % 60) + "." + (FMODlenms / 10 % 100);
}
}
private void FMODprogressBar_MouseDown(object sender, MouseEventArgs e)
{
timer.Stop();
}
private void FMODprogressBar_MouseUp(object sender, MouseEventArgs e)
{
if (channel != null)
{
FMOD.RESULT result;
uint newms = FMODlenms / 1000 * (uint)FMODprogressBar.Value;
2015-10-30 02:41:37 +00:00
result = channel.setPosition(newms, FMOD.TIMEUNIT.MS);
if ((result != FMOD.RESULT.OK) && (result != FMOD.RESULT.ERR_INVALID_HANDLE))
{
if (ERRCHECK(result)) { return; }
2015-10-30 02:41:37 +00:00
}
bool playing = false;
result = channel.isPlaying(out playing);
2015-10-30 02:41:37 +00:00
if ((result != FMOD.RESULT.OK) && (result != FMOD.RESULT.ERR_INVALID_HANDLE))
{
if (ERRCHECK(result)) { return; }
2015-10-30 02:41:37 +00:00
}
if (playing) { timer.Start(); }
}
}
private void timer_Tick(object sender, EventArgs e)
{
FMOD.RESULT result;
uint ms = 0;
bool playing = false;
bool paused = false;
if (channel != null)
{
result = channel.getPosition(out ms, FMOD.TIMEUNIT.MS);
2015-10-30 02:41:37 +00:00
if ((result != FMOD.RESULT.OK) && (result != FMOD.RESULT.ERR_INVALID_HANDLE))
{
ERRCHECK(result);
}
result = channel.isPlaying(out playing);
2015-10-30 02:41:37 +00:00
if ((result != FMOD.RESULT.OK) && (result != FMOD.RESULT.ERR_INVALID_HANDLE))
{
ERRCHECK(result);
}
result = channel.getPaused(out paused);
2015-10-30 02:41:37 +00:00
if ((result != FMOD.RESULT.OK) && (result != FMOD.RESULT.ERR_INVALID_HANDLE))
{
ERRCHECK(result);
}
}
FMODtimerLabel.Text = (ms / 1000 / 60) + ":" + (ms / 1000 % 60) + "." + (ms / 10 % 100) + " / " + (FMODlenms / 1000 / 60) + ":" + (FMODlenms / 1000 % 60) + "." + (FMODlenms / 10 % 100);
FMODprogressBar.Value = (int)(ms * 1000 / FMODlenms);
FMODstatusLabel.Text = (paused ? "Paused " : playing ? "Playing" : "Stopped");
if (system != null && channel != null)
2015-10-30 02:41:37 +00:00
{
system.update();
}
}
private bool ERRCHECK(FMOD.RESULT result)
2015-10-30 02:41:37 +00:00
{
if (result != FMOD.RESULT.OK)
{
FMODreset();
StatusStripUpdate("FMOD error! " + result + " - " + FMOD.Error.String(result));
return true;
2015-10-30 02:41:37 +00:00
}
2017-04-09 19:13:08 +00:00
return false;
2015-10-30 02:41:37 +00:00
}
private void all3DObjectssplitToolStripMenuItem_Click(object sender, EventArgs e)
{
if (sceneTreeView.Nodes.Count > 0)
{
2017-10-22 15:48:31 +00:00
var saveFolderDialog1 = new OpenFolderDialog();
if (saveFolderDialog1.ShowDialog(this) == DialogResult.OK)
{
2017-10-22 15:48:31 +00:00
var savePath = saveFolderDialog1.Folder;
savePath = savePath + "\\";
switch ((bool)Properties.Settings.Default["showExpOpt"])
{
case true:
ExportOptions exportOpt = new ExportOptions();
if (exportOpt.ShowDialog() == DialogResult.OK) { goto case false; }
break;
case false:
{
progressBar1.Value = 0;
progressBar1.Maximum = sceneTreeView.Nodes.Count;
//防止主界面假死
ThreadPool.QueueUserWorkItem(delegate
{
2017-08-20 22:46:46 +00:00
Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US");
sceneTreeView.Invoke(new Action(() =>
{
//挂起控件防止更新
sceneTreeView.BeginUpdate();
//先取消所有Node的选中
foreach (TreeNode i in sceneTreeView.Nodes)
{
i.Checked = false;
}
}));
//遍历根节点
foreach (TreeNode i in sceneTreeView.Nodes)
{
if (i.Nodes.Count > 0)
{
//遍历一级子节点
foreach (TreeNode j in i.Nodes)
{
2016-11-08 12:31:07 +00:00
//加上时间因为可能有重名的object
var filename = j.Text + DateTime.Now.ToString("_mm_ss_ffff");
//选中它和它的子节点
sceneTreeView.Invoke(new Action(() => j.Checked = true));
2017-11-28 19:57:32 +00:00
//处理非法文件名
var name = FixFileName(savePath + filename + ".fbx");
//导出FBX
2017-11-28 19:57:32 +00:00
WriteFBX(name, false);
//取消选中
sceneTreeView.Invoke(new Action(() => j.Checked = false));
}
}
ProgressBarPerformStep();
}
//取消挂起
sceneTreeView.Invoke(new Action(() => sceneTreeView.EndUpdate()));
if (openAfterExport.Checked) { Process.Start(savePath); }
});
break;
}
}
}
}
else { StatusStripUpdate("No Objects available for export"); }
}
2015-10-30 02:41:37 +00:00
private void Export3DObjects_Click(object sender, EventArgs e)
{
if (sceneTreeView.Nodes.Count > 0)
{
bool exportSwitch = (((ToolStripItem)sender).Name == "exportAll3DMenuItem") ? true : false;
var timestamp = DateTime.Now;
2017-02-11 20:57:24 +00:00
saveFileDialog1.FileName = productName + timestamp.ToString("_yy_MM_dd__HH_mm_ss");
2015-10-30 02:41:37 +00:00
//extension will be added by the file save dialog
if (saveFileDialog1.ShowDialog() == DialogResult.OK)
{
switch ((bool)Properties.Settings.Default["showExpOpt"])
{
case true:
ExportOptions exportOpt = new ExportOptions();
if (exportOpt.ShowDialog() == DialogResult.OK) { goto case false; }
break;
case false:
switch (saveFileDialog1.FilterIndex)
{
case 1:
2017-02-11 20:57:24 +00:00
WriteFBX(saveFileDialog1.FileName, exportSwitch);
2015-10-30 02:41:37 +00:00
break;
case 2:
break;
}
2017-01-15 11:57:41 +00:00
if (openAfterExport.Checked && File.Exists(saveFileDialog1.FileName)) { try { Process.Start(saveFileDialog1.FileName); } catch { } }
2015-10-30 02:41:37 +00:00
break;
}
}
2015-10-30 02:41:37 +00:00
}
else { StatusStripUpdate("No Objects available for export"); }
}
private void ExportAssets_Click(object sender, EventArgs e)
2015-10-30 02:41:37 +00:00
{
2017-10-22 15:48:31 +00:00
var saveFolderDialog1 = new OpenFolderDialog();
if (exportableAssets.Count > 0 && saveFolderDialog1.ShowDialog(this) == DialogResult.OK)
2015-10-30 02:41:37 +00:00
{
timer.Stop();
List<AssetPreloadData> toExportAssets = null;
if (((ToolStripItem)sender).Name == "exportAllAssetsMenuItem")
{
2017-02-11 20:57:24 +00:00
toExportAssets = exportableAssets;
2016-08-11 07:15:43 +00:00
}
else if (((ToolStripItem)sender).Name == "exportFilteredAssetsMenuItem")
{
2017-02-11 20:57:24 +00:00
toExportAssets = visibleAssets;
2016-08-11 07:15:43 +00:00
}
else if (((ToolStripItem)sender).Name == "exportSelectedAssetsMenuItem")
{
toExportAssets = new List<AssetPreloadData>(assetListView.SelectedIndices.Count);
foreach (var i in assetListView.SelectedIndices.OfType<int>())
{
toExportAssets.Add((AssetPreloadData)assetListView.Items[i]);
}
}
int assetGroupSelectedIndex = assetGroupOptions.SelectedIndex;
2015-10-30 02:41:37 +00:00
ThreadPool.QueueUserWorkItem(delegate
2015-10-30 02:41:37 +00:00
{
2017-08-20 22:46:46 +00:00
Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US");
2017-10-22 15:48:31 +00:00
var savePath = saveFolderDialog1.Folder;
2015-10-30 02:41:37 +00:00
2016-08-11 07:15:43 +00:00
int toExport = toExportAssets.Count;
int exportedCount = 0;
SetProgressBarValue(0);
2016-08-11 07:15:43 +00:00
SetProgressBarMaximum(toExport);
//looping assetsFiles will optimize HDD access
//but will also have a small performance impact when exporting only a couple of selected assets
2016-08-11 07:15:43 +00:00
foreach (var asset in toExportAssets)
{
string exportpath = savePath + "\\";
2016-08-11 07:15:43 +00:00
if (assetGroupSelectedIndex == 1) { exportpath += Path.GetFileNameWithoutExtension(asset.sourceFile.filePath) + "_export\\"; }
else if (assetGroupSelectedIndex == 0) { exportpath = savePath + "\\" + asset.TypeString + "\\"; }
2017-02-11 20:57:24 +00:00
StatusStripUpdate("Exporting " + asset.TypeString + ": " + asset.Text);
2016-08-11 07:15:43 +00:00
switch (asset.Type2)
{
2017-11-13 09:04:29 +00:00
case 28: //Texture2D
if (ExportTexture2D(asset, exportpath, true))
{
2016-08-11 07:15:43 +00:00
exportedCount++;
}
2016-08-11 07:15:43 +00:00
break;
2017-11-13 09:04:29 +00:00
case 83: //AudioClip
if (ExportAudioClip(asset, exportpath))
2016-08-11 07:15:43 +00:00
{
exportedCount++;
}
break;
2017-11-13 09:04:29 +00:00
case 48: //Shader
if (ExportShader(asset, exportpath))
2016-08-11 07:15:43 +00:00
{
exportedCount++;
}
break;
2017-11-13 09:04:29 +00:00
case 49: //TextAsset
if (ExportTextAsset(asset, exportpath))
2016-08-11 07:15:43 +00:00
{
exportedCount++;
}
break;
2017-11-13 09:04:29 +00:00
case 114: //MonoBehaviour
if (ExportMonoBehaviour(asset, exportpath))
2017-01-15 15:20:40 +00:00
{
exportedCount++;
}
break;
2017-11-13 09:04:29 +00:00
case 128: //Font
if (ExportFont(asset, exportpath))
2016-08-11 07:15:43 +00:00
{
exportedCount++;
}
break;
case 43: //Mesh
2017-11-13 09:04:29 +00:00
if (ExportMesh(asset, exportpath))
{
exportedCount++;
}
2017-11-10 14:00:09 +00:00
break;
case 329: //VideoClip
2017-11-13 09:04:29 +00:00
if (ExportVideoClip(asset, exportpath))
2017-11-10 14:00:09 +00:00
{
exportedCount++;
}
2017-11-13 09:46:26 +00:00
break;
case 152: //MovieTexture
if (ExportMovieTexture(asset, exportpath))
{
exportedCount++;
}
2016-08-11 07:15:43 +00:00
break;
default:
2017-11-13 09:04:29 +00:00
if (ExportRawFile(asset, exportpath))
{
exportedCount++;
}
break;
2015-10-30 02:41:37 +00:00
}
ProgressBarPerformStep();
2015-10-30 02:41:37 +00:00
}
string statusText = "";
switch (exportedCount)
{
case 0:
statusText = "Nothing exported.";
break;
default:
2017-02-11 20:57:24 +00:00
statusText = "Finished exporting " + exportedCount + " assets.";
break;
}
2017-02-11 20:57:24 +00:00
if (toExport > exportedCount) { statusText += " " + (toExport - exportedCount) + " assets skipped (not extractable or files already exist)"; }
StatusStripUpdate(statusText);
if (openAfterExport.Checked && exportedCount > 0) { Process.Start(savePath); }
});
2015-10-30 02:41:37 +00:00
}
else
{
StatusStripUpdate("No exportable assets loaded");
2015-10-30 02:41:37 +00:00
}
}
private void SetProgressBarValue(int value)
{
if (InvokeRequired)
{
BeginInvoke(new Action(() => { progressBar1.Value = value; }));
}
else
{
progressBar1.Value = value;
}
}
private void SetProgressBarMaximum(int value)
{
if (InvokeRequired)
{
BeginInvoke(new Action(() => { progressBar1.Maximum = value; }));
}
else
{
progressBar1.Maximum = value;
}
}
private void ProgressBarPerformStep()
{
if (InvokeRequired)
{
BeginInvoke(new Action(() => { progressBar1.PerformStep(); }));
}
else
{
progressBar1.PerformStep();
}
}
private void StatusStripUpdate(string statusText)
{
if (InvokeRequired)
{
BeginInvoke(new Action(() => { toolStripStatusLabel1.Text = statusText; }));
}
else
{
toolStripStatusLabel1.Text = statusText;
}
}
2015-10-30 02:41:37 +00:00
2017-02-11 20:57:24 +00:00
private void ProgressBarMaximumAdd(int value)
{
if (InvokeRequired)
{
BeginInvoke(new Action(() => { progressBar1.Maximum += value; }));
}
else
{
progressBar1.Maximum += value;
}
}
2015-10-30 02:41:37 +00:00
public UnityStudioForm()
{
Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US");
InitializeComponent();
displayOriginalName.Checked = (bool)Properties.Settings.Default["displayOriginalName"];
displayAll.Checked = (bool)Properties.Settings.Default["displayAll"];
2015-10-30 02:41:37 +00:00
displayInfo.Checked = (bool)Properties.Settings.Default["displayInfo"];
enablePreview.Checked = (bool)Properties.Settings.Default["enablePreview"];
openAfterExport.Checked = (bool)Properties.Settings.Default["openAfterExport"];
assetGroupOptions.SelectedIndex = (int)Properties.Settings.Default["assetGroupOption"];
FMODinit();
2017-02-11 20:57:24 +00:00
//UI
UnityStudio.SetProgressBarValue = SetProgressBarValue;
UnityStudio.SetProgressBarMaximum = SetProgressBarMaximum;
UnityStudio.ProgressBarPerformStep = ProgressBarPerformStep;
UnityStudio.StatusStripUpdate = StatusStripUpdate;
UnityStudio.ProgressBarMaximumAdd = ProgressBarMaximumAdd;
2015-10-30 02:41:37 +00:00
}
private void timerOpenTK_Tick(object sender, EventArgs e)
{
if (glControl1.Visible == true)
{
viewMatrixData *= Matrix4.CreateRotationY(-0.1f);
glControl1.Invalidate();
}
}
private void initOpenTK()
{
GL.Viewport(0, 0, glControl1.ClientSize.Width, glControl1.ClientSize.Height);
GL.ClearColor(Color.CadetBlue);
int vsID, fsID;
pgmID = GL.CreateProgram();
2017-08-21 11:51:32 +00:00
loadShader("vs", ShaderType.VertexShader, pgmID, out vsID);
loadShader("fs", ShaderType.FragmentShader, pgmID, out fsID);
GL.LinkProgram(pgmID);
pgmColorID = GL.CreateProgram();
loadShader("vs", ShaderType.VertexShader, pgmColorID, out vsID);
loadShader("fsColor", ShaderType.FragmentShader, pgmColorID, out fsID);
GL.LinkProgram(pgmColorID);
pgmBlackID = GL.CreateProgram();
loadShader("vs", ShaderType.VertexShader, pgmBlackID, out vsID);
loadShader("fsBlack", ShaderType.FragmentShader, pgmBlackID, out fsID);
GL.LinkProgram(pgmBlackID);
2017-10-22 15:48:31 +00:00
attributeVertexPosition = GL.GetAttribLocation(pgmID, "vertexPosition");
attributeNormalDirection = GL.GetAttribLocation(pgmID, "normalDirection");
attributeVertexColor = GL.GetAttribLocation(pgmColorID, "vertexColor");
uniformModelMatrix = GL.GetUniformLocation(pgmID, "modelMatrix");
uniformViewMatrix = GL.GetUniformLocation(pgmID, "viewMatrix");
glControl1.Visible = false;
}
private void loadShader(string filename, ShaderType type, int program, out int address)
{
address = GL.CreateShader(type);
2017-08-21 11:51:32 +00:00
var str = (string)Resource1.ResourceManager.GetObject(filename);
GL.ShaderSource(address, str);
GL.CompileShader(address);
GL.AttachShader(program, address);
GL.DeleteShader(address);
}
2017-04-09 19:13:08 +00:00
private void createVBO(out int vboAddress, Vector3[] data, int address)
{
GL.GenBuffers(1, out vboAddress);
GL.BindBuffer(BufferTarget.ArrayBuffer, vboAddress);
2017-04-12 06:43:41 +00:00
GL.BufferData(BufferTarget.ArrayBuffer,
2017-04-09 19:13:08 +00:00
(IntPtr)(data.Length * Vector3.SizeInBytes),
data,
BufferUsageHint.StaticDraw);
GL.VertexAttribPointer(address, 3, VertexAttribPointerType.Float, false, 0, 0);
GL.EnableVertexAttribArray(address);
}
2017-04-09 19:13:08 +00:00
private void createVBO(out int vboAddress, Vector4[] data, int address)
{
GL.GenBuffers(1, out vboAddress);
GL.BindBuffer(BufferTarget.ArrayBuffer, vboAddress);
2017-04-12 06:43:41 +00:00
GL.BufferData(BufferTarget.ArrayBuffer,
2017-04-09 19:13:08 +00:00
(IntPtr)(data.Length * Vector4.SizeInBytes),
data,
BufferUsageHint.StaticDraw);
GL.VertexAttribPointer(address, 4, VertexAttribPointerType.Float, false, 0, 0);
GL.EnableVertexAttribArray(address);
}
private void createVBO(out int vboAddress, Matrix4 data, int address)
{
GL.GenBuffers(1, out vboAddress);
GL.UniformMatrix4(address, false, ref data);
}
2017-04-09 01:59:31 +00:00
private void createEBO(out int address, int[] data)
{
GL.GenBuffers(1, out address);
GL.BindBuffer(BufferTarget.ElementArrayBuffer, address);
GL.BufferData(BufferTarget.ElementArrayBuffer,
(IntPtr)(data.Length * sizeof(int)),
data,
BufferUsageHint.StaticDraw);
}
private void createVAO()
{
timerOpenTK.Stop();
GL.DeleteVertexArray(vao);
GL.GenVertexArrays(1, out vao);
GL.BindVertexArray(vao);
2017-04-09 01:59:31 +00:00
createVBO(out vboPositions, vertexData, attributeVertexPosition);
if (normalMode == 0)
{
createVBO(out vboNormals, normal2Data, attributeNormalDirection);
}
else
{
if (normalData != null)
createVBO(out vboNormals, normalData, attributeNormalDirection);
}
2017-04-09 01:59:31 +00:00
createVBO(out vboColors, colorData, attributeVertexColor);
createVBO(out vboModelMatrix, modelMatrixData, uniformModelMatrix);
2017-04-09 01:59:31 +00:00
createVBO(out vboViewMatrix, viewMatrixData, uniformViewMatrix);
createEBO(out eboElements, indiceData);
GL.BindBuffer(BufferTarget.ArrayBuffer, 0);
GL.BindVertexArray(0);
}
protected override void OnLoad(EventArgs e)
{
base.OnLoad(e);
initOpenTK();
}
private void glControl1_Paint(object sender, PaintEventArgs e)
{
glControl1.MakeCurrent();
GL.Clear(ClearBufferMask.ColorBufferBit | ClearBufferMask.DepthBufferBit);
GL.Enable(EnableCap.DepthTest);
GL.DepthFunc(DepthFunction.Lequal);
GL.BindVertexArray(vao);
if (wireFrameMode == 0 || wireFrameMode == 2)
{
GL.UseProgram(shadeMode == 0 ? pgmID : pgmColorID);
GL.UniformMatrix4(uniformModelMatrix, false, ref modelMatrixData);
GL.UniformMatrix4(uniformViewMatrix, false, ref viewMatrixData);
GL.PolygonMode(MaterialFace.FrontAndBack, PolygonMode.Fill);
GL.DrawElements(BeginMode.Triangles, indiceData.Length, DrawElementsType.UnsignedInt, 0);
}
//Wireframe
if (wireFrameMode == 1 || wireFrameMode == 2)
{
GL.Enable(EnableCap.PolygonOffsetLine);
GL.PolygonOffset(-1, -1);
GL.UseProgram(pgmBlackID);
GL.UniformMatrix4(uniformModelMatrix, false, ref modelMatrixData);
GL.UniformMatrix4(uniformViewMatrix, false, ref viewMatrixData);
GL.PolygonMode(MaterialFace.FrontAndBack, PolygonMode.Line);
GL.DrawElements(BeginMode.Triangles, indiceData.Length, DrawElementsType.UnsignedInt, 0);
GL.Disable(EnableCap.PolygonOffsetLine);
}
GL.BindVertexArray(0);
GL.Flush();
glControl1.SwapBuffers();
}
2015-10-30 02:41:37 +00:00
private void resetForm()
{
2017-04-09 19:13:08 +00:00
Text = "Unity Studio";
2015-10-30 02:41:37 +00:00
2017-02-11 20:57:24 +00:00
unityFiles.Clear();
assetsfileList.Clear();
exportableAssets.Clear();
visibleAssets.Clear();
assetsfileandstream.Clear();
2015-10-30 02:41:37 +00:00
sceneTreeView.Nodes.Clear();
assetListView.VirtualListSize = 0;
assetListView.Items.Clear();
2015-11-02 08:11:26 +00:00
classesListView.Items.Clear();
classesListView.Groups.Clear();
2015-10-30 02:41:37 +00:00
2016-11-08 12:31:07 +00:00
previewPanel.BackgroundImage = Properties.Resources.preview;
2017-04-09 19:13:08 +00:00
previewPanel.BackgroundImageLayout = ImageLayout.Center;
2015-10-30 02:41:37 +00:00
assetInfoLabel.Visible = false;
assetInfoLabel.Text = null;
textPreviewBox.Visible = false;
fontPreviewBox.Visible = false;
glControl1.Visible = false;
2015-10-30 02:41:37 +00:00
lastSelectedItem = null;
lastLoadedAsset = null;
firstSortColumn = -1;
secondSortColumn = 0;
reverseSort = false;
enableFiltering = false;
2015-10-30 02:41:37 +00:00
FMODreset();
2015-10-30 02:41:37 +00:00
}
private void showOriginalFileToolStripMenuItem_Click(object sender, EventArgs e)
{
var args = $"/select, {selectasset.sourceFile.bundlePath ?? selectasset.sourceFile.filePath}";
var pfi = new ProcessStartInfo("explorer.exe", args);
Process.Start(pfi);
}
private void assetListView_MouseClick(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Right)
{
2017-08-21 11:51:32 +00:00
selectasset = (AssetPreloadData)assetListView.Items[assetListView.SelectedIndices[0]];
contextMenuStrip1.Show(assetListView, e.X, e.Y);
}
}
2015-10-30 02:41:37 +00:00
}
}