using System;
using System.Collections.Generic;
using System.Linq;
using System.Numerics;
namespace VrmLib
{
public static class ModelExtensions
{
public static void ApplyRotationAndScale(this Model model)
{
// worldPositionを記録する
var m_positionMap = model.Nodes.ToDictionary(x => x, x => x.Translation);
// 回転・拡縮を除去する
// 木構造の根元から実行する
// Rootは編集対象外
foreach (var node in model.Root.Traverse().Skip(1))
{
// 回転・拡縮を除去
if (m_positionMap.TryGetValue(node, out Vector3 pos))
{
var t = Matrix4x4.CreateTranslation(pos);
node.SetMatrix(t, false);
}
}
}
///
// [Debug向け]secondaryを除去
///
public static void RemoveSecondary(this Model model)
{
var secondary = model.Nodes
.FirstOrDefault(x =>
(x.Name == "secondary" || x.Name == "SpringBone")
&& x.Parent == model.Root
&& x.Children.Count == 0)
;
if (secondary != null)
{
var mod = new ModelModifier(model);
mod.NodeRemove(secondary);
}
}
static void CheckIndex(List list, string name) where T : GltfId
{
for (int i = 0; i < list.Count; ++i)
{
if (list[i].GltfIndex.HasValue)
{
if (list[i].GltfIndex.Value == i)
{
Console.WriteLine($"{name}[{i}] => OK");
}
else
{
Console.WriteLine($"{name}[{i}] => {list[i].GltfIndex}");
}
}
else
{
Console.WriteLine($"{name}[{i}] => null");
}
}
}
public static void CheckIndex(this Model model)
{
CheckIndex(model.Nodes, nameof(model.Nodes));
CheckIndex(model.Skins, nameof(model.Skins));
CheckIndex(model.MeshGroups, nameof(model.MeshGroups));
CheckIndex(model.Animations, nameof(model.Animations));
}
}
}