PageRenderTime 42ms CodeModel.GetById 18ms RepoModel.GetById 1ms app.codeStats 0ms

/PhysicsEngines/JigLib/Helpers.cs

#
C# | 130 lines | 91 code | 15 blank | 24 comment | 6 complexity | 88db17e4d291adf95033a5d4666383b5 MD5 | raw file
Possible License(s): Apache-2.0
  1. using System.Collections.Generic;
  2. using Delta.Rendering.Models;
  3. using Delta.Utilities.Datatypes;
  4. using JigLibX.Geometry;
  5. using Microsoft.Xna.Framework;
  6. using Color = Delta.Utilities.Datatypes.Color;
  7. using Line = Delta.Rendering.Basics.Drawing.Line;
  8. using Matrix = Delta.Utilities.Datatypes.Matrix;
  9. namespace Delta.PhysicsEngines.JigLib
  10. {
  11. /// <summary>
  12. /// Helper class using for comunicate between DeltaEngine and JigLibX.
  13. /// </summary>
  14. public static class Helpers
  15. {
  16. #region CreateFrom (Static)
  17. /// <summary>
  18. /// Creates from.
  19. /// </summary>
  20. /// <param name="mesh">The mesh.</param>
  21. /// <param name="localSpaceMatrix">The local space matrix.</param>
  22. /// <param name="invertTriangles">if set to <c>true</c> [invert triangles].</param>
  23. /// <returns>
  24. /// New created JigLib TriangleMesh shape created from Delta engine mesh.
  25. /// </returns>
  26. public static TriangleMesh CreateFrom(Mesh mesh,
  27. Matrix localSpaceMatrix, bool invertTriangles)
  28. {
  29. // extract the data from the physics mesh
  30. List<Vector3> triangleVertex =
  31. new List<Vector3>();
  32. List<TriangleVertexIndices> triangleVertexIndices =
  33. new List<TriangleVertexIndices>();
  34. // apply the local transform of the mesh so we get correct coordinates
  35. Matrix TransMat = localSpaceMatrix;
  36. Vector transformed;
  37. Vector3 xnaVector;
  38. for (int num = 0; num < mesh.Geometry.Data.NumberOfUsedVertices; num++)
  39. {
  40. transformed = Vector.Transform(
  41. mesh.Geometry.Data.GetPosition(num), TransMat);
  42. JigLibDatatypesMapping.Convert(ref transformed, out xnaVector);
  43. triangleVertex.Add(xnaVector);
  44. }
  45. // set inverted tris if needed
  46. ushort[] Indices = mesh.Geometry.Data.Indices;
  47. if (invertTriangles)
  48. {
  49. for (int i = 0; i < Indices.Length; i = i + 3)
  50. {
  51. triangleVertexIndices.Add(new TriangleVertexIndices(
  52. Indices[i + 2],
  53. Indices[i + 1],
  54. Indices[i]));
  55. }
  56. } // if
  57. else
  58. {
  59. for (int i = 0; i < Indices.Length; i = i + 3)
  60. {
  61. triangleVertexIndices.Add(new TriangleVertexIndices(
  62. Indices[i],
  63. Indices[i + 1],
  64. Indices[i + 2]));
  65. }
  66. } // else
  67. // create the triangle mesh of the level and add it to the physics world
  68. TriangleMesh triangleMesh = new TriangleMesh();
  69. triangleMesh.CreateMesh(triangleVertex, triangleVertexIndices, 1, 1.0f);
  70. return triangleMesh;
  71. }
  72. #endregion
  73. #region DrawDebug (Static)
  74. /// <summary>
  75. /// Draws the debug.
  76. /// </summary>
  77. /// <param name="primitive">The primitive.</param>
  78. public static void DrawDebug(Primitive primitive)
  79. {
  80. if (primitive is TriangleMesh)
  81. {
  82. DrawTriangleMesh(primitive as TriangleMesh);
  83. }
  84. }
  85. #endregion
  86. #region Methods (Private)
  87. #region DrawTriangleMesh
  88. /// <summary>
  89. /// Performs debug drawing of JigLibX triangle mesh.
  90. /// </summary>
  91. /// <param name="triangleMesh">The triangle mesh to draw.</param>
  92. private static void DrawTriangleMesh(TriangleMesh triangleMesh)
  93. {
  94. Vector3 tempVector;
  95. Vector v0;
  96. Vector v1;
  97. Vector v2;
  98. for (int i = 0; i < triangleMesh.GetNumTriangles(); ++i)
  99. {
  100. IndexedTriangle tri = triangleMesh.GetTriangle(i);
  101. tempVector = triangleMesh.GetVertex(tri.GetVertexIndex(0));
  102. JigLibDatatypesMapping.Convert(ref tempVector, out v0);
  103. tempVector = triangleMesh.GetVertex(tri.GetVertexIndex(1));
  104. JigLibDatatypesMapping.Convert(ref tempVector, out v1);
  105. tempVector = triangleMesh.GetVertex(tri.GetVertexIndex(2));
  106. JigLibDatatypesMapping.Convert(ref tempVector, out v2);
  107. Line.Draw(v0, v1, Color.Black);
  108. Line.Draw(v1, v2, Color.Black);
  109. Line.Draw(v2, v0, Color.Black);
  110. }
  111. }
  112. #endregion
  113. #endregion
  114. }
  115. }