Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 8 additions & 0 deletions modules/vms/angel/includes/angelsystem.h
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@

#include <system.h>

#include "components/angelbehaviour.h"

class asIScriptEngine;
class asIScriptModule;
class asIScriptContext;
Expand Down Expand Up @@ -40,6 +42,8 @@ class AngelSystem : public System {

asIScriptContext *context() const;

MetaObject *getMetaObject(asIScriptObject *object);

protected:
bool isBehaviour(asITypeInfo *info) const;

Expand All @@ -50,6 +54,9 @@ class AngelSystem : public System {

static void messageCallback(const asSMessageInfo *msg, void *param);

private:
std::unordered_map<asITypeInfo *, MetaObject *> m_metaObjects;

asIScriptEngine *m_scriptEngine;

asIScriptModule *m_scriptModule;
Expand All @@ -61,6 +68,7 @@ class AngelSystem : public System {
bool m_inited;

bool m_generic;

};

#endif // ANGELSYSTEM_H
14 changes: 3 additions & 11 deletions modules/vms/angel/includes/components/angelbehaviour.h
Original file line number Diff line number Diff line change
Expand Up @@ -36,8 +36,6 @@ class AngelBehaviour : public NativeBehaviour {

static void *construct() { return new AngelBehaviour(); }

void updateMeta();

void setScriptStart(asIScriptFunction *function);
void setScriptUpdate(asIScriptFunction *function);

Expand All @@ -46,9 +44,6 @@ class AngelBehaviour : public NativeBehaviour {
VariantList saveData() const override;
void loadData(const VariantList &data) override;

VariantMap saveUserData() const override;
void loadUserData(const VariantMap &data) override;

void setType(const std::string &type) override;
void setSystem(ObjectSystem *system) override;

Expand Down Expand Up @@ -82,25 +77,22 @@ class AngelBehaviour : public NativeBehaviour {
protected:
std::string m_script;

std::list<std::pair<AngelBehaviour *, void *>> m_obsevers;
std::vector<MetaProperty::Table> m_propertyTable;
std::vector<MetaMethod::Table> m_methodTable;

struct PropertyFields {
Object *object;
void *address;
bool isObject;
bool isScript;
};

std::unordered_map<const char *, PropertyFields> m_propertyAdresses;
std::unordered_map<const char *, PropertyFields> m_propertyFields;

std::list<std::pair<AngelBehaviour *, void *>> m_obsevers;

asIScriptObject *m_object;

asIScriptFunction *m_start;
asIScriptFunction *m_update;

MetaObject *m_metaObject;
};

#endif // ANGELBEHAVIOUR_H
94 changes: 89 additions & 5 deletions modules/vms/angel/src/angelsystem.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,6 @@
#include <components/scene.h>
#include <components/actor.h>
#include <components/world.h>
#include <components/angelbehaviour.h>

#include <cstring>
#include <algorithm>
Expand Down Expand Up @@ -284,6 +283,95 @@ asIScriptContext *AngelSystem::context() const {
return m_context;
}

MetaObject *AngelSystem::getMetaObject(asIScriptObject *object) {
asITypeInfo *info = object->GetObjectType();

auto it = m_metaObjects.find(info);
if(it != m_metaObjects.end()) {
return it->second;
}

std::vector<MetaProperty::Table> propertyTable;
std::vector<MetaMethod::Table> methodTable;

uint32_t count = info->GetPropertyCount();
for(uint32_t i = 0; i <= count; i++) {
if(i == count) {
propertyTable.push_back({nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr});
} else {
const char *name;
int typeId;
bool isPrivate;
bool isProtected;
info->GetProperty(i, &name, &typeId, &isPrivate, &isProtected);
if(!isPrivate && !isProtected) {
uint32_t metaType = 0;
if(typeId > asTYPEID_DOUBLE) {
asITypeInfo *type = m_scriptEngine->GetTypeInfoById(typeId);
if(type) {
metaType = MetaType::type(type->GetName());
if(type->GetFlags() & asOBJ_REF) {
metaType++;
}
}
} else {
switch(typeId) {
case asTYPEID_VOID: metaType = MetaType::INVALID; break;
case asTYPEID_BOOL: metaType = MetaType::BOOLEAN; break;
case asTYPEID_INT8:
case asTYPEID_INT16:
case asTYPEID_INT32:
case asTYPEID_INT64:
case asTYPEID_UINT8:
case asTYPEID_UINT16:
case asTYPEID_UINT32:
case asTYPEID_UINT64: metaType = MetaType::INTEGER; break;
case asTYPEID_FLOAT:
case asTYPEID_DOUBLE: metaType = MetaType::FLOAT; break;
default: break;
}
}
MetaType::Table *table = MetaType::table(metaType);
if(table) {
propertyTable.push_back({name, table, nullptr, nullptr, nullptr, nullptr, nullptr,
&Reader<decltype(&AngelBehaviour::readProperty), &AngelBehaviour::readProperty>::read,
&Writer<decltype(&AngelBehaviour::writeProperty), &AngelBehaviour::writeProperty>::write});
}
}
}
}

count = info->GetMethodCount();
for(uint32_t m = 0; m <= count; m++) {
if(m == count) {
methodTable.push_back({MetaMethod::Method, nullptr, nullptr, nullptr, 0, 0, nullptr});
} else {
asIScriptFunction *method = info->GetMethodByIndex(m);
if(method) {
std::string name(method->GetName());
if(name.size() > 2 && name[0] == 'o' && name[1] == 'n') { // this is a slot
MetaMethod::Table table = A_SLOTEX(AngelBehaviour::scriptSlot, method->GetName());
table.sign = Mathf::hashString(std::string(method->GetName()) + "()");
methodTable.push_back(table);
}
}
}
}

MetaProperty::Table *props = new MetaProperty::Table[propertyTable.size()];
memcpy(props, propertyTable.data(), sizeof(MetaProperty::Table) * propertyTable.size());

MetaMethod::Table *metods = new MetaMethod::Table[methodTable.size()];
memcpy(metods, methodTable.data(), sizeof(MetaMethod::Table) * methodTable.size());

MetaObject *metaObject = new MetaObject(info->GetName(), AngelBehaviour::metaClass(),
&AngelBehaviour::construct, metods, props, nullptr);

m_metaObjects[info] = metaObject;

return metaObject;
}

bool AngelSystem::isBehaviour(asITypeInfo *info) const {
asITypeInfo *super = info->GetBaseType();
if(super) {
Expand Down Expand Up @@ -533,10 +621,6 @@ void AngelSystem::bindMetaType(asIScriptEngine *engine, const MetaType::Table &t
meta = &metaStruct;
}

if(std::string(typeName) == "WebRequest") {
aDebug() << typeName;
}

for(int32_t e = 0; e < meta->enumeratorCount(); e++) {
int offset = e - meta->enumeratorOffset();
if(offset >= 0) {
Expand Down
Loading
Loading