Click here to Skip to main content
15,895,142 members
Articles / Mobile Apps / Android

One-Touch Casual 3D Game Based on OpenGL ES 2.0 3D Engine with Lua, Bullet, and Vorbis Support

Rate me:
Please Sign up or sign in to vote.
4.75/5 (7 votes)
8 Nov 2012CPOL5 min read 50.5K   3.3K   18  
Android-x86 native game-engine - without JNI
#ifndef BOUNDINGBOX_H_
#define BOUNDINGBOX_H_

#include "Frustum.h"

namespace gameplay
{

/**
 * Defines a 3-dimensional axis-aligned bounding box.
 */
class BoundingBox
{
public:

    /**
     * The minimum point.
     */
    Vector3 min;

    /**
     * The maximum point.
     */
    Vector3 max;

    /**
     * Constructs an empty bounding box at the origin.
     */
    BoundingBox();

    /**
     * Constructs a new bounding box from the specified values.
     *
     * @param min The minimum point of the bounding box.
     * @param max The maximum point of the bounding box.
     */
    BoundingBox(const Vector3& min, const Vector3& max);

    /**
     * Constructs a new bounding box from the specified values.
     * 
     * @param minX The x coordinate of the minimum point of the bounding box.
     * @param minY The y coordinate of the minimum point of the bounding box.
     * @param minZ The z coordinate of the minimum point of the bounding box.
     * @param maxX The x coordinate of the maximum point of the bounding box.
     * @param maxY The y coordinate of the maximum point of the bounding box.
     * @param maxZ The z coordinate of the maximum point of the bounding box.
     */
    BoundingBox(float minX, float minY, float minZ, float maxX, float maxY, float maxZ);

    /**
     * Constructs a new bounding box from the given bounding box.
     *
     * @param copy The bounding box to copy.
     */
    BoundingBox(const BoundingBox& copy);

    /**
     * Destructor.
     */
    ~BoundingBox();

    /**
     * Returns an empty bounding box.
     */
    static const BoundingBox& empty();

    /**
     * Gets the center point of the bounding box.
     *
     * This method computes the center point of the box from its min and max.
     *
     * @return The center point of the bounding box.
     */
    Vector3 getCenter() const;

    /**
     * Gets the center point of the bounding box.
     *
     * This method computes the center point of the box from its min and max
     * points and stores the result in dst.
     *
     * @param dst The vector to store the result in.
     */
    void getCenter(Vector3* dst) const;

    /**
     * Gets the corners of the bounding box in the specified array.
     *
     * The corners are returned as follows: 0 to 3 specify the near face starting at the upper left point
     * when looking towards the origin from the positive z-axis in a counter-clockwise fashion; 4 to 7
     * specify the far face starting at the upper left point when looking towards the origin from the negative
     * z-axis in a counter-clockwise fashion.
     *
     * @param dst The array to store the corners in. Must be size 8.
     */
    void getCorners(Vector3* dst) const;

    /**
     * Tests whether this bounding box intersects the specified bounding object.
     *
     * @param box The bounding box to test intersection with.
     * 
     * @return true if the specified bounding box intersects this bounding box; false otherwise.
     */
    bool intersects(const BoundingBox& box) const;

    /**
     * Tests whether this bounding box intersects the specified bounding sphere.
     *
     * @param sphere The bounding sphere to test intersection with.
     * 
     * @return true if the specified bounding sphere intersects this bounding box; false otherwise.
     */
    bool intersects(const BoundingSphere& sphere) const;

    /**
     * Tests whether this bounding box intersects the specified frustum.
     *
     * @param frustum The frustum to test intersection with.
     * 
     * @return true if this bounding sphere intersects the specified frustum; false otherwise.
     */
    bool intersects(const Frustum& frustum) const;

    /**
     * Tests whether this bounding box intersects the specified plane.
     *
     * @param plane The plane to test intersection with.
     * 
     * @return Plane::INTERSECTS_BACK INTERSECTS_BACK if this bounding box is in the negative half-space of
     *  the plane, Plane::INTERSECTS_FRONT INTERSECTS_FRONT if it is in the positive half-space of the plane;
     *  and Plane::INTERSECTS_INTERSECTING INTERSECTS_INTERSECTING if it intersects the plane.
     */
    float intersects(const Plane& plane) const;

    /**
     * Tests whether this bounding box intersects the specified ray.
     *
     * @param ray The ray to test intersection with.
     * 
     * @return The distance from the origin of the ray to this bounding box or
     *  INTERSECTS_NONE INTERSECTS_NONE if the ray does not intersect this bounding box.
     */
    float intersects(const Ray& ray) const;

    /**
     * Determines if this bounding box is empty.
     *
     * @return true if this bounding box is empty; false otherwise.
     */
    bool isEmpty() const;

    /**
     * Sets this bounding box to the smallest bounding box
     * that contains both this bounding box and the specified bounding sphere.
     *
     * @param sphere The bounding sphere to merge with.
     */
    void merge(const BoundingSphere& sphere);

    /**
     * Sets this bounding box to the smallest bounding box
     * that contains both this bounding object and the specified bounding box.
     *
     * @param box The bounding box to merge with.
     */
    void merge(const BoundingBox& box);

    /**
     * Sets this bounding box to the specified values.
     *
     * @param min The minimum point of the bounding box.
     * @param max The maximum point of the bounding box.
     */
    void set(const Vector3& min, const Vector3& max);

    /**
     * Sets this bounding box to the specified values.
     * 
     * @param minX The x coordinate of the minimum point of the bounding box.
     * @param minY The y coordinate of the minimum point of the bounding box.
     * @param minZ The z coordinate of the minimum point of the bounding box.
     * @param maxX The x coordinate of the maximum point of the bounding box.
     * @param maxY The y coordinate of the maximum point of the bounding box.
     * @param maxZ The z coordinate of the maximum point of the bounding box.
     */
    void set(float minX, float minY, float minZ, float maxX, float maxY, float maxZ);

    /**
     * Sets this bounding box to the specified bounding box.
     *
     * @param box The bounding box to set to.
     */
    void set(const BoundingBox& box);

    /**
     * Sets this box to tightly contain the specified bounding sphere.
     *
     * @param sphere The sphere to contain.
     */
    void set(const BoundingSphere& sphere);

    /**
     * Transforms the bounding box by the given transformation matrix.
     *
     * @param matrix The transformation matrix to transform by.
     */
    void transform(const Matrix& matrix);

    /**
     * Transforms this bounding box by the given matrix.
     * 
     * @param matrix The matrix to transform by.
     * @return This bounding box, after the transformation occurs.
     */
    inline BoundingBox& operator*=(const Matrix& matrix);
};

/**
 * Transforms the given bounding box by the given matrix.
 * 
 * @param matrix The matrix to transform by.
 * @param box The bounding box to transform.
 * @return The resulting transformed bounding box.
 */
inline const BoundingBox operator*(const Matrix& matrix, const BoundingBox& box);

}

#include "BoundingBox.inl"

#endif

By viewing downloads associated with this article you agree to the Terms of Service and the article's licence.

If a file you wish to view isn't highlighted, and is a text file (not binary), please let us know and we'll add colourisation support for it.

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)


Written By
India India
This member has not yet provided a Biography. Assume it's interesting and varied, and probably something to do with programming.

Comments and Discussions