public void Prepare(Bone bone)
{
if (Prepared) return;
var binding = BoneBindings.FirstOrDefault(x => x.BoneName.Equals(bone.Name, StringComparison.InvariantCultureIgnoreCase));
if (binding != null)
{
for (var i = 0; i < binding.RealVertexCount; i++)
{
var vertexIndex = binding.FirstRealVertex + i;
VertexBuffer[vertexIndex].Parameters.X = bone.Index;
}
for (var i = 0; i < binding.BlendVertexCount; i++)
{
var blendVertexIndex = binding.FirstBlendVertex + i;
BlendVertBoneIndices[blendVertexIndex] = bone.Index;
}
}
foreach (var child in bone.Children)
{
Prepare(child);
}
if (bone.Name.Equals("ROOT", StringComparison.InvariantCultureIgnoreCase))
{
for (int i = 0; i < BlendData.Length; i++)
{
var data = BlendData[i];
var vert = BlendVertBoneIndices[i];
VertexBuffer[data.OtherVertex].Parameters.Y = BlendVertBoneIndices[i];
VertexBuffer[data.OtherVertex].Parameters.Z = data.Weight;
VertexBuffer[data.OtherVertex].BvPosition = BlendVerts[i];
}
InvalidateMesh();
Prepared = true;
}
}