From d335aaef9ea13529aefe670c956364f3535c0a67 Mon Sep 17 00:00:00 2001 From: Perfare Date: Tue, 6 Aug 2019 09:48:21 +0800 Subject: [PATCH] improved --- AssetStudio/IImported.cs | 18 ++--- AssetStudioFBX/AssetStudioFBX.h | 2 +- AssetStudioFBX/AssetStudioFBXExporter.cpp | 91 ++++++++++++++--------- AssetStudioUtility/ModelConverter.cs | 17 +++-- 4 files changed, 73 insertions(+), 55 deletions(-) diff --git a/AssetStudio/IImported.cs b/AssetStudio/IImported.cs index aeb186c..187c5bb 100644 --- a/AssetStudio/IImported.cs +++ b/AssetStudio/IImported.cs @@ -134,6 +134,10 @@ namespace AssetStudio public string Path { get; set; } public List SubmeshList { get; set; } public List BoneList { get; set; } + public bool hasNormal { get; set; } + public bool hasUV { get; set; } + public bool hasTangent { get; set; } + public bool hasColor { get; set; } } public class ImportedSubmesh @@ -145,17 +149,13 @@ namespace AssetStudio public class ImportedVertex { - public Vector3 Position { get; set; } - public float[] Weights { get; set; } - public int[] BoneIndices { get; set; } + public Vector3 Vertex { get; set; } public Vector3 Normal { get; set; } public float[] UV { get; set; } public Vector4 Tangent { get; set; } - } - - public class ImportedVertexWithColour : ImportedVertex - { - public Color Colour { get; set; } + public Color Color { get; set; } + public float[] Weights { get; set; } + public int[] BoneIndices { get; set; } } public class ImportedFace @@ -234,8 +234,6 @@ namespace AssetStudio { public float time { get; set; } public T value { get; set; } - public T inSlope { get; set; } - public T outSlope { get; set; } public ImportedKeyframe(float time, T value) { diff --git a/AssetStudioFBX/AssetStudioFBX.h b/AssetStudioFBX/AssetStudioFBX.h index f9ee1ac..793da5d 100644 --- a/AssetStudioFBX/AssetStudioFBX.h +++ b/AssetStudioFBX/AssetStudioFBX.h @@ -76,7 +76,7 @@ namespace AssetStudio { void SearchHierarchy(ImportedFrame^ frame, HashSet^ exportFrames); void SetJointsFromImportedMeshes(bool allBones); void ExportFrame(FbxNode* pParentNode, ImportedFrame^ frame); - void ExportMesh(FbxNode* pFrameNode, ImportedMesh^ meshList); + void ExportMesh(FbxNode* pFrameNode, ImportedMesh^ iMesh); FbxFileTexture* ExportTexture(ImportedTexture^ matTex); void ExportAnimations(bool eulerFilter, float filterValue); void ExportKeyframedAnimation(ImportedKeyframedAnimation^ parser, FbxString& kTakeName, FbxAnimCurveFilterUnroll* eulerFilter, float filterPrecision); diff --git a/AssetStudioFBX/AssetStudioFBXExporter.cpp b/AssetStudioFBX/AssetStudioFBXExporter.cpp index 7e5b671..d9abab8 100644 --- a/AssetStudioFBX/AssetStudioFBXExporter.cpp +++ b/AssetStudioFBX/AssetStudioFBXExporter.cpp @@ -320,9 +320,9 @@ namespace AssetStudio } } - void Fbx::Exporter::ExportMesh(FbxNode* pFrameNode, ImportedMesh^ meshList) + void Fbx::Exporter::ExportMesh(FbxNode* pFrameNode, ImportedMesh^ iMesh) { - List^ boneList = meshList->BoneList; + List^ boneList = iMesh->BoneList; bool hasBones; if (exportSkins && boneList != nullptr) { @@ -365,29 +365,40 @@ namespace AssetStudio pFrameNode->SetNodeAttribute(pMesh); int vertexCount = 0; - for (int i = 0; i < meshList->SubmeshList->Count; i++) + for (int i = 0; i < iMesh->SubmeshList->Count; i++) { - vertexCount += meshList->SubmeshList[i]->VertexList->Count; + vertexCount += iMesh->SubmeshList[i]->VertexList->Count; } pMesh->InitControlPoints(vertexCount); FbxVector4* pControlPoints = pMesh->GetControlPoints(); - FbxGeometryElementNormal* lGeometryElementNormal = pMesh->CreateElementNormal(); - lGeometryElementNormal->SetMappingMode(FbxGeometryElement::eByControlPoint); - lGeometryElementNormal->SetReferenceMode(FbxGeometryElement::eDirect); + FbxGeometryElementNormal* lGeometryElementNormal = NULL; + if (iMesh->hasNormal) + { + lGeometryElementNormal = pMesh->CreateElementNormal(); + lGeometryElementNormal->SetMappingMode(FbxGeometryElement::eByControlPoint); + lGeometryElementNormal->SetReferenceMode(FbxGeometryElement::eDirect); + } - FbxGeometryElementUV* lGeometryElementUV = pMesh->CreateElementUV("UV0"); - lGeometryElementUV->SetMappingMode(FbxGeometryElement::eByControlPoint); - lGeometryElementUV->SetReferenceMode(FbxGeometryElement::eDirect); + FbxGeometryElementUV* lGeometryElementUV = NULL; + if (iMesh->hasUV) + { + lGeometryElementUV = pMesh->CreateElementUV("UV0"); + lGeometryElementUV->SetMappingMode(FbxGeometryElement::eByControlPoint); + lGeometryElementUV->SetReferenceMode(FbxGeometryElement::eDirect); + } - FbxGeometryElementTangent* lGeometryElementTangent = pMesh->CreateElementTangent(); - lGeometryElementTangent->SetMappingMode(FbxGeometryElement::eByControlPoint); - lGeometryElementTangent->SetReferenceMode(FbxGeometryElement::eDirect); + FbxGeometryElementTangent* lGeometryElementTangent = NULL; + if (iMesh->hasTangent) + { + lGeometryElementTangent = pMesh->CreateElementTangent(); + lGeometryElementTangent->SetMappingMode(FbxGeometryElement::eByControlPoint); + lGeometryElementTangent->SetReferenceMode(FbxGeometryElement::eDirect); + } - FbxGeometryElementVertexColor* lGeometryElementVertexColor = nullptr; - bool vertexColours = vertexCount > 0 && dynamic_cast(meshList->SubmeshList[0]->VertexList[0]) != nullptr; - if (vertexColours) + FbxGeometryElementVertexColor* lGeometryElementVertexColor = NULL; + if (iMesh->hasColor) { lGeometryElementVertexColor = pMesh->CreateElementVertexColor(); lGeometryElementVertexColor->SetMappingMode(FbxGeometryElement::eByControlPoint); @@ -399,9 +410,9 @@ namespace AssetStudio lGeometryElementMaterial->SetReferenceMode(FbxGeometryElement::eIndexToDirect); int firstVertex = 0; - for (int i = 0; i < meshList->SubmeshList->Count; i++) + for (int i = 0; i < iMesh->SubmeshList->Count; i++) { - ImportedSubmesh^ meshObj = meshList->SubmeshList[i]; + ImportedSubmesh^ meshObj = iMesh->SubmeshList[i]; List^ vertexList = meshObj->VertexList; List^ faceList = meshObj->FaceList; @@ -498,33 +509,39 @@ namespace AssetStudio for (int j = 0; j < vertexList->Count; j++) { - ImportedVertex^ vertex = vertexList[j]; + ImportedVertex^ iVertex = vertexList[j]; - Vector3 coords = vertex->Position; - pControlPoints[j + firstVertex] = FbxVector4(coords.X, coords.Y, coords.Z, 0); + Vector3 vertex = iVertex->Vertex; + pControlPoints[j + firstVertex] = FbxVector4(vertex.X, vertex.Y, vertex.Z, 0); - Vector3 normal = vertex->Normal; - lGeometryElementNormal->GetDirectArray().Add(FbxVector4(normal.X, normal.Y, normal.Z, 0)); - - array^ uv = vertex->UV; - if (uv != nullptr) + if (iMesh->hasNormal) { + Vector3 normal = iVertex->Normal; + lGeometryElementNormal->GetDirectArray().Add(FbxVector4(normal.X, normal.Y, normal.Z, 0)); + } + + if (iMesh->hasUV) + { + array^ uv = iVertex->UV; lGeometryElementUV->GetDirectArray().Add(FbxVector2(uv[0], uv[1])); } - Vector4 tangent = vertex->Tangent; - lGeometryElementTangent->GetDirectArray().Add(FbxVector4(tangent.X, tangent.Y, tangent.Z, tangent.W)); - - if (vertexColours) + if (iMesh->hasTangent) { - ImportedVertexWithColour^ vert = (ImportedVertexWithColour^)vertexList[j]; - lGeometryElementVertexColor->GetDirectArray().Add(FbxColor(vert->Colour.R, vert->Colour.G, vert->Colour.B, vert->Colour.A)); + Vector4 tangent = iVertex->Tangent; + lGeometryElementTangent->GetDirectArray().Add(FbxVector4(tangent.X, tangent.Y, tangent.Z, tangent.W)); } - if (hasBones && vertex->BoneIndices != nullptr) + if (iMesh->hasColor) { - auto boneIndices = vertex->BoneIndices; - auto weights4 = vertex->Weights; + auto color = iVertex->Color; + lGeometryElementVertexColor->GetDirectArray().Add(FbxColor(color.R, color.G, color.B, color.A)); + } + + if (hasBones && iVertex->BoneIndices != nullptr) + { + auto boneIndices = iVertex->BoneIndices; + auto weights4 = iVertex->Weights; for (int k = 0; k < 4; k++) { if (boneIndices[k] < boneList->Count && weights4[k] > 0) @@ -866,8 +883,8 @@ namespace AssetStudio for (int j = 0; j < keyframe->VertexList->Count; j++) { auto index = keyframe->VertexList[j]->Index; - auto coords = keyframe->VertexList[j]->Vertex->Position; - lVector4[index] = FbxVector4(coords.X, coords.Y, coords.Z, 0); + auto vertex = keyframe->VertexList[j]->Vertex->Vertex; + lVector4[index] = FbxVector4(vertex.X, vertex.Y, vertex.Z, 0); } } } diff --git a/AssetStudioUtility/ModelConverter.cs b/AssetStudioUtility/ModelConverter.cs index acf7236..dd52764 100644 --- a/AssetStudioUtility/ModelConverter.cs +++ b/AssetStudioUtility/ModelConverter.cs @@ -305,20 +305,20 @@ namespace AssetStudio ImportedMaterial iMat = ConvertMaterial(mat); iSubmesh.Material = iMat.Name; iSubmesh.VertexList = new List((int)submesh.vertexCount); - var vertexColours = mesh.m_Colors != null && (mesh.m_Colors.Length == mesh.m_VertexCount * 3 || mesh.m_Colors.Length == mesh.m_VertexCount * 4); for (var j = mesh.m_SubMeshes[i].firstVertex; j < mesh.m_SubMeshes[i].firstVertex + mesh.m_SubMeshes[i].vertexCount; j++) { - var iVertex = vertexColours ? new ImportedVertexWithColour() : new ImportedVertex(); + var iVertex = new ImportedVertex(); //Vertices int c = 3; if (mesh.m_Vertices.Length == mesh.m_VertexCount * 4) { c = 4; } - iVertex.Position = new Vector3(-mesh.m_Vertices[j * c], mesh.m_Vertices[j * c + 1], mesh.m_Vertices[j * c + 2]); + iVertex.Vertex = new Vector3(-mesh.m_Vertices[j * c], mesh.m_Vertices[j * c + 1], mesh.m_Vertices[j * c + 2]); //Normals if (mesh.m_Normals?.Length > 0) { + iMesh.hasNormal = true; if (mesh.m_Normals.Length == mesh.m_VertexCount * 3) { c = 3; @@ -330,20 +330,22 @@ namespace AssetStudio iVertex.Normal = new Vector3(-mesh.m_Normals[j * c], mesh.m_Normals[j * c + 1], mesh.m_Normals[j * c + 2]); } //Colors - if (vertexColours) + if (mesh.m_Colors?.Length > 0) { + iMesh.hasColor = true; if (mesh.m_Colors.Length == mesh.m_VertexCount * 3) { - ((ImportedVertexWithColour)iVertex).Colour = new Color(mesh.m_Colors[j * 3], mesh.m_Colors[j * 3 + 1], mesh.m_Colors[j * 3 + 2], 1.0f); + iVertex.Color = new Color(mesh.m_Colors[j * 3], mesh.m_Colors[j * 3 + 1], mesh.m_Colors[j * 3 + 2], 1.0f); } else { - ((ImportedVertexWithColour)iVertex).Colour = new Color(mesh.m_Colors[j * 4], mesh.m_Colors[j * 4 + 1], mesh.m_Colors[j * 4 + 2], mesh.m_Colors[j * 4 + 3]); + iVertex.Color = new Color(mesh.m_Colors[j * 4], mesh.m_Colors[j * 4 + 1], mesh.m_Colors[j * 4 + 2], mesh.m_Colors[j * 4 + 3]); } } //UV if (mesh.m_UV0?.Length > 0) { + iMesh.hasUV = true; if (mesh.m_UV0.Length == mesh.m_VertexCount * 2) { c = 2; @@ -357,6 +359,7 @@ namespace AssetStudio //Tangent if (mesh.m_Tangents != null && mesh.m_Tangents.Length == mesh.m_VertexCount * 4) { + iMesh.hasTangent = true; iVertex.Tangent = new Vector4(-mesh.m_Tangents[j * 4], mesh.m_Tangents[j * 4 + 1], mesh.m_Tangents[j * 4 + 2], -mesh.m_Tangents[j * 4 + 3]); } //BoneInfluence @@ -508,7 +511,7 @@ namespace AssetStudio var sourceVertex = GetSourceVertex(iMesh.SubmeshList, (int)morphVertex.index); destVertex.Vertex = new ImportedVertex(); var morphPos = morphVertex.vertex; - destVertex.Vertex.Position = sourceVertex.Position + new Vector3(-morphPos.X, morphPos.Y, morphPos.Z); + destVertex.Vertex.Vertex = sourceVertex.Vertex + new Vector3(-morphPos.X, morphPos.Y, morphPos.Z); if (shape.hasNormals) { var morphNormal = morphVertex.normal;