public void updateQuad() {
   quad.clear();
   for (Entity entity : allEntities) {
     if (entity != null) {
       ArrayList<BoundingShape> bs = entity.getBoundingShapes();
       for (int j = 0; j < bs.size(); j++) {
         quad.insert(bs.get(j));
       }
     }
   }
 }
  @Override
  public void render(float delta) {
    // update and draw stuff
    Gdx.gl.glClearColor(1, 1, 1, 1);
    Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
    camera.update();
    batch.setProjectionMatrix(camera.combined);
    shapes.setProjectionMatrix(camera.combined);

    shapes.begin(ShapeType.Line);
    shapes.setColor(Color.RED);
    for (int x = 0; x < Gdx.graphics.getWidth(); x += Constants.TILE_SIZE) {
      shapes.line(x, 0, x, Gdx.graphics.getHeight());
    }
    for (int y = 0; y < Gdx.graphics.getHeight(); y += Constants.TILE_SIZE) {
      shapes.line(0, y, Gdx.graphics.getWidth(), y);
    }

    shapes.end();

    shapes.begin(ShapeType.Filled);
    shapes.setColor(Color.CYAN);
    for (Entity entity : allEntities) {
      if (entity != null) {
        for (BoundingShape b : entity.getBoundingShapes()) {
          Rectangle2D bounds = b.getShape().getBounds2D();
          shapes.rect(
              (float) bounds.getX() + entity.getX(),
              (float) bounds.getY() + entity.getY(),
              (float) bounds.getWidth(),
              (float) bounds.getHeight());
        }
      }
    }

    shapes.setColor(Color.GREEN);
    for (int x = 0; x < staticGrid.length; x++) {
      for (int y = 0; y < staticGrid[0].length; y++) {
        if (staticGrid[x][y] == 1)
          shapes.rect(
              x * Constants.TILE_SIZE,
              y * Constants.TILE_SIZE,
              Constants.TILE_SIZE,
              Constants.TILE_SIZE);
      }
    }
    shapes.end();

    batch.begin();

    for (Entity entity : allEntities) {
      if (entity != null) {
        if (entity.getSprite() != null) {
          batch.draw(entity.getSprite(), entity.getX(), entity.getY());
        }
      }
    }
    // batch.draw(player.getSprite(), player.getSprite().getX(),
    // player.getSprite().getY(),player.getSprite().getOriginX(),
    //            player.getSprite().getOriginY(),
    //
    // player.getSprite().getWidth(),player.getSprite().getHeight(),player.getSprite().getScaleX(),player.
    //                     getSprite().getScaleY(),player.getSprite().getRotation());

    batch.end();

    batch.begin();
    font.draw(batch, "FPS: " + Gdx.graphics.getFramesPerSecond(), 50, 50);
    font.draw(batch, "Mouse X: " + Gdx.input.getX(), 50, 80);
    font.draw(batch, "Mouse Y: " + Gdx.input.getY(), 50, 110);
    batch.end();
    // debugRenderer.render(world, debugMatrix);
    for (Entity entity : allEntities) {
      if (entity != null) {
        entity.update(delta); // update all entities before handling collisions
      }
    }
    updateQuad();

    ArrayList<BoundingShape> returnObjects = new ArrayList<BoundingShape>();
    for (Entity entity : allEntities) {
      if (entity != null) {
        ArrayList<BoundingShape> bs = entity.getBoundingShapes();
        for (int j = 0; j < bs.size(); j++) {
          returnObjects.clear();
          BoundingShape currentBounding = bs.get(j);
          quad.retrieve(returnObjects, currentBounding);

          for (int x = 0; x < returnObjects.size(); x++) {
            // Run collision detection algorithm between objects
            BoundingShape other = returnObjects.get(x);
            // System.out.println(other.getUserData());
            if (currentBounding.intersects(other)) {
              if (currentBounding.getOwner() != other.getOwner()) {
                currentBounding
                    .getOwner()
                    .collide(
                        new Collision(
                            currentBounding.getOwner(), other.getOwner(), currentBounding, other));
                // System.out.println("Collision: " + currentBounding.getUserData() + " + " +
                // other.getUserData());
              }
            }
          }
        }
        entity.postCollisionUpdate();
      }
    }
  }