From 62b2302a32dd245faf44f630b65bc00df4c1d3a4 Mon Sep 17 00:00:00 2001 From: Hartmut Seichter Date: Tue, 1 Jan 2019 21:47:35 +0100 Subject: [PATCH] update on design of scenegraph --- share/doc/pixwerx.xmind | Bin 114739 -> 119135 bytes src/core/include/pw/core/globals.hpp | 3 + src/core/include/pw/core/matrix.hpp | 128 ++++++++++----------- src/core/include/pw/core/quaternion.hpp | 10 +- src/core/include/pw/core/vector.hpp | 12 +- src/scene/CMakeLists.txt | 4 + src/scene/include/pw/scene/camera.hpp | 34 +++++- src/scene/include/pw/scene/component.hpp | 24 ++++ src/scene/include/pw/scene/mesh.hpp | 45 ++++++++ src/scene/include/pw/scene/node.hpp | 37 +++--- src/scene/include/pw/scene/scene.hpp | 50 ++++++++ src/scene/include/pw/scene/transform.hpp | 4 + src/scene/src/mesh.cpp | 9 ++ src/scene/src/node.cpp | 52 ++++----- src/scene/src/scene.cpp | 11 ++ src/scene/src/traverser.cpp | 14 +-- src/scene/tests/pwscene_test_node.cpp | 15 ++- src/scene/tests/pwscene_test_traverser.cpp | 26 ++++- 18 files changed, 342 insertions(+), 136 deletions(-) create mode 100644 src/scene/include/pw/scene/mesh.hpp create mode 100644 src/scene/include/pw/scene/scene.hpp create mode 100644 src/scene/src/mesh.cpp create mode 100644 src/scene/src/scene.cpp diff --git a/share/doc/pixwerx.xmind b/share/doc/pixwerx.xmind index 439924713697a23ac5eea7c386a82ab93e6e54f6..204f29e6197ba25c31d00a8a4b4936a0befb293a 100644 GIT binary patch delta 45573 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 diff --git a/src/core/include/pw/core/globals.hpp b/src/core/include/pw/core/globals.hpp index d020ac1..e831e87 100644 --- a/src/core/include/pw/core/globals.hpp +++ b/src/core/include/pw/core/globals.hpp @@ -4,10 +4,13 @@ #include #include #include +#include namespace pw { using std::shared_ptr; +using std::unique_ptr; +using std::weak_ptr; typedef float real_t; diff --git a/src/core/include/pw/core/matrix.hpp b/src/core/include/pw/core/matrix.hpp index dc0de20..c0dd064 100644 --- a/src/core/include/pw/core/matrix.hpp +++ b/src/core/include/pw/core/matrix.hpp @@ -35,7 +35,7 @@ namespace pw { template -class matrix : public matrixbase { +class matrix_ : public matrixbase { T m[R*C]; @@ -44,37 +44,37 @@ public: using typename matrixbase::value_type; using typename matrixbase::size_type; - matrix(); + matrix_(); - matrix(const matrix& mtc); + matrix_(const matrix_& mtc); - matrix& operator = (const matrix& other); + matrix_& operator = (const matrix_& other); - matrix transposed() const; + matrix_ transposed() const; - inline matrix& operator *= (const T& b) { for (unsigned int i = this->cells(); i--> 0;) this->at(i) *= b; return *this; } - inline matrix& operator /= (const T& b) { for (unsigned int i = this->cells(); i--> 0;) this->at(i) /= b; return *this; } - inline matrix& operator += (const T& b) { for (unsigned int i = this->cells(); i--> 0;) this->at(i) += b; return *this; } - inline matrix& operator -= (const T& b) { for (unsigned int i = this->cells(); i--> 0;) this->at(i) -= b; return *this; } + inline matrix_& operator *= (const T& b) { for (unsigned int i = this->cells(); i--> 0;) this->at(i) *= b; return *this; } + inline matrix_& operator /= (const T& b) { for (unsigned int i = this->cells(); i--> 0;) this->at(i) /= b; return *this; } + inline matrix_& operator += (const T& b) { for (unsigned int i = this->cells(); i--> 0;) this->at(i) += b; return *this; } + inline matrix_& operator -= (const T& b) { for (unsigned int i = this->cells(); i--> 0;) this->at(i) -= b; return *this; } - inline matrix& operator += (const matrix& other) { for (unsigned int i = this->cells(); i--> 0;) this->at(i) += other.at(i); return *this; } - inline matrix& operator -= (const matrix& other) { for (unsigned int i = this->cells(); i--> 0;) this->at(i) -= other.at(i); return *this; } + inline matrix_& operator += (const matrix_& other) { for (unsigned int i = this->cells(); i--> 0;) this->at(i) += other.at(i); return *this; } + inline matrix_& operator -= (const matrix_& other) { for (unsigned int i = this->cells(); i--> 0;) this->at(i) -= other.at(i); return *this; } - inline const matrix normalized() const { + inline const matrix_ normalized() const { const T one_over_n = T(1) / this->norm(); return *this * one_over_n; } - inline const matrix + inline const matrix_ get_inverse() const { - matrix resMat; + matrix_ resMat; for ( unsigned int r = 0; r < C; ++r) { for ( unsigned int j = 0; j < R; ++j) { short sgn = ( (r+j)%2) ? -1 : 1; - matrix minor; + matrix_ minor; this->get_minor(minor,r,j); resMat.at(r,j) = minor.determinant() * sgn; } @@ -86,12 +86,12 @@ public: } inline - matrix& invert() { + matrix_& invert() { *this = this->get_inverse(); return *this; } - void get_minor(matrix& res, unsigned int r0, unsigned int c0) const; + void get_minor(matrix_& res, unsigned int r0, unsigned int c0) const; T determinant() const; @@ -99,29 +99,29 @@ public: T norm() const; - matrix& operator *= (const matrix& rhs); + matrix_& operator *= (const matrix_& rhs); - matrix& copy_from_data(const T* src) { for (unsigned int i = 0; i < R*C; ++i) { (*this).at(i) = src[i]; } return *this; } + matrix_& copy_from_data(const T* src) { for (unsigned int i = 0; i < R*C; ++i) { (*this).at(i) = src[i]; } return *this; } - matrix operator * (const matrix& rhs) const { + matrix_ operator * (const matrix_& rhs) const { return mul(*this,rhs); } - const matrix reshape() const { - matrix m; + const matrix_ reshape() const { + matrix_ m; for (unsigned int r = 0; r < R; ++r) for (unsigned int c = 0; c < C; ++c) m(r,c) = (*this)(c,r); return m; } - const matrix get_column(unsigned int col) const { - matrix c; for (unsigned int r = 0; r < R; ++r) c(r,0) = (this)(r,col); + const matrix_ get_column(unsigned int col) const { + matrix_ c; for (unsigned int r = 0; r < R; ++r) c(r,0) = (this)(r,col); return c; } - const matrix<1,C,T> get_row(unsigned int row) const { - matrix<1,C,T> r; for (unsigned int c = 0; c < C; ++c) r(0,c) = (this)(row,c); + const matrix_<1,C,T> get_row(unsigned int row) const { + matrix_<1,C,T> r; for (unsigned int c = 0; c < C; ++c) r(0,c) = (this)(row,c); return r; } @@ -131,49 +131,49 @@ public: ///////////////////////////////////////////////////////////////////////////// template -inline matrix operator * (const matrix& a, const T& b) +inline matrix_ operator * (const matrix_& a, const T& b) { - matrix res; + matrix_ res; for (unsigned int i = res.cells(); i--> 0;) res.at(i) = a.at(i) * b; return res; } template -inline matrix operator / (const matrix& a, const T& b) +inline matrix_ operator / (const matrix_& a, const T& b) { - matrix res; T oneOverB(1./b); + matrix_ res; T oneOverB(1./b); for (unsigned int i = res.cells(); i--> 0;) res.at(i) = a.at(i) * oneOverB; return res; } template -inline matrix operator + (const matrix& a, const T& b) +inline matrix_ operator + (const matrix_& a, const T& b) { - matrix res; + matrix_ res; for (unsigned int i = res.cells(); i--> 0;) res.at(i) = a.at(i) + b; return res; } template -inline matrix operator - (const matrix& a, const T& b) +inline matrix_ operator - (const matrix_& a, const T& b) { - matrix res; + matrix_ res; for (unsigned int i = res.cells(); i--> 0;) res.at(i) = a.at(i) - b; return res; } template -inline matrix operator + (const matrix& a, const matrix& b) +inline matrix_ operator + (const matrix_& a, const matrix_& b) { - matrix res; + matrix_ res; for (unsigned int i = res.cells(); i--> 0;) res.at(i) = a.at(i) + b.at(i); return res; } template -inline matrix operator - (const matrix& a, const matrix& b) +inline matrix_ operator - (const matrix_& a, const matrix_& b) { - matrix res; + matrix_ res; for (unsigned int i = res.cells(); i--> 0;) res.at(i) = a.at(i) - b.at(i); return res; } @@ -181,12 +181,12 @@ inline matrix operator - (const matrix& a, const matrix& b) ///////////////////////////////////////////////////////////////////////////// template -matrix static inline -mul(const matrix& A, const matrix& B) +matrix_ static inline +mul(const matrix_& A, const matrix_& B) { // aC == bR // set all null - matrix res; + matrix_ res; res.fill(0); // compute all resulting cells @@ -206,7 +206,7 @@ mul(const matrix& A, const matrix& B) ///////////////////////////////////////////////////////////////////////////// template -matrix& matrix::operator *= (const matrix& rhs) +matrix_& matrix_::operator *= (const matrix_& rhs) { *this = mul(*this,rhs); return *this; @@ -215,20 +215,20 @@ matrix& matrix::operator *= (const matrix& rhs) ///////////////////////////////////////////////////////////////////////////// template -matrix::matrix() +matrix_::matrix_() : matrixbase(R,C,&m[0],true) { } template -matrix::matrix(const matrix &mtc) : +matrix_::matrix_(const matrix_ &mtc) : matrixbase(R,C,&m[0],true) { *this = mtc; } template -matrix &matrix::operator = (const matrix &other) +matrix_ &matrix_::operator = (const matrix_ &other) { if (this != &other) for (unsigned int r = 0; r < R;++r) @@ -238,9 +238,9 @@ matrix &matrix::operator = (const matrix &other) } template -matrix matrix::transposed() const +matrix_ matrix_::transposed() const { - matrix res; + matrix_ res; for (unsigned int r = this->rows();r-->0;) for (unsigned int c = this->cols();c-->0;) res.at(c,r) = this->at(r,c); @@ -248,7 +248,7 @@ matrix matrix::transposed() const } template -void matrix::get_minor(matrix& res,unsigned int r0, unsigned int c0) const +void matrix_::get_minor(matrix_& res,unsigned int r0, unsigned int c0) const { unsigned int r = 0; for (unsigned int ri = 0; ri < R; ri++) @@ -266,11 +266,11 @@ void matrix::get_minor(matrix& res,unsigned int r0, unsigned i } template inline -T matrix::determinant() const +T matrix_::determinant() const { T res(0); - matrix minor; + matrix_ minor; // using Laplace Expansion at compile time for (unsigned int c = 0; c < C; c++) { @@ -282,7 +282,7 @@ T matrix::determinant() const } template inline -T matrix::squared_norm() const +T matrix_::squared_norm() const { T res(0); @@ -294,7 +294,7 @@ T matrix::squared_norm() const template inline -T matrix::norm() const +T matrix_::norm() const { using std::sqrt; @@ -302,7 +302,7 @@ T matrix::norm() const } template inline -void matrix::normalize() +void matrix_::normalize() { T n = norm(); if (n > 0) { @@ -319,19 +319,19 @@ void matrix::normalize() // 4x4 template -class matrix44 : public matrix<4,4,T> +class matrix44 : public matrix_<4,4,T> { public: - using matrix<4,4,T>::matrix; + using matrix_<4,4,T>::matrix_; - matrix44(const matrix<4,4,T>& i) + matrix44(const matrix_<4,4,T>& i) { *this = i; } - matrix44& operator = (const matrix<4,4,T>& rhs) { + matrix44& operator = (const matrix_<4,4,T>& rhs) { if (this != &rhs){ this->at(0,0) = rhs.at(0,0);this->at(0,1) = rhs.at(0,1);this->at(0,2) = rhs.at(0,2);this->at(0,3) = rhs.at(0,3); this->at(1,0) = rhs.at(1,0);this->at(1,1) = rhs.at(1,1);this->at(1,2) = rhs.at(1,2);this->at(1,3) = rhs.at(1,3); @@ -343,9 +343,9 @@ public: } inline static - matrix<4,4,T> projection_from_frustum(T Left,T Right,T Bottom,T Top,T zNear,T zFar) + matrix_<4,4,T> projection_from_frustum(T Left,T Right,T Bottom,T Top,T zNear,T zFar) { - matrix<4,4,T> frustum; + matrix_<4,4,T> frustum; frustum.fill(0); @@ -363,12 +363,12 @@ public: } inline static - matrix<4,4,T> orthogonal_projection(T Left, T Right, + matrix_<4,4,T> orthogonal_projection(T Left, T Right, T Bottom,T Top, T Near, T Far) { - matrix<4,4,T> ortho; + matrix_<4,4,T> ortho; ortho.fill(0); ortho(0,0) = 2 / (Right-Left); @@ -386,7 +386,7 @@ public: inline static - matrix<4,4,T> perspective_projection(T fovY, T aspectRatio, T zNear, T zFar) + matrix_<4,4,T> perspective_projection(T fovY, T aspectRatio, T zNear, T zFar) { const T height = zNear * tan(fovY/T(360) * pi()); // half height of near plane const T width = height * aspectRatio; // half width of near plane @@ -496,13 +496,13 @@ public: // template <> inline -float matrix<1,1,float>::determinant() const +float matrix_<1,1,float>::determinant() const { return this->at(0); } template <> inline -double matrix<1,1,double>::determinant() const +double matrix_<1,1,double>::determinant() const { return this->at(0); } diff --git a/src/core/include/pw/core/quaternion.hpp b/src/core/include/pw/core/quaternion.hpp index d2ec8bd..c00854e 100644 --- a/src/core/include/pw/core/quaternion.hpp +++ b/src/core/include/pw/core/quaternion.hpp @@ -126,10 +126,10 @@ public: inline void normalize() { *this = this->normalized(); } //! conversion from a matrix - inline static const quaternion from_matrix(const matrix<4,4,T> &m); + inline static const quaternion from_matrix(const matrix_<4,4,T> &m); //! conversion to a matrix - const matrix<4,4,T> to_matrix() const; + const matrix_<4,4,T> to_matrix() const; //! return identiy quaternion static const quaternion identity(); @@ -173,7 +173,7 @@ const T quaternion::_sqrt90 = std::sqrt(0.5); template -const quaternion quaternion::from_matrix(const matrix<4,4,T> &m) { +const quaternion quaternion::from_matrix(const matrix_<4,4,T> &m) { using std::sqrt; @@ -188,9 +188,9 @@ const quaternion quaternion::from_matrix(const matrix<4,4,T> &m) { } template -const matrix<4,4,T> quaternion::to_matrix() const { +const matrix_<4,4,T> quaternion::to_matrix() const { - matrix<4,4,T> m; m.set_identity(); + matrix_<4,4,T> m; m.set_identity(); T xx = x() * x(); T xy = x() * y(); diff --git a/src/core/include/pw/core/vector.hpp b/src/core/include/pw/core/vector.hpp index 0808732..c1a1d0d 100644 --- a/src/core/include/pw/core/vector.hpp +++ b/src/core/include/pw/core/vector.hpp @@ -31,17 +31,17 @@ namespace pw { template -class vector : public matrix { +class vector : public matrix_ { public: - using typename matrix::value_type; - using matrix::operator = ; + using typename matrix_::value_type; + using matrix_::operator = ; - vector() : matrix() {} + vector() : matrix_() {} - vector(const vector& other) : matrix(other) {} + vector(const vector& other) : matrix_(other) {} - vector(const matrix& other) : matrix(other) {} + vector(const matrix_& other) : matrix_(other) {} T& operator()(unsigned int c) { return matrixbase::at(c); } const T& operator()(unsigned int c) const { return matrixbase::at(c); } diff --git a/src/scene/CMakeLists.txt b/src/scene/CMakeLists.txt index e76a52d..593de6d 100644 --- a/src/scene/CMakeLists.txt +++ b/src/scene/CMakeLists.txt @@ -4,6 +4,8 @@ set(hdrs include/pw/scene/component.hpp include/pw/scene/node.hpp include/pw/scene/nodepath.hpp + include/pw/scene/mesh.hpp + include/pw/scene/scene.hpp include/pw/scene/transform.hpp include/pw/scene/traverser.hpp ) @@ -13,6 +15,8 @@ set(srcs src/nodepath.cpp src/camera.cpp src/component.cpp + src/mesh.cpp + src/scene.cpp src/transform.cpp src/traverser.cpp ) diff --git a/src/scene/include/pw/scene/camera.hpp b/src/scene/include/pw/scene/camera.hpp index 8b2726a..52648bd 100644 --- a/src/scene/include/pw/scene/camera.hpp +++ b/src/scene/include/pw/scene/camera.hpp @@ -1,3 +1,27 @@ +/* + * Copyright (C) 1999-2017 Hartmut Seichter + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ #ifndef PW_SCENE_CAMERA_HPP #define PW_SCENE_CAMERA_HPP @@ -28,13 +52,15 @@ public: void set_projection(const matrix44d &projection); const matrix44d& projection() const; +// void set_field_of_view(float) + protected: - double _fov; - double _near_plane; - double _far_plane; + real_t _fov; + real_t _near_plane; + real_t _far_plane; - double _ortho_size = 2; + real_t _ortho_size = 2; private: diff --git a/src/scene/include/pw/scene/component.hpp b/src/scene/include/pw/scene/component.hpp index fc32a74..c4c2b10 100644 --- a/src/scene/include/pw/scene/component.hpp +++ b/src/scene/include/pw/scene/component.hpp @@ -1,3 +1,27 @@ +/* + * Copyright (C) 1999-2017 Hartmut Seichter + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ #ifndef PW_SCENE_COMPONENT_HPP #define PW_SCENE_COMPONENT_HPP diff --git a/src/scene/include/pw/scene/mesh.hpp b/src/scene/include/pw/scene/mesh.hpp new file mode 100644 index 0000000..c7f7c97 --- /dev/null +++ b/src/scene/include/pw/scene/mesh.hpp @@ -0,0 +1,45 @@ +#ifndef PW_SCENE_MESH_HPP +#define PW_SCENE_MESH_HPP + +#include +#include + +namespace pw { + +class mesh : public component { +public: + using component::component; + + typedef std::vector index_t; + typedef std::vector vertex_t; + + enum topology_type { + triangles, + triangle_strip, + triangle_fan, + quads, + lines, + line_strip, + points + }; + + +protected: + + // index data + // vertex d ata + // normal data + // color data + // uv data + // tangents data + + + // boundary + + +}; + +} + +#endif + diff --git a/src/scene/include/pw/scene/node.hpp b/src/scene/include/pw/scene/node.hpp index ebe63c0..69c00d0 100644 --- a/src/scene/include/pw/scene/node.hpp +++ b/src/scene/include/pw/scene/node.hpp @@ -28,20 +28,24 @@ #include #include -#include -#include namespace pw { /** * @brief nodes represent the structure for the scene graph + * + * Unlike earlier designs the scenegraph here is not a DAG + * but uses multiple references to components like Unity. This makes the + * design of the scenegraph and traversal much more straight-forward. */ class node { public: typedef shared_ptr ref; - typedef std::vector ref_array; - typedef std::vector ptr_array; + typedef std::vector ref_array; + + typedef node *ptr; + typedef std::vector ptr_array; friend class component; @@ -60,12 +64,15 @@ public: std::string name() const; //!< get name void set_name(const std::string &name); //!< set name - //! return list of parents - inline const ptr_array& parents() const { return _parents; } + //! return parent of this node + inline ptr parent() const { return _path.back(); } //! add a child node ref add_child(ref anode); + //! remove a child + void remove_child(ref child_node); + //! get the list of children inline const ref_array& children() const { return _children; } @@ -76,7 +83,7 @@ public: inline bool is_leaf() const { return children().empty(); } //! check if this is the root node - inline bool is_root() const { return parents().empty(); } + inline bool is_root() const { return _path.empty(); } //! list of components const component::array& components() const; @@ -87,20 +94,20 @@ public: //! remove a node component void remove_component(component::ref c); + //! paths to root + const ptr_array& path() const; + protected: - ref_array _children; - ptr_array _parents; + ref_array _children; //!< list of children + ptr_array _path; //!< path to root - component::array _components; + component::array _components; // +#include + +namespace pw { + +class scene { +public: + + //! set root node + void set_root(node::ref root); + + // request the root node + inline node::ref root() const { return _root; } + +protected: + + node::ref _root; //!< root node + +}; + +} + +#endif diff --git a/src/scene/include/pw/scene/transform.hpp b/src/scene/include/pw/scene/transform.hpp index fe28cdc..30f1ab7 100644 --- a/src/scene/include/pw/scene/transform.hpp +++ b/src/scene/include/pw/scene/transform.hpp @@ -18,6 +18,10 @@ public: void update(); + inline void translate(const real_t &x, const real_t &y, const real_t &z) { + _local.at(0,3) += x;_local.at(1,3) += y;_local.at(2,3) += z; + } + protected: matrix44d _local; diff --git a/src/scene/src/mesh.cpp b/src/scene/src/mesh.cpp new file mode 100644 index 0000000..981ea1a --- /dev/null +++ b/src/scene/src/mesh.cpp @@ -0,0 +1,9 @@ +#include "pw/scene/mesh.hpp" + + +namespace pw { + + + + +} diff --git a/src/scene/src/node.cpp b/src/scene/src/node.cpp index 9c390cc..2ac65df 100644 --- a/src/scene/src/node.cpp +++ b/src/scene/src/node.cpp @@ -9,7 +9,6 @@ node::node(const std::string &name) node::node(const node &node) : _children(node.children()) - , _parents(node._parents) , _name(node._name) { } @@ -31,43 +30,33 @@ void node::set_name(const std::string &name) node::ref node::add_child(ref anode) { - anode->add_parent(this); + // remove old nodepath + anode->_path.clear(); + + // take parent nodepath ... + if (!this->is_root()) anode->_path = this->_path; + // add itself + anode->_path.push_back(this); + + // add as child _children.push_back(anode); + + // return return anode; } -void node::add_parent(node *anode) +void node::remove_child(ref child_node) { - _parents.push_back(anode); + node::ref_array::iterator it = _children.end(); + + while ((it = std::find(_children.begin(),_children.end(),child_node)) != _children.end()) { + _children.erase(it); + } } -//void node::visit(visitor& visitor) -//{ -// visitor.enter(this); - -// if (visitor.direction == node::visitor::direction::up) -// this->ascend(visitor); -// else { -// this->descend(visitor); -// } - -// visitor.leave(this); -//} - -//void node::ascend(visitor& visitor) -//{ -// for (auto p : this->parents()) p->visit(visitor); -//} - -//void node::descend(visitor& visitor) -//{ -// for (auto c : this->children()) c->visit(visitor); -//} - node::~node() { _children.clear(); - _parents.clear(); } // @@ -82,11 +71,16 @@ void node::remove_component(component::ref c) { component::array::iterator it = _components.end(); - while ((it = std::find(_components.begin(),_components.end(),std::shared_ptr(c))) != _components.end()) { + while ((it = std::find(_components.begin(),_components.end(),c)) != _components.end()) { _components.erase(it); } } +const node::ptr_array &node::path() const +{ + return _path; +} + const component::array& node::components() const { return _components; diff --git a/src/scene/src/scene.cpp b/src/scene/src/scene.cpp new file mode 100644 index 0000000..5b39396 --- /dev/null +++ b/src/scene/src/scene.cpp @@ -0,0 +1,11 @@ +#include "pw/scene/scene.hpp" + + +namespace pw { + +void scene::set_root(node::ref root) +{ + this->_root = root; +} + +} diff --git a/src/scene/src/traverser.cpp b/src/scene/src/traverser.cpp index 5940fde..d1d4e6b 100644 --- a/src/scene/src/traverser.cpp +++ b/src/scene/src/traverser.cpp @@ -5,11 +5,8 @@ #include #include - - namespace pw { - traverser t = traverser(); void traverser::visit(node *node) @@ -18,7 +15,7 @@ void traverser::visit(node *node) on_enter(node); // visit if (direction::up == _direction) - for (auto p : node->parents()) this->visit(p); + this->visit(node->parent()); else for (auto c : node->children()) this->visit(c.get()); @@ -35,16 +32,17 @@ void traverser::bfs(node::ref root) while (!q.empty()) { + // get the top node::ref n = q.top(); - - std::cout << "d:" << q.size() << " l:" << n->is_leaf() << " n:" << n->name(); - // visit n + // remove from stack q.pop(); +// std::cout << "d:" << q.size() << " l:" << n->is_leaf() << " n:" << n->name(); + // add all children for(auto c : n->children()) q.push(c); - std::cout << std::endl; +// std::cout << std::endl; } } diff --git a/src/scene/tests/pwscene_test_node.cpp b/src/scene/tests/pwscene_test_node.cpp index 7ad0fe9..e3c355b 100644 --- a/src/scene/tests/pwscene_test_node.cpp +++ b/src/scene/tests/pwscene_test_node.cpp @@ -6,6 +6,19 @@ #include +void print_node_path(pw::node::ref node) { + + auto parents = node->path(); + + std::cout << node->name() << " - "; + for (auto p : node->path()) { + std::cout << " p:'" << p->name() << "'"; + } + + std::cout << std::endl; + +} + int main(int argc,char **argv) { using namespace pw; @@ -33,7 +46,7 @@ int main(int argc,char **argv) { std::cout << "n components: " << n->components().size() << std::endl; - + print_node_path((n)); return 0; diff --git a/src/scene/tests/pwscene_test_traverser.cpp b/src/scene/tests/pwscene_test_traverser.cpp index 4f08170..638521f 100644 --- a/src/scene/tests/pwscene_test_traverser.cpp +++ b/src/scene/tests/pwscene_test_traverser.cpp @@ -23,6 +23,20 @@ #include + + +void print_node_path(pw::node::ref node) { + + auto parents = node->path(); + + std::cout << node->name() << " - "; + for (auto p : node->path()) { + std::cout << " p:'" << p->name() << "'"; + } + + std::cout << std::endl; + +} int main(int argc,char **argv) { using namespace pw; @@ -32,15 +46,19 @@ int main(int argc,char **argv) { node::ref sub_2_1 = std::make_shared("sub-2-1"); - root->add_child(std::make_shared("sub-2"))->add_child(std::make_shared("sub-2-1")); root->add_child(std::make_shared("sub-3"))->add_child(sub_2_1); + root->add_child(std::make_shared("sub-2"))->add_child(std::make_shared("sub-2-2")); - std::cout << "sub-2-1 parent count: " << sub_2_1->parents().size() << std::endl; +// std::cout << "sub-2-1 parent count: " << sub_2_1->parents().size() << std::endl; - traverser tv; +// traverser tv; +// tv.bfs(root); + + +// print_node_path(sub_2_1); +// print_node_path(root->children()[2]->children().front()); - tv.bfs(root); return 0; }