Shape.cpp 30 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737
  1. /******************************************************************************/
  2. #include "stdafx.h"
  3. namespace EE{
  4. /******************************************************************************/
  5. Shape& Shape::operator+=(C Vec &v)
  6. {
  7. switch(type)
  8. {
  9. case SHAPE_POINT : point +=v ; break;
  10. case SHAPE_EDGE : edge +=v ; break;
  11. case SHAPE_RECT : rect +=v ; break;
  12. case SHAPE_BOX : box +=v ; break;
  13. case SHAPE_OBOX : obox +=v ; break;
  14. case SHAPE_CIRCLE : circle +=v.xy; break;
  15. case SHAPE_BALL : ball +=v ; break;
  16. case SHAPE_CAPSULE: capsule+=v ; break;
  17. case SHAPE_TUBE : tube +=v ; break;
  18. case SHAPE_TORUS : torus +=v ; break;
  19. case SHAPE_CONE : cone +=v ; break;
  20. case SHAPE_PYRAMID: pyramid+=v ; break;
  21. }
  22. return T;
  23. }
  24. Shape& Shape::operator-=(C Vec &v)
  25. {
  26. switch(type)
  27. {
  28. case SHAPE_POINT : point -=v ; break;
  29. case SHAPE_EDGE : edge -=v ; break;
  30. case SHAPE_RECT : rect -=v ; break;
  31. case SHAPE_BOX : box -=v ; break;
  32. case SHAPE_OBOX : obox -=v ; break;
  33. case SHAPE_CIRCLE : circle -=v.xy; break;
  34. case SHAPE_BALL : ball -=v ; break;
  35. case SHAPE_CAPSULE: capsule-=v ; break;
  36. case SHAPE_TUBE : tube -=v ; break;
  37. case SHAPE_TORUS : torus -=v ; break;
  38. case SHAPE_CONE : cone -=v ; break;
  39. case SHAPE_PYRAMID: pyramid-=v ; break;
  40. }
  41. return T;
  42. }
  43. Shape& Shape::operator*=(Flt f)
  44. {
  45. switch(type)
  46. {
  47. case SHAPE_POINT : point *=f; break;
  48. case SHAPE_EDGE : edge *=f; break;
  49. case SHAPE_RECT : rect *=f; break;
  50. case SHAPE_BOX : box *=f; break;
  51. case SHAPE_OBOX : obox *=f; break;
  52. case SHAPE_CIRCLE : circle *=f; break;
  53. case SHAPE_BALL : ball *=f; break;
  54. case SHAPE_CAPSULE: capsule*=f; break;
  55. case SHAPE_TUBE : tube *=f; break;
  56. case SHAPE_TORUS : torus *=f; break;
  57. case SHAPE_CONE : cone *=f; break;
  58. case SHAPE_PYRAMID: pyramid*=f; break;
  59. }
  60. return T;
  61. }
  62. Shape& Shape::operator/=(Flt f)
  63. {
  64. switch(type)
  65. {
  66. case SHAPE_POINT : point /=f; break;
  67. case SHAPE_EDGE : edge /=f; break;
  68. case SHAPE_RECT : rect /=f; break;
  69. case SHAPE_BOX : box /=f; break;
  70. case SHAPE_OBOX : obox /=f; break;
  71. case SHAPE_CIRCLE : circle /=f; break;
  72. case SHAPE_BALL : ball /=f; break;
  73. case SHAPE_CAPSULE: capsule/=f; break;
  74. case SHAPE_TUBE : tube /=f; break;
  75. case SHAPE_TORUS : torus /=f; break;
  76. case SHAPE_CONE : cone /=f; break;
  77. case SHAPE_PYRAMID: pyramid/=f; break;
  78. }
  79. return T;
  80. }
  81. Shape& Shape::operator*=(C Vec &v)
  82. {
  83. switch(type)
  84. {
  85. case SHAPE_POINT : point *=v; break;
  86. case SHAPE_EDGE : edge *=v; break;
  87. case SHAPE_RECT : rect *=v.xy; break;
  88. case SHAPE_BOX : box *=v; break;
  89. case SHAPE_OBOX : obox *=v; break;
  90. case SHAPE_CIRCLE : circle *=v.avg(); break;
  91. case SHAPE_BALL : ball *=v.avg(); break;
  92. case SHAPE_CAPSULE: capsule*=v; break;
  93. case SHAPE_TUBE : tube *=v; break;
  94. case SHAPE_TORUS : torus *=v.avg(); break;
  95. case SHAPE_CONE : cone *=v.avg(); break;
  96. case SHAPE_PYRAMID: pyramid*=v.avg(); break;
  97. }
  98. return T;
  99. }
  100. Shape& Shape::operator/=(C Vec &v)
  101. {
  102. switch(type)
  103. {
  104. case SHAPE_POINT : point /=v; break;
  105. case SHAPE_EDGE : edge /=v; break;
  106. case SHAPE_RECT : rect /=v.xy; break;
  107. case SHAPE_BOX : box /=v; break;
  108. case SHAPE_OBOX : obox /=v; break;
  109. case SHAPE_CIRCLE : circle /=v.avg(); break;
  110. case SHAPE_BALL : ball /=v.avg(); break;
  111. case SHAPE_CAPSULE: capsule/=v; break;
  112. case SHAPE_TUBE : tube /=v; break;
  113. case SHAPE_TORUS : torus /=v.avg(); break;
  114. case SHAPE_CONE : cone /=v.avg(); break;
  115. case SHAPE_PYRAMID: pyramid/=v.avg(); break;
  116. }
  117. return T;
  118. }
  119. Shape& Shape::operator*=(C Matrix3 &m)
  120. {
  121. switch(type)
  122. {
  123. case SHAPE_POINT : point *=m; break;
  124. case SHAPE_EDGE : edge *=m; break;
  125. case SHAPE_BOX : box *=m; break;
  126. case SHAPE_OBOX : obox *=m; break;
  127. case SHAPE_BALL : ball *=m; break;
  128. case SHAPE_CAPSULE: capsule*=m; break;
  129. case SHAPE_TUBE : tube *=m; break;
  130. case SHAPE_TORUS : torus *=m; break;
  131. case SHAPE_CONE : cone *=m; break;
  132. case SHAPE_PYRAMID: pyramid*=m; break;
  133. }
  134. return T;
  135. }
  136. Shape& Shape::operator*=(C Matrix &m)
  137. {
  138. switch(type)
  139. {
  140. case SHAPE_POINT : point *=m; break;
  141. case SHAPE_EDGE : edge *=m; break;
  142. case SHAPE_BOX : box *=m; break;
  143. case SHAPE_OBOX : obox *=m; break;
  144. case SHAPE_BALL : ball *=m; break;
  145. case SHAPE_CAPSULE: capsule*=m; break;
  146. case SHAPE_TUBE : tube *=m; break;
  147. case SHAPE_TORUS : torus *=m; break;
  148. case SHAPE_CONE : cone *=m; break;
  149. case SHAPE_PYRAMID: pyramid*=m; break;
  150. }
  151. return T;
  152. }
  153. Shape operator+(C Shape &shape, C Vec &v) {return Shape(shape)+=v;}
  154. Shape operator-(C Shape &shape, C Vec &v) {return Shape(shape)-=v;}
  155. Shape operator*(C Shape &shape, Flt f) {return Shape(shape)*=f;}
  156. Shape operator/(C Shape &shape, Flt f) {return Shape(shape)/=f;}
  157. Shape operator*(C Shape &shape, C Vec &v) {return Shape(shape)*=v;}
  158. Shape operator/(C Shape &shape, C Vec &v) {return Shape(shape)/=v;}
  159. Shape operator*(C Shape &shape, C Matrix3 &m) {return Shape(shape)*=m;}
  160. Shape operator*(C Shape &shape, C Matrix &m) {return Shape(shape)*=m;}
  161. /******************************************************************************/
  162. Flt Shape::area()C
  163. {
  164. switch(type)
  165. {
  166. case SHAPE_RECT : return rect .area();
  167. case SHAPE_BOX : return box .area();
  168. case SHAPE_OBOX : return obox .area();
  169. case SHAPE_CIRCLE : return circle .area();
  170. case SHAPE_BALL : return ball .area();
  171. case SHAPE_CAPSULE: return capsule.area();
  172. case SHAPE_TUBE : return tube .area();
  173. case SHAPE_TORUS : return torus .area();
  174. case SHAPE_CONE : return cone .area();
  175. case SHAPE_PYRAMID: return pyramid.area();
  176. default : return 0;
  177. }
  178. }
  179. Flt Shape::volume()C
  180. {
  181. switch(type)
  182. {
  183. case SHAPE_BOX : return box .volume();
  184. case SHAPE_OBOX : return obox .volume();
  185. case SHAPE_BALL : return ball .volume();
  186. case SHAPE_CAPSULE: return capsule.volume();
  187. case SHAPE_TUBE : return tube .volume();
  188. case SHAPE_TORUS : return torus .volume();
  189. case SHAPE_CONE : return cone .volume();
  190. case SHAPE_PYRAMID: return pyramid.volume();
  191. default : return 0;
  192. }
  193. }
  194. Vec Shape::pos()C
  195. {
  196. switch(type)
  197. {
  198. case SHAPE_POINT : return point ;
  199. case SHAPE_EDGE : return edge .center() ;
  200. case SHAPE_RECT : return Vec(rect .center(), 0);
  201. case SHAPE_BOX : return box .center() ;
  202. case SHAPE_OBOX : return obox .center() ;
  203. case SHAPE_CIRCLE : return Vec(circle .pos , 0);
  204. case SHAPE_BALL : return ball .pos ;
  205. case SHAPE_CAPSULE: return capsule.pos ;
  206. case SHAPE_TUBE : return tube .pos ;
  207. case SHAPE_TORUS : return torus .pos ;
  208. case SHAPE_CONE : return cone .pos ;
  209. case SHAPE_PYRAMID: return pyramid.pos ;
  210. default : return 0 ;
  211. }
  212. }
  213. void Shape::pos(C Vec &pos)
  214. {
  215. T+=pos-T.pos();
  216. }
  217. /******************************************************************************/
  218. Str Shape::asText(Bool include_shape_type_name)C
  219. {
  220. Str text;
  221. switch(type)
  222. {
  223. default : return S;
  224. case SHAPE_POINT : text=point ; break;
  225. case SHAPE_EDGE : text=edge .asText(); break;
  226. case SHAPE_RECT : text=rect .asText(); break;
  227. case SHAPE_BOX : text=box .asText(); break;
  228. case SHAPE_OBOX : text=obox .asText(); break;
  229. case SHAPE_CIRCLE : text=circle .asText(); break;
  230. case SHAPE_BALL : text=ball .asText(); break;
  231. case SHAPE_CAPSULE: text=capsule.asText(); break;
  232. case SHAPE_TUBE : text=tube .asText(); break;
  233. case SHAPE_TORUS : text=torus .asText(); break;
  234. case SHAPE_CONE : text=cone .asText(); break;
  235. case SHAPE_PYRAMID: text=pyramid.asText(); break;
  236. case SHAPE_PLANE : text=plane .asText(); break;
  237. }
  238. return include_shape_type_name ? S+ShapeTypeName(type)+'('+text+')' : text;
  239. }
  240. Matrix Shape::asMatrix()C
  241. {
  242. switch(type)
  243. {
  244. default : return MatrixIdentity;
  245. case SHAPE_POINT : return point;
  246. case SHAPE_EDGE : return Matrix().setPosDir(edge.p[0], edge.dir());
  247. case SHAPE_RECT : return Vec(rect .center(), 0);
  248. case SHAPE_BOX : return box .center();
  249. case SHAPE_OBOX : return Matrix( obox .center(), obox.matrix.orn());
  250. case SHAPE_CIRCLE : return Vec(circle .pos , 0);
  251. case SHAPE_BALL : return ball .pos;
  252. case SHAPE_CAPSULE: return Matrix().setPosUp( capsule.pos, capsule.up);
  253. case SHAPE_TUBE : return Matrix().setPosUp( tube .pos, tube .up);
  254. case SHAPE_TORUS : return Matrix().setPosUp( torus .pos, torus .up);
  255. case SHAPE_CONE : return Matrix().setPosUp( cone .pos, cone .up);
  256. case SHAPE_PYRAMID: return pyramid;
  257. case SHAPE_PLANE : return Matrix().setPosUp( plane.pos , plane .normal);
  258. }
  259. }
  260. Matrix Shape::asMatrixScaled()C
  261. {
  262. Matrix m;
  263. switch(type)
  264. {
  265. default : return MatrixIdentity;
  266. case SHAPE_POINT : return point;
  267. case SHAPE_EDGE : m.setPosDir(edge.p[0], edge.dir()); m.z*=edge.length(); return m;
  268. case SHAPE_RECT : m=Vec (rect .center(), 0); m.x*= rect.w()*0.5f; m.y*= rect.h()*0.5f; return m;
  269. case SHAPE_BOX : m= box .center(); m.x*= box.w()*0.5f; m.y*= box.h()*0.5f; m.z*= box.d()*0.5f; return m;
  270. case SHAPE_OBOX : m=Matrix(obox .center(), obox.matrix.orn()); m.x*=obox.box.w()*0.5f; m.y*=obox.box.h()*0.5f; m.z*=obox.box.d()*0.5f; return m;
  271. case SHAPE_CIRCLE : return Matrix(circle.r, Vec(circle.pos, 0));
  272. case SHAPE_BALL : return Matrix(ball .r, ball .pos );
  273. case SHAPE_CAPSULE: m.setPosUp(capsule.pos, capsule.up); m.x*= capsule.r ; m.y*=capsule.h*0.5f; m.z*= capsule.r ; return m;
  274. case SHAPE_TUBE : m.setPosUp(tube .pos, tube .up); m.x*= tube .r ; m.y*=tube .h*0.5f; m.z*= tube .r ; return m;
  275. case SHAPE_TORUS : m.setPosUp(torus .pos, torus .up); m.x*= torus .R +torus.r ; m.y*=torus .r ; m.z*= torus .R +torus.r ; return m;
  276. case SHAPE_CONE : m.setPosUp(cone .pos, cone .up); m.x*=Max(cone .r_low, cone.r_high); m.y*=cone .h ; m.z*=Max(cone .r_low, cone.r_high); return m;
  277. case SHAPE_PYRAMID: m=pyramid; m.x*=pyramid.scale*pyramid.h; m.y*=pyramid.scale*pyramid.h; m.z*=pyramid.h; return m;
  278. case SHAPE_PLANE : return Matrix().setPosUp(plane.pos, plane.normal);
  279. }
  280. }
  281. /******************************************************************************/
  282. Shape& Shape::extend(Flt e)
  283. {
  284. switch(type)
  285. {
  286. case SHAPE_RECT : rect .extend(e); break;
  287. case SHAPE_BOX : box .extend(e); break;
  288. case SHAPE_OBOX : obox .extend(e); break;
  289. case SHAPE_CIRCLE : circle .extend(e); break;
  290. case SHAPE_BALL : ball .extend(e); break;
  291. case SHAPE_CAPSULE: capsule.extend(e); break;
  292. case SHAPE_TUBE : tube .extend(e); break;
  293. case SHAPE_TORUS : torus .extend(e); break;
  294. }
  295. return T;
  296. }
  297. /******************************************************************************/
  298. Shape& Shape::mirrorX()
  299. {
  300. switch(type)
  301. {
  302. case SHAPE_POINT : CHS(point.x); break;
  303. case SHAPE_EDGE : CHS(edge.p[0].x); CHS(edge.p[1].x); break;
  304. case SHAPE_RECT : CHS(rect.min.x ); CHS(rect.max.x ); Swap(rect.min.x, rect.max.x); break;
  305. case SHAPE_BOX : CHS(box .min.x ); CHS(box .max.x ); Swap(box .min.x, box .max.x); break;
  306. case SHAPE_OBOX : obox.mirrorX(); break;
  307. case SHAPE_CIRCLE : CHS(circle .pos.x); break;
  308. case SHAPE_BALL : CHS(ball .pos.x); break;
  309. case SHAPE_CAPSULE: CHS(capsule.pos.x); CHS(capsule.up.x); break;
  310. case SHAPE_TUBE : CHS(tube .pos.x); CHS(tube .up.x); break;
  311. case SHAPE_TORUS : CHS(torus .pos.x); CHS(torus .up.x); break;
  312. case SHAPE_CONE : CHS(cone .pos.x); CHS(cone .up.x); break;
  313. case SHAPE_PYRAMID: pyramid.mirrorX(); break;
  314. case SHAPE_PLANE : CHS(plane.pos.x); CHS(plane.normal.x); break;
  315. }
  316. return T;
  317. }
  318. Shape& Shape::mirrorY()
  319. {
  320. switch(type)
  321. {
  322. case SHAPE_POINT : CHS(point.y); break;
  323. case SHAPE_EDGE : CHS(edge.p[0].y); CHS(edge.p[1].y); break;
  324. case SHAPE_RECT : CHS(rect.min.y ); CHS(rect.max.y ); Swap(rect.min.y, rect.max.y); break;
  325. case SHAPE_BOX : CHS(box .min.y ); CHS(box .max.y ); Swap(box .min.y, box .max.y); break;
  326. case SHAPE_OBOX : obox.mirrorY(); break;
  327. case SHAPE_CIRCLE : CHS(circle .pos.y); break;
  328. case SHAPE_BALL : CHS(ball .pos.y); break;
  329. case SHAPE_CAPSULE: CHS(capsule.pos.y); CHS(capsule.up.y); break;
  330. case SHAPE_TUBE : CHS(tube .pos.y); CHS(tube .up.y); break;
  331. case SHAPE_TORUS : CHS(torus .pos.y); CHS(torus .up.y); break;
  332. case SHAPE_CONE : CHS(cone .pos.y); CHS(cone .up.y); break;
  333. case SHAPE_PYRAMID: pyramid.mirrorY(); break;
  334. case SHAPE_PLANE : CHS(plane.pos.y); CHS(plane.normal.y); break;
  335. }
  336. return T;
  337. }
  338. Shape& Shape::mirrorZ()
  339. {
  340. switch(type)
  341. {
  342. case SHAPE_POINT : CHS(point.z); break;
  343. case SHAPE_EDGE : CHS(edge.p[0].z); CHS(edge.p[1].z); break;
  344. //case SHAPE_RECT : CHS(rect.min.z ); CHS(rect.max.z ); Swap(rect.min.z, rect.max.z); break; // Rect is 2D and doesn't have Z
  345. case SHAPE_BOX : CHS(box .min.z ); CHS(box .max.z ); Swap(box .min.z, box .max.z); break;
  346. case SHAPE_OBOX : obox.mirrorZ(); break;
  347. //case SHAPE_CIRCLE : CHS(circle .pos.z); break; // Circle is 2D and doesn't have Z
  348. case SHAPE_BALL : CHS(ball .pos.z); break;
  349. case SHAPE_CAPSULE: CHS(capsule.pos.z); CHS(capsule.up.z); break;
  350. case SHAPE_TUBE : CHS(tube .pos.z); CHS(tube .up.z); break;
  351. case SHAPE_TORUS : CHS(torus .pos.z); CHS(torus .up.z); break;
  352. case SHAPE_CONE : CHS(cone .pos.z); CHS(cone .up.z); break;
  353. case SHAPE_PYRAMID: pyramid.mirrorZ(); break;
  354. case SHAPE_PLANE : CHS(plane.pos.z); CHS(plane.normal.z); break;
  355. }
  356. return T;
  357. }
  358. /******************************************************************************/
  359. void Shape::draw(C Color &color, Bool fill)C
  360. {
  361. switch(type)
  362. {
  363. case SHAPE_POINT : point .draw(color ); break;
  364. case SHAPE_EDGE : edge .draw(color ); break;
  365. case SHAPE_RECT : rect .draw(color, fill); break;
  366. case SHAPE_BOX : box .draw(color, fill); break;
  367. case SHAPE_OBOX : obox .draw(color, fill); break;
  368. case SHAPE_CIRCLE : circle .draw(color, fill); break;
  369. case SHAPE_BALL : ball .draw(color, fill); break;
  370. case SHAPE_CAPSULE: capsule.draw(color, fill); break;
  371. case SHAPE_TUBE : tube .draw(color, fill); break;
  372. case SHAPE_TORUS : torus .draw(color, fill); break;
  373. case SHAPE_CONE : cone .draw(color, fill); break;
  374. case SHAPE_PYRAMID: pyramid.draw(color, fill); break;
  375. case SHAPE_PLANE : plane .drawLocal(color, 10, fill); break;
  376. }
  377. }
  378. /******************************************************************************/
  379. // IO
  380. /******************************************************************************/
  381. Bool Shape::save(File &f)C
  382. {
  383. f.putMulti(Byte(0), type); // version
  384. switch(type)
  385. {
  386. case SHAPE_NONE : break;
  387. case SHAPE_POINT : f<<point ; break;
  388. case SHAPE_EDGE : f<<edge ; break;
  389. case SHAPE_RECT : f<<rect ; break;
  390. case SHAPE_BOX : f<<box ; break;
  391. case SHAPE_OBOX : f<<obox ; break;
  392. case SHAPE_CIRCLE : f<<circle ; break;
  393. case SHAPE_BALL : f<<ball ; break;
  394. case SHAPE_CAPSULE: f<<capsule; break;
  395. case SHAPE_TUBE : f<<tube ; break;
  396. case SHAPE_TORUS : f<<torus ; break;
  397. case SHAPE_CONE : f<<cone ; break;
  398. case SHAPE_PYRAMID: f<<pyramid; break;
  399. case SHAPE_PLANE : f<<plane ; break;
  400. default : return false;
  401. }
  402. return f.ok();
  403. }
  404. /******************************************************************************/
  405. Bool Shape::load(File &f)
  406. {
  407. switch(f.decUIntV())
  408. {
  409. case 0:
  410. {
  411. f>>type; switch(type)
  412. {
  413. case SHAPE_NONE : break;
  414. case SHAPE_POINT : f>>point ; break;
  415. case SHAPE_EDGE : f>>edge ; break;
  416. case SHAPE_RECT : f>>rect ; break;
  417. case SHAPE_BOX : f>>box ; break;
  418. case SHAPE_OBOX : f>>obox ; break;
  419. case SHAPE_CIRCLE : f>>circle ; break;
  420. case SHAPE_BALL : f>>ball ; break;
  421. case SHAPE_CAPSULE: f>>capsule; break;
  422. case SHAPE_TUBE : f>>tube ; break;
  423. case SHAPE_TORUS : f>>torus ; break;
  424. case SHAPE_CONE : f>>cone ; break;
  425. case SHAPE_PYRAMID: f>>pyramid; break;
  426. case SHAPE_PLANE : f>>plane ; break;
  427. default : goto error;
  428. }
  429. if(f.ok())return true;
  430. }break;
  431. }
  432. error:
  433. type=SHAPE_NONE; return false;
  434. }
  435. /******************************************************************************/
  436. // MAIN
  437. /******************************************************************************/
  438. Bool ShapeType2D(SHAPE_TYPE type)
  439. {
  440. switch(type)
  441. {
  442. case SHAPE_RECT :
  443. case SHAPE_CIRCLE: return true ;
  444. default : return false;
  445. }
  446. }
  447. Bool ShapeTypeRound(SHAPE_TYPE type)
  448. {
  449. switch(type)
  450. {
  451. case SHAPE_CIRCLE :
  452. case SHAPE_BALL :
  453. case SHAPE_CAPSULE:
  454. case SHAPE_TUBE :
  455. case SHAPE_TORUS :
  456. case SHAPE_CONE : return true ;
  457. default : return false;
  458. }
  459. }
  460. CChar* ShapeTypeName(SHAPE_TYPE type)
  461. {
  462. switch(type)
  463. {
  464. case SHAPE_POINT : return u"Point";
  465. case SHAPE_EDGE : return u"Edge";
  466. case SHAPE_RECT : return u"Rectangle";
  467. case SHAPE_BOX : return u"Box";
  468. case SHAPE_OBOX : return u"OrientedBox";
  469. case SHAPE_CIRCLE : return u"Circle";
  470. case SHAPE_BALL : return u"Ball";
  471. case SHAPE_CAPSULE: return u"Capsule";
  472. case SHAPE_TUBE : return u"Tube";
  473. case SHAPE_TORUS : return u"Torus";
  474. case SHAPE_CONE : return u"Cone";
  475. case SHAPE_PYRAMID: return u"Pyramid";
  476. case SHAPE_PLANE : return u"Plane";
  477. default : return S;
  478. }
  479. }
  480. /******************************************************************************/
  481. Bool SweepPointShape(C Vec &point, C Vec &move, C Shape &shape, Flt *hit_frac, Vec *hit_normal)
  482. {
  483. switch(shape.type)
  484. {
  485. //case SHAPE_EDGE : if(hit_normal)hit_normal->z=0; return SweepPointEdge (point.xy, move.xy, shape.edge2 , hit_frac, &hit_normal->xy);
  486. case SHAPE_RECT : if(hit_normal)hit_normal->z=0; return SweepPointRect (point.xy, move.xy, shape.rect , hit_frac, &hit_normal->xy);
  487. case SHAPE_BOX : return SweepPointBox (point , move , shape.box , hit_frac, hit_normal);
  488. case SHAPE_OBOX : return SweepPointBox (point , move , shape.obox , hit_frac, hit_normal);
  489. case SHAPE_CIRCLE : if(hit_normal)hit_normal->z=0; return SweepPointCircle (point.xy, move.xy, shape.circle , hit_frac, &hit_normal->xy);
  490. case SHAPE_BALL : return SweepPointBall (point , move , shape.ball , hit_frac, hit_normal);
  491. case SHAPE_CAPSULE: return SweepPointCapsule(point , move , shape.capsule, hit_frac, hit_normal);
  492. case SHAPE_TUBE : return SweepPointTube (point , move , shape.tube , hit_frac, hit_normal);
  493. //case SHAPE_TORUS : return SweepPointTorus (point , move , shape.torus , hit_frac, hit_normal);
  494. //case SHAPE_CONE : return SweepPointCone (point , move , shape.cone , hit_frac, hit_normal);
  495. //case SHAPE_PYRAMID: return SweepPointPyramid(point , move , shape.pyramid, hit_frac, hit_normal);
  496. case SHAPE_PLANE : return SweepPointPlane (point , move , shape.plane , hit_frac, hit_normal);
  497. default : return false;
  498. }
  499. }
  500. /******************************************************************************/
  501. Flt Dist(C Shape &a, C Shape &b)
  502. {
  503. switch(a.type)
  504. {
  505. case SHAPE_POINT: switch(b.type)
  506. {
  507. case SHAPE_POINT : return Dist(a.point , b.point );
  508. case SHAPE_RECT : return Dist(a.point.xy, b.rect );
  509. case SHAPE_BOX : return Dist(a.point , b.box );
  510. case SHAPE_OBOX : return Dist(a.point , b.obox );
  511. case SHAPE_CIRCLE : return Dist(a.point.xy, b.circle );
  512. case SHAPE_BALL : return Dist(a.point , b.ball );
  513. case SHAPE_CAPSULE: return Dist(a.point , b.capsule);
  514. case SHAPE_TORUS : return Dist(a.point , b.torus );
  515. case SHAPE_PLANE : return Dist(a.point , b.plane );
  516. }break;
  517. case SHAPE_EDGE: switch(b.type)
  518. {
  519. case SHAPE_POINT : return Dist(b.point, a.edge ); // swapped
  520. case SHAPE_EDGE : return Dist(a.edge , b.edge );
  521. case SHAPE_BOX : return Dist(a.edge , b.box );
  522. case SHAPE_OBOX : return Dist(a.edge , b.obox );
  523. case SHAPE_BALL : return Dist(a.edge , b.ball );
  524. case SHAPE_CAPSULE: return Dist(a.edge , b.capsule);
  525. case SHAPE_PLANE : return Dist(a.edge , b.plane );
  526. }break;
  527. case SHAPE_RECT: switch(b.type)
  528. {
  529. case SHAPE_POINT : return Dist(b.point.xy, a.rect ); // swapped
  530. case SHAPE_RECT : return Dist(a.rect , b.rect );
  531. case SHAPE_CIRCLE: return Dist(a.rect , b.circle);
  532. }break;
  533. case SHAPE_BOX: switch(b.type)
  534. {
  535. case SHAPE_POINT : return Dist(b.point, a.box ); // swapped
  536. case SHAPE_EDGE : return Dist(b.edge , a.box ); // swapped
  537. case SHAPE_BOX : return Dist(a.box , b.box );
  538. case SHAPE_BALL : return Dist(a.box , b.ball );
  539. case SHAPE_CAPSULE: return Dist(a.box , b.capsule);
  540. case SHAPE_PLANE : return Dist(a.box , b.plane );
  541. }break;
  542. case SHAPE_OBOX: switch(b.type)
  543. {
  544. case SHAPE_POINT : return Dist(b.point, a.obox ); // swapped
  545. case SHAPE_EDGE : return Dist(b.edge , a.obox ); // swapped
  546. case SHAPE_BALL : return Dist(a.obox , b.ball );
  547. case SHAPE_CAPSULE: return Dist(a.obox , b.capsule);
  548. case SHAPE_PLANE : return Dist(a.obox , b.plane );
  549. }break;
  550. case SHAPE_CIRCLE: switch(b.type)
  551. {
  552. case SHAPE_POINT : return Dist(b.point.xy, a.circle); // swapped
  553. case SHAPE_RECT : return Dist(b.rect , a.circle); // swapped
  554. case SHAPE_CIRCLE: return Dist(a.circle , b.circle);
  555. }break;
  556. case SHAPE_BALL: switch(b.type)
  557. {
  558. case SHAPE_POINT : return Dist(b.point, a.ball ); // swapped
  559. case SHAPE_EDGE : return Dist(b.edge , a.ball ); // swapped
  560. case SHAPE_BOX : return Dist(b.box , a.ball ); // swapped
  561. case SHAPE_OBOX : return Dist(b.obox , a.ball ); // swapped
  562. case SHAPE_BALL : return Dist(a.ball , b.ball );
  563. case SHAPE_CAPSULE: return Dist(a.ball , b.capsule);
  564. case SHAPE_PLANE : return Dist(a.ball , b.plane );
  565. }break;
  566. case SHAPE_CAPSULE: switch(b.type)
  567. {
  568. case SHAPE_POINT : return Dist(b.point , a.capsule); // swapped
  569. case SHAPE_EDGE : return Dist(b.edge , a.capsule); // swapped
  570. case SHAPE_BOX : return Dist(b.box , a.capsule); // swapped
  571. case SHAPE_OBOX : return Dist(b.obox , a.capsule); // swapped
  572. case SHAPE_BALL : return Dist(b.ball , a.capsule); // swapped
  573. case SHAPE_CAPSULE: return Dist(a.capsule, b.capsule);
  574. case SHAPE_PLANE : return Dist(a.capsule, b.plane );
  575. }break;
  576. case SHAPE_PLANE: switch(b.type)
  577. {
  578. case SHAPE_POINT : return Dist(b.point , a.plane); // swapped
  579. case SHAPE_EDGE : return Dist(b.edge , a.plane); // swapped
  580. case SHAPE_BOX : return Dist(b.box , a.plane); // swapped
  581. case SHAPE_OBOX : return Dist(b.obox , a.plane); // swapped
  582. case SHAPE_BALL : return Dist(b.ball , a.plane); // swapped
  583. case SHAPE_CAPSULE: return Dist(b.capsule, a.plane); // swapped
  584. }break;
  585. case SHAPE_TORUS: switch(b.type)
  586. {
  587. case SHAPE_POINT: return Dist(b.point, a.torus); // swapped
  588. }break;
  589. }
  590. return 0;
  591. }
  592. /******************************************************************************/
  593. Bool Cuts(C Vec2 &p, C Shape &s)
  594. {
  595. switch(s.type)
  596. {
  597. case SHAPE_RECT : return Cuts(p, s.rect );
  598. case SHAPE_CIRCLE: return Cuts(p, s.circle);
  599. }
  600. return false;
  601. }
  602. Bool Cuts(C Vec &p, C Shape &s)
  603. {
  604. switch(s.type)
  605. {
  606. case SHAPE_RECT : return Cuts(p.xy, s.rect );
  607. case SHAPE_BOX : return Cuts(p , s.box );
  608. case SHAPE_OBOX : return Cuts(p , s.obox );
  609. case SHAPE_CIRCLE : return Cuts(p.xy, s.circle );
  610. case SHAPE_BALL : return Cuts(p , s.ball );
  611. case SHAPE_CAPSULE: return Cuts(p , s.capsule);
  612. case SHAPE_TUBE : return Cuts(p , s.tube );
  613. case SHAPE_CONE : return Cuts(p , s.cone );
  614. case SHAPE_PYRAMID: return Cuts(p , s.pyramid);
  615. case SHAPE_PLANE : return Cuts(p , s.plane );
  616. }
  617. return false;
  618. }
  619. /******************************************************************************/
  620. Bool Cuts(C Shape &a, C Shape &b)
  621. {
  622. switch(a.type)
  623. {
  624. case SHAPE_POINT: switch(b.type)
  625. {
  626. case SHAPE_RECT : return Cuts(a.point.xy, b.rect );
  627. case SHAPE_BOX : return Cuts(a.point , b.box );
  628. case SHAPE_OBOX : return Cuts(a.point , b.obox );
  629. case SHAPE_CIRCLE : return Cuts(a.point.xy, b.circle );
  630. case SHAPE_BALL : return Cuts(a.point , b.ball );
  631. case SHAPE_CAPSULE: return Cuts(a.point , b.capsule);
  632. case SHAPE_TUBE : return Cuts(a.point , b.tube );
  633. case SHAPE_CONE : return Cuts(a.point , b.cone );
  634. case SHAPE_PYRAMID: return Cuts(a.point , b.pyramid);
  635. case SHAPE_PLANE : return Cuts(a.point , b.plane );
  636. }break;
  637. case SHAPE_EDGE: switch(b.type)
  638. {
  639. case SHAPE_BOX : return Cuts(a.edge, b.box );
  640. case SHAPE_OBOX : return Cuts(a.edge, b.obox );
  641. case SHAPE_BALL : return Cuts(a.edge, b.ball );
  642. case SHAPE_CAPSULE: return Cuts(a.edge, b.capsule);
  643. case SHAPE_TUBE : return Cuts(a.edge, b.tube );
  644. }break;
  645. case SHAPE_RECT: switch(b.type)
  646. {
  647. case SHAPE_POINT : return Cuts(b.point.xy, a.rect ); // swapped
  648. case SHAPE_RECT : return Cuts(a.rect , b.rect );
  649. case SHAPE_CIRCLE: return Cuts(a.rect , b.circle);
  650. case SHAPE_BOX : return Cuts(a.rect , b.box );
  651. }break;
  652. case SHAPE_BOX: switch(b.type)
  653. {
  654. case SHAPE_POINT : return Cuts(b.point, a.box ); // swapped
  655. case SHAPE_EDGE : return Cuts(b.edge , a.box ); // swapped
  656. case SHAPE_RECT : return Cuts(b.rect , a.box ); // swapped
  657. case SHAPE_BOX : return Cuts(a.box , b.box );
  658. case SHAPE_OBOX : return Cuts(a.box , b.obox );
  659. case SHAPE_BALL : return Cuts(a.box , b.ball );
  660. case SHAPE_CAPSULE: return Cuts(a.box , b.capsule);
  661. }break;
  662. case SHAPE_OBOX: switch(b.type)
  663. {
  664. case SHAPE_POINT : return Cuts(b.point, a.obox ); // swapped
  665. case SHAPE_EDGE : return Cuts(b.edge , a.obox ); // swapped
  666. case SHAPE_BOX : return Cuts(b.box , a.obox ); // swapped
  667. case SHAPE_OBOX : return Cuts(a.obox , b.obox );
  668. case SHAPE_BALL : return Cuts(a.obox , b.ball );
  669. case SHAPE_CAPSULE: return Cuts(a.obox , b.capsule);
  670. }break;
  671. case SHAPE_CIRCLE: switch(b.type)
  672. {
  673. case SHAPE_POINT : return Cuts(b.point.xy, a.circle); // swapped
  674. case SHAPE_RECT : return Cuts(b.rect , a.circle); // swapped
  675. case SHAPE_CIRCLE: return Cuts(a.circle , b.circle);
  676. }break;
  677. case SHAPE_BALL: switch(b.type)
  678. {
  679. case SHAPE_POINT : return Cuts(b.point, a.ball ); // swapped
  680. case SHAPE_EDGE : return Cuts(b.edge , a.ball ); // swapped
  681. case SHAPE_BOX : return Cuts(b.box , a.ball ); // swapped
  682. case SHAPE_OBOX : return Cuts(b.obox , a.ball ); // swapped
  683. case SHAPE_BALL : return Cuts(a.ball , b.ball );
  684. case SHAPE_CAPSULE: return Cuts(a.ball , b.capsule);
  685. }break;
  686. case SHAPE_CAPSULE: switch(b.type)
  687. {
  688. case SHAPE_POINT : return Cuts(b.point , a.capsule); // swapped
  689. case SHAPE_EDGE : return Cuts(b.edge , a.capsule); // swapped
  690. case SHAPE_BOX : return Cuts(b.box , a.capsule); // swapped
  691. case SHAPE_OBOX : return Cuts(b.obox , a.capsule); // swapped
  692. case SHAPE_BALL : return Cuts(b.ball , a.capsule); // swapped
  693. case SHAPE_CAPSULE: return Cuts(a.capsule, b.capsule);
  694. }break;
  695. case SHAPE_TUBE: switch(b.type)
  696. {
  697. case SHAPE_POINT: return Cuts(b.point, a.tube); // swapped
  698. case SHAPE_EDGE : return Cuts(b.edge , a.tube); // swapped
  699. }break;
  700. case SHAPE_CONE: switch(b.type)
  701. {
  702. case SHAPE_POINT: return Cuts(b.point, a.cone); // swapped
  703. }break;
  704. case SHAPE_PYRAMID: switch(b.type)
  705. {
  706. case SHAPE_POINT: return Cuts(b.point, a.pyramid); // swapped
  707. }break;
  708. case SHAPE_PLANE: switch(b.type)
  709. {
  710. case SHAPE_POINT: return Cuts(b.point, a.plane); // swapped
  711. }break;
  712. }
  713. return false;
  714. }
  715. /******************************************************************************/
  716. }
  717. /******************************************************************************/