From 1f897cf431989f3fdf8dd1ccf596a17ffc271d71 Mon Sep 17 00:00:00 2001 From: Perfare Date: Sat, 27 Oct 2018 09:39:45 +0800 Subject: [PATCH] Delete obsolete code --- AssetStudio/AssetStudio.csproj | 1 - AssetStudio/AssetStudioForm.Designer.cs | 56 +- AssetStudio/AssetStudioForm.cs | 64 +- AssetStudio/ExportOptions.Designer.cs | 251 +---- AssetStudio/ExportOptions.cs | 24 +- AssetStudio/Properties/Settings.Designer.cs | 96 +- AssetStudio/Properties/Settings.settings | 24 +- AssetStudio/StudioClasses/Exporter.cs | 3 +- AssetStudio/StudioClasses/FBXExporter.cs | 1096 ------------------- AssetStudio/StudioClasses/Studio.cs | 19 +- AssetStudio/app.config | 24 +- AssetStudioFBX/AssetStudioFBX.h | 6 +- AssetStudioFBX/AssetStudioFBXExporter.cpp | 18 +- 13 files changed, 110 insertions(+), 1572 deletions(-) delete mode 100644 AssetStudio/StudioClasses/FBXExporter.cs 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()))