dev/HumanoidRetargeter.Tests/Target/FbxMaterialColorTests.cs
using System.Numerics;
using HumanoidRetargeter.Formats.Fbx;
using Xunit;
namespace HumanoidRetargeter.Tests.Target;
public class FbxMaterialColorTests
{
[Theory]
[InlineData("DiffuseColor", 0.4f)]
[InlineData("Diffuse", 0.5f)]
public void PreservesSolidColorsAndAppliesFactorOnlyOnce(string property, float expected)
{
var material = new FbxNode("Material");
var properties = new FbxNode("Properties70");
material.Children.Add(properties);
properties.Children.Add(Property(property, 0.5, 0.25, 1.0));
properties.Children.Add(Property("DiffuseFactor", 0.8));
var color = FbxMaterialColor.Read(material)!.Value;
Assert.Equal(expected, color.X, 5);
Assert.Equal(expected / 2, color.Y, 5);
}
[Fact]
public void MissingColorIsNotInvented()
=> Assert.Null(FbxMaterialColor.Read(new FbxNode("Material")));
[Theory]
[InlineData(1.0, false)]
[InlineData(0.0, true)]
[InlineData(0.5, true)]
public void DetectsAuthoredVertexRgbWithoutTreatingAlphaAsColor(double red, bool expected)
{
var mesh = new FbxNode("Geometry");
var layer = new FbxNode("LayerElementColor");
var colors = new FbxNode("Colors");
colors.Properties.Add(new[] { red, 1.0, 1.0, 0.0 });
layer.Children.Add(colors);
mesh.Children.Add(layer);
Assert.Equal(expected, FbxMaterialColor.HasVertexColors(mesh));
}
static FbxNode Property(string name, params double[] values)
{
var node = new FbxNode("P");
node.Properties.AddRange(new object[] { name, "", "", "" });
node.Properties.AddRange(values.Cast<object>());
return node;
}
}