Browse Source

Added shape TestSegment() methods. Fixed b2Segment usage.

Brucey 4 years ago
parent
commit
1571e56e6a
3 changed files with 62 additions and 19 deletions
  1. 24 4
      box2d.mod/box2d.bmx
  2. 0 8
      box2d.mod/common.bmx
  3. 38 7
      box2d.mod/glue.cpp

+ 24 - 4
box2d.mod/box2d.bmx

@@ -1535,8 +1535,8 @@ Type b2Shape
 	Rem
 	bbdoc: 
 	End Rem
-'	Method TestSegment:Int(xf:b2XForm, lambda:Float Var, normal:b2Vec2 Var, segment:b2Segment, maxLambda:Float)''
-'	End Method
+	Method TestSegment:Int(xf:b2XForm, lambda:Float Var, normal:b2Vec2 Var, segment:b2Segment, maxLambda:Float)
+	End Method
 	
 	Rem
 	bbdoc: Get the maximum radius about the parent body's center of mass. 
@@ -2360,6 +2360,13 @@ Type b2PolygonShape Extends b2Shape
 		Return bmx_b2polygonshape_support(b2ObjectPtr, xf, d)
 	End Method
 
+	Rem
+	bbdoc: 
+	End Rem
+	Method TestSegment:Int(xf:b2XForm, lambda:Float Var, normal:b2Vec2 Var, segment:b2Segment, maxLambda:Float)
+		Return bmx_b2shape_testsegment(b2ObjectPtr, xf, lambda, normal, segment, maxLambda)
+	End Method
+
 End Type
 
 Extern
@@ -2370,6 +2377,7 @@ Extern
 	Function bmx_b2polygonshape_getcorevertices:b2Vec2[](handle:Byte Ptr)
 	Function bmx_b2polygonshape_getnormals:b2Vec2[](handle:Byte Ptr)
 	Function bmx_b2edgechaindef_setvertices(handle:Byte Ptr, vertices:b2Vec2[])
+	Function bmx_b2shape_testsegment:Int(handle:Byte Ptr, xf:b2XForm Var, lambda:Float Var, normal:b2Vec2 Var, segment:b2Segment Var, maxLambda:Float)
 End Extern
 
 Rem
@@ -2437,6 +2445,13 @@ Type b2CircleShape Extends b2Shape
 		Return bmx_b2circleshape_getradius(b2ObjectPtr)
 	End Method
 
+	Rem
+	bbdoc: 
+	End Rem
+	Method TestSegment:Int(xf:b2XForm, lambda:Float Var, normal:b2Vec2 Var, segment:b2Segment, maxLambda:Float)
+		Return bmx_b2shape_testsegment(b2ObjectPtr, xf, lambda, normal, segment, maxLambda)
+	End Method
+
 End Type
 
 Rem
@@ -2586,7 +2601,13 @@ Type b2EdgeShape Extends b2Shape
 		Return b2EdgeShape._create(bmx_b2edgeshape_getprevedge(b2ObjectPtr))
 	End Method
 
-	
+	Rem
+	bbdoc: 
+	End Rem
+	Method TestSegment:Int(xf:b2XForm, lambda:Float Var, normal:b2Vec2 Var, segment:b2Segment, maxLambda:Float)
+		Return bmx_b2shape_testsegment(b2ObjectPtr, xf, lambda, normal, segment, maxLambda)
+	End Method
+
 End Type
 
 Rem
@@ -4209,7 +4230,6 @@ Struct b2Segment
 	bbdoc: Creates a new b2Segment object.
 	End Rem
 	Method CreateXY:b2Segment(x1:Float, y1:Float, x2:Float, y2:Float)
-		'b2ObjectPtr = bmx_b2segment_createxy(x1, y1, x2, y2)
 		p1.x = x1
 		p1.y = y1
 		p2.x = x2

+ 0 - 8
box2d.mod/common.bmx

@@ -309,14 +309,6 @@ Extern
 
 	Function bmx_b2circleshape_getradius:Float(handle:Byte Ptr)
 
-	Function bmx_b2segment_createxy:Byte Ptr(x1:Float, y1:Float, x2:Float, y2:Float)
-	Function bmx_b2segment_create:Byte Ptr(p1:Byte Ptr, p2:Byte Ptr)
-	Function bmx_b2segment_getstartpoint:Byte Ptr(handle:Byte Ptr)
-	Function bmx_b2segment_getendpoint:Byte Ptr(handle:Byte Ptr)
-	Function bmx_b2segment_setstartpoint(handle:Byte Ptr, point:Byte Ptr)
-	Function bmx_b2segment_setendpoint(handle:Byte Ptr, point:Byte Ptr)
-	Function bmx_b2segment_delete(handle:Byte Ptr)
-
 	Function bmx_b2linejointdef_create:Byte Ptr()
 	Function bmx_b2linejointdef_enablelimit(handle:Byte Ptr, limit:Int)
 	Function bmx_b2linejointdef_getlimit:Int(handle:Byte Ptr)

+ 38 - 7
box2d.mod/glue.cpp

@@ -89,6 +89,11 @@ extern "C" {
 		unsigned int id;
 	} Maxb2ContactResult;
 
+	typedef struct Maxb2Segment {
+		Maxb2Vec2 p1;
+		Maxb2Vec2 p2;
+	} Maxb2Segment;
+
 	void bmx_Maxb2AABBtob2AABB(Maxb2AABB * m, b2AABB * b) {
 		b->lowerBound = b2Vec2(m->lowerBound.x, m->lowerBound.y);
 		b->upperBound = b2Vec2(m->upperBound.x, m->upperBound.y);
@@ -164,8 +169,8 @@ extern "C" {
 	void bmx_b2world_free(b2World * world);
 	void bmx_b2world_setdestructionlistener(b2World * world, b2DestructionListener * listener);
 	void bmx_b2world_refilter(b2World * world, b2Shape * shape);
-	int32 bmx_b2world_raycast(b2World * world, b2Segment * segment, BBArray * shapes, int solidShapes);
-	b2Shape * bmx_b2world_raycastone(b2World * world, b2Segment * segment, float32 * lambda, Maxb2Vec2 * normal, int solidShapes);
+	int32 bmx_b2world_raycast(b2World * world, Maxb2Segment * segment, BBArray * shapes, int solidShapes);
+	b2Shape * bmx_b2world_raycastone(b2World * world, Maxb2Segment * segment, float32 * lambda, Maxb2Vec2 * normal, int solidShapes);
 	int bmx_b2world_inrange(b2World * world, Maxb2AABB * aabb);
 	b2Controller * bmx_b2world_createcontroller(b2World * world, b2ControllerDef * def, b2ControllerType type);
 	void bmx_b2world_destroycontroller(b2World * world, b2Controller * controller);
@@ -523,7 +528,8 @@ extern "C" {
 	Maxb2Vec2 bmx_b2polygonshape_getfirstvertex(b2PolygonShape * shape, Maxb2XForm * xf);
 	Maxb2Vec2 bmx_b2polygonshape_centroid(b2PolygonShape * shape, Maxb2XForm * xf);
 	Maxb2Vec2 bmx_b2polygonshape_support(b2PolygonShape * shape, Maxb2XForm * xf, Maxb2Vec2 * d);
-
+	int bmx_b2shape_testsegment(b2Shape * shape, Maxb2XForm * xf, float * lambda, Maxb2Vec2 * normal, Maxb2Segment * segment, float maxLambda);
+	
 	Maxb2Vec2 bmx_b2circleshape_getlocalposition(b2CircleShape * shape);
 	float32 bmx_b2circleshape_getradius(b2CircleShape * shape);
 
@@ -938,11 +944,15 @@ void bmx_b2world_refilter(b2World * world, b2Shape * shape) {
 	world->Refilter(shape);
 }
 
-int32 bmx_b2world_raycast(b2World * world, b2Segment * segment, BBArray * shapes, int solidShapes) {
+int32 bmx_b2world_raycast(b2World * world, Maxb2Segment * segment, BBArray * shapes, int solidShapes) {
 	int32 n = shapes->scales[0];
 	b2Shape* _shapes[n];
 	
-	int32 ret = world->Raycast(*segment, _shapes, n, solidShapes, NULL);
+	b2Segment s;
+	s.p1 = b2Vec2(segment->p1.x, segment->p1.y);
+	s.p2 = b2Vec2(segment->p2.x, segment->p2.y);
+	
+	int32 ret = world->Raycast(s, _shapes, n, solidShapes, NULL);
 
 	int32 count = (ret < n) ? ret : n;
 
@@ -953,9 +963,13 @@ int32 bmx_b2world_raycast(b2World * world, b2Segment * segment, BBArray * shapes
 	return ret;
 }
 
-b2Shape * bmx_b2world_raycastone(b2World * world, b2Segment * segment, float32 * lambda, Maxb2Vec2 * normal, int solidShapes) {
+b2Shape * bmx_b2world_raycastone(b2World * world, Maxb2Segment * segment, float32 * lambda, Maxb2Vec2 * normal, int solidShapes) {
 	b2Vec2 norm;
-	b2Shape * shape = world->RaycastOne(*segment, lambda, &norm, solidShapes, NULL);
+	b2Segment s;
+	s.p1 = b2Vec2(segment->p1.x, segment->p1.y);
+	s.p2 = b2Vec2(segment->p2.x, segment->p2.y);
+
+	b2Shape * shape = world->RaycastOne(s, lambda, &norm, solidShapes, NULL);
 	normal->x = norm.x;
 	normal->y = norm.y;
 	return shape;
@@ -1564,6 +1578,22 @@ void bmx_b2shape_setdensity(b2Shape * shape, float32 density) {
 	shape->SetDensity(density);
 }
 
+int bmx_b2shape_testsegment(b2Shape * shape, Maxb2XForm * xf, float * lambda, Maxb2Vec2 * normal, Maxb2Segment * segment, float maxLambda) {
+	b2XForm f;
+	bmx_Maxb2XFormtob2XForm(xf, &f);
+	
+	b2Vec2 n(normal->x, normal->y);
+	b2Segment s;
+	s.p1 = b2Vec2(segment->p1.x, segment->p1.y);
+	s.p2 = b2Vec2(segment->p2.x, segment->p2.y);
+	
+	int result = shape->TestSegment(f, lambda, &n, s, maxLambda);
+	
+	normal->x = n.x;
+	normal->y = n.y;
+	
+	return result;
+}
 
 // *****************************************************
 
@@ -2693,6 +2723,7 @@ Maxb2Vec2 bmx_b2polygonshape_support(b2PolygonShape * shape, Maxb2XForm * xf, Ma
 	return {s.x, s.y};
 }
 
+
 // *****************************************************
 
 Maxb2Vec2 bmx_b2circleshape_getlocalposition(b2CircleShape * shape) {