2

我目前正在开发一个 2D 游戏引擎,并且在实现 LUA 脚本/解释器时遇到了一个绊脚石。

我正在使用 SWIG,并且基础知识一切正常。

在引擎中,我将 GLM(OpenGL 数学库http://glm.g-truc.net/)用于所有向量和矩阵相关区域。

我真的需要通过 SWIG 向 LUA 公开 glm(在基本级别),这样我就可以在 LUA 中调用方法,例如:

actor:GetPosition()  <- Which returns a glm::vec2

GLM 是一个相当复杂的库(可能是轻描淡写的哈哈),我不需要暴露整个东西,我认为这将是荒谬的工作量。我只是希望能够访问 glm::vec2 类的 xy 组件。

我确信这一定很容易,因为 SWIG 不需要完整的类定义,并且必须有一种方法让 SWIG 假设 glm::vec2 类只有 x,y 参数。

我不确定是否在 SWIG 中使用代理类是这样做的方法?还是其他方法?我对 LUA 集成和 SWIG 也很陌生。

我真的不想走的一条路线是放弃 GLM 并编写我自己的向量/矩阵库,它更简单,没有模板等,然后我可以简单地用 SWIG 包装,但我觉得这会浪费时间我最终会得到一个功能不那么强大的数学库:(。

在此先感谢,如有必要,我可以提供更多信息。

4

2 回答 2

2

GLM 的一个大问题是它的向量类型使用了具有可疑 C++ 有效性的东西。许多编译器允许但标准不允许的事情。SWIG 使用自己的解析器来工作,因此很难对 GLM 的定义做出正面或反面。

在这种情况下,我建议使用 Luabind 而不是 SWIG。在这种情况下,它提供了更细粒度的控制,并且它的好处是不使用自己的解析器。当然,您可以在 .swig 文件中有效地重写 GLM 重要部分的原型。

于 2012-08-14T13:15:56.630 回答
1

luabind中的解决方案如下所示:

#include <luabind/luabind.hpp>


extern "C" int init(lua_State* L)
{
    using namespace luabind;
    using namespace glm;

    open(L);

    module(L)
    [
        class_<dvec2>("dvec2")
            .def_readwrite("x", &dvec2::x)
            .def_readwrite("y", &dvec2::y)
    ];

    return 0;
}
于 2012-08-14T13:11:35.057 回答