@Override
 public boolean pan(float x, float y, float deltaX, float deltaY) {
   if (!this.disableDrag) {
     region_of_interest_.Pan(deltaX, deltaY);
   }
   return true;
 }
 @Override
 public boolean scrolled(int amount) {
   if (this.disableDrag) {
     return false;
   }
   Vector3 mouse_pos = this.unproject(new Vector3(Gdx.input.getX(), Gdx.input.getY(), 0));
   return region_of_interest_.Zoom(mouse_pos.x, mouse_pos.y, amount * 25);
 }
 @Override
 public boolean zoom(Vector2 screenLocus, float amount) {
   if (this.disableDrag) {
     return false;
   }
   Vector3 locus = this.unproject(new Vector3(screenLocus.x, screenLocus.y, 0));
   return region_of_interest_.Zoom(locus.x, locus.y, amount * 0.5f);
 }
  @Override
  public void render(float delta) {
    super.render(delta);

    int nextNodeIndex = -1;

    // prepare text

    kApplication.spriteBatch().begin();
    {
      this.background.draw(kApplication.spriteBatch());
    }
    kApplication.spriteBatch().end();

    this.chessboard_renderer_.begin();
    {
      nextNodeIndex = game_path_.peek().render(region_of_interest_);
    }
    this.chessboard_renderer_.end();

    kApplication.spriteBatch().begin();
    {
      hud.render(kApplication.spriteBatch(), delta);
    }
    kApplication.spriteBatch().end();

    if (nextNodeIndex > -1) {
      if (game_path_.size() > 1) {

        // Cull grandchildren to deallocate memory
        GraphSquare cur_top = game_path_.pop();
        game_path_.peek().CullGrandChildrenExcept(cur_top);
        game_path_.push(cur_top);
      }
      this.region_of_interest_.Reconstrain(
          game_path_.peek().getChildVirtualPosition(nextNodeIndex));
      game_path_.push(game_path_.peek().getChildNode(nextNodeIndex));

      this.hud.pushMove(this.game_path_.peek().toString());

    } else if (game_path_.size() > 1 && this.region_of_interest_.ZoomOutRequired()) {
      GraphSquare previous = game_path_.pop();
      region_of_interest_.Deconstrain(
          game_path_.peek().getChildVirtualPosition(game_path_.peek().getChildIndex(previous)));
      this.hud.popMove();
    }
  }