diff --git a/AssetStudio/AssetStudio.csproj b/AssetStudio/AssetStudio.csproj
index d617bf6..ba896a7 100644
--- a/AssetStudio/AssetStudio.csproj
+++ b/AssetStudio/AssetStudio.csproj
@@ -209,7 +209,6 @@
-
diff --git a/AssetStudio/AssetStudioForm.Designer.cs b/AssetStudio/AssetStudioForm.Designer.cs
index c10121f..47b93c6 100644
--- a/AssetStudio/AssetStudioForm.Designer.cs
+++ b/AssetStudio/AssetStudioForm.Designer.cs
@@ -46,11 +46,6 @@
this.assetGroupOptions = new System.Windows.Forms.ToolStripComboBox();
this.showExpOpt = new System.Windows.Forms.ToolStripMenuItem();
this.modelToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
- this.toolStripMenuItem3 = new System.Windows.Forms.ToolStripMenuItem();
- this.exportallobjectsMenuItem = new System.Windows.Forms.ToolStripMenuItem();
- this.exportallobjectssplitToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
- this.exportselectedobjectsMenuItem = new System.Windows.Forms.ToolStripMenuItem();
- this.toolStripMenuItem2 = new System.Windows.Forms.ToolStripMenuItem();
this.exportAllObjectssplitToolStripMenuItem1 = new System.Windows.Forms.ToolStripMenuItem();
this.exportSelectedObjectsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.exportSelectedObjectsWithAnimationClipToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
@@ -282,11 +277,6 @@
// modelToolStripMenuItem
//
this.modelToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
- this.toolStripMenuItem3,
- this.exportallobjectsMenuItem,
- this.exportallobjectssplitToolStripMenuItem,
- this.exportselectedobjectsMenuItem,
- this.toolStripMenuItem2,
this.exportAllObjectssplitToolStripMenuItem1,
this.exportSelectedObjectsToolStripMenuItem,
this.exportSelectedObjectsWithAnimationClipToolStripMenuItem});
@@ -294,59 +284,24 @@
this.modelToolStripMenuItem.Size = new System.Drawing.Size(58, 21);
this.modelToolStripMenuItem.Text = "Model";
//
- // toolStripMenuItem3
- //
- this.toolStripMenuItem3.Enabled = false;
- this.toolStripMenuItem3.Name = "toolStripMenuItem3";
- this.toolStripMenuItem3.Size = new System.Drawing.Size(332, 22);
- this.toolStripMenuItem3.Text = "-----------------------Ascii-----------------------";
- //
- // exportallobjectsMenuItem
- //
- this.exportallobjectsMenuItem.Name = "exportallobjectsMenuItem";
- this.exportallobjectsMenuItem.Size = new System.Drawing.Size(332, 22);
- this.exportallobjectsMenuItem.Text = "Export all objects";
- this.exportallobjectsMenuItem.Click += new System.EventHandler(this.ExportObjects_Click);
- //
- // exportallobjectssplitToolStripMenuItem
- //
- this.exportallobjectssplitToolStripMenuItem.Name = "exportallobjectssplitToolStripMenuItem";
- this.exportallobjectssplitToolStripMenuItem.Size = new System.Drawing.Size(332, 22);
- this.exportallobjectssplitToolStripMenuItem.Text = "Export all objects (split)";
- this.exportallobjectssplitToolStripMenuItem.Click += new System.EventHandler(this.exportallobjectssplitToolStripMenuItem_Click);
- //
- // exportselectedobjectsMenuItem
- //
- this.exportselectedobjectsMenuItem.Name = "exportselectedobjectsMenuItem";
- this.exportselectedobjectsMenuItem.Size = new System.Drawing.Size(332, 22);
- this.exportselectedobjectsMenuItem.Text = "Export selected objects";
- this.exportselectedobjectsMenuItem.Click += new System.EventHandler(this.ExportObjects_Click);
- //
- // toolStripMenuItem2
- //
- this.toolStripMenuItem2.Enabled = false;
- this.toolStripMenuItem2.Name = "toolStripMenuItem2";
- this.toolStripMenuItem2.Size = new System.Drawing.Size(332, 22);
- this.toolStripMenuItem2.Text = "----------------------Binary----------------------";
- //
// exportAllObjectssplitToolStripMenuItem1
//
this.exportAllObjectssplitToolStripMenuItem1.Name = "exportAllObjectssplitToolStripMenuItem1";
- this.exportAllObjectssplitToolStripMenuItem1.Size = new System.Drawing.Size(332, 22);
+ this.exportAllObjectssplitToolStripMenuItem1.Size = new System.Drawing.Size(323, 22);
this.exportAllObjectssplitToolStripMenuItem1.Text = "Export all objects (split)";
this.exportAllObjectssplitToolStripMenuItem1.Click += new System.EventHandler(this.exportAllObjectssplitToolStripMenuItem1_Click);
//
// exportSelectedObjectsToolStripMenuItem
//
this.exportSelectedObjectsToolStripMenuItem.Name = "exportSelectedObjectsToolStripMenuItem";
- this.exportSelectedObjectsToolStripMenuItem.Size = new System.Drawing.Size(332, 22);
+ this.exportSelectedObjectsToolStripMenuItem.Size = new System.Drawing.Size(323, 22);
this.exportSelectedObjectsToolStripMenuItem.Text = "Export selected objects";
this.exportSelectedObjectsToolStripMenuItem.Click += new System.EventHandler(this.exportSelectedObjectsToolStripMenuItem_Click);
//
// exportSelectedObjectsWithAnimationClipToolStripMenuItem
//
this.exportSelectedObjectsWithAnimationClipToolStripMenuItem.Name = "exportSelectedObjectsWithAnimationClipToolStripMenuItem";
- this.exportSelectedObjectsWithAnimationClipToolStripMenuItem.Size = new System.Drawing.Size(332, 22);
+ this.exportSelectedObjectsWithAnimationClipToolStripMenuItem.Size = new System.Drawing.Size(323, 22);
this.exportSelectedObjectsWithAnimationClipToolStripMenuItem.Text = "Export selected objects with AnimationClip";
this.exportSelectedObjectsWithAnimationClipToolStripMenuItem.Click += new System.EventHandler(this.exportObjectswithAnimationClipMenuItem_Click);
//
@@ -1051,8 +1006,6 @@
private System.Windows.Forms.ToolStripSeparator toolStripMenuItem1;
private System.Windows.Forms.ToolStripMenuItem extractFileToolStripMenuItem;
private System.Windows.Forms.ToolStripMenuItem extractFolderToolStripMenuItem;
- private System.Windows.Forms.ToolStripMenuItem exportallobjectsMenuItem;
- private System.Windows.Forms.ToolStripMenuItem exportselectedobjectsMenuItem;
private System.Windows.Forms.OpenFileDialog openFileDialog1;
private System.Windows.Forms.SaveFileDialog saveFileDialog1;
private System.Windows.Forms.ToolStripComboBox assetGroupOptions;
@@ -1072,7 +1025,6 @@
private System.Windows.Forms.ToolStripSeparator toolStripSeparator2;
private System.Windows.Forms.ToolStripMenuItem exportClassStructuresMenuItem;
private System.Windows.Forms.Label FMODcopyright;
- private System.Windows.Forms.ToolStripMenuItem exportallobjectssplitToolStripMenuItem;
private OpenTK.GLControl glControl1;
private System.Windows.Forms.ContextMenuStrip contextMenuStrip1;
private System.Windows.Forms.ToolStripMenuItem showOriginalFileToolStripMenuItem;
@@ -1087,8 +1039,6 @@
private System.Windows.Forms.ToolStripMenuItem exportAnimatorWithSelectedAnimationClipToolStripMenuItem;
private System.Windows.Forms.ToolStripMenuItem exportAllObjectssplitToolStripMenuItem1;
private System.Windows.Forms.ToolStripMenuItem jumpToSceneHierarchyToolStripMenuItem;
- private System.Windows.Forms.ToolStripMenuItem toolStripMenuItem2;
- private System.Windows.Forms.ToolStripMenuItem toolStripMenuItem3;
}
}
diff --git a/AssetStudio/AssetStudioForm.cs b/AssetStudio/AssetStudioForm.cs
index 0915e94..198da75 100644
--- a/AssetStudio/AssetStudioForm.cs
+++ b/AssetStudio/AssetStudioForm.cs
@@ -1364,68 +1364,6 @@ namespace AssetStudio
return false;
}
- private void exportallobjectssplitToolStripMenuItem_Click(object sender, EventArgs e)
- {
- if (sceneTreeView.Nodes.Count > 0)
- {
- var saveFolderDialog1 = new OpenFolderDialog();
- if (saveFolderDialog1.ShowDialog(this) == DialogResult.OK)
- {
- var savePath = saveFolderDialog1.Folder + "\\";
- progressBar1.Value = 0;
- progressBar1.Maximum = sceneTreeView.Nodes.Cast().Sum(x => x.Nodes.Count);
- ExportSplitObjects(savePath, sceneTreeView.Nodes);
- }
- }
- else
- {
- StatusStripUpdate("No Objects available for export");
- }
- }
-
- private void ExportObjects_Click(object sender, EventArgs e)
- {
- if (sceneTreeView.Nodes.Count > 0)
- {
- var exportAll = ((ToolStripItem)sender).Name == "exportallobjectsMenuItem";
-
- saveFileDialog1.FileName = productName + DateTime.Now.ToString("_yy_MM_dd__HH_mm_ss");
-
- if (saveFileDialog1.ShowDialog() == DialogResult.OK)
- {
- var gameObjects = new List();
- foreach (var node in treeNodeDictionary.Values)
- {
- if (node.Checked || exportAll)
- {
- gameObjects.Add(node.gameObject);
- }
- }
-
- progressBar1.Value = 0;
- progressBar1.Maximum = 1;
- if (gameObjects.Count == 0)
- {
- progressBar1.PerformStep();
- toolStripStatusLabel1.Text = "Nothing exported.";
- return;
- }
- toolStripStatusLabel1.Text = $"Exporting {Path.GetFileName(saveFileDialog1.FileName)}";
- FBXExporter.WriteFBX(saveFileDialog1.FileName, gameObjects);
- toolStripStatusLabel1.Text = $"Finished exporting {Path.GetFileName(saveFileDialog1.FileName)}";
- progressBar1.PerformStep();
- if (openAfterExport.Checked && File.Exists(saveFileDialog1.FileName))
- {
- Process.Start(Path.GetDirectoryName(saveFileDialog1.FileName));
- }
- }
- }
- else
- {
- toolStripStatusLabel1.Text = "No Objects available for export";
- }
- }
-
private void ExportAssets_Click(object sender, EventArgs e)
{
if (exportableAssets.Count > 0)
@@ -1957,7 +1895,7 @@ namespace AssetStudio
var savePath = saveFolderDialog1.Folder + "\\";
progressBar1.Value = 0;
progressBar1.Maximum = sceneTreeView.Nodes.Cast().Sum(x => x.Nodes.Count); ;
- ExportSplitObjects(savePath, sceneTreeView.Nodes, true);
+ ExportSplitObjects(savePath, sceneTreeView.Nodes);
}
}
else
diff --git a/AssetStudio/ExportOptions.Designer.cs b/AssetStudio/ExportOptions.Designer.cs
index ec76ef8..f2190d5 100644
--- a/AssetStudio/ExportOptions.Designer.cs
+++ b/AssetStudio/ExportOptions.Designer.cs
@@ -28,18 +28,8 @@
///
private void InitializeComponent()
{
- this.FbxBox = new System.Windows.Forms.GroupBox();
- this.scaleFactor = new System.Windows.Forms.NumericUpDown();
- this.convertDummies = new System.Windows.Forms.CheckBox();
- this.scaleLabel = new System.Windows.Forms.Label();
- this.exportDeformers = new System.Windows.Forms.CheckBox();
- this.geometryBox = new System.Windows.Forms.GroupBox();
- this.exportColors = new System.Windows.Forms.CheckBox();
- this.exportUVs = new System.Windows.Forms.CheckBox();
- this.exportTangents = new System.Windows.Forms.CheckBox();
- this.exportNormals = new System.Windows.Forms.CheckBox();
- this.fbxOKbutton = new System.Windows.Forms.Button();
- this.fbxCancel = new System.Windows.Forms.Button();
+ this.OKbutton = new System.Windows.Forms.Button();
+ this.Cancel = new System.Windows.Forms.Button();
this.groupBox1 = new System.Windows.Forms.GroupBox();
this.convertAudio = new System.Windows.Forms.CheckBox();
this.panel1 = new System.Windows.Forms.Panel();
@@ -48,6 +38,8 @@
this.tobmp = new System.Windows.Forms.RadioButton();
this.converttexture = new System.Windows.Forms.CheckBox();
this.groupBox2 = new System.Windows.Forms.GroupBox();
+ this.fbxFormat = new System.Windows.Forms.ComboBox();
+ this.label4 = new System.Windows.Forms.Label();
this.fbxVersion = new System.Windows.Forms.ComboBox();
this.label3 = new System.Windows.Forms.Label();
this.flatInbetween = new System.Windows.Forms.CheckBox();
@@ -59,9 +51,6 @@
this.allBones = new System.Windows.Forms.CheckBox();
this.allFrames = new System.Windows.Forms.CheckBox();
this.EulerFilter = new System.Windows.Forms.CheckBox();
- this.FbxBox.SuspendLayout();
- ((System.ComponentModel.ISupportInitialize)(this.scaleFactor)).BeginInit();
- this.geometryBox.SuspendLayout();
this.groupBox1.SuspendLayout();
this.panel1.SuspendLayout();
this.groupBox2.SuspendLayout();
@@ -69,154 +58,26 @@
((System.ComponentModel.ISupportInitialize)(this.filterPrecision)).BeginInit();
this.SuspendLayout();
//
- // FbxBox
+ // OKbutton
//
- this.FbxBox.AutoSize = true;
- this.FbxBox.Controls.Add(this.scaleFactor);
- this.FbxBox.Controls.Add(this.convertDummies);
- this.FbxBox.Controls.Add(this.scaleLabel);
- this.FbxBox.Controls.Add(this.exportDeformers);
- this.FbxBox.Controls.Add(this.geometryBox);
- this.FbxBox.Location = new System.Drawing.Point(12, 12);
- this.FbxBox.Name = "FbxBox";
- this.FbxBox.Size = new System.Drawing.Size(247, 235);
- this.FbxBox.TabIndex = 0;
- this.FbxBox.TabStop = false;
- this.FbxBox.Text = "Fbx Ascii";
+ this.OKbutton.Location = new System.Drawing.Point(321, 240);
+ this.OKbutton.Name = "OKbutton";
+ this.OKbutton.Size = new System.Drawing.Size(75, 21);
+ this.OKbutton.TabIndex = 6;
+ this.OKbutton.Text = "OK";
+ this.OKbutton.UseVisualStyleBackColor = true;
+ this.OKbutton.Click += new System.EventHandler(this.fbxOKbutton_Click);
//
- // scaleFactor
+ // Cancel
//
- this.scaleFactor.DecimalPlaces = 2;
- this.scaleFactor.Increment = new decimal(new int[] {
- 1,
- 0,
- 0,
- 131072});
- this.scaleFactor.Location = new System.Drawing.Point(95, 194);
- this.scaleFactor.Name = "scaleFactor";
- this.scaleFactor.Size = new System.Drawing.Size(46, 21);
- this.scaleFactor.TabIndex = 1;
- this.scaleFactor.Value = new decimal(new int[] {
- 254,
- 0,
- 0,
- 131072});
- //
- // convertDummies
- //
- this.convertDummies.AutoSize = true;
- this.convertDummies.Location = new System.Drawing.Point(6, 170);
- this.convertDummies.Name = "convertDummies";
- this.convertDummies.Size = new System.Drawing.Size(228, 16);
- this.convertDummies.TabIndex = 5;
- this.convertDummies.Text = "Convert Deforming Dummies to Bones";
- this.convertDummies.UseVisualStyleBackColor = true;
- this.convertDummies.CheckedChanged += new System.EventHandler(this.exportOpnions_CheckedChanged);
- //
- // scaleLabel
- //
- this.scaleLabel.AutoSize = true;
- this.scaleLabel.Location = new System.Drawing.Point(6, 196);
- this.scaleLabel.Name = "scaleLabel";
- this.scaleLabel.Size = new System.Drawing.Size(83, 12);
- this.scaleLabel.TabIndex = 0;
- this.scaleLabel.Text = "Scale Factor:";
- //
- // exportDeformers
- //
- this.exportDeformers.AutoSize = true;
- this.exportDeformers.Location = new System.Drawing.Point(6, 148);
- this.exportDeformers.Name = "exportDeformers";
- this.exportDeformers.Size = new System.Drawing.Size(108, 16);
- this.exportDeformers.TabIndex = 1;
- this.exportDeformers.Text = "Skin Deformers";
- this.exportDeformers.UseVisualStyleBackColor = true;
- this.exportDeformers.CheckedChanged += new System.EventHandler(this.exportDeformers_CheckedChanged);
- //
- // geometryBox
- //
- this.geometryBox.AutoSize = true;
- this.geometryBox.Controls.Add(this.exportColors);
- this.geometryBox.Controls.Add(this.exportUVs);
- this.geometryBox.Controls.Add(this.exportTangents);
- this.geometryBox.Controls.Add(this.exportNormals);
- this.geometryBox.Location = new System.Drawing.Point(6, 20);
- this.geometryBox.Name = "geometryBox";
- this.geometryBox.Size = new System.Drawing.Size(235, 122);
- this.geometryBox.TabIndex = 0;
- this.geometryBox.TabStop = false;
- this.geometryBox.Text = "Geometry";
- //
- // exportColors
- //
- this.exportColors.AutoSize = true;
- this.exportColors.Checked = true;
- this.exportColors.CheckState = System.Windows.Forms.CheckState.Checked;
- this.exportColors.Location = new System.Drawing.Point(6, 86);
- this.exportColors.Name = "exportColors";
- this.exportColors.Size = new System.Drawing.Size(102, 16);
- this.exportColors.TabIndex = 3;
- this.exportColors.Text = "Vertex Colors";
- this.exportColors.UseVisualStyleBackColor = true;
- this.exportColors.CheckedChanged += new System.EventHandler(this.exportOpnions_CheckedChanged);
- //
- // exportUVs
- //
- this.exportUVs.AutoSize = true;
- this.exportUVs.Checked = true;
- this.exportUVs.CheckState = System.Windows.Forms.CheckState.Checked;
- this.exportUVs.Location = new System.Drawing.Point(6, 64);
- this.exportUVs.Name = "exportUVs";
- this.exportUVs.Size = new System.Drawing.Size(108, 16);
- this.exportUVs.TabIndex = 2;
- this.exportUVs.Text = "UV Coordinates";
- this.exportUVs.UseVisualStyleBackColor = true;
- this.exportUVs.CheckedChanged += new System.EventHandler(this.exportOpnions_CheckedChanged);
- //
- // exportTangents
- //
- this.exportTangents.AutoSize = true;
- this.exportTangents.Location = new System.Drawing.Point(6, 42);
- this.exportTangents.Name = "exportTangents";
- this.exportTangents.Size = new System.Drawing.Size(72, 16);
- this.exportTangents.TabIndex = 1;
- this.exportTangents.Text = "Tangents";
- this.exportTangents.UseVisualStyleBackColor = true;
- this.exportTangents.CheckedChanged += new System.EventHandler(this.exportOpnions_CheckedChanged);
- //
- // exportNormals
- //
- this.exportNormals.AutoSize = true;
- this.exportNormals.Checked = true;
- this.exportNormals.CheckState = System.Windows.Forms.CheckState.Checked;
- this.exportNormals.Location = new System.Drawing.Point(6, 20);
- this.exportNormals.Name = "exportNormals";
- this.exportNormals.Size = new System.Drawing.Size(66, 16);
- this.exportNormals.TabIndex = 0;
- this.exportNormals.Text = "Normals";
- this.exportNormals.UseVisualStyleBackColor = true;
- this.exportNormals.CheckedChanged += new System.EventHandler(this.exportOpnions_CheckedChanged);
- //
- // fbxOKbutton
- //
- this.fbxOKbutton.Location = new System.Drawing.Point(323, 346);
- this.fbxOKbutton.Name = "fbxOKbutton";
- this.fbxOKbutton.Size = new System.Drawing.Size(75, 21);
- this.fbxOKbutton.TabIndex = 6;
- this.fbxOKbutton.Text = "OK";
- this.fbxOKbutton.UseVisualStyleBackColor = true;
- this.fbxOKbutton.Click += new System.EventHandler(this.fbxOKbutton_Click);
- //
- // fbxCancel
- //
- this.fbxCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel;
- this.fbxCancel.Location = new System.Drawing.Point(404, 346);
- this.fbxCancel.Name = "fbxCancel";
- this.fbxCancel.Size = new System.Drawing.Size(75, 21);
- this.fbxCancel.TabIndex = 7;
- this.fbxCancel.Text = "Cancel";
- this.fbxCancel.UseVisualStyleBackColor = true;
- this.fbxCancel.Click += new System.EventHandler(this.fbxCancel_Click);
+ this.Cancel.DialogResult = System.Windows.Forms.DialogResult.Cancel;
+ this.Cancel.Location = new System.Drawing.Point(402, 240);
+ this.Cancel.Name = "Cancel";
+ this.Cancel.Size = new System.Drawing.Size(75, 21);
+ this.Cancel.TabIndex = 7;
+ this.Cancel.Text = "Cancel";
+ this.Cancel.UseVisualStyleBackColor = true;
+ this.Cancel.Click += new System.EventHandler(this.Cancel_Click);
//
// groupBox1
//
@@ -224,9 +85,9 @@
this.groupBox1.Controls.Add(this.convertAudio);
this.groupBox1.Controls.Add(this.panel1);
this.groupBox1.Controls.Add(this.converttexture);
- this.groupBox1.Location = new System.Drawing.Point(12, 253);
+ this.groupBox1.Location = new System.Drawing.Point(232, 12);
this.groupBox1.Name = "groupBox1";
- this.groupBox1.Size = new System.Drawing.Size(247, 114);
+ this.groupBox1.Size = new System.Drawing.Size(245, 114);
this.groupBox1.TabIndex = 9;
this.groupBox1.TabStop = false;
this.groupBox1.Text = "Convert";
@@ -300,6 +161,8 @@
// groupBox2
//
this.groupBox2.AutoSize = true;
+ this.groupBox2.Controls.Add(this.fbxFormat);
+ this.groupBox2.Controls.Add(this.label4);
this.groupBox2.Controls.Add(this.fbxVersion);
this.groupBox2.Controls.Add(this.label3);
this.groupBox2.Controls.Add(this.flatInbetween);
@@ -311,12 +174,33 @@
this.groupBox2.Controls.Add(this.allBones);
this.groupBox2.Controls.Add(this.allFrames);
this.groupBox2.Controls.Add(this.EulerFilter);
- this.groupBox2.Location = new System.Drawing.Point(265, 12);
+ this.groupBox2.Location = new System.Drawing.Point(12, 12);
this.groupBox2.Name = "groupBox2";
- this.groupBox2.Size = new System.Drawing.Size(214, 235);
+ this.groupBox2.Size = new System.Drawing.Size(214, 249);
this.groupBox2.TabIndex = 11;
this.groupBox2.TabStop = false;
- this.groupBox2.Text = "Fbx Binary";
+ this.groupBox2.Text = "Fbx";
+ //
+ // fbxFormat
+ //
+ this.fbxFormat.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
+ this.fbxFormat.FormattingEnabled = true;
+ this.fbxFormat.Items.AddRange(new object[] {
+ "Binary",
+ "Ascii"});
+ this.fbxFormat.Location = new System.Drawing.Point(75, 180);
+ this.fbxFormat.Name = "fbxFormat";
+ this.fbxFormat.Size = new System.Drawing.Size(61, 20);
+ this.fbxFormat.TabIndex = 18;
+ //
+ // label4
+ //
+ this.label4.AutoSize = true;
+ this.label4.Location = new System.Drawing.Point(4, 183);
+ this.label4.Name = "label4";
+ this.label4.Size = new System.Drawing.Size(59, 12);
+ this.label4.TabIndex = 17;
+ this.label4.Text = "FBXFormat";
//
// fbxVersion
//
@@ -329,7 +213,7 @@
"7.3",
"7.4",
"7.5"});
- this.fbxVersion.Location = new System.Drawing.Point(77, 178);
+ this.fbxVersion.Location = new System.Drawing.Point(75, 209);
this.fbxVersion.Name = "fbxVersion";
this.fbxVersion.Size = new System.Drawing.Size(47, 20);
this.fbxVersion.TabIndex = 16;
@@ -337,7 +221,7 @@
// label3
//
this.label3.AutoSize = true;
- this.label3.Location = new System.Drawing.Point(6, 181);
+ this.label3.Location = new System.Drawing.Point(4, 212);
this.label3.Name = "label3";
this.label3.Size = new System.Drawing.Size(65, 12);
this.label3.TabIndex = 15;
@@ -449,16 +333,15 @@
//
// ExportOptions
//
- this.AcceptButton = this.fbxOKbutton;
+ this.AcceptButton = this.OKbutton;
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
- this.CancelButton = this.fbxCancel;
- this.ClientSize = new System.Drawing.Size(493, 382);
+ this.CancelButton = this.Cancel;
+ this.ClientSize = new System.Drawing.Size(490, 275);
this.Controls.Add(this.groupBox2);
this.Controls.Add(this.groupBox1);
- this.Controls.Add(this.fbxCancel);
- this.Controls.Add(this.fbxOKbutton);
- this.Controls.Add(this.FbxBox);
+ this.Controls.Add(this.Cancel);
+ this.Controls.Add(this.OKbutton);
this.MaximizeBox = false;
this.MinimizeBox = false;
this.Name = "ExportOptions";
@@ -467,11 +350,6 @@
this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
this.Text = "Export options";
this.TopMost = true;
- this.FbxBox.ResumeLayout(false);
- this.FbxBox.PerformLayout();
- ((System.ComponentModel.ISupportInitialize)(this.scaleFactor)).EndInit();
- this.geometryBox.ResumeLayout(false);
- this.geometryBox.PerformLayout();
this.groupBox1.ResumeLayout(false);
this.groupBox1.PerformLayout();
this.panel1.ResumeLayout(false);
@@ -486,19 +364,8 @@
}
#endregion
-
- private System.Windows.Forms.GroupBox FbxBox;
- private System.Windows.Forms.NumericUpDown scaleFactor;
- private System.Windows.Forms.Label scaleLabel;
- private System.Windows.Forms.CheckBox exportDeformers;
- private System.Windows.Forms.GroupBox geometryBox;
- private System.Windows.Forms.CheckBox exportColors;
- private System.Windows.Forms.CheckBox exportUVs;
- private System.Windows.Forms.CheckBox exportTangents;
- private System.Windows.Forms.CheckBox exportNormals;
- private System.Windows.Forms.Button fbxOKbutton;
- private System.Windows.Forms.Button fbxCancel;
- private System.Windows.Forms.CheckBox convertDummies;
+ private System.Windows.Forms.Button OKbutton;
+ private System.Windows.Forms.Button Cancel;
private System.Windows.Forms.GroupBox groupBox1;
private System.Windows.Forms.CheckBox converttexture;
private System.Windows.Forms.RadioButton tojpg;
@@ -518,5 +385,7 @@
private System.Windows.Forms.CheckBox EulerFilter;
private System.Windows.Forms.Label label3;
private System.Windows.Forms.ComboBox fbxVersion;
+ private System.Windows.Forms.ComboBox fbxFormat;
+ private System.Windows.Forms.Label label4;
}
}
\ No newline at end of file
diff --git a/AssetStudio/ExportOptions.cs b/AssetStudio/ExportOptions.cs
index 1217c41..a3af436 100644
--- a/AssetStudio/ExportOptions.cs
+++ b/AssetStudio/ExportOptions.cs
@@ -15,14 +15,6 @@ namespace AssetStudio
public ExportOptions()
{
InitializeComponent();
- exportNormals.Checked = (bool)Properties.Settings.Default["exportNormals"];
- exportTangents.Checked = (bool)Properties.Settings.Default["exportTangents"];
- exportUVs.Checked = (bool)Properties.Settings.Default["exportUVs"];
- exportColors.Checked = (bool)Properties.Settings.Default["exportColors"];
- exportDeformers.Checked = (bool)Properties.Settings.Default["exportDeformers"];
- convertDummies.Checked = (bool)Properties.Settings.Default["convertDummies"];
- convertDummies.Enabled = (bool)Properties.Settings.Default["exportDeformers"];
- scaleFactor.Value = (decimal)Properties.Settings.Default["scaleFactor"];
converttexture.Checked = (bool)Properties.Settings.Default["convertTexture"];
convertAudio.Checked = (bool)Properties.Settings.Default["convertAudio"];
var str = (string)Properties.Settings.Default["convertType"];
@@ -42,6 +34,7 @@ namespace AssetStudio
boneSize.Value = (decimal)Properties.Settings.Default["boneSize"];
flatInbetween.Checked = (bool)Properties.Settings.Default["flatInbetween"];
fbxVersion.SelectedIndex = (int)Properties.Settings.Default["fbxVersion"];
+ fbxFormat.SelectedIndex = (int)Properties.Settings.Default["fbxFormat"];
}
private void exportOpnions_CheckedChanged(object sender, EventArgs e)
@@ -52,12 +45,6 @@ namespace AssetStudio
private void fbxOKbutton_Click(object sender, EventArgs e)
{
- Properties.Settings.Default["exportNormals"] = exportNormals.Checked;
- Properties.Settings.Default["exportTangents"] = exportTangents.Checked;
- Properties.Settings.Default["exportUVs"] = exportUVs.Checked;
- Properties.Settings.Default["exportColors"] = exportColors.Checked;
- Properties.Settings.Default["exportDeformers"] = exportDeformers.Checked;
- Properties.Settings.Default["scaleFactor"] = scaleFactor.Value;
Properties.Settings.Default["convertTexture"] = converttexture.Checked;
Properties.Settings.Default["convertAudio"] = convertAudio.Checked;
foreach (Control c in panel1.Controls)
@@ -76,21 +63,16 @@ namespace AssetStudio
Properties.Settings.Default["boneSize"] = boneSize.Value;
Properties.Settings.Default["flatInbetween"] = flatInbetween.Checked;
Properties.Settings.Default["fbxVersion"] = fbxVersion.SelectedIndex;
+ Properties.Settings.Default["fbxFormat"] = fbxFormat.SelectedIndex;
Properties.Settings.Default.Save();
DialogResult = DialogResult.OK;
Close();
}
- private void fbxCancel_Click(object sender, EventArgs e)
+ private void Cancel_Click(object sender, EventArgs e)
{
DialogResult = DialogResult.Cancel;
Close();
}
-
- private void exportDeformers_CheckedChanged(object sender, EventArgs e)
- {
- exportOpnions_CheckedChanged(sender, e);
- convertDummies.Enabled = exportDeformers.Checked;
- }
}
}
diff --git a/AssetStudio/Properties/Settings.Designer.cs b/AssetStudio/Properties/Settings.Designer.cs
index aa37c5e..ba9219b 100644
--- a/AssetStudio/Properties/Settings.Designer.cs
+++ b/AssetStudio/Properties/Settings.Designer.cs
@@ -83,90 +83,6 @@ namespace AssetStudio.Properties {
}
}
- [global::System.Configuration.UserScopedSettingAttribute()]
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
- [global::System.Configuration.DefaultSettingValueAttribute("True")]
- public bool exportNormals {
- get {
- return ((bool)(this["exportNormals"]));
- }
- set {
- this["exportNormals"] = value;
- }
- }
-
- [global::System.Configuration.UserScopedSettingAttribute()]
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
- [global::System.Configuration.DefaultSettingValueAttribute("False")]
- public bool exportTangents {
- get {
- return ((bool)(this["exportTangents"]));
- }
- set {
- this["exportTangents"] = value;
- }
- }
-
- [global::System.Configuration.UserScopedSettingAttribute()]
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
- [global::System.Configuration.DefaultSettingValueAttribute("True")]
- public bool exportUVs {
- get {
- return ((bool)(this["exportUVs"]));
- }
- set {
- this["exportUVs"] = value;
- }
- }
-
- [global::System.Configuration.UserScopedSettingAttribute()]
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
- [global::System.Configuration.DefaultSettingValueAttribute("True")]
- public bool exportColors {
- get {
- return ((bool)(this["exportColors"]));
- }
- set {
- this["exportColors"] = value;
- }
- }
-
- [global::System.Configuration.UserScopedSettingAttribute()]
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
- [global::System.Configuration.DefaultSettingValueAttribute("2.54")]
- public decimal scaleFactor {
- get {
- return ((decimal)(this["scaleFactor"]));
- }
- set {
- this["scaleFactor"] = value;
- }
- }
-
- [global::System.Configuration.UserScopedSettingAttribute()]
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
- [global::System.Configuration.DefaultSettingValueAttribute("True")]
- public bool exportDeformers {
- get {
- return ((bool)(this["exportDeformers"]));
- }
- set {
- this["exportDeformers"] = value;
- }
- }
-
- [global::System.Configuration.UserScopedSettingAttribute()]
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
- [global::System.Configuration.DefaultSettingValueAttribute("True")]
- public bool convertDummies {
- get {
- return ((bool)(this["convertDummies"]));
- }
- set {
- this["convertDummies"] = value;
- }
- }
-
[global::System.Configuration.UserScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Configuration.DefaultSettingValueAttribute("True")]
@@ -310,5 +226,17 @@ namespace AssetStudio.Properties {
this["fbxVersion"] = value;
}
}
+
+ [global::System.Configuration.UserScopedSettingAttribute()]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.Configuration.DefaultSettingValueAttribute("0")]
+ public int fbxFormat {
+ get {
+ return ((int)(this["fbxFormat"]));
+ }
+ set {
+ this["fbxFormat"] = value;
+ }
+ }
}
}
diff --git a/AssetStudio/Properties/Settings.settings b/AssetStudio/Properties/Settings.settings
index 36734f3..72c57e6 100644
--- a/AssetStudio/Properties/Settings.settings
+++ b/AssetStudio/Properties/Settings.settings
@@ -17,27 +17,6 @@
0
-
- True
-
-
- False
-
-
- True
-
-
- True
-
-
- 2.54
-
-
- True
-
-
- True
-
True
@@ -74,5 +53,8 @@
3
+
+ 0
+
\ No newline at end of file
diff --git a/AssetStudio/StudioClasses/Exporter.cs b/AssetStudio/StudioClasses/Exporter.cs
index 9d09976..e8ee41f 100644
--- a/AssetStudio/StudioClasses/Exporter.cs
+++ b/AssetStudio/StudioClasses/Exporter.cs
@@ -316,7 +316,8 @@ namespace AssetStudio
var boneSize = (int)(decimal)Properties.Settings.Default["boneSize"];
var flatInbetween = (bool)Properties.Settings.Default["flatInbetween"];
var fbxVersion = (int)Properties.Settings.Default["fbxVersion"];
- Fbx.Exporter.Export(exportPath, convert, EulerFilter, filterPrecision, allFrames, allBones, skins, boneSize, flatInbetween, fbxVersion);
+ var fbxFormat = (int)Properties.Settings.Default["fbxFormat"];
+ Fbx.Exporter.Export(exportPath, convert, EulerFilter, filterPrecision, allFrames, allBones, skins, boneSize, flatInbetween, fbxVersion, fbxFormat == 1);
return true;
}
}
diff --git a/AssetStudio/StudioClasses/FBXExporter.cs b/AssetStudio/StudioClasses/FBXExporter.cs
deleted file mode 100644
index 9b6cbb5..0000000
--- a/AssetStudio/StudioClasses/FBXExporter.cs
+++ /dev/null
@@ -1,1096 +0,0 @@
-using System;
-using System.Collections.Generic;
-using System.IO;
-using System.Linq;
-using System.Text;
-using System.Web.Script.Serialization;
-using static AssetStudio.Studio;
-using static AssetStudio.Exporter;
-
-namespace AssetStudio
-{
- static class FBXExporter
- {
- public static void WriteFBX(string FBXfile, List gameObjects)
- {
- var timestamp = DateTime.Now;
- Dictionary> jsonMats = null;
- if (File.Exists(mainPath + "\\materials.json"))
- {
- using (var reader = File.OpenText(mainPath + "\\materials.json"))
- {
- var matLine = reader.ReadToEnd();
- jsonMats = new JavaScriptSerializer().Deserialize>>(matLine);
- }
- }
-
- using (StreamWriter FBXwriter = new StreamWriter(FBXfile))
- {
- StringBuilder fbx = new StringBuilder();
- StringBuilder ob = new StringBuilder(); //Objects builder
- StringBuilder cb = new StringBuilder(); //Connections builder
- StringBuilder mb = new StringBuilder(); //Materials builder to get texture count in advance
- StringBuilder cb2 = new StringBuilder(); //and keep connections ordered
- cb.Append("\n}\n");//Objects end
- cb.Append("\nConnections: {");
-
- HashSet GameObjects = new HashSet();
- HashSet LimbNodes = new HashSet();
- HashSet Skins = new HashSet();
- HashSet Meshes = new HashSet();//MeshFilters are not unique!!
- HashSet Materials = new HashSet();
- HashSet Textures = new HashSet();
-
- int DeformerCount = 0;
- /*
- uniqueIDs can begin with zero, so they are preceded by a number specific to their type
- this will also make it easier to debug FBX files
- 1: Model
- 2: NodeAttribute
- 3: Geometry
- 4: Deformer
- 5: CollectionExclusive
- 6: Material
- 7: Texture
- 8: Video
- 9:
- */
-
- #region loop nodes and collect objects for export
- foreach (var m_GameObject in gameObjects)
- {
- GameObjects.Add(m_GameObject);
-
- if (m_GameObject.m_MeshFilter != null && m_GameObject.m_MeshFilter.TryGetPD(out var MeshFilterPD))
- {
- //MeshFilters are not unique!
- //MeshFilters.Add(MeshFilterPD);
- MeshFilter m_MeshFilter = new MeshFilter(MeshFilterPD);
- if (m_MeshFilter.m_Mesh.TryGetPD(out var MeshPD))
- {
- Meshes.Add(MeshPD);
-
- //write connections here and Mesh objects separately without having to backtrack through their MEshFilter to het the GameObject ID
- //also note that MeshFilters are not unique, they cannot be used for instancing geometry
- cb2.AppendFormat("\n\n\t;Geometry::, Model::{0}", m_GameObject.m_Name);
- cb2.AppendFormat("\n\tC: \"OO\",3{0},1{1}", MeshPD.uniqueID, m_GameObject.preloadData.uniqueID);
- }
- }
-
- #region get Renderer
- if (m_GameObject.m_MeshRenderer != null && m_GameObject.m_MeshRenderer.TryGetPD(out var RendererPD))
- {
- MeshRenderer m_Renderer = new MeshRenderer(RendererPD);
-
- foreach (var MaterialPPtr in m_Renderer.m_Materials)
- {
- if (MaterialPPtr.TryGetPD(out var MaterialPD))
- {
- Materials.Add(MaterialPD);
- cb2.AppendFormat("\n\n\t;Material::, Model::{0}", m_GameObject.m_Name);
- cb2.AppendFormat("\n\tC: \"OO\",6{0},1{1}", MaterialPD.uniqueID, m_GameObject.preloadData.uniqueID);
- }
- }
- }
-
- #endregion
-
- #region get SkinnedMeshRenderer
- if (m_GameObject.m_SkinnedMeshRenderer != null && m_GameObject.m_SkinnedMeshRenderer.TryGetPD(out var SkinnedMeshPD))
- {
- Skins.Add(SkinnedMeshPD);
-
- SkinnedMeshRenderer m_SkinnedMeshRenderer = new SkinnedMeshRenderer(SkinnedMeshPD);
-
- foreach (var MaterialPPtr in m_SkinnedMeshRenderer.m_Materials)
- {
- if (MaterialPPtr.TryGetPD(out var MaterialPD))
- {
- Materials.Add(MaterialPD);
- cb2.AppendFormat("\n\n\t;Material::, Model::{0}", m_GameObject.m_Name);
- cb2.AppendFormat("\n\tC: \"OO\",6{0},1{1}", MaterialPD.uniqueID, m_GameObject.preloadData.uniqueID);
- }
- }
-
- if ((bool)Properties.Settings.Default["exportDeformers"])
- {
- DeformerCount += m_SkinnedMeshRenderer.m_Bones.Length;
-
- //collect skeleton dummies to make sure they are exported
- foreach (var bonePPtr in m_SkinnedMeshRenderer.m_Bones)
- {
- if (bonePPtr.TryGetTransform(out var b_Transform))
- {
- if (b_Transform.m_GameObject.TryGetGameObject(out var m_Bone))
- {
- LimbNodes.Add(m_Bone);
- //also collect the root bone
- var parent = (GameObjectTreeNode)treeNodeDictionary[m_Bone].Parent;
- if (parent.Level > 0)
- {
- LimbNodes.Add(parent.gameObject);
- }
- //should I collect siblings?
- }
-
- #region collect children because m_SkinnedMeshRenderer.m_Bones doesn't contain terminations
- foreach (var ChildPPtr in b_Transform.m_Children)
- {
- if (ChildPPtr.TryGetTransform(out var ChildTR))
- {
- if (ChildTR.m_GameObject.TryGetGameObject(out var m_Child))
- {
- //check that the Model doesn't contain a Mesh, although this won't ensure it's part of the skeleton
- if (m_Child.m_MeshFilter == null && m_Child.m_SkinnedMeshRenderer == null)
- {
- LimbNodes.Add(m_Child);
- }
- }
- }
- }
- #endregion
- }
- }
- }
- }
- #endregion
- }
-
- //if ((bool)Properties.Settings.Default["convertDummies"]) { GameObjects.Except(LimbNodes); }
- //else { GameObjects.UnionWith(LimbNodes); LimbNodes.Clear(); }
- //add either way and use LimbNodes to test if a node is Null or LimbNode
- GameObjects.UnionWith(LimbNodes);
- #endregion
-
- #region write Materials, collect Texture objects
- foreach (var MaterialPD in Materials)
- {
- Material m_Material = new Material(MaterialPD);
-
- mb.AppendFormat("\n\tMaterial: 6{0}, \"Material::{1}\", \"\" {{", MaterialPD.uniqueID, m_Material.m_Name);
- mb.Append("\n\t\tVersion: 102");
- mb.Append("\n\t\tShadingModel: \"phong\"");
- mb.Append("\n\t\tMultiLayer: 0");
- mb.Append("\n\t\tProperties70: {");
- mb.Append("\n\t\t\tP: \"ShadingModel\", \"KString\", \"\", \"\", \"phong\"");
-
- #region write material colors
- foreach (var m_Color in m_Material.m_Colors)
- {
- switch (m_Color.first)
- {
- case "_Color":
- case "gSurfaceColor":
- mb.AppendFormat("\n\t\t\tP: \"DiffuseColor\", \"Color\", \"\", \"A\",{0},{1},{2}", m_Color.second[0], m_Color.second[1], m_Color.second[2]);
- break;
- case "_SpecularColor"://then what is _SpecColor??
- mb.AppendFormat("\n\t\t\tP: \"SpecularColor\", \"Color\", \"\", \"A\",{0},{1},{2}", m_Color.second[0], m_Color.second[1], m_Color.second[2]);
- break;
- case "_ReflectColor":
- mb.AppendFormat("\n\t\t\tP: \"AmbientColor\", \"Color\", \"\", \"A\",{0},{1},{2}", m_Color.second[0], m_Color.second[1], m_Color.second[2]);
- break;
- default:
- mb.AppendFormat("\n;\t\t\tP: \"{3}\", \"Color\", \"\", \"A\",{0},{1},{2}", m_Color.second[0], m_Color.second[1], m_Color.second[2], m_Color.first);//commented out
- break;
- }
- }
- #endregion
-
- #region write material parameters
- foreach (var m_Float in m_Material.m_Floats)
- {
- switch (m_Float.first)
- {
- case "_Shininess":
- mb.AppendFormat("\n\t\t\tP: \"ShininessExponent\", \"Number\", \"\", \"A\",{0}", m_Float.second);
- mb.AppendFormat("\n\t\t\tP: \"Shininess\", \"Number\", \"\", \"A\",{0}", m_Float.second);
- break;
- case "_Transparency":
- mb.Append("\n\t\t\tP: \"TransparentColor\", \"Color\", \"\", \"A\",1,1,1");
- mb.AppendFormat("\n\t\t\tP: \"TransparencyFactor\", \"Number\", \"\", \"A\",{0}", m_Float.second);
- mb.AppendFormat("\n\t\t\tP: \"Opacity\", \"Number\", \"\", \"A\",{0}", (1 - m_Float.second));
- break;
- default:
- mb.AppendFormat("\n;\t\t\tP: \"{0}\", \"Number\", \"\", \"A\",{1}", m_Float.first, m_Float.second);
- break;
- }
- }
- #endregion
-
- //mb.Append("\n\t\t\tP: \"SpecularFactor\", \"Number\", \"\", \"A\",0");
- mb.Append("\n\t\t}");
- mb.Append("\n\t}");
-
- #region write texture connections
- foreach (var m_TexEnv in m_Material.m_TexEnvs)
- {
- #region get Porsche material from json
- if (!m_TexEnv.m_Texture.TryGetPD(out var TexturePD) && jsonMats != null)
- {
- if (jsonMats.TryGetValue(m_Material.m_Name, out var matProp))
- {
- if (matProp.TryGetValue(m_TexEnv.name, out var texName))
- {
- foreach (var asset in exportableAssets)
- {
- if (asset.Type == ClassIDType.Texture2D && asset.Text == texName)
- {
- TexturePD = asset;
- break;
- }
- }
- }
- }
- }
- #endregion
-
- if (TexturePD != null && TexturePD.Type == ClassIDType.Texture2D)
- {
- Textures.Add(TexturePD);
-
- cb2.AppendFormat("\n\n\t;Texture::, Material::{0}", m_Material.m_Name);
- cb2.AppendFormat("\n\tC: \"OP\",7{0},6{1}, \"", TexturePD.uniqueID, MaterialPD.uniqueID);
-
- switch (m_TexEnv.name)
- {
- case "_MainTex":
- case "gDiffuseSampler":
- cb2.Append("DiffuseColor\"");
- break;
- case "_SpecularMap":
- case "gSpecularSampler":
- cb2.Append("SpecularColor\"");
- break;
- case "_NormalMap":
- case "gNormalSampler":
- cb2.Append("NormalMap\"");
- break;
- case "_BumpMap":
- cb2.Append("Bump\"");
- break;
- default:
- cb2.AppendFormat("{0}\"", m_TexEnv.name);
- break;
- }
- }
- }
- #endregion
- }
- #endregion
-
- #region write generic FBX data after everything was collected
- fbx.Append("; FBX 7.1.0 project file");
- fbx.Append("\nFBXHeaderExtension: {\n\tFBXHeaderVersion: 1003\n\tFBXVersion: 7100\n\tCreationTimeStamp: {\n\t\tVersion: 1000");
- fbx.Append("\n\t\tYear: " + timestamp.Year);
- fbx.Append("\n\t\tMonth: " + timestamp.Month);
- fbx.Append("\n\t\tDay: " + timestamp.Day);
- fbx.Append("\n\t\tHour: " + timestamp.Hour);
- fbx.Append("\n\t\tMinute: " + timestamp.Minute);
- fbx.Append("\n\t\tSecond: " + timestamp.Second);
- fbx.Append("\n\t\tMillisecond: " + timestamp.Millisecond);
- fbx.Append("\n\t}\n\tCreator: \"AssetStudio by Chipicao\"\n}\n");
-
- fbx.Append("\nGlobalSettings: {");
- fbx.Append("\n\tVersion: 1000");
- fbx.Append("\n\tProperties70: {");
- fbx.Append("\n\t\tP: \"UpAxis\", \"int\", \"Integer\", \"\",1");
- fbx.Append("\n\t\tP: \"UpAxisSign\", \"int\", \"Integer\", \"\",1");
- fbx.Append("\n\t\tP: \"FrontAxis\", \"int\", \"Integer\", \"\",2");
- fbx.Append("\n\t\tP: \"FrontAxisSign\", \"int\", \"Integer\", \"\",1");
- fbx.Append("\n\t\tP: \"CoordAxis\", \"int\", \"Integer\", \"\",0");
- fbx.Append("\n\t\tP: \"CoordAxisSign\", \"int\", \"Integer\", \"\",1");
- fbx.Append("\n\t\tP: \"OriginalUpAxis\", \"int\", \"Integer\", \"\",1");
- fbx.Append("\n\t\tP: \"OriginalUpAxisSign\", \"int\", \"Integer\", \"\",1");
- fbx.AppendFormat("\n\t\tP: \"UnitScaleFactor\", \"double\", \"Number\", \"\",{0}", Properties.Settings.Default["scaleFactor"]);
- fbx.Append("\n\t\tP: \"OriginalUnitScaleFactor\", \"double\", \"Number\", \"\",1.0");
- //fbx.Append("\n\t\tP: \"AmbientColor\", \"ColorRGB\", \"Color\", \"\",0,0,0");
- //fbx.Append("\n\t\tP: \"DefaultCamera\", \"KString\", \"\", \"\", \"Producer Perspective\"");
- //fbx.Append("\n\t\tP: \"TimeMode\", \"enum\", \"\", \"\",6");
- //fbx.Append("\n\t\tP: \"TimeProtocol\", \"enum\", \"\", \"\",2");
- //fbx.Append("\n\t\tP: \"SnapOnFrameMode\", \"enum\", \"\", \"\",0");
- //fbx.Append("\n\t\tP: \"TimeSpanStart\", \"KTime\", \"Time\", \"\",0");
- //fbx.Append("\n\t\tP: \"TimeSpanStop\", \"KTime\", \"Time\", \"\",153953860000");
- //fbx.Append("\n\t\tP: \"CustomFrameRate\", \"double\", \"Number\", \"\",-1");
- //fbx.Append("\n\t\tP: \"TimeMarker\", \"Compound\", \"\", \"\"");
- //fbx.Append("\n\t\tP: \"CurrentTimeMarker\", \"int\", \"Integer\", \"\",-1");
- fbx.Append("\n\t}\n}\n");
-
- fbx.Append("\nDocuments: {");
- fbx.Append("\n\tCount: 1");
- fbx.Append("\n\tDocument: 1234567890, \"\", \"Scene\" {");
- fbx.Append("\n\t\tProperties70: {");
- fbx.Append("\n\t\t\tP: \"SourceObject\", \"object\", \"\", \"\"");
- fbx.Append("\n\t\t\tP: \"ActiveAnimStackName\", \"KString\", \"\", \"\", \"\"");
- fbx.Append("\n\t\t}");
- fbx.Append("\n\t\tRootNode: 0");
- fbx.Append("\n\t}\n}\n");
- fbx.Append("\nReferences: {\n}\n");
-
- fbx.Append("\nDefinitions: {");
- fbx.Append("\n\tVersion: 100");
- fbx.AppendFormat("\n\tCount: {0}", 1 + 2 * GameObjects.Count + Materials.Count + 2 * Textures.Count + ((bool)Properties.Settings.Default["exportDeformers"] ? Skins.Count + DeformerCount + Skins.Count + 1 : 0));
-
- fbx.Append("\n\tObjectType: \"GlobalSettings\" {");
- fbx.Append("\n\t\tCount: 1");
- fbx.Append("\n\t}");
-
- fbx.Append("\n\tObjectType: \"Model\" {");
- fbx.AppendFormat("\n\t\tCount: {0}", GameObjects.Count);
- fbx.Append("\n\t}");
-
- fbx.Append("\n\tObjectType: \"NodeAttribute\" {");
- fbx.AppendFormat("\n\t\tCount: {0}", GameObjects.Count - Meshes.Count - Skins.Count);
- fbx.Append("\n\t\tPropertyTemplate: \"FbxNull\" {");
- fbx.Append("\n\t\t\tProperties70: {");
- fbx.Append("\n\t\t\t\tP: \"Color\", \"ColorRGB\", \"Color\", \"\",0.8,0.8,0.8");
- fbx.Append("\n\t\t\t\tP: \"Size\", \"double\", \"Number\", \"\",100");
- fbx.Append("\n\t\t\t\tP: \"Look\", \"enum\", \"\", \"\",1");
- fbx.Append("\n\t\t\t}\n\t\t}\n\t}");
-
- fbx.Append("\n\tObjectType: \"Geometry\" {");
- fbx.AppendFormat("\n\t\tCount: {0}", Meshes.Count + Skins.Count);
- fbx.Append("\n\t}");
-
- fbx.Append("\n\tObjectType: \"Material\" {");
- fbx.AppendFormat("\n\t\tCount: {0}", Materials.Count);
- fbx.Append("\n\t}");
-
- fbx.Append("\n\tObjectType: \"Texture\" {");
- fbx.AppendFormat("\n\t\tCount: {0}", Textures.Count);
- fbx.Append("\n\t}");
-
- fbx.Append("\n\tObjectType: \"Video\" {");
- fbx.AppendFormat("\n\t\tCount: {0}", Textures.Count);
- fbx.Append("\n\t}");
-
- if ((bool)Properties.Settings.Default["exportDeformers"])
- {
- fbx.Append("\n\tObjectType: \"CollectionExclusive\" {");
- fbx.AppendFormat("\n\t\tCount: {0}", Skins.Count);
- fbx.Append("\n\t\tPropertyTemplate: \"FbxDisplayLayer\" {");
- fbx.Append("\n\t\t\tProperties70: {");
- fbx.Append("\n\t\t\t\tP: \"Color\", \"ColorRGB\", \"Color\", \"\",0.8,0.8,0.8");
- fbx.Append("\n\t\t\t\tP: \"Show\", \"bool\", \"\", \"\",1");
- fbx.Append("\n\t\t\t\tP: \"Freeze\", \"bool\", \"\", \"\",0");
- fbx.Append("\n\t\t\t\tP: \"LODBox\", \"bool\", \"\", \"\",0");
- fbx.Append("\n\t\t\t}");
- fbx.Append("\n\t\t}");
- fbx.Append("\n\t}");
-
- fbx.Append("\n\tObjectType: \"Deformer\" {");
- fbx.AppendFormat("\n\t\tCount: {0}", DeformerCount + Skins.Count);
- fbx.Append("\n\t}");
-
- fbx.Append("\n\tObjectType: \"Pose\" {");
- fbx.Append("\n\t\tCount: 1");
- fbx.Append("\n\t}");
- }
-
- fbx.Append("\n}\n");
- fbx.Append("\nObjects: {");
-
- FBXwriter.Write(fbx);
- fbx.Clear();
- #endregion
-
- #region write Model nodes and connections
- foreach (var m_GameObject in GameObjects)
- {
- if (m_GameObject.m_MeshFilter == null && m_GameObject.m_SkinnedMeshRenderer == null)
- {
- if ((bool)Properties.Settings.Default["exportDeformers"] && (bool)Properties.Settings.Default["convertDummies"] && LimbNodes.Contains(m_GameObject))
- {
- ob.AppendFormat("\n\tNodeAttribute: 2{0}, \"NodeAttribute::\", \"LimbNode\" {{", m_GameObject.preloadData.uniqueID);
- ob.Append("\n\t\tTypeFlags: \"Skeleton\"");
- ob.Append("\n\t}");
-
- ob.AppendFormat("\n\tModel: 1{0}, \"Model::{1}\", \"LimbNode\" {{", m_GameObject.preloadData.uniqueID, m_GameObject.m_Name);
- }
- else
- {
- ob.AppendFormat("\n\tNodeAttribute: 2{0}, \"NodeAttribute::\", \"Null\" {{", m_GameObject.preloadData.uniqueID);
- ob.Append("\n\t\tTypeFlags: \"Null\"");
- ob.Append("\n\t}");
-
- ob.AppendFormat("\n\tModel: 1{0}, \"Model::{1}\", \"Null\" {{", m_GameObject.preloadData.uniqueID, m_GameObject.m_Name);
- }
-
- //connect NodeAttribute to Model
- cb.AppendFormat("\n\n\t;NodeAttribute::, Model::{0}", m_GameObject.m_Name);
- cb.AppendFormat("\n\tC: \"OO\",2{0},1{0}", m_GameObject.preloadData.uniqueID);
- }
- else
- {
- ob.AppendFormat("\n\tModel: 1{0}, \"Model::{1}\", \"Mesh\" {{", m_GameObject.preloadData.uniqueID, m_GameObject.m_Name);
- }
-
- ob.Append("\n\t\tVersion: 232");
- ob.Append("\n\t\tProperties70: {");
- ob.Append("\n\t\t\tP: \"InheritType\", \"enum\", \"\", \"\",1");
- ob.Append("\n\t\t\tP: \"ScalingMax\", \"Vector3D\", \"Vector\", \"\",0,0,0");
- ob.Append("\n\t\t\tP: \"DefaultAttributeIndex\", \"int\", \"Integer\", \"\",0");
-
- if (m_GameObject.m_Transform.TryGetTransform(out var m_Transform))
- {
- float[] m_EulerRotation = QuatToEuler(new[] { m_Transform.m_LocalRotation[0], -m_Transform.m_LocalRotation[1], -m_Transform.m_LocalRotation[2], m_Transform.m_LocalRotation[3] });
-
- ob.AppendFormat("\n\t\t\tP: \"Lcl Translation\", \"Lcl Translation\", \"\", \"A\",{0},{1},{2}", -m_Transform.m_LocalPosition[0], m_Transform.m_LocalPosition[1], m_Transform.m_LocalPosition[2]);
- ob.AppendFormat("\n\t\t\tP: \"Lcl Rotation\", \"Lcl Rotation\", \"\", \"A\",{0},{1},{2}", m_EulerRotation[0], m_EulerRotation[1], m_EulerRotation[2]);//handedness is switched in quat
- ob.AppendFormat("\n\t\t\tP: \"Lcl Scaling\", \"Lcl Scaling\", \"\", \"A\",{0},{1},{2}", m_Transform.m_LocalScale[0], m_Transform.m_LocalScale[1], m_Transform.m_LocalScale[2]);
- }
-
- //mb.Append("\n\t\t\tP: \"UDP3DSMAX\", \"KString\", \"\", \"U\", \"MapChannel:1 = UVChannel_1&cr;&lf;MapChannel:2 = UVChannel_2&cr;&lf;\"");
- //mb.Append("\n\t\t\tP: \"MaxHandle\", \"int\", \"Integer\", \"UH\",24");
- ob.Append("\n\t\t}");
- ob.Append("\n\t\tShading: T");
- ob.Append("\n\t\tCulling: \"CullingOff\"\n\t}");
-
- //connect Model to parent
- var parentObject = ((GameObjectTreeNode)treeNodeDictionary[m_GameObject].Parent).gameObject;
- if (GameObjects.Contains(parentObject))
- {
- cb.AppendFormat("\n\n\t;Model::{0}, Model::{1}", m_GameObject.m_Name, parentObject.m_Name);
- cb.AppendFormat("\n\tC: \"OO\",1{0},1{1}", m_GameObject.preloadData.uniqueID, parentObject.preloadData.uniqueID);
- }
- else
- {
- cb.AppendFormat("\n\n\t;Model::{0}, Model::RootNode", m_GameObject.m_Name);
- cb.AppendFormat("\n\tC: \"OO\",1{0},0", m_GameObject.preloadData.uniqueID);
- }
-
-
- }
- #endregion
-
- #region write non-skinnned Geometry
- foreach (var MeshPD in Meshes)
- {
- Mesh m_Mesh = new Mesh(MeshPD);
- MeshFBX(m_Mesh, MeshPD.uniqueID, ob);
-
- //write data 8MB at a time
- if (ob.Length > (8 * 0x100000))
- { FBXwriter.Write(ob); ob.Clear(); }
- }
- #endregion
-
- #region write Deformer objects and skinned Geometry
- StringBuilder pb = new StringBuilder();
- //generate unique ID for BindPose
- pb.Append("\n\tPose: 5123456789, \"Pose::BIND_POSES\", \"BindPose\" {");
- pb.Append("\n\t\tType: \"BindPose\"");
- pb.Append("\n\t\tVersion: 100");
- pb.AppendFormat("\n\t\tNbPoseNodes: {0}", Skins.Count + LimbNodes.Count);
-
- foreach (var SkinnedMeshPD in Skins)
- {
- SkinnedMeshRenderer m_SkinnedMeshRenderer = new SkinnedMeshRenderer(SkinnedMeshPD);
- if (m_SkinnedMeshRenderer.m_GameObject.TryGetGameObject(out var m_GameObject) && m_SkinnedMeshRenderer.m_Mesh.TryGetPD(out var MeshPD))
- {
- //generate unique Geometry ID for instanced mesh objects
- //instanced skinned geometry is possible in FBX, but all instances are linked to the same skeleton nodes
- //TODO: create instances if deformer option is not selected
- //find a way to test if a mesh instance was loaded previously and if it uses the same skeleton, then create instance or copy
- var keepID = MeshPD.uniqueID;
- MeshPD.uniqueID = SkinnedMeshPD.uniqueID;
- Mesh m_Mesh = new Mesh(MeshPD);
- MeshFBX(m_Mesh, MeshPD.uniqueID, ob);
-
- //write data 8MB at a time
- if (ob.Length > (8 * 0x100000))
- { FBXwriter.Write(ob); ob.Clear(); }
-
- cb2.AppendFormat("\n\n\t;Geometry::, Model::{0}", m_GameObject.m_Name);
- cb2.AppendFormat("\n\tC: \"OO\",3{0},1{1}", MeshPD.uniqueID, m_GameObject.preloadData.uniqueID);
-
- if ((bool)Properties.Settings.Default["exportDeformers"])
- {
- //add BindPose node
- pb.Append("\n\t\tPoseNode: {");
- pb.AppendFormat("\n\t\t\tNode: 1{0}", m_GameObject.preloadData.uniqueID);
- //pb.Append("\n\t\t\tMatrix: *16 {");
- //pb.Append("\n\t\t\t\ta: ");
- //pb.Append("\n\t\t\t} ");
- pb.Append("\n\t\t}");
-
- ob.AppendFormat("\n\tCollectionExclusive: 5{0}, \"DisplayLayer::{1}\", \"DisplayLayer\" {{", SkinnedMeshPD.uniqueID, m_GameObject.m_Name);
- ob.Append("\n\t\tProperties70: {");
- ob.Append("\n\t\t}");
- ob.Append("\n\t}");
-
- //connect Model to DisplayLayer
- cb2.AppendFormat("\n\n\t;Model::{0}, DisplayLayer::", m_GameObject.m_Name);
- cb2.AppendFormat("\n\tC: \"OO\",1{0},5{1}", m_GameObject.preloadData.uniqueID, SkinnedMeshPD.uniqueID);
-
- //write Deformers
- if (m_Mesh.m_Skin.Length > 0 && m_Mesh.m_BindPose.Length >= m_SkinnedMeshRenderer.m_Bones.Length)
- {
- //write main Skin Deformer
- ob.AppendFormat("\n\tDeformer: 4{0}, \"Deformer::\", \"Skin\" {{", SkinnedMeshPD.uniqueID);
- ob.Append("\n\t\tVersion: 101");
- ob.Append("\n\t\tLink_DeformAcuracy: 50");
- ob.Append("\n\t}"); //Deformer end
-
- //connect Skin Deformer to Geometry
- cb2.Append("\n\n\t;Deformer::, Geometry::");
- cb2.AppendFormat("\n\tC: \"OO\",4{0},3{1}", SkinnedMeshPD.uniqueID, MeshPD.uniqueID);
-
- for (int b = 0; b < m_SkinnedMeshRenderer.m_Bones.Length; b++)
- {
- if (m_SkinnedMeshRenderer.m_Bones[b].TryGetTransform(out var m_Transform))
- {
- if (m_Transform.m_GameObject.TryGetGameObject(out var m_Bone))
- {
- int influences = 0, ibSplit = 0, wbSplit = 0;
- StringBuilder ib = new StringBuilder();//indices (vertex)
- StringBuilder wb = new StringBuilder();//weights
-
- for (int index = 0; index < m_Mesh.m_Skin.Length; index++)
- {
- if (m_Mesh.m_Skin[index][0].weight == 0 && (m_Mesh.m_Skin[index].All(x => x.weight == 0) || //if all weights (and indicces) are 0, bone0 has full control
- m_Mesh.m_Skin[index][1].weight > 0)) //this implies a second bone exists, so bone0 has control too (otherwise it wouldn't be the first in the series)
- { m_Mesh.m_Skin[index][0].weight = 1; }
-
- var influence = m_Mesh.m_Skin[index].Find(x => x.boneIndex == b && x.weight > 0);
- if (influence != null)
- {
- influences++;
- ib.AppendFormat("{0},", index);
- wb.AppendFormat("{0},", influence.weight);
-
- if (ib.Length - ibSplit > 2000) { ib.Append("\n"); ibSplit = ib.Length; }
- if (wb.Length - wbSplit > 2000) { wb.Append("\n"); wbSplit = wb.Length; }
- }
-
- /*float weight;
- if (m_Mesh.m_Skin[index].TryGetValue(b, out weight))
- {
- if (weight > 0)
- {
- influences++;
- ib.AppendFormat("{0},", index);
- wb.AppendFormat("{0},", weight);
- }
- else if (m_Mesh.m_Skin[index].Keys.Count == 1)//m_Mesh.m_Skin[index].Values.All(x => x == 0)
- {
- influences++;
- ib.AppendFormat("{0},", index);
- wb.AppendFormat("{0},", 1);
- }
-
- if (ib.Length - ibSplit > 2000) { ib.Append("\n"); ibSplit = ib.Length; }
- if (wb.Length - wbSplit > 2000) { wb.Append("\n"); wbSplit = wb.Length; }
- }*/
- }
- if (influences > 0)
- {
- ib.Length--;//remove last comma
- wb.Length--;//remove last comma
- }
-
- //SubDeformer objects need unique IDs because 2 or more deformers can be linked to the same bone
- ob.AppendFormat("\n\tDeformer: 4{0}{1}, \"SubDeformer::\", \"Cluster\" {{", b, SkinnedMeshPD.uniqueID);
- ob.Append("\n\t\tVersion: 100");
- ob.Append("\n\t\tUserData: \"\", \"\"");
-
- ob.AppendFormat("\n\t\tIndexes: *{0} {{\n\t\t\ta: ", influences);
- ob.Append(ib);
- ob.Append("\n\t\t}");
- ib.Clear();
-
- ob.AppendFormat("\n\t\tWeights: *{0} {{\n\t\t\ta: ", influences);
- ob.Append(wb);
- ob.Append("\n\t\t}");
- wb.Clear();
-
- ob.Append("\n\t\tTransform: *16 {\n\t\t\ta: ");
- //ob.Append(string.Join(",", m_Mesh.m_BindPose[b]));
- var m = m_Mesh.m_BindPose[b];
- ob.AppendFormat("{0},{1},{2},{3},", m[0, 0], -m[1, 0], -m[2, 0], m[3, 0]);
- ob.AppendFormat("{0},{1},{2},{3},", -m[0, 1], m[1, 1], m[2, 1], m[3, 1]);
- ob.AppendFormat("{0},{1},{2},{3},", -m[0, 2], m[1, 2], m[2, 2], m[3, 2]);
- ob.AppendFormat("{0},{1},{2},{3},", -m[0, 3], m[1, 3], m[2, 3], m[3, 3]);
- ob.Append("\n\t\t}");
-
- ob.Append("\n\t}"); //SubDeformer end
-
- //connect SubDeformer to Skin Deformer
- cb2.Append("\n\n\t;SubDeformer::, Deformer::");
- cb2.AppendFormat("\n\tC: \"OO\",4{0}{1},4{1}", b, SkinnedMeshPD.uniqueID);
-
- //connect dummy Model to SubDeformer
- cb2.AppendFormat("\n\n\t;Model::{0}, SubDeformer::", m_Bone.m_Name);
- cb2.AppendFormat("\n\tC: \"OO\",1{0},4{1}{2}", m_Bone.preloadData.uniqueID, b, SkinnedMeshPD.uniqueID);
- }
- }
- }
- }
- }
-
- MeshPD.uniqueID = keepID;
- }
- }
-
- if ((bool)Properties.Settings.Default["exportDeformers"])
- {
- foreach (var m_Bone in LimbNodes)
- {
- //add BindPose node
- pb.Append("\n\t\tPoseNode: {");
- pb.AppendFormat("\n\t\t\tNode: 1{0}", m_Bone.preloadData.uniqueID);
- //pb.Append("\n\t\t\tMatrix: *16 {");
- //pb.Append("\n\t\t\t\ta: ");
- //pb.Append("\n\t\t\t} ");
- pb.Append("\n\t\t}");
- }
- pb.Append("\n\t}"); //BindPose end
- ob.Append(pb); pb.Clear();
- }
- #endregion
-
- ob.Append(mb); mb.Clear();
- cb.Append(cb2); cb2.Clear();
-
- #region write & extract Textures
- foreach (var TexturePD in Textures)
- {
- //TODO check texture type and set path accordingly; eg. CubeMap, Texture3D
- string texPathName = Path.GetDirectoryName(FBXfile) + "\\Texture2D\\";
- ExportTexture2D(TexturePD, texPathName, false);
- texPathName = Path.GetFullPath(Path.Combine(texPathName, $"{TexturePD.Text}.png"));//必须是png文件
- ob.AppendFormat("\n\tTexture: 7{0}, \"Texture::{1}\", \"\" {{", TexturePD.uniqueID, TexturePD.Text);
- ob.Append("\n\t\tType: \"TextureVideoClip\"");
- ob.Append("\n\t\tVersion: 202");
- ob.AppendFormat("\n\t\tTextureName: \"Texture::{0}\"", TexturePD.Text);
- ob.Append("\n\t\tProperties70: {");
- ob.Append("\n\t\t\tP: \"UVSet\", \"KString\", \"\", \"\", \"UVChannel_0\"");
- ob.Append("\n\t\t\tP: \"UseMaterial\", \"bool\", \"\", \"\",1");
- ob.Append("\n\t\t}");
- ob.AppendFormat("\n\t\tMedia: \"Video::{0}\"", TexturePD.Text);
- ob.AppendFormat("\n\t\tFileName: \"{0}\"", texPathName);
- ob.AppendFormat("\n\t\tRelativeFilename: \"{0}\"", texPathName.Replace($"{Path.GetDirectoryName(FBXfile)}\\", ""));
- ob.Append("\n\t}");
-
- ob.AppendFormat("\n\tVideo: 8{0}, \"Video::{1}\", \"Clip\" {{", TexturePD.uniqueID, TexturePD.Text);
- ob.Append("\n\t\tType: \"Clip\"");
- ob.Append("\n\t\tProperties70: {");
- ob.AppendFormat("\n\t\t\tP: \"Path\", \"KString\", \"XRefUrl\", \"\", \"{0}\"", texPathName);
- ob.Append("\n\t\t}");
- ob.AppendFormat("\n\t\tFileName: \"{0}\"", texPathName);
- ob.AppendFormat("\n\t\tRelativeFilename: \"{0}\"", texPathName.Replace($"{Path.GetDirectoryName(FBXfile)}\\", ""));
- ob.Append("\n\t}");
-
- //connect video to texture
- cb.AppendFormat("\n\n\t;Video::{0}, Texture::{0}", TexturePD.Text);
- cb.AppendFormat("\n\tC: \"OO\",8{0},7{1}", TexturePD.uniqueID, TexturePD.uniqueID);
- }
- #endregion
-
- FBXwriter.Write(ob);
- ob.Clear();
-
- cb.Append("\n}");//Connections end
- FBXwriter.Write(cb);
- cb.Clear();
- }
- }
-
- private static void MeshFBX(Mesh m_Mesh, string MeshID, StringBuilder ob)
- {
- if (m_Mesh.m_VertexCount > 0)//general failsafe
- {
- ob.AppendFormat("\n\tGeometry: 3{0}, \"Geometry::\", \"Mesh\" {{", MeshID);
- ob.Append("\n\t\tProperties70: {");
- var randomColor = RandomColorGenerator(m_Mesh.m_Name);
- ob.AppendFormat("\n\t\t\tP: \"Color\", \"ColorRGB\", \"Color\", \"\",{0},{1},{2}", ((float)randomColor[0] / 255), ((float)randomColor[1] / 255), ((float)randomColor[2] / 255));
- ob.Append("\n\t\t}");
-
- #region Vertices
- ob.AppendFormat("\n\t\tVertices: *{0} {{\n\t\t\ta: ", m_Mesh.m_VertexCount * 3);
-
- int c = 3;//vertex components
- //skip last component in vector4
- if (m_Mesh.m_Vertices.Length == m_Mesh.m_VertexCount * 4) { c++; } //haha
-
- int lineSplit = ob.Length;
- for (int v = 0; v < m_Mesh.m_VertexCount; v++)
- {
- ob.AppendFormat("{0},{1},{2},", -m_Mesh.m_Vertices[v * c], m_Mesh.m_Vertices[v * c + 1], m_Mesh.m_Vertices[v * c + 2]);
-
- if (ob.Length - lineSplit > 2000)
- {
- ob.Append("\n");
- lineSplit = ob.Length;
- }
- }
- ob.Length--;//remove last comma
- ob.Append("\n\t\t}");
- #endregion
-
- #region Indices
- //in order to test topology for triangles/quads we need to store submeshes and write each one as geometry, then link to Mesh Node
- ob.AppendFormat("\n\t\tPolygonVertexIndex: *{0} {{\n\t\t\ta: ", m_Mesh.m_Indices.Count);
-
- lineSplit = ob.Length;
- for (int f = 0; f < m_Mesh.m_Indices.Count / 3; f++)
- {
- ob.AppendFormat("{0},{1},{2},", m_Mesh.m_Indices[f * 3], m_Mesh.m_Indices[f * 3 + 2], (-m_Mesh.m_Indices[f * 3 + 1] - 1));
-
- if (ob.Length - lineSplit > 2000)
- {
- ob.Append("\n");
- lineSplit = ob.Length;
- }
- }
- ob.Length--;//remove last comma
-
- ob.Append("\n\t\t}");
- ob.Append("\n\t\tGeometryVersion: 124");
- #endregion
-
- #region Normals
- if ((bool)Properties.Settings.Default["exportNormals"] && m_Mesh.m_Normals != null && m_Mesh.m_Normals.Length > 0)
- {
- ob.Append("\n\t\tLayerElementNormal: 0 {");
- ob.Append("\n\t\t\tVersion: 101");
- ob.Append("\n\t\t\tName: \"\"");
- ob.Append("\n\t\t\tMappingInformationType: \"ByVertice\"");
- ob.Append("\n\t\t\tReferenceInformationType: \"Direct\"");
- ob.AppendFormat("\n\t\t\tNormals: *{0} {{\n\t\t\ta: ", (m_Mesh.m_VertexCount * 3));
-
- if (m_Mesh.m_Normals.Length == m_Mesh.m_VertexCount * 3) { c = 3; }
- else if (m_Mesh.m_Normals.Length == m_Mesh.m_VertexCount * 4) { c = 4; }
-
- lineSplit = ob.Length;
- for (int v = 0; v < m_Mesh.m_VertexCount; v++)
- {
- ob.AppendFormat("{0},{1},{2},", -m_Mesh.m_Normals[v * c], m_Mesh.m_Normals[v * c + 1], m_Mesh.m_Normals[v * c + 2]);
-
- if (ob.Length - lineSplit > 2000)
- {
- ob.Append("\n");
- lineSplit = ob.Length;
- }
- }
- ob.Length--;//remove last comma
- ob.Append("\n\t\t\t}\n\t\t}");
- }
- #endregion
-
- #region Tangents
- if ((bool)Properties.Settings.Default["exportTangents"] && m_Mesh.m_Tangents != null && m_Mesh.m_Tangents.Length > 0)
- {
- ob.Append("\n\t\tLayerElementTangent: 0 {");
- ob.Append("\n\t\t\tVersion: 101");
- ob.Append("\n\t\t\tName: \"\"");
- ob.Append("\n\t\t\tMappingInformationType: \"ByVertice\"");
- ob.Append("\n\t\t\tReferenceInformationType: \"Direct\"");
- ob.AppendFormat("\n\t\t\tTangents: *{0} {{\n\t\t\ta: ", (m_Mesh.m_VertexCount * 3));
-
- if (m_Mesh.m_Tangents.Length == m_Mesh.m_VertexCount * 3) { c = 3; }
- else if (m_Mesh.m_Tangents.Length == m_Mesh.m_VertexCount * 4) { c = 4; }
-
- lineSplit = ob.Length;
- for (int v = 0; v < m_Mesh.m_VertexCount; v++)
- {
- ob.AppendFormat("{0},{1},{2},", -m_Mesh.m_Tangents[v * c], m_Mesh.m_Tangents[v * c + 1], m_Mesh.m_Tangents[v * c + 2]);
-
- if (ob.Length - lineSplit > 2000)
- {
- ob.Append("\n");
- lineSplit = ob.Length;
- }
- }
- ob.Length--;//remove last comma
- ob.Append("\n\t\t\t}\n\t\t}");
- }
- #endregion
-
- #region Colors
- if ((bool)Properties.Settings.Default["exportColors"] && m_Mesh.m_Colors != null && (m_Mesh.m_Colors.Length == m_Mesh.m_VertexCount * 3 || m_Mesh.m_Colors.Length == m_Mesh.m_VertexCount * 4))
- {
- ob.Append("\n\t\tLayerElementColor: 0 {");
- ob.Append("\n\t\t\tVersion: 101");
- ob.Append("\n\t\t\tName: \"\"");
- //ob.Append("\n\t\t\tMappingInformationType: \"ByVertice\"");
- //ob.Append("\n\t\t\tReferenceInformationType: \"Direct\"");
- ob.Append("\n\t\t\tMappingInformationType: \"ByPolygonVertex\"");
- ob.Append("\n\t\t\tReferenceInformationType: \"IndexToDirect\"");
- ob.AppendFormat("\n\t\t\tColors: *{0} {{\n\t\t\ta: ", m_Mesh.m_Colors.Length);
- //ob.Append(string.Join(",", m_Mesh.m_Colors));
-
- lineSplit = ob.Length;
- if (m_Mesh.m_Colors.Length == m_Mesh.m_VertexCount * 3)
- {
- for (int i = 0; i < m_Mesh.m_VertexCount; i++)
- {
- ob.AppendFormat("{0},{1},{2},{3},", m_Mesh.m_Colors[i * 3], m_Mesh.m_Colors[i * 3 + 1], m_Mesh.m_Colors[i * 3 + 2], 1.0f);
- if (ob.Length - lineSplit > 2000)
- {
- ob.Append("\n");
- lineSplit = ob.Length;
- }
- }
- }
- else
- {
- for (int i = 0; i < m_Mesh.m_VertexCount; i++)
- {
- ob.AppendFormat("{0},{1},{2},{3},", m_Mesh.m_Colors[i * 4], m_Mesh.m_Colors[i * 4 + 1], m_Mesh.m_Colors[i * 4 + 2], m_Mesh.m_Colors[i * 4 + 3]);
- if (ob.Length - lineSplit > 2000)
- {
- ob.Append("\n");
- lineSplit = ob.Length;
- }
- }
- }
- ob.Length--;//remove last comma
-
- ob.Append("\n\t\t\t}");
- ob.AppendFormat("\n\t\t\tColorIndex: *{0} {{\n\t\t\ta: ", m_Mesh.m_Indices.Count);
-
- lineSplit = ob.Length;
- for (int f = 0; f < m_Mesh.m_Indices.Count / 3; f++)
- {
- ob.AppendFormat("{0},{1},{2},", m_Mesh.m_Indices[f * 3], m_Mesh.m_Indices[f * 3 + 2], m_Mesh.m_Indices[f * 3 + 1]);
-
- if (ob.Length - lineSplit > 2000)
- {
- ob.Append("\n");
- lineSplit = ob.Length;
- }
- }
- ob.Length--;//remove last comma
-
- ob.Append("\n\t\t\t}\n\t\t}");
- }
- #endregion
-
- #region UV1
- //does FBX support UVW coordinates?
- if ((bool)Properties.Settings.Default["exportUVs"] && m_Mesh.m_UV1 != null && m_Mesh.m_UV1.Length > 0)
- {
- ob.Append("\n\t\tLayerElementUV: 0 {");
- ob.Append("\n\t\t\tVersion: 101");
- ob.Append("\n\t\t\tName: \"UVChannel_1\"");
- ob.Append("\n\t\t\tMappingInformationType: \"ByVertice\"");
- ob.Append("\n\t\t\tReferenceInformationType: \"Direct\"");
- ob.AppendFormat("\n\t\t\tUV: *{0} {{\n\t\t\ta: ", m_Mesh.m_UV1.Length);
-
- lineSplit = ob.Length;
- for (int v = 0; v < m_Mesh.m_VertexCount; v++)
- {
- ob.AppendFormat("{0},{1},", m_Mesh.m_UV1[v * 2], 1 - m_Mesh.m_UV1[v * 2 + 1]);
-
- if (ob.Length - lineSplit > 2000)
- {
- ob.Append("\n");
- lineSplit = ob.Length;
- }
- }
- ob.Length--;//remove last comma
- ob.Append("\n\t\t\t}\n\t\t}");
- }
- #endregion
- #region UV2
- if ((bool)Properties.Settings.Default["exportUVs"] && m_Mesh.m_UV2 != null && m_Mesh.m_UV2.Length > 0)
- {
- ob.Append("\n\t\tLayerElementUV: 1 {");
- ob.Append("\n\t\t\tVersion: 101");
- ob.Append("\n\t\t\tName: \"UVChannel_2\"");
- ob.Append("\n\t\t\tMappingInformationType: \"ByVertice\"");
- ob.Append("\n\t\t\tReferenceInformationType: \"Direct\"");
- ob.AppendFormat("\n\t\t\tUV: *{0} {{\n\t\t\ta: ", m_Mesh.m_UV2.Length);
-
- lineSplit = ob.Length;
- for (int v = 0; v < m_Mesh.m_VertexCount; v++)
- {
- ob.AppendFormat("{0},{1},", m_Mesh.m_UV2[v * 2], 1 - m_Mesh.m_UV2[v * 2 + 1]);
-
- if (ob.Length - lineSplit > 2000)
- {
- ob.Append("\n");
- lineSplit = ob.Length;
- }
- }
- ob.Length--;//remove last comma
- ob.Append("\n\t\t\t}\n\t\t}");
- }
- #endregion
- #region UV3
- if ((bool)Properties.Settings.Default["exportUVs"] && m_Mesh.m_UV3 != null && m_Mesh.m_UV3.Length > 0)
- {
- ob.Append("\n\t\tLayerElementUV: 2 {");
- ob.Append("\n\t\t\tVersion: 101");
- ob.Append("\n\t\t\tName: \"UVChannel_3\"");
- ob.Append("\n\t\t\tMappingInformationType: \"ByVertice\"");
- ob.Append("\n\t\t\tReferenceInformationType: \"Direct\"");
- ob.AppendFormat("\n\t\t\tUV: *{0} {{\n\t\t\ta: ", m_Mesh.m_UV3.Length);
-
- lineSplit = ob.Length;
- for (int v = 0; v < m_Mesh.m_VertexCount; v++)
- {
- ob.AppendFormat("{0},{1},", m_Mesh.m_UV3[v * 2], 1 - m_Mesh.m_UV3[v * 2 + 1]);
-
- if (ob.Length - lineSplit > 2000)
- {
- ob.Append("\n");
- lineSplit = ob.Length;
- }
- }
- ob.Length--;//remove last comma
- ob.Append("\n\t\t\t}\n\t\t}");
- }
- #endregion
- #region UV4
- if ((bool)Properties.Settings.Default["exportUVs"] && m_Mesh.m_UV4 != null && m_Mesh.m_UV4.Length > 0)
- {
- ob.Append("\n\t\tLayerElementUV: 3 {");
- ob.Append("\n\t\t\tVersion: 101");
- ob.Append("\n\t\t\tName: \"UVChannel_4\"");
- ob.Append("\n\t\t\tMappingInformationType: \"ByVertice\"");
- ob.Append("\n\t\t\tReferenceInformationType: \"Direct\"");
- ob.AppendFormat("\n\t\t\tUV: *{0} {{\n\t\t\ta: ", m_Mesh.m_UV4.Length);
-
- lineSplit = ob.Length;
- for (int v = 0; v < m_Mesh.m_VertexCount; v++)
- {
- ob.AppendFormat("{0},{1},", m_Mesh.m_UV4[v * 2], 1 - m_Mesh.m_UV4[v * 2 + 1]);
-
- if (ob.Length - lineSplit > 2000)
- {
- ob.Append("\n");
- lineSplit = ob.Length;
- }
- }
- ob.Length--;//remove last comma
- ob.Append("\n\t\t\t}\n\t\t}");
- }
- #endregion
-
- #region Material
- ob.Append("\n\t\tLayerElementMaterial: 0 {");
- ob.Append("\n\t\t\tVersion: 101");
- ob.Append("\n\t\t\tName: \"\"");
- ob.Append("\n\t\t\tMappingInformationType: \"");
- ob.Append(m_Mesh.m_SubMeshes.Count == 1 ? "AllSame\"" : "ByPolygon\"");
- ob.Append("\n\t\t\tReferenceInformationType: \"IndexToDirect\"");
- ob.AppendFormat("\n\t\t\tMaterials: *{0} {{", m_Mesh.m_materialIDs.Count);
- ob.Append("\n\t\t\t\ta: ");
- if (m_Mesh.m_materialIDs.Count == 1) { ob.Append("0"); }
- else
- {
- lineSplit = ob.Length;
- foreach (var m_materialID in m_Mesh.m_materialIDs)
- {
- ob.AppendFormat("{0},", m_materialID);
-
- if (ob.Length - lineSplit > 2000)
- {
- ob.Append("\n");
- lineSplit = ob.Length;
- }
- }
- ob.Length--;//remove last comma
- }
- ob.Append("\n\t\t\t}\n\t\t}");
- #endregion
-
- #region Layers
- ob.Append("\n\t\tLayer: 0 {");
- ob.Append("\n\t\t\tVersion: 100");
- if ((bool)Properties.Settings.Default["exportNormals"] && m_Mesh.m_Normals != null && m_Mesh.m_Normals.Length > 0)
- {
- ob.Append("\n\t\t\tLayerElement: {");
- ob.Append("\n\t\t\t\tType: \"LayerElementNormal\"");
- ob.Append("\n\t\t\t\tTypedIndex: 0");
- ob.Append("\n\t\t\t}");
- }
- if ((bool)Properties.Settings.Default["exportTangents"] && m_Mesh.m_Tangents != null && m_Mesh.m_Tangents.Length > 0)
- {
- ob.Append("\n\t\t\tLayerElement: {");
- ob.Append("\n\t\t\t\tType: \"LayerElementTangent\"");
- ob.Append("\n\t\t\t\tTypedIndex: 0");
- ob.Append("\n\t\t\t}");
- }
- ob.Append("\n\t\t\tLayerElement: {");
- ob.Append("\n\t\t\t\tType: \"LayerElementMaterial\"");
- ob.Append("\n\t\t\t\tTypedIndex: 0");
- ob.Append("\n\t\t\t}");
- //
- /*ob.Append("\n\t\t\tLayerElement: {");
- ob.Append("\n\t\t\t\tType: \"LayerElementTexture\"");
- ob.Append("\n\t\t\t\tTypedIndex: 0");
- ob.Append("\n\t\t\t}");
- ob.Append("\n\t\t\tLayerElement: {");
- ob.Append("\n\t\t\t\tType: \"LayerElementBumpTextures\"");
- ob.Append("\n\t\t\t\tTypedIndex: 0");
- ob.Append("\n\t\t\t}");*/
- if ((bool)Properties.Settings.Default["exportColors"] && m_Mesh.m_Colors != null && m_Mesh.m_Colors.Length > 0)
- {
- ob.Append("\n\t\t\tLayerElement: {");
- ob.Append("\n\t\t\t\tType: \"LayerElementColor\"");
- ob.Append("\n\t\t\t\tTypedIndex: 0");
- ob.Append("\n\t\t\t}");
- }
- if ((bool)Properties.Settings.Default["exportUVs"] && m_Mesh.m_UV1 != null && m_Mesh.m_UV1.Length > 0)
- {
- ob.Append("\n\t\t\tLayerElement: {");
- ob.Append("\n\t\t\t\tType: \"LayerElementUV\"");
- ob.Append("\n\t\t\t\tTypedIndex: 0");
- ob.Append("\n\t\t\t}");
- }
- ob.Append("\n\t\t}"); //Layer 0 end
-
- if ((bool)Properties.Settings.Default["exportUVs"] && m_Mesh.m_UV2 != null && m_Mesh.m_UV2.Length > 0)
- {
- ob.Append("\n\t\tLayer: 1 {");
- ob.Append("\n\t\t\tVersion: 100");
- ob.Append("\n\t\t\tLayerElement: {");
- ob.Append("\n\t\t\t\tType: \"LayerElementUV\"");
- ob.Append("\n\t\t\t\tTypedIndex: 1");
- ob.Append("\n\t\t\t}");
- ob.Append("\n\t\t}"); //Layer 1 end
- }
-
- if ((bool)Properties.Settings.Default["exportUVs"] && m_Mesh.m_UV3 != null && m_Mesh.m_UV3.Length > 0)
- {
- ob.Append("\n\t\tLayer: 2 {");
- ob.Append("\n\t\t\tVersion: 100");
- ob.Append("\n\t\t\tLayerElement: {");
- ob.Append("\n\t\t\t\tType: \"LayerElementUV\"");
- ob.Append("\n\t\t\t\tTypedIndex: 2");
- ob.Append("\n\t\t\t}");
- ob.Append("\n\t\t}"); //Layer 2 end
- }
-
- if ((bool)Properties.Settings.Default["exportUVs"] && m_Mesh.m_UV4 != null && m_Mesh.m_UV4.Length > 0)
- {
- ob.Append("\n\t\tLayer: 3 {");
- ob.Append("\n\t\t\tVersion: 100");
- ob.Append("\n\t\t\tLayerElement: {");
- ob.Append("\n\t\t\t\tType: \"LayerElementUV\"");
- ob.Append("\n\t\t\t\tTypedIndex: 3");
- ob.Append("\n\t\t\t}");
- ob.Append("\n\t\t}"); //Layer 3 end
- }
- #endregion
-
- ob.Append("\n\t}"); //Geometry end
- }
- }
-
- private static byte[] RandomColorGenerator(string name)
- {
- int nameHash = name.GetHashCode();
- Random r = new Random(nameHash);
- //Random r = new Random(DateTime.Now.Millisecond);
-
- byte red = (byte)r.Next(0, 255);
- byte green = (byte)r.Next(0, 255);
- byte blue = (byte)r.Next(0, 255);
-
- return new[] { red, green, blue };
- }
- }
-}
diff --git a/AssetStudio/StudioClasses/Studio.cs b/AssetStudio/StudioClasses/Studio.cs
index e68e553..38b6bcf 100644
--- a/AssetStudio/StudioClasses/Studio.cs
+++ b/AssetStudio/StudioClasses/Studio.cs
@@ -608,7 +608,7 @@ namespace AssetStudio
});
}
- public static void ExportSplitObjects(string savePath, TreeNodeCollection nodes, bool isNew = false)
+ public static void ExportSplitObjects(string savePath, TreeNodeCollection nodes)
{
ThreadPool.QueueUserWorkItem(state =>
{
@@ -643,19 +643,14 @@ namespace AssetStudio
Directory.CreateDirectory(targetPath);
//导出FBX
StatusStripUpdate($"Exporting {filename}.fbx");
- if (isNew)
+ try
{
- try
- {
- ExportGameObject(j.gameObject, targetPath);
- }
- catch (Exception ex)
- {
- MessageBox.Show($"{ex.Message}\r\n{ex.StackTrace}");
- }
+ ExportGameObject(j.gameObject, targetPath);
+ }
+ catch (Exception ex)
+ {
+ MessageBox.Show($"{ex.Message}\r\n{ex.StackTrace}");
}
- else
- FBXExporter.WriteFBX($"{targetPath}{filename}.fbx", gameObjects);
StatusStripUpdate($"Finished exporting {filename}.fbx");
}
}
diff --git a/AssetStudio/app.config b/AssetStudio/app.config
index 22b3814..9e7a7fd 100644
--- a/AssetStudio/app.config
+++ b/AssetStudio/app.config
@@ -22,27 +22,6 @@
0
-
- True
-
-
- False
-
-
- True
-
-
- True
-
-
- 2.54
-
-
- True
-
-
- True
-
True
@@ -79,6 +58,9 @@
3
+
+ 0
+
\ No newline at end of file
diff --git a/AssetStudioFBX/AssetStudioFBX.h b/AssetStudioFBX/AssetStudioFBX.h
index cfbf61e..f3db69e 100644
--- a/AssetStudioFBX/AssetStudioFBX.h
+++ b/AssetStudioFBX/AssetStudioFBX.h
@@ -48,8 +48,8 @@ namespace AssetStudio {
ref class Exporter
{
public:
- static void Export(String^ path, IImported^ imported, bool EulerFilter, float filterPrecision, bool allFrames, bool allBones, bool skins, float boneSize, bool flatInbetween, int versionIndex);
- static void ExportMorph(String^ path, IImported^ imported, bool morphMask, bool flatInbetween, bool skins, float boneSize, int versionIndex);
+ static void Export(String^ path, IImported^ imported, bool EulerFilter, float filterPrecision, bool allFrames, bool allBones, bool skins, float boneSize, bool flatInbetween, int versionIndex, bool isAscii);
+ static void ExportMorph(String^ path, IImported^ imported, bool morphMask, bool flatInbetween, bool skins, float boneSize, int versionIndex, bool isAscii);
private:
HashSet^ frameNames;
@@ -66,7 +66,7 @@ namespace AssetStudio {
FbxArray* pTextures;
FbxArray* pMeshNodes;
- Exporter(String^ path, IImported^ imported, bool allFrames, bool allBones, bool skins, float boneSize, int versionIndex, bool normals);
+ Exporter(String^ path, IImported^ imported, bool allFrames, bool allBones, bool skins, float boneSize, int versionIndex, bool isAscii, bool normals);
~Exporter();
void Exporter::LinkTexture(ImportedMaterial^ mat, int attIndex, FbxFileTexture* pTexture, FbxProperty& prop);
diff --git a/AssetStudioFBX/AssetStudioFBXExporter.cpp b/AssetStudioFBX/AssetStudioFBXExporter.cpp
index 3a5edf9..00d40dd 100644
--- a/AssetStudioFBX/AssetStudioFBXExporter.cpp
+++ b/AssetStudioFBX/AssetStudioFBXExporter.cpp
@@ -4,7 +4,7 @@
namespace AssetStudio
{
- void Fbx::Exporter::Export(String^ path, IImported^ imported, bool EulerFilter, float filterPrecision, bool allFrames, bool allBones, bool skins, float boneSize, bool flatInbetween, int versionIndex)
+ void Fbx::Exporter::Export(String^ path, IImported^ imported, bool EulerFilter, float filterPrecision, bool allFrames, bool allBones, bool skins, float boneSize, bool flatInbetween, int versionIndex, bool isAscii)
{
FileInfo^ file = gcnew FileInfo(path);
DirectoryInfo^ dir = file->Directory;
@@ -16,7 +16,7 @@ namespace AssetStudio
Directory::SetCurrentDirectory(dir->FullName);
path = Path::GetFileName(path);
- Exporter^ exporter = gcnew Exporter(path, imported, allFrames, allBones, skins, boneSize, versionIndex, true);
+ Exporter^ exporter = gcnew Exporter(path, imported, allFrames, allBones, skins, boneSize, versionIndex, isAscii, true);
exporter->ExportMorphs(imported, false, flatInbetween);
exporter->ExportAnimations(EulerFilter, filterPrecision, flatInbetween);
exporter->pExporter->Export(exporter->pScene);
@@ -25,7 +25,7 @@ namespace AssetStudio
Directory::SetCurrentDirectory(currentDir);
}
- void Fbx::Exporter::ExportMorph(String^ path, IImported^ imported, bool morphMask, bool flatInbetween, bool skins, float boneSize, int versionIndex)
+ void Fbx::Exporter::ExportMorph(String^ path, IImported^ imported, bool morphMask, bool flatInbetween, bool skins, float boneSize, int versionIndex, bool isAscii)
{
FileInfo^ file = gcnew FileInfo(path);
DirectoryInfo^ dir = file->Directory;
@@ -37,7 +37,7 @@ namespace AssetStudio
Directory::SetCurrentDirectory(dir->FullName);
path = Path::GetFileName(path);
- Exporter^ exporter = gcnew Exporter(path, imported, false, true, skins, boneSize, versionIndex, false);
+ Exporter^ exporter = gcnew Exporter(path, imported, false, true, skins, boneSize, versionIndex, isAscii, false);
exporter->ExportMorphs(imported, morphMask, flatInbetween);
exporter->pExporter->Export(exporter->pScene);
delete exporter;
@@ -45,7 +45,7 @@ namespace AssetStudio
Directory::SetCurrentDirectory(currentDir);
}
- Fbx::Exporter::Exporter(String^ path, IImported^ imported, bool allFrames, bool allBones, bool skins, float boneSize, int versionIndex, bool normals)
+ Fbx::Exporter::Exporter(String^ path, IImported^ imported, bool allFrames, bool allBones, bool skins, float boneSize, int versionIndex, bool isAscii, bool normals)
{
this->imported = imported;
exportSkins = skins;
@@ -80,10 +80,18 @@ namespace AssetStudio
if (versionIndex == 0)
{
pFileFormat = 3;
+ if (isAscii)
+ {
+ pFileFormat = 4;
+ }
}
else
{
pExporter->SetFileExportVersion(FBXVersion[versionIndex]);
+ if (isAscii)
+ {
+ pFileFormat = 1;
+ }
}
if (!pExporter->Initialize(cDest, pFileFormat, pSdkManager->GetIOSettings()))