Swig包装GLM库

时间:2012-08-14 09:58:28

标签: c++ lua swig glm-math

我正在研究2D游戏引擎,并且在实施LUA脚本/解释器时遇到了绊脚石。

我正在使用SWIG并且已经掌握了基本功能。

在引擎中,我使用GLM(OpenGL数学库http://glm.g-truc.net/)来处理所有与矢量和矩阵相关的区域。

我真的需要将glm(在基本级别)暴露给通过SWIG到LUA,所以我可以在LUA中调用方法,如:

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

GLM是一个非常复杂的库(可能是一个轻描淡写的大声笑),我并不需要暴露整个事物,这将是我假设的荒谬工作量。我只是希望能够访问glm :: vec2类的xy组件。

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

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

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

提前致谢,如有必要,我可以提供更多信息。

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分: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;
}