.. default-domain:: C

2d axis aligned bounding box (AABB)
================================================================================

Header: cglm/aabb2d.h

Some convenient functions provided for AABB.

**Definition of aabb:**

cglm defines an aabb as a two dimensional array of vec2's.
The first element is the **min** point and the second one is the **max** point.
If you have another type e.g. struct or even another representation then you must
convert it before and after calling a cglm aabb2d function.

Table of contents (click to go):
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Functions:

1. :c:func:`glm_aabb2d_copy`
#. :c:func:`glm_aabb2d_transform`
#. :c:func:`glm_aabb2d_merge`
#. :c:func:`glm_aabb2d_crop`
#. :c:func:`glm_aabb2d_crop_until`
#. :c:func:`glm_aabb2d_invalidate`
#. :c:func:`glm_aabb2d_isvalid`
#. :c:func:`glm_aabb2d_size`
#. :c:func:`glm_aabb2d_radius`
#. :c:func:`glm_aabb2d_center`
#. :c:func:`glm_aabb2d_aabb`
#. :c:func:`glm_aabb2d_circle`
#. :c:func:`glm_aabb2d_point`
#. :c:func:`glm_aabb2d_contains`

Functions documentation
~~~~~~~~~~~~~~~~~~~~~~~

.. c:function:: void  glm_aabb2d_copy(vec2 aabb[2], vec2 dest[2])

    | copy all members of [aabb] to [dest]

    Parameters:
      | *[in]*  **aabb**  bounding box
      | *[out]* **dest**  destination

.. c:function:: void  glm_aabb2d_transform(vec2 aabb[2], mat3 m, vec2 dest[2])

    | apply transform to Axis-Aligned Bounding Box

    Parameters:
      | *[in]*  **aabb**   bounding box
      | *[in]*  **m**     transform matrix
      | *[out]* **dest**  transformed bounding box

.. c:function:: void  glm_aabb2d_merge(vec2 aabb1[2], vec2 aabb2[2], vec2 dest[2])

    | merges two AABB bounding box and creates new one

    two aabb must be in the same space

    Parameters:
      | *[in]*  **aabb1** bounding box 1
      | *[in]*  **aabb2** bounding box 2
      | *[out]* **dest** merged bounding box

.. c:function:: void  glm_aabb2d_crop(vec2 aabb[2], vec2 cropAabb[2], vec2 dest[2])

    | crops a bounding box with another one.

    this could be useful for gettng a bbox which fits with view frustum and
    object bounding boxes. In this case you crop view frustum box with objects
    box

    Parameters:
      | *[in]*  **aabb**      bounding box 1
      | *[in]*  **cropAabb**  crop box
      | *[out]* **dest**     cropped bounding box

.. c:function:: void  glm_aabb2d_crop_until(vec2 aabb[2], vec2 cropAabb[2], vec2 clampAabb[2], vec2 dest[2])

    | crops a bounding box with another one.

    this could be useful for gettng a bbox which fits with view frustum and
    object bounding boxes. In this case you crop view frustum box with objects
    box

    Parameters:
      | *[in]*  **aabb**      bounding box
      | *[in]*  **cropAabb**  crop box
      | *[in]*  **clampAabb** miniumum box
      | *[out]* **dest**     cropped bounding box

.. c:function:: void  glm_aabb2d_invalidate(vec2 aabb[2])

    | invalidate AABB min and max values

    | It fills *max* values with -FLT_MAX and *min* values with +FLT_MAX

    Parameters:
      | *[in, out]*   **aabb**     bounding box

.. c:function:: bool  glm_aabb2d_isvalid(vec2 aabb[2])

    | check if AABB is valid or not

    Parameters:
      | *[in]*   **aabb**     bounding box

    Returns:
      returns true if aabb is valid otherwise false

.. c:function:: float  glm_aabb2d_size(vec2 aabb[2])

    | distance between of min and max

    Parameters:
      | *[in]*   **aabb**     bounding box

    Returns:
      distance between min - max

.. c:function:: float  glm_aabb2d_radius(vec2 aabb[2])

    | radius of sphere which surrounds AABB

    Parameters:
      | *[in]*   **aabb**     bounding box

.. c:function:: void  glm_aabb2d_center(vec2 aabb[2], vec2 dest)

    | computes center point of AABB

    Parameters:
      | *[in]*    **aabb**      bounding box
      | *[out]*   **dest**     center of bounding box

.. c:function:: bool  glm_aabb2d_aabb(vec2 aabb[2], vec2 other[2])

    | check if two AABB intersects

    Parameters:
      | *[in]*    **aabb**     bounding box
      | *[out]*   **other**   other bounding box

.. c:function:: bool  glm_aabb2d_circle(vec2 aabb[2], vec3 c)

    | check if AABB intersects with sphere

    | https://github.com/erich666/GraphicsGems/blob/master/gems/BoxSphere.c
    | Solid Box - Solid Sphere test.

    Parameters:
      | *[in]*    **aabb**     solid bounding box
      | *[out]*   **c**        solid circle

.. c:function:: bool  glm_aabb2d_point(vec2 aabb[2], vec2 point)

    | check if point is inside of AABB

    Parameters:
      | *[in]*    **aabb**     bounding box
      | *[out]*   **point**   point

.. c:function:: bool  glm_aabb2d_contains(vec2 aabb[2], vec2 other[2])

    | check if AABB contains other AABB

    Parameters:
      | *[in]*    **aabb**     bounding box
      | *[out]*   **other**   other bounding box

