/JiglibX.Silverlight/Utils/BodyRenderExtension.cs

# · C# · 278 lines · 188 code · 46 blank · 44 comment · 22 complexity · 317236acfda8662ce0ba04080fecaee7 MD5 · raw file

  1. using Microsoft.Xna.Framework;
  2. using Microsoft.Xna.Framework.Graphics;
  3. using Microsoft.Xna.Framework.Input;
  4. using System;
  5. using System.Collections.Generic;
  6. using JigLibX.Math;
  7. using JigLibX.Physics;
  8. using JigLibX.Geometry;
  9. using JigLibX.Collision;
  10. namespace JigLibX.Physics
  11. {
  12. /// <summary>
  13. /// Class BodyRenderExtensions
  14. /// </summary>
  15. public static class BodyRenderExtensions
  16. {
  17. /// <summary>
  18. /// calcCirclePoints
  19. /// </summary>
  20. /// <param name="radius"></param>
  21. /// <returns>List</returns>
  22. private static List<Vector3> calcCirclePoints(float radius)
  23. {
  24. int elementsToCalc = 24;
  25. float stepSize = -360.0f / elementsToCalc;
  26. List<Vector3> l = new List<Vector3>();
  27. for (float slice = 0; slice <= elementsToCalc; slice++)
  28. {
  29. double stepRad = MathHelper.ToRadians(slice * stepSize);
  30. float x1 = (float)(System.Math.Sin(stepRad));
  31. float y1 = (float)(System.Math.Cos(stepRad));
  32. l.Add(new Vector3(x1, y1, 0) * radius);
  33. }
  34. return l;
  35. }
  36. /// <summary>
  37. /// AddShapeToWirefram
  38. /// </summary>
  39. /// <param name="shape"></param>
  40. /// <param name="wireframe"></param>
  41. /// <param name="orientation"></param>
  42. /// <param name="color"></param>
  43. private static void AddShapeToWireframe( List<Vector3> shape, List<VertexPositionColor> wireframe, Matrix orientation, Color color )
  44. {
  45. if (wireframe.Count > 0)
  46. {
  47. Vector3 v = wireframe[wireframe.Count - 1].Position;
  48. wireframe.Add(new VertexPositionColor(v, new Color(0, 0, 0, 0)));
  49. wireframe.Add(new VertexPositionColor(shape[0], new Color(0, 0, 0, 0)));
  50. }
  51. foreach (Vector3 point in shape)
  52. {
  53. wireframe.Add(new VertexPositionColor(Vector3.Transform(point, orientation), color));
  54. }
  55. }
  56. /// <summary>
  57. /// AddLineToWireframe
  58. /// </summary>
  59. /// <param name="from"></param>
  60. /// <param name="to"></param>
  61. /// <param name="wireframe"></param>
  62. /// <param name="orientation"></param>
  63. /// <param name="color"></param>
  64. private static void AddLineToWireframe(Vector3 from, Vector3 to, List<VertexPositionColor> wireframe, Matrix orientation, Color color)
  65. {
  66. if (wireframe.Count > 0)
  67. {
  68. Vector3 v = wireframe[wireframe.Count - 1].Position;
  69. wireframe.Add(new VertexPositionColor(v, new Color(0, 0, 0, 0)));
  70. wireframe.Add(new VertexPositionColor(Vector3.Transform(from, orientation), new Color(0, 0, 0, 0)));
  71. }
  72. wireframe.Add(new VertexPositionColor(Vector3.Transform(from, orientation), color));
  73. wireframe.Add(new VertexPositionColor(Vector3.Transform(to, orientation), color));
  74. }
  75. /// <summary>
  76. /// AddLinesToWireframe
  77. /// </summary>
  78. /// <param name="points"></param>
  79. /// <param name="wireframe"></param>
  80. /// <param name="orientation"></param>
  81. /// <param name="color"></param>
  82. private static void AddLinesToWireframe(List<Vector3> points, List<VertexPositionColor> wireframe, Matrix orientation, Color color)
  83. {
  84. for (int i = 0; i < points.Count; i += 2)
  85. {
  86. AddLineToWireframe(points[i], points[i + 1], wireframe, orientation, color);
  87. }
  88. }
  89. /// <summary>
  90. /// GetLocalSkinWireframe
  91. /// </summary>
  92. /// <param name="skin"></param>
  93. /// <returns>VertexPositionColor[]</returns>
  94. public static VertexPositionColor[] GetLocalSkinWireframe(this CollisionSkin skin)
  95. {
  96. List<VertexPositionColor> wireframe = new List<VertexPositionColor>();
  97. for (int i = 0; i < skin.NumPrimitives; i++)
  98. {
  99. Primitive p = skin.GetPrimitiveLocal(i);
  100. Matrix trans = p.TransformMatrix;
  101. if (p is Sphere)
  102. {
  103. Sphere np = (Sphere)p;
  104. List<Vector3> SpherePoints = calcCirclePoints(np.Radius);
  105. AddShapeToWireframe(SpherePoints, wireframe, trans, Color.Blue);
  106. AddShapeToWireframe(SpherePoints, wireframe, Matrix.CreateRotationY(MathHelper.PiOver2) * trans, Color.Red);
  107. AddShapeToWireframe(SpherePoints, wireframe, Matrix.CreateRotationX(MathHelper.PiOver2) * trans, Color.Green);
  108. }
  109. else if (p is Capsule)
  110. {
  111. Capsule np = (Capsule)p;
  112. List<Vector3> Ball = calcCirclePoints(np.Radius);
  113. List<Vector3> CylPoints = new List<Vector3>();
  114. List<Vector3> CirclePoints = new List<Vector3>();
  115. List<Vector3> SidePoints = new List<Vector3>();
  116. // Create LongWays profile slice
  117. foreach (Vector3 v in Ball)
  118. {
  119. Vector3 t = Vector3.Transform(v, Matrix.CreateRotationX(MathHelper.PiOver2));
  120. CylPoints.Add(t);
  121. }
  122. float len = np.Length;
  123. SidePoints.Add(Vector3.Transform(new Vector3(np.Radius, len, 0), Matrix.CreateRotationX(MathHelper.PiOver2)));
  124. SidePoints.Add(Vector3.Transform(new Vector3(np.Radius, 0, 0), Matrix.CreateRotationX(MathHelper.PiOver2)));
  125. SidePoints.Add(Vector3.Transform(new Vector3(-np.Radius, 0, 0), Matrix.CreateRotationX(MathHelper.PiOver2)));
  126. SidePoints.Add(Vector3.Transform(new Vector3(-np.Radius, len, 0), Matrix.CreateRotationX(MathHelper.PiOver2)));
  127. // Create Y Rungs
  128. AddShapeToWireframe(Ball, wireframe, Matrix.CreateTranslation(new Vector3(0, 0, 0.0f * len)) * trans, Color.Green);
  129. AddShapeToWireframe(Ball, wireframe, Matrix.CreateTranslation(new Vector3(0, 0, 0.5f * np.Length)) * trans, Color.Green);
  130. AddShapeToWireframe(Ball, wireframe, Matrix.CreateTranslation(new Vector3(0, 0, 1.0f * np.Length)) * trans, Color.Green);
  131. // Create Z Profile
  132. Matrix Zmat = Matrix.CreateRotationZ(MathHelper.PiOver2);
  133. AddShapeToWireframe(CylPoints, wireframe, Matrix.CreateTranslation(new Vector3(0, 0, np.Length)) * Zmat * trans, Color.Blue);
  134. AddShapeToWireframe(CylPoints, wireframe, Matrix.CreateTranslation(new Vector3(0, 0, 0)) * Zmat * trans, Color.Blue);
  135. AddLineToWireframe(SidePoints[0], SidePoints[1], wireframe, Zmat * trans, Color.Blue);
  136. AddLineToWireframe(SidePoints[2], SidePoints[3], wireframe, Zmat * trans, Color.Blue);
  137. //// Create X Profile
  138. Matrix Xmat = Matrix.Identity;
  139. AddShapeToWireframe(CylPoints, wireframe, Matrix.CreateTranslation(new Vector3(0, 0, np.Length)) * Xmat * trans, Color.Red);
  140. AddShapeToWireframe(CylPoints, wireframe, Matrix.CreateTranslation(new Vector3(0, 0, 0)) * Xmat * trans, Color.Red);
  141. AddLineToWireframe(SidePoints[0], SidePoints[1], wireframe, Xmat * trans, Color.Red);
  142. AddLineToWireframe(SidePoints[2], SidePoints[3], wireframe, Xmat * trans, Color.Red);
  143. }
  144. else if (p is Box)
  145. {
  146. Box np = (Box)p;
  147. List<Vector3> xPoints = new List<Vector3>();
  148. List<Vector3> yPoints = new List<Vector3>();
  149. List<Vector3> zPoints = new List<Vector3>();
  150. Vector3 slen = np.SideLengths;
  151. xPoints.Add(new Vector3(slen.X, slen.Y, slen.Z));
  152. xPoints.Add(new Vector3(0, slen.Y, slen.Z));
  153. xPoints.Add(new Vector3(slen.X, 0, slen.Z));
  154. xPoints.Add(new Vector3(0, 0, slen.Z));
  155. xPoints.Add(new Vector3(slen.X, slen.Y, 0));
  156. xPoints.Add(new Vector3(0, slen.Y, 0));
  157. xPoints.Add(new Vector3(slen.X, 0, 0));
  158. xPoints.Add(new Vector3(0, 0, 0));
  159. yPoints.Add(new Vector3(slen.X, slen.Y, slen.Z));
  160. yPoints.Add(new Vector3(slen.X, 0, slen.Z));
  161. yPoints.Add(new Vector3(0, slen.Y, slen.Z));
  162. yPoints.Add(new Vector3(0, 0, slen.Z));
  163. yPoints.Add(new Vector3(slen.X, slen.Y, 0));
  164. yPoints.Add(new Vector3(slen.X, 0, 0));
  165. yPoints.Add(new Vector3(0, slen.Y, 0));
  166. yPoints.Add(new Vector3(0, 0, 0));
  167. zPoints.Add(new Vector3(slen.X, slen.Y, slen.Z));
  168. zPoints.Add(new Vector3(slen.X, slen.Y, 0));
  169. zPoints.Add(new Vector3(0, slen.Y, slen.Z));
  170. zPoints.Add(new Vector3(0, slen.Y, 0));
  171. zPoints.Add(new Vector3(slen.X, 0, slen.Z));
  172. zPoints.Add(new Vector3(slen.X, 0, 0));
  173. zPoints.Add(new Vector3(0, 0, slen.Z));
  174. zPoints.Add(new Vector3(0, 0, 0));
  175. AddLinesToWireframe(xPoints, wireframe, trans, Color.Red);
  176. AddLinesToWireframe(yPoints, wireframe, trans, Color.Green);
  177. AddLinesToWireframe(zPoints, wireframe, trans, Color.Blue);
  178. }
  179. else if (p is AABox)
  180. {
  181. }
  182. else if (p is Heightmap)
  183. {
  184. Heightmap hm = (Heightmap)p;
  185. Vector3 point, normal;
  186. for (int e = 0; e < hm.Heights.Nx; e += 5)
  187. {
  188. for (int j = 0; j < hm.Heights.Nz; j += 5)
  189. {
  190. hm.GetSurfacePosAndNormal(out point, out normal, e, j);
  191. AddLineToWireframe(point, point - 0.5f * normal, wireframe, trans, Color.GreenYellow);
  192. }
  193. }
  194. }
  195. else if (p is JigLibX.Geometry.Plane)
  196. {
  197. }
  198. else if (p is TriangleMesh)
  199. {
  200. TriangleMesh np = (TriangleMesh)p;
  201. for (int j = 0; j < np.GetNumTriangles(); j++)
  202. {
  203. IndexedTriangle t = np.GetTriangle(j);
  204. Vector3 p1 = np.GetVertex(t.GetVertexIndex(0));
  205. Vector3 p2 = np.GetVertex(t.GetVertexIndex(1));
  206. Vector3 p3 = np.GetVertex(t.GetVertexIndex(2));
  207. List<Vector3> tPoints = new List<Vector3>();
  208. tPoints.Add(p1);
  209. tPoints.Add(p2);
  210. tPoints.Add(p3);
  211. tPoints.Add(p1);
  212. AddShapeToWireframe(tPoints, wireframe, trans, Color.Red);
  213. }
  214. }
  215. }
  216. return wireframe.ToArray();
  217. }
  218. /// <summary>
  219. /// TransformWireframe
  220. /// </summary>
  221. /// <param name="body"></param>
  222. /// <param name="wireframe"></param>
  223. public static void TransformWireframe(this Body body, VertexPositionColor[] wireframe)
  224. {
  225. for ( int i = 0; i < wireframe.Length; i++)
  226. {
  227. wireframe[i].Position = Vector3.Transform(wireframe[i].Position,
  228. body.Orientation * Matrix.CreateTranslation(body.Position));
  229. }
  230. }
  231. }
  232. }