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 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139
|
#pragma once
#include "ieclass.h"
#include "iscript.h"
#include "iscriptinterface.h"
#include <pybind11/pybind11.h>
namespace script
{
/**
* This class represents a single EntityDef / EntityClass for script.
*/
class ScriptEntityClass
{
IEntityClassPtr _eclass;
EntityClassAttribute _emptyAttribute;
public:
ScriptEntityClass(const IEntityClassPtr& eclass) :
_eclass(eclass),
_emptyAttribute("text", "", "")
{}
operator const IEntityClassPtr&() const
{
return _eclass;
}
// Returns a specific spawnarg value from this entityDef, or "" if not found
std::string getAttributeValue(const std::string& name)
{
if (!_eclass)
return {};
else
return _eclass->getAttributeValue(name);
}
bool isNull() const
{
return !_eclass;
}
bool isOfType(const std::string& className)
{
return !_eclass ? false : _eclass->isOfType(className);
}
std::string getDefFileName()
{
return _eclass ? _eclass->getDeclFilePath() : std::string();
}
};
class ScriptModelDef
{
public:
ScriptModelDef()
{}
ScriptModelDef(IModelDef& modelDef)
{
name = modelDef.getDeclName();
mesh = modelDef.getMesh();
skin = modelDef.getSkin();
parent = modelDef.getParent() ? modelDef.getParent()->getDeclName() : std::string();
anims = modelDef.getAnims();
}
std::string name;
std::string mesh;
std::string skin;
std::string parent;
IModelDef::Anims anims;
};
// Wrap around the EntityClassVisitor interface
class EntityClassVisitorWrapper :
public EntityClassVisitor
{
public:
void visit(const IEntityClassPtr& eclass) override
{
// Wrap this method to python
PYBIND11_OVERLOAD_PURE(
void, /* Return type */
EntityClassVisitor, /* Parent class */
visit, /* Name of function in C++ (must match Python name) */
ScriptEntityClass(eclass) /* Argument(s) */
);
}
};
class ModelDefVisitor
{
public:
virtual ~ModelDefVisitor() {}
virtual void visit(const IModelDef::Ptr& modelDef) = 0;
};
// Wrap around the ModelDefVisitor interface
class ModelDefVisitorWrapper :
public ModelDefVisitor
{
public:
void visit(const IModelDef::Ptr& modelDef) override
{
// Wrap this method to python
PYBIND11_OVERLOAD_PURE(
void, /* Return type */
ModelDefVisitor, /* Parent class */
visit, /* Name of function in C++ (must match Python name) */
*modelDef /* Argument(s) */
);
}
};
/**
* greebo: This class provides the script interface for the GlobalEntityClassManager module.
*/
class EClassManagerInterface :
public IScriptInterface
{
ScriptModelDef _emptyModelDef;
public:
ScriptEntityClass findClass(const std::string& name);
ScriptModelDef findModel(const std::string& name);
void forEachEntityClass(EntityClassVisitor& visitor);
void forEachModelDef(ModelDefVisitor& visitor);
// IScriptInterface implementation
void registerInterface(py::module& scope, py::dict& globals) override;
};
} // namespace script
|