Skip to content

Commit

Permalink
Fixes and improvements to material and model stuff.
Browse files Browse the repository at this point in the history
  • Loading branch information
BobDoleOwndU committed Feb 6, 2018
1 parent 88466d3 commit 8b030a1
Show file tree
Hide file tree
Showing 6 changed files with 87 additions and 23 deletions.
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -75,3 +75,5 @@ FMDL-Studio-v2/.vs/FMDL-Studio-v2/v15/sqlite3/storage.ide
/FMDL-Studio-v2/Assets/Scripts/Data/sna0_main0_def.fbx.meta
/FMDL-Studio-v2/Assets/Scripts/Data/sna0_main0_def.fbx
/FMDL-Studio-v2/Debug - Shortcut.lnk
/FMDL-Studio-v2/Assets/tpp
/FMDL-Studio-v2/Assets/tpp.meta
13 changes: 12 additions & 1 deletion FMDL-Studio-v2/Assets/Editor/FmdlStudioWindow.cs
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@ public static void ExportFMDLOption()
if (!string.IsNullOrWhiteSpace(windowPath))
{
FmdlExporter.FMDLWrite(windowPath);
UnityEngine.Debug.Log("Fmdl Exported to: " + windowPath);
Debug.Log("Fmdl Exported to: " + windowPath);
} //if
else
Debug.Log("No path selected.");
Expand Down Expand Up @@ -75,4 +75,15 @@ public static void GenerateBoundingBoxes()
else
Debug.Log("No objects selected.");
} //GenerateBoundingBoxes

[MenuItem("FMDL Studio/Fix Tangents", false, 102)]
public static void FixTangents()
{
if (Selection.activeGameObject != null)
{
Utils.FixTangents(Selection.activeGameObject.transform);
} //if
else
Debug.Log("No objects selected.");
} //FixTangents
} //class
10 changes: 3 additions & 7 deletions FMDL-Studio-v2/Assets/Editor/MaterialEditorWindow.cs
Original file line number Diff line number Diff line change
Expand Up @@ -81,15 +81,11 @@ private void ApplyMaterialToMesh()
if(g.GetComponent<MeshRenderer>())
{
MeshRenderer renderer = g.GetComponent<MeshRenderer>();
Material m = new Material(Shader.Find($"FoxShaders/{Globals.foxMaterialList.foxMaterials[selected].type}"));
m.name = renderer.sharedMaterial.name;
renderer.sharedMaterial.shader = Shader.Find($"FoxShaders/{Globals.foxMaterialList.foxMaterials[selected].type}");
//m.name = renderer.sharedMaterial.name;

foreach(FoxMaterial.FoxMaterialParameter f in Globals.foxMaterialList.foxMaterials[selected].materialParameters)
{
m.SetVector(f.name, new Vector4(f.values[0], f.values[1], f.values[2], f.values[3]));
} //foreach

renderer.sharedMaterial = m;
renderer.sharedMaterial.SetVector(f.name, new Vector4(f.values[0], f.values[1], f.values[2], f.values[3]));
} //if
else if(g.GetComponent<SkinnedMeshRenderer>())
{
Expand Down
9 changes: 6 additions & 3 deletions FMDL-Studio-v2/Assets/Scripts/Data/Fmdl.cs
Original file line number Diff line number Diff line change
Expand Up @@ -3042,15 +3042,15 @@ private List<FoxMaterial> GetMaterials(List<Material> materialInstances)

if (index != -1)
{
if(!materials.Contains(materials.Find(x => x.name == Globals.foxMaterialList.foxMaterials[index].name)))
if (!materials.Contains(materials.Find(x => x.name == Globals.foxMaterialList.foxMaterials[index].name)))
{
FoxMaterial f = new FoxMaterial();
f.name = Globals.foxMaterialList.foxMaterials[index].name;
f.type = Globals.foxMaterialList.foxMaterials[index].type;

for(int j = 0; j < ShaderUtil.GetPropertyCount(materialInstances[i].shader); j++)
for (int j = 0; j < ShaderUtil.GetPropertyCount(materialInstances[i].shader); j++)
{
if(ShaderUtil.GetPropertyType(materialInstances[i].shader, j) == ShaderUtil.ShaderPropertyType.Vector)
if (ShaderUtil.GetPropertyType(materialInstances[i].shader, j) == ShaderUtil.ShaderPropertyType.Vector)
{
FoxMaterial.FoxMaterialParameter p = new FoxMaterial.FoxMaterialParameter();
p.name = ShaderUtil.GetPropertyName(materialInstances[i].shader, j);
Expand All @@ -3063,7 +3063,10 @@ private List<FoxMaterial> GetMaterials(List<Material> materialInstances)
} //if
} //if
else
{
UnityEngine.Debug.Log(shaderName);
throw new Exception("Material not in material list!");
} //else
} //for

/*for (int i = 0; i < foxModel.materialDefinitions.Length; i++)
Expand Down
44 changes: 43 additions & 1 deletion FMDL-Studio-v2/Assets/Scripts/Tools/FBXConverter.cs
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@ public static void ConvertToFBX(GameObject gameObject, string filePath)
StringBuilder fbx = new StringBuilder();
StringBuilder header = new StringBuilder();

Utils.GetNumObjects(gameObject.transform, ref numModelObjects);
GetNumObjects(gameObject.transform, ref numModelObjects);

objects.Add(new Tuple<int, GameObject>(1000000000, gameObject));

Expand Down Expand Up @@ -112,6 +112,34 @@ public static void ConvertToFBX(GameObject gameObject, string filePath)
fbx.Append("\n\t\t\t}");
fbx.Append("\n\t\t}");

//Binormals
fbx.Append("\n\t\tLayerElementBinormal: 0 {");
fbx.Append("\n\t\t\tVersion: 102");
fbx.Append("\n\t\t\tName: \"Binormals\"");
fbx.Append("\n\t\t\tMappingInformationType: \"ByPolygonVertex\"");
fbx.Append("\n\t\t\tReferenceInformationType: \"Direct\"");
fbx.AppendFormat("\n\t\t\tBinormals: *{0} {{", meshes[i].Item2.sharedMesh.triangles.Length * 3);
fbx.Append("\n\t\t\t\ta: ");
for (int j = 0; j < meshes[i].Item2.sharedMesh.triangles.Length / 3; j++)
{
Vector3 binormal0 = Vector3.Cross(meshes[i].Item2.sharedMesh.normals[meshes[i].Item2.sharedMesh.triangles[j * 3]], new Vector3(meshes[i].Item2.sharedMesh.tangents[meshes[i].Item2.sharedMesh.triangles[j * 3]].x, meshes[i].Item2.sharedMesh.tangents[meshes[i].Item2.sharedMesh.triangles[j * 3]].y, meshes[i].Item2.sharedMesh.tangents[meshes[i].Item2.sharedMesh.triangles[j * 3]].z));
Vector3 binormal1 = Vector3.Cross(meshes[i].Item2.sharedMesh.normals[meshes[i].Item2.sharedMesh.triangles[j * 3 + 2]], new Vector3(meshes[i].Item2.sharedMesh.tangents[meshes[i].Item2.sharedMesh.triangles[j * 3 + 2]].x, meshes[i].Item2.sharedMesh.tangents[meshes[i].Item2.sharedMesh.triangles[j * 3 + 2]].y, meshes[i].Item2.sharedMesh.tangents[meshes[i].Item2.sharedMesh.triangles[j * 3 + 2]].z));
Vector3 binormal2 = Vector3.Cross(meshes[i].Item2.sharedMesh.normals[meshes[i].Item2.sharedMesh.triangles[j * 3 + 1]], new Vector3(meshes[i].Item2.sharedMesh.tangents[meshes[i].Item2.sharedMesh.triangles[j * 3 + 1]].x, meshes[i].Item2.sharedMesh.tangents[meshes[i].Item2.sharedMesh.triangles[j * 3 + 1]].y, meshes[i].Item2.sharedMesh.tangents[meshes[i].Item2.sharedMesh.triangles[j * 3 + 1]].z));

fbx.AppendFormat("{0},{1},{2},", binormal0.x, binormal0.y, -binormal0.z);
fbx.AppendFormat("{0},{1},{2},", binormal1.x, binormal1.y, -binormal1.z);
fbx.AppendFormat("{0},{1},{2},", binormal2.x, binormal2.y, -binormal2.z);
} //for
fbx.Length--;
fbx.Append("\n\t\t\t}");
fbx.AppendFormat("\n\t\t\tBinormalsW: *{0} {{", meshes[i].Item2.sharedMesh.triangles.Length);
fbx.Append("\n\t\t\t\ta: ");
for (int j = 0; j < meshes[i].Item2.sharedMesh.triangles.Length; j++)
fbx.Append("1,");
fbx.Length--;
fbx.Append("\n\t\t\t}");
fbx.Append("\n\t\t}");

//Tangents
fbx.Append("\n\t\tLayerElementTangent: 0 {");
fbx.Append("\n\t\t\tVersion: 102");
Expand Down Expand Up @@ -258,6 +286,10 @@ public static void ConvertToFBX(GameObject gameObject, string filePath)
fbx.Append("\n\t\t\t\tTypedIndex: 0");
fbx.Append("\n\t\t\t}");
fbx.Append("\n\t\t\tLayerElement: {");
fbx.Append("\n\t\t\t\tType: \"LayerElementBinormal\"");
fbx.Append("\n\t\t\t\tTypedIndex: 0");
fbx.Append("\n\t\t\t}");
fbx.Append("\n\t\t\tLayerElement: {");
fbx.Append("\n\t\t\t\tType: \"LayerElementTangent\"");
fbx.Append("\n\t\t\t\tTypedIndex: 0");
fbx.Append("\n\t\t\t}");
Expand Down Expand Up @@ -1019,6 +1051,16 @@ private static void GetMeshes(Transform transform)
} //foreach
} //GetMeshes ends

private static void GetNumObjects(Transform transform, ref int count)
{
foreach (Transform t in transform)
{
count++;
GetNumObjects(t, ref count);
} //foreach
} //GetNumObjects


private static void GetGameObjects(Transform transform)
{
foreach (Transform t in transform)
Expand Down
32 changes: 21 additions & 11 deletions FMDL-Studio-v2/Assets/Scripts/Tools/Utils.cs
Original file line number Diff line number Diff line change
Expand Up @@ -3,24 +3,34 @@

public static class Utils
{
public static void GetMeshes(Transform transform, List<SkinnedMeshRenderer> meshes)
public static void FixTangents(Transform transform)
{
List<Mesh> meshes = new List<Mesh>(0);
GetMeshes(transform, meshes);

for(int i = 0; i < meshes.Count; i++)
{
Vector4[] tangents = meshes[i].tangents;

for(int j = 0; j < tangents.Length; j++)
{
tangents[j].y *= -1;
tangents[j].w *= -1;
} //for

meshes[i].tangents = tangents;
} //for
} //FixTangents

private static void GetMeshes(Transform transform, List<Mesh> meshes)
{
foreach (Transform t in transform)
{
if (t.gameObject.GetComponent<SkinnedMeshRenderer>())
{
meshes.Add(t.gameObject.GetComponent<SkinnedMeshRenderer>());
meshes.Add(t.gameObject.GetComponent<SkinnedMeshRenderer>().sharedMesh);
GetMeshes(t, meshes);
} //if
} //foreach
} //GetMeshes ends

public static void GetNumObjects(Transform transform, ref int count)
{
foreach (Transform t in transform)
{
count++;
GetNumObjects(t, ref count);
} //foreach
} //GetNumObjects
} //class

0 comments on commit 8b030a1

Please sign in to comment.