2011-01-25 4 views
2

私の3Dエンジンをlua(5.1)パーサーに接続しようとしています。 たとえば、私はvec3のLUAクラスを持っていて、私はvec3のC++クラスを持っています。私は彼らにお互いに働きたい。C++クラスをLUAテーブルに接続

これは私のC++クラスの(一部)である:

class vec3 
{ 
public: 
    vec3() {} 
    vec3(float _x, float _y, float _z) : x(_x), y(_y), z(_z) {} 

    vec3 operator+(const vec3 &b) 
    { 
     return vec3(x + b.x, y + b.y, z + b.z); 
    } 
    float dot(const vec3 &b) 
    { 
     return x * b.x + y * b.y + z * b.z; 
    } 

    float x, y, z; 
} 

これは(限られた)Luaのバージョンである:私はできるようにしたい:

vec3 = {}; 
vec3.__index = vec3; 
local mt = {} 
mt.__call = function(class_tbl, ...) 
    local obj = {} 
    setmetatable(obj, vec3); 
    vec3.init(obj, ...); 
    return obj; 
end 
vec3.init = function(obj, x, y, z) 
    obj.x, obj.y, obj.z = x, y, z; 
end 
setmetatable(vec3, mt); 

function vec3:__tostring() 
    return "(" .. self.x .. ", " .. self.y .. ", " .. self.z .. ")"; 
end 

function vec3:__add(b) 
    return vec3(self.x + b.x, self.y + b.y, self.z + b.z); 
end 

function vec3:dot(b) 
    return self.x * b.x + self.y * b.y + self.z * b.z; 
end 

私は質問は非常に明白だと思います私のC++コードでvec3を使うなど、ノードやその他のものを配置するなど、LUAプログラマがvec3で数学を行い、C++に戻すことができるようにしたいと考えています。だから私はまた、LUAでvec3を構築し、それをvec3クラスとして理解されているC++に送ることができるようにしたい。

これを達成するには、上記のLUAテーブルをLUAではなくC言語で作成する必要があると思います。それらをLUAに送信してLUAから取得するには、「プッシュ」と「ポップ」関数を作成する必要があります。

しかし、すべての試行は失敗します。

誰でも私にこれを働かせることはできますか?

ダーク。

答えて

3

なぜluabindやluabridgeのようなC++パッケージを使ってみませんか?それらのユーザでは、C++からの任意のluaデータにアクセスすることができ、その逆も可能です。

+0

これはおそらくはいですが、まだ使用していない多くのライブラリを私に必要としない1つのライブラリを見つける必要があります。 – scippie

+0

AFAIKはどちらのライブラリも必要ありません。 –

0

あなたがする必要があるのは、C++のLuaスタック上にユーザーデータを作成し、これをオブジェクトとして使用することです。かなり単純に新しいものを配置し、C++からメタテーブルを手配することができます。もちろん、これはLuaシステムの他の巨大な穴の中で、ひどく型が危険です。

+0

私は以前、ユーザーデータを使用していましたが、メソッドを追加しようとした後に固まってしまいました。私はすべての演算子のオーバーロードを追加することができますが、私はそれに "ドット"関数を追加できませんでした。助けて? – scippie

+0

これは私が短くしたものです: - 私はmetatable vec3を作成し、__tostring、__index、__newindex、__call、...などのものを追加することでクラスを宣言しました。 - __indexを使用して、LUAからx、y、zをリクエストできました - __newindexを使用してLUAから新しいx、y、zを設定できました しかし、 "ドット"機能を追加しようとしました、ドットコールは__indexコールを受け取りました。 – scippie

+0

@scippie:これは、object:method()がobject.method(object)であり、object.methodが__indexを呼び出すからです。変数アクセスとメソッドアクセスの両方に対処するには、__indexを設定する必要があります。 – Puppy

関連する問題