@Override
    public void updatePosition() {
      double x0 = getXFor(id, lastActive), x1 = getXFor(id, active);
      double dx = MathUtils.lerp(x0, x1, transitProgress);
      double scale;

      if (isFrom()) {
        alpha = MathUtils.lerp(MAX_ALPHA, MIN_ALPHA, transitProgress);
        scale = MathUtils.lerp(MAX_SCALE, MIN_SCALE, transitProgress);
      } else if (isTo()) {
        alpha = MathUtils.lerp(MIN_ALPHA, MAX_ALPHA, transitProgress);
        scale = MathUtils.lerp(MIN_SCALE, MAX_SCALE, transitProgress);
      } else {
        alpha = MIN_ALPHA;
        scale = MIN_SCALE;
      }

      widget.transform.x = dx;
      widget.transform.scale = scale;

      DrawTexture.get(widget).color.a = alpha;
      widget.dirty = true;
    }
  @Override
  public void doRender(Entity ent, double x, double y, double z, float a, float b) {
    IRay ray = (IRay) ent;

    GL11.glPushMatrix();

    double length = ray.getLength();
    double fix = ray.getStartFix();

    Vec3 vo;
    if (ray.needsViewOptimize()) vo = ViewOptimize.getFixVector(ray);
    else vo = vec(0, 0, 0);
    // Rotate fix vector to world coordinate
    vo.rotateAroundY(MathUtils.toRadians(270 - ent.rotationYaw));

    Vec3 start = vec(0, 0, 0),
        end = add(start, multiply(new Motion3D(ent, true).getMotionVec(), length));
    start = add(start, vo);

    x += start.xCoord;
    y += start.yCoord;
    z += start.zCoord;

    Vec3 delta = subtract(end, start);
    double dxzsq = delta.xCoord * delta.xCoord + delta.zCoord * delta.zCoord;
    double npitch = MathUtils.toAngle(Math.atan2(delta.yCoord, Math.sqrt(dxzsq)));
    double nyaw = MathUtils.toAngle(Math.atan2(delta.xCoord, delta.zCoord));

    GL11.glTranslated(x, y, z);
    GL11.glRotated(-90 + nyaw, 0, 1, 0);
    GL11.glRotated(npitch, 0, 0, 1);
    GL11.glTranslated(fix, 0, 0);
    draw(ent, ray.getLength() - fix);

    GL11.glPopMatrix();
  }