diff --git a/Content/Documentation/ScriptingAPI-Documentation.md b/Content/Documentation/ScriptingAPI-Documentation.md index 801c45bb3..495dab8fa 100644 --- a/Content/Documentation/ScriptingAPI-Documentation.md +++ b/Content/Documentation/ScriptingAPI-Documentation.md @@ -1700,3 +1700,10 @@ Playstation button codes: - [outer]ACTIVATION_STATE_INACTIVE : int - Intersects(Scene scene, Ray ray) : Entity entity, Vector position,normal, Entity humanoid_ragdoll_entity, HumanoidBone humanoid_bone, Vector position_local -- Performns physics scene intersection for closest hit with a ray + +- PickDrag(Scene scene, Ray, ray, PickDragOperation op) -- pick and drag physics objects such as ragdolls and rigid bodies. + +#### PickDragOperation +Tracks a physics pick drag operation. Use it with `phyiscs.PickDrag()` function. When using this object first time to PickDrag, the operation will be started and the operation will end when you call Finish() or when the object is destroyed +- [constructor]PickDragOperation() -- creates the object +- Finish() -- finish the operation, puts down the physics object diff --git a/WickedEngine/wiPhysics_BindLua.cpp b/WickedEngine/wiPhysics_BindLua.cpp index 5036f4ae0..5fbbfa2ab 100644 --- a/WickedEngine/wiPhysics_BindLua.cpp +++ b/WickedEngine/wiPhysics_BindLua.cpp @@ -26,6 +26,7 @@ namespace wi::lua lunamethod(Physics_BindLua, ApplyTorqueImpulse), lunamethod(Physics_BindLua, SetActivationState), lunamethod(Physics_BindLua, Intersects), + lunamethod(Physics_BindLua, PickDrag), { NULL, NULL } }; Luna::PropertyType Physics_BindLua::properties[] = { @@ -423,6 +424,36 @@ namespace wi::lua wi::lua::SError(L, "Intersects(Scene, Ray) not enough arguments!"); return 0; } + int Physics_BindLua::PickDrag(lua_State* L) + { + int argc = wi::lua::SGetArgCount(L); + if (argc > 2) + { + scene::Scene_BindLua* scene = Luna::lightcheck(L, 1); + if (scene == nullptr) + { + wi::lua::SError(L, "Intersects(Scene, Ray, PickDragOperation) first argument is not a Scene!"); + return 0; + } + primitive::Ray_BindLua* ray = Luna::lightcheck(L, 2); + if (ray == nullptr) + { + wi::lua::SError(L, "Intersects(Scene, Ray, PickDragOperation) second argument is not a Ray!"); + return 0; + } + PickDragOperation_BindLua* op = Luna::lightcheck(L, 3); + if (op == nullptr) + { + wi::lua::SError(L, "Intersects(Scene, Ray, PickDragOperation) third argument is not a PickDragOperation!"); + return 0; + } + + wi::physics::PickDrag(*scene->scene, ray->ray, op->op); + return 0; + } + wi::lua::SError(L, "Intersects(Scene, Ray, PickDragOperation) not enough arguments!"); + return 0; + } void Physics_BindLua::Bind() { @@ -430,6 +461,7 @@ namespace wi::lua if (!initialized) { initialized = true; + Luna::Register(wi::lua::GetLuaState()); Luna::Register(wi::lua::GetLuaState()); Luna::push_global(wi::lua::GetLuaState(), "physics"); @@ -439,4 +471,21 @@ ACTIVATION_STATE_INACTIVE = 1 )"); } } + + + + + Luna::FunctionType PickDragOperation_BindLua::methods[] = { + lunamethod(PickDragOperation_BindLua, Finish), + { NULL, NULL } + }; + Luna::PropertyType PickDragOperation_BindLua::properties[] = { + { NULL, NULL } + }; + + int PickDragOperation_BindLua::Finish(lua_State* L) + { + op = {}; + return 0; + } } diff --git a/WickedEngine/wiPhysics_BindLua.h b/WickedEngine/wiPhysics_BindLua.h index 719f50a12..474700ebc 100644 --- a/WickedEngine/wiPhysics_BindLua.h +++ b/WickedEngine/wiPhysics_BindLua.h @@ -35,7 +35,22 @@ namespace wi::lua int SetActivationState(lua_State* L); int Intersects(lua_State* L); + int PickDrag(lua_State* L); static void Bind(); }; + + class PickDragOperation_BindLua + { + public: + wi::physics::PickDragOperation op; + inline static constexpr char className[] = "PickDragOperation"; + static Luna::FunctionType methods[]; + static Luna::PropertyType properties[]; + + PickDragOperation_BindLua() = default; + PickDragOperation_BindLua(lua_State* L) {} + + int Finish(lua_State* L); + }; } diff --git a/WickedEngine/wiVersion.cpp b/WickedEngine/wiVersion.cpp index 01d51d1e8..fbf323001 100644 --- a/WickedEngine/wiVersion.cpp +++ b/WickedEngine/wiVersion.cpp @@ -9,7 +9,7 @@ namespace wi::version // minor features, major updates, breaking compatibility changes const int minor = 71; // minor bug fixes, alterations, refactors, updates - const int revision = 330; + const int revision = 331; const std::string version_string = std::to_string(major) + "." + std::to_string(minor) + "." + std::to_string(revision);