在 Angelscript 中为 glm::vec3 的基于 vic3 的值类型注册赋值运算符

Register assignment operator for glm::vec3 based value type in Angelscript

本文关键字:vic3 类型 注册 赋值运算符 glm Angelscript vec3 中为      更新时间:2023-10-16

我在 Angelscript 中使用以下命令注册了一个 Vec3 值类型:

RegisterObjectType("Vec3", sizeof(glm::vec3), asOBJ_VALUE | asGetTypeTraits<glm::vec3>());

我还为该类型注册了一个构造函数和析构函数。

我已经注册了另一个类型"Transform",并给了它一个方法"Vec3 GetTranslation()",它对应于C++类方法"const glm::vec3& GetTranslation()"

RegisterObjectMethod("Transform", "Vec3 GetTranslation()", asMETHOD(Transform, GetTranslation), asCALL_THISCALL);

这就是我在 Angelscript 中使用两者的方式:

Vec3 v = transform.GetTranslation();

我收到此错误:

No appropriate opAssign method found in 'Vec3' for value assignment

注册分配运算符或任何与此相关的运算符的正确方法是什么?

我试过这个:

RegisterObjectMethod("Vec3", "Vec3 opAssign(const Vec3 &in)", asMETHOD(glm::vec3, operator=), asCALL_THISCALL);

并得到这个编译错误:

error: no matches converting function 'operator=' to type 'void (struct glm::detail::tvec3<float, (glm::precision)0u>::*)()'|
note: in expansion of macro 'asMETHOD'|
note: candidates are: template<class U> glm::detail::tvec3<T, P>& glm::detail::tvec3<T, P>::operator=(const glm::detail::tvec3<U, P>&) [with U = U; T = float; glm::precision P = (glm::precision)0u]
note:                 glm::detail::tvec3<T, P>& glm::detail::tvec3<T, P>::operator=(const glm::detail::tvec3<T, P>&) [with T = float; glm::precision P = (glm::precision)0u]|

我通过使用asMETHODPR而不是asMETHOD修复了编译错误:

RegisterObjectMethod("Vec3", "Vec3& opAssign(const Vec3 &in)", asMETHODPR(glm::vec3, operator=, (const glm::vec3&), glm::vec3&), asCALL_THISCALL);

我还需要更改 opAssign 方法来返回 Vec3&,而不是 Vec3。

我更改了 GetTranslation() 方法以返回 Vec3& :

RegisterObjectMethod("Transform", "Vec3& GetTranslation()", asMETHOD(Transform, GetTranslation), asCALL_THISCALL);

现在,这些值正在脚本中复制。