Пример #1
0
      SceneTree::SceneTree( dp::sg::core::SceneSharedPtr const & scene )
        : m_scene( scene )
        , m_rootNode( scene->getRootNode() )
        , m_dirty( false )
        , m_switchObserver( SwitchObserver::create() )
      {
        m_objectObserver = ObjectObserver::create( this );
        m_geoNodeObserver = GeoNodeObserver::create( this );
        m_transformObserver = TransformObserver::create( this );
        m_sceneObserver = SceneObserver::create( this );

        // push an identity transform onto the transform tree so objects without transforms get the identity
        TransformTreeNode TransformTreeSentinel;
        setIdentity( TransformTreeSentinel.m_worldMatrix );
        setIdentity( TransformTreeSentinel.m_localMatrix );
        TransformTreeIndex transformTreeSentinel = m_transformTree.insertNode( TransformTreeSentinel, ~0, ~0 );

        ObjectTreeNode objectTreeSentinel;
        objectTreeSentinel.m_clipPlaneGroup = ClipPlaneGroup::create();
        m_objectTreeSentinel = m_objectTree.insertNode( objectTreeSentinel, ~0, ~0 );

        m_objectTree[m_objectTreeSentinel].m_transformIndex = transformTreeSentinel;
        m_transformTree[transformTreeSentinel].m_objectTreeIndex = m_objectTreeSentinel;

        SceneTreeGenerator rlg( this );
        rlg.setCurrentTransformTreeData( transformTreeSentinel, ~0 );
        rlg.setCurrentObjectTreeData( m_objectTreeSentinel, ~0 );
        rlg.apply( scene );

        // root node is first child below sentinel
        m_objectTreeRootNode = m_objectTree[m_objectTreeSentinel].m_firstChild;
      }
Пример #2
0
      void SceneTree::addSubTree( NodeSharedPtr const& root, ObjectTreeIndex parentIndex, ObjectTreeIndex leftSibling)
      {
        SceneTreeGenerator rlg( this->shared_from_this() );

        rlg.setCurrentObjectTreeData( parentIndex, leftSibling );
        rlg.apply( root );
      }
Пример #3
0
      void SceneTree::addSubTree( const NodeWeakPtr& root, 
        ObjectTreeIndex parentIndex, ObjectTreeIndex leftSibling, 
        TransformTreeIndex parentTransform, TransformTreeIndex leftSiblingTransform )
      {
        SceneTreeGenerator rlg( this );

        rlg.setCurrentObjectTreeData( parentIndex, leftSibling );
        rlg.setCurrentTransformTreeData( parentTransform, leftSiblingTransform );

        rlg.apply( root->getSharedPtr<Node>() );
      }
Пример #4
0
      void SceneTree::init()
      {
        m_objectObserver = ObjectObserver::create( shared_from_this() );
        m_sceneObserver = SceneObserver::create( shared_from_this() );

        // push a sentinel root group in the vector to avoid special cases for the real root-node later on
        ObjectTreeNode objectTreeSentinel;
        objectTreeSentinel.m_transform = m_transformTree.getSentinel();
        objectTreeSentinel.m_transformParent = -1;
        objectTreeSentinel.m_clipPlaneGroup = ClipPlaneGroup::create();
        m_objectTreeSentinel = m_objectTree.insertNode( objectTreeSentinel, ~0, ~0 );

        SceneTreeGenerator rlg( this->shared_from_this() );
        rlg.setCurrentObjectTreeData( m_objectTreeSentinel, ~0 );
        rlg.apply( m_scene );

        // root node is first child below sentinel
        m_objectTreeRootNode = m_objectTree[m_objectTreeSentinel].m_firstChild;
      }