PageRenderTime 48ms CodeModel.GetById 25ms RepoModel.GetById 0ms app.codeStats 0ms

/Rendering/Basics/Drawing/Box.cs

#
C# | 127 lines | 91 code | 8 blank | 28 comment | 1 complexity | fc482d3979b49e155382fad1c6b6dd9a MD5 | raw file
Possible License(s): Apache-2.0
  1. using Delta.Utilities.Datatypes;
  2. namespace Delta.Rendering.Basics.Drawing
  3. {
  4. /// <summary>
  5. /// Static box class to draw 3d boxes either with lines or as solid boxes.
  6. /// </summary>
  7. public static class Box
  8. {
  9. #region DrawOutline (Static)
  10. /// <summary>
  11. /// Draws a 3-dimensional box from start to end using "LineColor" as
  12. /// ambient color. Mostly used for BoundingBoxes.
  13. //// DrawOutline(minimum, maximum, color)
  14. /// </summary>
  15. /// <param name="minimum">Minimum</param>
  16. /// <param name="maximum">Maximum</param>
  17. /// <param name="color">Line color</param>
  18. public static void DrawOutline(Vector minimum, Vector maximum, Color color)
  19. {
  20. Vector difference = maximum - minimum;
  21. Vector minPlusDifference = minimum + difference;
  22. Vector minPlusDiffYZ =
  23. minimum + new Vector(0f, difference.Y, difference.Z);
  24. Vector minPlusDiffX = minimum + new Vector(difference.X, 0f, 0f);
  25. Vector minPlusDiffZ = minimum + new Vector(0f, 0f, difference.Z);
  26. Vector minPlusDiffY = minimum + new Vector(0f, difference.Y, 0f);
  27. Vector minPlusDiffXY =
  28. minimum + new Vector(difference.X, difference.Y, 0f);
  29. Vector minPlusDiffXZ =
  30. minimum + new Vector(difference.X, 0f, difference.Z);
  31. DrawManager drawInstance = DrawManager.Instance;
  32. drawInstance.Draw3DLine(ref minimum, ref minPlusDiffZ, ref color);
  33. drawInstance.Draw3DLine(ref minPlusDiffX, ref minPlusDiffXZ, ref color);
  34. drawInstance.Draw3DLine(ref minPlusDiffXY, ref minPlusDifference,
  35. ref color);
  36. drawInstance.Draw3DLine(ref minPlusDiffY, ref minPlusDiffYZ, ref color);
  37. drawInstance.Draw3DLine(ref minPlusDiffZ, ref minPlusDiffYZ, ref color);
  38. drawInstance.Draw3DLine(ref minPlusDiffZ, ref minPlusDiffXZ, ref color);
  39. drawInstance.Draw3DLine(ref minPlusDiffXZ, ref minPlusDifference,
  40. ref color);
  41. drawInstance.Draw3DLine(ref minPlusDiffYZ, ref minPlusDifference,
  42. ref color);
  43. drawInstance.Draw3DLine(ref minimum, ref minPlusDiffY, ref color);
  44. drawInstance.Draw3DLine(ref minimum, ref minPlusDiffX, ref color);
  45. drawInstance.Draw3DLine(ref minPlusDiffX, ref minPlusDiffXY, ref color);
  46. drawInstance.Draw3DLine(ref minPlusDiffY, ref minPlusDiffXY, ref color);
  47. }
  48. /// <summary>
  49. /// Draws a 3-dimensional box from start to end using "LineColor" as
  50. /// ambient color.
  51. /// </summary>
  52. /// <param name="minimum">Minimum</param>
  53. /// <param name="maximum">Maximum</param>
  54. /// <param name="color">Line color</param>
  55. /// <param name="rotation">Rotation as raw, pitch, roll</param>
  56. public static void DrawOutline(Vector minimum, Vector maximum, Color color,
  57. Vector rotation)
  58. {
  59. Vector difference = (maximum - minimum);
  60. Vector minusHalfDifference = -difference * 0.5f;
  61. // Bunch of vectors for all the lines, see above for details
  62. Vector[] vectors = new[]
  63. {
  64. minusHalfDifference + Vector.Zero,
  65. minusHalfDifference + new Vector(0f, 0f, difference.Z),
  66. minusHalfDifference + new Vector(difference.X, 0f, 0f),
  67. minusHalfDifference + new Vector(difference.X, 0f, difference.Z),
  68. minusHalfDifference + new Vector(difference.X, difference.Y, 0f),
  69. minusHalfDifference + new Vector(difference.X, difference.Y, difference.Z),
  70. minusHalfDifference + new Vector(0f, difference.Y, 0f),
  71. minusHalfDifference + new Vector(0f, difference.Y, difference.Z),
  72. minusHalfDifference + new Vector(0f, 0f, difference.Z),
  73. minusHalfDifference + new Vector(0f, difference.Y, difference.Z),
  74. minusHalfDifference + new Vector(0f, 0f, difference.Z),
  75. minusHalfDifference + new Vector(difference.X, 0f, difference.Z),
  76. minusHalfDifference + new Vector(difference.X, 0f, difference.Z),
  77. minusHalfDifference + new Vector(difference.X, difference.Y, difference.Z),
  78. minusHalfDifference + new Vector(0f, difference.Y, difference.Z),
  79. minusHalfDifference + new Vector(difference.X, difference.Y, difference.Z),
  80. minusHalfDifference + new Vector(0f, 0f, 0f),
  81. minusHalfDifference + new Vector(0f, difference.Y, 0f),
  82. minusHalfDifference + new Vector(0f, 0f, 0f),
  83. minusHalfDifference + new Vector(difference.X, 0f, 0f),
  84. minusHalfDifference + new Vector(difference.X, 0f, 0f),
  85. minusHalfDifference + new Vector(difference.X, difference.Y, 0f),
  86. minusHalfDifference + new Vector(0f, difference.Y, 0f),
  87. minusHalfDifference + new Vector(difference.X, difference.Y, 0f)
  88. };
  89. // Prepare the "raw" rotation
  90. Quaternion rotationQuaternion =
  91. Quaternion.CreateFromYawPitchRoll(rotation.X, rotation.Y, rotation.Z);
  92. Matrix transformMatrix = Matrix.FromQuaternion(rotationQuaternion);
  93. // And rotate and draw each vertex point as line pairs
  94. DrawManager drawInstance = DrawManager.Instance;
  95. for (int i = 0; i < vectors.Length / 2; i++)
  96. {
  97. drawInstance.Draw3DLine(
  98. Vector.TransformNormal(vectors[i * 2 + 0], transformMatrix) +
  99. minimum - minusHalfDifference,
  100. Vector.TransformNormal(vectors[i * 2 + 1], transformMatrix) +
  101. minimum - minusHalfDifference, color);
  102. }
  103. }
  104. #endregion
  105. #region DrawFilled (Static)
  106. /// <summary>
  107. /// Draw a filled box in 3d space.
  108. /// </summary>
  109. /// <param name="minimum">The minimum corner position.</param>
  110. /// <param name="maximum">The maximum corner position.</param>
  111. /// <param name="color">The fill color of the box.</param>
  112. public static void DrawFilled(Vector minimum, Vector maximum, Color color)
  113. {
  114. Vector size = maximum - minimum;
  115. DrawManager.Instance.DrawBox(ref minimum, ref size, ref color);
  116. }
  117. #endregion
  118. }
  119. }