minor improvements

This commit is contained in:
Perfare 2018-11-25 15:50:28 +08:00
parent ab24f049cf
commit 96ea522e83
3 changed files with 19 additions and 30 deletions

View File

@ -8,7 +8,7 @@ namespace AssetStudio
{ {
public interface IImported public interface IImported
{ {
List<ImportedFrame> FrameList { get; } ImportedFrame RootFrame { get; }
List<ImportedMesh> MeshList { get; } List<ImportedMesh> MeshList { get; }
List<ImportedMaterial> MaterialList { get; } List<ImportedMaterial> MaterialList { get; }
List<ImportedTexture> TextureList { get; } List<ImportedTexture> TextureList { get; }

View File

@ -111,7 +111,7 @@ namespace AssetStudio
} }
pMeshNodes = imported->MeshList != nullptr ? new FbxArray<FbxNode*>(imported->MeshList->Count) : NULL; pMeshNodes = imported->MeshList != nullptr ? new FbxArray<FbxNode*>(imported->MeshList->Count) : NULL;
ExportFrame(pScene->GetRootNode(), imported->FrameList[0]); ExportFrame(pScene->GetRootNode(), imported->RootFrame);
if (imported->MeshList != nullptr) if (imported->MeshList != nullptr)
{ {
@ -207,7 +207,7 @@ namespace AssetStudio
return nullptr; return nullptr;
} }
HashSet<String^>^ exportFrames = gcnew HashSet<String^>(); HashSet<String^>^ exportFrames = gcnew HashSet<String^>();
SearchHierarchy(imported->FrameList[0], exportFrames); SearchHierarchy(imported->RootFrame, exportFrames);
return exportFrames; return exportFrames;
} }
@ -230,7 +230,7 @@ namespace AssetStudio
{ {
if (!exportFrames->Contains(boneList[i]->Name)) if (!exportFrames->Contains(boneList[i]->Name))
{ {
ImportedFrame^ boneParent = ImportedHelpers::FindChildOrRoot(boneList[i]->Name, imported->FrameList[0]); ImportedFrame^ boneParent = ImportedHelpers::FindChildOrRoot(boneList[i]->Name, imported->RootFrame);
while (boneParent != nullptr) while (boneParent != nullptr)
{ {
exportFrames->Add(boneParent->Name); exportFrames->Add(boneParent->Name);
@ -751,7 +751,7 @@ namespace AssetStudio
ImportedAnimationKeyframedTrack^ keyframeList = pAnimationList[j]; ImportedAnimationKeyframedTrack^ keyframeList = pAnimationList[j];
String^ name = keyframeList->Name; String^ name = keyframeList->Name;
int dotPos = name->IndexOf('.'); int dotPos = name->IndexOf('.');
if (dotPos >= 0 && !ImportedHelpers::FindChildOrRoot(name, imported->FrameList[0])) if (dotPos >= 0 && !ImportedHelpers::FindChildOrRoot(name, imported->RootFrame))
{ {
name = name->Substring(0, dotPos); name = name->Substring(0, dotPos);
} }

View File

@ -10,7 +10,7 @@ namespace AssetStudio
{ {
public class ModelConverter : IImported public class ModelConverter : IImported
{ {
public List<ImportedFrame> FrameList { get; protected set; } = new List<ImportedFrame>(); public ImportedFrame RootFrame { get; protected set; }
public List<ImportedMesh> MeshList { get; protected set; } = new List<ImportedMesh>(); public List<ImportedMesh> MeshList { get; protected set; } = new List<ImportedMesh>();
public List<ImportedMaterial> MaterialList { get; protected set; } = new List<ImportedMaterial>(); public List<ImportedMaterial> MaterialList { get; protected set; } = new List<ImportedMaterial>();
public List<ImportedTexture> TextureList { get; protected set; } = new List<ImportedTexture>(); public List<ImportedTexture> TextureList { get; protected set; } = new List<ImportedTexture>();
@ -95,7 +95,7 @@ namespace AssetStudio
} }
if (frameList.Count > 0) if (frameList.Count > 0)
{ {
FrameList.Add(frameList[frameList.Count - 1]); RootFrame = frameList[frameList.Count - 1];
for (var i = frameList.Count - 2; i >= 0; i--) for (var i = frameList.Count - 2; i >= 0; i--)
{ {
var frame = frameList[i]; var frame = frameList[i];
@ -218,7 +218,7 @@ namespace AssetStudio
var frame = ConvertFrame(trans); var frame = ConvertFrame(trans);
if (parent == null) if (parent == null)
{ {
FrameList.Add(frame); RootFrame = frame;
} }
else else
{ {
@ -521,24 +521,14 @@ namespace AssetStudio
if (combine) if (combine)
{ {
meshR.m_GameObject.TryGet(out var m_GameObject); meshR.m_GameObject.TryGet(out var m_GameObject);
var frame = ImportedHelpers.FindChildOrRoot(m_GameObject.m_Name, FrameList[0]); var frame = ImportedHelpers.FindChildOrRoot(m_GameObject.m_Name, RootFrame);
if (frame?.Parent != null) frame.LocalPosition = RootFrame.LocalPosition;
frame.LocalRotation = RootFrame.LocalRotation;
while (frame.Parent != null)
{ {
var parent = frame; frame = frame.Parent;
while (true) frame.LocalPosition = RootFrame.LocalPosition;
{ frame.LocalRotation = RootFrame.LocalRotation;
if (parent.Parent != null)
{
parent = parent.Parent;
}
else
{
frame.LocalRotation = parent.LocalRotation;
frame.LocalScale = parent.LocalScale;
frame.LocalPosition = parent.LocalPosition;
break;
}
}
} }
} }
@ -572,7 +562,7 @@ namespace AssetStudio
private string GetMeshPath(Transform meshTransform) private string GetMeshPath(Transform meshTransform)
{ {
meshTransform.m_GameObject.TryGet(out var m_GameObject); meshTransform.m_GameObject.TryGet(out var m_GameObject);
var curFrame = ImportedHelpers.FindChildOrRoot(m_GameObject.m_Name, FrameList[0]); var curFrame = ImportedHelpers.FindChildOrRoot(m_GameObject.m_Name, RootFrame);
var path = curFrame.Name; var path = curFrame.Name;
while (curFrame.Parent != null) while (curFrame.Parent != null)
{ {
@ -1019,7 +1009,6 @@ namespace AssetStudio
} }
// 2. Restore the original transform hierarchy // 2. Restore the original transform hierarchy
// Prerequisite: skeletonPaths follow pre-order traversal // Prerequisite: skeletonPaths follow pre-order traversal
var rootFrame = FrameList[0];
for (var i = 1; i < skeletonPaths.Count; i++) // start from 1, skip the root transform because it will always be there. for (var i = 1; i < skeletonPaths.Count; i++) // start from 1, skip the root transform because it will always be there.
{ {
var path = skeletonPaths[i]; var path = skeletonPaths[i];
@ -1029,19 +1018,19 @@ namespace AssetStudio
if (strs.Length == 1) if (strs.Length == 1)
{ {
transformName = path; transformName = path;
parentFrame = rootFrame; parentFrame = RootFrame;
} }
else else
{ {
transformName = strs.Last(); transformName = strs.Last();
var parentFrameName = strs[strs.Length - 2]; var parentFrameName = strs[strs.Length - 2];
parentFrame = ImportedHelpers.FindChildOrRoot(parentFrameName, rootFrame); parentFrame = ImportedHelpers.FindChildOrRoot(parentFrameName, RootFrame);
} }
var skeletonPose = avatar.m_Avatar.m_DefaultPose; var skeletonPose = avatar.m_Avatar.m_DefaultPose;
var xform = skeletonPose.m_X[i]; var xform = skeletonPose.m_X[i];
var frame = ImportedHelpers.FindChildOrRoot(transformName, rootFrame); var frame = ImportedHelpers.FindChildOrRoot(transformName, RootFrame);
if (frame != null) if (frame != null)
{ {
SetFrame(frame, xform.t, xform.q, xform.s); SetFrame(frame, xform.t, xform.q, xform.s);