PageRenderTime 41ms CodeModel.GetById 15ms RepoModel.GetById 0ms app.codeStats 0ms

/PhysicsEngines/Jitter/Helpers.cs

#
C# | 76 lines | 54 code | 6 blank | 16 comment | 4 complexity | 1d48e0c1997879b23e176e09954df8a5 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 Jitter.Collision;
  5. using Jitter.Collision.Shapes;
  6. using Jitter.LinearMath;
  7. namespace Delta.PhysicsEngines.Jitter
  8. {
  9. public static class Helpers
  10. {
  11. #region CreateFrom (Static)
  12. /// <summary>
  13. /// Helper method used for creation of Jitter TriangleMeshShape by
  14. /// populating data with vertices and indices gathered from out Mesh.
  15. /// </summary>
  16. /// <param name="mesh">The mesh.</param>
  17. /// <param name="localSpaceMatrix">The local space matrix.</param>
  18. /// <param name="invertTriangles">
  19. /// if set to <c>true</c> we invert winding order of triangles.
  20. /// </param>
  21. /// <returns>
  22. /// New created jitter TriangleMeshShape created from Delta engine mesh.
  23. /// </returns>
  24. public static TriangleMeshShape CreateFrom(Mesh mesh,
  25. Matrix localSpaceMatrix, bool invertTriangles)
  26. {
  27. // extract the data from the physics mesh
  28. List<JVector> triangleVertex = new List<JVector>();
  29. List<TriangleVertexIndices> triangleVertexIndices =
  30. new List<TriangleVertexIndices>();
  31. // apply the local transform of the mesh so we get correct coordinates
  32. Matrix TransMat = localSpaceMatrix;
  33. JVector tempVector;
  34. for (int num = 0; num < mesh.Geometry.Data.NumberOfUsedVertices; num++)
  35. {
  36. Vector transformed = Vector.Transform(
  37. mesh.Geometry.Data.GetPosition(num), TransMat);
  38. JitterDatatypesMapping.Convert(ref transformed, out tempVector);
  39. triangleVertex.Add(tempVector);
  40. }
  41. // set inverted tris if needed
  42. ushort[] Indices = mesh.Geometry.Data.Indices;
  43. if (invertTriangles)
  44. {
  45. for (int i = 0; i < Indices.Length; i = i + 3)
  46. {
  47. triangleVertexIndices.Add(new TriangleVertexIndices(
  48. Indices[i + 2],
  49. Indices[i + 1],
  50. Indices[i]));
  51. }
  52. }
  53. else
  54. {
  55. for (int i = 0; i < Indices.Length; i = i + 3)
  56. {
  57. triangleVertexIndices.Add(new TriangleVertexIndices(
  58. Indices[i],
  59. Indices[i + 1],
  60. Indices[i + 2]));
  61. }
  62. }
  63. // create the triangle mesh of the level and add it to the physics world
  64. Octree ocTree = new Octree(triangleVertex, triangleVertexIndices);
  65. TriangleMeshShape triangleMesh = new TriangleMeshShape(ocTree);
  66. return triangleMesh;
  67. }
  68. #endregion
  69. }
  70. }