Paradox Game Engine  v1.0.0 beta06
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Events Macros Pages
VertexElementValidator.cs
Go to the documentation of this file.
1 // Copyright (c) 2014 Silicon Studio Corp. (http://siliconstudio.co.jp)
2 // This file is distributed under GPL v3. See LICENSE.md for details.
3 using System;
4 
5 namespace SiliconStudio.Paradox.Graphics
6 {
7  internal class VertexElementValidator
8  {
9  internal static int GetVertexStride(VertexElement[] elements)
10  {
11  int num2 = 0;
12  for (int i = 0; i < elements.Length; i++)
13  num2 += elements[i].Format.SizeInBytes();
14  return num2;
15  }
16 
17  internal static void Validate(int vertexStride, VertexElement[] elements)
18  {
19  if (vertexStride <= 0)
20  {
21  throw new ArgumentOutOfRangeException("vertexStride");
22  }
23  if ((vertexStride & 3) != 0)
24  {
25  throw new ArgumentException("VertexElementOffsetNotMultipleFour");
26  }
27  int[] numArray = new int[vertexStride];
28  for (int i = 0; i < vertexStride; i++)
29  {
30  numArray[i] = -1;
31  }
32  int totalOffset = 0;
33  for (int j = 0; j < elements.Length; j++)
34  {
35  int offset = elements[j].AlignedByteOffset;
36  if (offset == VertexElement.AppendAligned)
37  {
38  if (j == 0)
39  {
40  offset = 0;
41  }
42  else
43  {
44  offset = totalOffset + elements[j - 1].Format.SizeInBytes();
45  }
46  }
47  totalOffset = offset;
48  int typeSize = elements[j].Format.SizeInBytes();
49  if ((offset < 0) || ((offset + typeSize) > vertexStride))
50  {
51  throw new ArgumentException("VertexElementOutsideStride");
52  }
53  if ((offset & 3) != 0)
54  {
55  throw new ArgumentException("VertexElementOffsetNotMultipleFour");
56  }
57  for (int k = 0; k < j; k++)
58  {
59  if (elements[j].SemanticName == elements[k].SemanticName && elements[j].SemanticIndex == elements[k].SemanticIndex)
60  {
61  throw new ArgumentException("DuplicateVertexElement");
62  }
63  }
64  for (int m = offset; m < (offset + typeSize); m++)
65  {
66  if (numArray[m] >= 0)
67  {
68  throw new ArgumentException("VertexElementsOverlap");
69  }
70  numArray[m] = j;
71  }
72  }
73  }
74  }
75 }