Prechádzať zdrojové kódy

Converted b2ContactPoint and b2ContactResult to Structs.

Brucey 4 rokov pred
rodič
commit
ec2d60338d
3 zmenil súbory, kde vykonal 115 pridanie a 175 odobranie
  1. 42 51
      box2d.mod/box2d.bmx
  2. 0 11
      box2d.mod/common.bmx
  3. 73 113
      box2d.mod/glue.cpp

+ 42 - 51
box2d.mod/box2d.bmx

@@ -741,8 +741,8 @@ Type b2ContactListener
 	Method Add(point:b2ContactPoint)
 	End Method
 	
-	Function _Add(listener:b2ContactListener, point:Byte Ptr) { nomangle }
-		listener.Add(b2ContactPoint._create(point))
+	Function _Add(listener:b2ContactListener, point:b2ContactPoint) { nomangle }
+		listener.Add(point)
 	End Function
 
 	Rem
@@ -752,8 +752,8 @@ Type b2ContactListener
 	Method Persist(point:b2ContactPoint)
 	End Method
 	
-	Function _Persist(listener:b2ContactListener, point:Byte Ptr) { nomangle }
-		listener.Persist(b2ContactPoint._create(point))
+	Function _Persist(listener:b2ContactListener, point:b2ContactPoint) { nomangle }
+		listener.Persist(point)
 	End Function
 
 	Rem
@@ -763,8 +763,8 @@ Type b2ContactListener
 	Method Remove(point:b2ContactPoint)
 	End Method
 
-	Function _Remove(listener:b2ContactListener, point:Byte Ptr) { nomangle }
-		listener.Remove(b2ContactPoint._create(point))
+	Function _Remove(listener:b2ContactListener, point:b2ContactPoint) { nomangle }
+		listener.Remove(point)
 	End Function
 
 	Rem
@@ -773,8 +773,8 @@ Type b2ContactListener
 	Method Result(result:b2ContactResult)
 	End Method
 	
-	Function _Result(listener:b2ContactListener, result:Byte Ptr) { nomangle }
-		listener.Result(b2ContactResult._create(result))
+	Function _Result(listener:b2ContactListener, result:b2ContactResult) { nomangle }
+		listener.Result(result)
 	End Function
 
 	Method Delete()
@@ -880,134 +880,132 @@ End Type
 Rem
 bbdoc: This type is used to report contact points. 
 End Rem
-Type b2ContactPoint
+Struct b2ContactPoint
 
-	Field b2ObjectPtr:Byte Ptr
-
-	Function _create:b2ContactPoint(b2ObjectPtr:Byte Ptr)
-		If b2ObjectPtr Then
-			Local contactPoint:b2ContactPoint = New b2ContactPoint
-			contactPoint.b2ObjectPtr = b2ObjectPtr
-			Return contactPoint
-		End If
-	End Function
+	Field shape1:Byte Ptr
+	Field shape2:Byte Ptr
+	Field position:b2Vec2
+	Field velocity:b2Vec2
+	Field normal:b2Vec2
+	Field separation:Float
+	Field friction:Float
+	Field restitution:Float
+	Field id:UInt
 
 	Rem
 	bbdoc: Returns the first shape.
 	End Rem
 	Method GetShape1:b2Shape()
-		Return b2Shape._create(bmx_b2contactpoint_getshape1(b2ObjectPtr))
+		Return b2Shape._create(shape1)
 	End Method
 	
 	Rem
 	bbdoc: Returns the second shape.
 	End Rem
 	Method GetShape2:b2Shape()
-		Return b2Shape._create(bmx_b2contactpoint_getshape2(b2ObjectPtr))
+		Return b2Shape._create(shape2)
 	End Method
 	
 	Rem
 	bbdoc: Returns position in world coordinates.
 	End Rem
 	Method GetPosition:b2Vec2()
-		Return bmx_b2contactpoint_getposition(b2ObjectPtr)
+		Return position
 	End Method
 
 	Rem
 	bbdoc: Returns the velocity of point on body2 relative to point on body1 (pre-solver).
 	End Rem
 	Method GetVelocity:b2Vec2()
-		Return bmx_b2contactpoint_getvelocity(b2ObjectPtr)
+		Return velocity
 	End Method
 	
 	Rem
 	bbdoc: Points from shape1 to shape2.
 	End Rem
 	Method GetNormal:b2Vec2()
-		Return bmx_b2contactpoint_getnormal(b2ObjectPtr)
+		Return normal
 	End Method
 
 	Rem
 	bbdoc: The separation is negative when shapes are touching 
 	End Rem
 	Method GetSeparation:Float()
-		Return bmx_b2contactpoint_getseparation(b2ObjectPtr)
+		Return separation
 	End Method
 
 	Rem
 	bbdoc: Returns the combined friction coefficient.
 	End Rem
 	Method GetFriction:Float()
-		Return bmx_b2contactpoint_getfriction(b2ObjectPtr)
+		Return friction
 	End Method
 
 	Rem
 	bbdoc: Returns the combined restitution coefficient.
 	End Rem
 	Method GetRestitution:Float()
-		Return bmx_b2contactpoint_getrestitution(b2ObjectPtr)
+		Return restitution
 	End Method
 
-End Type
+End Struct
 
 Rem
 bbdoc: This type is used to report contact point results.
 End Rem
-Type b2ContactResult
-
-	Field b2ObjectPtr:Byte Ptr
+Struct b2ContactResult
 
-	Function _create:b2ContactResult(b2ObjectPtr:Byte Ptr)
-		If b2ObjectPtr Then
-			Local result:b2ContactResult = New b2ContactResult
-			result.b2ObjectPtr = b2ObjectPtr
-			Return result
-		End If
-	End Function
+	Field shape1:Byte Ptr
+	Field shape2:Byte Ptr
+	Field position:b2Vec2
+	Field normal:b2Vec2
+	Field normalImpulse:Float
+	Field tangentImpulse:Float
+	Field id:UInt
 
 	Rem
 	bbdoc: Returns the first shape.
 	End Rem
 	Method GetShape1:b2Shape()
-		Return b2Shape._create(bmx_b2contactresult_getshape1(b2ObjectPtr))
+		Return b2Shape._create(shape1)
 	End Method
 	
 	Rem
 	bbdoc: Returns the second shape.
 	End Rem
 	Method GetShape2:b2Shape()
-		Return b2Shape._create(bmx_b2contactresult_getshape2(b2ObjectPtr))
+		Return b2Shape._create(shape2)
 	End Method
 	
 	Rem
 	bbdoc: Returns position in world coordinates.
 	End Rem
 	Method GetPosition:b2Vec2()
-		Return bmx_b2contactresult_getposition(b2ObjectPtr)
+		Return position
 	End Method
 	
 	Rem
 	bbdoc: Points from shape1 to shape2.
 	End Rem
 	Method GetNormal:b2Vec2()
-		Return bmx_b2contactresult_getnormal(b2ObjectPtr)
+		Return normal
 	End Method
 	
 	Rem
 	bbdoc: Returns the normal impulse applied to body2.
 	End Rem
 	Method GetNormalImpulse:Float()
-		Return bmx_b2contactresult_getnormalimpulse(b2ObjectPtr)
+		Return normalImpulse
 	End Method
 	
 	Rem
 	bbdoc: Returns the tangent impulse applied to body2.
 	End Rem
 	Method GetTangentImpulse:Float()
-		Return bmx_b2contactresult_gettangentimpulse(b2ObjectPtr)
+		Return tangentImpulse
 	End Method
 	
-End Type
+End Struct
 
 Rem
 bbdoc: The base joint type.
@@ -5228,11 +5226,4 @@ Extern
 	Function bmx_b2tensordampingcontroller_gettensor:b2Mat22(handle:Byte Ptr)
 	Function bmx_b2tensordampingcontroller_settensor(handle:Byte Ptr, tensor:b2Mat22 Var)
 
-	Function bmx_b2contactpoint_getposition:b2Vec2(handle:Byte Ptr)
-	Function bmx_b2contactpoint_getvelocity:b2Vec2(handle:Byte Ptr)
-	Function bmx_b2contactpoint_getnormal:b2Vec2(handle:Byte Ptr)
-
-	Function bmx_b2contactresult_getposition:b2Vec2(handle:Byte Ptr)
-	Function bmx_b2contactresult_getnormal:b2Vec2(handle:Byte Ptr)
-
 End Extern

+ 0 - 11
box2d.mod/common.bmx

@@ -252,17 +252,6 @@ Extern
 	Function bmx_b2contact_issolid:Int(handle:Byte Ptr)
 	Function bmx_b2contact_getmanifoldcount:Int(handle:Byte Ptr)
 
-	Function bmx_b2contactresult_getshape1:Byte Ptr(handle:Byte Ptr)
-	Function bmx_b2contactresult_getshape2:Byte Ptr(handle:Byte Ptr)
-	Function bmx_b2contactresult_getnormalimpulse:Float(handle:Byte Ptr)
-	Function bmx_b2contactresult_gettangentimpulse:Float(handle:Byte Ptr)
-
-	Function bmx_b2contactpoint_getshape1:Byte Ptr(handle:Byte Ptr)
-	Function bmx_b2contactpoint_getshape2:Byte Ptr(handle:Byte Ptr)
-	Function bmx_b2contactpoint_getseparation:Float(handle:Byte Ptr)
-	Function bmx_b2contactpoint_getfriction:Float(handle:Byte Ptr)
-	Function bmx_b2contactpoint_getrestitution:Float(handle:Byte Ptr)
-
 	Function bmx_b2filterdata_create:Byte Ptr()
 	Function bmx_b2filterdata_getcategorybits:Short(handle:Byte Ptr)
 	Function bmx_b2filterdata_setcategorybits(handle:Byte Ptr, categoryBits:Short)

+ 73 - 113
box2d.mod/glue.cpp

@@ -67,6 +67,28 @@ extern "C" {
 		Maxb2Mat22 R;
 	} Maxb2XForm;
 
+	typedef struct Maxb2ContactPoint {
+		b2Shape* shape1;
+		b2Shape* shape2;
+		Maxb2Vec2 position;
+		Maxb2Vec2 velocity;
+		Maxb2Vec2 normal;
+		float32 separation;
+		float32 friction;
+		float32 restitution;
+		unsigned int id;
+	} Maxb2ContactPoint;
+
+	typedef struct Maxb2ContactResult {
+		b2Shape* shape1;
+		b2Shape* shape2;
+		Maxb2Vec2 position;
+		Maxb2Vec2 normal;
+		float32 normalImpulse;
+		float32 tangentImpulse;
+		unsigned int id;
+	} Maxb2ContactResult;
+
 	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);
@@ -88,10 +110,10 @@ extern "C" {
 	void CB_PREF(physics_box2d_b2DebugDraw__DrawSolidCircle)(BBObject * maxHandle, Maxb2Vec2 center, float32 radius, Maxb2Vec2 axis, int r, int g, int b);
 	BBObject * CB_PREF(physics_box2d_b2World__createJoint)(b2JointType type);
 	int CB_PREF(physics_box2d_b2ContactFilter__ShouldCollide)(BBObject * maxHandle, b2Shape * shape1, b2Shape * shape2);
-	void CB_PREF(physics_box2d_b2ContactListener__Add)(BBObject * maxHandle, const b2ContactPoint* point);
-	void CB_PREF(physics_box2d_b2ContactListener__Persist)(BBObject * maxHandle, const b2ContactPoint* point);
-	void CB_PREF(physics_box2d_b2ContactListener__Remove)(BBObject * maxHandle, const b2ContactPoint* point);
-	void CB_PREF(physics_box2d_b2ContactListener__Result)(BBObject * maxHandle, const b2ContactResult* result);
+	void CB_PREF(physics_box2d_b2ContactListener__Add)(BBObject * maxHandle, Maxb2ContactPoint point);
+	void CB_PREF(physics_box2d_b2ContactListener__Persist)(BBObject * maxHandle, Maxb2ContactPoint point);
+	void CB_PREF(physics_box2d_b2ContactListener__Remove)(BBObject * maxHandle, Maxb2ContactPoint point);
+	void CB_PREF(physics_box2d_b2ContactListener__Result)(BBObject * maxHandle, Maxb2ContactResult result);
 	void CB_PREF(physics_box2d_b2BoundaryListener__Violation)(BBObject * maxHandle, b2Body * body);
 
 	BBObject * CB_PREF(physics_box2d_b2World___createController)(b2ControllerType type);
@@ -406,22 +428,6 @@ extern "C" {
 	int bmx_b2contact_issolid(b2Contact * contact);
 	int32 bmx_b2contact_getmanifoldcount(b2Contact * contact);
 
-	b2Shape * bmx_b2contactresult_getshape1(b2ContactResult * contactResult);
-	b2Shape * bmx_b2contactresult_getshape2(b2ContactResult * contactResult);
-	Maxb2Vec2 bmx_b2contactresult_getposition(b2ContactResult * contactResult);
-	Maxb2Vec2 bmx_b2contactresult_getnormal(b2ContactResult * contactResult);
-	float32 bmx_b2contactresult_getnormalimpulse(b2ContactResult * contactResult);
-	float32 bmx_b2contactresult_gettangentimpulse(b2ContactResult * contactResult);
-
-	b2Shape * bmx_b2contactpoint_getshape1(b2ContactPoint * contactPoint);
-	b2Shape * bmx_b2contactpoint_getshape2(b2ContactPoint * contactPoint);
-	Maxb2Vec2  bmx_b2contactpoint_getposition(b2ContactPoint * contactPoint);
-	Maxb2Vec2 bmx_b2contactpoint_getvelocity(b2ContactPoint * contactPoint);
-	Maxb2Vec2 bmx_b2contactpoint_getnormal(b2ContactPoint * contactPoint);
-	float32 bmx_b2contactpoint_getseparation(b2ContactPoint * contactPoint);
-	float32 bmx_b2contactpoint_getfriction(b2ContactPoint * contactPoint);
-	float32 bmx_b2contactpoint_getrestitution(b2ContactPoint * contactPoint);
-
 	MaxFilterData* bmx_b2filterdata_create();
 	uint16  bmx_b2filterdata_getcategorybits(MaxFilterData * filterData);
 	void bmx_b2filterdata_setcategorybits(MaxFilterData * filterData, uint16 categoryBits);
@@ -1748,21 +1754,63 @@ public:
 		: maxHandle(handle)
 	{
 	}
-	
+
 	void Add(const b2ContactPoint* point) {
-		CB_PREF(physics_box2d_b2ContactListener__Add)(maxHandle, point);
+		Maxb2ContactPoint p = {
+			point->shape1,
+			point->shape2,
+			{point->position.x, point->position.y},
+			{point->velocity.x, point->velocity.y},
+			{point->normal.x, point->normal.y},
+			point->separation,
+			point->friction,
+			point->restitution,
+			point->id.key
+		};
+		CB_PREF(physics_box2d_b2ContactListener__Add)(maxHandle, p);
 	}
 
 	void Persist(const b2ContactPoint* point) {
-		CB_PREF(physics_box2d_b2ContactListener__Persist)(maxHandle, point);
+		Maxb2ContactPoint p = {
+			point->shape1,
+			point->shape2,
+			{point->position.x, point->position.y},
+			{point->velocity.x, point->velocity.y},
+			{point->normal.x, point->normal.y},
+			point->separation,
+			point->friction,
+			point->restitution,
+			point->id.key
+		};
+		CB_PREF(physics_box2d_b2ContactListener__Persist)(maxHandle, p);
 	}
 
 	void Remove(const b2ContactPoint* point) {
-		CB_PREF(physics_box2d_b2ContactListener__Remove)(maxHandle, point);
+		Maxb2ContactPoint p = {
+			point->shape1,
+			point->shape2,
+			{point->position.x, point->position.y},
+			{point->velocity.x, point->velocity.y},
+			{point->normal.x, point->normal.y},
+			point->separation,
+			point->friction,
+			point->restitution,
+			point->id.key
+		};
+		CB_PREF(physics_box2d_b2ContactListener__Remove)(maxHandle, p);
 	}
 
 	void Result(const b2ContactResult* result) {
-		CB_PREF(physics_box2d_b2ContactListener__Result)(maxHandle, result);
+		Maxb2ContactResult r = {
+			result->shape1,
+			result->shape2,
+			{result->position.x, result->position.y},
+			{result->normal.x, result->normal.y},
+			result->normalImpulse,
+			result->tangentImpulse,
+			result->id.key	
+		};
+		CB_PREF(physics_box2d_b2ContactListener__Result)(maxHandle, r);
 	}
 
 private:
@@ -2166,33 +2214,6 @@ float32 bmx_b2dot(Maxb2Vec2 * a, Maxb2Vec2 * b) {
 	return b2Dot(b2Vec2(a->x, a->y), b2Vec2(b->x, b->y));
 }
 
-// *****************************************************
-/*
-b2XForm * bmx_b2xform_create() {
-	return new b2XForm;
-}
-
-Maxb2Vec2 bmx_b2xform_getposition(b2XForm * form) {
-	return {form->position.x, form->position.y};
-}
-
-void bmx_b2xform_setposition(b2XForm * form, Maxb2Vec2 * pos) {
-	form->position = b2Vec2(pos->x, pos->y);
-}
-
-Maxb2Mat22 bmx_b2xform_getr(b2XForm * form) {
-	
-	return &form->R;
-}
-
-void bmx_b2xform_setr(b2XForm * form, b2Mat22 * r) {
-	form->R = *r;
-}
-
-void bmx_b2xform_delete(b2XForm * form) {
-	delete form;
-}
-*/
 // *****************************************************
 
 void bmx_b2mat22_setangle(Maxb2Mat22 * mat, float32 angle) {
@@ -2255,67 +2276,6 @@ int32 bmx_b2contact_getmanifoldcount(b2Contact * contact) {
 	return contact->GetManifoldCount();
 }
 
-// *****************************************************
-
-b2Shape * bmx_b2contactresult_getshape1(b2ContactResult * contactResult) {
-	return contactResult->shape1;
-}
-
-b2Shape * bmx_b2contactresult_getshape2(b2ContactResult * contactResult) {
-	return contactResult->shape2;
-}
-
-Maxb2Vec2 bmx_b2contactresult_getposition(b2ContactResult * contactResult) {
-	return {contactResult->position.x, contactResult->position.y};
-}
-
-Maxb2Vec2 bmx_b2contactresult_getnormal(b2ContactResult * contactResult) {
-	return {contactResult->normal.x, contactResult->normal.y};
-}
-
-float32 bmx_b2contactresult_getnormalimpulse(b2ContactResult * contactResult) {
-	return contactResult->normalImpulse;
-}
-
-float32 bmx_b2contactresult_gettangentimpulse(b2ContactResult * contactResult) {
-	return contactResult->tangentImpulse;
-}
-
-// *****************************************************
-
-b2Shape * bmx_b2contactpoint_getshape1(b2ContactPoint * contactPoint) {
-	return contactPoint->shape1;
-}
-
-b2Shape * bmx_b2contactpoint_getshape2(b2ContactPoint * contactPoint) {
-	return contactPoint->shape2;
-}
-
-Maxb2Vec2 bmx_b2contactpoint_getposition(b2ContactPoint * contactPoint) {
-	return {contactPoint->position.x, contactPoint->position.y};
-}
-
-Maxb2Vec2 bmx_b2contactpoint_getvelocity(b2ContactPoint * contactPoint) {
-	return {contactPoint->velocity.x, contactPoint->velocity.y};
-}
-
-Maxb2Vec2 bmx_b2contactpoint_getnormal(b2ContactPoint * contactPoint) {
-	return {contactPoint->normal.x, contactPoint->normal.y};
-}
-
-float32 bmx_b2contactpoint_getseparation(b2ContactPoint * contactPoint) {
-	return contactPoint->separation;
-}
-
-float32 bmx_b2contactpoint_getfriction(b2ContactPoint * contactPoint) {
-	return contactPoint->friction;
-}
-
-float32 bmx_b2contactpoint_getrestitution(b2ContactPoint * contactPoint) {
-	return contactPoint->restitution;
-}
-
-
 // *****************************************************
 
 MaxFilterData * bmx_b2filterdata_create() {