/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
- using System.Collections.Generic;
- using Delta.Rendering.Models;
- using Delta.Utilities.Datatypes;
- using JigLibX.Geometry;
- using Microsoft.Xna.Framework;
- using Color = Delta.Utilities.Datatypes.Color;
- using Line = Delta.Rendering.Basics.Drawing.Line;
- using Matrix = Delta.Utilities.Datatypes.Matrix;
-
- namespace Delta.PhysicsEngines.JigLib
- {
- /// <summary>
- /// Helper class using for comunicate between DeltaEngine and JigLibX.
- /// </summary>
- public static class Helpers
- {
- #region CreateFrom (Static)
- /// <summary>
- /// Creates from.
- /// </summary>
- /// <param name="mesh">The mesh.</param>
- /// <param name="localSpaceMatrix">The local space matrix.</param>
- /// <param name="invertTriangles">if set to <c>true</c> [invert triangles].</param>
- /// <returns>
- /// New created JigLib TriangleMesh shape created from Delta engine mesh.
- /// </returns>
- public static TriangleMesh CreateFrom(Mesh mesh,
- Matrix localSpaceMatrix, bool invertTriangles)
- {
- // extract the data from the physics mesh
- List<Vector3> triangleVertex =
- new List<Vector3>();
- List<TriangleVertexIndices> triangleVertexIndices =
- new List<TriangleVertexIndices>();
-
- // apply the local transform of the mesh so we get correct coordinates
- Matrix TransMat = localSpaceMatrix;
-
- Vector transformed;
- Vector3 xnaVector;
- for (int num = 0; num < mesh.Geometry.Data.NumberOfUsedVertices; num++)
- {
- transformed = Vector.Transform(
- mesh.Geometry.Data.GetPosition(num), TransMat);
- JigLibDatatypesMapping.Convert(ref transformed, out xnaVector);
- triangleVertex.Add(xnaVector);
- }
-
- // set inverted tris if needed
- ushort[] Indices = mesh.Geometry.Data.Indices;
- if (invertTriangles)
- {
- for (int i = 0; i < Indices.Length; i = i + 3)
- {
- triangleVertexIndices.Add(new TriangleVertexIndices(
- Indices[i + 2],
- Indices[i + 1],
- Indices[i]));
- }
- } // if
- else
- {
- for (int i = 0; i < Indices.Length; i = i + 3)
- {
- triangleVertexIndices.Add(new TriangleVertexIndices(
- Indices[i],
- Indices[i + 1],
- Indices[i + 2]));
- }
- } // else
-
- // create the triangle mesh of the level and add it to the physics world
- TriangleMesh triangleMesh = new TriangleMesh();
- triangleMesh.CreateMesh(triangleVertex, triangleVertexIndices, 1, 1.0f);
-
- return triangleMesh;
- }
- #endregion
-
- #region DrawDebug (Static)
- /// <summary>
- /// Draws the debug.
- /// </summary>
- /// <param name="primitive">The primitive.</param>
- public static void DrawDebug(Primitive primitive)
- {
- if (primitive is TriangleMesh)
- {
- DrawTriangleMesh(primitive as TriangleMesh);
- }
- }
- #endregion
-
- #region Methods (Private)
-
- #region DrawTriangleMesh
- /// <summary>
- /// Performs debug drawing of JigLibX triangle mesh.
- /// </summary>
- /// <param name="triangleMesh">The triangle mesh to draw.</param>
- private static void DrawTriangleMesh(TriangleMesh triangleMesh)
- {
- Vector3 tempVector;
- Vector v0;
- Vector v1;
- Vector v2;
-
- for (int i = 0; i < triangleMesh.GetNumTriangles(); ++i)
- {
- IndexedTriangle tri = triangleMesh.GetTriangle(i);
-
- tempVector = triangleMesh.GetVertex(tri.GetVertexIndex(0));
- JigLibDatatypesMapping.Convert(ref tempVector, out v0);
-
- tempVector = triangleMesh.GetVertex(tri.GetVertexIndex(1));
- JigLibDatatypesMapping.Convert(ref tempVector, out v1);
-
- tempVector = triangleMesh.GetVertex(tri.GetVertexIndex(2));
- JigLibDatatypesMapping.Convert(ref tempVector, out v2);
-
- Line.Draw(v0, v1, Color.Black);
- Line.Draw(v1, v2, Color.Black);
- Line.Draw(v2, v0, Color.Black);
- }
- }
- #endregion
-
- #endregion
- }
- }