diff --git a/plugins/script/Makefile.am b/plugins/script/Makefile.am index 4d47219485..0d20430917 100644 --- a/plugins/script/Makefile.am +++ b/plugins/script/Makefile.am @@ -33,6 +33,7 @@ script_la_SOURCES = ScriptingSystem.cpp \ interfaces/CommandSystemInterface.cpp \ interfaces/FileSystemInterface.cpp \ interfaces/GridInterface.cpp \ + interfaces/SceneGraphInterface.cpp \ interfaces/ShaderSystemInterface.cpp \ interfaces/SkinInterface.cpp \ interfaces/SelectionSetInterface.cpp \ diff --git a/plugins/script/interfaces/ModelInterface.cpp b/plugins/script/interfaces/ModelInterface.cpp index 5a4ae263f5..e2aadf36a2 100644 --- a/plugins/script/interfaces/ModelInterface.cpp +++ b/plugins/script/interfaces/ModelInterface.cpp @@ -1,8 +1,8 @@ #include "ModelInterface.h" +#include #include "imodelsurface.h" #include "modelskin.h" -#include namespace script { @@ -136,54 +136,44 @@ ScriptModelNode ScriptModelNode::getModel(const ScriptSceneNode& node) { : ScriptSceneNode(scene::INodePtr())); } -void ModelInterface::registerInterface(boost::python::object& nspace) +void ModelInterface::registerInterface(py::module& scope, py::dict& globals) { - nspace["ArbitraryMeshVertex"] = boost::python::class_("ArbitraryMeshVertex") - .def_readwrite("texcoord", &ArbitraryMeshVertex::texcoord) - .def_readwrite("normal", &ArbitraryMeshVertex::normal) - .def_readwrite("vertex", &ArbitraryMeshVertex::vertex) - .def_readwrite("tangent", &ArbitraryMeshVertex::tangent) - .def_readwrite("bitangent", &ArbitraryMeshVertex::bitangent) - .def_readwrite("colour", &ArbitraryMeshVertex::colour) - ; - - nspace["ModelPolygon"] = boost::python::class_("ModelPolygon") - .def_readonly("a", &model::ModelPolygon::a) - .def_readonly("b", &model::ModelPolygon::b) - .def_readonly("c", &model::ModelPolygon::c) - ; + py::class_ vertex(scope, "ArbitraryMeshVertex"); + + vertex.def_readwrite("texcoord", &ArbitraryMeshVertex::texcoord); + vertex.def_readwrite("normal", &ArbitraryMeshVertex::normal); + vertex.def_readwrite("vertex", &ArbitraryMeshVertex::vertex); + vertex.def_readwrite("tangent", &ArbitraryMeshVertex::tangent); + vertex.def_readwrite("bitangent", &ArbitraryMeshVertex::bitangent); + vertex.def_readwrite("colour", &ArbitraryMeshVertex::colour); + + py::class_ poly(scope, "ModelPolygon"); + + poly.def_readonly("a", &model::ModelPolygon::a); + poly.def_readonly("b", &model::ModelPolygon::b); + poly.def_readonly("c", &model::ModelPolygon::c); // Add the ModelSurface interface - nspace["ModelSurface"] = boost::python::class_( - "ModelSurface", boost::python::init() ) - .def("getNumVertices", &ScriptModelSurface::getNumVertices) - .def("getNumTriangles", &ScriptModelSurface::getNumTriangles) - .def("getVertex", &ScriptModelSurface::getVertex, - boost::python::return_value_policy()) - .def("getPolygon", &ScriptModelSurface::getPolygon) - .def("getDefaultMaterial", &ScriptModelSurface::getDefaultMaterial) - ; + py::class_ surface(scope, "ModelSurface"); + + surface.def(py::init()); + surface.def("getNumVertices", &ScriptModelSurface::getNumVertices); + surface.def("getNumTriangles", &ScriptModelSurface::getNumTriangles); + surface.def("getVertex", &ScriptModelSurface::getVertex, py::return_value_policy::reference); + surface.def("getPolygon", &ScriptModelSurface::getPolygon); + surface.def("getDefaultMaterial", &ScriptModelSurface::getDefaultMaterial); // Add the ModelNode interface - nspace["ModelNode"] = boost::python::class_ >("ModelNode", boost::python::init() ) - .def("getFilename", &ScriptModelNode::getFilename) - .def("getModelPath", &ScriptModelNode::getModelPath) - .def("getSurfaceCount", &ScriptModelNode::getSurfaceCount) - .def("getVertexCount", &ScriptModelNode::getVertexCount) - .def("getPolyCount", &ScriptModelNode::getPolyCount) - .def("getActiveMaterials", &ScriptModelNode::getActiveMaterials) - .def("getSurface", &ScriptModelNode::getSurface) - ; - - // Add the "isModel" and "getModel" methods to all ScriptSceneNodes - boost::python::object sceneNode = nspace["SceneNode"]; - - boost::python::objects::add_to_namespace(sceneNode, - "isModel", boost::python::make_function(&ScriptModelNode::isModel)); - - boost::python::objects::add_to_namespace(sceneNode, - "getModel", boost::python::make_function(&ScriptModelNode::getModel)); + py::class_ modelNode(scope, "ModelNode"); + + modelNode.def(py::init()); + modelNode.def("getFilename", &ScriptModelNode::getFilename); + modelNode.def("getModelPath", &ScriptModelNode::getModelPath); + modelNode.def("getSurfaceCount", &ScriptModelNode::getSurfaceCount); + modelNode.def("getVertexCount", &ScriptModelNode::getVertexCount); + modelNode.def("getPolyCount", &ScriptModelNode::getPolyCount); + modelNode.def("getActiveMaterials", &ScriptModelNode::getActiveMaterials); + modelNode.def("getSurface", &ScriptModelNode::getSurface); } } // namespace script diff --git a/plugins/script/interfaces/ModelInterface.h b/plugins/script/interfaces/ModelInterface.h index ea6f6b4528..72d16c17a4 100644 --- a/plugins/script/interfaces/ModelInterface.h +++ b/plugins/script/interfaces/ModelInterface.h @@ -1,7 +1,5 @@ -#ifndef _MODEL_INTERFACE_H_ -#define _MODEL_INTERFACE_H_ +#pragma once -#include #include "iscript.h" #include "imodel.h" @@ -27,7 +25,6 @@ class ScriptModelSurface const ArbitraryMeshVertex& getVertex(int vertexIndex) const; model::ModelPolygon getPolygon(int polygonIndex) const; std::string getDefaultMaterial() const; - std::string getActiveMaterial() const; }; class ScriptModelNode : @@ -64,10 +61,7 @@ class ModelInterface : { public: // IScriptInterface implementation - void registerInterface(boost::python::object& nspace); + void registerInterface(py::module& scope, py::dict& globals) override; }; -typedef std::shared_ptr ModelInterfacePtr; } // namespace script - -#endif /* _MODEL_INTERFACE_H_ */ diff --git a/plugins/script/interfaces/SceneGraphInterface.cpp b/plugins/script/interfaces/SceneGraphInterface.cpp new file mode 100644 index 0000000000..d59404c393 --- /dev/null +++ b/plugins/script/interfaces/SceneGraphInterface.cpp @@ -0,0 +1,154 @@ +#include "SceneGraphInterface.h" + +#include "imodel.h" +#include "scenelib.h" +#include "iselection.h" +#include "debugging/ScenegraphUtils.h" + +#include "ModelInterface.h" + +namespace script +{ + +ScriptSceneNode::ScriptSceneNode(const scene::INodePtr& node) : + _node(node) +{} + +ScriptSceneNode::~ScriptSceneNode() +{} + +ScriptSceneNode::operator scene::INodePtr() const +{ + return _node.lock(); +} + +void ScriptSceneNode::removeFromParent() +{ + scene::INodePtr node = _node.lock(); + if (node != NULL) { + scene::removeNodeFromParent(node); + } +} + +void ScriptSceneNode::addToContainer(const ScriptSceneNode& container) +{ + scene::INodePtr node = _node.lock(); + if (node != NULL) { + scene::addNodeToContainer(node, container); + } +} + +const AABB& ScriptSceneNode::getWorldAABB() const +{ + scene::INodePtr node = _node.lock(); + return node != NULL ? node->worldAABB() : _emptyAABB; +} + +bool ScriptSceneNode::isNull() const +{ + return _node.lock() == NULL; +} + +ScriptSceneNode ScriptSceneNode::getParent() +{ + scene::INodePtr node = _node.lock(); + return node != NULL ? ScriptSceneNode(node->getParent()) : ScriptSceneNode(scene::INodePtr()); +} + +std::string ScriptSceneNode::getNodeType() +{ + scene::INodePtr node = _node.lock(); + return node != NULL ? getNameForNodeType(node->getNodeType()) : "null"; +} + +void ScriptSceneNode::traverse(scene::NodeVisitor& visitor) +{ + scene::INodePtr node = _node.lock(); + if (node != NULL) { + node->traverse(visitor); + } +} + +void ScriptSceneNode::traverseChildren(scene::NodeVisitor& visitor) +{ + scene::INodePtr node = _node.lock(); + if (node != NULL) { + node->traverseChildren(visitor); + } +} + +bool ScriptSceneNode::isSelected() +{ + scene::INodePtr node = _node.lock(); + if (node == NULL) return false; + + ISelectablePtr selectable = Node_getSelectable(node); + + return (selectable != NULL) ? selectable->isSelected() : false; +} + +void ScriptSceneNode::setSelected(bool selected) +{ + scene::INodePtr node = _node.lock(); + if (node == NULL) return; + + ISelectablePtr selectable = Node_getSelectable(node); + + if (selectable != NULL) { + selectable->setSelected(selected); + } +} + +void ScriptSceneNode::invertSelected() +{ + scene::INodePtr node = _node.lock(); + if (node == NULL) return; + + ISelectablePtr selectable = Node_getSelectable(node); + + if (selectable != NULL) { + selectable->setSelected(!selectable->isSelected()); + } +} + +ScriptSceneNode SceneGraphInterface::root() +{ + return ScriptSceneNode(GlobalSceneGraph().root()); +} + +void SceneGraphInterface::registerInterface(py::module& scope, py::dict& globals) +{ + // Expose the scene::Node interface + py::class_ sceneNode(scope, "SceneNode"); + + sceneNode.def(py::init()); + sceneNode.def("addToContainer", &ScriptSceneNode::addToContainer); + sceneNode.def("removeFromParent", &ScriptSceneNode::removeFromParent); + sceneNode.def("getWorldAABB", &ScriptSceneNode::getWorldAABB, py::return_value_policy::reference); + sceneNode.def("isNull", &ScriptSceneNode::isNull); + sceneNode.def("getParent", &ScriptSceneNode::getParent); + sceneNode.def("getNodeType", &ScriptSceneNode::getNodeType); + sceneNode.def("traverse", &ScriptSceneNode::traverse); + sceneNode.def("traverseChildren", &ScriptSceneNode::traverseChildren); + sceneNode.def("setSelected", &ScriptSceneNode::setSelected); + sceneNode.def("invertSelected", &ScriptSceneNode::invertSelected); + sceneNode.def("isSelected", &ScriptSceneNode::isSelected); + + // Add the "isModel" and "getModel" methods to all ScriptSceneNodes + sceneNode.def("isModel", &ScriptModelNode::isModel); + sceneNode.def("getModel", &ScriptModelNode::getModel); + + py::class_ visitor(scope, "SceneNodeVisitor"); + visitor.def(py::init<>()); + visitor.def("pre", &scene::NodeVisitor::pre); + visitor.def("post", &scene::NodeVisitor::post); + + // Add the module declaration to the given python namespace + py::class_ sceneGraphInterface(scope, "SceneGraph"); + sceneGraphInterface.def("root", &SceneGraphInterface::root); + + // Now point the Python variable "GlobalSceneGraph" to this instance + globals["GlobalSceneGraph"] = this; +} + +} // namespace script diff --git a/plugins/script/interfaces/SceneGraphInterface.h b/plugins/script/interfaces/SceneGraphInterface.h index b0e7c77fe8..04178c4255 100644 --- a/plugins/script/interfaces/SceneGraphInterface.h +++ b/plugins/script/interfaces/SceneGraphInterface.h @@ -3,14 +3,11 @@ #include "inode.h" #include "iscript.h" #include "iscenegraph.h" -#include "scenelib.h" -#include "iselection.h" -#include "debugging/ScenegraphUtils.h" #include -#include -namespace script { +namespace script +{ class ScriptSceneNode { @@ -20,106 +17,39 @@ class ScriptSceneNode AABB _emptyAABB; public: - ScriptSceneNode(const scene::INodePtr& node) : - _node(node) - {} - - virtual ~ScriptSceneNode() - {} - - operator scene::INodePtr() const { - return _node.lock(); - } - - void removeFromParent() { - scene::INodePtr node = _node.lock(); - if (node != NULL) { - scene::removeNodeFromParent(node); - } - } - - void addToContainer(const ScriptSceneNode& container) { - scene::INodePtr node = _node.lock(); - if (node != NULL) { - scene::addNodeToContainer(node, container); - } - } - - const AABB& getWorldAABB() const { - scene::INodePtr node = _node.lock(); - return node != NULL ? node->worldAABB() : _emptyAABB; - } - - bool isNull() const { - return _node.lock() == NULL; - } - - ScriptSceneNode getParent() { - scene::INodePtr node = _node.lock(); - return node != NULL - ? ScriptSceneNode(node->getParent()) - : ScriptSceneNode(scene::INodePtr()); - } + ScriptSceneNode(const scene::INodePtr& node); - std::string getNodeType() { - scene::INodePtr node = _node.lock(); - return node != NULL ? getNameForNodeType(node->getNodeType()) : "null"; - } + virtual ~ScriptSceneNode(); - void traverse(scene::NodeVisitor& visitor) { - scene::INodePtr node = _node.lock(); - if (node != NULL) { - node->traverse(visitor); - } - } + operator scene::INodePtr() const; - void traverseChildren(scene::NodeVisitor& visitor) { - scene::INodePtr node = _node.lock(); - if (node != NULL) { - node->traverseChildren(visitor); - } - } + void removeFromParent(); + void addToContainer(const ScriptSceneNode& container); - bool isSelected() { - scene::INodePtr node = _node.lock(); - if (node == NULL) return false; + const AABB& getWorldAABB() const; - ISelectablePtr selectable = Node_getSelectable(node); + bool isNull() const; - return (selectable != NULL) ? selectable->isSelected() : false; - } + ScriptSceneNode getParent(); - void setSelected(bool selected) { - scene::INodePtr node = _node.lock(); - if (node == NULL) return; + std::string getNodeType(); - ISelectablePtr selectable = Node_getSelectable(node); + void traverse(scene::NodeVisitor& visitor); - if (selectable != NULL) { - selectable->setSelected(selected); - } - } + void traverseChildren(scene::NodeVisitor& visitor); - void invertSelected() { - scene::INodePtr node = _node.lock(); - if (node == NULL) return; + bool isSelected(); - ISelectablePtr selectable = Node_getSelectable(node); + void setSelected(bool selected); - if (selectable != NULL) { - selectable->setSelected(!selectable->isSelected()); - } - } + void invertSelected(); }; // Wrap around the scene::NodeVisitor interface class SceneNodeVisitorWrapper : - public scene::NodeVisitor, - public boost::python::wrapper + public scene::NodeVisitor { public: - using NodeVisitor::NodeVisitor; - bool pre(const scene::INodePtr& node) override { // Wrap this method to python @@ -146,88 +76,9 @@ class SceneGraphInterface : public IScriptInterface { public: - ScriptSceneNode root() - { - return ScriptSceneNode(GlobalSceneGraph().root()); - } + ScriptSceneNode root(); - void registerInterface(py::module& scope, py::dict& globals) override - { - // Expose the scene::Node interface - py::class_ sceneNode(scope, "SceneNode"); - - sceneNode.def(py::init()); - sceneNode.def("addToContainer", &ScriptSceneNode::addToContainer); - sceneNode.def("removeFromParent", &ScriptSceneNode::removeFromParent); - sceneNode.def("getWorldAABB", &ScriptSceneNode::getWorldAABB, py::return_value_policy::reference); - sceneNode.def("isNull", &ScriptSceneNode::isNull); - sceneNode.def("getParent", &ScriptSceneNode::getParent); - sceneNode.def("getNodeType", &ScriptSceneNode::getNodeType); - sceneNode.def("traverse", &ScriptSceneNode::traverse); - sceneNode.def("traverseChildren", &ScriptSceneNode::traverseChildren); - sceneNode.def("setSelected", &ScriptSceneNode::setSelected); - sceneNode.def("invertSelected", &ScriptSceneNode::invertSelected); - sceneNode.def("isSelected", &ScriptSceneNode::isSelected); - - py::class_ visitor(scope, "SceneNodeVisitor"); - visitor.def(py::init<>()); - visitor.def("pre", &scene::NodeVisitor::pre); - visitor.def("post", &scene::NodeVisitor::post); - -#if 0 - // Expose the scene::NodeVisitor interface - nspace["SceneNodeVisitor"] = - boost::python::class_("SceneNodeVisitor") - .def("pre", boost::python::pure_virtual(&scene::NodeVisitor::pre)) - .def("post", &scene::NodeVisitor::post, &SceneNodeVisitorWrapper::post_default) // respect default impl. - ; -#endif - // Add the module declaration to the given python namespace - py::class_ sceneGraphInterface(scope, "SceneGraph"); - sceneGraphInterface.def("root", &SceneGraphInterface::root); - - // Now point the Python variable "GlobalSceneGraph" to this instance - globals["GlobalSceneGraph"] = this; - } - -#if 0 - // IScriptInterface implementation - void registerInterface(boost::python::object& nspace) - { - // Expose the scene::Node interface - nspace["SceneNode"] = boost::python::class_( - "SceneNode", boost::python::init()) - .def("addToContainer", &ScriptSceneNode::addToContainer) - .def("removeFromParent", &ScriptSceneNode::removeFromParent) - .def("getWorldAABB", &ScriptSceneNode::getWorldAABB, - boost::python::return_value_policy()) - .def("isNull", &ScriptSceneNode::isNull) - .def("getParent", &ScriptSceneNode::getParent) - .def("getNodeType", &ScriptSceneNode::getNodeType) - .def("traverse", &ScriptSceneNode::traverse) - .def("traverseChildren", &ScriptSceneNode::traverseChildren) - .def("setSelected", &ScriptSceneNode::setSelected) - .def("invertSelected", &ScriptSceneNode::invertSelected) - .def("isSelected", &ScriptSceneNode::isSelected) - ; - - // Expose the scene::NodeVisitor interface - nspace["SceneNodeVisitor"] = - boost::python::class_("SceneNodeVisitor") - .def("pre", boost::python::pure_virtual(&scene::NodeVisitor::pre)) - .def("post", &scene::NodeVisitor::post, &SceneNodeVisitorWrapper::post_default) // respect default impl. - ; - - // Add the module declaration to the given python namespace - nspace["GlobalSceneGraph"] = boost::python::class_("GlobalSceneGraph") - .def("root", &SceneGraphInterface::root) - ; - - // Now point the Python variable "GlobalSceneGraph" to this instance - nspace["GlobalSceneGraph"] = boost::python::ptr(this); - } -#endif + void registerInterface(py::module& scope, py::dict& globals) override; }; -typedef std::shared_ptr SceneGraphInterfacePtr; } // namespace script diff --git a/tools/msvc/script.vcxproj b/tools/msvc/script.vcxproj index 132519769e..782675389d 100644 --- a/tools/msvc/script.vcxproj +++ b/tools/msvc/script.vcxproj @@ -348,6 +348,7 @@ + Create Create diff --git a/tools/msvc/script.vcxproj.filters b/tools/msvc/script.vcxproj.filters index fe3e787ffe..61551b2947 100644 --- a/tools/msvc/script.vcxproj.filters +++ b/tools/msvc/script.vcxproj.filters @@ -168,5 +168,8 @@ src + + src\interfaces + \ No newline at end of file