mirror of
https://github.com/vrm-c/UniVRM.git
synced 2026-09-10 04:49:28 -05:00
Merge pull request #143 from dwango/fix_same_mesh_but_different_material
Fix same mesh but different material
This commit is contained in:
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user