From 3cc99942a46bbef788f75d70425e124a49425191 Mon Sep 17 00:00:00 2001 From: Evgeny Prikazchikov Date: Tue, 2 Apr 2024 18:13:45 +0300 Subject: [PATCH] Script: Crash on calling Camera::project method #719 --- engine/includes/components/camera.h | 8 +++--- engine/src/systems/resourcesystem.cpp | 2 +- modules/vms/angel/src/angelsystem.cpp | 27 ++++++++++++------- .../angel/src/components/angelbehaviour.cpp | 4 ++- thirdparty/next/inc/core/macros.h | 9 +++++++ thirdparty/next/inc/core/metamethod.h | 1 + 6 files changed, 35 insertions(+), 16 deletions(-) diff --git a/engine/includes/components/camera.h b/engine/includes/components/camera.h index d326a143e..28a02994c 100644 --- a/engine/includes/components/camera.h +++ b/engine/includes/components/camera.h @@ -22,10 +22,10 @@ class ENGINE_EXPORT Camera : public Component { A_METHODS( A_METHOD(Matrix4, Camera::viewMatrix), A_METHOD(Matrix4, Camera::projectionMatrix), - A_METHOD(Vector3, Camera::project), - A_METHOD(Vector3, Camera::unproject), - A_METHOD(Camera *, Camera::current), - A_METHOD(void, Camera::setCurrent), + A_STATIC(Vector3, Camera::project), + A_STATIC(Vector3, Camera::unproject), + A_STATIC(Camera *, Camera::current), + A_STATIC(void, Camera::setCurrent), A_METHOD(Ray, Camera::castRay) ) diff --git a/engine/src/systems/resourcesystem.cpp b/engine/src/systems/resourcesystem.cpp index 86ba3eb5b..135fbc568 100644 --- a/engine/src/systems/resourcesystem.cpp +++ b/engine/src/systems/resourcesystem.cpp @@ -25,7 +25,7 @@ void ResourceSystem::update(World *) { ++it; } - while(m_deleteList.empty()) { + while(!m_deleteList.empty()) { Resource *res = m_deleteList.back(); m_deleteList.pop_back(); diff --git a/modules/vms/angel/src/angelsystem.cpp b/modules/vms/angel/src/angelsystem.cpp index 0e6f51549..e82b32c8a 100644 --- a/modules/vms/angel/src/angelsystem.cpp +++ b/modules/vms/angel/src/angelsystem.cpp @@ -396,9 +396,6 @@ void AngelSystem::bindMetaType(asIScriptEngine *engine, const MetaType::Table &t continue; } - asSFuncPtr ptr(3); - method.table()->address(ptr.ptr.dummy, sizeof(void *)); - string signature = retName + method.signature(); for(auto &it : signature) { if(it == '*') { @@ -406,10 +403,23 @@ void AngelSystem::bindMetaType(asIScriptEngine *engine, const MetaType::Table &t } } - engine->RegisterObjectMethod(typeName, - signature.c_str(), - ptr, - asCALL_THISCALL); + if(method.table()->type == MetaMethod::Static) { + engine->SetDefaultNamespace(typeName); + + asSFuncPtr ptr(2); + method.table()->address(ptr.ptr.dummy, sizeof(void *)); + + engine->RegisterGlobalFunction(signature.c_str(), ptr, asCALL_CDECL); + engine->SetDefaultNamespace(""); + } else { + asSFuncPtr ptr(3); + method.table()->address(ptr.ptr.dummy, sizeof(void *)); + + engine->RegisterObjectMethod(typeName, + signature.c_str(), + ptr, + asCALL_THISCALL); + } } } @@ -440,9 +450,6 @@ void AngelSystem::bindMetaType(asIScriptEngine *engine, const MetaType::Table &t string ref = (ptr) ? " &" : ""; string propertyName = property.name(); - if(propertyName == "highlightedColor") { - propertyName = propertyName; - } replace(propertyName.begin(), propertyName.end(), '/', '_'); int metaType = MetaType::type(type.name()); string get = name + " get_" + propertyName + "() property"; diff --git a/modules/vms/angel/src/components/angelbehaviour.cpp b/modules/vms/angel/src/components/angelbehaviour.cpp index 496dd7eff..1c9052ffe 100644 --- a/modules/vms/angel/src/components/angelbehaviour.cpp +++ b/modules/vms/angel/src/components/angelbehaviour.cpp @@ -287,7 +287,9 @@ void AngelBehaviour::loadUserData(const VariantMap &data) { if(factory) { Object *object = nullptr; if(factory->first->canCastTo(RESOURCE)) { - object = Engine::loadResource(property->second.toString()); + Resource *resource = Engine::loadResource(property->second.toString()); + resource->incRef(); + object = resource; } else { uint32_t uuid = property->second.toInt(); if(uuid) { diff --git a/thirdparty/next/inc/core/macros.h b/thirdparty/next/inc/core/macros.h index a9d48a378..39ed87b1b 100644 --- a/thirdparty/next/inc/core/macros.h +++ b/thirdparty/next/inc/core/macros.h @@ -141,6 +141,15 @@ public: \ return table; \ } +#define A_STATIC(r, m) { \ + MetaMethod::Static, \ + #m, \ + (MetaMethod::Table::InvokeMem)&Invoker::invoke<&m>, \ + (MetaMethod::Table::AddressMem)&Invoker::address<&m>, \ + Invoker::argCount(), \ + Invoker::types(#r), \ +} + #define A_METHOD(r, m) { \ MetaMethod::Method, \ #m, \ diff --git a/thirdparty/next/inc/core/metamethod.h b/thirdparty/next/inc/core/metamethod.h index ebfde8020..49a04382f 100644 --- a/thirdparty/next/inc/core/metamethod.h +++ b/thirdparty/next/inc/core/metamethod.h @@ -35,6 +35,7 @@ class NEXT_LIBRARY_EXPORT MetaMethod { public: enum MethodType { Method = 0, + Static, Signal, Slot };