154 lines
3.2 KiB
C++
154 lines
3.2 KiB
C++
#pragma once
|
|
|
|
#include "stdafx.h"
|
|
#include "Vector.cpp"
|
|
#include "Matrix.cpp"
|
|
#include "ShapeType.cpp"
|
|
#include "XForm.cpp"
|
|
|
|
using namespace System::Collections::Generic;
|
|
|
|
namespace Box2D
|
|
{
|
|
namespace Net
|
|
{
|
|
ref class Body;
|
|
public ref class Shape
|
|
{
|
|
internal:
|
|
b2Shape *shape;
|
|
Shape(b2Shape *shapeRef) : shape(shapeRef) { }
|
|
|
|
public:
|
|
bool TestPoint(XForm^ xf, Vector^ p)
|
|
{
|
|
return shape->TestPoint(xf->getXForm(), p->getVec2());
|
|
}
|
|
|
|
property ShapeType ShapeType
|
|
{
|
|
Box2D::Net::ShapeType get()
|
|
{
|
|
return (Box2D::Net::ShapeType)shape->GetType();
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// Get the parent body of this shape.
|
|
/// </summary>
|
|
property Body^ Body
|
|
{
|
|
Box2D::Net::Body^ get();
|
|
}
|
|
|
|
/*
|
|
/// <summary>
|
|
/// Get the world position.
|
|
/// </summary>
|
|
property Vector^ Position
|
|
{
|
|
Vector^ get()
|
|
{
|
|
return gcnew Vector(shape->Get->GetPosition());
|
|
}
|
|
}
|
|
*/
|
|
|
|
/*
|
|
property Matrix^ Rotation
|
|
{
|
|
Matrix^ get()
|
|
{
|
|
return gcnew Matrix(shape->GetRotationMatrix());
|
|
}
|
|
}
|
|
*/
|
|
|
|
//TODO:
|
|
//void* GetUserData();
|
|
//
|
|
// Remove and then add proxy from the broad-phase.
|
|
// This is used to refresh the collision filters.
|
|
//virtual void ResetProxy(b2BroadPhase* broadPhase) = 0;
|
|
|
|
/// <summary>
|
|
/// Get the next shape in the parent body's shape list.
|
|
/// </summary>
|
|
Shape^ GetNext()
|
|
{
|
|
return gcnew Shape(shape->GetNext());
|
|
}
|
|
};
|
|
|
|
public ref class CircleShape : public Shape
|
|
{
|
|
internal:
|
|
b2CircleShape *circleShape;
|
|
CircleShape(b2CircleShape *shapeRef) : Shape(shapeRef), circleShape(shapeRef) { }
|
|
|
|
public:
|
|
CircleShape(Shape^ shape) : Shape(shape->shape), circleShape(0)
|
|
{
|
|
if(shape->ShapeType == Box2D::Net::ShapeType::e_circleShape &&
|
|
reinterpret_cast<b2CircleShape *>(shape->shape))
|
|
{
|
|
circleShape = reinterpret_cast<b2CircleShape*>(shape->shape);
|
|
}
|
|
else
|
|
{
|
|
throw gcnew System::Exception("Attempting to convert a Shape to a CircleShape,"
|
|
"but the Shape is not a circle shape.");
|
|
}
|
|
}
|
|
|
|
//TODO: this is not technically part of the "public" interface for CircleShape
|
|
property float32 Radius
|
|
{
|
|
float32 get()
|
|
{
|
|
return circleShape->m_radius;
|
|
}
|
|
|
|
void set(float32 value)
|
|
{
|
|
circleShape->m_radius = value;
|
|
}
|
|
}
|
|
};
|
|
|
|
public ref class PolyShape : public Shape
|
|
{
|
|
internal:
|
|
b2PolygonShape *polyShape;
|
|
PolyShape(b2PolygonShape *shapeRef) : Shape(shapeRef), polyShape(shapeRef) { }
|
|
|
|
public:
|
|
PolyShape(Shape^ shape) : Shape(shape->shape), polyShape(0)
|
|
{
|
|
if(shape->ShapeType == Box2D::Net::ShapeType::e_polygonShape &&
|
|
reinterpret_cast<b2PolygonShape *>(shape->shape))
|
|
{
|
|
polyShape = reinterpret_cast<b2PolygonShape*>(shape->shape);
|
|
}
|
|
else
|
|
{
|
|
throw gcnew System::Exception("Attempting to convert a Shape to a PolyShape,"
|
|
"but the Shape is not a poly shape.");
|
|
}
|
|
}
|
|
|
|
property IList<Vector^>^ Vertices
|
|
{
|
|
IList<Vector^>^ get()
|
|
{
|
|
List<Vector^>^ list = gcnew List<Vector^>();
|
|
for(int x = 0; x < polyShape->m_vertexCount; ++x)
|
|
list->Add(gcnew Vector(polyShape->m_vertices[x]));
|
|
|
|
return list;
|
|
}
|
|
}
|
|
};
|
|
}
|
|
}
|