hitTestInput method

  1. @override
DisplayObject? hitTestInput(
  1. num localX,
  2. num localY
)
override

Evaluates this display object to see if the coordinates localX and localY are inside this display object.

If the coordinates are inside, this display object is returned; null otherwise.

localX and localY are relative to to the origin (0,0) of this display object (local coordinates).

Implementation

@override
DisplayObject? hitTestInput(num localX, num localY) {
  for (var i = 0; i < ixList.length - 2; i += 3) {
    final i1 = ixList[i + 0] << 2;
    final i2 = ixList[i + 1] << 2;
    final i3 = ixList[i + 2] << 2;

    final x1 = vxList[i1 + 0];
    final y1 = vxList[i1 + 1];
    final x2 = vxList[i2 + 0];
    final y2 = vxList[i2 + 1];
    final x3 = vxList[i3 + 0];
    final y3 = vxList[i3 + 1];

    if (localX < x1 && localX < x2 && localX < x3) continue;
    if (localX > x1 && localX > x2 && localX > x3) continue;
    if (localY < y1 && localY < y2 && localY < y3) continue;
    if (localY > y1 && localY > y2 && localY > y3) continue;

    final vx1 = x3 - x1;
    final vy1 = y3 - y1;
    final vx2 = x2 - x1;
    final vy2 = y2 - y1;
    final vx3 = localX - x1;
    final vy3 = localY - y1;

    final dot11 = vx1 * vx1 + vy1 * vy1;
    final dot12 = vx1 * vx2 + vy1 * vy2;
    final dot13 = vx1 * vx3 + vy1 * vy3;
    final dot22 = vx2 * vx2 + vy2 * vy2;
    final dot23 = vx2 * vx3 + vy2 * vy3;

    final u =
        (dot22 * dot13 - dot12 * dot23) / (dot11 * dot22 - dot12 * dot12);
    final v =
        (dot11 * dot23 - dot12 * dot13) / (dot11 * dot22 - dot12 * dot12);

    if ((u >= 0) && (v >= 0) && (u + v < 1)) return this;
  }

  return null;
}