Как связать необработанный указатель с Luabind

Я пытаюсь использовать luabind для связывания box2d, чтобы я мог использовать его в своих сценариях lua. Я столкнулся с проблемой, когда не могу связать сырые указатели с luabind. Ниже мой код:

luabind::module(luaState)[
   luabind::class_<b2Shape>("b2Shape")
];

luabind::module(luaState)[
    luabind::class_<b2PolygonShape, luabind::bases<b2Shape>>("b2PolygonShape")
    .def(luabind::constructor<>())
    .def("GetChildCount", &b2PolygonShape::GetChildCount)
    .def("SetAsBox", (void (b2PolygonShape::*) (float32 hx, float32 hy) ) &b2PolygonShape::SetAsBox)
    .def("SetAsBox", (void (b2PolygonShape::*) (float32 hx, float32 hy, const b2Vec2& center, float32 angle) ) &b2PolygonShape::SetAsBox)
    .def("TestPoint", (void (b2PolygonShape::*) (const b2Transform& transform, const b2Vec2& p) ) &b2PolygonShape::TestPoint)
    .def("ComputeAABB", (void (b2PolygonShape::*) (b2AABB* aabb, const b2Transform& transform, int32 childIndex) ) &b2PolygonShape::ComputeAABB)
    .def("GetVertexCount", (void (b2PolygonShape::*) () ) &b2PolygonShape::GetVertexCount)
    .def("GetVertex", (const b2Vec2& (b2PolygonShape::*) (int32 index) ) &b2PolygonShape::GetVertexCount)
    .def("Validate", &b2PolygonShape::Validate)
];

luabind::module(luaState)[
    luabind::class_<b2FixtureDef>("b2FixtureDef")
    .def(luabind::constructor<>())
    .def_readwrite("shape", &b2FixtureDef::shape)
    .def_readwrite("friction", &b2FixtureDef::friction)
    .def_readwrite("restitution", &b2FixtureDef::restitution)
    .def_readwrite("density", &b2FixtureDef::density)
    .def_readwrite("isSensor", &b2FixtureDef::isSensor)
    .def_readwrite("filter", &b2FixtureDef::filter)
];

Вот мой код Луа:

local anchorBodyDef = b2BodyDef()
anchorBodyDef.position = b2Vec2(20.0, 0.0)

local anchorShape = b2PolygonShape()
anchorShape:SetAsBox(2.0, 0.5)

local anchorFixDef = b2FixtureDef()
anchorFixDef.shape = anchorShape

Каждый раз, когда я пытаюсь присвоить фигуру своему fixtureDef, используя anchorFixDef.shape = anchorShapeЛуа выдает ошибку:

terminate called after throwing an instance of 'luabind::error'
what():  lua runtime error

Как бы вы связали что-то вроде const b2Shape* shape; в luaBind, так как что-то вроде .def_readwrite("shape", &b2FixtureDef::shape) дает мне проблемы. Я видел некоторый код в документах, который использует умные указатели в операторах связывания class_, но это не решило проблемы.

Благодарю.

1 ответ

Выставляя &shape в качестве настраиваемого параметра вы пытаетесь назначить адрес (anchorShapeпотому что это то, что есть) к объекту (shape). &shape часть синтаксиса может заставить вас думать, что вы можете изменить адрес shape член, но это не возможно. Так как по адресу &shape Вы должны написать весь объект типа shape, но anchorFixDef.shape = anchorShape оператор в lua просто делает присваивание указателя. Вот почему Луабинд задыхается.

У вас есть варианты:

  1. Укажите для Lua установщик, например, для поля формы:

    luabind::class_<b2FixtureDef>("b2FixtureDef") .property("shape", &b2FixtureDef::GetShape, b2FixtureDef::SetShape) .def_readwrite("friction", &b2FixtureDef::friction)
    //assuming friction is a basic type and so on

  2. Делать shape указатель внутри b2Fixture.

Первый вариант гораздо предпочтительнее, поскольку позволяет избежать всех сложностей, связанных с управлением памятью указателя, и поэтому неплохо было бы обернуть членов класса.

Причина def_readwrite работает для других членов, вероятно, потому, что они имеют простые базовые типы (я предполагаю что-то вроде float или int), которые имеют эквивалентный тип в Lua.

Другие вопросы по тегам