File: EClassInterface.h

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 (139 lines) | stat: -rw-r--r-- 3,022 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
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