Swig 包装 GLM 库

Posted

技术标签:

【中文标题】Swig 包装 GLM 库【英文标题】:Swig wrapping GLM library 【发布时间】:2012-08-14 09:58:27 【问题描述】:

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

我正在使用 SWIG,并且基础功能一切正常。

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

我确实需要通过 SWIG 将 glm(在基本级别)暴露给 LUA,以便我可以在 LUA 中调用方法,例如:

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

GLM 是一个相当复杂的库(可能是轻描淡写的大声笑),我不需要公开整个内容,我认为这将是荒谬的工作量。我只是希望能够访问 glm::vec2 类的 xy 组件。

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

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

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

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

【问题讨论】:

让我直截了当地说:您想访问 2 维 向量的 x,y z 分量吗? 感谢您的捕获,编辑了我的问题,简单的错字意味着 x,y 你需要使用 SWIG 吗?我发现使用起来真的很麻烦,尤其是在模板类/函数方面,而且在我看来,还有更好的选择。 (当您想创建与许多不同脚本语言的绑定时,SWIG 最有趣,恕我直言) 我绝不会致力于 SWIG,您个人会建议什么替代方案?我以前(几年前)使用过 Luabind,但最近在各种论坛上听说它不​​太好,而且它似乎有一段时间没有更新了。 Luabind 是我所建议的,我只对它有过积极的体验。首先,我会尝试用 luabind 回答你的问题。 【参考方案1】:

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

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

【讨论】:

【参考方案2】:

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;

【讨论】:

我采纳了您的建议并删除了 Swig,并决定尝试使用 Luabind,但似乎由于它的年龄、缺乏支持和我的无能,我无法在 OSX 上构建它,这让我现在卡在是否投入更多时间尝试构建 Luabind 或寻找另一个更现代/维护的库。 我在这里找到了 Luabind 的“维护”版本:github.com/rpavlik/luabind 它是由 RPavlik 在 Github 上分叉/维护的,他创建了一个更新的 CMake 构建以及最近修复的几个位。

以上是关于Swig 包装 GLM 库的主要内容,如果未能解决你的问题,请参考以下文章

为静态库编译 SWIG Python 包装器?

将 python 函数传递给 SWIG 包装的 C++ 代码

将外部指针包装到 SWIG 数据结构中

SWIG - 包装到 C# 时 std::list 没有默认类型映射,我该怎么办?

使用 SWIG 的 C++ 的 Python 包装器

如何使用 SWIG 包装许多 .h 文件并包含任何依赖项?