summaryrefslogtreecommitdiffstats
path: root/source
diff options
context:
space:
mode:
Diffstat (limited to 'source')
-rw-r--r--source/Bindings.cpp284
-rw-r--r--source/Bindings.h2
-rw-r--r--source/BoundingBox.cpp114
-rw-r--r--source/BoundingBox.h16
-rw-r--r--source/Vector3d.cpp72
-rw-r--r--source/Vector3d.h85
6 files changed, 527 insertions, 46 deletions
diff --git a/source/Bindings.cpp b/source/Bindings.cpp
index 871fd9c9c..c5b5df159 100644
--- a/source/Bindings.cpp
+++ b/source/Bindings.cpp
@@ -1,6 +1,6 @@
/*
** Lua binding: AllToLua
-** Generated automatically by tolua++-1.0.92 on 09/01/13 12:24:41.
+** Generated automatically by tolua++-1.0.92 on 09/01/13 19:03:24.
*/
#ifndef __cplusplus
@@ -20233,6 +20233,24 @@ static int tolua_set_Vector3f_z(lua_State* tolua_S)
}
#endif //#ifndef TOLUA_DISABLE
+/* get function: EPS of class Vector3d */
+#ifndef TOLUA_DISABLE_tolua_get_Vector3d_EPS
+static int tolua_get_Vector3d_EPS(lua_State* tolua_S)
+{
+ tolua_pushnumber(tolua_S,(lua_Number)Vector3d::EPS);
+ return 1;
+}
+#endif //#ifndef TOLUA_DISABLE
+
+/* get function: NO_INTERSECTION of class Vector3d */
+#ifndef TOLUA_DISABLE_tolua_get_Vector3d_NO_INTERSECTION
+static int tolua_get_Vector3d_NO_INTERSECTION(lua_State* tolua_S)
+{
+ tolua_pushnumber(tolua_S,(lua_Number)Vector3d::NO_INTERSECTION);
+ return 1;
+}
+#endif //#ifndef TOLUA_DISABLE
+
/* method: new of class Vector3d */
#ifndef TOLUA_DISABLE_tolua_AllToLua_Vector3d_new00
static int tolua_AllToLua_Vector3d_new00(lua_State* tolua_S)
@@ -20731,6 +20749,114 @@ static int tolua_AllToLua_Vector3d_Cross00(lua_State* tolua_S)
}
#endif //#ifndef TOLUA_DISABLE
+/* method: LineCoeffToXYPlane of class Vector3d */
+#ifndef TOLUA_DISABLE_tolua_AllToLua_Vector3d_LineCoeffToXYPlane00
+static int tolua_AllToLua_Vector3d_LineCoeffToXYPlane00(lua_State* tolua_S)
+{
+#ifndef TOLUA_RELEASE
+ tolua_Error tolua_err;
+ if (
+ !tolua_isusertype(tolua_S,1,"const Vector3d",0,&tolua_err) ||
+ (tolua_isvaluenil(tolua_S,2,&tolua_err) || !tolua_isusertype(tolua_S,2,"const Vector3d",0,&tolua_err)) ||
+ !tolua_isnumber(tolua_S,3,0,&tolua_err) ||
+ !tolua_isnoobj(tolua_S,4,&tolua_err)
+ )
+ goto tolua_lerror;
+ else
+#endif
+ {
+ const Vector3d* self = (const Vector3d*) tolua_tousertype(tolua_S,1,0);
+ const Vector3d* a_OtherEnd = ((const Vector3d*) tolua_tousertype(tolua_S,2,0));
+ double a_Z = ((double) tolua_tonumber(tolua_S,3,0));
+#ifndef TOLUA_RELEASE
+ if (!self) tolua_error(tolua_S,"invalid 'self' in function 'LineCoeffToXYPlane'", NULL);
+#endif
+ {
+ double tolua_ret = (double) self->LineCoeffToXYPlane(*a_OtherEnd,a_Z);
+ tolua_pushnumber(tolua_S,(lua_Number)tolua_ret);
+ }
+ }
+ return 1;
+#ifndef TOLUA_RELEASE
+ tolua_lerror:
+ tolua_error(tolua_S,"#ferror in function 'LineCoeffToXYPlane'.",&tolua_err);
+ return 0;
+#endif
+}
+#endif //#ifndef TOLUA_DISABLE
+
+/* method: LineCoeffToXZPlane of class Vector3d */
+#ifndef TOLUA_DISABLE_tolua_AllToLua_Vector3d_LineCoeffToXZPlane00
+static int tolua_AllToLua_Vector3d_LineCoeffToXZPlane00(lua_State* tolua_S)
+{
+#ifndef TOLUA_RELEASE
+ tolua_Error tolua_err;
+ if (
+ !tolua_isusertype(tolua_S,1,"const Vector3d",0,&tolua_err) ||
+ (tolua_isvaluenil(tolua_S,2,&tolua_err) || !tolua_isusertype(tolua_S,2,"const Vector3d",0,&tolua_err)) ||
+ !tolua_isnumber(tolua_S,3,0,&tolua_err) ||
+ !tolua_isnoobj(tolua_S,4,&tolua_err)
+ )
+ goto tolua_lerror;
+ else
+#endif
+ {
+ const Vector3d* self = (const Vector3d*) tolua_tousertype(tolua_S,1,0);
+ const Vector3d* a_OtherEnd = ((const Vector3d*) tolua_tousertype(tolua_S,2,0));
+ double a_Y = ((double) tolua_tonumber(tolua_S,3,0));
+#ifndef TOLUA_RELEASE
+ if (!self) tolua_error(tolua_S,"invalid 'self' in function 'LineCoeffToXZPlane'", NULL);
+#endif
+ {
+ double tolua_ret = (double) self->LineCoeffToXZPlane(*a_OtherEnd,a_Y);
+ tolua_pushnumber(tolua_S,(lua_Number)tolua_ret);
+ }
+ }
+ return 1;
+#ifndef TOLUA_RELEASE
+ tolua_lerror:
+ tolua_error(tolua_S,"#ferror in function 'LineCoeffToXZPlane'.",&tolua_err);
+ return 0;
+#endif
+}
+#endif //#ifndef TOLUA_DISABLE
+
+/* method: LineCoeffToYZPlane of class Vector3d */
+#ifndef TOLUA_DISABLE_tolua_AllToLua_Vector3d_LineCoeffToYZPlane00
+static int tolua_AllToLua_Vector3d_LineCoeffToYZPlane00(lua_State* tolua_S)
+{
+#ifndef TOLUA_RELEASE
+ tolua_Error tolua_err;
+ if (
+ !tolua_isusertype(tolua_S,1,"const Vector3d",0,&tolua_err) ||
+ (tolua_isvaluenil(tolua_S,2,&tolua_err) || !tolua_isusertype(tolua_S,2,"const Vector3d",0,&tolua_err)) ||
+ !tolua_isnumber(tolua_S,3,0,&tolua_err) ||
+ !tolua_isnoobj(tolua_S,4,&tolua_err)
+ )
+ goto tolua_lerror;
+ else
+#endif
+ {
+ const Vector3d* self = (const Vector3d*) tolua_tousertype(tolua_S,1,0);
+ const Vector3d* a_OtherEnd = ((const Vector3d*) tolua_tousertype(tolua_S,2,0));
+ double a_X = ((double) tolua_tonumber(tolua_S,3,0));
+#ifndef TOLUA_RELEASE
+ if (!self) tolua_error(tolua_S,"invalid 'self' in function 'LineCoeffToYZPlane'", NULL);
+#endif
+ {
+ double tolua_ret = (double) self->LineCoeffToYZPlane(*a_OtherEnd,a_X);
+ tolua_pushnumber(tolua_S,(lua_Number)tolua_ret);
+ }
+ }
+ return 1;
+#ifndef TOLUA_RELEASE
+ tolua_lerror:
+ tolua_error(tolua_S,"#ferror in function 'LineCoeffToYZPlane'.",&tolua_err);
+ return 0;
+#endif
+}
+#endif //#ifndef TOLUA_DISABLE
+
/* method: Equals of class Vector3d */
#ifndef TOLUA_DISABLE_tolua_AllToLua_Vector3d_Equals00
static int tolua_AllToLua_Vector3d_Equals00(lua_State* tolua_S)
@@ -22878,6 +23004,147 @@ tolua_lerror:
}
#endif //#ifndef TOLUA_DISABLE
+/* method: IsInside of class cBoundingBox */
+#ifndef TOLUA_DISABLE_tolua_AllToLua_cBoundingBox_IsInside04
+static int tolua_AllToLua_cBoundingBox_IsInside04(lua_State* tolua_S)
+{
+ tolua_Error tolua_err;
+ if (
+ !tolua_isusertable(tolua_S,1,"cBoundingBox",0,&tolua_err) ||
+ (tolua_isvaluenil(tolua_S,2,&tolua_err) || !tolua_isusertype(tolua_S,2,"const Vector3d",0,&tolua_err)) ||
+ (tolua_isvaluenil(tolua_S,3,&tolua_err) || !tolua_isusertype(tolua_S,3,"const Vector3d",0,&tolua_err)) ||
+ (tolua_isvaluenil(tolua_S,4,&tolua_err) || !tolua_isusertype(tolua_S,4,"const Vector3d",0,&tolua_err)) ||
+ !tolua_isnoobj(tolua_S,5,&tolua_err)
+ )
+ goto tolua_lerror;
+ else
+ {
+ const Vector3d* a_Min = ((const Vector3d*) tolua_tousertype(tolua_S,2,0));
+ const Vector3d* a_Max = ((const Vector3d*) tolua_tousertype(tolua_S,3,0));
+ const Vector3d* a_Point = ((const Vector3d*) tolua_tousertype(tolua_S,4,0));
+ {
+ bool tolua_ret = (bool) cBoundingBox::IsInside(*a_Min,*a_Max,*a_Point);
+ tolua_pushboolean(tolua_S,(bool)tolua_ret);
+ }
+ }
+ return 1;
+tolua_lerror:
+ return tolua_AllToLua_cBoundingBox_IsInside03(tolua_S);
+}
+#endif //#ifndef TOLUA_DISABLE
+
+/* method: IsInside of class cBoundingBox */
+#ifndef TOLUA_DISABLE_tolua_AllToLua_cBoundingBox_IsInside05
+static int tolua_AllToLua_cBoundingBox_IsInside05(lua_State* tolua_S)
+{
+ tolua_Error tolua_err;
+ if (
+ !tolua_isusertable(tolua_S,1,"cBoundingBox",0,&tolua_err) ||
+ (tolua_isvaluenil(tolua_S,2,&tolua_err) || !tolua_isusertype(tolua_S,2,"const Vector3d",0,&tolua_err)) ||
+ (tolua_isvaluenil(tolua_S,3,&tolua_err) || !tolua_isusertype(tolua_S,3,"const Vector3d",0,&tolua_err)) ||
+ !tolua_isnumber(tolua_S,4,0,&tolua_err) ||
+ !tolua_isnumber(tolua_S,5,0,&tolua_err) ||
+ !tolua_isnumber(tolua_S,6,0,&tolua_err) ||
+ !tolua_isnoobj(tolua_S,7,&tolua_err)
+ )
+ goto tolua_lerror;
+ else
+ {
+ const Vector3d* a_Min = ((const Vector3d*) tolua_tousertype(tolua_S,2,0));
+ const Vector3d* a_Max = ((const Vector3d*) tolua_tousertype(tolua_S,3,0));
+ double a_X = ((double) tolua_tonumber(tolua_S,4,0));
+ double a_Y = ((double) tolua_tonumber(tolua_S,5,0));
+ double a_Z = ((double) tolua_tonumber(tolua_S,6,0));
+ {
+ bool tolua_ret = (bool) cBoundingBox::IsInside(*a_Min,*a_Max,a_X,a_Y,a_Z);
+ tolua_pushboolean(tolua_S,(bool)tolua_ret);
+ }
+ }
+ return 1;
+tolua_lerror:
+ return tolua_AllToLua_cBoundingBox_IsInside04(tolua_S);
+}
+#endif //#ifndef TOLUA_DISABLE
+
+/* method: CalcLineIntersection of class cBoundingBox */
+#ifndef TOLUA_DISABLE_tolua_AllToLua_cBoundingBox_CalcLineIntersection00
+static int tolua_AllToLua_cBoundingBox_CalcLineIntersection00(lua_State* tolua_S)
+{
+#ifndef TOLUA_RELEASE
+ tolua_Error tolua_err;
+ if (
+ !tolua_isusertype(tolua_S,1,"cBoundingBox",0,&tolua_err) ||
+ (tolua_isvaluenil(tolua_S,2,&tolua_err) || !tolua_isusertype(tolua_S,2,"const Vector3d",0,&tolua_err)) ||
+ (tolua_isvaluenil(tolua_S,3,&tolua_err) || !tolua_isusertype(tolua_S,3,"const Vector3d",0,&tolua_err)) ||
+ !tolua_isnumber(tolua_S,4,0,&tolua_err) ||
+ !tolua_isnumber(tolua_S,5,0,&tolua_err) ||
+ !tolua_isnoobj(tolua_S,6,&tolua_err)
+ )
+ goto tolua_lerror;
+ else
+#endif
+ {
+ cBoundingBox* self = (cBoundingBox*) tolua_tousertype(tolua_S,1,0);
+ const Vector3d* a_Line1 = ((const Vector3d*) tolua_tousertype(tolua_S,2,0));
+ const Vector3d* a_Line2 = ((const Vector3d*) tolua_tousertype(tolua_S,3,0));
+ double a_LineCoeff = ((double) tolua_tonumber(tolua_S,4,0));
+ char a_Face = ((char) tolua_tonumber(tolua_S,5,0));
+#ifndef TOLUA_RELEASE
+ if (!self) tolua_error(tolua_S,"invalid 'self' in function 'CalcLineIntersection'", NULL);
+#endif
+ {
+ bool tolua_ret = (bool) self->CalcLineIntersection(*a_Line1,*a_Line2,a_LineCoeff,a_Face);
+ tolua_pushboolean(tolua_S,(bool)tolua_ret);
+ tolua_pushnumber(tolua_S,(lua_Number)a_LineCoeff);
+ tolua_pushnumber(tolua_S,(lua_Number)a_Face);
+ }
+ }
+ return 3;
+#ifndef TOLUA_RELEASE
+ tolua_lerror:
+ tolua_error(tolua_S,"#ferror in function 'CalcLineIntersection'.",&tolua_err);
+ return 0;
+#endif
+}
+#endif //#ifndef TOLUA_DISABLE
+
+/* method: CalcLineIntersection of class cBoundingBox */
+#ifndef TOLUA_DISABLE_tolua_AllToLua_cBoundingBox_CalcLineIntersection01
+static int tolua_AllToLua_cBoundingBox_CalcLineIntersection01(lua_State* tolua_S)
+{
+ tolua_Error tolua_err;
+ if (
+ !tolua_isusertable(tolua_S,1,"cBoundingBox",0,&tolua_err) ||
+ (tolua_isvaluenil(tolua_S,2,&tolua_err) || !tolua_isusertype(tolua_S,2,"const Vector3d",0,&tolua_err)) ||
+ (tolua_isvaluenil(tolua_S,3,&tolua_err) || !tolua_isusertype(tolua_S,3,"const Vector3d",0,&tolua_err)) ||
+ (tolua_isvaluenil(tolua_S,4,&tolua_err) || !tolua_isusertype(tolua_S,4,"const Vector3d",0,&tolua_err)) ||
+ (tolua_isvaluenil(tolua_S,5,&tolua_err) || !tolua_isusertype(tolua_S,5,"const Vector3d",0,&tolua_err)) ||
+ !tolua_isnumber(tolua_S,6,0,&tolua_err) ||
+ !tolua_isnumber(tolua_S,7,0,&tolua_err) ||
+ !tolua_isnoobj(tolua_S,8,&tolua_err)
+ )
+ goto tolua_lerror;
+ else
+ {
+ const Vector3d* a_Min = ((const Vector3d*) tolua_tousertype(tolua_S,2,0));
+ const Vector3d* a_Max = ((const Vector3d*) tolua_tousertype(tolua_S,3,0));
+ const Vector3d* a_Line1 = ((const Vector3d*) tolua_tousertype(tolua_S,4,0));
+ const Vector3d* a_Line2 = ((const Vector3d*) tolua_tousertype(tolua_S,5,0));
+ double a_LineCoeff = ((double) tolua_tonumber(tolua_S,6,0));
+ char a_Face = ((char) tolua_tonumber(tolua_S,7,0));
+ {
+ bool tolua_ret = (bool) cBoundingBox::CalcLineIntersection(*a_Min,*a_Max,*a_Line1,*a_Line2,a_LineCoeff,a_Face);
+ tolua_pushboolean(tolua_S,(bool)tolua_ret);
+ tolua_pushnumber(tolua_S,(lua_Number)a_LineCoeff);
+ tolua_pushnumber(tolua_S,(lua_Number)a_Face);
+ }
+ }
+ return 3;
+tolua_lerror:
+ return tolua_AllToLua_cBoundingBox_CalcLineIntersection00(tolua_S);
+}
+#endif //#ifndef TOLUA_DISABLE
+
/* method: new of class cTracer */
#ifndef TOLUA_DISABLE_tolua_AllToLua_cTracer_new00
static int tolua_AllToLua_cTracer_new00(lua_State* tolua_S)
@@ -28895,6 +29162,12 @@ TOLUA_API int tolua_AllToLua_open (lua_State* tolua_S)
tolua_array(tolua_S,"g_BlockRequiresSpecialTool",tolua_get_AllToLua_g_BlockRequiresSpecialTool,tolua_set_AllToLua_g_BlockRequiresSpecialTool);
tolua_array(tolua_S,"g_BlockIsSolid",tolua_get_AllToLua_g_BlockIsSolid,tolua_set_AllToLua_g_BlockIsSolid);
tolua_constant(tolua_S,"BLOCK_FACE_NONE",BLOCK_FACE_NONE);
+ tolua_constant(tolua_S,"BLOCK_FACE_XM",BLOCK_FACE_XM);
+ tolua_constant(tolua_S,"BLOCK_FACE_XP",BLOCK_FACE_XP);
+ tolua_constant(tolua_S,"BLOCK_FACE_YM",BLOCK_FACE_YM);
+ tolua_constant(tolua_S,"BLOCK_FACE_YP",BLOCK_FACE_YP);
+ tolua_constant(tolua_S,"BLOCK_FACE_ZM",BLOCK_FACE_ZM);
+ tolua_constant(tolua_S,"BLOCK_FACE_ZP",BLOCK_FACE_ZP);
tolua_constant(tolua_S,"BLOCK_FACE_BOTTOM",BLOCK_FACE_BOTTOM);
tolua_constant(tolua_S,"BLOCK_FACE_TOP",BLOCK_FACE_TOP);
tolua_constant(tolua_S,"BLOCK_FACE_NORTH",BLOCK_FACE_NORTH);
@@ -29799,6 +30072,8 @@ TOLUA_API int tolua_AllToLua_open (lua_State* tolua_S)
tolua_cclass(tolua_S,"Vector3d","Vector3d","",NULL);
#endif
tolua_beginmodule(tolua_S,"Vector3d");
+ tolua_variable(tolua_S,"EPS",tolua_get_Vector3d_EPS,NULL);
+ tolua_variable(tolua_S,"NO_INTERSECTION",tolua_get_Vector3d_NO_INTERSECTION,NULL);
tolua_function(tolua_S,"new",tolua_AllToLua_Vector3d_new00);
tolua_function(tolua_S,"new_local",tolua_AllToLua_Vector3d_new00_local);
tolua_function(tolua_S,".call",tolua_AllToLua_Vector3d_new00_local);
@@ -29819,6 +30094,9 @@ TOLUA_API int tolua_AllToLua_open (lua_State* tolua_S)
tolua_function(tolua_S,"SqrLength",tolua_AllToLua_Vector3d_SqrLength00);
tolua_function(tolua_S,"Dot",tolua_AllToLua_Vector3d_Dot00);
tolua_function(tolua_S,"Cross",tolua_AllToLua_Vector3d_Cross00);
+ tolua_function(tolua_S,"LineCoeffToXYPlane",tolua_AllToLua_Vector3d_LineCoeffToXYPlane00);
+ tolua_function(tolua_S,"LineCoeffToXZPlane",tolua_AllToLua_Vector3d_LineCoeffToXZPlane00);
+ tolua_function(tolua_S,"LineCoeffToYZPlane",tolua_AllToLua_Vector3d_LineCoeffToYZPlane00);
tolua_function(tolua_S,"Equals",tolua_AllToLua_Vector3d_Equals00);
tolua_function(tolua_S,".add",tolua_AllToLua_Vector3d__add00);
tolua_function(tolua_S,".add",tolua_AllToLua_Vector3d__add01);
@@ -29918,6 +30196,10 @@ TOLUA_API int tolua_AllToLua_open (lua_State* tolua_S)
tolua_function(tolua_S,"IsInside",tolua_AllToLua_cBoundingBox_IsInside01);
tolua_function(tolua_S,"IsInside",tolua_AllToLua_cBoundingBox_IsInside02);
tolua_function(tolua_S,"IsInside",tolua_AllToLua_cBoundingBox_IsInside03);
+ tolua_function(tolua_S,"IsInside",tolua_AllToLua_cBoundingBox_IsInside04);
+ tolua_function(tolua_S,"IsInside",tolua_AllToLua_cBoundingBox_IsInside05);
+ tolua_function(tolua_S,"CalcLineIntersection",tolua_AllToLua_cBoundingBox_CalcLineIntersection00);
+ tolua_function(tolua_S,"CalcLineIntersection",tolua_AllToLua_cBoundingBox_CalcLineIntersection01);
tolua_endmodule(tolua_S);
#ifdef __cplusplus
tolua_cclass(tolua_S,"cTracer","cTracer","",tolua_collect_cTracer);
diff --git a/source/Bindings.h b/source/Bindings.h
index 8ff6ee2c6..e667d24d0 100644
--- a/source/Bindings.h
+++ b/source/Bindings.h
@@ -1,6 +1,6 @@
/*
** Lua binding: AllToLua
-** Generated automatically by tolua++-1.0.92 on 09/01/13 12:24:42.
+** Generated automatically by tolua++-1.0.92 on 09/01/13 19:03:25.
*/
/* Exported function */
diff --git a/source/BoundingBox.cpp b/source/BoundingBox.cpp
index 9af726223..c845fe372 100644
--- a/source/BoundingBox.cpp
+++ b/source/BoundingBox.cpp
@@ -5,6 +5,7 @@
#include "Globals.h"
#include "BoundingBox.h"
+#include "Defines.h"
@@ -123,11 +124,7 @@ cBoundingBox cBoundingBox::Union(const cBoundingBox & a_Other)
bool cBoundingBox::IsInside(const Vector3d & a_Point)
{
- return (
- ((a_Point.x >= m_Min.x) && (a_Point.x < m_Max.x)) &&
- ((a_Point.y >= m_Min.y) && (a_Point.y < m_Max.y)) &&
- ((a_Point.z >= m_Min.z) && (a_Point.z < m_Max.z))
- );
+ return IsInside(m_Min, m_Max, a_Point);
}
@@ -136,11 +133,7 @@ bool cBoundingBox::IsInside(const Vector3d & a_Point)
bool cBoundingBox::IsInside(double a_X, double a_Y,double a_Z)
{
- return (
- ((a_X >= m_Min.x) && (a_X < m_Max.x)) &&
- ((a_Y >= m_Min.y) && (a_Y < m_Max.y)) &&
- ((a_Z >= m_Min.z) && (a_Z < m_Max.z))
- );
+ return IsInside(m_Min, m_Max, a_X, a_Y, a_Z);
}
@@ -167,6 +160,107 @@ bool cBoundingBox::IsInside(const Vector3d & a_Min, const Vector3d & a_Max)
+bool cBoundingBox::IsInside(const Vector3d & a_Min, const Vector3d & a_Max, const Vector3d & a_Point)
+{
+ return (
+ ((a_Point.x >= a_Min.x) && (a_Point.x < a_Max.x)) &&
+ ((a_Point.y >= a_Min.y) && (a_Point.y < a_Max.y)) &&
+ ((a_Point.z >= a_Min.z) && (a_Point.z < a_Max.z))
+ );
+}
+
+
+
+
+
+bool cBoundingBox::IsInside(const Vector3d & a_Min, const Vector3d & a_Max, double a_X, double a_Y, double a_Z)
+{
+ return (
+ ((a_X >= a_Min.x) && (a_X < a_Max.x)) &&
+ ((a_Y >= a_Min.y) && (a_Y < a_Max.y)) &&
+ ((a_Z >= a_Min.z) && (a_Z < a_Max.z))
+ );
+}
+
+
+
+
+
+bool cBoundingBox::CalcLineIntersection(const Vector3d & a_Line1, const Vector3d & a_Line2, double & a_LineCoeff, char & a_Face)
+{
+ return CalcLineIntersection(m_Min, m_Max, a_Line1, a_Line2, a_LineCoeff, a_Face);
+}
+
+
+
+
+
+bool cBoundingBox::CalcLineIntersection(const Vector3d & a_Min, const Vector3d & a_Max, const Vector3d & a_Line1, const Vector3d & a_Line2, double & a_LineCoeff, char & a_Face)
+{
+ char Face = 0;
+ double Coeff = Vector3d::NO_INTERSECTION;
+
+ // Check each individual bbox face for intersection with the line, remember the one with the lowest coeff
+ double c = a_Line1.LineCoeffToXYPlane(a_Line2, a_Min.z);
+ if (c < Coeff)
+ {
+ Face = (a_Line1.z > a_Line2.z) ? BLOCK_FACE_ZP : BLOCK_FACE_ZM;
+ Coeff = c;
+ }
+ c = a_Line1.LineCoeffToXYPlane(a_Line2, a_Max.z);
+ if (c < Coeff)
+ {
+ Face = (a_Line1.z > a_Line2.z) ? BLOCK_FACE_ZP : BLOCK_FACE_ZM;
+ Coeff = c;
+ }
+ c = a_Line1.LineCoeffToXZPlane(a_Line2, a_Min.y);
+ if (c < Coeff)
+ {
+ Face = (a_Line1.y > a_Line2.y) ? BLOCK_FACE_YP : BLOCK_FACE_YM;
+ Coeff = c;
+ }
+ c = a_Line1.LineCoeffToXZPlane(a_Line2, a_Max.y);
+ if (c < Coeff)
+ {
+ Face = (a_Line1.y > a_Line2.y) ? BLOCK_FACE_YP : BLOCK_FACE_YM;
+ Coeff = c;
+ }
+ c = a_Line1.LineCoeffToYZPlane(a_Line2, a_Min.x);
+ if (c < Coeff)
+ {
+ Face = (a_Line1.x > a_Line2.x) ? BLOCK_FACE_XP : BLOCK_FACE_XM;
+ Coeff = c;
+ }
+ c = a_Line1.LineCoeffToYZPlane(a_Line2, a_Max.x);
+ if (c < Coeff)
+ {
+ Face = (a_Line1.x > a_Line2.x) ? BLOCK_FACE_XP : BLOCK_FACE_XM;
+ Coeff = c;
+ }
+
+ if (Coeff >= Vector3d::NO_INTERSECTION)
+ {
+ // There has been no intersection
+ return false;
+ }
+
+ Vector3d Intersection = a_Line1 + (a_Line2 - a_Line1) * Coeff;
+ if (!IsInside(a_Min, a_Max, Intersection))
+ {
+ // The line intersects with the individual wall planes, but not within this bounding box
+ return false;
+ }
+
+ // True intersection, return all the values:
+ a_LineCoeff = Coeff;
+ a_Face = Face;
+ return true;
+}
+
+
+
+
+
bool cBoundingBox::Intersect(const cBoundingBox & a_Other, cBoundingBox & a_Intersection)
{
a_Intersection.m_Min.x = std::max(m_Min.x, a_Other.m_Min.x);
diff --git a/source/BoundingBox.h b/source/BoundingBox.h
index 5a07df20e..7b6391942 100644
--- a/source/BoundingBox.h
+++ b/source/BoundingBox.h
@@ -51,6 +51,22 @@ public:
/// Returns true if a boundingbox specified by a_Min and a_Max is inside this bounding box
bool IsInside(const Vector3d & a_Min, const Vector3d & a_Max);
+ /// 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, const Vector3d & a_Point);
+
+ /// 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);
+
+ /** 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)
+ */
+ bool CalcLineIntersection(const Vector3d & a_Line1, const Vector3d & a_Line2, double & a_LineCoeff, char & a_Face);
+
+ /** 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)
+ */
+ static bool CalcLineIntersection(const Vector3d & a_Min, const Vector3d & a_Max, const Vector3d & a_Line1, const Vector3d & a_Line2, double & a_LineCoeff, char & a_Face);
+
// tolua_end
/// Calculates the intersection of the two bounding boxes; returns true if nonempty
diff --git a/source/Vector3d.cpp b/source/Vector3d.cpp
index 987c380dc..96ebebab5 100644
--- a/source/Vector3d.cpp
+++ b/source/Vector3d.cpp
@@ -8,16 +8,70 @@
-Vector3d::Vector3d(const Vector3f & v )
- : x( v.x )
- , y( v.y )
- , z( v.z )
+const double Vector3d::EPS = 0.000001; ///< The max difference between two coords for which the coords are assumed equal
+const double Vector3d::NO_INTERSECTION = 1e70; ///< Return value of LineCoeffToPlane() if the line is parallel to the plane
+
+
+
+
+
+Vector3d::Vector3d(const Vector3f & v) :
+ x(v.x),
+ y(v.y),
+ z(v.z)
+{
+}
+
+
+
+
+
+Vector3d::Vector3d(const Vector3f * v) :
+ x(v->x),
+ y(v->y),
+ z(v->z)
{
}
-Vector3d::Vector3d(const Vector3f * v )
- : x( v->x )
- , y( v->y )
- , z( v->z )
+
+
+
+
+double Vector3d::LineCoeffToXYPlane(const Vector3d & a_OtherEnd, double a_Z) const
{
-} \ No newline at end of file
+ if (abs(z - a_OtherEnd.z) < EPS)
+ {
+ return NO_INTERSECTION;
+ }
+ return (a_Z - z) / (a_OtherEnd.z - z);
+}
+
+
+
+
+
+double Vector3d::LineCoeffToXZPlane(const Vector3d & a_OtherEnd, double a_Y) const
+{
+ if (abs(y - a_OtherEnd.y) < EPS)
+ {
+ return NO_INTERSECTION;
+ }
+ return (a_Y - y) / (a_OtherEnd.y - y);
+}
+
+
+
+
+
+double Vector3d::LineCoeffToYZPlane(const Vector3d & a_OtherEnd, double a_X) const
+{
+ if (abs(x - a_OtherEnd.x) < EPS)
+ {
+ return NO_INTERSECTION;
+ }
+ return (a_X - x) / (a_OtherEnd.x - x);
+}
+
+
+
+
diff --git a/source/Vector3d.h b/source/Vector3d.h
index ecc72e421..081ce353f 100644
--- a/source/Vector3d.h
+++ b/source/Vector3d.h
@@ -3,26 +3,54 @@
#include <math.h>
class Vector3f;
-class Vector3d // tolua_export
-{ // tolua_export
-public: // tolua_export
+
+
+
+// tolua_begin
+
+class Vector3d
+{
+public:
+ static const double EPS; ///< The max difference between two coords for which the coords are assumed equal
+ static const double NO_INTERSECTION; ///< Return value of LineCoeffToPlane() if the line is parallel to the plane
+
// convert from float
- Vector3d(const Vector3f & v ); // tolua_export
- Vector3d(const Vector3f * v ); // tolua_export
+ Vector3d(const Vector3f & v);
+ Vector3d(const Vector3f * v);
+
+ Vector3d() : x(0), y(0), z(0) {}
+ Vector3d(double a_x, double a_y, double a_z) : x(a_x), y(a_y), z(a_z) {}
- Vector3d() : x(0), y(0), z(0) {} // tolua_export
- Vector3d(double a_x, double a_y, double a_z) : x(a_x), y(a_y), z(a_z) {} // tolua_export
+ inline void Set(double a_x, double a_y, double a_z) { x = a_x, y = a_y, z = a_z; }
+ inline void Normalize() { double l = 1.0f / Length(); x *= l; y *= l; z *= l; }
+ inline Vector3d NormalizeCopy() { double l = 1.0f / Length(); return Vector3d( x * l, y * l, z * l ); }
+ inline void NormalizeCopy(Vector3d & a_V) { double l = 1.0f / Length(); a_V.Set(x*l, y*l, z*l ); }
+ inline double Length() const { return (double)sqrt( x * x + y * y + z * z ); }
+ inline double SqrLength() const { return x * x + y * y + z * z; }
+ inline double Dot( const Vector3d & a_V ) const { return x * a_V.x + y * a_V.y + z * a_V.z; }
+ inline Vector3d Cross( const Vector3d & v ) const { return Vector3d( y * v.z - z * v.y, z * v.x - x * v.z, x * v.y - y * v.x ); }
+
+ /** Returns the coefficient for the (a_OtherEnd - this) line to reach the specified Z coord
+ The result satisfies the following equation:
+ (*this + Result * (a_OtherEnd - *this)).z = a_Z
+ */
+ double LineCoeffToXYPlane(const Vector3d & a_OtherEnd, double a_Z) const;
- inline void Set(double a_x, double a_y, double a_z) { x = a_x, y = a_y, z = a_z; } // tolua_export
- inline void Normalize() { double l = 1.0f / Length(); x *= l; y *= l; z *= l; } // tolua_export
- inline Vector3d NormalizeCopy() { double l = 1.0f / Length(); return Vector3d( x * l, y * l, z * l ); } // tolua_export
- inline void NormalizeCopy(Vector3d & a_V) { double l = 1.0f / Length(); a_V.Set(x*l, y*l, z*l ); } // tolua_export
- inline double Length() const { return (double)sqrt( x * x + y * y + z * z ); } // tolua_export
- inline double SqrLength() const { return x * x + y * y + z * z; } // tolua_export
- inline double Dot( const Vector3d & a_V ) const { return x * a_V.x + y * a_V.y + z * a_V.z; } // tolua_export
- inline Vector3d Cross( const Vector3d & v ) const { return Vector3d( y * v.z - z * v.y, z * v.x - x * v.z, x * v.y - y * v.x ); } // tolua_export
+ /** Returns the coefficient for the (a_OtherEnd - this) line to reach the specified Y coord
+ The result satisfies the following equation:
+ (*this + Result * (a_OtherEnd - *this)).y = a_Y
+ */
+ double LineCoeffToXZPlane(const Vector3d & a_OtherEnd, double a_Y) const;
- inline bool Equals( const Vector3d & v ) const { return (x == v.x && y == v.y && z == v.z ); } // tolua_export
+ /** Returns the coefficient for the (a_OtherEnd - this) line to reach the specified X coord
+ The result satisfies the following equation:
+ (*this + Result * (a_OtherEnd - *this)).x = a_X
+ */
+ double LineCoeffToYZPlane(const Vector3d & a_OtherEnd, double a_X) const;
+
+ inline bool Equals(const Vector3d & v) const { return ((x == v.x) && (y == v.y) && (z == v.z)); }
+
+ // tolua_end
void operator += ( const Vector3d& a_V ) { x += a_V.x; y += a_V.y; z += a_V.z; }
void operator += ( Vector3d* a_V ) { x += a_V->x; y += a_V->y; z += a_V->z; }
@@ -30,14 +58,21 @@ public: // tolua_export
void operator -= ( Vector3d* a_V ) { x -= a_V->x; y -= a_V->y; z -= a_V->z; }
void operator *= ( double a_f ) { x *= a_f; y *= a_f; z *= a_f; }
- Vector3d operator + (const Vector3d & v2) const { return Vector3d(x + v2.x, y + v2.y, z + v2.z ); } // tolua_export
- Vector3d operator + (const Vector3d * v2) const { return Vector3d(x + v2->x, y + v2->y, z + v2->z ); } // tolua_export
- Vector3d operator - (const Vector3d & v2) const { return Vector3d(x - v2.x, y - v2.y, z - v2.z ); } // tolua_export
- Vector3d operator - (const Vector3d * v2) const { return Vector3d(x - v2->x, y - v2->y, z - v2->z ); } // tolua_export
- Vector3d operator * (const double f) const { return Vector3d(x * f, y * f, z * f ); } // tolua_export
- Vector3d operator * (const Vector3d & v2) const { return Vector3d(x * v2.x, y * v2.y, z * v2.z ); } // tolua_export
- Vector3d operator / (const double f) const { return Vector3d(x / f, y / f, z / f ); } // tolua_export
+ // tolua_begin
+
+ Vector3d operator + (const Vector3d & v2) const { return Vector3d(x + v2.x, y + v2.y, z + v2.z ); }
+ Vector3d operator + (const Vector3d * v2) const { return Vector3d(x + v2->x, y + v2->y, z + v2->z ); }
+ Vector3d operator - (const Vector3d & v2) const { return Vector3d(x - v2.x, y - v2.y, z - v2.z ); }
+ Vector3d operator - (const Vector3d * v2) const { return Vector3d(x - v2->x, y - v2->y, z - v2->z ); }
+ Vector3d operator * (const double f) const { return Vector3d(x * f, y * f, z * f ); }
+ Vector3d operator * (const Vector3d & v2) const { return Vector3d(x * v2.x, y * v2.y, z * v2.z ); }
+ Vector3d operator / (const double f) const { return Vector3d(x / f, y / f, z / f ); }
+
+ double x, y, z;
+} ;
+
+// tolua_end
+
+
- double x, y, z; // tolua_export
-};// tolua_export