#include "CTypesPhysics.h" #include "CScriptingEngine.h" #include "CTypesRegistering.h" #include "CPhysicsEngine.h" void CScriptingEngine::RegisterPhysicsTypes() { State->new_enum ( "EUnitType", { { "Rigid", EUnitType::Rigid }, { "Kinematic", EUnitType::Kinematic }, { "Ghost", EUnitType::Ghost } } ); State->new_usertype ( "PhysicsShapes_CBasic", sol::no_constructor, "GetType", &PhysicsShapes::CBasic::GetType, "Load", &PhysicsShapes::CBasic::Load, "Build", &PhysicsShapes::CBasic::Build, "GetMargin", &PhysicsShapes::CBasic::GetMargin, "SetMargin", &PhysicsShapes::CBasic::SetMargin ); State->new_usertype ( "CCollision", sol::no_constructor, SOL_RESOURCE_BASE, "Shape", sol::property([](CCollision& col) -> PhysicsShapes::CBasic* { return col.Shape.get(); }) ); State->new_usertype ( "CWorldUnit", sol::no_constructor, "SetCollision", &CWorldUnit::SetCollision, "GetCollision", &CWorldUnit::GetCollision, "SetTransform", &CWorldUnit::SetTransform, "UpdateInternalTransform", &CWorldUnit::UpdateInternalTransform, "GetInternalTransform", &CWorldUnit::GetInternalTransform, "GetTransform", &CWorldUnit::GetTransform, "GetTransformCallback", [](CWorldUnit& unit, sol::this_state ts) { return unit.GetTransformCallback().GetScriptTable(ts); }, "GetWorld", &CWorldUnit::GetWorld, "World", sol::property([](CWorldUnit& world) { return world.GetWorld(); }), "IsUpdatingInternalTransform", &CWorldUnit::IsUpdatingInternalTransform, "GetType", &CWorldUnit::GetType ); State->new_usertype ( "CRigidBody", sol::no_constructor, sol::base_classes, sol::bases(), "SetMass", &CRigidBody::SetMass, "GetMass", &CRigidBody::GetMass, "SetLinearVelocity", &CRigidBody::SetLinearVelocity, "SetAngularVelocity", &CRigidBody::SetAngularVelocity, "GetLinearVelocity", &CRigidBody::GetLinearVelocity, "GetAngularVelocity", &CRigidBody::GetAngularVelocity, "Activate", &CRigidBody::Activate ); State->new_usertype ( "CKinematicBody", sol::no_constructor, sol::base_classes, sol::bases() ); State->new_usertype ( "CGhostBody", sol::no_constructor, sol::base_classes, sol::bases() ); State->new_usertype ( "CSweepHit", sol::no_constructor, "HitUnit", &CSweepHit::HitUnit, "HitPointWorld", &CSweepHit::HitPointWorld, "HitNormalWorld", &CSweepHit::HitNormalWorld, "HitFraction", &CSweepHit::HitFraction ); State->new_usertype ( "IConvexSweepResult", sol::no_constructor, "HasHit", &IConvexSweepResult::HasHit, "GetHit", &IConvexSweepResult::GetHit ); State->new_usertype ( "IConvexSweepCallback", sol::no_constructor, "OnHit", &IConvexSweepCallback::OnHit ); State->new_usertype ( "IContactPoint", sol::no_constructor, "GetPositionWorldOnA", &IContactPoint::GetPositionWorldOnA, "GetPositionWorldOnB", &IContactPoint::GetPositionWorldOnB, "GetNormalWorldOnB", &IContactPoint::GetNormalWorldOnB, "GetDistance", &IContactPoint::GetDistance ); State->new_usertype ( "IContactManifold", sol::no_constructor, "GetNumContacts", &IContactManifold::GetNumContacts, "GetUnitA", &IContactManifold::GetUnitA, "GetUnitB", &IContactManifold::GetUnitB, "UnitA", sol::property([](IContactManifold& mnf) -> CWorldUnit* { return mnf.GetUnitA(); }), "UnitB", sol::property([](IContactManifold& mnf) -> CWorldUnit* { return mnf.GetUnitB(); }), "GetContact", [](const IContactManifold& mnf, int index) -> IContactPoint* { return mnf.GetContact(index).get(); } ); //std::vector> GetContactManifolds(CWorldUnit* other) State->new_usertype ( "IGhostOverlapResult", sol::no_constructor, "GetNumOverlappingUnits", &IGhostOverlapResult::GetNumOverlappingUnits, "GetOverlappingUnit", &IGhostOverlapResult::GetOverlappingUnit, //TODO might just reinterpret_cast since unique_ptr is just a single ptr in memory? "GetContactManifolds", [](const IGhostOverlapResult& overlap, CWorldUnit* other) -> std::vector { auto _ret = overlap.GetContactManifolds(other); std::vector ret; ret.reserve(_ret.size()); for(const auto& c : _ret) { ret.push_back(c.get()); } return ret; } ); State->new_usertype ( "CPhysicsEngine", sol::no_constructor, "GetType", &CPhysicsEngine::GetType, "CreateWorld", &CPhysicsEngine::CreateWorld, "GetWorld", [](CPhysicsEngine& eng, sol::object _id) -> CPhysicsWorld* { int id = 0; if(_id.valid() && _id.is()) { id = _id.as(); } return eng.GetWorld(id); }, "Trace", [](CPhysicsEngine& eng, sol::function func) { eng.Trace([&func](CPhysicsWorld* world) { func(world); }); } ); State->new_usertype ( "CPhysicsWorld", sol::no_constructor, "Step", &CPhysicsWorld::Step, "SetGravity", &CPhysicsWorld::SetGravity, "GetGravity", &CPhysicsWorld::GetGravity, "CreateRigidBody", &CPhysicsWorld::CreateRigidBody, "CreateKinematicBody", &CPhysicsWorld::CreateKinematicBody, "CreateGhostBody", &CPhysicsWorld::CreateGhostBody, "GetGhostOverlaps", sol::overload ( [](CPhysicsWorld& world, const CGhostBody* ghost) -> IGhostOverlapResult* { return world.V_GetGhostOverlaps(ghost).get(); }, [](CPhysicsWorld& world, const CWorldUnit* _ghost) -> IGhostOverlapResult* { auto* ghost = dynamic_cast(_ghost); if(!ghost) { return nullptr; } return world.V_GetGhostOverlaps(ghost).get(); } ), "ConvexSweep", sol::overload ( [] ( CPhysicsWorld& world, std::shared_ptr shape, const CTransform& from, const CTransform& to ) { return world.V_ConvexSweep(shape, from, to).get(); }, [] ( CPhysicsWorld& world, std::shared_ptr shape, const CTransform& from, const CTransform& to, std::vector excludeList ) { return world.V_ConvexSweep(shape, from, to, nullptr, excludeList).get(); }, [] ( CPhysicsWorld& world, std::shared_ptr shape, const CTransform& from, const CTransform& to, std::vector excludeList, IConvexSweepCallback* callback ) { return world.V_ConvexSweep(shape, from, to, callback, excludeList).get(); } ) ); }