我正在研究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包装,但我觉得这将是一个浪费时间,我最终会得到一个不那么强大的数学库:(。
提前致谢,如有必要,我可以提供更多信息。
答案 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;
}