29 float num = entityAngularVelocity;
30 float num2 = size.X * 0.5f;
31 num *= physicsProperties.
Drag;
32 velocity *= physicsProperties.
Drag;
33 float num3 = velocity.
Length();
40 float num5 = 1f / (float)num4;
43 float num6 = physicsProperties.Gravity / (float)(num4 * num4);
45 for (
int i = 0; i < num4; i++)
59 listener.
OnPassThrough(physicsProperties, ref position, ref velocity, ref num, ref passThrough);
70 position = collisionPoint + vector * (num2 + 0.0001f) - size * 0.5f;
74 listener.
OnCollision(physicsProperties, ref position, ref velocity, ref collision);
75 num = (collision.Normal.X * velocity.Y - collision.Normal.Y * velocity.X) / num2;
81 if (flag && velocity.
X > -0.01f && velocity.
X < 0.01f && velocity.
Y <= 0f && velocity.
Y > 0f - physicsProperties.
Gravity)
85 entity.position = position;
86 entity.velocity = velocity;
87 entityAngularVelocity = num;
93 Point tileCoordinates = center.ToTileCoordinates();
94 Tile tile = (contactTile =
Main.
tile[tileCoordinates.
X, tileCoordinates.
Y]);
107 float num = (float)(tileCoordinates.
Y + 1) * 16f - (float)(
int)tile.liquid / 255f * 16f;
120 return num < center.
Y;
131 Vector2 vector = position / 16f -
new Vector2(tileCoordinates.
X, tileCoordinates.
Y);
132 return tile.
slope()
switch
134 0 => vector.Y > 0.5f,
135 1 => vector.Y > vector.
X,
136 2 => vector.Y > 1f - vector.
X,
137 3 => vector.Y < 1f - vector.
X,
138 4 => vector.Y < vector.
X,
145 if (position.
X > 32f && position.
Y > 32f && position.
X + size.X < (
float)
Main.
maxTilesX * 16f - 32f)
147 return position.Y + size.Y < (float)
Main.
maxTilesY * 16f - 32f;
155 Vector2 vector = position + size * 0.5f;
157 tileEdges = ((!(velocity.Y < 0f)) ? (tileEdges |
TileEdges.Top) : (tileEdges |
TileEdges.Bottom));
158 tileEdges = ((!(velocity.X < 0f)) ? (tileEdges |
TileEdges.Left) : (tileEdges |
TileEdges.Right));
159 tileEdges = ((!(velocity.Y > velocity.
X)) ? (tileEdges |
TileEdges.TopRightSlope) : (tileEdges |
TileEdges.BottomLeftSlope));
160 tileEdges = ((!(velocity.Y > 0f - velocity.
X)) ? (tileEdges |
TileEdges.TopLeftSlope) : (tileEdges |
TileEdges.BottomRightSlope));
162 collisionTile =
null;
163 float num =
float.MaxValue;
165 float distanceSquaredOut = 0f;
166 for (
int i = tileBounds.
Left; i < tileBounds.
Right; i++)
168 for (
int j = tileBounds.
Top; j < tileBounds.
Bottom; j++)
170 if (
GetCollisionPointForTile(tileEdges, i, j, vector, ref closestPointOut, ref distanceSquaredOut) && !(distanceSquaredOut >= num) && !(
Vector2.
Dot(velocity, vector - closestPointOut) > 0f))
172 num = distanceSquaredOut;
173 collisionPoint = closestPointOut;
178 float num2 = size.X / 2f;
179 return num < num2 * num2;
195 edgesToTest &= TileEdges.Top | TileEdges.BottomLeftSlope |
TileEdges.BottomRightSlope;
197 Vector2 tilePosition =
new Vector2((
float)x * 16f, (
float)y * 16f);
200 if (
GetSlopeEdge(ref edgesToTest, tile, tilePosition, ref edge))
210 if (!flag || num < distanceSquaredOut)
212 distanceSquaredOut = num;
213 closestPointOut = vector;
221 if (!flag || num2 < distanceSquaredOut)
223 distanceSquaredOut = num2;
224 closestPointOut = vector2;
233 switch (tile.
slope())
238 edgesToTest &= TileEdges.Bottom | TileEdges.Left |
TileEdges.BottomLeftSlope;
239 if ((edgesToTest &
TileEdges.BottomLeftSlope) == 0)
243 edge.Start = tilePosition;
244 edge.End =
new Vector2(tilePosition.
X + 16f, tilePosition.
Y + 16f);
247 edgesToTest &= TileEdges.Bottom | TileEdges.Right |
TileEdges.BottomRightSlope;
248 if ((edgesToTest &
TileEdges.BottomRightSlope) == 0)
252 edge.Start =
new Vector2(tilePosition.
X, tilePosition.
Y + 16f);
253 edge.End =
new Vector2(tilePosition.
X + 16f, tilePosition.
Y);
256 edgesToTest &= TileEdges.Top | TileEdges.Left |
TileEdges.TopLeftSlope;
257 if ((edgesToTest &
TileEdges.TopLeftSlope) == 0)
261 edge.Start =
new Vector2(tilePosition.
X, tilePosition.
Y + 16f);
262 edge.End =
new Vector2(tilePosition.
X + 16f, tilePosition.
Y);
265 edgesToTest &= TileEdges.Top | TileEdges.Right |
TileEdges.TopRightSlope;
266 if ((edgesToTest &
TileEdges.TopRightSlope) == 0)
270 edge.Start = tilePosition;
271 edge.End =
new Vector2(tilePosition.
X + 16f, tilePosition.
Y + 16f);
280 if ((edgesToTest &
TileEdges.Bottom) != 0)
287 edge.Start =
new Vector2(tilePosition.
X, tilePosition.
Y + 16f);
288 edge.End =
new Vector2(tilePosition.
X + 16f, tilePosition.
Y + 16f);
300 tilePosition.Y += 8f;
302 edge.Start =
new Vector2(tilePosition.
X, tilePosition.
Y);
303 edge.End =
new Vector2(tilePosition.
X + 16f, tilePosition.
Y);
319 edge.Start =
new Vector2(tilePosition.
X, tilePosition.
Y);
320 edge.End =
new Vector2(tilePosition.
X, tilePosition.
Y + 16f);
327 if ((edgesToTest &
TileEdges.Right) != 0)
335 edge.Start =
new Vector2(tilePosition.
X + 16f, tilePosition.
Y);
336 edge.End =
new Vector2(tilePosition.
X + 16f, tilePosition.
Y + 16f);
350 int num3 = (int)
Math.
Floor((position.
X + size.X) / 16f);
351 int num4 = (int)
Math.
Floor((position.
Y + size.Y) / 16f);
352 return new Rectangle(num, num2, num3 - num + 1, num4 - num2 + 1);
372 return lineSegment.
Start;
376 return lineSegment.
End;
378 return lineSegment.Start + vector * num2;
381 [Conditional(
"DEBUG")]
static double Ceiling(double a)
static double Floor(double d)
static byte Max(byte val1, byte val2)
static bool[] tileSolidTop
static Rectangle GetTileBounds(Vector2 position, Vector2 size)
static bool GetLeftOrRightEdge(TileEdges edgesToTest, int x, int y, Vector2 tilePosition, ref LineSegment edge)
static Vector2 ClosestPointOnLineSegment(Vector2 point, LineSegment lineSegment)
static bool IsBallInWorld(Vector2 position, Vector2 size)
static BallStepResult Step(PhysicsProperties physicsProperties, Entity entity, ref float entityAngularVelocity, IBallContactListener listener)
static bool IsNeighborSolid(Tile tile)
static bool GetCollisionPointForTile(TileEdges edgesToTest, int x, int y, Vector2 center, ref Vector2 closestPointOut, ref float distanceSquaredOut)
static bool CheckForPassThrough(Vector2 center, out BallPassThroughType type, out Tile contactTile)
static void DrawEdge(LineSegment edge)
static bool GetClosestEdgeToCircle(Vector2 position, Vector2 size, Vector2 velocity, out Vector2 collisionPoint, out Tile collisionTile)
static bool GetSlopeEdge(ref TileEdges edgesToTest, Tile tile, Vector2 tilePosition, ref LineSegment edge)
static bool IsPositionInsideTile(Vector2 position, Point tileCoordinates, Tile tile)
static bool GetTopOrBottomEdge(TileEdges edgesToTest, int x, int y, Vector2 tilePosition, ref LineSegment edge)
void liquidType(int liquidType)
static float Dot(Vector2 value1, Vector2 value2)
static Vector2 Reflect(Vector2 vector, Vector2 normal)
static float DistanceSquared(Vector2 value1, Vector2 value2)
static BallStepResult Moving()
static BallStepResult OutOfBounds()
static BallStepResult Resting()