public GraphicStreamContainer Parse()
{
int triangleCount = Convert.ToInt32(
mTriangleElement.Attribute("count").Value,
CultureInfo.InvariantCulture);
var allIndices = ParseUIntArray(mTriangleElement.Element(
ColladaImporter.Namespace + "p"));
var segmentLenght = allIndices.Count() / triangleCount / 3;
var container = new GraphicStreamContainer();
var indices = allIndices.EachNthElement(segmentLenght).ToArray();
container.Create(GraphicStreamUsage.Index, indices);
var vertexCount = (int)indices.Max() + 1;
var inputs = ParseInputs();
foreach (var input in inputs)
{
var usage = SemanticHelper.GetUsageForSemantic(input.Semantic);
var data = new SourceParser(input.SourceElement).Parse();
if (usage != GraphicStreamUsage.Position)
{
var specificIndices = allIndices.EachNthElement(
segmentLenght, input.Offset).ToArray();
var newData = new float[vertexCount][];
for (int i = 0; i < indices.Length; i++)
{
var positionIndex = (int)indices[i];
newData[positionIndex] = data.ElementAt((int)specificIndices[i]);
}
data = newData;
}
var elementLength = data.First().Length;
switch (elementLength)
{
case 2:
container.Create(usage,
data.Select(element => new Vector2(element)).ToArray());
break;
case 3:
container.Create(usage,
data.Select(element => new Vector3(element)).ToArray());
break;
case 4:
container.Create(usage,
data.Select(element => new Vector4(element)).ToArray());
break;
}
}
return container;
}