Actor.cpp 37 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542
  1. #include "Actor.h"
  2. #include "core/Texture.h"
  3. #include "res/ResAnim.h"
  4. #include "Stage.h"
  5. #include "Clock.h"
  6. #include "Tween.h"
  7. #include "math/AffineTransform.h"
  8. #include <sstream>
  9. #include <typeinfo>
  10. #define _USE_MATH_DEFINES
  11. #include <math.h>
  12. #include "utils/stringUtils.h"
  13. #include "RenderState.h"
  14. #include <stdio.h>
  15. #include "Serialize.h"
  16. #include "Material.h"
  17. //#include ""
  18. namespace oxygine
  19. {
  20. CREATE_COPYCLONE_NEW(Actor);
  21. std::string div(const std::string& val, const Color& color)
  22. {
  23. char str[255];
  24. safe_sprintf(str, "<div c='%s'>%s</div>", color2hex(color).c_str(), val.c_str());
  25. return str;
  26. }
  27. Actor::Actor():
  28. _extendedIsOn(0),
  29. _zOrder(0),
  30. _scale(1, 1),
  31. _rotation(0),
  32. _flags(flag_visible | flag_touchEnabled | flag_touchChildrenEnabled | flag_childrenRelative | flag_fastTransform),
  33. _parent(0),
  34. _alpha(255),
  35. _pressed(0),
  36. _overred(0),
  37. _stage(0),
  38. _material(0)
  39. {
  40. _transform.identity();
  41. _transformInvert.identity();
  42. }
  43. void Actor::copyFrom(const Actor& src, cloneOptions opt)
  44. {
  45. _stage = 0;
  46. _pos = src._pos;
  47. _extendedIsOn = src._extendedIsOn;
  48. _size = src._size;
  49. _zOrder = src._zOrder;
  50. _anchor = src._anchor;
  51. _scale = src._scale;
  52. _rotation = src._rotation;
  53. _flags = src._flags;
  54. _parent = 0;
  55. _alpha = src._alpha;
  56. _overred = 0;
  57. _pressed = 0;
  58. _transform = src._transform;
  59. _transformInvert = src._transformInvert;
  60. if (!(opt & cloneOptionsDoNotCloneClildren))
  61. {
  62. spActor child = src.getFirstChild();
  63. while (child)
  64. {
  65. spActor copy = child->clone(opt);
  66. addChild(copy);
  67. child = child->getNextSibling();
  68. }
  69. }
  70. if (opt & cloneOptionsResetTransform)
  71. {
  72. setPosition(0, 0);
  73. setRotation(0);
  74. setScale(1);
  75. }
  76. if (src.__getName())
  77. setName(src.getName());
  78. }
  79. Actor::~Actor()
  80. {
  81. //printf("Actor::~Actor %s\n", getName().c_str());
  82. removeTweens();
  83. removeChildren();
  84. }
  85. Stage* Actor::_getStage()
  86. {
  87. return _stage;
  88. }
  89. void Actor::added2stage(Stage* stage)
  90. {
  91. OX_ASSERT(_stage == 0);
  92. _stage = stage;
  93. onAdded2Stage();
  94. spActor actor = _children._first;
  95. while (actor)
  96. {
  97. spActor next = actor->_next;
  98. actor->added2stage(stage);
  99. actor = next;
  100. }
  101. }
  102. void Actor::removedFromStage()
  103. {
  104. OX_ASSERT(_stage);
  105. onRemovedFromStage();
  106. _stage->removeEventListeners(this);
  107. _stage = 0;
  108. _pressed = 0;
  109. _overred = 0;
  110. spActor actor = _children._first;
  111. while (actor)
  112. {
  113. spActor next = actor->_next;
  114. actor->removedFromStage();
  115. actor = next;
  116. }
  117. }
  118. std::string Actor::dump(const dumpOptions& opt) const
  119. {
  120. std::stringstream stream;
  121. stream << "{" << typeid(*this).name() << "}";
  122. //stream << this;
  123. #if DYNAMIC_OBJECT_NAME
  124. if (__name && __name->size())
  125. stream << " name='" << div(*__name, Color::Red) << "'";
  126. #else
  127. if (__name.size())
  128. stream << " name='" << div(__name, Color::Red) << "'";
  129. #endif
  130. stream << " id='" << getObjectID() << "'";
  131. stream << "\n";
  132. if (!getVisible())
  133. stream << " invisible";
  134. if (!getTouchEnabled())
  135. stream << " touchEnabled=false";
  136. if (!getTouchChildrenEnabled())
  137. stream << " touchChildrenEnabled=false";
  138. if (getAlpha() != 255)
  139. stream << " alpha=" << (int)getAlpha();
  140. if (getWidth() || getHeight())
  141. stream << " size=(" << getWidth() << "," << getHeight() << ")";
  142. if (getPriority())
  143. stream << " priority=" << getPriority();
  144. if (_extendedIsOn)
  145. stream << " extendedClickArea=" << (int)_extendedIsOn;
  146. if (getX() != 0.0f || getY() != 0.0f)
  147. stream << " pos=(" << getX() << "," << getY() << ")";
  148. if (getScaleX() != 1.0f || getScaleY() != 1.0f)
  149. stream << " scale=(" << getScaleX() << "," << getScaleY() << ")";
  150. if (getAnchor().x || getAnchor().y)
  151. stream << " anchor=(" << getAnchor().x << "," << getAnchor().y << ")";
  152. if (getRotation() != 0.0f)
  153. stream << " rot=" << getRotation() / MATH_PI * 360.0f << "";
  154. int tweensCount = 0;
  155. spTween t = _tweens._first;
  156. while (t)
  157. {
  158. t = t->getNextSibling();
  159. tweensCount++;
  160. }
  161. if (tweensCount)
  162. stream << " tweens=" << tweensCount << "";
  163. if (getListenersCount())
  164. stream << " listeners=" << (int)getListenersCount() << "";
  165. /*
  166. int handlersCount = 0;
  167. spEventHandler eh = _eventHandlers._first;
  168. while (eh)
  169. {
  170. eh = eh->getNextSibling();
  171. handlersCount++;
  172. }
  173. if (handlersCount)
  174. stream << " handlers=" << handlersCount << "";
  175. */
  176. if (getClock())
  177. stream << " " << getClock()->dump();
  178. return stream.str();
  179. }
  180. pointer_index Actor::getPressed() const
  181. {
  182. return _pressed;
  183. }
  184. pointer_index Actor::getOvered() const
  185. {
  186. return _overred;
  187. }
  188. void Actor::setNotPressed()
  189. {
  190. _pressed = 0;
  191. _getStage()->removeEventListener(TouchEvent::TOUCH_UP, CLOSURE(this, &Actor::_onGlobalTouchUpEvent));
  192. updateState();
  193. }
  194. void Actor::_onGlobalTouchUpEvent(Event* ev)
  195. {
  196. TouchEvent* te = safeCast<TouchEvent*>(ev);
  197. if (te->index != _pressed)
  198. return;
  199. setNotPressed();
  200. TouchEvent up = *te;
  201. up.bubbles = false;
  202. up.localPosition = convert_global2local(this, _getStage(), te->localPosition);
  203. dispatchEvent(&up);
  204. }
  205. void Actor::_onGlobalTouchMoveEvent(Event* ev)
  206. {
  207. TouchEvent* te = safeCast<TouchEvent*>(ev);
  208. if (te->index != _overred)
  209. return;
  210. if (isDescendant(safeCast<Actor*>(ev->target.get())))
  211. return;
  212. _overred = 0;
  213. _getStage()->removeEventListener(TouchEvent::MOVE, CLOSURE(this, &Actor::_onGlobalTouchMoveEvent));
  214. TouchEvent up = *te;
  215. up.type = TouchEvent::OUT;
  216. up.bubbles = false;
  217. up.localPosition = convert_global2local(this, _getStage(), te->localPosition);
  218. dispatchEvent(&up);
  219. updateState();
  220. }
  221. void Actor::dispatchEvent(Event* event)
  222. {
  223. if (event->type == TouchEvent::MOVE)
  224. {
  225. TouchEvent* te = safeCast<TouchEvent*>(event);
  226. if (!_overred)
  227. {
  228. _overred = te->index;
  229. updateState();
  230. TouchEvent over = *te;
  231. over.type = TouchEvent::OVER;
  232. over.bubbles = false;
  233. dispatchEvent(&over);
  234. _getStage()->addEventListener(TouchEvent::MOVE, CLOSURE(this, &Actor::_onGlobalTouchMoveEvent));
  235. }
  236. }
  237. if (event->type == TouchEvent::TOUCH_DOWN)
  238. {
  239. TouchEvent* te = safeCast<TouchEvent*>(event);
  240. if (!_pressed)
  241. {
  242. _pressed = te->index;
  243. _getStage()->addEventListener(TouchEvent::TOUCH_UP, CLOSURE(this, &Actor::_onGlobalTouchUpEvent));
  244. updateState();
  245. }
  246. }
  247. TouchEvent click(0);
  248. if (event->type == TouchEvent::TOUCH_UP)
  249. {
  250. TouchEvent* te = safeCast<TouchEvent*>(event);
  251. if (_pressed == te->index)
  252. {
  253. click = *te;
  254. click.type = TouchEvent::CLICK;
  255. click.bubbles = false;
  256. //will be dispatched later after UP
  257. setNotPressed();
  258. }
  259. }
  260. EventDispatcher::dispatchEvent(event);
  261. if (!event->stopsImmediatePropagation && event->bubbles && !event->stopsPropagation)
  262. {
  263. if (_parent)
  264. {
  265. if (TouchEvent::isTouchEvent(event->type))
  266. {
  267. TouchEvent* me = safeCast<TouchEvent*>(event);
  268. me->localPosition = local2global(me->localPosition);
  269. }
  270. event->phase = Event::phase_bubbling;
  271. event->currentTarget = 0;
  272. _parent->dispatchEvent(event);
  273. }
  274. }
  275. if (click.type)
  276. {
  277. //send click event at the end after TOUCH_UP event
  278. dispatchEvent(&click);
  279. }
  280. }
  281. void Actor::handleEvent(Event* event)
  282. {
  283. bool touchEvent = TouchEvent::isTouchEvent(event->type);
  284. if (touchEvent)
  285. {
  286. if (!(_flags & flag_visible) || getAlpha() == 0)
  287. return;
  288. }
  289. Vector2 originalLocalPos;
  290. if (touchEvent)
  291. {
  292. TouchEvent* me = safeCast<TouchEvent*>(event);
  293. originalLocalPos = me->localPosition;
  294. me->localPosition = global2local(originalLocalPos);
  295. }
  296. event->phase = Event::phase_capturing;
  297. spActor actor = _children._last;
  298. while (actor)
  299. {
  300. spActor prev = actor->_prev;
  301. if (!touchEvent || (_flags & flag_touchChildrenEnabled))
  302. actor->handleEvent(event);
  303. //if (event->target)
  304. // break;
  305. actor = prev;
  306. }
  307. if (touchEvent)
  308. {
  309. TouchEvent* me = safeCast<TouchEvent*>(event);
  310. if (!event->target)
  311. {
  312. if ((_flags & flag_touchEnabled) && isOn(me->localPosition))
  313. {
  314. event->phase = Event::phase_target;
  315. event->target = this;
  316. me->position = me->localPosition;
  317. dispatchEvent(event);
  318. }
  319. }
  320. me->localPosition = originalLocalPos;
  321. }
  322. }
  323. void Actor::setAnchor(const Vector2& anchor)
  324. {
  325. _anchor = anchor;
  326. _flags &= ~flag_anchorInPixels;
  327. _flags |= flag_transformDirty | flag_transformInvertDirty;
  328. }
  329. void Actor::setAnchor(float ax, float ay)
  330. {
  331. setAnchor(Vector2(ax, ay));
  332. }
  333. void Actor::setAnchorInPixels(const Vector2& anchor)
  334. {
  335. _anchor = anchor;
  336. _flags |= flag_anchorInPixels;
  337. _flags |= flag_transformDirty | flag_transformInvertDirty;
  338. }
  339. void Actor::setAnchorInPixels(float x, float y)
  340. {
  341. setAnchorInPixels(Vector2(x, y));
  342. }
  343. void Actor::setPosition(const Vector2& pos)
  344. {
  345. if (_pos == pos)
  346. return;
  347. _pos = pos;
  348. _flags |= flag_transformDirty | flag_transformInvertDirty;
  349. }
  350. void Actor::setPosition(float x, float y)
  351. {
  352. setPosition(Vector2(x, y));
  353. }
  354. void Actor::setX(float x)
  355. {
  356. _pos.x = x;
  357. _flags |= flag_transformDirty | flag_transformInvertDirty;
  358. }
  359. void Actor::setY(float y)
  360. {
  361. _pos.y = y;
  362. _flags |= flag_transformDirty | flag_transformInvertDirty;
  363. }
  364. void Actor::setAnchorX(float x)
  365. {
  366. _anchor.x = x;
  367. _flags &= ~flag_anchorInPixels;
  368. _flags |= flag_transformDirty | flag_transformInvertDirty;
  369. }
  370. void Actor::setAnchorY(float y)
  371. {
  372. _anchor.y = y;
  373. _flags &= ~flag_anchorInPixels;
  374. _flags |= flag_transformDirty | flag_transformInvertDirty;
  375. }
  376. void Actor::setTransform(const AffineTransform& tr)
  377. {
  378. _transform = tr;
  379. _flags &= ~flag_transformDirty;
  380. _flags &= ~flag_fastTransform;
  381. _flags |= flag_transformInvertDirty;
  382. }
  383. void Actor::setPriority(short zorder)
  384. {
  385. if (_zOrder == zorder) // fixed by Evgeniy Golovin
  386. return;
  387. _zOrder = zorder;
  388. if (_parent)
  389. {
  390. Actor* parent = _parent;
  391. addRef();
  392. parent->removeChild(this);
  393. parent->addChild(this);
  394. releaseRef();
  395. }
  396. }
  397. void Actor::setScale(float scale)
  398. {
  399. setScale(Vector2(scale, scale));
  400. }
  401. void Actor::setScale(const Vector2& scale)
  402. {
  403. if (_scale == scale)
  404. return;
  405. _scale = scale;
  406. _flags |= flag_transformDirty | flag_transformInvertDirty;
  407. _flags &= ~flag_fastTransform;
  408. }
  409. void Actor::setScale(float scaleX, float scaleY)
  410. {
  411. setScale(Vector2(scaleX, scaleY));
  412. }
  413. void Actor::setScaleX(float sx)
  414. {
  415. if (_scale.x == sx)
  416. return;
  417. _scale.x = sx;
  418. _flags |= flag_transformDirty | flag_transformInvertDirty;
  419. _flags &= ~flag_fastTransform;
  420. }
  421. void Actor::setScaleY(float sy)
  422. {
  423. if (_scale.y == sy)
  424. return;
  425. _scale.y = sy;
  426. _flags |= flag_transformDirty | flag_transformInvertDirty;
  427. _flags &= ~flag_fastTransform;
  428. }
  429. void Actor::setRotation(float rotation)
  430. {
  431. if (_rotation == rotation)
  432. return;
  433. _rotation = rotation;
  434. _flags |= flag_transformDirty | flag_transformInvertDirty;
  435. _flags &= ~flag_fastTransform;
  436. }
  437. void Actor::setRotationDegrees(float degr)
  438. {
  439. float rad = degr * MATH_PI / 180.0f;
  440. setRotation(rad);
  441. }
  442. void Actor::sizeChanged(const Vector2& size)
  443. {
  444. }
  445. void Actor::_setSize(const Vector2& size)
  446. {
  447. _size = size;
  448. _flags |= flag_transformDirty | flag_transformInvertDirty;
  449. }
  450. void Actor::setSize(const Vector2& size)
  451. {
  452. _setSize(size);
  453. sizeChanged(size);
  454. }
  455. void Actor::setSize(float w, float h)
  456. {
  457. setSize(Vector2(w, h));
  458. }
  459. void Actor::setWidth(float w)
  460. {
  461. setSize(Vector2(w, _size.y));
  462. }
  463. void Actor::setHeight(float h)
  464. {
  465. setSize(Vector2(_size.x, h));
  466. }
  467. void Actor::setClock(spClock clock)
  468. {
  469. _clock = clock;
  470. }
  471. void Actor::setAlpha(unsigned char alpha)
  472. {
  473. _alpha = alpha;
  474. }
  475. void Actor::setMaterial(Material* mat)
  476. {
  477. _material = mat;
  478. }
  479. const Transform& Actor::getTransform() const
  480. {
  481. updateTransform();
  482. return _transform;
  483. }
  484. const Transform& Actor::getTransformInvert() const
  485. {
  486. if (_flags & flag_transformInvertDirty)
  487. {
  488. _flags &= ~flag_transformInvertDirty;
  489. _transformInvert = getTransform();
  490. _transformInvert.invert();
  491. }
  492. return _transformInvert;
  493. }
  494. float Actor::getWidth() const
  495. {
  496. return _size.x;
  497. }
  498. float Actor::getHeight() const
  499. {
  500. return _size.y;
  501. }
  502. unsigned char Actor::getAlpha() const
  503. {
  504. return _alpha;
  505. }
  506. const spClock& Actor::getClock() const
  507. {
  508. return _clock;
  509. }
  510. void Actor::updateTransform() const
  511. {
  512. if (!(_flags & flag_transformDirty))
  513. return;
  514. AffineTransform tr;
  515. if (_flags & flag_fastTransform)
  516. {
  517. tr = AffineTransform(1, 0, 0, 1, _pos.x, _pos.y);
  518. }
  519. else
  520. {
  521. float c = 1.0f;
  522. float s = 0.0f;
  523. if (_rotation)
  524. {
  525. c = cosf(_rotation);
  526. s = sinf(_rotation);
  527. }
  528. tr = AffineTransform(
  529. c * _scale.x, s * _scale.x,
  530. -s * _scale.y, c * _scale.y,
  531. _pos.x, _pos.y);
  532. }
  533. if (_flags & flag_childrenRelative)
  534. {
  535. Vector2 offset;
  536. if (_flags & flag_anchorInPixels)
  537. {
  538. offset.x = -_anchor.x;
  539. offset.y = -_anchor.y;
  540. }
  541. else
  542. {
  543. offset.x = -float(_size.x * _anchor.x);
  544. offset.y = -float(_size.y * _anchor.y);//todo, what to do? (per pixel quality)
  545. }
  546. tr.translate(offset);
  547. }
  548. _transform = tr;
  549. _flags &= ~flag_transformDirty;
  550. const_cast<Actor*>(this)->transformUpdated();
  551. }
  552. bool Actor::isOn(const Vector2& localPosition)
  553. {
  554. RectF r = getDestRect();
  555. r.expand(Vector2(_extendedIsOn, _extendedIsOn), Vector2(_extendedIsOn, _extendedIsOn));
  556. if (r.pointIn(localPosition))
  557. {
  558. return true;
  559. }
  560. return false;
  561. }
  562. bool Actor::isDescendant(spActor actor)
  563. {
  564. Actor* act = actor.get();
  565. while (act)
  566. {
  567. if (act == this)
  568. return true;
  569. act = act->getParent();
  570. }
  571. return false;
  572. }
  573. Actor* Actor::getDescendant(const std::string& name, error_policy ep)
  574. {
  575. if (isName(name.c_str()))
  576. return this;
  577. Actor* actor = _getDescendant(name);
  578. if (!actor)
  579. {
  580. handleErrorPolicy(ep, "can't find descendant: %s", name.c_str());
  581. }
  582. return actor;
  583. }
  584. Actor* Actor::_getDescendant(const std::string& name)
  585. {
  586. Actor* child = _children._first.get();
  587. while (child)
  588. {
  589. if (child->isName(name.c_str()))
  590. return child;
  591. child = child->getNextSibling().get();
  592. }
  593. child = _children._first.get();
  594. while (child)
  595. {
  596. Actor* des = child->_getDescendant(name);
  597. if (des)
  598. return des;
  599. child = child->getNextSibling().get();
  600. }
  601. return 0;
  602. }
  603. spActor Actor::getChild(const std::string& name, error_policy ep) const
  604. {
  605. spActor actor = _children._first;
  606. while (actor)
  607. {
  608. if (actor->isName(name))
  609. return actor;
  610. actor = actor->_next;
  611. }
  612. handleErrorPolicy(ep, "can't find child: %s", name.c_str());
  613. return 0;
  614. }
  615. void Actor::setParent(Actor* actor, Actor* parent)
  616. {
  617. actor->_parent = parent;
  618. if (parent && parent->_getStage())
  619. actor->added2stage(parent->_getStage());
  620. else
  621. {
  622. if (actor->_getStage())
  623. actor->removedFromStage();
  624. }
  625. }
  626. void Actor::insertChildAfter(spActor actor, spActor insertAfter)
  627. {
  628. OX_ASSERT(actor);
  629. if (!actor)
  630. return;
  631. if (insertAfter)
  632. {
  633. OX_ASSERT(insertAfter->getParent() == this);
  634. }
  635. actor->detach();
  636. if (insertAfter)
  637. _children.insert_after(actor, insertAfter);
  638. else
  639. _children.append(actor);
  640. setParent(actor.get(), this);
  641. }
  642. void Actor::insertChildBefore(spActor actor, spActor insertBefore)
  643. {
  644. OX_ASSERT(actor);
  645. if (!actor)
  646. return;
  647. if (insertBefore)
  648. {
  649. OX_ASSERT(insertBefore->getParent() == this);
  650. }
  651. actor->detach();
  652. if (insertBefore)
  653. _children.insert_before(actor, insertBefore);
  654. else
  655. _children.prepend(actor);
  656. setParent(actor.get(), this);
  657. }
  658. void Actor::attachTo(spActor parent)
  659. {
  660. OX_ASSERT(parent != this);
  661. attachTo(parent.get());
  662. }
  663. void Actor::attachTo(Actor* parent)
  664. {
  665. OX_ASSERT(parent != this);
  666. OX_ASSERT(parent);
  667. if (!parent)
  668. return;
  669. parent->addChild(this);
  670. }
  671. void Actor::addChild(Actor* actor)
  672. {
  673. OX_ASSERT(actor);
  674. if (!actor)
  675. return;
  676. OX_ASSERT(actor != this);
  677. actor->detach();
  678. int z = actor->getPriority();
  679. spActor sibling = _children._last;
  680. //try to insert at the end of list first
  681. if (sibling && sibling->getPriority() > z)
  682. {
  683. sibling = sibling->getPrevSibling();
  684. while (sibling)
  685. {
  686. if (sibling->getPriority() <= z)
  687. break;
  688. sibling = sibling->getPrevSibling();
  689. }
  690. }
  691. if (sibling)
  692. insertChildAfter(actor, sibling);
  693. else
  694. insertChildBefore(actor, 0);
  695. }
  696. void Actor::prependChild(spActor actor)
  697. {
  698. prependChild(actor.get());
  699. }
  700. void Actor::prependChild(Actor* actor)
  701. {
  702. if (getFirstChild())
  703. insertChildBefore(actor, getFirstChild());
  704. else
  705. addChild(actor);
  706. }
  707. void Actor::addChild(spActor actor)
  708. {
  709. addChild(actor.get());
  710. }
  711. void Actor::removeChild(spActor actor)
  712. {
  713. OX_ASSERT(actor);
  714. if (actor)
  715. {
  716. OX_ASSERT(actor->_parent == this);
  717. if (actor->_parent == this)
  718. {
  719. setParent(actor.get(), 0);
  720. _children.remove(actor);
  721. }
  722. }
  723. }
  724. void Actor::removeChildren()
  725. {
  726. spActor child = getFirstChild();
  727. while (child)
  728. {
  729. spActor copy = child;
  730. child = child->getNextSibling();
  731. removeChild(copy);
  732. }
  733. }
  734. Actor* Actor::detach()
  735. {
  736. Actor* parent = getParent();
  737. if (parent)
  738. parent->removeChild(this);
  739. return parent;
  740. }
  741. void Actor::internalUpdate(const UpdateState& us)
  742. {
  743. spTween tween = _tweens._first;
  744. while (tween)
  745. {
  746. spTween tweenNext = tween->getNextSibling();
  747. if (tween->getParentList())
  748. tween->update(*this, us);
  749. if (tween->isDone() && tween->getParentList())
  750. _tweens.remove(tween);
  751. tween = tweenNext;
  752. }
  753. if (_cbDoUpdate)
  754. _cbDoUpdate(us);
  755. doUpdate(us);
  756. spActor actor = _children._first;
  757. while (actor)
  758. {
  759. spActor next = actor->_next;
  760. if (actor->getParent())
  761. actor->update(us);
  762. if (!next)
  763. {
  764. //OX_ASSERT(actor == _children._last);
  765. }
  766. actor = next;
  767. }
  768. }
  769. void Actor::update(const UpdateState& parentUS)
  770. {
  771. UpdateState us = parentUS;
  772. if (_clock)
  773. {
  774. us.iteration = 0;
  775. _clock->update();
  776. timeMS dt = _clock->doTick();
  777. while (dt > 0)
  778. {
  779. us.dt = dt;
  780. us.time = _clock->getTime();
  781. internalUpdate(us);
  782. dt = _clock->doTick();
  783. us.iteration += 1;
  784. }
  785. }
  786. else
  787. {
  788. internalUpdate(us);
  789. }
  790. }
  791. void Actor::doUpdate(const UpdateState& us)
  792. {
  793. }
  794. Vector2 Actor::global2local(const Vector2& global) const
  795. {
  796. const AffineTransform& t = getTransformInvert();
  797. return t.transform(global);
  798. }
  799. Vector2 Actor::local2global(const Vector2& local) const
  800. {
  801. const AffineTransform& t = getTransform();
  802. return t.transform(local);
  803. }
  804. bool Actor::prepareRender(RenderState& rs, const RenderState& parentRS)
  805. {
  806. if (!(_flags & flag_visible))
  807. return false;
  808. unsigned char alpha = (parentRS.alpha * _alpha) / 255;
  809. if (!alpha)
  810. return false;
  811. rs = parentRS;
  812. rs.alpha = alpha;
  813. const Transform& tr = getTransform();
  814. if (_flags & flag_fastTransform)
  815. {
  816. rs.transform = parentRS.transform;
  817. rs.transform.translate(Vector2(tr.x, tr.y));
  818. }
  819. else
  820. Transform::multiply(rs.transform, tr, parentRS.transform);
  821. if (_flags & flag_cull)
  822. {
  823. RectF ss_rect = getActorTransformedDestRect(this, rs.transform);
  824. RectF intersection = ss_rect;
  825. intersection.clip(*rs.clip);
  826. if (intersection.isEmpty())
  827. return false;
  828. }
  829. return true;
  830. }
  831. void Actor::completeRender(const RenderState& rs)
  832. {
  833. }
  834. bool Actor::internalRender(RenderState& rs, const RenderState& parentRS)
  835. {
  836. if (!prepareRender(rs, parentRS))
  837. return false;
  838. //if (!_renderer->render(this, rs))
  839. doRender(rs);
  840. completeRender(rs);
  841. return true;
  842. }
  843. void Actor::render(const RenderState& parentRS)
  844. {
  845. RenderState rs = parentRS;
  846. if (_material)
  847. rs.material = _material;
  848. rs.material->render(this, rs);
  849. }
  850. RectF Actor::calcDestRectF(const RectF& destRect_, const Vector2& size) const
  851. {
  852. RectF destRect = destRect_;
  853. if (!(_flags & flag_childrenRelative))
  854. {
  855. Vector2 a;
  856. if ((_flags & flag_anchorInPixels))
  857. a = Vector2(_anchor.x, _anchor.y);
  858. else
  859. a = Vector2(_anchor.x * size.x, _anchor.y * size.y);
  860. destRect.pos -= a;
  861. }
  862. return destRect;
  863. }
  864. RectF Actor::getDestRect() const
  865. {
  866. return calcDestRectF(RectF(Vector2(0, 0), getSize()), getSize());
  867. }
  868. spTween Actor::_addTween(spTween tween, bool rel)
  869. {
  870. OX_ASSERT(tween);
  871. if (!tween)
  872. return 0;
  873. tween->start(*this);
  874. _tweens.append(tween);
  875. return tween;
  876. }
  877. spTween Actor::addTween(spTween tween)
  878. {
  879. return _addTween(tween, false);
  880. }
  881. spTween Actor::addTween2(spTween tween, const TweenOptions& opt)
  882. {
  883. tween->init2(opt);
  884. return _addTween(tween, false);
  885. }
  886. spTween Actor::getTween(const std::string& name, error_policy ep)
  887. {
  888. spTween tween = _tweens._first;
  889. while (tween)
  890. {
  891. if (tween->isName(name))
  892. return tween;
  893. tween = tween->getNextSibling();
  894. }
  895. handleErrorPolicy(ep, "can't find tween: %s", name.c_str());
  896. return 0;
  897. }
  898. void Actor::removeTween(spTween v)
  899. {
  900. OX_ASSERT(v);
  901. if (!v)
  902. return;
  903. if (v->getParentList() == &_tweens)
  904. {
  905. v->setClient(0);
  906. _tweens.remove(v);
  907. }
  908. }
  909. void Actor::removeTweens(bool callComplete)
  910. {
  911. spTween t = _tweens._first;
  912. while (t)
  913. {
  914. spTween c = t;
  915. t = t->getNextSibling();
  916. if (callComplete)
  917. c->complete();
  918. else
  919. removeTween(c);
  920. }
  921. }
  922. void Actor::removeTweensByName(const std::string& name)
  923. {
  924. spTween t = _tweens._first;
  925. while (t)
  926. {
  927. spTween c = t;
  928. t = t->getNextSibling();
  929. if (c->isName(name))
  930. {
  931. removeTween(c);
  932. }
  933. }
  934. }
  935. void Actor::serialize(serializedata* data)
  936. {
  937. //node.set_name("actor");
  938. pugi::xml_node node = data->node;
  939. node.append_attribute("name").set_value(getName().c_str());
  940. setAttrV2(node, "pos", getPosition(), Vector2(0, 0));
  941. setAttrV2(node, "scale", getScale(), Vector2(1, 1));
  942. setAttrV2(node, "size", getSize(), Vector2(0, 0));
  943. setAttr(node, "rotation", getRotation(), 0.0f);
  944. setAttr(node, "visible", getVisible(), true);
  945. setAttr(node, "input", getTouchEnabled(), true);
  946. setAttr(node, "inputch", getTouchChildrenEnabled(), true);
  947. setAttr(node, "alpha", getAlpha(), (unsigned char)255);
  948. setAttrV2(node, "anchor", getAnchor(), Vector2(0, 0));
  949. if (data->withChildren)
  950. {
  951. spActor child = getFirstChild();
  952. while (child)
  953. {
  954. serializedata d = *data;
  955. d.node = node.append_child("-");
  956. child->serialize(&d);
  957. child = child->getNextSibling();
  958. }
  959. }
  960. node.set_name("Actor");
  961. }
  962. Vector2 attr2Vector2(const char* data)
  963. {
  964. Vector2 v;
  965. sscanf(data, "%f,%f", &v.x, &v.y);
  966. return v;
  967. }
  968. void Actor::deserialize(const deserializedata* data)
  969. {
  970. pugi::xml_node node = data->node;
  971. pugi::xml_attribute attr = node.first_attribute();
  972. while (attr)
  973. {
  974. const char* name = attr.name();
  975. do
  976. {
  977. if (!strcmp(name, "name"))
  978. {
  979. setName(attr.as_string());
  980. break;
  981. }
  982. if (!strcmp(name, "pos"))
  983. {
  984. setPosition(attr2Vector2(attr.as_string()));
  985. break;
  986. }
  987. if (!strcmp(name, "anchor"))
  988. {
  989. setAnchor(attr2Vector2(attr.as_string()));
  990. break;
  991. }
  992. if (!strcmp(name, "scale"))
  993. {
  994. setScale(attr2Vector2(attr.as_string()));
  995. break;
  996. }
  997. if (!strcmp(name, "size"))
  998. {
  999. setSize(attr2Vector2(attr.as_string()));
  1000. break;
  1001. }
  1002. if (!strcmp(name, "rotation"))
  1003. {
  1004. setRotation(attr.as_float());
  1005. break;
  1006. }
  1007. if (!strcmp(name, "visible"))
  1008. {
  1009. setVisible(attr.as_bool());
  1010. break;
  1011. }
  1012. if (!strcmp(name, "input"))
  1013. {
  1014. setTouchEnabled(attr.as_bool());
  1015. break;
  1016. }
  1017. if (!strcmp(name, "inputch"))
  1018. {
  1019. setTouchChildrenEnabled(attr.as_bool());
  1020. break;
  1021. }
  1022. if (!strcmp(name, "alpha"))
  1023. {
  1024. setAlpha(static_cast<unsigned char>(attr.as_int()));
  1025. break;
  1026. }
  1027. }
  1028. while (0);
  1029. attr = attr.next_attribute();
  1030. }
  1031. pugi::xml_node item = node.first_child();
  1032. while (!item.empty())
  1033. {
  1034. spActor actor = deserializedata::deser(item, data->factory);
  1035. addChild(actor);
  1036. item = item.next_sibling();
  1037. }
  1038. }
  1039. Vector2 convert_global2local_(const Actor* child, const Actor* parent, Vector2 pos)
  1040. {
  1041. if (child->getParent() && child->getParent() != parent)
  1042. pos = convert_global2local_(child->getParent(), parent, pos);
  1043. pos = child->global2local(pos);
  1044. return pos;
  1045. }
  1046. Vector2 convert_global2local(spActor child, spActor parent, const Vector2& pos)
  1047. {
  1048. return convert_global2local_(child.get(), parent.get(), pos);
  1049. }
  1050. Vector2 convert_local2global_(const Actor* child, const Actor* parent, Vector2 pos)
  1051. {
  1052. while (child && child != parent)
  1053. {
  1054. pos = child->local2global(pos);
  1055. child = child->getParent();
  1056. }
  1057. return pos;
  1058. }
  1059. Vector2 convert_local2global(spActor child, spActor parent, const Vector2& pos)
  1060. {
  1061. return convert_local2global_(child.get(), parent.get(), pos);
  1062. }
  1063. Vector2 convert_local2stage(spActor actor, const Vector2& pos, spActor root)
  1064. {
  1065. if (!root)
  1066. root = getStage();
  1067. return convert_local2global(actor, root, pos);
  1068. }
  1069. Vector2 convert_local2stage(const Actor* actor, const Vector2& pos, const Actor* root)
  1070. {
  1071. if (!root)
  1072. root = getStage().get();
  1073. return convert_local2global_(actor, root, pos);
  1074. }
  1075. Vector2 convert_stage2local(spActor actor, const Vector2& pos, spActor root)
  1076. {
  1077. if (!root)
  1078. root = getStage();
  1079. return convert_global2local(actor, root, pos);
  1080. }
  1081. Vector2 convert_stage2local(const Actor* actor, const Vector2& pos, const Actor* root)
  1082. {
  1083. if (!root)
  1084. root = getStage().get();
  1085. return convert_global2local_(actor, root, pos);
  1086. }
  1087. Transform getGlobalTransform(spActor child, spActor parent)
  1088. {
  1089. Transform t;
  1090. t.identity();
  1091. while (child && child != parent)
  1092. {
  1093. t = t * child->getTransform();
  1094. child = child->getParent();
  1095. }
  1096. return t;
  1097. }
  1098. Transform getGlobalTransform2(spActor child, Actor* parent)
  1099. {
  1100. Transform t;
  1101. t.identity();
  1102. while (child && (child.get() != parent))
  1103. {
  1104. t = t * child->getTransform();
  1105. child = child->getParent();
  1106. }
  1107. return t;
  1108. }
  1109. void changeParentAndSavePosition(spActor mutualParent, spActor actor, spActor newParent)
  1110. {
  1111. Vector2 pos = actor->getPosition();
  1112. spActor act = actor->getParent();
  1113. while (act && act != mutualParent)
  1114. {
  1115. pos = act->local2global(pos);
  1116. act = act->getParent();
  1117. }
  1118. if (newParent != mutualParent)
  1119. pos = convert_global2local(newParent, mutualParent, pos);
  1120. actor->setPosition(pos);
  1121. actor->attachTo(newParent);
  1122. }
  1123. RectF getActorTransformedDestRect(Actor* actor, const Transform& tr)
  1124. {
  1125. RectF rect = actor->getDestRect();
  1126. Vector2 tl = rect.pos;
  1127. Vector2 br = rect.pos + rect.size;
  1128. tl = tr.transform(tl);
  1129. br = tr.transform(br);
  1130. Vector2 size = br - tl;
  1131. return RectF(tl, size);
  1132. }
  1133. class OBB2D
  1134. {
  1135. private:
  1136. /** Corners of the box, where 0 is the lower left. */
  1137. Vector2 corner[4];
  1138. /** Two edges of the box extended away from corner[0]. */
  1139. Vector2 axis[2];
  1140. /** origin[a] = corner[0].dot(axis[a]); */
  1141. double origin[2];
  1142. /** Returns true if other overlaps one dimension of this. */
  1143. bool overlaps1Way(const OBB2D& other) const
  1144. {
  1145. for (int a = 0; a < 2; ++a)
  1146. {
  1147. float t = other.corner[0].dot(axis[a]);
  1148. // Find the extent of box 2 on axis a
  1149. float tMin = t;
  1150. float tMax = t;
  1151. for (int c = 1; c < 4; ++c)
  1152. {
  1153. t = other.corner[c].dot(axis[a]);
  1154. if (t < tMin)
  1155. {
  1156. tMin = t;
  1157. }
  1158. else if (t > tMax)
  1159. {
  1160. tMax = t;
  1161. }
  1162. }
  1163. // We have to subtract off the origin
  1164. // See if [tMin, tMax] intersects [0, 1]
  1165. if ((tMin > 1 + origin[a]) || (tMax < origin[a]))
  1166. {
  1167. // There was no intersection along this dimension;
  1168. // the boxes cannot possibly overlap.
  1169. return false;
  1170. }
  1171. }
  1172. // There was no dimension along which there is no intersection.
  1173. // Therefore the boxes overlap.
  1174. return true;
  1175. }
  1176. /** Updates the axes after the corners move. Assumes the
  1177. corners actually form a rectangle. */
  1178. void computeAxes()
  1179. {
  1180. axis[0] = corner[1] - corner[0];
  1181. axis[1] = corner[3] - corner[0];
  1182. // Make the length of each axis 1/edge length so we know any
  1183. // dot product must be less than 1 to fall within the edge.
  1184. for (int a = 0; a < 2; ++a)
  1185. {
  1186. axis[a] /= axis[a].sqlength();
  1187. origin[a] = corner[0].dot(axis[a]);
  1188. }
  1189. }
  1190. public:
  1191. OBB2D(const RectF& rect, const AffineTransform& tr)
  1192. {
  1193. corner[0] = tr.transform(rect.getLeftTop());
  1194. corner[1] = tr.transform(rect.getRightTop());
  1195. corner[2] = tr.transform(rect.getRightBottom());
  1196. corner[3] = tr.transform(rect.getLeftBottom());
  1197. computeAxes();
  1198. }
  1199. /** Returns true if the intersection of the boxes is non-empty. */
  1200. bool overlaps(const OBB2D& other) const
  1201. {
  1202. return overlaps1Way(other) && other.overlaps1Way(*this);
  1203. }
  1204. };
  1205. extern int HIT_TEST_DOWNSCALE;
  1206. bool testIntersection(spActor objA, spActor objB, spActor parent, Vector2* contact)
  1207. {
  1208. float s1 = objB->getSize().x * objB->getSize().y;
  1209. float s2 = objA->getSize().x * objA->getSize().y;
  1210. bool swapped = false;
  1211. if (s2 < s1)
  1212. {
  1213. swapped = true;
  1214. std::swap(objA, objB);
  1215. }
  1216. Transform transA = getGlobalTransform(objA, parent);
  1217. Transform transB = getGlobalTransform(objB, parent);
  1218. //Transform transBInv = getGlobalTransform(objB, parent);
  1219. transB.invert();
  1220. Transform n = transA * transB;
  1221. AffineTransform ident;
  1222. ident.identity();
  1223. OBB2D a(objB->getDestRect(), ident);
  1224. OBB2D b(objA->getDestRect(), n);
  1225. if (!a.overlaps(b))
  1226. return false;
  1227. /*
  1228. float s1 = objB->getSize().x * objB->getSize().y;
  1229. float s2 = objA->getSize().x * objA->getSize().y;
  1230. bool swapped = false;
  1231. if (s2 < s1)
  1232. {
  1233. swapped = true;
  1234. std::swap(objA, objB);
  1235. std::swap(transA, transB);
  1236. n = transA * transB;
  1237. }
  1238. */
  1239. int w = (int)objA->getWidth();
  1240. int h = (int)objA->getHeight();
  1241. for (int y = 0; y < h; y += HIT_TEST_DOWNSCALE)
  1242. {
  1243. for (int x = 0; x < w; x += HIT_TEST_DOWNSCALE)
  1244. {
  1245. Vector2 posA = Vector2(float(x), float(y));
  1246. if (!objA->isOn(posA))
  1247. continue;
  1248. Vector2 posB = n.transform(posA);
  1249. if (!objB->isOn(posB))
  1250. continue;
  1251. if (contact)
  1252. *contact = swapped ? posB : posA;
  1253. return true;
  1254. }
  1255. }
  1256. return false;
  1257. }
  1258. }