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

155 lines
7.1 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 LightExportTest : AnimationClipsExportTest
{
[SetUp]
public override void Init ()
{
fileNamePrefix = "_safe_to_delete__light_export_test";
base.Init ();
}
protected override FbxScene CreateScene (FbxManager manager)
{
FbxScene scene = base.CreateScene (manager);
FbxNode lightNode = scene.GetRootNode ().GetChild (0);
FbxLight light = FbxLight.Create (scene, "light");
light.LightType.Set(FbxLight.EType.eSpot);
light.InnerAngle.Set(20);
light.OuterAngle.Set(95);
// Export bounceIntensity as custom property
ExportFloatProperty (lightNode, 3, "bounceIntensity");
light.Color.Set (new FbxDouble3(0.3, 0.1, 0.75));
// Export colorTemperature as custom property
ExportFloatProperty (lightNode, 6, "colorTemperature");
light.FileName.Set ("/path/to/texture.png");
light.DrawGroundProjection.Set (true);
light.DrawVolumetricLight.Set (true);
light.DrawFrontFacingVolumetricLight.Set (false);
ExportFloatProperty (lightNode, 4.2f, "cookieSize");
light.Intensity.Set (120);
light.FarAttenuationStart.Set (0.01f /* none zero start */);
light.FarAttenuationEnd.Set(9.8f);
light.CastShadows.Set (true);
FbxAnimStack animStack = scene.GetCurrentAnimationStack ();
FbxAnimLayer animLayer = animStack.GetAnimLayerMember ();
// TODO: (UNI-19438) figure out why trying to add anim curves to FbxNodeAttribute.sColor,
// Intensity and InnerAngle fails
// add animation
CreateAnimCurves (lightNode, animLayer, new List<PropertyComponentPair> () {
new PropertyComponentPair ("colorTemperature", new string[]{null}),
new PropertyComponentPair ("cookieSize", new string[]{null})
}, (index) => { return (index + 1)/2.0; }, (index) => { return index%2; });
// set ambient lighting
scene.GetGlobalSettings ().SetAmbientColor (new FbxColor (0.1, 0.2, 0.3));
lightNode.SetNodeAttribute (light);
scene.GetRootNode ().AddChild (lightNode);
return scene;
}
protected FbxProperty ExportFloatProperty (FbxObject fbxObject, float value, string name)
{
var fbxProperty = FbxProperty.Create (fbxObject, Globals.FbxDoubleDT, name);
Assert.IsTrue (fbxProperty.IsValid ());
fbxProperty.Set (value);
// Must be marked user-defined or it won't be shown in most DCCs
fbxProperty.ModifyFlag (FbxPropertyFlags.EFlags.eUserDefined, true);
fbxProperty.ModifyFlag (FbxPropertyFlags.EFlags.eAnimatable, true);
return fbxProperty;
}
protected override void CheckScene (FbxScene scene)
{
base.CheckScene (scene);
FbxScene origScene = CreateScene (FbxManager);
FbxNode origLightNode = origScene.GetRootNode ().GetChild (0);
FbxNode importLightNode = scene.GetRootNode ().GetChild (0);
Assert.IsNotNull (origLightNode);
Assert.IsNotNull (importLightNode);
FbxLight origLight = origLightNode.GetLight ();
FbxLight importLight = importLightNode.GetLight ();
Assert.IsNotNull (origLight);
Assert.IsNotNull (importLight);
Assert.AreEqual (origLight.GetName (), importLight.GetName ());
// Check properties
CheckProperties(
origLightNode, importLightNode,
origLight, importLight,
new string[]{ "bounceIntensity", "colorTemperature", "cookieSize" }
);
// Check anim
FbxAnimStack origAnimStack = origScene.GetCurrentAnimationStack();
FbxAnimLayer origAnimLayer = origAnimStack.GetAnimLayerMember ();
Assert.IsNotNull (origAnimStack);
Assert.IsNotNull (origAnimLayer);
FbxAnimStack importAnimStack = scene.GetCurrentAnimationStack();
FbxAnimLayer importAnimLayer = importAnimStack.GetAnimLayerMember ();
Assert.IsNotNull (importAnimStack);
Assert.IsNotNull (importAnimLayer);
// TODO: (UNI-19438) figure out why trying to add anim curves to FbxNodeAttribute.sColor,
// Intensity and InnerAngle fails
CheckAnimCurve (origLightNode, importLightNode, origAnimLayer, importAnimLayer, new List<PropertyComponentPair>(){
new PropertyComponentPair ("colorTemperature", new string[]{null}),
new PropertyComponentPair ("cookieSize", new string[]{null})
}, origLight, importLight);
}
protected void CheckProperties(
FbxNode origLightNode, FbxNode importLightNode,
FbxLight origLight, FbxLight importLight, string[] customProperties)
{
Assert.AreEqual (origLight.LightType.Get (), importLight.LightType.Get ());
Assert.AreEqual (origLight.InnerAngle.Get (), importLight.InnerAngle.Get ());
Assert.AreEqual (origLight.OuterAngle.Get (), importLight.OuterAngle.Get ());
Assert.AreEqual (origLight.Color.Get (), importLight.Color.Get ());
Assert.AreEqual (origLight.FileName.Get (), importLight.FileName.Get ());
Assert.AreEqual (origLight.DrawGroundProjection.Get (), importLight.DrawGroundProjection.Get ());
Assert.AreEqual (origLight.DrawVolumetricLight.Get (), importLight.DrawVolumetricLight.Get ());
Assert.That (origLight.DrawFrontFacingVolumetricLight.Get (), Is.EqualTo(importLight.DrawFrontFacingVolumetricLight.Get ()).Within(2).Ulps);
Assert.AreEqual (origLight.Intensity.Get (), importLight.Intensity.Get ());
Assert.That (origLight.FarAttenuationStart.Get (), Is.EqualTo(importLight.FarAttenuationStart.Get ()).Within(2).Ulps);
Assert.That (origLight.FarAttenuationEnd.Get (), Is.EqualTo(importLight.FarAttenuationEnd.Get ()).Within(2).Ulps);
Assert.AreEqual (origLight.CastShadows.Get (), importLight.CastShadows.Get ());
foreach (var customProp in customProperties) {
var origProperty = origLightNode.FindProperty (customProp);
var importProperty = importLightNode.FindProperty (customProp);
Assert.IsNotNull (origProperty);
Assert.IsNotNull (importProperty);
Assert.AreEqual (origProperty.GetFloat (), importProperty.GetFloat ());
}
}
}
}