File: EClassInterface.cpp

package info (click to toggle)
darkradiant 3.9.0-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 41,080 kB
  • sloc: cpp: 264,743; ansic: 10,659; python: 1,852; xml: 1,650; sh: 92; makefile: 21
file content (88 lines) | stat: -rw-r--r-- 3,488 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
#include "EClassInterface.h"

#include <pybind11/stl_bind.h>

namespace script
{

ScriptEntityClass EClassManagerInterface::findClass(const std::string& name)
{
	// Find the eclass and convert implicitly to ScriptEntityClass
	return ScriptEntityClass(GlobalEntityClassManager().findClass(name));
}

ScriptModelDef EClassManagerInterface::findModel(const std::string& name)
{
	auto modelDef = GlobalEntityClassManager().findModel(name);
	return modelDef ? ScriptModelDef(*modelDef) : _emptyModelDef;
}

void EClassManagerInterface::forEachEntityClass(EntityClassVisitor& visitor)
{
	GlobalEntityClassManager().forEachEntityClass(visitor);
}

void EClassManagerInterface::forEachModelDef(ModelDefVisitor& visitor)
{
    GlobalEntityClassManager().forEachModelDef([&](const IModelDef::Ptr& model)
    {
        visitor.visit(model);
    });
}

// IScriptInterface implementation
void EClassManagerInterface::registerInterface(py::module& scope, py::dict& globals)
{
	// Add the declaration for the EClassAttribute
	py::class_<EntityClassAttribute> eclassAttr(scope, "EntityClassAttribute");

	eclassAttr.def(py::init<const EntityClassAttribute&>());
	eclassAttr.def("getType", &EntityClassAttribute::getType, py::return_value_policy::reference);
	eclassAttr.def("getName", &EntityClassAttribute::getName, py::return_value_policy::reference);
	eclassAttr.def("getValue", &EntityClassAttribute::getValue, py::return_value_policy::reference);
	eclassAttr.def("getDescription", &EntityClassAttribute::getDescription, py::return_value_policy::reference);

	// Declare the Anims std::map to Python
	py::bind_map<IModelDef::Anims>(scope, "Anims");

	// Add the declaration for a ModelDef
	py::class_<ScriptModelDef> modelDef(scope, "ModelDef");

	modelDef.def_readonly("name", &ScriptModelDef::name);
	modelDef.def_readonly("mesh", &ScriptModelDef::mesh);
	modelDef.def_readonly("skin", &ScriptModelDef::skin);
	modelDef.def_readonly("parent", &ScriptModelDef::parent);
	modelDef.def_readonly("anims", &ScriptModelDef::anims);

	// Add the declaration for an EntityClass
	py::class_<ScriptEntityClass> eclass(scope, "EntityClass");

	eclass.def(py::init<const IEntityClassPtr&>());
	eclass.def("isNull", &ScriptEntityClass::isNull);
	eclass.def("isOfType", &ScriptEntityClass::isOfType);
	eclass.def("getAttributeValue", &ScriptEntityClass::getAttributeValue);
	eclass.def("getDefFileName", &ScriptEntityClass::getDefFileName);

	// Expose the entityclass visitor interface
	py::class_<EntityClassVisitor, EntityClassVisitorWrapper> eclassVisitor(scope, "EntityClassVisitor");
	eclassVisitor.def(py::init<>());
	eclassVisitor.def("visit", &EntityClassVisitor::visit);

	// Expose the model def visitor interface
	py::class_<ModelDefVisitor, ModelDefVisitorWrapper> modeldefVisitor(scope, "ModelDefVisitor");
	modeldefVisitor.def(py::init<>());
	modeldefVisitor.def("visit", &ModelDefVisitor::visit);

	// Add the module declaration to the given python namespace
	py::class_<EClassManagerInterface> eclassManager(scope, "EntityClassManager");

	eclassManager.def("findClass", &EClassManagerInterface::findClass);
	eclassManager.def("forEachEntityClass", &EClassManagerInterface::forEachEntityClass);
	eclassManager.def("findModel", &EClassManagerInterface::findModel);
	eclassManager.def("forEachModelDef", &EClassManagerInterface::forEachModelDef);

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

} // namespace script