#pragma once #include "DeerRender/Log.h" #include "angelscript.h" namespace Deer { namespace Scripting { const char* getAngelScriptReturnCodeString(int code); bool ImplementsInterface(asITypeInfo* type, asITypeInfo* iface); } // namespace Scripting } // namespace Deer #define REGISTER_GLOBAL_FUNC(scriptEngine, funcdef, func) \ AS_CHECK(scriptEngine->RegisterGlobalFunction( \ funcdef, \ asFUNCTION(func), asCALL_CDECL)) #define REGISTER_OBJECT_METHOD(scriptEngine, clasdef, funcdef, clas, func) \ AS_CHECK(scriptEngine->RegisterObjectMethod( \ clasdef, funcdef, \ asMETHOD(clas, func), asCALL_THISCALL)) #define REGISTER_EXT_OBJECT_METHOD(scriptEngine, clasdef, funcdef, func) \ AS_CHECK(scriptEngine->RegisterObjectMethod( \ clasdef, funcdef, \ asFUNCTION(func), asCALL_CDECL_OBJLAST)) #define REGISTER_GENERIC_OBJECT_METHOD(scriptEngine, clasdef, funcdef, func) \ AS_CHECK(scriptEngine->RegisterObjectMethod( \ clasdef, funcdef, \ asFUNCTION(func), asCALL_GENERIC)) #define REGISTER_EXT_OBJECT_CONSTRUCTOR(scriptEngine, clasdef, funcdef, func) \ AS_CHECK(scriptEngine->RegisterObjectBehaviour( \ clasdef, asBEHAVE_CONSTRUCT, funcdef, \ asFUNCTION(func), asCALL_CDECL_OBJLAST)) #define REGISTER_EXT_OBJECT_DESTRUCTOR(scriptEngine, clasdef, funcdef, func) \ AS_CHECK(scriptEngine->RegisterObjectBehaviour( \ clasdef, asBEHAVE_DESTRUCT, funcdef, \ asFUNCTION(func), asCALL_CDECL_OBJLAST)) #define AS_CHECK(f) \ { \ int __r = f; \ if (__r < 0) { \ DEER_EDITOR_ENGINE_ERROR("Error at line: {0}:{1} -> {2}", __FILE__, __LINE__, Deer::Scripting::getAngelScriptReturnCodeString(__r)); \ } \ } #define AS_CHECK_ADDITIONAL_INFO(f, i) \ { \ int __r = f; \ if (__r < 0) { \ DEER_EDITOR_ENGINE_ERROR("Error at line: {0}:{1} -> {2} \n {3}", __FILE__, __LINE__, Deer::Scripting::getAngelScriptReturnCodeString(__r), i); \ } \ } #define AS_RET_CHECK(f) \ { \ int __r = f; \ if (__r < 0) { \ DEER_EDITOR_ENGINE_ERROR("Error at line: {0}:{1} -> {2}", __FILE__, __LINE__, Deer::Scripting::getAngelScriptReturnCodeString(__r)); \ return; \ } \ }