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
28 changes: 18 additions & 10 deletions engine/src/components/component.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -180,15 +180,19 @@ inline void trimmType(TString &type, bool &isArray) {
}
}

Object *loadObjectHelper(const Variant &value, const MetaObject *meta) {
Object *loadObjectHelper(const Variant &value) {
Object *object = nullptr;
if(meta->canCastTo(gResource)) {
object = Engine::loadResource<Object>(value.toString());
} else {
uint32_t uuid = value.toInt();
if(uuid != 0) {
object = Engine::findObject(uuid);
}
switch(value.type()) {
case MetaType::STRING: {
object = Engine::loadResource<Object>(value.toString());
} break;
case MetaType::INTEGER: {
uint32_t uuid = value.toInt();
if(uuid != 0) {
object = Engine::findObject(uuid);
}
} break;
default: break;
}

return object;
Expand Down Expand Up @@ -229,18 +233,20 @@ void Component::loadUserData(const VariantMap &data) {
if(isArray) {
VariantList list;
for(auto it : field->second.toList()) {
Object *object = loadObjectHelper(it, factory->first);
Object *object = loadObjectHelper(it);
if(object) {
list.push_back(Variant(type, &object));
}
}
setProperty(it.first.data(), list);
} else {
Object *object = loadObjectHelper(field->second, factory->first);
Object *object = loadObjectHelper(field->second);
if(object) {
setProperty(it.first.data(), Variant(type, &object));
}
}
} else {
setProperty(it.first.data(), field->second);
}
}
}
Expand Down Expand Up @@ -299,6 +305,8 @@ VariantMap Component::saveUserData() const {
Object *object = (value.data() == nullptr) ? nullptr : *(reinterpret_cast<Object **>(value.data()));
result[it.first] = saveObjectHelper(object, factory->first);
}
} else if(isArray) {
result[it.first] = value;
}
}
return result;
Expand Down
3 changes: 3 additions & 0 deletions modules/vms/angel/includes/angelsystem.h
Original file line number Diff line number Diff line change
Expand Up @@ -52,10 +52,13 @@ class AngelSystem : public System {
void bindMetaType(asIScriptEngine *engine, const MetaType::Table &table);
void bindMetaObject(asIScriptEngine *engine, const TString &name, const MetaObject *meta);

MetaType::Table *metaType(const TString &typeName);

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

private:
std::unordered_map<asITypeInfo *, MetaObject *> m_metaObjects;
std::unordered_map<TString, MetaType::Table *> m_metaTypes;

asIScriptEngine *m_scriptEngine;

Expand Down
11 changes: 6 additions & 5 deletions modules/vms/angel/includes/components/angelbehaviour.h
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,7 @@ class AngelBehaviour : public NativeBehaviour {
void onReferenceDestroyed() override;

Variant readProperty(const MetaProperty &property) const;
void writeProperty(const MetaProperty &property, const Variant value);
void writeProperty(const MetaProperty &property, const Variant &value);

void methodCallEvent(MethodCallEvent *event) override;

Expand All @@ -78,10 +78,11 @@ class AngelBehaviour : public NativeBehaviour {
TString m_script;

struct PropertyFields {
Object *object;
void *address;
bool isObject;
bool isScript;
Object *object = nullptr;
void *address = nullptr;
bool isObject = false;
bool isScript = false;
bool isArray = false;
};

std::unordered_map<const char *, PropertyFields> m_propertyFields;
Expand Down
105 changes: 85 additions & 20 deletions modules/vms/angel/src/angelsystem.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -95,13 +95,7 @@ AngelSystem::~AngelSystem() {

deleteAllObjects();

if(m_context) {
m_context->Release();
}

if(m_scriptModule) {
m_scriptModule->Discard();
}
unload();

if(m_scriptEngine) {
m_scriptEngine->ShutDownAndRelease();
Expand All @@ -117,8 +111,6 @@ bool AngelSystem::init() {

int32_t r = m_scriptEngine->SetMessageCallback(asFUNCTION(messageCallback), nullptr, asCALL_CDECL);
if(r >= 0) {
m_context = m_scriptEngine->CreateContext();

registerClasses(m_scriptEngine);

reload();
Expand Down Expand Up @@ -181,6 +173,8 @@ void AngelSystem::reload() {
return;
}

m_context = m_scriptEngine->CreateContext();

if(m_script) {
AngelStream stream(m_script->m_array);
m_scriptModule->LoadByteCode(&stream);
Expand Down Expand Up @@ -248,7 +242,7 @@ void AngelSystem::reload() {
behaviour->loadUserData(data);
}
} else {
Log(Log::ERR) << __FUNCTION__ << "Filed to load a script";
aError() << __FUNCTION__ << "Filed to load a script";
}
}

Expand All @@ -263,7 +257,7 @@ void *AngelSystem::execute(asIScriptObject *object, asIScriptFunction *func) {
if(m_context->Execute() == asEXECUTION_EXCEPTION) {
int column;
m_context->GetExceptionLineNumber(&column);
Log(Log::ERR) << __FUNCTION__ << "Unhandled Exception:" << m_context->GetExceptionString() << m_context->GetExceptionFunction()->GetName() << "Line:" << column;
aError() << __FUNCTION__ << "Unhandled Exception:" << m_context->GetExceptionString() << m_context->GetExceptionFunction()->GetName() << "Line:" << column;
}
} else {
return nullptr;
Expand Down Expand Up @@ -305,13 +299,39 @@ MetaObject *AngelSystem::getMetaObject(asIScriptObject *object) {
bool isProtected;
info->GetProperty(i, &name, &typeId, &isPrivate, &isProtected);
if(!isPrivate && !isProtected) {
TString typeName;
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++;
typeName = type->GetName();
if(typeName == "array") {
typeId = type->GetSubTypeId();
if(typeId > asTYPEID_DOUBLE) {
asITypeInfo *subType = type->GetSubType();
typeName = TString(subType->GetName()) + "[]";
} else {
// Implement array with base type
switch(typeId) {
case asTYPEID_VOID: metaType = MetaType::INVALID; break;
case asTYPEID_BOOL: typeName = "bool[]"; 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: typeName = "int[]"; break;
case asTYPEID_FLOAT:
case asTYPEID_DOUBLE: typeName = "float[]"; break;
default: break;
}
}
} else {
if(type->GetFlags() & asOBJ_REF) {
typeName += '*';
}
}
}
} else {
Expand All @@ -331,12 +351,18 @@ MetaObject *AngelSystem::getMetaObject(asIScriptObject *object) {
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});
const MetaType::Table *table = nullptr;
if(!typeName.isEmpty()) {
typeName.replace("string", "TString");

table = AngelSystem::metaType(typeName);
} else {
table = MetaType::table(metaType);
}

propertyTable.push_back({name, table, nullptr, nullptr, nullptr, nullptr, nullptr,
&Reader<decltype(&AngelBehaviour::readProperty), &AngelBehaviour::readProperty>::read,
&Writer<decltype(&AngelBehaviour::writeProperty), &AngelBehaviour::writeProperty>::write});
}
}
}
Expand Down Expand Up @@ -388,11 +414,32 @@ void AngelSystem::unload() {
for(uint32_t i = 0; i < m_scriptModule->GetObjectTypeCount(); i++) {
asITypeInfo *info = m_scriptModule->GetObjectTypeByIndex(i);
if(info && isBehaviour(info)) {
factoryRemove(info->GetName(), std::string(gUri) + info->GetName());
factoryRemove(info->GetName(), TString(gUri) + info->GetName());
}
}
m_scriptModule->Discard();
m_scriptModule = nullptr;
}

if(m_context) {
if(m_context->GetState() == asEXECUTION_ACTIVE) {
m_context->Abort();
}
m_context->Release();
m_context = nullptr;
}

for(auto it : m_metaObjects) {
// need to delete props and methods as well
delete it.second;
}
m_metaObjects.clear();

for(auto it : m_metaTypes) {
delete []it.second->dynamicName;
delete it.second;
}
m_metaTypes.clear();
}

Object *castTo(Object *ptr) {
Expand Down Expand Up @@ -766,6 +813,24 @@ void AngelSystem::bindMetaObject(asIScriptEngine *engine, const TString &name, c
}
}

MetaType::Table *AngelSystem::metaType(const TString &typeName) {
MetaType::Table *table = MetaType::table(MetaType::type(typeName.data()));
if(table == nullptr) {
auto it = m_metaTypes.find(typeName);
if(it != m_metaTypes.end()) {
return it->second;
} else {
table = new MetaType::Table();
table->dynamicName = new char[typeName.size() + 1];
memcpy(table->dynamicName, typeName.data(), typeName.size() + 1);

m_metaTypes[typeName] = table;
}
}

return table;
}

void AngelSystem::messageCallback(const asSMessageInfo *msg, void *param) {
PROFILE_FUNCTION();

Expand Down
Loading
Loading