mirror of
https://github.com/GTA-ASM/SanAndreasUnity
synced 2024-11-27 14:30:17 +00:00
85 lines
No EOL
2.5 KiB
C#
85 lines
No EOL
2.5 KiB
C#
using SanAndreasUnity.Importing.Conversion;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
using UnityEngine;
|
|
|
|
namespace SanAndreasUnity.Behaviours
|
|
{
|
|
public class FrameContainer : MonoBehaviour, IEnumerable<Frame>
|
|
{
|
|
private Frame[] _frames;
|
|
private Dictionary<int, Frame> _boneIdDict;
|
|
|
|
public Frame Root { get { return _frames.FirstOrDefault(x => x.Parent == null); } }
|
|
|
|
internal void Initialize(Geometry.GeometryFrame[] frames,
|
|
Dictionary<Geometry.GeometryFrame, Transform> transforms)
|
|
{
|
|
_frames = frames.Select(x =>
|
|
{
|
|
var frame = transforms[x].gameObject.AddComponent<Frame>();
|
|
frame.Initialize(x);
|
|
return frame;
|
|
}).ToArray();
|
|
|
|
for (var i = 0; i < frames.Length; ++i)
|
|
{
|
|
var frame = frames[i];
|
|
if (frame.ParentIndex == -1) continue;
|
|
_frames[i].Parent = _frames[frame.ParentIndex];
|
|
_frames[i].ParentIndex = frame.ParentIndex;
|
|
}
|
|
|
|
_boneIdDict = _frames.Where(x => x.BoneId > -1).ToDictionary(x => x.BoneId, x => x);
|
|
}
|
|
|
|
public Frame GetByName(string name, bool ignoreWhiteSpaces = false)
|
|
{
|
|
if (ignoreWhiteSpaces)
|
|
name = name.Replace (" ", "");
|
|
|
|
if (ignoreWhiteSpaces)
|
|
return _frames.FirstOrDefault (x => x.Name.Replace (" ", "") == name);
|
|
else
|
|
return _frames.FirstOrDefault (x => x.Name == name);
|
|
}
|
|
|
|
public Frame GetByIndex(int index)
|
|
{
|
|
return _frames[index];
|
|
}
|
|
|
|
public Frame GetByBoneId(int boneId)
|
|
{
|
|
return _boneIdDict[boneId];
|
|
}
|
|
|
|
public IEnumerator<Frame> GetEnumerator()
|
|
{
|
|
return _frames.AsEnumerable().GetEnumerator();
|
|
}
|
|
|
|
System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
|
|
{
|
|
return _frames.GetEnumerator();
|
|
}
|
|
|
|
private void OnDrawGizmosSelected()
|
|
{
|
|
if (_frames == null) return;
|
|
|
|
foreach (var frame in _frames)
|
|
{
|
|
if (frame == null) return;
|
|
|
|
Gizmos.color = Color.white;
|
|
Gizmos.DrawWireSphere(frame.transform.position, 0.02f);
|
|
|
|
if (frame.Parent != null)
|
|
{
|
|
Gizmos.DrawLine(frame.transform.position, frame.Parent.transform.position);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
} |