public override void Step(TestSettings settings) { bool advanceRay = settings.pause == false || settings.singleStep; base.Step(settings); m_debugDraw.DrawString("Press 1-5 to drop stuff, m to change the mode"); switch (m_mode) { case Mode.e_closest: m_debugDraw.DrawString("Ray-cast mode: closest - find closest fixture along the ray"); break; case Mode.e_any: m_debugDraw.DrawString("Ray-cast mode: any - check for obstruction"); break; case Mode.e_multiple: m_debugDraw.DrawString("Ray-cast mode: multiple - gather multiple fixtures"); break; } float L = 11.0f; Vec2 point1 = new Vec2(0.0f, 10.0f); Vec2 d = new Vec2(L * (float)Math.Cos(m_angle), L * (float)Math.Sin(m_angle)); Vec2 point2 = point1 + d; if (m_mode == Mode.e_closest) { RayCastClosestCallback callback = new RayCastClosestCallback(); m_world.RayCast(callback, point1, point2); if (callback.m_hit) { m_debugDraw.DrawPoint(callback.m_point, 5.0f, Color.FromArgb(100, 225, 100)); m_debugDraw.DrawSegment(point1, callback.m_point, Color.FromArgb(200, 200, 200)); Vec2 head = callback.m_point + 0.5f * callback.m_normal; m_debugDraw.DrawSegment(callback.m_point, head, Color.FromArgb(225, 225, 100)); } else { m_debugDraw.DrawSegment(point1, point2, Color.FromArgb(200, 200, 200)); } } else if (m_mode == Mode.e_any) { RayCastAnyCallback callback = new RayCastAnyCallback(); m_world.RayCast(callback, point1, point2); if (callback.m_hit) { m_debugDraw.DrawPoint(callback.m_point, 5.0f, Color.FromArgb(100, 225, 100)); m_debugDraw.DrawSegment(point1, callback.m_point, Color.FromArgb(200, 200, 200)); Vec2 head = callback.m_point + 0.5f * callback.m_normal; m_debugDraw.DrawSegment(callback.m_point, head, Color.FromArgb(225, 225, 100)); } else { m_debugDraw.DrawSegment(point1, point2, Color.FromArgb(200, 200, 200)); } } else if (m_mode == Mode.e_multiple) { RayCastMultipleCallback callback = new RayCastMultipleCallback(); m_world.RayCast(callback, point1, point2); m_debugDraw.DrawSegment(point1, point2, Color.FromArgb(200, 200, 200)); for (int i = 0; i < callback.m_count; ++i) { Vec2 p = callback.m_points[i]; Vec2 n = callback.m_normals[i]; m_debugDraw.DrawPoint(p, 5.0f, Color.FromArgb(100, 225, 100)); m_debugDraw.DrawSegment(point1, p, Color.FromArgb(200, 200, 200)); Vec2 head = p + 0.5f * n; m_debugDraw.DrawSegment(p, head, Color.FromArgb(225, 225, 100)); } } if (advanceRay) { m_angle += 0.25f * (float)Math.PI / 180.0f; } #if ZERO // This case was failing. { Vec2[] vertices = new Vec2[4]; //vertices[0].Set(-22.875f, -3.0f); //vertices[1].Set(22.875f, -3.0f); //vertices[2].Set(22.875f, 3.0f); //vertices[3].Set(-22.875f, 3.0f); PolygonShape shape = new PolygonShape(); //shape.Set(vertices, 4); shape.SetAsBox(22.875f, 3.0f); RayCastInput input; input.p1.Set(10.2725f,1.71372f); input.p2.Set(10.2353f,2.21807f); //input.maxFraction = 0.567623f; input.maxFraction = 0.56762173f; Transform xf; xf.SetIdentity(); xf.position.Set(23.0f, 5.0f); RayCastOutput output; bool hit; hit = shape.RayCast(out output, input, xf); hit = false; Color color(1.0f, 1.0f, 1.0f); Vec2[] vs = new Vec2[4]; for (int i = 0; i < 4; ++i) { vs[i] = Utilities.Mul(xf, shape.m_vertices[i]); } m_debugDraw.DrawPolygon(vs, 4, color); m_debugDraw.DrawSegment(input.p1, input.p2, color); } #endif }