Merge pull request #143 from dwango/fix_same_mesh_but_different_material

Fix same mesh but different material
This commit is contained in:
yutopp
2019-01-28 16:52:30 +09:00
committed by GitHub
2 changed files with 83 additions and 10 deletions

View File

@@ -461,7 +461,7 @@ namespace UniGLTF
var model = new glTFSkin()
{
name = "b",
joints = new int[] {1},
joints = new int[] { 1 },
};
var json = model.ToJson();
@@ -482,7 +482,7 @@ namespace UniGLTF
var model = new glTFSkin()
{
name = "",
joints = new int[] {1},
joints = new int[] { 1 },
};
var json = model.ToJson();
@@ -523,7 +523,7 @@ namespace UniGLTF
var model = new glTFSkin()
{
name = "b",
joints = new int[] {},
joints = new int[] { },
};
var c = new JsonSchemaValidationContext("")
@@ -574,5 +574,78 @@ namespace UniGLTF
);
Assert.AreEqual("[version.String] null", ex.Message);
}
[Test]
public void SameMeshButDifferentMaterialExport()
{
var go = new GameObject("same_mesh");
try
{
var shader = Shader.Find("Unlit/Color");
var cubeA = GameObject.CreatePrimitive(PrimitiveType.Cube);
{
cubeA.transform.SetParent(go.transform);
var material = new Material(shader);
material.name = "red";
material.color = Color.red;
cubeA.GetComponent<Renderer>().sharedMaterial = material;
}
{
var cubeB = GameObject.Instantiate(cubeA);
cubeB.transform.SetParent(go.transform);
var material = new Material(shader);
material.color = Color.blue;
material.name = "blue";
cubeB.GetComponent<Renderer>().sharedMaterial = material;
Assert.AreEqual(cubeB.GetComponent<MeshFilter>().sharedMesh, cubeA.GetComponent<MeshFilter>().sharedMesh);
}
// export
var gltf = new glTF();
var json = default(string);
using (var exporter = new gltfExporter(gltf))
{
exporter.Prepare(go);
exporter.Export();
json = gltf.ToJson();
}
Assert.AreEqual(2, gltf.meshes.Count);
var red = gltf.materials[gltf.meshes[0].primitives[0].material];
Assert.AreEqual(new float[] { 1, 0, 0, 1 }, red.pbrMetallicRoughness.baseColorFactor);
var blue = gltf.materials[gltf.meshes[1].primitives[0].material];
Assert.AreEqual(new float[] { 0, 0, 1, 1 }, blue.pbrMetallicRoughness.baseColorFactor);
Assert.AreEqual(2, gltf.nodes.Count);
Assert.AreNotEqual(gltf.nodes[0].mesh, gltf.nodes[1].mesh);
// import
var context = new ImporterContext();
context.ParseJson(json, new SimpleStorage(new ArraySegment<byte>(new byte[1024 * 1024])));
//Debug.LogFormat("{0}", context.Json);
context.Load();
var importedRed = context.Root.transform.GetChild(0);
var importedRedMaterial = importedRed.GetComponent<Renderer>().sharedMaterial;
Assert.AreEqual("red", importedRedMaterial.name);
Assert.AreEqual(Color.red, importedRedMaterial.color);
var importedBlue = context.Root.transform.GetChild(1);
var importedBlueMaterial = importedBlue.GetComponent<Renderer>().sharedMaterial;
Assert.AreEqual("blue", importedBlueMaterial.name);
Assert.AreEqual(Color.blue, importedBlueMaterial.color);
}
finally
{
GameObject.DestroyImmediate(go);
}
}
}
}

View File

@@ -151,7 +151,7 @@ namespace UniGLTF
}
#region Export
static glTFNode ExportNode(Transform x, List<Transform> nodes, List<Mesh> meshes, List<SkinnedMeshRenderer> skins)
static glTFNode ExportNode(Transform x, List<Transform> nodes, List<Renderer> renderers, List<SkinnedMeshRenderer> skins)
{
var node = new glTFNode
{
@@ -164,16 +164,16 @@ namespace UniGLTF
if (x.gameObject.activeInHierarchy)
{
var meshFilter = x.GetComponent<MeshFilter>();
if (meshFilter != null)
var meshRenderer = x.GetComponent<MeshRenderer>();
if (meshRenderer != null)
{
node.mesh = meshes.IndexOf(meshFilter.sharedMesh);
node.mesh = renderers.IndexOf(meshRenderer);
}
var skinnredMeshRenderer = x.GetComponent<SkinnedMeshRenderer>();
if (skinnredMeshRenderer != null)
{
node.mesh = meshes.IndexOf(skinnredMeshRenderer.sharedMesh);
node.mesh = renderers.IndexOf(skinnredMeshRenderer);
node.skin = skins.IndexOf(skinnredMeshRenderer);
}
}
@@ -244,14 +244,14 @@ namespace UniGLTF
Meshes = unityMeshes.Select(x => x.Mesh).ToList();
#endregion
#region Skins
#region Nodes and Skins
var unitySkins = Nodes
.Select(x => x.GetComponent<SkinnedMeshRenderer>()).Where(x =>
x != null
&& x.bones != null
&& x.bones.Length > 0)
.ToList();
gltf.nodes = Nodes.Select(x => ExportNode(x, Nodes, unityMeshes.Select(y => y.Mesh).ToList(), unitySkins)).ToList();
gltf.nodes = Nodes.Select(x => ExportNode(x, Nodes, unityMeshes.Select(y => y.Rendererer).ToList(), unitySkins)).ToList();
gltf.scenes = new List<gltfScene>
{
new gltfScene