summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/Bindings/BindingsProcessor.lua15
-rw-r--r--src/Bindings/LuaState.cpp1
-rw-r--r--src/Bindings/ManualBindings.cpp80
-rw-r--r--src/BoundingBox.cpp4
-rw-r--r--src/BoundingBox.h25
5 files changed, 114 insertions, 11 deletions
diff --git a/src/Bindings/BindingsProcessor.lua b/src/Bindings/BindingsProcessor.lua
index a398f5026..e7b909ded 100644
--- a/src/Bindings/BindingsProcessor.lua
+++ b/src/Bindings/BindingsProcessor.lua
@@ -85,6 +85,7 @@ local function OutputLuaStateHelpers(a_Package)
f:write("\n\n\n\n\n")
for _, item in ipairs(types) do
f:write("typedef " .. item.name .. " * Ptr" .. item.lname .. ";\n")
+ f:write("typedef const " .. item.name .. " * ConstPtr" .. item.lname .. ";\n")
end
f:write("\n\n\n\n\n")
f:close()
@@ -104,6 +105,7 @@ local function OutputLuaStateHelpers(a_Package)
end
for _, item in ipairs(types) do
f:write("bool GetStackValue(int a_StackPos, Ptr" .. item.lname .. " & a_ReturnedVal);\n")
+ f:write("bool GetStackValue(int a_StackPos, ConstPtr" .. item.lname .. " & a_ReturnedVal);\n")
end
f:write("\n\n\n\n\n")
f:close()
@@ -139,6 +141,19 @@ local function OutputLuaStateHelpers(a_Package)
f:write("\t}\n")
f:write("\treturn false;\n")
f:write("}\n\n\n\n\n\n")
+
+ f:write("bool cLuaState::GetStackValue(int a_StackPos, ConstPtr" .. item.lname .. " & a_ReturnedVal)\n{\n\tASSERT(IsValid());\n")
+ f:write("\tif (lua_isnil(m_LuaState, a_StackPos))\n\t{\n")
+ f:write("\t\ta_ReturnedVal = nullptr;\n")
+ f:write("\t\treturn false;\n\t}\n")
+ f:write("\ttolua_Error err;\n")
+ f:write("\tif (tolua_isusertype(m_LuaState, a_StackPos, \"const " .. item.name .. "\", false, &err))\n")
+ f:write("\t{\n")
+ f:write("\t\ta_ReturnedVal = *(reinterpret_cast<const " .. item.name .. " **>(lua_touserdata(m_LuaState, a_StackPos)));\n")
+ f:write("\t\treturn true;\n");
+ f:write("\t}\n")
+ f:write("\treturn false;\n")
+ f:write("}\n\n\n\n\n\n")
end
f:close()
end
diff --git a/src/Bindings/LuaState.cpp b/src/Bindings/LuaState.cpp
index e0551c550..f11e74e75 100644
--- a/src/Bindings/LuaState.cpp
+++ b/src/Bindings/LuaState.cpp
@@ -1656,6 +1656,7 @@ void cLuaState::LogStack(lua_State * a_LuaState, const char * a_Header)
case LUA_TNUMBER: Printf(Value, "%f", static_cast<double>(lua_tonumber(a_LuaState, i))); break;
case LUA_TSTRING: Printf(Value, "%s", lua_tostring(a_LuaState, i)); break;
case LUA_TTABLE: Printf(Value, "%p", lua_topointer(a_LuaState, i)); break;
+ case LUA_TUSERDATA: Printf(Value, "%p (%s)", lua_touserdata(a_LuaState, i), tolua_typename(a_LuaState, i)); break;
default: break;
}
LOGD(" Idx %d: type %d (%s) %s", i, Type, lua_typename(a_LuaState, Type), Value.c_str());
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);
diff --git a/src/BoundingBox.cpp b/src/BoundingBox.cpp
index 8e3bb29a9..bd236bbd7 100644
--- a/src/BoundingBox.cpp
+++ b/src/BoundingBox.cpp
@@ -261,7 +261,7 @@ bool cBoundingBox::IsInside(const Vector3d & a_Min, const Vector3d & a_Max, doub
-bool cBoundingBox::CalcLineIntersection(const Vector3d & a_Line1, const Vector3d & a_Line2, double & a_LineCoeff, eBlockFace & a_Face)
+bool cBoundingBox::CalcLineIntersection(const Vector3d & a_Line1, const Vector3d & a_Line2, double & a_LineCoeff, eBlockFace & a_Face) const
{
return CalcLineIntersection(m_Min, m_Max, a_Line1, a_Line2, a_LineCoeff, a_Face);
}
@@ -336,7 +336,7 @@ bool cBoundingBox::CalcLineIntersection(const Vector3d & a_Min, const Vector3d &
-bool cBoundingBox::Intersect(const cBoundingBox & a_Other, cBoundingBox & a_Intersection)
+bool cBoundingBox::Intersect(const cBoundingBox & a_Other, cBoundingBox & a_Intersection) const
{
a_Intersection.m_Min.x = std::max(m_Min.x, a_Other.m_Min.x);
a_Intersection.m_Max.x = std::min(m_Max.x, a_Other.m_Max.x);
diff --git a/src/BoundingBox.h b/src/BoundingBox.h
index c2aa40dc7..38d567562 100644
--- a/src/BoundingBox.h
+++ b/src/BoundingBox.h
@@ -63,20 +63,25 @@ public:
/** Returns true if the specified point is inside the bounding box specified by its min / max corners */
static bool IsInside(const Vector3d & a_Min, const Vector3d & a_Max, double a_X, double a_Y, double a_Z);
+ // tolua_end
+
/** Returns true if this bounding box is intersected by the line specified by its two points
- Also calculates the distance along the line in which the intersection occurs (0 .. 1)
- Only forward collisions (a_LineCoeff >= 0) are returned. */
- bool CalcLineIntersection(const Vector3d & a_Line1, const Vector3d & a_Line2, double & a_LineCoeff, eBlockFace & a_Face);
+ Also calculates the distance along the line in which the intersection occurs, and the face hit (BLOCK_FACE_ constants)
+ Only forward collisions (a_LineCoeff >= 0) are returned.
+ Exported to Lua manually, because ToLua++ would generate needless input params (a_LineCoeff, a_Face). */
+ bool CalcLineIntersection(const Vector3d & a_LinePoint1, const Vector3d & a_LinePoint2, double & a_LineCoeff, eBlockFace & a_Face) const;
/** Returns true if the specified bounding box is intersected by the line specified by its two points
- Also calculates the distance along the line in which the intersection occurs (0 .. 1) and the face hit (BLOCK_FACE_ constants)
- Only forward collisions (a_LineCoeff >= 0) are returned. */
- static bool CalcLineIntersection(const Vector3d & a_Min, const Vector3d & a_Max, const Vector3d & a_Line1, const Vector3d & a_Line2, double & a_LineCoeff, eBlockFace & a_Face);
+ Also calculates the distance along the line in which the intersection occurs, and the face hit (BLOCK_FACE_ constants)
+ Only forward collisions (a_LineCoeff >= 0) are returned.
+ Exported to Lua manually, because ToLua++ would generate needless input params (a_LineCoeff, a_Face). */
+ static bool CalcLineIntersection(const Vector3d & a_Min, const Vector3d & a_Max, const Vector3d & a_LinePoint1, const Vector3d & a_LinePoint2, double & a_LineCoeff, eBlockFace & a_Face);
- // tolua_end
+ /** Calculates the intersection of the two bounding boxes; returns true if nonempty.
+ Exported manually, because ToLua++ would generate needless input params (a_Intersection). */
+ bool Intersect(const cBoundingBox & a_Other, cBoundingBox & a_Intersection) const;
- /** Calculates the intersection of the two bounding boxes; returns true if nonempty */
- bool Intersect(const cBoundingBox & a_Other, cBoundingBox & a_Intersection);
+ // tolua_begin
double GetMinX(void) const { return m_Min.x; }
double GetMinY(void) const { return m_Min.y; }
@@ -89,6 +94,8 @@ public:
const Vector3d & GetMin(void) const { return m_Min; }
const Vector3d & GetMax(void) const { return m_Max; }
+ // tolua_end
+
protected:
Vector3d m_Min;
Vector3d m_Max;