/RacingGameWindows1/RacingGame/RacingGame/Tracks/TrackVertex.cs

https://bitbucket.org/ddreaper/racing-game-kit · C# · 276 lines · 166 code · 19 blank · 91 comment · 0 complexity · c3bb76f55e668d6cb2b1cbda8cf2aeae MD5 · raw file

  1. #region File Description
  2. //-----------------------------------------------------------------------------
  3. // TrackVertex.cs
  4. //
  5. // Microsoft XNA Community Game Platform
  6. // Copyright (C) Microsoft Corporation. All rights reserved.
  7. //-----------------------------------------------------------------------------
  8. #endregion
  9. #region Using directives
  10. using Microsoft.Xna.Framework;
  11. using System;
  12. using System.Collections.Generic;
  13. using System.Text;
  14. using RacingGame.Graphics;
  15. #endregion
  16. namespace RacingGame.Tracks
  17. {
  18. /// <summary>
  19. /// Track vertex helper class, used for the initial spline line points,
  20. /// but also for the final road generation (left and right sides).
  21. /// This class can be easily be converted to the TangentVertex struct,
  22. /// we got all the data we need plus some more in here.
  23. /// For example just use LeftTangentVertex, etc. to get TangentVertices!
  24. /// </summary>
  25. public class TrackVertex
  26. {
  27. #region Variables
  28. /// <summary>
  29. /// Position of this point
  30. /// </summary>
  31. public Vector3 pos;
  32. /// <summary>
  33. /// Right, up and dir vectors
  34. /// </summary>
  35. public Vector3 right, up, dir;
  36. /// <summary>
  37. /// Texture coordinates, u goes along with the road, v is left and right,
  38. /// which is on the texture top and bottom.
  39. /// </summary>
  40. public Vector2 uv;
  41. /// <summary>
  42. /// Minimun, maximum and default road width for our track.
  43. /// </summary>
  44. public const float MinRoadWidth = 0.25f,
  45. DefaultRoadWidth = 1.0f,
  46. MaxRoadWidth = 2.0f,
  47. RoadWidthScale = 13.25f;
  48. /// <summary>
  49. /// Thickness (up/down) of the road for the 3d side.
  50. /// </summary>
  51. const float RoadThickness = 1.0f;
  52. /// <summary>
  53. /// Road tunnel height.
  54. /// </summary>
  55. const float RoadTunnelHeight = 7.125f;
  56. /// <summary>
  57. /// Road width
  58. /// </summary>
  59. public float roadWidth = DefaultRoadWidth;
  60. #endregion
  61. #region Properties
  62. /// <summary>
  63. /// Left side track vertex generation, used for the GuardRail class.
  64. /// </summary>
  65. /// <returns>Track vertex</returns>
  66. public TrackVertex LeftTrackVertex
  67. {
  68. get
  69. {
  70. return new TrackVertex(
  71. pos - RoadWidthScale * roadWidth * right / 2,
  72. right, up, dir,
  73. new Vector2(uv.X, 0),
  74. roadWidth);
  75. }
  76. }
  77. /// <summary>
  78. /// Right side track vertex generation, used for the GuardRail class.
  79. /// </summary>
  80. /// <returns>Track vertex</returns>
  81. public TrackVertex RightTrackVertex
  82. {
  83. get
  84. {
  85. return new TrackVertex(
  86. pos + RoadWidthScale * roadWidth * right / 2,
  87. right, up, dir,
  88. new Vector2(uv.X, roadWidth),
  89. roadWidth);
  90. }
  91. }
  92. /// <summary>
  93. /// Left side tangent vertex
  94. /// </summary>
  95. /// <returns>Tangent vertex</returns>
  96. public TangentVertex LeftTangentVertex
  97. {
  98. get
  99. {
  100. return new TangentVertex(
  101. pos - RoadWidthScale * roadWidth * right / 2,
  102. new Vector2(uv.X, 0),
  103. up, right);
  104. }
  105. }
  106. /// <summary>
  107. /// Right side tangent vertex
  108. /// </summary>
  109. /// <returns>Tangent vertex</returns>
  110. public TangentVertex RightTangentVertex
  111. {
  112. get
  113. {
  114. return new TangentVertex(
  115. pos + RoadWidthScale * roadWidth * right / 2,
  116. new Vector2(uv.X, roadWidth),
  117. up, right);
  118. }
  119. }
  120. /// <summary>
  121. /// Middle tangent vertex
  122. /// </summary>
  123. /// <returns>Tangent vertex</returns>
  124. public TangentVertex MiddleTangentVertex
  125. {
  126. get
  127. {
  128. return new TangentVertex(
  129. pos,
  130. new Vector2(uv.X, roadWidth / 2),
  131. up, right);
  132. }
  133. }
  134. /// <summary>
  135. /// Middle left tangent vertex
  136. /// </summary>
  137. /// <returns>Tangent vertex</returns>
  138. public TangentVertex MiddleLeftTangentVertex
  139. {
  140. get
  141. {
  142. return new TangentVertex(
  143. pos - RoadWidthScale * roadWidth * right / 4,
  144. new Vector2(uv.X, roadWidth / 4),
  145. up, right);
  146. }
  147. }
  148. /// <summary>
  149. /// Middle right tangent vertex
  150. /// </summary>
  151. /// <returns>Tangent vertex</returns>
  152. public TangentVertex MiddleRightTangentVertex
  153. {
  154. get
  155. {
  156. return new TangentVertex(
  157. pos + RoadWidthScale * roadWidth * right / 4,
  158. new Vector2(uv.X, roadWidth * 3 / 4),
  159. up, right);
  160. }
  161. }
  162. /// <summary>
  163. /// Bottom left side tangent vertex
  164. /// </summary>
  165. /// <returns>Tangent vertex</returns>
  166. public TangentVertex BottomLeftSideTangentVertex
  167. {
  168. get
  169. {
  170. return new TangentVertex(
  171. pos - RoadWidthScale * roadWidth * right / 2 -
  172. up * RoadThickness * roadWidth,
  173. new Vector2(uv.X, 0),
  174. -up, -right);
  175. }
  176. }
  177. /// <summary>
  178. /// Bottom right side tangent vertex
  179. /// </summary>
  180. /// <returns>Tangent vertex</returns>
  181. public TangentVertex BottomRightSideTangentVertex
  182. {
  183. get
  184. {
  185. return new TangentVertex(
  186. pos + RoadWidthScale * roadWidth * right / 2 -
  187. up * RoadThickness * roadWidth,
  188. new Vector2(uv.X, 1),
  189. -up, -right);
  190. }
  191. }
  192. /// <summary>
  193. /// Tunnel top left side tangent vertex
  194. /// </summary>
  195. /// <returns>Tangent vertex</returns>
  196. public TangentVertex TunnelTopLeftSideTangentVertex
  197. {
  198. get
  199. {
  200. return new TangentVertex(
  201. pos - RoadWidthScale * roadWidth * right / 2 +
  202. up * RoadTunnelHeight,
  203. new Vector2(uv.X, 0),
  204. -up, -right);
  205. }
  206. }
  207. /// <summary>
  208. /// Tunnel top right side tangent vertex
  209. /// </summary>
  210. /// <returns>Tangent vertex</returns>
  211. public TangentVertex TunnelTopRightSideTangentVertex
  212. {
  213. get
  214. {
  215. return new TangentVertex(
  216. pos + RoadWidthScale * roadWidth * right / 2 +
  217. up * RoadTunnelHeight,
  218. new Vector2(uv.X, 1),
  219. -up, -right);
  220. }
  221. }
  222. #endregion
  223. #region Constructor
  224. /// <summary>
  225. /// Create track vertex
  226. /// </summary>
  227. /// <param name="setPos">Set position</param>
  228. /// <param name="setRight">Set right</param>
  229. /// <param name="setUp">Set up</param>
  230. /// <param name="setDir">Set dir</param>
  231. /// <param name="setUv">Set uv</param>
  232. public TrackVertex(Vector3 setPos,
  233. Vector3 setRight, Vector3 setUp, Vector3 setDir,
  234. Vector2 setUv, float setRoadWidth)
  235. {
  236. pos = setPos;
  237. right = setRight;
  238. up = setUp;
  239. dir = setDir;
  240. uv = setUv;
  241. roadWidth = setRoadWidth;
  242. }
  243. /// <summary>
  244. /// Create track vertex
  245. /// /// </summary>
  246. /// <param name="setPos">Set position</param>
  247. public TrackVertex(Vector3 setPos)
  248. {
  249. pos = setPos;
  250. right = Vector3.Right;
  251. up = Vector3.Up;
  252. dir = Vector3.Forward;
  253. uv = Vector2.Zero;
  254. }
  255. #endregion
  256. }
  257. }