2011-01-25 3 views
2

3d 엔진을 lua (5.1) 파서에 연결하려고합니다. 예를 들어, vec3의 LUA 클래스가 있고 vec3의 C++ 클래스가 있습니다. 나는 그들이 서로에게 일하기를 바란다.C++ 클래스를 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 

나는 질문은 매우 분명하다 생각 : 나는 할 수 있도록하려면 이것은 (제한) 루아 버전이

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; 
} 

:

이 내 C의 (일부) ++ 클래스 내 C++ 코드에서 vec3을 사용하는 것입니다. 예를 들어 노드 나 다른 것들의 위치를 ​​지정하고 LUA 프로그래머가 vec3의 수학을 수행하고 C++로 다시 보낼 수 있도록 LUA에서이 코드를 사용할 수 있기를 원합니다. 그래서 저는 또한 LUA에서 vec3를 생성하고 그것을 vec3 클래스로 이해되는 C++로 보낼 수 있기를 원합니다.

이것을 달성하려면 위의 LUA 테이블을 LUA 대신 C로 작성해야한다고 생각하고 LUA로 보내고 LUA에서 검색하기 위해 "푸시"및 "팝"기능을 만들어야합니다.

하지만 내 모든 시도가 실패합니다.

누구든지 나를 도와 줄 수 있습니까?

더크.

답변

3

luabind 또는 luabridge와 같은 C++ 패키지를 사용해 보시지 않겠습니까? 이들에게는 C++에서 루아 데이터에 액세스 할 수 있으며 그 반대도 가능합니다.

+0

그렇습니다. 아마도 그렇습니다. 그러나 사용하지 않는 많은 라이브러리를 포함 할 필요가없는 라이브러리를 아직 찾지 못했습니다. – scippie

+0

AFAIK에는 추가 라이브러리가 필요하지 않습니다. –

0

당신이해야 할 일은 C++의 루아 스택에 사용자 데이터를 생성하고이를 객체로 사용하는 것입니다. 상당히 간단하게 배치하고 C++에서 메타 테이블을 정렬 할 수 있습니다. 물론, 이것은 Lua 시스템의 다른 거대한 구멍들 사이에서 끔찍하게 타입 안전하지 않습니다.

+0

이전에 사용자 데이터를 사용하여 시도했지만 그 방법을 추가하려고 시도했지만 막혔습니다. 모든 연산자 오버로드를 추가 할 수는 있지만 "점"기능을 추가 할 수 없습니다. 도움? – scippie

+0

이것은 내가 한 일과 같습니다 : - metatable vec3을 생성하고 __tostring, __index, __newindex, __call 등과 같은 것을 추가하여 클래스를 선언했습니다. - __index를 사용하여 LUA에서 x, y, z를 요청할 수있었습니다. - __newindex를 사용하여 LUA에서 새로운 x, y, z를 설정할 수있었습니다. 하지만 "점"기능을 추가하려고하면 dot-call이 __index 호출을 받았습니다. – scippie

+0

@scippie : object : method()가 object.method (object)이고 object.method가 __index를 호출하기 때문입니다. 변수 액세스와 메소드 액세스 모두에 대처하려면 __index를 설정해야합니다. – Puppy