diff options
Diffstat (limited to 'src/Bindings/ManualBindings.cpp')
-rw-r--r-- | src/Bindings/ManualBindings.cpp | 80 |
1 files changed, 80 insertions, 0 deletions
diff --git a/src/Bindings/ManualBindings.cpp b/src/Bindings/ManualBindings.cpp index 91e80acbc..9945929d0 100644 --- a/src/Bindings/ManualBindings.cpp +++ b/src/Bindings/ManualBindings.cpp @@ -37,6 +37,7 @@ #include "../CommandOutput.h" #include "../BuildInfo.h" #include "../HTTP/UrlParser.h" +#include "../BoundingBox.h" @@ -3143,6 +3144,80 @@ static int tolua_cBlockArea_SaveToSchematicString(lua_State * tolua_S) +static int tolua_cBoundingBox_CalcLineIntersection(lua_State * a_LuaState) +{ + /* Function signatures: + bbox:CalcLineIntersection(pt1, pt2) -> bool, [number, blockface] + cBoundingBox:CalcLineIntersection(min, max, pt1, pt2) -> bool, [number, blockface] + */ + cLuaState L(a_LuaState); + const Vector3d * min; + const Vector3d * max; + const Vector3d * pt1; + const Vector3d * pt2; + double lineCoeff; + eBlockFace blockFace; + bool res; + if (L.GetStackValues(2, min, max, pt1, pt2)) // Try the static signature first + { + res = cBoundingBox::CalcLineIntersection(min, max, pt1, pt2, lineCoeff, blockFace); + } + else + { + const cBoundingBox * bbox; + if (!L.GetStackValues(1, bbox, pt1, pt2)) // Try the regular signature + { + L.LogStack(); + tolua_error(a_LuaState, "Invalid function params. Expected either bbox:CalcLineIntersection(pt1, pt2) or cBoundingBox:CalcLineIntersection(min, max, pt1, pt2).", nullptr); + return 0; + } + res = bbox->CalcLineIntersection(pt1, pt2, lineCoeff, blockFace); + } + L.Push(res); + if (res) + { + L.Push(lineCoeff); + L.Push(blockFace); + return 3; + } + return 1; +} + + + + + +static int tolua_cBoundingBox_Intersect(lua_State * a_LuaState) +{ + /* Function signature: + bbox:Intersect(a_OtherBbox) -> bool, cBoundingBox + */ + cLuaState L(a_LuaState); + const cBoundingBox * self; + const cBoundingBox * other; + if (!L.GetStackValues(1, self, other)) + { + L.LogStack(); + tolua_error(a_LuaState, "Invalid function params. Expected bbox:Intersect(otherBbox).", nullptr); + return 0; + } + auto intersection = new cBoundingBox(*self); + auto res = self->Intersect(*other, *intersection); + L.Push(res); + if (!res) + { + delete intersection; + return 1; + } + L.Push(intersection); + tolua_register_gc(L, lua_gettop(L)); // Make Lua own the "intersection" object + return 2; +} + + + + + static int tolua_cCompositeChat_AddRunCommandPart(lua_State * tolua_S) { // function cCompositeChat:AddRunCommandPart(Message, Command, [Style]) @@ -3431,6 +3506,11 @@ void cManualBindings::Bind(lua_State * tolua_S) tolua_function(tolua_S, "SaveToSchematicString", tolua_cBlockArea_SaveToSchematicString); tolua_endmodule(tolua_S); + tolua_beginmodule(tolua_S, "cBoundingBox"); + tolua_function(tolua_S, "CalcLineIntersection", tolua_cBoundingBox_CalcLineIntersection); + tolua_function(tolua_S, "Intersect", tolua_cBoundingBox_Intersect); + tolua_endmodule(tolua_S); + tolua_beginmodule(tolua_S, "cClientHandle"); tolua_constant(tolua_S, "MAX_VIEW_DISTANCE", cClientHandle::MAX_VIEW_DISTANCE); tolua_constant(tolua_S, "MIN_VIEW_DISTANCE", cClientHandle::MIN_VIEW_DISTANCE); |