Actor.cpp 38 KB

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