mirror of
https://github.com/aelurum/AssetStudio.git
synced 2025-05-26 13:50:21 -04:00
Some improvements
This commit is contained in:
parent
906149a58a
commit
de464dfe10
@ -14,9 +14,7 @@ using System.Drawing.Text;
|
|||||||
using OpenTK;
|
using OpenTK;
|
||||||
using OpenTK.Graphics.OpenGL;
|
using OpenTK.Graphics.OpenGL;
|
||||||
using static AssetStudio.Studio;
|
using static AssetStudio.Studio;
|
||||||
using static AssetStudio.FBXExporter;
|
|
||||||
using static AssetStudio.Importer;
|
using static AssetStudio.Importer;
|
||||||
using static AssetStudio.SpriteHelper;
|
|
||||||
|
|
||||||
namespace AssetStudio
|
namespace AssetStudio
|
||||||
{
|
{
|
||||||
@ -996,7 +994,7 @@ namespace AssetStudio
|
|||||||
case ClassIDReference.Sprite:
|
case ClassIDReference.Sprite:
|
||||||
{
|
{
|
||||||
imageTexture?.Dispose();
|
imageTexture?.Dispose();
|
||||||
imageTexture = GetImageFromSprite(asset);
|
imageTexture = SpriteHelper.GetImageFromSprite(asset);
|
||||||
if (imageTexture != null)
|
if (imageTexture != null)
|
||||||
{
|
{
|
||||||
previewPanel.BackgroundImage = imageTexture;
|
previewPanel.BackgroundImage = imageTexture;
|
||||||
@ -1311,64 +1309,18 @@ namespace AssetStudio
|
|||||||
var saveFolderDialog1 = new OpenFolderDialog();
|
var saveFolderDialog1 = new OpenFolderDialog();
|
||||||
if (saveFolderDialog1.ShowDialog(this) == DialogResult.OK)
|
if (saveFolderDialog1.ShowDialog(this) == DialogResult.OK)
|
||||||
{
|
{
|
||||||
var savePath = saveFolderDialog1.Folder;
|
var savePath = saveFolderDialog1.Folder + "\\";
|
||||||
savePath = savePath + "\\";
|
|
||||||
switch ((bool)Properties.Settings.Default["showExpOpt"])
|
if ((bool)Properties.Settings.Default["showExpOpt"])
|
||||||
{
|
|
||||||
case true:
|
|
||||||
ExportOptions exportOpt = new ExportOptions();
|
|
||||||
if (exportOpt.ShowDialog() == DialogResult.OK) { goto case false; }
|
|
||||||
break;
|
|
||||||
case false:
|
|
||||||
{
|
{
|
||||||
|
var exportOpt = new ExportOptions();
|
||||||
|
exportOpt.ShowDialog();
|
||||||
|
}
|
||||||
|
|
||||||
progressBar1.Value = 0;
|
progressBar1.Value = 0;
|
||||||
progressBar1.Maximum = sceneTreeView.Nodes.Count;
|
progressBar1.Maximum = sceneTreeView.Nodes.Count;
|
||||||
//防止主界面假死
|
|
||||||
ThreadPool.QueueUserWorkItem(state =>
|
ThreadPool.QueueUserWorkItem(state => ExportSplitObjects(savePath, sceneTreeView.Nodes));
|
||||||
{
|
|
||||||
Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US");
|
|
||||||
sceneTreeView.Invoke(new Action(() =>
|
|
||||||
{
|
|
||||||
//挂起控件防止更新
|
|
||||||
sceneTreeView.BeginUpdate();
|
|
||||||
//先取消所有Node的选中
|
|
||||||
foreach (TreeNode i in sceneTreeView.Nodes)
|
|
||||||
{
|
|
||||||
i.Checked = false;
|
|
||||||
}
|
|
||||||
}));
|
|
||||||
//遍历根节点
|
|
||||||
foreach (TreeNode i in sceneTreeView.Nodes)
|
|
||||||
{
|
|
||||||
if (i.Nodes.Count > 0)
|
|
||||||
{
|
|
||||||
//遍历一级子节点
|
|
||||||
foreach (TreeNode j in i.Nodes)
|
|
||||||
{
|
|
||||||
//加上时间,因为可能有重名的object
|
|
||||||
var filename = j.Text + DateTime.Now.ToString("_mm_ss_ffff");
|
|
||||||
//选中它和它的子节点
|
|
||||||
sceneTreeView.Invoke(new Action(() => j.Checked = true));
|
|
||||||
//处理非法文件名
|
|
||||||
filename = FixFileName(filename);
|
|
||||||
//导出FBX
|
|
||||||
WriteFBX(savePath + filename + ".fbx", false);
|
|
||||||
//取消选中
|
|
||||||
sceneTreeView.Invoke(new Action(() => j.Checked = false));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
ProgressBarPerformStep();
|
|
||||||
}
|
|
||||||
//取消挂起
|
|
||||||
sceneTreeView.Invoke(new Action(() => sceneTreeView.EndUpdate()));
|
|
||||||
if (openAfterExport.Checked)
|
|
||||||
{
|
|
||||||
Process.Start(savePath);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@ -1382,36 +1334,49 @@ namespace AssetStudio
|
|||||||
{
|
{
|
||||||
if (sceneTreeView.Nodes.Count > 0)
|
if (sceneTreeView.Nodes.Count > 0)
|
||||||
{
|
{
|
||||||
var exportSwitch = ((ToolStripItem)sender).Name == "exportallobjectsMenuItem";
|
var exportAll = ((ToolStripItem)sender).Name == "exportallobjectsMenuItem";
|
||||||
|
|
||||||
saveFileDialog1.FileName = productName + DateTime.Now.ToString("_yy_MM_dd__HH_mm_ss");
|
saveFileDialog1.FileName = productName + DateTime.Now.ToString("_yy_MM_dd__HH_mm_ss");
|
||||||
|
|
||||||
if (saveFileDialog1.ShowDialog() == DialogResult.OK)
|
if (saveFileDialog1.ShowDialog() == DialogResult.OK)
|
||||||
{
|
{
|
||||||
switch ((bool)Properties.Settings.Default["showExpOpt"])
|
if ((bool)Properties.Settings.Default["showExpOpt"])
|
||||||
{
|
{
|
||||||
case true:
|
var exportOpt = new ExportOptions();
|
||||||
ExportOptions exportOpt = new ExportOptions();
|
exportOpt.ShowDialog();
|
||||||
if (exportOpt.ShowDialog() == DialogResult.OK)
|
|
||||||
{
|
|
||||||
goto case false;
|
|
||||||
}
|
}
|
||||||
break;
|
|
||||||
case false:
|
|
||||||
WriteFBX(saveFileDialog1.FileName, exportSwitch);
|
|
||||||
|
|
||||||
|
var gameObjects = new List<GameObject>();
|
||||||
|
foreach (var assetsFile in assetsfileList)
|
||||||
|
{
|
||||||
|
foreach (var m_GameObject in assetsFile.GameObjectList.Values)
|
||||||
|
{
|
||||||
|
if (m_GameObject.Checked || exportAll)
|
||||||
|
{
|
||||||
|
gameObjects.Add(m_GameObject);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
progressBar1.Value = 0;
|
||||||
|
progressBar1.Maximum = 1;
|
||||||
|
if (gameObjects.Count == 0)
|
||||||
|
{
|
||||||
|
progressBar1.PerformStep();
|
||||||
|
toolStripStatusLabel1.Text = "Nothing exported.";
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
FBXExporter.WriteFBX(saveFileDialog1.FileName, gameObjects);
|
||||||
|
progressBar1.PerformStep();
|
||||||
if (openAfterExport.Checked && File.Exists(saveFileDialog1.FileName))
|
if (openAfterExport.Checked && File.Exists(saveFileDialog1.FileName))
|
||||||
{
|
{
|
||||||
Process.Start(Path.GetDirectoryName(saveFileDialog1.FileName));
|
Process.Start(Path.GetDirectoryName(saveFileDialog1.FileName));
|
||||||
}
|
}
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
StatusStripUpdate("No Objects available for export");
|
toolStripStatusLabel1.Text = "No Objects available for export";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1726,7 +1691,7 @@ namespace AssetStudio
|
|||||||
secondSortColumn = 0;
|
secondSortColumn = 0;
|
||||||
reverseSort = false;
|
reverseSort = false;
|
||||||
enableFiltering = false;
|
enableFiltering = false;
|
||||||
|
listSearch.Text = " Filter ";
|
||||||
FMODreset();
|
FMODreset();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -684,6 +684,8 @@ namespace AssetStudio
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
m_AnimationType = reader.ReadInt32();
|
m_AnimationType = reader.ReadInt32();
|
||||||
|
if (m_AnimationType == 1)
|
||||||
|
m_Legacy = true;
|
||||||
}
|
}
|
||||||
m_Compressed = reader.ReadBoolean();
|
m_Compressed = reader.ReadBoolean();
|
||||||
m_UseHighQualityCurve = reader.ReadBoolean();
|
m_UseHighQualityCurve = reader.ReadBoolean();
|
||||||
|
@ -5,7 +5,6 @@ using System.IO;
|
|||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Runtime.InteropServices;
|
using System.Runtime.InteropServices;
|
||||||
using System.Text;
|
using System.Text;
|
||||||
using static AssetStudio.SpriteHelper;
|
|
||||||
|
|
||||||
namespace AssetStudio
|
namespace AssetStudio
|
||||||
{
|
{
|
||||||
@ -13,9 +12,10 @@ namespace AssetStudio
|
|||||||
{
|
{
|
||||||
public static bool ExportTexture2D(AssetPreloadData asset, string exportPathName, bool flip)
|
public static bool ExportTexture2D(AssetPreloadData asset, string exportPathName, bool flip)
|
||||||
{
|
{
|
||||||
var m_Texture2D = new Texture2DConverter(new Texture2D(asset, true));
|
var texture2D = new Texture2D(asset, true);
|
||||||
if (m_Texture2D.image_data == null)
|
if (texture2D.image_data == null || texture2D.image_data.Length == 0)
|
||||||
return false;
|
return false;
|
||||||
|
var m_Texture2D = new Texture2DConverter(texture2D);
|
||||||
var convert = (bool)Properties.Settings.Default["convertTexture"];
|
var convert = (bool)Properties.Settings.Default["convertTexture"];
|
||||||
var bitmap = m_Texture2D.ConvertToBitmap(flip);
|
var bitmap = m_Texture2D.ConvertToBitmap(flip);
|
||||||
if (convert && bitmap != null)
|
if (convert && bitmap != null)
|
||||||
@ -287,7 +287,7 @@ namespace AssetStudio
|
|||||||
var exportFullName = exportPath + asset.Text + "." + type.ToLower();
|
var exportFullName = exportPath + asset.Text + "." + type.ToLower();
|
||||||
if (ExportFileExists(exportFullName))
|
if (ExportFileExists(exportFullName))
|
||||||
return false;
|
return false;
|
||||||
var bitmap = GetImageFromSprite(asset);
|
var bitmap = SpriteHelper.GetImageFromSprite(asset);
|
||||||
if (bitmap != null)
|
if (bitmap != null)
|
||||||
{
|
{
|
||||||
bitmap.Save(exportFullName, format);
|
bitmap.Save(exportFullName, format);
|
||||||
@ -349,7 +349,7 @@ namespace AssetStudio
|
|||||||
var boneSize = (int)(decimal)Properties.Settings.Default["boneSize"];
|
var boneSize = (int)(decimal)Properties.Settings.Default["boneSize"];
|
||||||
var flatInbetween = (bool)Properties.Settings.Default["flatInbetween"];
|
var flatInbetween = (bool)Properties.Settings.Default["flatInbetween"];
|
||||||
var compatibility = (bool)Properties.Settings.Default["compatibility"];
|
var compatibility = (bool)Properties.Settings.Default["compatibility"];
|
||||||
Fbx.Exporter.Export(exportPath, convert, EulerFilter, filterPrecision, ".fbx", allFrames, allBones, skins, boneSize, flatInbetween, compatibility);
|
Fbx.Exporter.Export(exportPath, convert, EulerFilter, filterPrecision, allFrames, allBones, skins, boneSize, flatInbetween, compatibility);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -10,7 +10,7 @@ namespace AssetStudio
|
|||||||
{
|
{
|
||||||
static class FBXExporter
|
static class FBXExporter
|
||||||
{
|
{
|
||||||
public static void WriteFBX(string FBXfile, bool allNodes)
|
public static void WriteFBX(string FBXfile, List<GameObject> gameObjects)
|
||||||
{
|
{
|
||||||
var timestamp = DateTime.Now;
|
var timestamp = DateTime.Now;
|
||||||
|
|
||||||
@ -47,11 +47,7 @@ namespace AssetStudio
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#region loop nodes and collect objects for export
|
#region loop nodes and collect objects for export
|
||||||
foreach (var assetsFile in assetsfileList)
|
foreach (var m_GameObject in gameObjects)
|
||||||
{
|
|
||||||
foreach (var m_GameObject in assetsFile.GameObjectList.Values)
|
|
||||||
{
|
|
||||||
if (m_GameObject.Checked || allNodes)
|
|
||||||
{
|
{
|
||||||
GameObjects.Add(m_GameObject);
|
GameObjects.Add(m_GameObject);
|
||||||
|
|
||||||
@ -145,8 +141,6 @@ namespace AssetStudio
|
|||||||
}
|
}
|
||||||
#endregion
|
#endregion
|
||||||
}
|
}
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//if ((bool)Properties.Settings.Default["convertDummies"]) { GameObjects.Except(LimbNodes); }
|
//if ((bool)Properties.Settings.Default["convertDummies"]) { GameObjects.Except(LimbNodes); }
|
||||||
//else { GameObjects.UnionWith(LimbNodes); LimbNodes.Clear(); }
|
//else { GameObjects.UnionWith(LimbNodes); LimbNodes.Clear(); }
|
||||||
|
@ -9,10 +9,6 @@ using static AssetStudio.Studio;
|
|||||||
|
|
||||||
namespace AssetStudio
|
namespace AssetStudio
|
||||||
{
|
{
|
||||||
/* TODO Handle all things in one loop
|
|
||||||
* Init with GameObject
|
|
||||||
* Other optimization
|
|
||||||
*/
|
|
||||||
class ModelConverter : IImported
|
class ModelConverter : IImported
|
||||||
{
|
{
|
||||||
public List<ImportedFrame> FrameList { get; protected set; } = new List<ImportedFrame>();
|
public List<ImportedFrame> FrameList { get; protected set; } = new List<ImportedFrame>();
|
||||||
@ -81,7 +77,6 @@ namespace AssetStudio
|
|||||||
|
|
||||||
CreateBonePathHash(rootTransform);
|
CreateBonePathHash(rootTransform);
|
||||||
ConvertFrames(rootTransform, null);
|
ConvertFrames(rootTransform, null);
|
||||||
CollectMorphInfo(rootTransform);
|
|
||||||
ConvertMeshRenderer(m_Transform);
|
ConvertMeshRenderer(m_Transform);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -92,21 +87,21 @@ namespace AssetStudio
|
|||||||
{
|
{
|
||||||
if (assetsfileList.TryGetPD(m_Component, out var assetPreloadData))
|
if (assetsfileList.TryGetPD(m_Component, out var assetPreloadData))
|
||||||
{
|
{
|
||||||
switch (assetPreloadData.Type2)
|
switch (assetPreloadData.Type)
|
||||||
{
|
{
|
||||||
case 23: //MeshRenderer
|
case ClassIDReference.MeshRenderer:
|
||||||
{
|
{
|
||||||
var m_Renderer = new MeshRenderer(assetPreloadData);
|
var m_Renderer = new MeshRenderer(assetPreloadData);
|
||||||
ConvertMeshRenderer(m_Renderer);
|
ConvertMeshRenderer(m_Renderer);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case 137: //SkinnedMeshRenderer
|
case ClassIDReference.SkinnedMeshRenderer:
|
||||||
{
|
{
|
||||||
var m_SkinnedMeshRenderer = new SkinnedMeshRenderer(assetPreloadData);
|
var m_SkinnedMeshRenderer = new SkinnedMeshRenderer(assetPreloadData);
|
||||||
ConvertMeshRenderer(m_SkinnedMeshRenderer);
|
ConvertMeshRenderer(m_SkinnedMeshRenderer);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case 111: //Animation
|
case ClassIDReference.Animation:
|
||||||
{
|
{
|
||||||
var m_Animation = new Animation(assetPreloadData);
|
var m_Animation = new Animation(assetPreloadData);
|
||||||
foreach (var animation in m_Animation.m_Animations)
|
foreach (var animation in m_Animation.m_Animations)
|
||||||
@ -132,7 +127,7 @@ namespace AssetStudio
|
|||||||
{
|
{
|
||||||
if (assetsfileList.TryGetPD(m_Animator.m_Controller, out var assetPreloadData))
|
if (assetsfileList.TryGetPD(m_Animator.m_Controller, out var assetPreloadData))
|
||||||
{
|
{
|
||||||
if (assetPreloadData.Type2 == 221)//AnimatorOverrideController
|
if (assetPreloadData.Type == ClassIDReference.AnimatorOverrideController)
|
||||||
{
|
{
|
||||||
var m_AnimatorOverrideController = new AnimatorOverrideController(assetPreloadData);
|
var m_AnimatorOverrideController = new AnimatorOverrideController(assetPreloadData);
|
||||||
if (assetsfileList.TryGetPD(m_AnimatorOverrideController.m_Controller, out assetPreloadData))
|
if (assetsfileList.TryGetPD(m_AnimatorOverrideController.m_Controller, out assetPreloadData))
|
||||||
@ -154,7 +149,7 @@ namespace AssetStudio
|
|||||||
}
|
}
|
||||||
}*/
|
}*/
|
||||||
}
|
}
|
||||||
else if (assetPreloadData.Type2 == 91)//AnimatorController
|
else if (assetPreloadData.Type == ClassIDReference.AnimatorController)
|
||||||
{
|
{
|
||||||
var m_AnimatorController = new AnimatorController(assetPreloadData);
|
var m_AnimatorController = new AnimatorController(assetPreloadData);
|
||||||
foreach (var m_AnimationClip in m_AnimatorController.m_AnimationClips)
|
foreach (var m_AnimationClip in m_AnimatorController.m_AnimationClips)
|
||||||
@ -196,30 +191,6 @@ namespace AssetStudio
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void CollectMorphInfo(Transform m_Transform)
|
|
||||||
{
|
|
||||||
assetsfileList.TryGetGameObject(m_Transform.m_GameObject, out var m_GameObject);
|
|
||||||
if (assetsfileList.TryGetPD(m_GameObject.m_SkinnedMeshRenderer, out var assetPreloadData))
|
|
||||||
{
|
|
||||||
var m_SkinnedMeshRenderer = new SkinnedMeshRenderer(assetPreloadData);
|
|
||||||
if (assetsfileList.TryGetPD(m_SkinnedMeshRenderer.m_Mesh, out var MeshPD))
|
|
||||||
{
|
|
||||||
var mesh = new Mesh(MeshPD, true);
|
|
||||||
foreach (var channel in mesh.m_Shapes.channels)
|
|
||||||
{
|
|
||||||
morphChannelInfo.Add(channel.nameHash, channel.name);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
foreach (var pptr in m_Transform.m_Children)
|
|
||||||
{
|
|
||||||
if (assetsfileList.TryGetTransform(pptr, out var child))
|
|
||||||
CollectMorphInfo(child);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
private void ConvertMeshRenderer(MeshRenderer meshR)
|
private void ConvertMeshRenderer(MeshRenderer meshR)
|
||||||
{
|
{
|
||||||
var mesh = GetMesh(meshR);
|
var mesh = GetMesh(meshR);
|
||||||
@ -375,6 +346,10 @@ namespace AssetStudio
|
|||||||
}
|
}
|
||||||
|
|
||||||
//Morphs
|
//Morphs
|
||||||
|
foreach (var channel in mesh.m_Shapes.channels)
|
||||||
|
{
|
||||||
|
morphChannelInfo.Add(channel.nameHash, channel.name);
|
||||||
|
}
|
||||||
if (mesh.m_Shapes.shapes.Count > 0)
|
if (mesh.m_Shapes.shapes.Count > 0)
|
||||||
{
|
{
|
||||||
ImportedMorph morph = null;
|
ImportedMorph morph = null;
|
||||||
@ -446,7 +421,7 @@ namespace AssetStudio
|
|||||||
{
|
{
|
||||||
if (assetsfileList.TryGetPD(m_Component, out var assetPreloadData))
|
if (assetsfileList.TryGetPD(m_Component, out var assetPreloadData))
|
||||||
{
|
{
|
||||||
if (assetPreloadData.Type2 == 33) //MeshFilter
|
if (assetPreloadData.Type == ClassIDReference.MeshFilter)
|
||||||
{
|
{
|
||||||
var m_MeshFilter = new MeshFilter(assetPreloadData);
|
var m_MeshFilter = new MeshFilter(assetPreloadData);
|
||||||
if (assetsfileList.TryGetPD(m_MeshFilter.m_Mesh, out var MeshPD))
|
if (assetsfileList.TryGetPD(m_MeshFilter.m_Mesh, out var MeshPD))
|
||||||
@ -529,7 +504,7 @@ namespace AssetStudio
|
|||||||
foreach (var texEnv in mat.m_TexEnvs)
|
foreach (var texEnv in mat.m_TexEnvs)
|
||||||
{
|
{
|
||||||
Texture2D tex2D = null;
|
Texture2D tex2D = null;
|
||||||
if (assetsfileList.TryGetPD(texEnv.m_Texture, out var TexturePD) && TexturePD.Type2 == 28)//TODO other Texture
|
if (assetsfileList.TryGetPD(texEnv.m_Texture, out var TexturePD) && TexturePD.Type == ClassIDReference.Texture2D)//TODO other Texture
|
||||||
{
|
{
|
||||||
tex2D = new Texture2D(TexturePD, true);
|
tex2D = new Texture2D(TexturePD, true);
|
||||||
}
|
}
|
||||||
|
@ -11,12 +11,8 @@ namespace AssetStudio
|
|||||||
{
|
{
|
||||||
static class SpriteHelper
|
static class SpriteHelper
|
||||||
{
|
{
|
||||||
private static Dictionary<AssetPreloadData, Bitmap> spriteCache = new Dictionary<AssetPreloadData, Bitmap>();
|
|
||||||
|
|
||||||
public static Bitmap GetImageFromSprite(AssetPreloadData asset)
|
public static Bitmap GetImageFromSprite(AssetPreloadData asset)
|
||||||
{
|
{
|
||||||
if (spriteCache.TryGetValue(asset, out var bitmap))
|
|
||||||
return (Bitmap)bitmap.Clone();
|
|
||||||
var m_Sprite = new Sprite(asset, true);
|
var m_Sprite = new Sprite(asset, true);
|
||||||
if (assetsfileList.TryGetPD(m_Sprite.m_SpriteAtlas, out var assetPreloadData))
|
if (assetsfileList.TryGetPD(m_Sprite.m_SpriteAtlas, out var assetPreloadData))
|
||||||
{
|
{
|
||||||
@ -51,8 +47,7 @@ namespace AssetStudio
|
|||||||
asset.InfoText = $"Width: {textureRect.Width}\nHeight: {textureRect.Height}\n" + info;
|
asset.InfoText = $"Width: {textureRect.Width}\nHeight: {textureRect.Height}\n" + info;
|
||||||
var spriteImage = originalImage.Clone(textureRect, PixelFormat.Format32bppArgb);
|
var spriteImage = originalImage.Clone(textureRect, PixelFormat.Format32bppArgb);
|
||||||
spriteImage.RotateFlip(RotateFlipType.RotateNoneFlipY);
|
spriteImage.RotateFlip(RotateFlipType.RotateNoneFlipY);
|
||||||
spriteCache.Add(asset, spriteImage);
|
return spriteImage;
|
||||||
return (Bitmap)spriteImage.Clone();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -87,8 +82,7 @@ namespace AssetStudio
|
|||||||
{
|
{
|
||||||
graphic.FillPath(brush, path);
|
graphic.FillPath(brush, path);
|
||||||
bitmap.RotateFlip(RotateFlipType.RotateNoneFlipY);
|
bitmap.RotateFlip(RotateFlipType.RotateNoneFlipY);
|
||||||
spriteCache.Add(asset, bitmap);
|
return bitmap;
|
||||||
return (Bitmap)bitmap.Clone();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -506,6 +506,52 @@ namespace AssetStudio
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static void ExportSplitObjects(string savePath, TreeNodeCollection nodes)
|
||||||
|
{
|
||||||
|
foreach (TreeNode node in nodes)
|
||||||
|
{
|
||||||
|
//遍历一级子节点
|
||||||
|
foreach (TreeNode j in node.Nodes)
|
||||||
|
{
|
||||||
|
//收集所有子节点
|
||||||
|
var gameObjects = new List<GameObject>();
|
||||||
|
CollectNode(j, gameObjects);
|
||||||
|
//跳过一些不需要导出的object
|
||||||
|
if (gameObjects.All(x => x.m_SkinnedMeshRenderer == null && x.m_MeshFilter == null))
|
||||||
|
continue;
|
||||||
|
//处理非法文件名
|
||||||
|
var filename = FixFileName(j.Text);
|
||||||
|
//每个文件单独文件夹
|
||||||
|
var saveName = $"{savePath}{filename}\\{filename}.fbx";
|
||||||
|
//重名文件处理
|
||||||
|
for (int i = 1; ; i++)
|
||||||
|
{
|
||||||
|
if (File.Exists(saveName))
|
||||||
|
{
|
||||||
|
saveName = $"{savePath}{filename} ({i})\\{filename}.fbx";
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Directory.CreateDirectory(Path.GetDirectoryName(saveName));
|
||||||
|
//导出FBX
|
||||||
|
FBXExporter.WriteFBX(saveName, gameObjects);
|
||||||
|
}
|
||||||
|
ProgressBarPerformStep();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void CollectNode(TreeNode node, List<GameObject> gameObjects)
|
||||||
|
{
|
||||||
|
gameObjects.Add((GameObject)node);
|
||||||
|
foreach (TreeNode i in node.Nodes)
|
||||||
|
{
|
||||||
|
CollectNode(i, gameObjects);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public static void ExportAnimatorWithAnimationClip(AssetPreloadData animator, List<AssetPreloadData> animationList, string exportPath)
|
public static void ExportAnimatorWithAnimationClip(AssetPreloadData animator, List<AssetPreloadData> animationList, string exportPath)
|
||||||
{
|
{
|
||||||
ThreadPool.QueueUserWorkItem(state =>
|
ThreadPool.QueueUserWorkItem(state =>
|
||||||
|
@ -78,7 +78,6 @@
|
|||||||
<ClCompile Include="AssemblyInfo.cpp" />
|
<ClCompile Include="AssemblyInfo.cpp" />
|
||||||
<ClCompile Include="AssetStudioFBX.cpp" />
|
<ClCompile Include="AssetStudioFBX.cpp" />
|
||||||
<ClCompile Include="AssetStudioFBXExporter.cpp" />
|
<ClCompile Include="AssetStudioFBXExporter.cpp" />
|
||||||
<ClCompile Include="ImportedFBXExporter.cpp" />
|
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ClInclude Include="AssetStudioFBX.h" />
|
<ClInclude Include="AssetStudioFBX.h" />
|
||||||
|
@ -36,8 +36,8 @@ namespace AssetStudio {
|
|||||||
ref class Exporter
|
ref class Exporter
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
static void Export(String^ path, IImported^ imported, bool EulerFilter, float filterPrecision, String^ exportFormat, bool allFrames, bool allBones, bool skins, float boneSize, bool flatInbetween, bool compatibility);
|
static void Export(String^ path, IImported^ imported, bool EulerFilter, float filterPrecision, bool allFrames, bool allBones, bool skins, float boneSize, bool flatInbetween, bool compatibility);
|
||||||
static void ExportMorph(String^ path, IImported^ imported, String^ exportFormat, bool morphMask, bool flatInbetween, bool skins, float boneSize, bool compatibility);
|
static void ExportMorph(String^ path, IImported^ imported, bool morphMask, bool flatInbetween, bool skins, float boneSize, bool compatibility);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
HashSet<String^>^ frameNames;
|
HashSet<String^>^ frameNames;
|
||||||
@ -56,11 +56,10 @@ namespace AssetStudio {
|
|||||||
FbxArray<FbxNode*>* pMeshNodes;
|
FbxArray<FbxNode*>* pMeshNodes;
|
||||||
|
|
||||||
~Exporter();
|
~Exporter();
|
||||||
!Exporter();
|
|
||||||
void Fbx::Exporter::LinkTexture(ImportedMaterial^ mat, int attIndex, FbxFileTexture* pTexture, FbxProperty& prop);
|
void Fbx::Exporter::LinkTexture(ImportedMaterial^ mat, int attIndex, FbxFileTexture* pTexture, FbxProperty& prop);
|
||||||
void SetJointsNode(FbxNode* pNode, HashSet<String^>^ boneNames, bool allBones);
|
void SetJointsNode(FbxNode* pNode, HashSet<String^>^ boneNames, bool allBones);
|
||||||
|
|
||||||
Exporter(String^ path, IImported^ imported, String^ exportFormat, bool allFrames, bool allBones, bool skins, float boneSize, bool compatibility, bool normals);
|
Exporter(String^ path, IImported^ imported, bool allFrames, bool allBones, bool skins, float boneSize, bool compatibility, bool normals);
|
||||||
HashSet<String^>^ SearchHierarchy();
|
HashSet<String^>^ SearchHierarchy();
|
||||||
void SearchHierarchy(ImportedFrame^ frame, HashSet<String^>^ exportFrames);
|
void SearchHierarchy(ImportedFrame^ frame, HashSet<String^>^ exportFrames);
|
||||||
void SetJointsFromImportedMeshes(bool allBones);
|
void SetJointsFromImportedMeshes(bool allBones);
|
||||||
|
@ -78,7 +78,6 @@
|
|||||||
<ClCompile Include="AssemblyInfo.cpp" />
|
<ClCompile Include="AssemblyInfo.cpp" />
|
||||||
<ClCompile Include="AssetStudioFBX.cpp" />
|
<ClCompile Include="AssetStudioFBX.cpp" />
|
||||||
<ClCompile Include="AssetStudioFBXExporter.cpp" />
|
<ClCompile Include="AssetStudioFBXExporter.cpp" />
|
||||||
<ClCompile Include="ImportedFBXExporter.cpp" />
|
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ClInclude Include="AssetStudioFBX.h" />
|
<ClInclude Include="AssetStudioFBX.h" />
|
||||||
|
@ -14,9 +14,6 @@
|
|||||||
<ClCompile Include="AssemblyInfo.cpp">
|
<ClCompile Include="AssemblyInfo.cpp">
|
||||||
<Filter>源文件</Filter>
|
<Filter>源文件</Filter>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
<ClCompile Include="ImportedFBXExporter.cpp">
|
|
||||||
<Filter>源文件</Filter>
|
|
||||||
</ClCompile>
|
|
||||||
<ClCompile Include="AssetStudioFBX.cpp">
|
<ClCompile Include="AssetStudioFBX.cpp">
|
||||||
<Filter>源文件</Filter>
|
<Filter>源文件</Filter>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
Loading…
Reference in New Issue
Block a user