Area.cpp 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174
  1. #include "Area.h"
  2. Framework::Vec3<int> getDirection(Directions dir)
  3. {
  4. Framework::Vec3<int> result(0, 0, 0);
  5. if ((dir | NORTH) == dir) --result.y;
  6. if ((dir | EAST) == dir) ++result.x;
  7. if ((dir | SOUTH) == dir) ++result.y;
  8. if ((dir | WEST) == dir) --result.x;
  9. if ((dir | TOP) == dir) ++result.z;
  10. if ((dir | BOTTOM) == dir) --result.z;
  11. return result;
  12. }
  13. int getDirectionIndex(Direction dir)
  14. {
  15. if (dir == NORTH) return 0;
  16. if (dir == EAST) return 1;
  17. if (dir == SOUTH) return 2;
  18. if (dir == WEST) return 3;
  19. if (dir == TOP) return 4;
  20. if (dir == BOTTOM) return 5;
  21. assert(false);
  22. return -1;
  23. }
  24. Direction getOppositeDirection(Direction dir)
  25. {
  26. if (dir == NORTH) return SOUTH;
  27. if (dir == EAST) return WEST;
  28. if (dir == SOUTH) return NORTH;
  29. if (dir == WEST) return EAST;
  30. if (dir == TOP) return BOTTOM;
  31. if (dir == BOTTOM) return TOP;
  32. assert(false);
  33. return NO_DIRECTION;
  34. }
  35. Direction getDirectionFromIndex(int index)
  36. {
  37. return (Direction)(1 << index);
  38. }
  39. Directions getDirectionsFromVector(Framework::Vec3<float> dir)
  40. {
  41. Directions dirs = NO_DIRECTION;
  42. if (dir.y < 0)
  43. dirs |= NORTH;
  44. else if (dir.y > 0)
  45. dirs |= SOUTH;
  46. if (dir.x < 0)
  47. dirs |= WEST;
  48. else if (dir.x > 0)
  49. dirs |= EAST;
  50. if (dir.z < 0)
  51. dirs |= BOTTOM;
  52. else if (dir.z > 0)
  53. dirs |= TOP;
  54. return dirs;
  55. }
  56. Framework::Vec3<float> getRotation(Direction source, Direction target)
  57. {
  58. switch (source)
  59. {
  60. case NORTH:
  61. switch (target)
  62. {
  63. case EAST:
  64. return Framework::Vec3<float>(0.f, 0.f, (float)PI / 2.f);
  65. case SOUTH:
  66. return Framework::Vec3<float>(0.f, 0.f, (float)PI);
  67. case WEST:
  68. return Framework::Vec3<float>(0.f, 0.f, -(float)PI / 2.f);
  69. case TOP:
  70. return Framework::Vec3<float>(-(float)PI / 2.f, 0.f, 0.f);
  71. case BOTTOM:
  72. return Framework::Vec3<float>((float)PI / 2.f, 0.f, 0.f);
  73. default:
  74. break;
  75. }
  76. break;
  77. case EAST:
  78. switch (target)
  79. {
  80. case SOUTH:
  81. return Framework::Vec3<float>(0.f, 0.f, (float)PI / 2.f);
  82. case WEST:
  83. return Framework::Vec3<float>(0.f, 0.f, (float)PI);
  84. case NORTH:
  85. return Framework::Vec3<float>(0.f, 0.f, -(float)PI / 2.f);
  86. case TOP:
  87. return Framework::Vec3<float>(
  88. -(float)PI / 2.f, 0.f, (float)PI / 2.f);
  89. case BOTTOM:
  90. return Framework::Vec3<float>(
  91. (float)PI / 2.f, 0.f, (float)PI / 2.f);
  92. default:
  93. break;
  94. }
  95. break;
  96. case SOUTH:
  97. switch (target)
  98. {
  99. case WEST:
  100. return Framework::Vec3<float>(0.f, 0.f, (float)PI / 2.f);
  101. case NORTH:
  102. return Framework::Vec3<float>(0.f, 0.f, (float)PI);
  103. case EAST:
  104. return Framework::Vec3<float>(0.f, 0.f, -(float)PI / 2.f);
  105. case TOP:
  106. return Framework::Vec3<float>(-(float)PI / 2.f, 0.f, (float)PI);
  107. case BOTTOM:
  108. return Framework::Vec3<float>((float)PI / 2.f, 0.f, (float)PI);
  109. default:
  110. break;
  111. }
  112. break;
  113. case WEST:
  114. switch (target)
  115. {
  116. case NORTH:
  117. return Framework::Vec3<float>(0.f, 0.f, (float)PI / 2.f);
  118. case EAST:
  119. return Framework::Vec3<float>(0.f, 0.f, (float)PI);
  120. case SOUTH:
  121. return Framework::Vec3<float>(0.f, 0.f, -(float)PI / 2.f);
  122. case TOP:
  123. return Framework::Vec3<float>(
  124. -(float)PI / 2.f, 0.f, -(float)PI / 2.f);
  125. case BOTTOM:
  126. return Framework::Vec3<float>(
  127. (float)PI / 2.f, 0.f, -(float)PI / 2.f);
  128. default:
  129. break;
  130. }
  131. break;
  132. case TOP:
  133. switch (target)
  134. {
  135. case NORTH:
  136. return Framework::Vec3<float>(-(float)PI / 2.f, 0.f, 0.f);
  137. case EAST:
  138. return Framework::Vec3<float>(
  139. -(float)PI / 2.f, 0.f, (float)PI / 2.f);
  140. case SOUTH:
  141. return Framework::Vec3<float>(-(float)PI / 2.f, 0.f, (float)PI);
  142. case WEST:
  143. return Framework::Vec3<float>(
  144. -(float)PI / 2.f, 0.f, -(float)PI / 2.f);
  145. default:
  146. break;
  147. }
  148. break;
  149. case BOTTOM:
  150. switch (target)
  151. {
  152. case NORTH:
  153. return Framework::Vec3<float>((float)PI / 2.f, 0.f, 0.f);
  154. case EAST:
  155. return Framework::Vec3<float>(
  156. (float)PI / 2.f, 0.f, (float)PI / 2.f);
  157. case SOUTH:
  158. return Framework::Vec3<float>((float)PI / 2.f, 0.f, (float)PI);
  159. case WEST:
  160. return Framework::Vec3<float>(
  161. (float)PI / 2.f, 0.f, -(float)PI / 2.f);
  162. default:
  163. break;
  164. }
  165. break;
  166. }
  167. return Framework::Vec3<float>(0.f, 0.f, 0.f);
  168. }