internal PolygonShape(ShapeDef def) : base(def)
{
Box2DXDebug.Assert(def.Type == ShapeType.PolygonShape);
this._type = ShapeType.PolygonShape;
PolygonDef polygonDef = (PolygonDef)def;
this._vertexCount = polygonDef.VertexCount;
Box2DXDebug.Assert(3 <= this._vertexCount && this._vertexCount <= Settings.MaxPolygonVertices);
for (int i = 0; i < this._vertexCount; i++)
{
this._vertices[i] = polygonDef.Vertices[i];
}
for (int i = 0; i < this._vertexCount; i++)
{
int num = i;
int num2 = (i + 1 < this._vertexCount) ? (i + 1) : 0;
Vec2 a = this._vertices[num2] - this._vertices[num];
Box2DXDebug.Assert(a.LengthSquared() > Settings.FLT_EPSILON * Settings.FLT_EPSILON);
this._normals[i] = Vec2.Cross(a, 1f);
this._normals[i].Normalize();
}
for (int i = 0; i < this._vertexCount; i++)
{
for (int j = 0; j < this._vertexCount; j++)
{
if (j != i && j != (i + 1) % this._vertexCount)
{
float num3 = Vec2.Dot(this._normals[i], this._vertices[j] - this._vertices[i]);
Box2DXDebug.Assert(num3 < -Settings.LinearSlop);
}
}
}
for (int i = 1; i < this._vertexCount; i++)
{
float num4 = Vec2.Cross(this._normals[i - 1], this._normals[i]);
num4 = Box2DX.Common.Math.Clamp(num4, -1f, 1f);
float num5 = (float)System.Math.Asin((double)num4);
Box2DXDebug.Assert(num5 > Settings.AngularSlop);
}
this._centroid = PolygonShape.ComputeCentroid(polygonDef.Vertices, polygonDef.VertexCount);
PolygonShape.ComputeOBB(out this._obb, this._vertices, this._vertexCount);
for (int i = 0; i < this._vertexCount; i++)
{
int num = (i - 1 >= 0) ? (i - 1) : (this._vertexCount - 1);
int num2 = i;
Vec2 a2 = this._normals[num];
Vec2 a3 = this._normals[num2];
Vec2 b = this._vertices[i] - this._centroid;
Vec2 b2 = default(Vec2);
b2.X = Vec2.Dot(a2, b) - Settings.ToiSlop;
b2.Y = Vec2.Dot(a3, b) - Settings.ToiSlop;
Box2DXDebug.Assert(b2.X >= 0f);
Box2DXDebug.Assert(b2.Y >= 0f);
Mat22 mat = default(Mat22);
mat.Col1.X = a2.X;
mat.Col2.X = a2.Y;
mat.Col1.Y = a3.X;
mat.Col2.Y = a3.Y;
this._coreVertices[i] = mat.Solve(b2) + this._centroid;
}
}