2025-03-11 15:30:07 +08:00

82 lines
2.9 KiB
C#

// ***********************************************************************
// Copyright (c) 2017 Unity Technologies. All rights reserved.
//
// Licensed under the ##LICENSENAME##.
// See LICENSE.md file in the project root for full license information.
// ***********************************************************************
using NUnit.Framework;
using System.Collections.Generic;
using Autodesk.Fbx;
namespace Autodesk.Fbx.UseCaseTests
{
internal class InstancesExportTest : TransformExportTest
{
protected string m_meshName = "shared mesh";
protected string m_materialName = "shared material";
protected override FbxScene CreateScene (FbxManager manager)
{
FbxScene scene = base.CreateScene (manager);
// mesh shared by all instances
FbxMesh sharedMesh = FbxMesh.Create (scene, m_meshName);
FbxSurfaceMaterial sharedMaterial = FbxSurfacePhong.Create (scene, m_materialName);
// add mesh to all nodes
Queue<FbxNode> nodes = new Queue<FbxNode>();
for (int i = 0; i < scene.GetRootNode ().GetChildCount (); i++) {
nodes.Enqueue (scene.GetRootNode ().GetChild (i));
}
while (nodes.Count > 0) {
FbxNode node = nodes.Dequeue ();
node.SetNodeAttribute (sharedMesh);
node.AddMaterial(sharedMaterial);
for (int i = 0; i < node.GetChildCount (); i++) {
nodes.Enqueue (node.GetChild (i));
}
}
return scene;
}
protected override void CheckScene (FbxScene scene)
{
base.CheckScene (scene);
FbxNode rootNode = scene.GetRootNode ().GetChild(0);
Assert.IsNotNull (rootNode);
FbxMesh sharedMesh = rootNode.GetMesh ();
Assert.IsNotNull (sharedMesh);
Assert.AreEqual (m_meshName, sharedMesh.GetName ());
int matIndex = rootNode.GetMaterialIndex (m_materialName);
Assert.GreaterOrEqual (matIndex, 0);
FbxSurfaceMaterial sharedMat = rootNode.GetMaterial(matIndex);
Assert.IsNotNull (sharedMat);
// check that the mesh is the same for all children
CheckSceneHelper (rootNode, sharedMesh, sharedMat);
}
private void CheckSceneHelper(FbxNode node, FbxMesh mesh, FbxSurfaceMaterial material)
{
if (node == null) {
return;
}
Assert.AreEqual (mesh, node.GetMesh ());
int matIndex = node.GetMaterialIndex (m_materialName);
Assert.GreaterOrEqual (matIndex, 0);
Assert.AreEqual (material, node.GetMaterial (matIndex));
for (int i = 0; i < node.GetChildCount (); i++) {
// recurse through the hierarchy
CheckSceneHelper (node.GetChild (i), mesh, material);
}
}
}
}