Соединение класса C ++ с таблицей LUA - PullRequest
2 голосов
/ 25 января 2011

Я пытаюсь подключить свой 3d-движок к парсеру lua (5.1).Например, у меня есть класс LUA vec3, и у меня есть класс C ++ vec3.Я хочу, чтобы они работали друг с другом.

Это (часть) моего класса 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

Я думаю, что вопрос совершенно очевиден: я хочу иметь возможность использовать vec3 в моем коде C ++, например, для позиционирования узлов или других вещей, а затем я хочу иметь возможность сделать их доступными в LUA, где программист LUA может делатьматематика с vec3 и отправить их обратно в C ++.Поэтому я также хочу иметь возможность построить vec3 в LUA и отправить его на C ++, где он понимается как класс vec3.

Чтобы достичь этого, я думаю, что мне нужно вместо этого построить вышеупомянутую таблицу LUA в Cв LUA, и мне нужно создать функцию «push» и «pop» для отправки их в LUA и получения их из LUA.

Но все мои испытания не удаются.

Может кто-нибудь мне помочьзаставить это работать?

Дирк.

Ответы [ 2 ]

3 голосов
/ 25 января 2011

Почему бы не попробовать использовать пакеты C ++, такие как luabind или luabridge?В них вы можете получить доступ к любым данным lua из C ++ и наоборот.

1 голос
/ 25 января 2011

Что вам нужно сделать, это создать пользовательские данные в стеке Lua в C ++ и использовать их в качестве объекта.Вы можете довольно просто поместить новое в него и расположить метатаблицу из C ++.Конечно, это ужасно небезопасно, среди других огромных дыр в системе Lua.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...