244 lines
5.0 KiB
C++
244 lines
5.0 KiB
C++
#pragma once
|
|
|
|
#include "Stdafx.h"
|
|
#include "Vector.cpp"
|
|
#include "Shape.cpp"
|
|
#include "ShapeDef.cpp"
|
|
|
|
namespace Box2D
|
|
{
|
|
namespace Net
|
|
{
|
|
/// <summary>
|
|
/// A rigid body. Internal computation are done in terms
|
|
/// of the center of mass position. The center of mass may
|
|
/// be offset from the body's origin.
|
|
/// </summary>
|
|
public ref class Body
|
|
{
|
|
internal:
|
|
b2Body *body;
|
|
Body(b2Body *bodyRef) : body(bodyRef) { }
|
|
public:
|
|
|
|
/// <summary>
|
|
/// Set the position of the body's origin and rotation (radians).
|
|
/// This breaks any contacts and wakes the other bodies.
|
|
/// </summary>
|
|
void SetXForm(Vector^ position, float32 rotation)
|
|
{
|
|
body->SetXForm(position->getVec2(), rotation);
|
|
}
|
|
|
|
/// <summary>
|
|
/// Get the position of the body's origin. The body's origin does not
|
|
/// necessarily coincide with the center of mass. It depends on how the
|
|
/// shapes are created.
|
|
/// </summary>
|
|
XForm^ GetXForm()
|
|
{
|
|
return gcnew XForm(body->GetXForm());
|
|
}
|
|
|
|
///<summary>Accesses the linear velocity of the center of mass.</summary>
|
|
property Vector^ LinearVelocity
|
|
{
|
|
Vector^ get()
|
|
{
|
|
return gcnew Vector(body->GetLinearVelocity());
|
|
}
|
|
|
|
void set(Vector^ value)
|
|
{
|
|
body->SetLinearVelocity(value->getVec2());
|
|
}
|
|
}
|
|
|
|
///<summary>Accesses the angular velocity.</summary>
|
|
property float32 AngularVelocity
|
|
{
|
|
float32 get()
|
|
{
|
|
return body->GetAngularVelocity();
|
|
}
|
|
|
|
void set(float32 value)
|
|
{
|
|
body->SetAngularVelocity(value);
|
|
}
|
|
}
|
|
|
|
///<summary> Apply a force at a world point. Additive. </summary>
|
|
void ApplyForce(Vector^ Force, Vector^ Point)
|
|
{
|
|
body->ApplyForce(Force->getVec2(), Point->getVec2());
|
|
}
|
|
|
|
///<summary> Apply a torque. Additive. </summary>
|
|
void ApplyTorque(float32 Torque)
|
|
{
|
|
body->ApplyTorque(Torque);
|
|
}
|
|
|
|
///<summary> Apply an impulse at a point. This immediately modifies the velocity. </summary>
|
|
void ApplyImpulse(Vector^ Impulse, Vector^ Point)
|
|
{
|
|
body->ApplyImpulse(Impulse->getVec2(), Point->getVec2());
|
|
}
|
|
|
|
///<summary>Accesses the Mass.</summary>
|
|
property float32 Mass
|
|
{
|
|
float32 get()
|
|
{
|
|
return body->GetMass();
|
|
}
|
|
}
|
|
|
|
///<summary>Accesses the Mass.</summary>
|
|
property float32 Inertia
|
|
{
|
|
float32 get()
|
|
{
|
|
return body->GetInertia();
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// Get the world coordinates of a point give the local coordinates
|
|
/// relative to the body's center of mass.
|
|
/// </summary>
|
|
Vector^ GetWorldPoint(Vector^ LocalPoint)
|
|
{
|
|
return gcnew Vector(body->GetWorldPoint(LocalPoint->getVec2()));
|
|
}
|
|
|
|
/// <summary>
|
|
/// Get the world coordinates of a vector given the local coordinates.
|
|
/// </summary>
|
|
Vector^ GetWorldVector(Vector^ LocalVector)
|
|
{
|
|
return gcnew Vector(body->GetWorldVector(LocalVector->getVec2()));
|
|
}
|
|
|
|
/// <summary>
|
|
/// Returns a local point relative to the center of mass given a world point.
|
|
/// </summary>
|
|
Vector^ GetLocalPoint(Vector^ WorldPoint)
|
|
{
|
|
return gcnew Vector(body->GetLocalPoint(WorldPoint->getVec2()));
|
|
}
|
|
|
|
/// <summary>
|
|
/// Returns a local vector given a world vector.
|
|
/// </summary>
|
|
Vector^ GetLocalVector(Vector^ WorldVector)
|
|
{
|
|
return gcnew Vector(body->GetLocalVector(WorldVector->getVec2()));
|
|
}
|
|
|
|
///<summary>Is this body static (immovable)</summary>
|
|
property bool Static
|
|
{
|
|
bool get()
|
|
{
|
|
return body->IsStatic();
|
|
}
|
|
}
|
|
|
|
///<summary>Is this body frozen</summary>
|
|
property bool Frozen
|
|
{
|
|
bool get()
|
|
{
|
|
return body->IsFrozen();
|
|
}
|
|
}
|
|
|
|
///<summary>Is this body sleeping</summary>
|
|
property bool Sleeping
|
|
{
|
|
bool get()
|
|
{
|
|
return body->IsSleeping();
|
|
}
|
|
}
|
|
|
|
///<summary>You can disable sleeping on this particular body.</summary>
|
|
property bool AllowSleeping
|
|
{
|
|
bool get()
|
|
{
|
|
return body->IsSleeping();
|
|
}
|
|
|
|
void set(bool value)
|
|
{
|
|
body->AllowSleeping(value);
|
|
}
|
|
}
|
|
|
|
property bool Bullet
|
|
{
|
|
bool get()
|
|
{
|
|
return body->IsBullet();
|
|
}
|
|
|
|
void set(bool value)
|
|
{
|
|
body->SetBullet(value);
|
|
}
|
|
}
|
|
|
|
void WakeUp()
|
|
{
|
|
body->WakeUp();
|
|
}
|
|
|
|
///<summary> Get the list of all shapes attached to this body.</summary>
|
|
property IList<Shape^>^ Shapes
|
|
{
|
|
IList<Shape^>^ get()
|
|
{
|
|
List<Shape^>^ list = gcnew List<Shape^>();
|
|
for(b2Shape *shape = body->GetShapeList(); shape; shape = shape->GetNext())
|
|
list->Add(gcnew Shape(shape));
|
|
|
|
return list;
|
|
}
|
|
}
|
|
|
|
void CreateShape(ShapeDef^ def)
|
|
{
|
|
body->CreateShape(def->def);
|
|
}
|
|
|
|
void DestroyShape(Shape^ shape)
|
|
{
|
|
body->DestroyShape(shape->shape);
|
|
}
|
|
|
|
void SetMassFromShapes()
|
|
{
|
|
body->SetMassFromShapes();
|
|
}
|
|
|
|
//TODO:
|
|
//void* GetUserData();
|
|
//const b2Mat22& GetRotationMatrix() const;
|
|
};
|
|
}
|
|
}
|
|
|
|
/*
|
|
TODO:
|
|
|
|
public:
|
|
// Get the list of all contacts attached to this body.
|
|
b2ContactNode* GetContactList();
|
|
|
|
// Get the list of all joints attached to this body.
|
|
b2JointNode* GetJointList();
|
|
*/
|