2

*/+- 演算子を実装する単純な vec3 クラスを作成しました。

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 を介してこれらの演算子をバインドしたいと考えています。

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 で関数を呼び出すことができます。

onUpdate = function (e, dt)
    e.position = e.position + e.velocity * dt;
end

vec3 クラスの *operator にブレークポイントを配置するとヒットしますが、rhs フロートは未定義です。

lua コードを次のように変更すると:

    onUpdate = function (e, dt)
        e.position = e.position + e.velocity
    end

次に、rhs vec3 も未定義です。そのため、引数が正しく渡されていないようです。

次に、登録を次のように変更しました。

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 は次の例外をスローします。

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.

私が考えることができる唯一のことは、どういうわけか関数を正しく登録していないということです。

私の質問は次のとおりです。演算子を正しくバインドし、引数の型が正しいことを確認するにはどうすればよいですか?また、lua で正しく呼び出すにはどうすればよいですか?

4

1 に答える 1