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 ;
2016-08-02 15:11:14 +00:00
using System.Diagnostics ;
using System.Drawing.Text ;
2017-02-25 10:04:05 +00:00
using OpenTK ;
using OpenTK.Graphics.OpenGL ;
2018-04-02 22:51:22 +00:00
using static AssetStudio . Studio ;
using static AssetStudio . Importer ;
2015-10-30 02:41:37 +00:00
2018-04-02 22:51:22 +00:00
namespace AssetStudio
2015-10-30 02:41:37 +00:00
{
2018-04-02 22:51:22 +00:00
partial class AssetStudioForm : Form
2015-10-30 02:41:37 +00:00
{
2017-02-11 20:57:24 +00:00
private AssetPreloadData lastSelectedItem ;
private AssetPreloadData lastLoadedAsset ;
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
2017-02-27 15:56:24 +00:00
#region OpenTK variables
2017-09-28 21:08:59 +00:00
int pgmID , pgmColorID , pgmBlackID ;
2017-02-25 10:04:05 +00:00
int attributeVertexPosition ;
int attributeNormalDirection ;
int attributeVertexColor ;
2017-09-29 23:26:27 +00:00
int uniformModelMatrix ;
2017-02-25 10:04:05 +00:00
int uniformViewMatrix ;
int vao ;
int vboPositions ;
int vboNormals ;
int vboColors ;
2017-09-29 23:26:27 +00:00
int vboModelMatrix ;
2017-02-25 10:04:05 +00:00
int vboViewMatrix ;
int eboElements ;
2017-04-09 19:13:08 +00:00
Vector3 [ ] vertexData ;
Vector3 [ ] normalData ;
2017-09-28 21:08:59 +00:00
Vector3 [ ] normal2Data ;
2017-04-09 19:13:08 +00:00
Vector4 [ ] colorData ;
2017-09-29 23:26:27 +00:00
Matrix4 modelMatrixData ;
Matrix4 viewMatrixData ;
2017-03-06 16:20:21 +00:00
int [ ] indiceData ;
2017-09-28 21:08:59 +00:00
int wireFrameMode ;
int shadeMode ;
int normalMode ;
2017-02-27 15:56:24 +00:00
#endregion
2017-02-25 10:04:05 +00:00
2015-11-04 22:13:20 +00:00
//asset list sorting helpers
2015-11-04 12:16:03 +00:00
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
2015-11-02 22:56:03 +00:00
//tree search
2017-02-11 20:57:24 +00:00
private int nextGObject ;
private List < GameObject > treeSrcResults = new List < GameObject > ( ) ;
2016-08-02 15:11:14 +00:00
2017-02-11 20:57:24 +00:00
private PrivateFontCollection pfc = new PrivateFontCollection ( ) ;
2015-11-02 08:11:26 +00:00
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
{
2018-02-28 19:42:43 +00:00
mainPath = Path . GetDirectoryName ( openFileDialog1 . FileNames [ 0 ] ) ;
MergeSplitAssets ( mainPath ) ;
var readFile = ProcessingSplitFiles ( openFileDialog1 . FileNames . ToList ( ) ) ;
foreach ( var i in readFile )
2017-11-28 19:57:32 +00:00
{
2018-04-02 22:51:22 +00:00
importFiles . Add ( i ) ;
importFilesHash . Add ( Path . GetFileName ( i ) . ToUpper ( ) ) ;
2017-02-11 20:57:24 +00:00
}
2018-02-28 19:42:43 +00:00
SetProgressBarValue ( 0 ) ;
2018-04-02 22:51:22 +00:00
SetProgressBarMaximum ( importFiles . Count ) ;
2018-02-28 19:42:43 +00:00
//use a for loop because list size can change
2018-04-02 22:51:22 +00:00
for ( int f = 0 ; f < importFiles . Count ; f + + )
2015-10-30 02:41:37 +00:00
{
2018-04-02 22:51:22 +00:00
LoadFile ( importFiles [ f ] ) ;
2018-02-28 19:42:43 +00:00
ProgressBarPerformStep ( ) ;
2017-02-11 20:57:24 +00:00
}
2018-04-02 22:51:22 +00:00
importFilesHash . Clear ( ) ;
2017-02-11 20:57:24 +00:00
assetsfileListHash . Clear ( ) ;
2018-01-17 01:57:05 +00:00
BuildAssetStrucutres ( ) ;
2017-02-11 20:57:24 +00:00
} ) ;
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
resetForm ( ) ;
2018-01-17 01:57:05 +00:00
ThreadPool . QueueUserWorkItem ( state = >
2017-10-22 15:48:31 +00:00
{
2018-01-17 01:57:05 +00:00
mainPath = openFolderDialog1 . Folder ;
MergeSplitAssets ( mainPath ) ;
var files = Directory . GetFiles ( mainPath , "*.*" , SearchOption . AllDirectories ) . ToList ( ) ;
var readFile = ProcessingSplitFiles ( files ) ;
foreach ( var i in readFile )
2015-10-30 02:41:37 +00:00
{
2018-04-02 22:51:22 +00:00
importFiles . Add ( i ) ;
importFilesHash . Add ( Path . GetFileName ( i ) ) ;
2017-10-22 15:48:31 +00:00
}
2018-01-17 01:57:05 +00:00
SetProgressBarValue ( 0 ) ;
2018-04-02 22:51:22 +00:00
SetProgressBarMaximum ( importFiles . Count ) ;
2017-10-22 15:48:31 +00:00
//use a for loop because list size can change
2018-04-02 22:51:22 +00:00
for ( int f = 0 ; f < importFiles . Count ; f + + )
2017-10-22 15:48:31 +00:00
{
2018-04-02 22:51:22 +00:00
LoadFile ( importFiles [ f ] ) ;
2017-10-22 15:48:31 +00:00
ProgressBarPerformStep ( ) ;
}
2018-04-02 22:51:22 +00:00
importFilesHash . Clear ( ) ;
2017-10-22 15:48:31 +00:00
assetsfileListHash . Clear ( ) ;
BuildAssetStrucutres ( ) ;
} ) ;
2015-10-30 02:41:37 +00:00
}
}
2018-04-18 04:04:46 +00:00
private void extractFileToolStripMenuItem_Click ( object sender , EventArgs e )
2015-10-30 02:41:37 +00:00
{
2018-04-09 20:45:09 +00:00
var openBundleDialog = new OpenFileDialog
{
2018-04-18 04:04:46 +00:00
Filter = "All types|*.*" ,
2018-04-09 20:45:09 +00:00
FilterIndex = 1 ,
RestoreDirectory = true ,
Multiselect = true
} ;
2015-10-30 02:41:37 +00:00
if ( openBundleDialog . ShowDialog ( ) = = DialogResult . OK )
{
2016-08-02 15:11:14 +00:00
progressBar1 . Value = 0 ;
progressBar1 . Maximum = openBundleDialog . FileNames . Length ;
2018-04-18 04:04:46 +00:00
ExtractFile ( openBundleDialog . FileNames ) ;
2015-10-30 02:41:37 +00:00
}
}
private void extractFolderToolStripMenuItem_Click ( object sender , EventArgs e )
{
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
{
2018-04-18 04:04:46 +00:00
var files = Directory . GetFiles ( openFolderDialog1 . Folder , "*.*" , SearchOption . AllDirectories ) ;
2016-08-02 15:11:14 +00:00
progressBar1 . Value = 0 ;
2018-04-18 04:04:46 +00:00
progressBar1 . Maximum = files . Length ;
ExtractFile ( files ) ;
2015-10-30 02:41:37 +00:00
}
}
2017-02-11 07:39:14 +00:00
private void BuildAssetStrucutres ( )
2015-10-30 02:41:37 +00:00
{
2018-04-18 23:06:52 +00:00
if ( assetsfileList . Count = = 0 )
{
StatusStripUpdate ( "No file was loaded." ) ;
return ;
}
2017-02-11 07:39:14 +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
2017-03-31 20:28:46 +00:00
BuildAssetStructures ( optionLoadAssetsMenuItem , optionDisplayAll , optionBuildHierarchyMenuItem , optionBuildClassStructuresMenuItem , displayOriginalName . Checked ) ;
2015-10-30 02:41:37 +00:00
2017-02-11 07:39:14 +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
{
2018-04-02 22:51:22 +00:00
Text = $"AssetStudio - {productName} - {assetsfileList[0].m_Version} - {assetsfileList[0].platformStr}" ;
2015-11-21 22:38:02 +00:00
}
2017-02-11 20:57:24 +00:00
else if ( assetsfileList . Count > 0 )
2015-11-21 22:38:02 +00:00
{
2018-04-02 22:51:22 +00:00
Text = $"AssetStudio - no productName - {assetsfileList[0].m_Version} - {assetsfileList[0].platformStr}" ;
2015-11-21 22:38:02 +00:00
}
2017-02-11 07:39:14 +00:00
if ( ! dontLoadAssetsMenuItem . Checked )
2015-11-21 22:38:02 +00:00
{
2017-02-11 20:57:24 +00:00
assetListView . VirtualListSize = visibleAssets . Count ;
2018-01-17 01:57:05 +00:00
//will only work if ListView is visible
2017-02-11 07:39:14 +00:00
resizeAssetListColumns ( ) ;
}
if ( ! dontBuildHierarchyMenuItem . Checked )
{
sceneTreeView . BeginUpdate ( ) ;
2017-02-11 20:57:24 +00:00
sceneTreeView . Nodes . AddRange ( fileNodes . ToArray ( ) ) ;
fileNodes . Clear ( ) ;
2017-02-11 07:39:14 +00:00
sceneTreeView . EndUpdate ( ) ;
}
if ( buildClassStructuresMenuItem . Checked )
{
classesListView . BeginUpdate ( ) ;
2017-02-11 20:57:24 +00:00
foreach ( var version in AllClassStructures )
2015-11-21 22:38:02 +00:00
{
2017-02-11 07:39:14 +00:00
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
}
2017-02-11 07:39:14 +00:00
classesListView . EndUpdate ( ) ;
2015-10-30 02:41:37 +00:00
}
2018-04-17 21:05:17 +00:00
var types = exportableAssets . Select ( x = > x . Type ) . Distinct ( ) . ToArray ( ) ;
foreach ( var type in types )
{
var typeItem = new ToolStripMenuItem
{
CheckOnClick = true ,
Name = type . ToString ( ) ,
Size = new Size ( 180 , 22 ) ,
Text = type . ToString ( )
} ;
typeItem . Click + = typeToolStripMenuItem_Click ;
showTypeToolStripMenuItem . DropDownItems . Add ( typeItem ) ;
}
allToolStripMenuItem . Checked = true ;
2018-04-18 23:06:52 +00:00
StatusStripUpdate ( $"Finished loading {assetsfileList.Count} files with {assetListView.Items.Count} exportable assets." ) ;
2017-02-11 07:39:14 +00:00
treeSearch . Select ( ) ;
} ) ) ;
2015-10-30 02:41:37 +00:00
}
2018-04-17 21:05:17 +00:00
private void typeToolStripMenuItem_Click ( object sender , EventArgs e )
{
var typeItem = ( ToolStripMenuItem ) sender ;
if ( typeItem ! = allToolStripMenuItem )
{
allToolStripMenuItem . Checked = false ;
}
else if ( allToolStripMenuItem . Checked )
{
for ( var i = 1 ; i < showTypeToolStripMenuItem . DropDownItems . Count ; i + + )
{
var item = ( ToolStripMenuItem ) showTypeToolStripMenuItem . DropDownItems [ i ] ;
item . Checked = false ;
}
}
2018-04-21 07:50:13 +00:00
FilterAssetList ( ) ;
2018-04-17 21:05:17 +00:00
}
2018-04-02 22:51:22 +00:00
private void AssetStudioForm_KeyDown ( object sender , KeyEventArgs e )
2015-11-02 08:11:26 +00:00
{
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 ) ; }
}
2017-02-25 10:04:05 +00:00
2018-01-16 22:20:06 +00:00
if ( glControl1 . Visible )
2017-02-25 10:04:05 +00:00
{
2018-01-16 22:20:06 +00:00
switch ( e . KeyCode )
2017-02-25 10:04:05 +00:00
{
2018-01-16 22:20:06 +00:00
case Keys . D : // --> Right
if ( e . Shift ) //Move
{
viewMatrixData * = Matrix4 . CreateTranslation ( 0.1f , 0 , 0 ) ;
}
else //Rotate
{
viewMatrixData * = Matrix4 . CreateRotationY ( 0.1f ) ;
}
2017-02-25 10:04:05 +00:00
glControl1 . Invalidate ( ) ;
2018-01-16 22:20:06 +00:00
break ;
case Keys . A : // <-- Left
if ( e . Shift ) //Move
{
viewMatrixData * = Matrix4 . CreateTranslation ( - 0.1f , 0 , 0 ) ;
}
else //Rotate
{
viewMatrixData * = Matrix4 . CreateRotationY ( - 0.1f ) ;
}
2017-09-28 21:08:59 +00:00
glControl1 . Invalidate ( ) ;
2018-01-16 22:20:06 +00:00
break ;
case Keys . W : // Up
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 ( ) ;
break ;
case Keys . S : // Down
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 ( ) ;
break ;
case Keys . Q : // Zoom Out
viewMatrixData * = Matrix4 . CreateScale ( 0.9f ) ;
glControl1 . Invalidate ( ) ;
break ;
case Keys . E : // Zoom In
viewMatrixData * = Matrix4 . CreateScale ( 1.1f ) ;
glControl1 . Invalidate ( ) ;
break ;
2017-02-25 10:04:05 +00:00
}
2017-09-28 21:08:59 +00:00
// Normal mode
if ( e . Control & & e . KeyCode = = Keys . N )
{
normalMode = ( normalMode + 1 ) % 2 ;
createVAO ( ) ;
glControl1 . Invalidate ( ) ;
}
2017-02-25 10:04:05 +00:00
// 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 ; }
}
2016-08-02 15:11:14 +00:00
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 )
{
2018-01-16 22:20:06 +00:00
string saveFile = $"{versionPath}\\{uclass.Key} {uclass.Value.Text}.txt" ;
2015-11-02 08:11:26 +00:00
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 )
{
2018-03-27 22:29:28 +00:00
switch ( lastLoadedAsset . Type )
2015-10-30 02:41:37 +00:00
{
2018-03-27 22:29:28 +00:00
case ClassIDReference . Texture2D :
case ClassIDReference . Sprite :
2015-10-30 02:41:37 +00:00
{
if ( enablePreview . Checked & & imageTexture ! = null )
{
previewPanel . BackgroundImage = imageTexture ;
}
else
{
2016-08-02 15:11:14 +00:00
previewPanel . BackgroundImage = Properties . Resources . preview ;
previewPanel . BackgroundImageLayout = ImageLayout . Center ;
2015-10-30 02:41:37 +00:00
}
}
break ;
2018-03-27 22:29:28 +00:00
case ClassIDReference . Shader :
case ClassIDReference . TextAsset :
case ClassIDReference . MonoBehaviour :
2015-10-30 02:41:37 +00:00
textPreviewBox . Visible = ! textPreviewBox . Visible ;
break ;
2018-03-27 22:29:28 +00:00
case ClassIDReference . Font :
2015-10-30 02:41:37 +00:00
fontPreviewBox . Visible = ! fontPreviewBox . Visible ;
break ;
2018-03-27 22:29:28 +00:00
case ClassIDReference . AudioClip :
2015-10-30 02:41:37 +00:00
{
FMODpanel . Visible = ! FMODpanel . Visible ;
2015-11-04 22:13:20 +00:00
if ( sound ! = null & & channel ! = null )
2015-10-30 02:41:37 +00:00
{
2018-01-16 22:20:06 +00:00
var result = channel . isPlaying ( out var playing ) ;
2016-08-02 15:11:14 +00:00
if ( result = = FMOD . RESULT . OK & & playing )
2015-10-30 02:41:37 +00:00
{
result = channel . stop ( ) ;
2015-11-04 22:13:20 +00:00
FMODreset ( ) ;
2015-10-30 02:41:37 +00:00
}
2016-08-02 15:11:14 +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
}
2016-08-02 15:11:14 +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 ( ) ;
break ;
2015-11-02 08:11:26 +00:00
case 1 :
2015-11-04 12:16:03 +00:00
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 :
previewPanel . Visible = false ;
classPreviewPanel . Visible = true ;
break ;
}
2015-10-30 02:41:37 +00:00
}
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
}
}
2015-11-02 22:56:03 +00:00
private void treeSearch_TextChanged ( object sender , EventArgs e )
{
treeSrcResults . Clear ( ) ;
nextGObject = 0 ;
}
2016-08-02 15:11:14 +00:00
2015-10-30 02:41:37 +00:00
private void treeSearch_KeyDown ( object sender , KeyEventArgs e )
{
if ( e . KeyCode = = Keys . Enter )
{
2015-11-02 22:56:03 +00:00
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
{
2018-04-21 08:36:18 +00:00
foreach ( var gObject in aFile . GameObjectList . Values )
2015-10-30 02:41:37 +00:00
{
2018-04-21 08:36:18 +00:00
if ( gObject . Text . IndexOf ( treeSearch . Text , StringComparison . CurrentCultureIgnoreCase ) > = 0 )
{
treeSrcResults . Add ( gObject ) ;
}
2015-10-30 02:41:37 +00:00
}
2015-11-02 22:56:03 +00:00
}
}
2018-04-21 08:36:18 +00:00
if ( treeSrcResults . Count > 0 )
2015-10-30 02:41:37 +00:00
{
2018-04-21 08:36:18 +00:00
if ( nextGObject > = treeSrcResults . Count )
2015-10-30 02:41:37 +00:00
{
2018-04-21 08:36:18 +00:00
nextGObject = 0 ;
2015-10-30 02:41:37 +00:00
}
2018-04-21 08:36:18 +00:00
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 ;
}
}
2015-11-04 12:16:03 +00:00
private void resizeAssetListColumns ( )
{
assetListView . AutoResizeColumn ( 1 , ColumnHeaderAutoResizeStyle . HeaderSize ) ;
assetListView . AutoResizeColumn ( 1 , ColumnHeaderAutoResizeStyle . ColumnContent ) ;
assetListView . AutoResizeColumn ( 2 , ColumnHeaderAutoResizeStyle . HeaderSize ) ;
assetListView . AutoResizeColumn ( 2 , ColumnHeaderAutoResizeStyle . ColumnContent ) ;
2015-11-11 17:59:28 +00:00
var vscrollwidth = SystemInformation . VerticalScrollBarWidth ;
2017-02-11 20:57:24 +00:00
var hasvscroll = ( visibleAssets . Count / ( float ) assetListView . Height ) > 0.0567f ;
2015-11-11 17:59:28 +00:00
columnHeaderName . Width = assetListView . Width - columnHeaderType . Width - columnHeaderSize . Width - ( hasvscroll ? ( 5 + vscrollwidth ) : 5 ) ;
2015-11-04 12:16:03 +00:00
}
private void tabPage2_Resize ( object sender , EventArgs e )
2015-10-30 02:41:37 +00:00
{
2015-11-04 12:16:03 +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 ;
2015-11-04 12:16:03 +00:00
enableFiltering = true ;
2015-10-30 02:41:37 +00:00
}
}
private void listSearch_Leave ( object sender , EventArgs e )
{
if ( listSearch . Text = = "" )
{
2015-11-04 12:16:03 +00:00
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
}
}
2015-11-04 12:16:03 +00:00
private void ListSearchTextChanged ( object sender , EventArgs e )
{
if ( enableFiltering )
{
2018-04-21 07:50:13 +00:00
FilterAssetList ( ) ;
2015-11-04 12:16:03 +00:00
}
}
2015-10-30 02:41:37 +00:00
private void assetListView_ColumnClick ( object sender , ColumnClickEventArgs e )
{
2015-11-04 12:16:03 +00:00
if ( firstSortColumn ! = e . Column )
{
2015-11-21 22:38:02 +00:00
//sorting column has been changed
2015-11-04 12:16:03 +00:00
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
{
2015-11-04 12:16:03 +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-11-04 12:16:03 +00:00
} ) ;
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
{
2015-11-04 12:16:03 +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-11-04 12:16:03 +00:00
} ) ;
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 ) ;
2015-11-04 12:16:03 +00:00
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-11-04 12:16:03 +00:00
} ) ;
2015-10-30 02:41:37 +00:00
break ;
}
2015-11-21 22:38:02 +00:00
2015-10-30 02:41:37 +00:00
assetListView . EndUpdate ( ) ;
2015-11-04 12:16:03 +00:00
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 ;
2015-11-23 20:33:42 +00:00
pfc . Dispose ( ) ;
2015-10-30 02:41:37 +00:00
FMODpanel . Visible = false ;
2017-02-25 10:04:05 +00:00
glControl1 . Visible = false ;
2015-10-30 02:41:37 +00:00
lastLoadedAsset = null ;
2015-11-03 12:59:26 +00:00
StatusStripUpdate ( "" ) ;
2015-10-30 02:41:37 +00:00
2015-11-04 22:13:20 +00:00
FMODreset ( ) ;
2015-10-30 02:41:37 +00:00
lastSelectedItem = ( AssetPreloadData ) e . Item ;
if ( e . IsSelected )
{
if ( enablePreview . Checked )
{
lastLoadedAsset = lastSelectedItem ;
PreviewAsset ( lastLoadedAsset ) ;
}
2018-01-18 00:08:48 +00:00
if ( displayInfo . Checked & & assetInfoLabel . Text ! = null ) //only display the label if asset has info text
{
assetInfoLabel . Text = lastSelectedItem . InfoText ;
assetInfoLabel . Visible = true ;
}
2015-10-30 02:41:37 +00:00
}
}
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
{
2018-03-27 22:29:28 +00:00
switch ( asset . Type )
2015-10-30 02:41:37 +00:00
{
2018-03-27 22:29:28 +00:00
case ClassIDReference . Texture2D :
2015-10-30 02:41:37 +00:00
{
2018-01-16 22:20:06 +00:00
imageTexture ? . Dispose ( ) ;
2018-04-11 15:45:39 +00:00
var m_Texture2D = new Texture2DConverter ( new Texture2D ( asset , true ) ) ;
2017-01-31 17:20:43 +00:00
imageTexture = m_Texture2D . ConvertToBitmap ( true ) ;
2016-08-02 15:11:14 +00:00
if ( imageTexture ! = null )
{
2015-10-30 02:41:37 +00:00
previewPanel . BackgroundImage = imageTexture ;
2016-08-02 15:11:14 +00:00
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
}
2017-01-31 17:20:43 +00:00
else
{
2017-10-23 14:22:24 +00:00
StatusStripUpdate ( "Unsupported image for preview" ) ;
2017-01-31 17:20:43 +00:00
}
2015-10-30 02:41:37 +00:00
break ;
}
2018-03-27 22:29:28 +00:00
case ClassIDReference . AudioClip :
2015-10-30 02:41:37 +00:00
{
AudioClip m_AudioClip = new AudioClip ( asset , true ) ;
2017-11-13 09:04:29 +00:00
if ( m_AudioClip . m_AudioData = = null )
break ;
2015-11-04 22:13:20 +00:00
FMOD . CREATESOUNDEXINFO exinfo = new FMOD . CREATESOUNDEXINFO ( ) ;
2016-08-02 15:11:14 +00:00
2015-11-04 22:13:20 +00:00
exinfo . cbsize = Marshal . SizeOf ( exinfo ) ;
exinfo . length = ( uint ) m_AudioClip . m_Size ;
2015-10-30 02:41:37 +00:00
2018-01-16 22:20:06 +00:00
var result = system . createSound ( m_AudioClip . m_AudioData , FMOD . MODE . OPENMEMORY | loopMode , ref exinfo , out sound ) ;
2015-11-04 22:13:20 +00:00
if ( ERRCHECK ( result ) ) { break ; }
2015-10-30 02:41:37 +00:00
2018-01-16 22:20:06 +00:00
result = sound . getSubSound ( 0 , out var subsound ) ;
2016-08-15 08:18:43 +00:00
if ( result = = FMOD . RESULT . OK )
2015-11-04 22:13:20 +00:00
{
2016-08-15 08:18:43 +00:00
sound = subsound ;
2015-11-04 22:13:20 +00:00
}
2015-10-30 02:41:37 +00:00
2016-08-15 08:18:43 +00:00
result = sound . getLength ( out FMODlenms , FMOD . TIMEUNIT . MS ) ;
if ( ERRCHECK ( result ) ) { break ; }
2016-08-02 15:11:14 +00:00
result = system . playSound ( sound , null , true , out channel ) ;
2015-11-04 22:13:20 +00:00
if ( ERRCHECK ( result ) ) { break ; }
2015-10-30 02:41:37 +00:00
2015-11-04 22:13:20 +00:00
FMODpanel . Visible = true ;
2015-10-30 02:41:37 +00:00
2015-11-04 22:13:20 +00:00
result = channel . getFrequency ( out FMODfrequency ) ;
2016-08-02 15:11:14 +00:00
if ( ERRCHECK ( result ) ) { break ; }
2015-10-30 02:41:37 +00:00
2017-02-11 20:57:24 +00:00
FMODinfoLabel . Text = FMODfrequency + " Hz" ;
2018-01-16 22:20:06 +00:00
FMODtimerLabel . Text = $"0:0.0 / {FMODlenms / 1000 / 60}:{FMODlenms / 1000 % 60}.{FMODlenms / 10 % 100}" ;
2015-10-30 02:41:37 +00:00
break ;
}
2018-03-27 22:29:28 +00:00
case ClassIDReference . Shader :
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 ;
}
2018-03-27 22:29:28 +00:00
case ClassIDReference . TextAsset :
2015-10-30 02:41:37 +00:00
{
TextAsset m_TextAsset = new TextAsset ( asset , true ) ;
2016-08-02 15:11:14 +00:00
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 ;
}
2018-03-27 22:29:28 +00:00
case ClassIDReference . MonoBehaviour :
2017-01-15 15:20:40 +00:00
{
MonoBehaviour m_MonoBehaviour = new MonoBehaviour ( asset , true ) ;
textPreviewBox . Text = m_MonoBehaviour . serializedText ;
textPreviewBox . Visible = true ;
break ;
}
2018-03-27 22:29:28 +00:00
case ClassIDReference . Font :
2015-10-30 02:41:37 +00:00
{
2018-04-02 22:51:22 +00:00
UFont m_Font = new UFont ( asset , true ) ;
2017-01-28 11:17:31 +00:00
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 ;
2017-01-28 11:17:31 +00:00
var re = AddFontMemResourceEx ( data , ( uint ) m_Font . m_FontData . Length , IntPtr . Zero , ref cFonts ) ;
if ( re ! = IntPtr . Zero )
2015-11-23 20:33:42 +00:00
{
2017-01-28 11:17:31 +00:00
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-11-23 20:33:42 +00:00
}
2015-10-30 02:41:37 +00:00
}
2017-01-28 11:17:31 +00:00
StatusStripUpdate ( "Unsupported font for preview. Try to export." ) ;
2015-10-30 02:41:37 +00:00
break ;
}
2018-03-27 22:29:28 +00:00
case ClassIDReference . Mesh :
2017-02-25 10:04:05 +00:00
{
2017-03-06 16:20:21 +00:00
var m_Mesh = new Mesh ( asset , true ) ;
2017-02-25 10:04:05 +00:00
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 ) ;
2017-03-06 16:20:21 +00:00
#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 ] ;
2017-09-26 17:57:47 +00:00
// 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 ] ;
}
2017-09-29 23:26:27 +00:00
for ( int v = 0 ; v < m_Mesh . m_VertexCount ; v + + )
2017-09-26 17:57:47 +00:00
{
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 ] ) ;
}
2017-09-29 23:26:27 +00:00
vertexData [ v ] = new Vector3 (
m_Mesh . m_Vertices [ v * count ] ,
m_Mesh . m_Vertices [ v * count + 1 ] ,
m_Mesh . m_Vertices [ v * count + 2 ] ) ;
2017-09-26 17:57:47 +00:00
}
2017-09-29 23:26:27 +00:00
// Calculate modelMatrix
Vector3 dist = Vector3 . One , offset = Vector3 . Zero ;
2017-09-26 17:57:47 +00:00
for ( int i = 0 ; i < 3 ; i + + )
{
2017-09-29 23:26:27 +00:00
dist [ i ] = max [ i ] - min [ i ] ;
2017-09-26 17:57:47 +00:00
offset [ i ] = ( max [ i ] + min [ i ] ) / 2 ;
}
2017-09-29 23:26:27 +00:00
float d = Math . Max ( 1e-5f , dist . Length ) ;
2017-09-30 07:32:09 +00:00
modelMatrixData = Matrix4 . CreateTranslation ( - offset ) * Matrix4 . CreateScale ( 2f / d ) ;
2017-03-06 16:20:21 +00:00
#endregion
#region Indicies
2017-02-25 10:04:05 +00:00
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 ] ;
}
2017-03-06 16:20:21 +00:00
#endregion
#region Normals
2017-02-27 15:56:24 +00:00
if ( m_Mesh . m_Normals ! = null & & m_Mesh . m_Normals . Length > 0 )
2017-02-25 10:04:05 +00:00
{
2017-02-27 15:56:24 +00:00
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 ] ;
2017-02-27 15:56:24 +00:00
for ( int n = 0 ; n < m_Mesh . m_VertexCount ; n + + )
{
2017-04-09 19:13:08 +00:00
normalData [ n ] = new Vector3 (
2017-02-27 15:56:24 +00:00
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 ;
2017-09-28 21:08:59 +00:00
// 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 ] ] + + ;
2017-09-28 21:08:59 +00:00
}
}
for ( int i = 0 ; i < m_Mesh . m_VertexCount ; i + + )
{
2017-10-22 15:48:31 +00:00
if ( normalCalculatedCount [ i ] = = 0 )
2017-09-28 21:08:59 +00:00
normal2Data [ i ] = new Vector3 ( 0 , 1 , 0 ) ;
else
normal2Data [ i ] / = normalCalculatedCount [ i ] ;
}
2017-03-06 16:20:21 +00:00
#endregion
#region Colors
2018-04-06 16:10:13 +00:00
if ( m_Mesh . m_Colors = = null | | m_Mesh . m_Colors . Length = = 0 )
2017-02-25 10:04:05 +00:00
{
2017-04-09 19:13:08 +00:00
colorData = new Vector4 [ m_Mesh . m_VertexCount ] ;
2017-02-25 10:04:05 +00:00
for ( int c = 0 ; c < m_Mesh . m_VertexCount ; c + + )
{
2017-09-28 21:08:59 +00:00
colorData [ c ] = new Vector4 ( 0.5f , 0.5f , 0.5f , 1.0f ) ;
2017-02-25 10:04:05 +00:00
}
}
2017-03-06 16:20:21 +00:00
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 ] ;
2017-03-06 16:20:21 +00:00
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 ] ,
2017-03-06 16:20:21 +00:00
1.0f ) ;
}
}
2017-02-25 10:04:05 +00:00
else
{
2017-04-09 19:13:08 +00:00
colorData = new Vector4 [ m_Mesh . m_VertexCount ] ;
2017-02-25 10:04:05 +00:00
for ( int c = 0 ; c < m_Mesh . m_VertexCount ; c + + )
{
2017-04-09 19:13:08 +00:00
colorData [ c ] = new Vector4 (
2017-02-25 10:04:05 +00:00
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 ] ) ;
}
}
2017-03-06 16:20:21 +00:00
#endregion
2017-11-09 23:11:27 +00:00
createVAO ( ) ;
2017-02-25 10:04:05 +00:00
}
2017-09-28 21:08:59 +00:00
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 " ) ;
2017-02-25 10:04:05 +00:00
}
break ;
2018-03-27 22:29:28 +00:00
case ClassIDReference . VideoClip :
case ClassIDReference . 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 ;
}
2018-03-27 22:29:28 +00:00
case ClassIDReference . Sprite :
2018-01-18 00:08:48 +00:00
{
imageTexture ? . Dispose ( ) ;
2018-04-17 17:29:18 +00:00
imageTexture = SpriteHelper . GetImageFromSprite ( asset ) ;
2018-01-18 00:08:48 +00:00
if ( imageTexture ! = null )
{
previewPanel . BackgroundImage = imageTexture ;
if ( imageTexture . Width > previewPanel . Width | | imageTexture . Height > previewPanel . Height )
previewPanel . BackgroundImageLayout = ImageLayout . Zoom ;
else
previewPanel . BackgroundImageLayout = ImageLayout . Center ;
}
else
{
2018-04-06 23:51:33 +00:00
StatusStripUpdate ( "Unsupported sprite for preview." ) ;
2018-01-18 00:08:48 +00:00
}
break ;
}
2018-04-06 23:51:33 +00:00
case ClassIDReference . Animator :
{
2018-04-17 23:11:10 +00:00
StatusStripUpdate ( "Can be exported to FBX file." ) ;
2018-04-06 23:51:33 +00:00
break ;
}
case ClassIDReference . AnimationClip :
{
2018-04-17 23:11:10 +00:00
StatusStripUpdate ( "Can be exported with Animator or objects" ) ;
2018-04-06 23:51:33 +00:00
break ;
}
2016-08-13 00:20:38 +00:00
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." ) ;
2016-08-13 00:20:38 +00:00
break ;
}
2015-10-30 02:41:37 +00:00
}
}
private void FMODinit ( )
{
2015-11-04 22:13:20 +00:00
FMODreset ( ) ;
2015-10-30 02:41:37 +00:00
2018-01-16 22:20:06 +00:00
var result = FMOD . Factory . System_Create ( out system ) ;
2015-11-04 22:13:20 +00:00
if ( ERRCHECK ( result ) ) { return ; }
2015-10-30 02:41:37 +00:00
2018-01-16 22:20:06 +00:00
result = system . getVersion ( out var version ) ;
2015-10-30 02:41:37 +00:00
ERRCHECK ( result ) ;
if ( version < FMOD . VERSION . number )
{
2018-01-16 22:20:06 +00:00
MessageBox . Show ( $"Error! You are using an old version of FMOD {version:X}. This program requires {FMOD.VERSION.number:X}." ) ;
2015-10-30 02:41:37 +00:00
Application . Exit ( ) ;
}
2017-11-09 18:27:36 +00:00
result = system . init ( 1 , FMOD . INITFLAGS . NORMAL , IntPtr . Zero ) ;
2015-11-04 22:13:20 +00:00
if ( ERRCHECK ( result ) ) { return ; }
2015-10-30 02:41:37 +00:00
2015-11-04 22:13:20 +00:00
result = system . getMasterSoundGroup ( out masterSoundGroup ) ;
if ( ERRCHECK ( result ) ) { return ; }
2015-10-30 02:41:37 +00:00
result = masterSoundGroup . setVolume ( FMODVolume ) ;
2015-11-04 22:13:20 +00:00
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 ( ) )
2015-11-04 22:13:20 +00:00
{
2016-08-02 15:11:14 +00:00
var result = sound . release ( ) ;
2017-11-09 18:27:36 +00:00
ERRCHECK ( result ) ;
2015-11-04 22:13:20 +00:00
sound = null ;
}
2015-10-30 02:41:37 +00:00
}
private void FMODplayButton_Click ( object sender , EventArgs e )
{
2015-11-04 22:13:20 +00:00
if ( sound ! = null & & channel ! = null )
2015-10-30 02:41:37 +00:00
{
timer . Start ( ) ;
2018-01-16 22:20:06 +00:00
var result = channel . isPlaying ( out var playing ) ;
2015-10-30 02:41:37 +00:00
if ( ( result ! = FMOD . RESULT . OK ) & & ( result ! = FMOD . RESULT . ERR_INVALID_HANDLE ) )
{
2015-11-04 22:13:20 +00:00
if ( ERRCHECK ( result ) ) { return ; }
2015-10-30 02:41:37 +00:00
}
if ( playing )
{
result = channel . stop ( ) ;
2015-11-04 22:13:20 +00:00
if ( ERRCHECK ( result ) ) { return ; }
2015-10-30 02:41:37 +00:00
2015-11-04 22:13:20 +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
{
2015-11-04 22:13:20 +00:00
result = system . playSound ( sound , null , false , out channel ) ;
if ( ERRCHECK ( result ) ) { return ; }
2015-10-30 02:41:37 +00:00
FMODstatusLabel . Text = "Playing" ;
2015-11-04 22:13:20 +00:00
if ( FMODprogressBar . Value > 0 )
{
uint newms = FMODlenms / 1000 * ( uint ) FMODprogressBar . Value ;
2015-10-30 02:41:37 +00:00
2015-11-04 22:13:20 +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 )
{
2015-11-04 22:13:20 +00:00
if ( sound ! = null & & channel ! = null )
2015-10-30 02:41:37 +00:00
{
2018-01-16 22:20:06 +00:00
var result = channel . isPlaying ( out var playing ) ;
2015-10-30 02:41:37 +00:00
if ( ( result ! = FMOD . RESULT . OK ) & & ( result ! = FMOD . RESULT . ERR_INVALID_HANDLE ) )
{
2015-11-04 22:13:20 +00:00
if ( ERRCHECK ( result ) ) { return ; }
2015-10-30 02:41:37 +00:00
}
if ( playing )
{
2018-01-16 22:20:06 +00:00
result = channel . getPaused ( out var paused ) ;
2015-11-04 22:13:20 +00:00
if ( ERRCHECK ( result ) ) { return ; }
2015-10-30 02:41:37 +00:00
result = channel . setPaused ( ! paused ) ;
2015-11-04 22:13:20 +00:00
if ( ERRCHECK ( result ) ) { return ; }
2015-10-30 02:41:37 +00:00
if ( paused )
{
2018-01-16 22:20:06 +00:00
FMODstatusLabel . Text = "Playing" ;
2015-10-30 02:41:37 +00:00
FMODpauseButton . Text = "Pause" ;
timer . Start ( ) ;
}
else
{
FMODstatusLabel . Text = "Paused" ;
FMODpauseButton . Text = "Resume" ;
timer . Stop ( ) ;
}
}
}
}
private void FMODstopButton_Click ( object sender , EventArgs e )
{
if ( channel ! = null )
{
2018-01-16 22:20:06 +00:00
var result = channel . isPlaying ( out var playing ) ;
2015-10-30 02:41:37 +00:00
if ( ( result ! = FMOD . RESULT . OK ) & & ( result ! = FMOD . RESULT . ERR_INVALID_HANDLE ) )
{
2015-11-04 22:13:20 +00:00
if ( ERRCHECK ( result ) ) { return ; }
2015-10-30 02:41:37 +00:00
}
if ( playing )
{
result = channel . stop ( ) ;
2015-11-04 22:13:20 +00:00
if ( ERRCHECK ( result ) ) { return ; }
2015-10-30 02:41:37 +00:00
//channel = null;
2015-11-04 22:13:20 +00:00
//don't FMODreset, it will nullify the sound
2015-10-30 02:41:37 +00:00
timer . Stop ( ) ;
FMODprogressBar . Value = 0 ;
2015-11-04 22:13:20 +00:00
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 ;
2018-01-16 22:20:06 +00:00
loopMode = FMODloopButton . Checked ? FMOD . MODE . LOOP_NORMAL : FMOD . MODE . LOOP_OFF ;
2015-10-30 02:41:37 +00:00
if ( sound ! = null )
{
result = sound . setMode ( loopMode ) ;
2015-11-04 22:13:20 +00:00
if ( ERRCHECK ( result ) ) { return ; }
2015-10-30 02:41:37 +00:00
}
if ( channel ! = null )
{
2018-01-16 22:20:06 +00:00
result = channel . isPlaying ( out var playing ) ;
2015-10-30 02:41:37 +00:00
if ( ( result ! = FMOD . RESULT . OK ) & & ( result ! = FMOD . RESULT . ERR_INVALID_HANDLE ) )
{
2015-11-04 22:13:20 +00:00
if ( ERRCHECK ( result ) ) { return ; }
2015-10-30 02:41:37 +00:00
}
2018-01-16 22:20:06 +00:00
result = channel . getPaused ( out var paused ) ;
2015-10-30 02:41:37 +00:00
if ( ( result ! = FMOD . RESULT . OK ) & & ( result ! = FMOD . RESULT . ERR_INVALID_HANDLE ) )
{
2015-11-04 22:13:20 +00:00
if ( ERRCHECK ( result ) ) { return ; }
2015-10-30 02:41:37 +00:00
}
if ( playing | | paused )
{
result = channel . setMode ( loopMode ) ;
2015-11-04 22:13:20 +00:00
if ( ERRCHECK ( result ) ) { return ; }
2015-10-30 02:41:37 +00:00
}
}
}
private void FMODvolumeBar_ValueChanged ( object sender , EventArgs e )
{
FMODVolume = Convert . ToSingle ( FMODvolumeBar . Value ) / 10 ;
2018-01-16 22:20:06 +00:00
var result = masterSoundGroup . setVolume ( FMODVolume ) ;
2015-11-04 22:13:20 +00:00
if ( ERRCHECK ( result ) ) { return ; }
2015-10-30 02:41:37 +00:00
}
private void FMODprogressBar_Scroll ( object sender , EventArgs e )
{
if ( channel ! = null )
{
2015-11-04 22:13:20 +00:00
uint newms = FMODlenms / 1000 * ( uint ) FMODprogressBar . Value ;
2018-01-16 22:20:06 +00:00
FMODtimerLabel . Text = $"{newms / 1000 / 60}:{newms / 1000 % 60}.{newms / 10 % 100}/{FMODlenms / 1000 / 60}:{FMODlenms / 1000 % 60}.{FMODlenms / 10 % 100}" ;
2015-10-30 02:41:37 +00:00
}
}
private void FMODprogressBar_MouseDown ( object sender , MouseEventArgs e )
{
timer . Stop ( ) ;
}
private void FMODprogressBar_MouseUp ( object sender , MouseEventArgs e )
{
if ( channel ! = null )
{
2015-11-04 22:13:20 +00:00
uint newms = FMODlenms / 1000 * ( uint ) FMODprogressBar . Value ;
2015-10-30 02:41:37 +00:00
2018-01-16 22:20:06 +00:00
var result = channel . setPosition ( newms , FMOD . TIMEUNIT . MS ) ;
2015-10-30 02:41:37 +00:00
if ( ( result ! = FMOD . RESULT . OK ) & & ( result ! = FMOD . RESULT . ERR_INVALID_HANDLE ) )
{
2015-11-04 22:13:20 +00:00
if ( ERRCHECK ( result ) ) { return ; }
2015-10-30 02:41:37 +00:00
}
2018-01-16 22:20:06 +00:00
result = channel . isPlaying ( out var playing ) ;
2015-10-30 02:41:37 +00:00
if ( ( result ! = FMOD . RESULT . OK ) & & ( result ! = FMOD . RESULT . ERR_INVALID_HANDLE ) )
{
2015-11-04 22:13:20 +00:00
if ( ERRCHECK ( result ) ) { return ; }
2015-10-30 02:41:37 +00:00
}
if ( playing ) { timer . Start ( ) ; }
}
}
private void timer_Tick ( object sender , EventArgs e )
{
uint ms = 0 ;
bool playing = false ;
bool paused = false ;
if ( channel ! = null )
{
2018-01-16 22:20:06 +00:00
var 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 ) ;
}
2015-11-04 22:13:20 +00:00
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 ) ;
}
2015-11-04 22:13:20 +00:00
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 ) ;
}
}
2018-01-16 22:20:06 +00:00
FMODtimerLabel . Text = $"{ms / 1000 / 60}:{ms / 1000 % 60}.{ms / 10 % 100} / {FMODlenms / 1000 / 60}:{FMODlenms / 1000 % 60}.{FMODlenms / 10 % 100}" ;
2015-10-30 02:41:37 +00:00
FMODprogressBar . Value = ( int ) ( ms * 1000 / FMODlenms ) ;
2018-01-16 22:20:06 +00:00
FMODstatusLabel . Text = paused ? "Paused " : playing ? "Playing" : "Stopped" ;
2015-10-30 02:41:37 +00:00
2016-08-02 15:11:14 +00:00
if ( system ! = null & & channel ! = null )
2015-10-30 02:41:37 +00:00
{
system . update ( ) ;
}
}
2015-11-04 22:13:20 +00:00
private bool ERRCHECK ( FMOD . RESULT result )
2015-10-30 02:41:37 +00:00
{
if ( result ! = FMOD . RESULT . OK )
{
2015-11-04 22:13:20 +00:00
FMODreset ( ) ;
2018-01-16 22:20:06 +00:00
StatusStripUpdate ( $"FMOD error! {result} - {FMOD.Error.String(result)}" ) ;
2015-11-04 22:13:20 +00:00
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
}
2018-04-09 20:45:09 +00:00
private void exportallobjectssplitToolStripMenuItem_Click ( object sender , EventArgs e )
2016-10-26 11:55:28 +00:00
{
if ( sceneTreeView . Nodes . Count > 0 )
{
2017-10-22 15:48:31 +00:00
var saveFolderDialog1 = new OpenFolderDialog ( ) ;
if ( saveFolderDialog1 . ShowDialog ( this ) = = DialogResult . OK )
2016-10-26 11:55:28 +00:00
{
2018-04-17 17:29:18 +00:00
var savePath = saveFolderDialog1 . Folder + "\\" ;
progressBar1 . Value = 0 ;
progressBar1 . Maximum = sceneTreeView . Nodes . Count ;
2018-04-18 23:06:52 +00:00
ExportSplitObjects ( savePath , sceneTreeView . Nodes ) ;
2016-10-26 11:55:28 +00:00
}
}
2018-04-09 20:45:09 +00:00
else
{
StatusStripUpdate ( "No Objects available for export" ) ;
}
2016-10-26 11:55:28 +00:00
}
2015-10-30 02:41:37 +00:00
2018-04-09 20:45:09 +00:00
private void ExportObjects_Click ( object sender , EventArgs e )
2015-10-30 02:41:37 +00:00
{
if ( sceneTreeView . Nodes . Count > 0 )
{
2018-04-17 17:29:18 +00:00
var exportAll = ( ( ToolStripItem ) sender ) . Name = = "exportallobjectsMenuItem" ;
2015-10-30 02:41:37 +00:00
2018-04-09 20:45:09 +00:00
saveFileDialog1 . FileName = productName + DateTime . Now . ToString ( "_yy_MM_dd__HH_mm_ss" ) ;
2015-10-30 02:41:37 +00:00
if ( saveFileDialog1 . ShowDialog ( ) = = DialogResult . OK )
{
2018-04-17 17:29:18 +00:00
var gameObjects = new List < GameObject > ( ) ;
foreach ( var assetsFile in assetsfileList )
{
foreach ( var m_GameObject in assetsFile . GameObjectList . Values )
{
if ( m_GameObject . Checked | | exportAll )
2015-10-30 02:41:37 +00:00
{
2018-04-17 17:29:18 +00:00
gameObjects . Add ( m_GameObject ) ;
2015-10-30 02:41:37 +00:00
}
2018-04-17 17:29:18 +00:00
}
2015-10-30 02:41:37 +00:00
}
2016-08-02 15:11:14 +00:00
2018-04-17 17:29:18 +00:00
progressBar1 . Value = 0 ;
progressBar1 . Maximum = 1 ;
if ( gameObjects . Count = = 0 )
{
progressBar1 . PerformStep ( ) ;
toolStripStatusLabel1 . Text = "Nothing exported." ;
return ;
2018-04-17 21:05:17 +00:00
}
2018-04-18 00:19:30 +00:00
toolStripStatusLabel1 . Text = $"Exporting {Path.GetFileName(saveFileDialog1.FileName)}.fbx" ;
2018-04-17 17:29:18 +00:00
FBXExporter . WriteFBX ( saveFileDialog1 . FileName , gameObjects ) ;
2018-04-18 00:19:30 +00:00
toolStripStatusLabel1 . Text = $"Finished exporting {Path.GetFileName(saveFileDialog1.FileName)}.fbx" ;
2018-04-17 17:29:18 +00:00
progressBar1 . PerformStep ( ) ;
if ( openAfterExport . Checked & & File . Exists ( saveFileDialog1 . FileName ) )
{
Process . Start ( Path . GetDirectoryName ( saveFileDialog1 . FileName ) ) ;
}
}
2015-10-30 02:41:37 +00:00
}
2018-04-09 20:45:09 +00:00
else
{
2018-04-17 17:29:18 +00:00
toolStripStatusLabel1 . Text = "No Objects available for export" ;
2018-04-09 20:45:09 +00:00
}
2015-10-30 02:41:37 +00:00
}
2017-02-11 07:39:14 +00:00
private void ExportAssets_Click ( object sender , EventArgs e )
2015-10-30 02:41:37 +00:00
{
2018-04-09 20:45:09 +00:00
if ( exportableAssets . Count > 0 )
2015-10-30 02:41:37 +00:00
{
2018-04-09 20:45:09 +00:00
var saveFolderDialog1 = new OpenFolderDialog ( ) ;
if ( saveFolderDialog1 . ShowDialog ( this ) = = DialogResult . OK )
2015-10-30 02:41:37 +00:00
{
2018-04-09 20:45:09 +00:00
timer . Stop ( ) ;
2016-08-13 00:20:38 +00:00
2018-04-09 20:45:09 +00:00
List < AssetPreloadData > toExportAssets = null ;
switch ( ( ( ToolStripItem ) sender ) . Name )
2016-08-02 15:11:14 +00:00
{
2018-04-09 20:45:09 +00:00
case "exportAllAssetsMenuItem" :
toExportAssets = exportableAssets ;
2016-08-02 15:11:14 +00:00
break ;
2018-04-09 20:45:09 +00:00
case "exportFilteredAssetsMenuItem" :
toExportAssets = visibleAssets ;
break ;
case "exportSelectedAssetsMenuItem" :
toExportAssets = new List < AssetPreloadData > ( assetListView . SelectedIndices . Count ) ;
foreach ( int i in assetListView . SelectedIndices )
{
toExportAssets . Add ( ( AssetPreloadData ) assetListView . Items [ i ] ) ;
}
2016-08-02 15:11:14 +00:00
break ;
}
2018-04-09 20:45:09 +00:00
ExportAssets ( saveFolderDialog1 . Folder , toExportAssets , assetGroupOptions . SelectedIndex , openAfterExport . Checked ) ;
}
2015-10-30 02:41:37 +00:00
}
else
{
2015-11-23 20:33:42 +00:00
StatusStripUpdate ( "No exportable assets loaded" ) ;
2015-10-30 02:41:37 +00:00
}
}
2016-08-02 15:11:14 +00:00
private void SetProgressBarValue ( int value )
{
if ( InvokeRequired )
{
BeginInvoke ( new Action ( ( ) = > { progressBar1 . Value = value ; } ) ) ;
}
else
{
progressBar1 . Value = value ;
}
}
private void SetProgressBarMaximum ( int value )
2015-11-23 20:33:42 +00:00
{
2016-08-02 15:11:14 +00:00
if ( InvokeRequired )
{
BeginInvoke ( new Action ( ( ) = > { progressBar1 . Maximum = value ; } ) ) ;
}
else
{
progressBar1 . Maximum = value ;
}
2015-11-23 20:33:42 +00:00
}
2016-08-02 15:11:14 +00:00
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 ;
}
}
2018-04-02 22:51:22 +00:00
public AssetStudioForm ( )
2015-10-30 02:41:37 +00:00
{
Thread . CurrentThread . CurrentCulture = new CultureInfo ( "en-US" ) ;
InitializeComponent ( ) ;
2017-03-31 20:28:46 +00:00
displayOriginalName . Checked = ( bool ) Properties . Settings . Default [ "displayOriginalName" ] ;
2016-08-13 00:20:38 +00:00
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" ] ;
2015-11-04 22:13:20 +00:00
FMODinit ( ) ;
2017-02-11 20:57:24 +00:00
//UI
2018-03-25 05:53:52 +00:00
Studio . SetProgressBarValue = SetProgressBarValue ;
Studio . SetProgressBarMaximum = SetProgressBarMaximum ;
Studio . ProgressBarPerformStep = ProgressBarPerformStep ;
Studio . StatusStripUpdate = StatusStripUpdate ;
Studio . ProgressBarMaximumAdd = ProgressBarMaximumAdd ;
2015-10-30 02:41:37 +00:00
}
2017-02-25 10:04:05 +00:00
private void timerOpenTK_Tick ( object sender , EventArgs e )
{
2018-01-16 22:20:06 +00:00
if ( glControl1 . Visible )
2017-02-25 10:04:05 +00:00
{
2017-09-29 23:26:27 +00:00
viewMatrixData * = Matrix4 . CreateRotationY ( - 0.1f ) ;
2017-02-25 10:04:05 +00:00
glControl1 . Invalidate ( ) ;
}
}
private void initOpenTK ( )
{
2017-02-27 15:56:24 +00:00
GL . Viewport ( 0 , 0 , glControl1 . ClientSize . Width , glControl1 . ClientSize . Height ) ;
GL . ClearColor ( Color . CadetBlue ) ;
2017-02-25 10:04:05 +00:00
pgmID = GL . CreateProgram ( ) ;
2018-01-16 22:20:06 +00:00
loadShader ( "vs" , ShaderType . VertexShader , pgmID , out int vsID ) ;
loadShader ( "fs" , ShaderType . FragmentShader , pgmID , out int fsID ) ;
2017-02-25 10:04:05 +00:00
GL . LinkProgram ( pgmID ) ;
2017-09-28 21:08:59 +00:00
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
2017-02-25 10:04:05 +00:00
attributeVertexPosition = GL . GetAttribLocation ( pgmID , "vertexPosition" ) ;
attributeNormalDirection = GL . GetAttribLocation ( pgmID , "normalDirection" ) ;
2017-09-28 21:08:59 +00:00
attributeVertexColor = GL . GetAttribLocation ( pgmColorID , "vertexColor" ) ;
2017-09-29 23:26:27 +00:00
uniformModelMatrix = GL . GetUniformLocation ( pgmID , "modelMatrix" ) ;
2017-02-25 10:04:05 +00:00
uniformViewMatrix = GL . GetUniformLocation ( pgmID , "viewMatrix" ) ;
2017-02-27 15:56:24 +00:00
glControl1 . Visible = false ;
2017-02-25 10:04:05 +00:00
}
private void loadShader ( string filename , ShaderType type , int program , out int address )
{
address = GL . CreateShader ( type ) ;
2018-01-18 14:08:44 +00:00
var str = ( string ) Properties . Resources . ResourceManager . GetObject ( filename ) ;
2017-08-21 11:51:32 +00:00
GL . ShaderSource ( address , str ) ;
2017-02-25 10:04:05 +00:00
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 )
2017-02-25 10:04:05 +00:00
{
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 ) ,
2017-02-25 10:04:05 +00:00
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 )
2017-02-25 10:04:05 +00:00
{
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 ) ,
2017-02-25 10:04:05 +00:00
data ,
BufferUsageHint . StaticDraw ) ;
GL . VertexAttribPointer ( address , 4 , VertexAttribPointerType . Float , false , 0 , 0 ) ;
GL . EnableVertexAttribArray ( address ) ;
}
2017-09-29 23:26:27 +00:00
private void createVBO ( out int vboAddress , Matrix4 data , int address )
2017-02-25 10:04:05 +00:00
{
GL . GenBuffers ( 1 , out vboAddress ) ;
2017-09-29 23:26:27 +00:00
GL . UniformMatrix4 ( address , false , ref data ) ;
2017-02-25 10:04:05 +00:00
}
2017-04-09 01:59:31 +00:00
private void createEBO ( out int address , int [ ] data )
2017-02-25 10:04:05 +00:00
{
GL . GenBuffers ( 1 , out address ) ;
GL . BindBuffer ( BufferTarget . ElementArrayBuffer , address ) ;
GL . BufferData ( BufferTarget . ElementArrayBuffer ,
( IntPtr ) ( data . Length * sizeof ( int ) ) ,
data ,
BufferUsageHint . StaticDraw ) ;
}
2017-02-27 15:56:24 +00:00
2017-02-25 10:04:05 +00:00
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 ) ;
2017-09-28 21:08:59 +00:00
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 ) ;
2017-09-29 23:26:27 +00:00
createVBO ( out vboModelMatrix , modelMatrixData , uniformModelMatrix ) ;
2017-04-09 01:59:31 +00:00
createVBO ( out vboViewMatrix , viewMatrixData , uniformViewMatrix ) ;
createEBO ( out eboElements , indiceData ) ;
2017-02-25 10:04:05 +00:00
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 ) ;
2017-09-28 21:08:59 +00:00
GL . DepthFunc ( DepthFunction . Lequal ) ;
2017-02-27 15:56:24 +00:00
GL . BindVertexArray ( vao ) ;
2017-09-28 21:08:59 +00:00
if ( wireFrameMode = = 0 | | wireFrameMode = = 2 )
2017-02-25 10:04:05 +00:00
{
2017-09-28 21:08:59 +00:00
GL . UseProgram ( shadeMode = = 0 ? pgmID : pgmColorID ) ;
2017-09-29 23:26:27 +00:00
GL . UniformMatrix4 ( uniformModelMatrix , false , ref modelMatrixData ) ;
GL . UniformMatrix4 ( uniformViewMatrix , false , ref viewMatrixData ) ;
2017-09-28 21:08:59 +00:00
GL . PolygonMode ( MaterialFace . FrontAndBack , PolygonMode . Fill ) ;
GL . DrawElements ( BeginMode . Triangles , indiceData . Length , DrawElementsType . UnsignedInt , 0 ) ;
2017-02-25 10:04:05 +00:00
}
2017-09-28 21:08:59 +00:00
//Wireframe
if ( wireFrameMode = = 1 | | wireFrameMode = = 2 )
2017-02-25 10:04:05 +00:00
{
2017-09-28 21:08:59 +00:00
GL . Enable ( EnableCap . PolygonOffsetLine ) ;
GL . PolygonOffset ( - 1 , - 1 ) ;
GL . UseProgram ( pgmBlackID ) ;
2017-09-29 23:26:27 +00:00
GL . UniformMatrix4 ( uniformModelMatrix , false , ref modelMatrixData ) ;
GL . UniformMatrix4 ( uniformViewMatrix , false , ref viewMatrixData ) ;
2017-09-28 21:08:59 +00:00
GL . PolygonMode ( MaterialFace . FrontAndBack , PolygonMode . Line ) ;
GL . DrawElements ( BeginMode . Triangles , indiceData . Length , DrawElementsType . UnsignedInt , 0 ) ;
GL . Disable ( EnableCap . PolygonOffsetLine ) ;
2017-02-25 10:04:05 +00:00
}
GL . BindVertexArray ( 0 ) ;
GL . Flush ( ) ;
glControl1 . SwapBuffers ( ) ;
}
2018-04-09 20:45:09 +00:00
private void glControl1_MouseWheel ( object sender , MouseEventArgs e )
{
if ( glControl1 . Visible )
{
viewMatrixData * = Matrix4 . CreateScale ( 1 + e . Delta / 1000f ) ;
glControl1 . Invalidate ( ) ;
}
}
2018-04-17 21:05:17 +00:00
2015-10-30 02:41:37 +00:00
private void resetForm ( )
{
2018-04-02 22:51:22 +00:00
Text = "AssetStudio" ;
2015-10-30 02:41:37 +00:00
2018-04-02 22:51:22 +00:00
importFiles . Clear ( ) ;
2018-03-27 22:29:28 +00:00
foreach ( var assetsFile in assetsfileList )
{
assetsFile . assetsFileReader . Dispose ( ) ;
}
2017-02-11 20:57:24 +00:00
assetsfileList . Clear ( ) ;
exportableAssets . Clear ( ) ;
visibleAssets . Clear ( ) ;
2018-03-27 22:29:28 +00:00
foreach ( var resourceFileReader in resourceFileReaders )
{
resourceFileReader . Value . Dispose ( ) ;
}
2018-02-28 19:42:43 +00:00
resourceFileReaders . Clear ( ) ;
sharedFileIndex . Clear ( ) ;
productName = "" ;
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 ;
2017-02-25 10:04:05 +00:00
glControl1 . Visible = false ;
2015-10-30 02:41:37 +00:00
lastSelectedItem = null ;
lastLoadedAsset = null ;
2015-11-04 12:16:03 +00:00
firstSortColumn = - 1 ;
secondSortColumn = 0 ;
reverseSort = false ;
enableFiltering = false ;
2018-04-17 17:29:18 +00:00
listSearch . Text = " Filter " ;
2018-04-17 21:05:17 +00:00
var count = showTypeToolStripMenuItem . DropDownItems . Count ;
for ( var i = 1 ; i < count ; i + + )
{
showTypeToolStripMenuItem . DropDownItems . RemoveAt ( 1 ) ;
}
2015-11-04 22:13:20 +00:00
FMODreset ( ) ;
2015-10-30 02:41:37 +00:00
}
2017-06-30 08:11:16 +00:00
private void assetListView_MouseClick ( object sender , MouseEventArgs e )
{
2018-04-09 20:45:09 +00:00
if ( e . Button = = MouseButtons . Right & & assetListView . SelectedIndices . Count > 0 )
2017-06-30 08:11:16 +00:00
{
2018-04-18 23:06:52 +00:00
jumpToSceneHierarchyToolStripMenuItem . Visible = false ;
2018-04-09 20:45:09 +00:00
showOriginalFileToolStripMenuItem . Visible = false ;
2018-04-17 23:11:10 +00:00
exportAnimatorwithselectedAnimationClipMenuItem . Visible = false ;
exportobjectswithselectedAnimationClipMenuItem . Visible = false ;
2018-04-09 20:45:09 +00:00
if ( assetListView . SelectedIndices . Count = = 1 )
{
2018-04-18 23:06:52 +00:00
jumpToSceneHierarchyToolStripMenuItem . Visible = true ;
2018-04-09 20:45:09 +00:00
showOriginalFileToolStripMenuItem . Visible = true ;
}
2018-04-12 19:16:09 +00:00
if ( assetListView . SelectedIndices . Count > = 1 )
2018-04-09 20:45:09 +00:00
{
2018-04-17 23:11:10 +00:00
var selectedAssets = GetSelectedAssets ( ) ;
2018-04-09 20:45:09 +00:00
if ( selectedAssets . Any ( x = > x . Type = = ClassIDReference . Animator ) & & selectedAssets . Any ( x = > x . Type = = ClassIDReference . AnimationClip ) )
{
2018-04-17 23:11:10 +00:00
exportAnimatorwithselectedAnimationClipMenuItem . Visible = true ;
2018-04-09 20:45:09 +00:00
}
2018-04-11 07:52:37 +00:00
else if ( selectedAssets . All ( x = > x . Type = = ClassIDReference . AnimationClip ) )
2018-04-09 20:45:09 +00:00
{
2018-04-17 23:11:10 +00:00
exportobjectswithselectedAnimationClipMenuItem . Visible = true ;
2018-04-11 07:52:37 +00:00
}
2018-04-09 20:45:09 +00:00
}
2017-06-30 08:11:16 +00:00
contextMenuStrip1 . Show ( assetListView , e . X , e . Y ) ;
}
}
2018-01-16 22:20:06 +00:00
2018-04-09 20:45:09 +00:00
private void exportSelectedAssetsToolStripMenuItem_Click ( object sender , EventArgs e )
2018-01-16 22:20:06 +00:00
{
2018-04-09 20:45:09 +00:00
var saveFolderDialog1 = new OpenFolderDialog ( ) ;
if ( saveFolderDialog1 . ShowDialog ( this ) = = DialogResult . OK )
2018-01-16 22:20:06 +00:00
{
2018-04-09 20:45:09 +00:00
timer . Stop ( ) ;
2018-04-17 23:11:10 +00:00
ExportAssets ( saveFolderDialog1 . Folder , GetSelectedAssets ( ) , assetGroupOptions . SelectedIndex , openAfterExport . Checked ) ;
2018-01-16 22:20:06 +00:00
}
}
2018-04-06 23:51:33 +00:00
2018-04-09 20:45:09 +00:00
private void showOriginalFileToolStripMenuItem_Click ( object sender , EventArgs e )
{
2018-04-17 23:11:10 +00:00
var selectasset = ( AssetPreloadData ) assetListView . Items [ assetListView . SelectedIndices [ 0 ] ] ;
2018-04-09 20:45:09 +00:00
var args = $"/select, {selectasset.sourceFile.parentPath ?? selectasset.sourceFile.filePath}" ;
var pfi = new ProcessStartInfo ( "explorer.exe" , args ) ;
Process . Start ( pfi ) ;
}
private void exportAnimatorwithAnimationClipMenuItem_Click ( object sender , EventArgs e )
2018-04-06 23:51:33 +00:00
{
AssetPreloadData animator = null ;
List < AssetPreloadData > animationList = new List < AssetPreloadData > ( ) ;
2018-04-17 23:11:10 +00:00
var selectedAssets = GetSelectedAssets ( ) ;
2018-04-09 20:45:09 +00:00
foreach ( var assetPreloadData in selectedAssets )
2018-04-06 23:51:33 +00:00
{
2018-04-09 20:45:09 +00:00
if ( assetPreloadData . Type = = ClassIDReference . Animator )
2018-04-06 23:51:33 +00:00
{
2018-04-09 20:45:09 +00:00
animator = assetPreloadData ;
2018-04-06 23:51:33 +00:00
}
2018-04-09 20:45:09 +00:00
else if ( assetPreloadData . Type = = ClassIDReference . AnimationClip )
2018-04-06 23:51:33 +00:00
{
2018-04-09 20:45:09 +00:00
animationList . Add ( assetPreloadData ) ;
2018-04-06 23:51:33 +00:00
}
}
if ( animator ! = null )
{
var saveFolderDialog1 = new OpenFolderDialog ( ) ;
if ( saveFolderDialog1 . ShowDialog ( this ) = = DialogResult . OK )
{
2018-04-11 07:52:37 +00:00
var exportPath = saveFolderDialog1 . Folder + "\\Animator\\" ;
2018-04-09 20:45:09 +00:00
progressBar1 . Value = 0 ;
progressBar1 . Maximum = 1 ;
2018-04-11 07:52:37 +00:00
ExportAnimatorWithAnimationClip ( animator , animationList , exportPath ) ;
2018-04-06 23:51:33 +00:00
}
}
}
2018-04-09 20:45:09 +00:00
2018-04-17 23:11:10 +00:00
private void exportSelectedObjectsToolStripMenuItem_Click ( object sender , EventArgs e )
{
2018-04-18 23:06:52 +00:00
if ( sceneTreeView . Nodes . Count > 0 )
2018-04-17 23:11:10 +00:00
{
2018-04-18 23:06:52 +00:00
var saveFolderDialog1 = new OpenFolderDialog ( ) ;
if ( saveFolderDialog1 . ShowDialog ( this ) = = DialogResult . OK )
{
var exportPath = saveFolderDialog1 . Folder + "\\GameObject\\" ;
ExportObjectsWithAnimationClip ( exportPath , sceneTreeView . Nodes ) ;
}
}
else
{
StatusStripUpdate ( "No Objects available for export" ) ;
2018-04-17 23:11:10 +00:00
}
}
2018-04-18 23:06:52 +00:00
private void exportObjectswithAnimationClipMenuItem_Click ( object sender , EventArgs e )
2018-04-18 00:19:30 +00:00
{
if ( sceneTreeView . Nodes . Count > 0 )
{
var saveFolderDialog1 = new OpenFolderDialog ( ) ;
if ( saveFolderDialog1 . ShowDialog ( this ) = = DialogResult . OK )
{
2018-04-18 23:06:52 +00:00
var exportPath = saveFolderDialog1 . Folder + "\\GameObject\\" ;
ExportObjectsWithAnimationClip ( exportPath , sceneTreeView . Nodes , GetSelectedAssets ( ) ) ;
2018-04-18 00:19:30 +00:00
}
}
else
{
StatusStripUpdate ( "No Objects available for export" ) ;
}
}
2018-04-18 23:06:52 +00:00
private void jumpToSceneHierarchyToolStripMenuItem_Click ( object sender , EventArgs e )
2018-04-09 20:45:09 +00:00
{
2018-04-18 23:06:52 +00:00
var selectasset = ( AssetPreloadData ) assetListView . Items [ assetListView . SelectedIndices [ 0 ] ] ;
if ( selectasset . gameObject ! = null )
{
sceneTreeView . SelectedNode = selectasset . gameObject ;
tabControl1 . SelectedTab = tabPage1 ;
}
}
private void exportAllObjectssplitToolStripMenuItem1_Click ( object sender , EventArgs e )
{
if ( sceneTreeView . Nodes . Count > 0 )
2018-04-11 07:52:37 +00:00
{
2018-04-18 23:06:52 +00:00
var saveFolderDialog1 = new OpenFolderDialog ( ) ;
if ( saveFolderDialog1 . ShowDialog ( this ) = = DialogResult . OK )
{
var savePath = saveFolderDialog1 . Folder + "\\" ;
progressBar1 . Value = 0 ;
progressBar1 . Maximum = sceneTreeView . Nodes . Count ;
ExportSplitObjectsNew ( savePath , sceneTreeView . Nodes ) ;
}
}
else
{
StatusStripUpdate ( "No Objects available for export" ) ;
2018-04-11 07:52:37 +00:00
}
}
2018-04-17 23:11:10 +00:00
private List < AssetPreloadData > GetSelectedAssets ( )
2018-04-11 07:52:37 +00:00
{
2018-04-17 23:11:10 +00:00
var selectedAssets = new List < AssetPreloadData > ( ) ;
foreach ( int index in assetListView . SelectedIndices )
2018-04-11 07:52:37 +00:00
{
2018-04-17 23:11:10 +00:00
selectedAssets . Add ( ( AssetPreloadData ) assetListView . Items [ index ] ) ;
2018-04-11 07:52:37 +00:00
}
2018-04-17 23:11:10 +00:00
return selectedAssets ;
2018-04-09 20:45:09 +00:00
}
2018-04-21 07:50:13 +00:00
private void FilterAssetList ( )
{
assetListView . BeginUpdate ( ) ;
assetListView . SelectedIndices . Clear ( ) ;
visibleAssets . Clear ( ) ;
var show = new List < ClassIDReference > ( ) ;
if ( ! allToolStripMenuItem . Checked )
{
for ( var i = 1 ; i < showTypeToolStripMenuItem . DropDownItems . Count ; i + + )
{
var item = ( ToolStripMenuItem ) showTypeToolStripMenuItem . DropDownItems [ i ] ;
if ( item . Checked )
{
show . Add ( ( ClassIDReference ) Enum . Parse ( typeof ( ClassIDReference ) , item . Text ) ) ;
}
}
visibleAssets = exportableAssets . FindAll ( x = > show . Contains ( x . Type ) ) ;
}
else
{
visibleAssets = exportableAssets ;
}
if ( listSearch . Text ! = " Filter " )
{
visibleAssets = visibleAssets . FindAll ( x = > x . Text . IndexOf ( listSearch . Text , StringComparison . CurrentCultureIgnoreCase ) > = 0 ) ;
}
assetListView . VirtualListSize = visibleAssets . Count ;
assetListView . EndUpdate ( ) ;
}
2015-10-30 02:41:37 +00:00
}
}