问题描述
我编写了一个简单的 vec3 类,它实现了 */+- 运算符:
I've written a simple vec3 class, which implements the */+- operators:
class vec3
{
public:
vec3():
x(0.0f),y(0.0f),z(0.0f)
{}
vec3(float ix, float iy, float iz):
x(ix),y(iy),z(iz)
{}
vec3 operator+(const vec3& v){
vec3 vec(x+v.x,y+v.y,z+v.z);
return vec;
}
vec3 operator-(const vec3& v){
vec3 vec(x-v.x,y-v.y,z-v.z);
return vec;
}
vec3 operator*(const float& s){
vec3 vec(x*s,y*s,z*s);
return vec;
}
vec3 operator/(const float& d){
flot div = 1.0f/d;
vec3 vec(x*div,y*div,z*div);
return vec;
}
float x, y, z;
};
我希望通过 luabridge 绑定这些操作符,类似于:
I wish to bind these operators via luabridge, in some way similar to:
getGlobalNamespace(L)
.beginClass<vec3>("vec3");
.addConstructor<void (*) (const float&, const float& const float&)>()
.addData ("x", &vec3::x)
.addData ("z", &vec3::z)
.addData ("z", &vec3::y)
.addFunction("__add",(vec3*(vec3::*)(vec3)) &vec3::operator+);
.addFunction("__sub",(vec3*(vec3::*)(vec3)) &vec3::operator-);
.addFunction("__mul",(vec3*(vec3::*)(float)) &vec3::operator*);
.addFunction("__div",(vec3*(vec3::*)(float)) &vec3::operator/);
.endClass();
这样我就可以像这样调用lua中的函数:
So that I can then call the functions in lua like so:
onUpdate = function (e, dt)
e.position = e.position + e.velocity * dt;
end
当我在 vec3 类的 *operator 中放置断点时,它确实命中了它,但是 rhs 浮点数未定义.
When I place a breakpoint in the *operator for the vec3 class, it does hit it, but the rhs float is undefined.
如果我把lua代码改成:
If I change the lua code to:
onUpdate = function (e, dt)
e.position = e.position + e.velocity
end
那么rhs vec3 也是未定义的.所以看起来参数没有正确传递.
Then the rhs vec3 is also undefined. So it looks like the argument is not being passed correctly.
然后我将注册更改为:
getGlobalNamespace(L)
.beginClass<vec3>("vec3");
.addConstructor<void (*) (const float&, const float& const float&)>()
.addData ("x", &vec3::x)
.addData ("z", &vec3::z)
.addData ("z", &vec3::y)
.addFunction("__add",(vec3*(vec3::*)(const vec3&)) &vec3::operator+);
.addFunction("__sub",(vec3*(vec3::*)(const vec3&)) &vec3::operator-);
.addFunction("__mul",(vec3*(vec3::*)(const float&)) &vec3::operator*);
.addFunction("__div",(vec3*(vec3::*)(const float&)) &vec3::operator/);
.endClass();
但是现在vec3的成员数据,或者float参数是未定义的.如果我越过这个断点,luabdridge 会抛出以下异常:
But now the member data of the vec3, or the float argument is undefined. If I move past this breakpoint, luabdridge throws the following exception:
Run-Time Check Failure #0 - The value of ESP was not properly saved across a function call. This is usually a result of calling a function declared with one calling convention with a function pointer declared with a different calling convention.
我唯一能想到的是我不知何故没有正确注册该功能.
The only thing I can think of is that I have somehow not registered the function correctly.
所以我的问题是:如何正确绑定操作符,保证参数类型正确,以及如何在lua中正确调用?
So my question is this: How do I bind the operator correctly, and ensure that the argument type is correct, and how do I correctly call it in lua?
推荐答案
所以正如我在我的问题中提到的,我怀疑注册没有正确完成.我仍然不完全了解具体细节,但我怀疑函数指针转换以某种方式改变了调用约定,因此我将代码更改为:
So as I mentioned in my question, I suspected that the registration was not being done correctly. I still don;t fully understand the specifics, but I suspect that the function pointer cast is somehow changing the calling convention, so I changed the code to:
.addFunction("__mul",&vec3::operator*);
而且效果很好.
这篇关于Luabridge 绑定重载运算符的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持跟版网!