c++ - Swig 包装 GLM 库

标签 c++ lua swig glm-math

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

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

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

我确实需要通过 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 并编写我自己的 vector/矩阵库,它更简单,没有模板等,然后我可以简单地用 SWIG 包装,但我觉得这将是一个浪费时间,我最终会得到一个不太强大的数学库:(。

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

最佳答案

GLM 的一个大问题是它的 vector 类型使用了 C++ 有效性可疑的东西。许多编译器允许但标准不允许的事情。 SWIG 使用自己的解析器来工作,因此很难弄清楚 GLM 的定义。

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

关于c++ - Swig 包装 GLM 库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11949886/

相关文章:

c++ - Swig C++ Lua 通过引用传递类

security - 签名字节码加载

scripting - 如何为多个实体共享/重用 Lua 脚本?

python - SWIG 生成的 C++ 包装器会导致许多编译错误

c++ - 标准如何允许通过依赖的 typedef 名称继承构造函数?

c++ - 数组检查越界

c++ - 必须初始化字段值

c++ - 这个 reinterpret_cast 原则上和/或实践上有问题吗?

c - 如何在lua中卸载动态库

c++ - 改进 make 函数的 Swig-tcl 包装