From 59cb75513dee15262f6d22992f9bb3dd9b4033f2 Mon Sep 17 00:00:00 2001 From: Hartmut Seichter Date: Tue, 3 Apr 2018 09:13:45 +0200 Subject: [PATCH] added scene with new approach differing from other scenegraphs - more closely modelled after Unity --- share/doc/pixwerx.xmind | Bin 21776 -> 58468 bytes src/CMakeLists.txt | 1 + src/core/include/pw/core/globals.hpp | 7 ++- src/scene/CMakeLists.txt | 2 + src/scene/include/pw/scene/node.hpp | 62 ++++++++++++++++++++++++++ src/scene/src/CMakeLists.txt | 29 ++++++++++++ src/scene/src/component.cpp | 30 +++++++++++++ src/scene/src/node.cpp | 39 ++++++++++++++++ src/scene/src/nodepath.cpp | 0 src/scene/tests/CMakeLists.txt | 6 +++ src/scene/tests/pwscene_test_node.cpp | 29 ++++++++++++ src/scripting/src/CMakeLists.txt | 2 +- src/scripting/src/script.cpp | 18 +++----- src/scripts/demos/simple_000.lua | 2 +- 14 files changed, 212 insertions(+), 15 deletions(-) create mode 100644 src/scene/include/pw/scene/node.hpp create mode 100644 src/scene/src/component.cpp create mode 100644 src/scene/src/node.cpp create mode 100644 src/scene/src/nodepath.cpp create mode 100644 src/scene/tests/CMakeLists.txt create mode 100644 src/scene/tests/pwscene_test_node.cpp diff --git a/share/doc/pixwerx.xmind b/share/doc/pixwerx.xmind index ff3b907ca581545704dad50f7adf540818f9a7b8..34f14389870ed34bc5cb09311279d363aad26d6b 100644 GIT binary patch literal 58468 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 JFid*)e*m!MTG9Xj delta 10847 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 MHDwB@t;E3iU&$mBw*UYD diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 1b9f4d7..3de2253 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -2,6 +2,7 @@ add_subdirectory(deps) add_subdirectory(core) +add_subdirectory(scene) add_subdirectory(ui) add_subdirectory(scripting) add_subdirectory(engine) diff --git a/src/core/include/pw/core/globals.hpp b/src/core/include/pw/core/globals.hpp index 15d8e1c..030ce25 100644 --- a/src/core/include/pw/core/globals.hpp +++ b/src/core/include/pw/core/globals.hpp @@ -1,10 +1,13 @@ #ifndef PW_CORE_GLOBALS_HPP #define PW_CORE_GLOBALS_HPP - #include - #include +namespace pw { + +using std::shared_ptr; + +} #endif diff --git a/src/scene/CMakeLists.txt b/src/scene/CMakeLists.txt index e69de29..fdfb8f4 100644 --- a/src/scene/CMakeLists.txt +++ b/src/scene/CMakeLists.txt @@ -0,0 +1,2 @@ +add_subdirectory(src) +add_subdirectory(tests) diff --git a/src/scene/include/pw/scene/node.hpp b/src/scene/include/pw/scene/node.hpp new file mode 100644 index 0000000..8f921cb --- /dev/null +++ b/src/scene/include/pw/scene/node.hpp @@ -0,0 +1,62 @@ +#ifndef PW_SCENE_NODE_HPP +#define PW_SCENE_NODE_HPP + +#include + +#include +#include + +namespace pw { + +class component; + +class node { +public: + + typedef shared_ptr ref; + typedef std::vector ref_array; + typedef std::vector ptr_array; + + //! standard c'tor + node(const std::string& name = ""); + + //! copy c'tor + node(const node& node); + + //! cloning interface + virtual node* clone(const unsigned short& copymode) const; + + std::string name() const; + void set_name(const std::string &name); + + //! return list of parents + inline const ptr_array& parents() const { return _parents; } + + //! check if this is the root node + inline bool is_root() const { return parents().empty(); } + + //! add a child node + void add_child(node *anode); + + //! get the list of children + inline const ref_array& children() const { return _children; } + + //! get number of children + inline size_t child_count() const { return children().size(); } + + //! check if this node is a leaf node + inline bool is_leaf() const { return children().empty(); } + + virtual ~node(); + +protected: + + ref_array _children; + ptr_array _parents; + + std::string _name; +}; + +} + +#endif diff --git a/src/scene/src/CMakeLists.txt b/src/scene/src/CMakeLists.txt index e69de29..9b6f08c 100644 --- a/src/scene/src/CMakeLists.txt +++ b/src/scene/src/CMakeLists.txt @@ -0,0 +1,29 @@ + +set(hdrs + ../include/pw/scene/node.hpp + ) + +set(srcs + node.cpp + nodepath.cpp + component.cpp + ) + +add_library(pwscene + STATIC + ${hdrs} + ${srcs} + ) + +target_include_directories( + pwscene + PUBLIC + ../include + ) + +target_include_directories( + pwscene + PUBLIC + ) + +target_link_libraries(pwscene pwcore) diff --git a/src/scene/src/component.cpp b/src/scene/src/component.cpp new file mode 100644 index 0000000..e0088f2 --- /dev/null +++ b/src/scene/src/component.cpp @@ -0,0 +1,30 @@ +#include +#include + +#include + +namespace pw { + +class component { + + std::string _name; + + //! only very few components can be attached multiple times + virtual bool singular() const { return true; } +}; + +class transform : public component { + + matrix44d _local; + matrix44d _global; + +}; + +class trs : public transform { + + vector3d _position; + vector3d _scale; + quaterniond _rotation; +}; + +} diff --git a/src/scene/src/node.cpp b/src/scene/src/node.cpp new file mode 100644 index 0000000..0093c25 --- /dev/null +++ b/src/scene/src/node.cpp @@ -0,0 +1,39 @@ +#include "pw/scene/node.hpp" + +namespace pw { + +node::node(const std::string &name) + : _name(name) +{ +} + +node *node::clone(const unsigned short ©mode) const +{ + return nullptr; +} + +std::string node::name() const +{ + return _name; +} + +void node::set_name(const std::string &name) +{ + _name = name; +} + +void node::add_child(node *anode) +{ + _children.push_back(std::shared_ptr(anode)); + anode->_parents.push_back(this); +} + +node::~node() +{ + _children.clear(); + _parents.clear(); +} + + + +} diff --git a/src/scene/src/nodepath.cpp b/src/scene/src/nodepath.cpp new file mode 100644 index 0000000..e69de29 diff --git a/src/scene/tests/CMakeLists.txt b/src/scene/tests/CMakeLists.txt new file mode 100644 index 0000000..0497955 --- /dev/null +++ b/src/scene/tests/CMakeLists.txt @@ -0,0 +1,6 @@ +add_executable(pwscene_test_node + pwscene_test_node.cpp + ) + +target_link_libraries(pwscene_test_node + pwcore pwscene) diff --git a/src/scene/tests/pwscene_test_node.cpp b/src/scene/tests/pwscene_test_node.cpp new file mode 100644 index 0000000..b9b1c3f --- /dev/null +++ b/src/scene/tests/pwscene_test_node.cpp @@ -0,0 +1,29 @@ +#include +#include +#include + +#include + +int main(int argc,char **argv) { + + using namespace pw; + + node::ref n(new node("test")); + + // check + { + n->add_child(new node("sub")); + } + + std::cout << "n name: " << n->name() << std::endl; + std::cout << "n leaf: " << n->is_leaf() << std::endl; + std::cout << "n root: " << n->is_root() << std::endl; + + std::cout << "s name: " << n->children()[0]->name() << std::endl; + std::cout << "s leaf: " << n->children()[0]->is_leaf() << std::endl; + std::cout << "s root: " << n->children()[0]->is_root() << std::endl; + + + + return 0; +} diff --git a/src/scripting/src/CMakeLists.txt b/src/scripting/src/CMakeLists.txt index 24478ff..15019a3 100644 --- a/src/scripting/src/CMakeLists.txt +++ b/src/scripting/src/CMakeLists.txt @@ -22,7 +22,7 @@ target_include_directories( target_include_directories( pwscripting - PUBLIC + PRIVATE ${CMAKE_SOURCE_DIR}/src/deps/lua-5.3.4/src ${CMAKE_SOURCE_DIR}/src/deps/sol ) diff --git a/src/scripting/src/script.cpp b/src/scripting/src/script.cpp index f340e86..758b85a 100644 --- a/src/scripting/src/script.cpp +++ b/src/scripting/src/script.cpp @@ -12,10 +12,10 @@ struct lua_state : public pw::script::state { pw::scripting::state _state; pw::scripting::table _namespace; - void load_modules(); lua_state() { + // create global pw namespace _namespace = _state.create_named_table("pw"); @@ -46,7 +46,8 @@ void lua_state::load_modules() { _namespace.set("pi",pw::Pi()); -#if 0 + using namespace pw; + _namespace.new_usertype("vector3", "set",&vector3d::set, "x", scripting::property(scripting::resolve(&vector3d::x), &vector3d::set_x), @@ -71,25 +72,20 @@ void lua_state::load_modules() { "angle",scripting::property(&axisangled::angle,&axisangled::set_angle) ); -#endif } - -pw::script::script() { +pw::script::script() +{ + _state.reset(new lua_state()); } pw::script::~script() { - // _state.collect_garbage(); + _state = nullptr; } -//bool pw::script::load(const std::string &s) -//{ -// return _state.load(s.c_str()); -//} - int pw::script::run(const std::string &s) { return _state->run(s); diff --git a/src/scripts/demos/simple_000.lua b/src/scripts/demos/simple_000.lua index 19f9852..999d9c5 100644 --- a/src/scripts/demos/simple_000.lua +++ b/src/scripts/demos/simple_000.lua @@ -1,7 +1,7 @@ -- loading our libraries pw.script:initialize() -print("hellow pixwerx") +print("hello pixwerx!") local v = pw.vector3.new() v:set(0,1,2)