Skip to content

Commit

Permalink
Migrate ModelInterface. Move SceneGraphInterface implementation to so…
Browse files Browse the repository at this point in the history
…urce file.
  • Loading branch information
codereader committed Jul 19, 2017
1 parent 0190e31 commit e260128
Show file tree
Hide file tree
Showing 7 changed files with 214 additions and 220 deletions.
1 change: 1 addition & 0 deletions plugins/script/Makefile.am
Expand Up @@ -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 \
Expand Down
78 changes: 34 additions & 44 deletions plugins/script/interfaces/ModelInterface.cpp
@@ -1,8 +1,8 @@
#include "ModelInterface.h"

#include <pybind11/pybind11.h>
#include "imodelsurface.h"
#include "modelskin.h"
#include <boost/python/suite/indexing/vector_indexing_suite.hpp>

namespace script
{
Expand Down Expand Up @@ -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>("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_<model::ModelPolygon>("ModelPolygon")
.def_readonly("a", &model::ModelPolygon::a)
.def_readonly("b", &model::ModelPolygon::b)
.def_readonly("c", &model::ModelPolygon::c)
;
py::class_<ArbitraryMeshVertex> 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_<model::ModelPolygon> 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_<ScriptModelSurface>(
"ModelSurface", boost::python::init<const model::IModelSurface&>() )
.def("getNumVertices", &ScriptModelSurface::getNumVertices)
.def("getNumTriangles", &ScriptModelSurface::getNumTriangles)
.def("getVertex", &ScriptModelSurface::getVertex,
boost::python::return_value_policy<boost::python::copy_const_reference>())
.def("getPolygon", &ScriptModelSurface::getPolygon)
.def("getDefaultMaterial", &ScriptModelSurface::getDefaultMaterial)
;
py::class_<ScriptModelSurface> surface(scope, "ModelSurface");

surface.def(py::init<const model::IModelSurface&>());
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_<ScriptModelNode,
boost::python::bases<ScriptSceneNode> >("ModelNode", boost::python::init<const scene::INodePtr&>() )
.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_<ScriptModelNode, ScriptSceneNode> modelNode(scope, "ModelNode");

modelNode.def(py::init<const scene::INodePtr&>());
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
10 changes: 2 additions & 8 deletions plugins/script/interfaces/ModelInterface.h
@@ -1,7 +1,5 @@
#ifndef _MODEL_INTERFACE_H_
#define _MODEL_INTERFACE_H_
#pragma once

#include <boost/python.hpp>
#include "iscript.h"

#include "imodel.h"
Expand All @@ -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 :
Expand Down Expand Up @@ -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<ModelInterface> ModelInterfacePtr;

} // namespace script

#endif /* _MODEL_INTERFACE_H_ */
154 changes: 154 additions & 0 deletions 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_<ScriptSceneNode> sceneNode(scope, "SceneNode");

sceneNode.def(py::init<const scene::INodePtr&>());
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_<scene::NodeVisitor, SceneNodeVisitorWrapper> 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> sceneGraphInterface(scope, "SceneGraph");
sceneGraphInterface.def("root", &SceneGraphInterface::root);

// Now point the Python variable "GlobalSceneGraph" to this instance
globals["GlobalSceneGraph"] = this;
}

} // namespace script

0 comments on commit e260128

Please sign in to comment.