You.i Engine
YiSceneNode.h
Go to the documentation of this file.
1 // © You i Labs Inc. 2000-2017. All rights reserved.
2 #ifndef _YI_SCENE_NODE_H_
3 #define _YI_SCENE_NODE_H_
4 
7 #include "animation/YiVariant.h"
8 #include "event/YiEventTarget.h"
9 #include "framework/YiPredef.h"
11 #include "renderer/YiRenderer.h"
12 #include "scenetree/YiAABB.h"
13 #include "signal/YiSignalHandler.h"
15 
16 #include <glm/mat4x4.hpp>
17 #include <glm/vec3.hpp>
18 #include <glm/gtc/quaternion.hpp>
19 
25 class CYIActionEvent;
27 class CYIAdjustmentLayerSceneNode;
28 class CYIEffect;
29 class CYILayoutConfig;
30 class CYILayoutState;
31 class CYIMask;
32 class CYIMaterial;
33 class CYIMesh;
34 class CYIRenderTarget;
35 class CYISceneManager;
36 class CYISceneNode;
38 class CYITimelineTrack;
40 class CYISceneNodeIteratorPriv;
41 class CYISceneNodeProxy;
42 
46 typedef enum
47 {
67 
115 {
116  friend class CYISceneManager;
117 
118 public:
119  static const float OPACITY_NOT_VISIBLE_EPSILON;
120 
121  class Iterator;
122  typedef std::reverse_iterator<Iterator> ReverseIterator;
123 
129  class Iterator
130  {
131  public:
133  {
136  };
137 
138  friend class CYISceneNode;
139  typedef std::bidirectional_iterator_tag iterator_category;
141  typedef ptrdiff_t difference_type;
143  typedef CYISceneNode *reference; // This iterator uses the value as the reference, since there is little point in returning a reference to a scene node pointer. The pointer itself suffices.
144 
145  Iterator();
146  Iterator(const Iterator &other);
147 
148  ~Iterator();
149 
150  value_type operator*() const;
151 
152  Iterator &operator=(const Iterator &other);
153  bool operator==(const Iterator &other) const;
154  bool operator!=(const Iterator &other) const;
155 
156  Iterator &operator++();
157  Iterator operator++(int);
158  Iterator &operator--();
159  Iterator operator--(int);
160 
161  private:
162  std::unique_ptr<CYISceneNodeIteratorPriv> m_pIteratorPriv;
163  };
164 
169  {
170  public:
171 
175  PropertyAnimation(CYISceneNode *pNode, YI_NODE_PROPERTY_TYPE ePropType, float fFrom, float fTo, uint32_t nDurMs, CYITimeInterpolator *pTimeInterpolator, bool bDirtyLayout);
176 
177  virtual ~PropertyAnimation();
178 
182  void Reconfigure(float fFrom, float fTo, uint32_t nDurMs, CYITimeInterpolator *pTimeInterpolator, bool bDirtyLayout);
183 
184  std::shared_ptr<CYISceneNodeProxy> m_pNodeProxy;
187  float m_fFrom;
188  float m_fTo;
191  protected:
195  virtual void OnAnimate(CYIAnimation *pAnim, float fDataPosition) override;
196 
200  virtual void OnAnimationEnd(CYIAnimation *pAnim) override;
201 
202  private:
204  };
205 
207  {
208  DirtyClean = 0x0000,
209 
214  DirtySceneGraph = 0x0001,
215 
221  DirtyVisibility = 0x0002,
222 
228  DirtyOpacity = 0x0004,
229 
236 
244 
249  DirtyUniform = 0x0020,
250 
257 
265  DirtyMesh = 0x0080,
266 
273 
279  DirtyWorldScale = 0x0200,
280 
286 
291  };
292 
294  {
307  };
308 
310  {
315 
320  };
321 
323  {
336  };
337 
342  {
351  };
352 
357  {
358  public:
359  MeasureSpec() : eMode(MEASURE_UNSPECIFIED), fSize(0.0f) {}
360  MeasureSpec(MeasureMode _eMode, float _fSize) :
361  eMode(_eMode),
362  fSize(_fSize) {}
363 
364  static MeasureSpec CreateExactlySpec(float fSize);
365  static MeasureSpec CreateUpToSpec(float fSize);
366  static const MeasureSpec &GetUndefinedSpec();
367  static const MeasureSpec defaultSpec;
368 
370  float fSize;
371  };
372 
373  CYISceneNode();
374  virtual ~CYISceneNode();
375 
387  virtual bool Init();
388 
396  void ForceDirty();
397 
403  void ClearDirtyFlag();
404 
411  void SetDirtyFlag(DirtyFlag eDirtyFlag);
412 
417  DirtyFlag GetDirtyFlag() const;
418 
428 
434  const CYIString &GetName() const;
435 
442  CYIString GetUniqueName() const;
443 
451  void SetSceneManager(CYISceneManager *pSceneManager);
452 
459  void SetName(const CYIString & name);
460 
472  int32_t GetID() const;
473 
479  void SetID(int32_t nID);
480 
486  uint64_t GetUniqueID() const;
487 
496  bool AddChild(std::unique_ptr<CYISceneNode> pSceneNode);
497 
506  bool AddChild(std::unique_ptr<CYISceneNode>, int32_t nIndex);
507 
516  bool InsertChildAfter(CYISceneNode *pRefNode, std::unique_ptr<CYISceneNode> pSceneNode);
517 
523  std::unique_ptr<CYISceneNode> RemoveChild(CYISceneNode *pSceneNode);
524 
534  bool ReorderChild(uint32_t uFromIndex, uint32_t uToIndex);
535 
541  CYISceneNode *GetParent() const;
542 
551  bool ChangeParent(CYISceneNode *pParent);
552 
558  CYISceneNode *GetDrawParent() const;
559 
563  bool IsAncestorOf(const CYISceneNode *pNode) const;
564 
569 
573  uint32_t GetChildCount() const;
574 
578  uint32_t GetChildCountRecursive() const;
579 
585  CYISceneNode *GetChild(uint32_t nIndex) const;
586 
591 
596 
600  ReverseIterator rbegin(Iterator::ITERATION_MODE eMode = Iterator::IMMEDIATE_CHILDREN) const;
601 
605  ReverseIterator rend(Iterator::ITERATION_MODE eMode = Iterator::IMMEDIATE_CHILDREN) const;
606 
612  CYISceneNode *GetChild(const CYIString &sName) const;
613 
617  uint32_t GetDrawChildCount() const;
618 
624  CYISceneNode *GetDrawChild(uint32_t uIndex) const;
625 
631  CYISceneNode *GetDrawChildByID(int32_t nID) const;
632 
642  template<class YI_SCENE_NODE_SUBCLASS>
643  YI_SCENE_NODE_SUBCLASS *GetChild(uint32_t uTargetMatchedNodeCount = 1) const;
644 
650  template <class YI_SCENE_NODE_SUBCLASS> std::list<YI_SCENE_NODE_SUBCLASS*> GetChildren() const;
651 
655  int32_t GetIndexOfChild(const CYISceneNode *pSceneNode) const;
656 
665  void Show();
666 
675  void Hide();
676 
686  void SetVisibility(bool bVisible);
687 
697  void SetOpacity(float fOpacity);
698 
702  float GetCompositeOpacity() const;
703 
713  float GetLocalOpacity() const;
714 
723  bool IsVisible() const;
724 
732  bool IsTrulyVisible() const;
733 
742  CYISceneNode *GetNode(const CYIString & name);
743 
751  CYISceneNode *GetNode(const CYIString & name, const CYIRuntimeTypeInfo &enforceClassType);
752 
760  CYISceneNode *GetNode(const CYIRuntimeTypeInfo &enforceClassType);
761 
769  CYISceneNode *GetNodeAfterTarget(const CYIRuntimeTypeInfo &enforceClassType, CYISceneNode *pStartAfterTarget);
770 
780  template <class YI_SCENE_NODE_SUBCLASS> YI_SCENE_NODE_SUBCLASS *GetNode(const CYIString & name);
781 
789  CYISceneNode *GetNode(const int32_t nID);
790 
798  CYISceneNode *GetNode(const int32_t nID, const CYIRuntimeTypeInfo &enforceClassType);
799 
809  template<class YI_SCENE_NODE_SUBCLASS>
810  bool FindNode(YI_SCENE_NODE_SUBCLASS *&pNode, const CYIString &nodeName, FETCH_TYPE eType, const CYIString &tag);
811 
819  std::list<CYISceneNode*> GetNodes(const CYIString & name);
820 
828  std::list<CYISceneNode *> GetNodes(int32_t nID);
829 
837  std::list<CYISceneNode*> GetNodes(const CYIRuntimeTypeInfo &enforceClassType);
838 
850  template<class YI_SCENE_NODE_SUBCLASS>
851  const YI_SCENE_NODE_SUBCLASS *GetNode(uint32_t uTargetMatchedNodeCount = 1) const;
852  template<class YI_SCENE_NODE_SUBCLASS>
853  YI_SCENE_NODE_SUBCLASS *GetNode(uint32_t uTargetMatchedNodeCount = 1);
854 
858  void SetMesh(const std::shared_ptr<CYIMesh> &pMesh);
859 
863  void SetMaterial(const std::shared_ptr<CYIMaterial> &pMaterial, uint32_t nIndex = 0);
864 
868  void AddEffect(const std::shared_ptr<CYIEffect> &pEffect);
869 
873  void RemoveEffect(const std::shared_ptr<CYIEffect> &pEffect);
874 
878  uint32_t GetEffectCount() const;
879 
883  std::shared_ptr<CYIEffect> GetEffect(uint32_t uIndex) const;
884 
890  void ConnectEffectsToTimelines(const CYITimelineTrack *pTrack);
891 
897  void AddMask(std::unique_ptr<CYIMask> pMask);
898 
902  std::unique_ptr<CYIMask> RemoveMask(const CYIMask *pMask);
903 
907  uint32_t GetMaskCount() const;
908 
912  const CYIMask *GetMask(uint32_t uIndex) const;
913 
917  CYIMask *GetMask(uint32_t uIndex);
918 
922  const std::shared_ptr<CYIMesh> &GetMesh() const;
923 
927  uint32_t GetMaterialCount() const;
928 
932  const std::shared_ptr<CYIMaterial> GetMaterial(uint32_t nIndex = 0) const;
933 
937  const std::shared_ptr<IYIUniformBufferObject> &GetShaderUniforms() const;
938 
942  void SetMeshTransform(const glm::mat4 &rTransform);
943 
948  void DestroyChildren();
949 
953  const glm::mat4 &GetLocalTransform() const;
954 
958  const glm::mat4 &GetEffectTransform() const;
959 
965  const glm::mat4 &GetWorldTransform() const;
966 
972  bool Intersects(const CYISceneNode *pNode) const;
973 
977  void SetRenderTarget(const std::shared_ptr<CYIRenderTarget> &pRenderTarget);
978 
982  const std::shared_ptr<CYIRenderTarget> GetRenderTarget() const;
983 
989  virtual void BuildDrawList(std::vector<IYIRenderer::Command> &drawList, CYIAbstractCameraSceneNode *pCameraToDrawWith = nullptr);
990 
994  const CYIAABB &GetWorldAABB() const;
995 
999  const CYIAABB &GetLocalAABB() const;
1000 
1005  void SetAnchorPoint(const glm::vec3 &ref);
1006 
1010  void SetAnchorPoint(float fX, float fY, float fZ);
1011 
1015  void SetAnchorPointX(float fX);
1016 
1020  void SetAnchorPointY(float fY);
1021 
1025  void SetAnchorPointZ(float fZ);
1026 
1030  void SetPosition(const glm::vec3 &ref);
1031 
1035  void SetPosition(float fX, float fY, float fZ);
1036 
1040  void SetPositionX(float fX);
1041 
1045  void SetPositionY(float fY);
1046 
1050  void SetPositionZ(float fZ);
1051 
1055  void SetRotation(const glm::vec3 &fEulerDegrees);
1056 
1060  void SetRotation(float fPitchDegrees, float fYawDegrees, float fRollDegrees);
1061 
1065  void SetRotationX(float fPitchDegrees);
1066 
1070  void SetRotationY(float fYawDegrees);
1071 
1075  void SetRotationZ(float fRollDegrees);
1076 
1080  void SetOrientation(float fPitchDegrees, float fYawDegrees, float fRollDegrees);
1081 
1085  void SetOrientation(const glm::quat &orient);
1086 
1090  void SetScale(const glm::vec3 &fScaleFactors);
1091 
1095  void SetScale(float fFactorX, float fFactorY, float fFactorZ);
1096 
1100  void SetScaleX(float fFactor);
1101 
1105  void SetScaleY(float fFactor);
1106 
1110  void SetScaleZ(float fFactor);
1111 
1115  const glm::vec3 &GetPosition() const;
1116 
1120  const glm::vec3 &GetScale() const;
1121 
1125  const glm::vec3 &GetWorldScale() const;
1126 
1130  const glm::vec3 &GetWorldSurfaceScale() const;
1131 
1135  const glm::vec3 &GetRotation() const;
1136 
1140  const glm::quat &GetOrientation() const;
1141 
1145  const glm::vec3 &GetAnchorPoint() const;
1146 
1154  virtual void SetSize(const glm::vec3 &vSize, bool bDirtyLayout = true);
1155 
1159  const glm::vec3 &GetSize() const;
1160 
1164  const glm::vec3 &GetInitialSize() const;
1165 
1169  void SetMeasuredSize(const glm::vec3 &vMeasuredSize);
1170 
1174  const glm::vec3 &GetMeasuredSize() const;
1175 
1179  void SetInternalCustomTimelineValue(uint32_t nTrackID, const CYIVariant &value);
1180 
1184  virtual void SetCustomTimelineValue(uint32_t nTrackID, const CYIVariant &value);
1185 
1189  void SetClippingOn();
1190 
1194  void SetClippingOff();
1195 
1199  bool GetClipping() const;
1200 
1205  void SetClippingBox(const CYIAABB &rWorldBox);
1206 
1211  const CYIAABB &GetClippingBox() const;
1212 
1218  void StartPropertyAnimation(YI_NODE_PROPERTY_TYPE ePropType, float fFrom, float fTo, uint32_t nDurMs, CYITimeInterpolator *pTimeInterpolator = nullptr, bool bDirtyLayout = true);
1219 
1226 
1230  void UpdateLocalSpaceCollision(CYIActionEvent *pActionEvent);
1231 
1235  virtual bool BroadcastEvent(const std::shared_ptr<CYIEventDispatcher> &pDispatcher, CYIEvent *pEvent);
1236 
1240  void UpdateEventForLocalSpace(CYIActionEvent *pActionEvent, glm::vec3 &rayOrigin, glm::vec3 &rayNonOriginPoint) const;
1241 
1247  bool IsBoundingBoxHit(const CYIRay &rWorldSpaceRay) const;
1248 
1256  bool IsMeshHit(const CYIRay &rWorldSpaceRay) const;
1257 
1267  void DumpTree() const;
1268 
1273 
1278 
1283 
1288 
1292  void StartCapturePointerEvents(uint8_t uPointerID);
1293 
1297  void StopCapturePointerEvents(uint8_t uPointerID);
1298 
1304  bool DrawBehindChildren(CYISceneNode *pSceneNode);
1305 
1311  bool DrawInFrontOfChildren(CYISceneNode *pSceneNode);
1312 
1318  bool DrawBehind(CYISceneNode *pSceneNode);
1319 
1325  bool DrawInFront(CYISceneNode *pSceneNode);
1326 
1338  bool IsFocusRoot() const;
1339 
1343  void SetIsFocusRoot(bool bIsFocusRoot);
1344 
1350  virtual void OnFocusGainedInDescendants();
1351 
1357  virtual void FocusGainedInDescendants();
1358 
1364  virtual void OnFocusLostInDescendants();
1365 
1371  virtual void FocusLostInDescendants();
1372 
1376  virtual void OnFocusChangedInDescendants();
1377 
1383  virtual void FocusChangedInDescendants();
1384 
1385 
1391  virtual bool ContainsFocusableDescendant(const CYIFocusSearchOptions &options = CYIFocusSearchOptions()) const;
1392 
1396  void ShowPointerDebugNode(CYIActionEvent *pActionEvent);
1397 
1401  void SetUseLocalTransformAndAlpha(bool bUse);
1402 
1408  static void RegisterAllSceneNodes();
1409 
1410  virtual bool GetProperty(const CYIString &rPropertyName, CYIString *pValue) const override;
1411 
1412  virtual const std::map<CYIString, CYIString> &GetProperties() const override;
1413 
1417  void SetProperty(const CYIString &rPropertyName, const CYIString &rPropertyValue);
1418 
1422  const std::shared_ptr<CYISceneNodeProxy> &GetSceneNodeProxy() const;
1423 
1431  void SetLayoutConfig(std::unique_ptr<CYILayoutConfig> pLayoutConfig);
1432 
1441 
1450 
1458  void SetLayoutState(std::unique_ptr<CYILayoutState> pLayoutState);
1459 
1465  const CYILayoutState *GetLayoutState() const;
1466 
1473 
1477  void RequestLayout();
1478 
1487 
1497  virtual void SetLayoutDirtyFlag(LayoutDirtyFlag eFlag);
1498 
1514  virtual void Measure(const MeasureSpec &widthSpec, const MeasureSpec &heightSpec, const MeasureSpec &depthSpec);
1515 
1527  virtual void ApplyMeasurements();
1528 
1533 
1539  template<typename T>
1540  bool CanCastTo() const;
1541 
1546 
1550 
1551 protected:
1565  void Update(bool bForceDirty = false);
1566 
1574  virtual void OnUpdateBegin();
1575 
1584  virtual void UpdateBegin();
1585 
1594  virtual void OnUpdateEnd();
1595 
1604  virtual void UpdateEnd();
1605 
1606 
1630  virtual void OnDirtyFlagChanged();
1631 
1639  virtual void DirtyFlagChanged();
1640 
1649  virtual void OnTransformUpdated();
1650 
1659  virtual void TransformUpdated();
1660 
1672  virtual void OnWorldScaleUpdated();
1673 
1682  virtual void WorldScaleUpdated();
1683 
1695  virtual void OnWorldSurfaceScaleUpdated();
1696 
1705  virtual void WorldSurfaceScaleUpdated();
1706 
1716  virtual void OnVisibilityUpdated();
1717 
1726  virtual void VisibilityUpdated();
1727 
1739  virtual void OnCompositeOpacityUpdated();
1740 
1749  virtual void CompositeOpacityUpdated();
1750 
1760  virtual void OnWorldBoundingBoxUpdated();
1761 
1770  virtual void WorldBoundingBoxUpdated();
1771 
1781  virtual void OnLocalBoundingBoxUpdated();
1782 
1791  virtual void LocalBoundingBoxUpdated();
1792 
1796  virtual void OnChildAdded(CYISceneNode *pChild);
1797 
1804  virtual void ChildAdded(CYISceneNode *pChild);
1805 
1811  virtual void OnChildRemoved(CYISceneNode *pChild);
1812 
1818  virtual void ChildRemoved(CYISceneNode *pChild);
1819 
1823  virtual void OnSizeChanged();
1824 
1830  virtual void SizeChanged();
1831 
1832  /*
1833  \details Called to calculate the local transformation matrix. Overrides should call
1834  the base class implementation for set transformation APIs such as SetPosition()
1835  to have any effect. Note that get transformation APIs such as GetPosition() do
1836  not account for custom transformations done in the overrides of this function.
1837 
1838  When data that the custom implementation depends on updates, the subclass is responsible
1839  for manually triggering local transform recalculation by setting the DirtyLocalTransform flag.
1840  */
1841  virtual void CalculateLocalTransform(glm::mat4 *pTransform) const;
1842 
1847  virtual void ChildNeedsLayout();
1848 
1853  virtual void LayoutDirtied();
1854 
1858  virtual void OnChildVisibilityChanged(CYISceneNode *pChild);
1859 
1865  virtual void ChildVisibilityChanged(CYISceneNode *pChild);
1866 
1867  virtual bool ProcessEvent(const std::shared_ptr<CYIEventDispatcher> &pDispatcher, CYIEvent *pEvent) override;
1868 
1875 
1884  virtual CYIString GetDumpTreeString() const;
1885 
1889  void DumpTree(int32_t nIndentLevel) const;
1890 
1894  void SetShaderUniforms();
1895 
1901  virtual void SetCustomUniforms();
1902 
1908  template<class T> void SetNodeType();
1909 
1914  virtual CYISceneNode *GetNodeFromChildren(const CYIString &name);
1915 
1920  virtual CYISceneNode *GetNodeFromChildren(const int32_t nID);
1921 
1926  virtual CYISceneNode *GetNodeFromChildren(const CYIRuntimeTypeInfo &enforceClassType);
1927 
1932  CYISceneNode *GetNodeFromChildrenAfterTarget(const CYIRuntimeTypeInfo &enforceClassType, bool *pbTargetReached, CYISceneNode *pStartAfterTarget);
1933 
1938 
1939  std::vector<std::unique_ptr<CYISceneNode>> m_children;
1940  std::vector<CYISceneNode *> m_drawChildren;
1941  std::map<CYIString, CYIString> m_Properties;
1942  std::vector<std::shared_ptr<CYIMaterial>> m_pMaterials;
1943  std::vector<std::unique_ptr<CYIMask>> m_Masks;
1944  std::vector<std::shared_ptr<CYIEffect>> m_Effects;
1945  std::vector<PropertyAnimation*> m_propertyAnimations;
1947  /*
1948  * These members represent the node's effective alpha value,
1949  * m_fLocalOpacity - the base opacity for this node, independent of hierarchy
1950  * m_fCompositeOpacity - the calculated effective opacity for this node, considering its parent chain
1951  */
1957  glm::quat m_Orientation;
1958  glm::vec3 m_Rotate;
1959  glm::vec3 m_AnchorPoint;
1960  glm::vec3 m_Position;
1961  glm::vec3 m_Scale;
1963  glm::vec3 m_vSize;
1964  glm::vec3 m_vInitialSize;
1965  glm::vec3 m_vMeasuredSize;
1968  bool m_bClip;
1973  int32_t m_nID;
1974  uint64_t m_uGUID;
1976  std::shared_ptr<CYIRenderTarget> m_pRenderTarget;
1977  std::shared_ptr<CYIMesh> m_pMesh;
1978  mutable std::shared_ptr<IYIUniformBufferObject> m_pShaderUniforms;
1980 private:
1981  enum NodeType
1982  {
1983  TypeNode = 0x0001,
1984  TypeAbstractCamera = 0x0002 | TypeNode,
1985  TypeAdjustmentLayer = 0x0004 | TypeNode,
1986  TypeNPatch = 0x0008 | TypeNode,
1987  TypeSprite = 0x0010 | TypeNode,
1988  TypeImage = 0x0020 | TypeNode,
1989  TypeText = 0x0040 | TypeNode,
1990  TypeView = 0x0080 | TypeNode,
1991  TypeStreamableView = 0x0100 | TypeView,
1992  };
1993 
1999  CYISceneNode *GetNodeFromChildrenLogDuplicates(const CYIString &name);
2000 
2001  void DirtyChildrenRecursive(DirtyFlag eDirtyFlag);
2002  void DirtyParentRecursive(DirtyFlag eDirtyFlag);
2003  void DirtyLiveChildrenRecursive(DirtyFlag eDirtyFlag);
2004  void DirtyLiveParentRecursive(DirtyFlag eDirtyFlag);
2006  void GetNodesFromChildren(const CYIString & name, std::list<CYISceneNode*> & list);
2008  void GetNodesFromChildren(const int32_t nID, std::list<CYISceneNode *> &list);
2010  void GetNodesFromChildren(const CYIRuntimeTypeInfo &enforceClassType, std::list<CYISceneNode*> & list);
2013  void AssignDefaultLayoutConfig() const;
2019  void UpdateParent(CYISceneNode *pParent);
2020 
2024  void GenerateLocalTransform() const;
2025 
2029  void DrawRemove();
2030 
2031  void ClearLiveDirtyFlag(DirtyFlag eFlag) const;
2032  void SetLiveDirtyFlag(DirtyFlag eDirtyFlag);
2033  void SetFrameDirtyFlag(DirtyFlag eDirtyFlag);
2034  bool IsRotatedInWorldSpace() const;
2035 
2036  virtual void UpdateCompositeOpacity(float *pfCompositeOpacity) const;
2037 
2038  void MakeNextLayoutDirtyFlagCurrent();
2039 
2040  void PushStandardRenderActions(std::vector<IYIRenderer::Command> &drawList, bool bMask, IYIRenderer::Command::CommandType ePushTargetType);
2041  bool PushEffectRenderActions(std::vector<IYIRenderer::Command> &drawList, bool bMask, const std::shared_ptr<CYIEffect> &pEffect);
2042  void PopStandardRenderActions(std::vector<IYIRenderer::Command> &drawList, bool bMask);
2043 
2044  mutable glm::mat4 m_localTransform;
2045  mutable glm::mat4 m_worldTransform;
2046 
2047  mutable CYIAABB m_WorldAABB;
2048  mutable CYIAABB m_LocalAABB;
2049  mutable glm::vec3 m_WorldSurfaceScale;
2050  mutable glm::vec3 m_WorldScale;
2052  mutable float m_fCompositeOpacity;
2053  mutable bool m_bRotatedInWorldSpace;
2054  mutable bool m_bCompositeVisibility;
2056  bool m_bInitCalled;
2057  bool m_bDestroying;
2058 
2059  bool m_bIsFocusRoot;
2060  bool m_bUseLocalTransformAndAlpha;
2061  std::shared_ptr<CYISceneNodeProxy> m_pSceneNodeProxy;
2062 
2063  CYIAdjustmentLayerSceneNode *m_pLastAdjustmentLayer;
2064 
2065  DirtyFlag m_eFrameDirtyFlag;
2066  DirtyFlag m_ePreviousDirtyFlag;
2067  mutable DirtyFlag m_eLiveDirtyFlag;
2068  mutable DirtyFlag m_eHooksDirtyFlag;
2070  LayoutDirtyFlag m_eCurrentLayoutDirtyFlag;
2071  LayoutDirtyFlag m_eNextLayoutDirtyFlag;
2072  mutable std::unique_ptr<CYILayoutConfig> m_pLayoutConfig;
2073  std::unique_ptr<CYILayoutState> m_pLayoutState;
2074 
2075  NodeType m_nNodeType;
2079 };
2080 
2083 #include "scenetree/YiSceneNode.inl"
2084 
2085 #endif // _YI_SCENE_NODE_H_
void StopCapturePointerEvents(uint8_t uPointerID)
void ShowPointerDebugNode(CYIActionEvent *pActionEvent)
uint32_t GetChildCount() const
bool DrawBehind(CYISceneNode *pSceneNode)
ITERATION_MODE
Definition: YiSceneNode.h:132
void StartCaptureTrackpadEvents()
Definition: YiSceneNode.h:302
void SetPositionZ(float fZ)
uint32_t GetMaterialCount() const
const CYILayoutConfig * GetLayoutConfig(LayoutConfigFetchMode eFetchMode=LAYOUT_CONFIG_LAZY_INSTANTIATE) const
glm::vec3 m_Rotate
Definition: YiSceneNode.h:1958
virtual void OnChildAdded(CYISceneNode *pChild)
CYIString GetUniqueName() const
virtual void CalculateLocalTransform(glm::mat4 *pTransform) const
static void RegisterAllSceneNodes()
glm::vec3 m_AnchorPoint
Definition: YiSceneNode.h:1959
virtual void OnFocusChangedInDescendants()
DirtyFlag GetDirtyFlag() const
Definition: YiSceneNode.h:228
FETCH_TYPE
Definition: YiSceneNode.h:341
CYISceneManager * m_pSceneManager
Definition: YiSceneNode.h:1937
Definition: YiSceneNode.h:61
virtual void Measure(const MeasureSpec &widthSpec, const MeasureSpec &heightSpec, const MeasureSpec &depthSpec)
const glm::mat4 & GetEffectTransform() const
virtual void OnChildVisibilityChanged(CYISceneNode *pChild)
Container for basic interpolator functions.
Definition: YiTimeInterpolator.h:21
const glm::vec3 & GetPosition() const
Definition: YiSceneNode.h:235
void SetMeasuredSize(const glm::vec3 &vMeasuredSize)
virtual void TransformUpdated()
bool IsVisible() const
Definition: YiSceneNode.h:356
LayoutConfigFetchMode
Definition: YiSceneNode.h:309
#define YI_DISALLOW_COPY_AND_ASSIGN(TypeName)
Delete the copy constructor and assignment operator (and consequently the move constructor as well) ...
Definition: YiPredef.h:114
void SetPosition(const glm::vec3 &ref)
A container class for common data types.
Definition: YiVariant.h:33
Definition: YiSceneNode.h:129
Iterator begin(Iterator::ITERATION_MODE eMode=Iterator::IMMEDIATE_CHILDREN) const
std::shared_ptr< IYIUniformBufferObject > m_pShaderUniforms
Definition: YiSceneNode.h:1978
Definition: YiSceneNode.h:298
Definition: YiSceneNode.h:350
CYISceneNode * GetNodeAfterTarget(const CYIRuntimeTypeInfo &enforceClassType, CYISceneNode *pStartAfterTarget)
void StartCaptureKeyboardEvents()
void Update(bool bForceDirty=false)
bool DrawInFront(CYISceneNode *pSceneNode)
A class containing focus search options.
Definition: YiFocusSearchOptions.h:23
Definition: YiSceneNode.h:56
bool m_bClip
Definition: YiSceneNode.h:1968
CYISceneNode * m_pParent
Definition: YiSceneNode.h:1935
const std::shared_ptr< CYIMaterial > GetMaterial(uint32_t nIndex=0) const
Definition: YiSceneNode.h:134
virtual void SizeChanged()
void SetScaleY(float fFactor)
const CYIAABB & GetWorldAABB() const
void SetRotation(const glm::vec3 &fEulerDegrees)
const std::shared_ptr< CYIMesh > & GetMesh() const
Scene trees composed of CYISceneNode objects are registered with the scene manager in order for them ...
Definition: YiSceneManager.h:73
void UpdateLocalSpaceCollision(CYIActionEvent *pActionEvent)
Iterator end(Iterator::ITERATION_MODE eMode=Iterator::IMMEDIATE_CHILDREN) const
std::vector< std::shared_ptr< CYIEffect > > m_Effects
Definition: YiSceneNode.h:1944
uint32_t GetMaskCount() const
Base class for events.
Definition: YiEvent.h:489
ReverseIterator rend(Iterator::ITERATION_MODE eMode=Iterator::IMMEDIATE_CHILDREN) const
Definition: YiSceneNode.h:327
Class representing an instance of geometry information.
Definition: YiMesh.h:33
bool GetClipping() const
CYISignal< CYISceneNode *, YI_NODE_PROPERTY_TYPE > PropertyAnimationComplete
Definition: YiSceneNode.h:1545
virtual const std::map< CYIString, CYIString > & GetProperties() const override
glm::vec3 m_Position
Definition: YiSceneNode.h:1960
Container class for Unicode strings. Conceptually, a CYIString object is a sequence of Unicode charac...
Definition: YiString.h:35
glm::vec3 m_Scale
Definition: YiSceneNode.h:1961
bool m_bIsOriented
Definition: YiSceneNode.h:1970
void SetMesh(const std::shared_ptr< CYIMesh > &pMesh)
Iterator & operator=(const Iterator &other)
virtual void OnCompositeOpacityUpdated()
std::vector< std::unique_ptr< CYIMask > > m_Masks
Definition: YiSceneNode.h:1943
uint64_t GetUniqueID() const
const std::shared_ptr< CYIRenderTarget > GetRenderTarget() const
void StopCaptureTrackpadEvents()
void SetAnchorPointY(float fY)
virtual void OnVisibilityUpdated()
void SetRotationY(float fYawDegrees)
bool ReorderChild(uint32_t uFromIndex, uint32_t uToIndex)
std::list< YI_SCENE_NODE_SUBCLASS * > GetChildren() const
std::map< CYIString, CYIString > m_Properties
Definition: YiSceneNode.h:1941
bool FindNode(YI_SCENE_NODE_SUBCLASS *&pNode, const CYIString &nodeName, FETCH_TYPE eType, const CYIString &tag)
bool m_bIsRotated
Definition: YiSceneNode.h:1969
Definition: YiSceneNode.h:214
virtual void BuildDrawList(std::vector< IYIRenderer::Command > &drawList, CYIAbstractCameraSceneNode *pCameraToDrawWith=nullptr)
virtual void ApplyMeasurements()
A representation of a single track of a CYITimeline.
Definition: YiTimelineTrack.h:26
Definition: YiSceneNode.h:50
virtual ~CYISceneNode()
Provides a base for the definition of camera objects.
Definition: YiAbstractCameraSceneNode.h:30
void ConnectEffectsToTimelines(const CYITimelineTrack *pTrack)
#define YI_TYPE_BASES(...)
Definition: YiRtti.h:350
virtual void OnUpdateBegin()
std::shared_ptr< CYIEffect > GetEffect(uint32_t uIndex) const
virtual void LocalBoundingBoxUpdated()
CYIMaterial is a place holder for all the drawing parameters required by the renderer to draw a mesh/...
Definition: YiMaterial.h:27
Definition: YiSceneNode.h:306
friend class CYISceneNode
Definition: YiSceneNode.h:138
Definition: YiSceneNode.h:64
virtual void CompositeOpacityUpdated()
virtual void OnSizeChanged()
Iterator & operator++()
void StopCaptureKeyboardEvents()
Definition: YiSceneNode.h:290
bool IsFocusRoot() const
Adds a masking effect to a scene node.
Definition: YiMask.h:18
A class used to proxy access to a CYISceneNode.
Definition: YiSceneNodeProxy.h:19
Definition: YiSceneNode.h:285
void StartCapturePointerEvents(uint8_t uPointerID)
std::unique_ptr< CYIMask > RemoveMask(const CYIMask *pMask)
virtual void ChildVisibilityChanged(CYISceneNode *pChild)
virtual bool BroadcastEvent(const std::shared_ptr< CYIEventDispatcher > &pDispatcher, CYIEvent *pEvent)
CYIAABB m_WSClipBox
Definition: YiSceneNode.h:1954
void AddMask(std::unique_ptr< CYIMask > pMask)
CYISceneNode * GetDrawChildByID(int32_t nID) const
virtual void FocusLostInDescendants()
const CYIString & GetName() const
void SetPositionY(float fY)
void ClearDirtyFlag()
bool IsBoundingBoxHit(const CYIRay &rWorldSpaceRay) const
CYISceneNode * GetNode(const CYIString &name)
DirtyFlag GetPreviousDirtyFlag() const
virtual bool GetProperty(const CYIString &rPropertyName, CYIString *pValue) const override
ReverseIterator rbegin(Iterator::ITERATION_MODE eMode=Iterator::IMMEDIATE_CHILDREN) const
void SetOrientation(float fPitchDegrees, float fYawDegrees, float fRollDegrees)
MeasureSpec(MeasureMode _eMode, float _fSize)
Definition: YiSceneNode.h:360
Definition: YiSceneNode.h:335
CYISceneNode * value_type
Definition: YiSceneNode.h:140
Definition: YiSceneNode.h:346
float GetLocalOpacity() const
value_type operator*() const
void StopPropertyAnimation(YI_NODE_PROPERTY_TYPE ePropType)
glm::quat m_Orientation
Definition: YiSceneNode.h:1957
CYISceneNode * GetDrawChild(uint32_t uIndex) const
void SetIsFocusRoot(bool bIsFocusRoot)
CYISceneNode * GetParent() const
CYISceneNode * GetChild(uint32_t nIndex) const
Encapsulates the origin and direction points of a ray.
Definition: YiRay.h:33
virtual void OnWorldBoundingBoxUpdated()
void SetScaleX(float fFactor)
Definition: YiSceneNode.h:58
std::shared_ptr< CYIMesh > m_pMesh
Definition: YiSceneNode.h:1977
CYIString m_name
Definition: YiSceneNode.h:1934
virtual void UpdateBegin()
virtual void OnWorldScaleUpdated()
int32_t GetIndexOfChild(const CYISceneNode *pSceneNode) const
glm::vec3 m_vSize
Definition: YiSceneNode.h:1963
void RemoveEffect(const std::shared_ptr< CYIEffect > &pEffect)
Represents an event target of type YI_SPECIAL_EVENT_TARGET_TYPE.
Definition: YiEventTarget.h:37
virtual void OnFocusGainedInDescendants()
const CYILayoutState * GetLayoutState() const
bool m_bLocalVisibility
Definition: YiSceneNode.h:1971
Definition: YiSceneNode.h:54
void SetID(int32_t nID)
void StartPropertyAnimation(YI_NODE_PROPERTY_TYPE ePropType, float fFrom, float fTo, uint32_t nDurMs, CYITimeInterpolator *pTimeInterpolator=nullptr, bool bDirtyLayout=true)
virtual void UpdateEnd()
Definition: YiSceneNode.h:55
YI_NODE_PROPERTY_TYPE
Definition: YiSceneNode.h:46
int32_t m_nID
Definition: YiSceneNode.h:1973
void SetDirtyFlag(DirtyFlag eDirtyFlag)
CommandType
Definition: YiRenderer.h:42
std::shared_ptr< CYIRenderTarget > m_pRenderTarget
Definition: YiSceneNode.h:1976
uint32_t GetEffectCount() const
glm::mat4 m_EffectTransform
Definition: YiSceneNode.h:1956
Definition: YiSceneNode.h:53
LayoutDirtyFlag
Definition: YiSceneNode.h:293
const glm::mat4 & GetLocalTransform() const
CYISceneManager * GetSceneManager() const
virtual bool Init()
virtual void OnDirtyFlagChanged()
bool Intersects(const CYISceneNode *pNode) const
float m_fLocalOpacity
Definition: YiSceneNode.h:1952
CYISignal DescendantsChangedFocus
Emitted when focus has changed within this tree.
Definition: YiSceneNode.h:1549
Defines a target for the rendering results to be sent to.
Definition: YiRenderTarget.h:49
Definition: YiSceneNode.h:279
const glm::vec3 & GetRotation() const
float fSize
Definition: YiSceneNode.h:370
virtual void DirtyFlagChanged()
MeasureMode eMode
Definition: YiSceneNode.h:369
A scene node is the base type for all nodes which are used by the scene manager; it is an integral pa...
Definition: YiSceneNode.h:114
float GetCompositeOpacity() const
const CYIMask * GetMask(uint32_t uIndex) const
bool IsTrulyVisible() const
const std::shared_ptr< CYISceneNodeProxy > & GetSceneNodeProxy() const
const CYIAABB & GetClippingBox() const
CYIAbstractCameraSceneNode * FindActiveCamera() const
std::bidirectional_iterator_tag iterator_category
Definition: YiSceneNode.h:139
CYISignal DescendantGainedFocus
Emitted when focus has entered this tree.
Definition: YiSceneNode.h:1547
A class used to hold node-specific layout configuration (such as, for example, Margin).
Definition: YiLayoutConfig.h:24
void SetProperty(const CYIString &rPropertyName, const CYIString &rPropertyValue)
LayoutDirtyFlag GetLayoutDirtyFlag() const
Class representing a node property animation.
Definition: YiSceneNode.h:168
virtual void FocusGainedInDescendants()
Iterator & operator--()
virtual void SetCustomUniforms()
virtual void OnTransformUpdated()
const glm::quat & GetOrientation() const
virtual CYISceneNode * GetNodeFromChildren(const CYIString &name)
The abstract runtime representation of a C++ type.
Definition: YiRtti.h:48
void SetAnchorPointX(float fX)
virtual void OnUpdateEnd()
Definition: YiSceneNode.h:256
virtual void WorldSurfaceScaleUpdated()
virtual bool ProcessEvent(const std::shared_ptr< CYIEventDispatcher > &pDispatcher, CYIEvent *pEvent) override
const CYIAABB & GetLocalAABB() const
Definition: YiEffect.h:42
Definition: YiSignalHandler.h:174
CYISceneNode * m_pDrawParent
Definition: YiSceneNode.h:1936
glm::vec3 m_vlsLastCollision
Definition: YiSceneNode.h:1966
glm::vec3 m_vMeasuredSize
Definition: YiSceneNode.h:1965
bool InsertChildAfter(CYISceneNode *pRefNode, std::unique_ptr< CYISceneNode > pSceneNode)
bool AddChild(std::unique_ptr< CYISceneNode > pSceneNode)
bool operator==(const Iterator &other) const
A class used to hold node-specific layout state.
Definition: YiLayoutState.h:16
const glm::vec3 & GetWorldSurfaceScale() const
bool CanCastTo() const
void SetPositionX(float fX)
void SetLayoutState(std::unique_ptr< CYILayoutState > pLayoutState)
bool DrawInFrontOfChildren(CYISceneNode *pSceneNode)
virtual void SetLayoutDirtyFlag(LayoutDirtyFlag eFlag)
std::vector< CYISceneNode * > m_drawChildren
Definition: YiSceneNode.h:1940
void SetClippingOff()
std::vector< std::shared_ptr< CYIMaterial > > m_pMaterials
Definition: YiSceneNode.h:1942
void SetAnchorPoint(const glm::vec3 &ref)
virtual void WorldBoundingBoxUpdated()
virtual void OnLocalBoundingBoxUpdated()
void SetUseLocalTransformAndAlpha(bool bUse)
const glm::vec3 & GetInitialSize() const
void ForceDirty()
An interface to a class that provides key-value properties.
Definition: YiPropertiesSource.h:17
Definition: YiSceneNode.h:62
virtual void LayoutDirtied()
static const MeasureSpec defaultSpec
Definition: YiSceneNode.h:367
This class represents an Axis-Aligned Bounding Box.
Definition: YiAABB.h:24
virtual void FocusChangedInDescendants()
CYISceneNode * reference
Definition: YiSceneNode.h:143
void SetRotationX(float fPitchDegrees)
void SetShaderUniforms()
std::shared_ptr< CYISceneNodeProxy > m_pNodeProxy
Definition: YiSceneNode.h:184
void SetInternalCustomTimelineValue(uint32_t nTrackID, const CYIVariant &value)
Definition: YiSceneNode.h:265
const glm::vec3 & GetMeasuredSize() const
virtual void SetSize(const glm::vec3 &vSize, bool bDirtyLayout=true)
Definition: YiSceneNode.h:51
const glm::vec3 & GetSize() const
void SetSceneManager(CYISceneManager *pSceneManager)
glm::vec3 m_vInitialSize
Definition: YiSceneNode.h:1964
void SetVisibility(bool bVisible)
Definition: YiSceneNode.h:331
void SetMeshTransform(const glm::mat4 &rTransform)
Definition: YiSceneNode.h:60
virtual CYIString GetDumpTreeString() const
virtual void ChildAdded(CYISceneNode *pChild)
void SetClippingBox(const CYIAABB &rWorldBox)
const glm::vec3 & GetWorldScale() const
const glm::vec3 & GetAnchorPoint() const
void SetName(const CYIString &name)
Used to create animations programatically.
Definition: YiAnimation.h:32
virtual void SetCustomTimelineValue(uint32_t nTrackID, const CYIVariant &value)
Definition: YiSceneNode.h:249
CYISignal DescendantLostFocus
Emitted when focus has left this tree.
Definition: YiSceneNode.h:1548
void SetLayoutConfig(std::unique_ptr< CYILayoutConfig > pLayoutConfig)
CYISceneNode * GetNodeFromChildrenAfterTarget(const CYIRuntimeTypeInfo &enforceClassType, bool *pbTargetReached, CYISceneNode *pStartAfterTarget)
Common interface for shader uniform buffers.
Definition: YiUniformBufferObject.h:16
LayoutDirtyFlag GetCurrentLayoutDirtyFlag() const
void SetScaleZ(float fFactor)
virtual void VisibilityUpdated()
void SetNodeType()
bool IsMeshHit(const CYIRay &rWorldSpaceRay) const
virtual void OnFocusLostInDescendants()
Definition: YiSceneNode.h:272
float m_fFrom
Definition: YiSceneNode.h:187
void SetMaterial(const std::shared_ptr< CYIMaterial > &pMaterial, uint32_t nIndex=0)
Definition: YiSceneNode.h:243
void SetScale(const glm::vec3 &fScaleFactors)
virtual void ChildNeedsLayout()
virtual void OnChildRemoved(CYISceneNode *pChild)
virtual void OnWorldSurfaceScaleUpdated()
Definition: YiSceneNode.h:221
std::vector< std::unique_ptr< CYISceneNode > > m_children
Definition: YiSceneNode.h:1939
std::list< CYISceneNode * > GetNodes(const CYIString &name)
int32_t GetID() const
void DumpTree() const
std::unique_ptr< CYISceneNode > RemoveChild(CYISceneNode *pSceneNode)
void SetOpacity(float fOpacity)
Definition: YiSceneNode.h:135
bool operator!=(const Iterator &other) const
bool m_bDirtyLayout
Definition: YiSceneNode.h:189
Definition: YiSceneNode.h:48
Definition: YiSceneNode.h:57
Definition: YiSceneNode.h:59
void SetRenderTarget(const std::shared_ptr< CYIRenderTarget > &pRenderTarget)
MeasureMode
Definition: YiSceneNode.h:322
CYIAnimation * m_pAnimation
Definition: YiSceneNode.h:186
uint64_t m_uGUID
Definition: YiSceneNode.h:1974
Base class used to listen to one or more CYIAnimations as they update over time.
Definition: YiAnimation.h:65
void AddEffect(const std::shared_ptr< CYIEffect > &pEffect)
uint32_t GetDrawChildCount() const
bool ChangeParent(CYISceneNode *pParent)
std::vector< PropertyAnimation * > m_propertyAnimations
Definition: YiSceneNode.h:1945
void RequestLayout()
std::reverse_iterator< Iterator > ReverseIterator
Definition: YiSceneNode.h:121
const std::shared_ptr< IYIUniformBufferObject > & GetShaderUniforms() const
void UpdateEventForLocalSpace(CYIActionEvent *pActionEvent, glm::vec3 &rayOrigin, glm::vec3 &rayNonOriginPoint) const
ptrdiff_t difference_type
Definition: YiSceneNode.h:141
uint32_t GetChildCountRecursive() const
CYISceneNode ** pointer
Definition: YiSceneNode.h:142
MeasureSpec()
Definition: YiSceneNode.h:359
static const float OPACITY_NOT_VISIBLE_EPSILON
Definition: YiSceneNode.h:119
CYISceneNode * GetDrawParent() const
virtual void WorldScaleUpdated()
const glm::mat4 & GetWorldTransform() const
Stores data related to a user Action event.
Definition: YiActionEvent.h:18
void SetAnchorPointZ(float fZ)
virtual void ChildRemoved(CYISceneNode *pChild)
virtual bool ContainsFocusableDescendant(const CYIFocusSearchOptions &options=CYIFocusSearchOptions()) const
void SetClippingOn()
bool DrawBehindChildren(CYISceneNode *pSceneNode)
const glm::vec3 & GetScale() const
Definition: YiSceneNode.h:208
Definition: YiSceneNode.h:52
bool IsAncestorOf(const CYISceneNode *pNode) const
YI_NODE_PROPERTY_TYPE m_eType
Definition: YiSceneNode.h:185
void DestroyChildren()
void SetRotationZ(float fRollDegrees)
float m_fTo
Definition: YiSceneNode.h:188
DirtyFlag
Definition: YiSceneNode.h:206