2015-02-11 18:14:22 +08:00
|
|
|
/****************************************************************************
|
2015-02-25 18:05:41 +08:00
|
|
|
Copyright (C) 2013 Henry van Merode. All rights reserved.
|
2018-01-29 16:25:32 +08:00
|
|
|
Copyright (c) 2015-2016 Chukong Technologies Inc.
|
|
|
|
Copyright (c) 2017-2018 Xiamen Yaji Software Co., Ltd.
|
2021-12-25 10:04:45 +08:00
|
|
|
|
2015-02-11 18:14:22 +08:00
|
|
|
http://www.cocos2d-x.org
|
2021-12-25 10:04:45 +08:00
|
|
|
|
2015-02-11 18:14:22 +08:00
|
|
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
|
|
of this software and associated documentation files (the "Software"), to deal
|
|
|
|
in the Software without restriction, including without limitation the rights
|
|
|
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
|
|
copies of the Software, and to permit persons to whom the Software is
|
|
|
|
furnished to do so, subject to the following conditions:
|
2021-12-25 10:04:45 +08:00
|
|
|
|
2015-02-11 18:14:22 +08:00
|
|
|
The above copyright notice and this permission notice shall be included in
|
|
|
|
all copies or substantial portions of the Software.
|
2021-12-25 10:04:45 +08:00
|
|
|
|
2015-02-11 18:14:22 +08:00
|
|
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
|
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
|
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
|
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
|
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
|
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
|
|
THE SOFTWARE.
|
|
|
|
****************************************************************************/
|
|
|
|
|
|
|
|
#ifndef __CC_PU_PARTICLE_3D_PLANE_H__
|
|
|
|
#define __CC_PU_PARTICLE_3D_PLANE_H__
|
|
|
|
|
|
|
|
#include "base/CCRef.h"
|
|
|
|
#include "math/CCMath.h"
|
|
|
|
#include "3d/CCAABB.h"
|
|
|
|
#include <vector>
|
|
|
|
|
|
|
|
NS_CC_BEGIN
|
|
|
|
/** Defines a plane in 3D space.
|
|
|
|
@remarks
|
|
|
|
A plane is defined in 3D space by the equation
|
|
|
|
Ax + By + Cz + D = 0
|
|
|
|
@par
|
|
|
|
This equates to a vector (the normal of the plane, whose x, y
|
|
|
|
and z components equate to the coefficients A, B and C
|
|
|
|
respectively), and a constant (D) which is the distance along
|
|
|
|
the normal you have to go to move the plane back to the origin.
|
|
|
|
*/
|
|
|
|
class PUPlane
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
/** Default constructor - sets everything to 0.
|
2021-12-25 10:04:45 +08:00
|
|
|
*/
|
|
|
|
PUPlane();
|
|
|
|
PUPlane(const PUPlane& rhs);
|
2015-02-11 18:14:22 +08:00
|
|
|
/** Construct a plane through a normal, and a distance to move the plane along the normal.*/
|
2021-12-25 10:04:45 +08:00
|
|
|
PUPlane(const Vec3& rkNormal, float fConstant);
|
|
|
|
/** Construct a plane using the 4 constants directly **/
|
|
|
|
PUPlane(float a, float b, float c, float d);
|
|
|
|
PUPlane(const Vec3& rkNormal, const Vec3& rkPoint);
|
|
|
|
PUPlane(const Vec3& rkPoint0, const Vec3& rkPoint1, const Vec3& rkPoint2);
|
2015-02-11 18:14:22 +08:00
|
|
|
|
|
|
|
/** The "positive side" of the plane is the half space to which the
|
|
|
|
plane normal points. The "negative side" is the other half
|
|
|
|
space. The flag "no side" indicates the plane itself.
|
|
|
|
*/
|
|
|
|
enum Side
|
|
|
|
{
|
|
|
|
NO_SIDE,
|
|
|
|
POSITIVE_SIDE,
|
|
|
|
NEGATIVE_SIDE,
|
|
|
|
BOTH_SIDE
|
|
|
|
};
|
|
|
|
|
2021-12-25 10:04:45 +08:00
|
|
|
// Side getSide (const Vec3& rkPoint) const;
|
2015-02-11 18:14:22 +08:00
|
|
|
|
|
|
|
///**
|
2021-12-25 10:04:45 +08:00
|
|
|
// Returns the side where the alignedBox is. The flag BOTH_SIDE indicates an intersecting box.
|
|
|
|
// One corner ON the plane is sufficient to consider the box and the plane intersecting.
|
2015-02-11 18:14:22 +08:00
|
|
|
//*/
|
2021-12-25 10:04:45 +08:00
|
|
|
// Side getSide (const AABB& rkBox) const;
|
2015-02-11 18:14:22 +08:00
|
|
|
|
|
|
|
///** Returns which side of the plane that the given box lies on.
|
|
|
|
// The box is defined as centre/half-size pairs for effectively.
|
|
|
|
//@param centre The centre of the box.
|
|
|
|
//@param halfSize The half-size of the box.
|
|
|
|
//@return
|
|
|
|
// POSITIVE_SIDE if the box complete lies on the "positive side" of the plane,
|
|
|
|
// NEGATIVE_SIDE if the box complete lies on the "negative side" of the plane,
|
|
|
|
// and BOTH_SIDE if the box intersects the plane.
|
|
|
|
//*/
|
2021-12-25 10:04:45 +08:00
|
|
|
// Side getSide (const Vec3& centre, const Vec3& halfSize) const;
|
2015-02-11 18:14:22 +08:00
|
|
|
|
|
|
|
/** This is a pseudodistance. The sign of the return value is
|
|
|
|
positive if the point is on the positive side of the plane,
|
|
|
|
negative if the point is on the negative side, and zero if the
|
|
|
|
point is on the plane.
|
|
|
|
@par
|
|
|
|
The absolute value of the return value is the true distance only
|
|
|
|
when the plane normal is a unit length vector.
|
|
|
|
*/
|
2021-12-25 10:04:45 +08:00
|
|
|
float getDistance(const Vec3& rkPoint) const;
|
2015-02-11 18:14:22 +08:00
|
|
|
|
|
|
|
/** Redefine this plane based on 3 points. */
|
2021-12-25 10:04:45 +08:00
|
|
|
void redefine(const Vec3& rkPoint0, const Vec3& rkPoint1, const Vec3& rkPoint2);
|
2015-02-11 18:14:22 +08:00
|
|
|
|
2021-12-25 10:04:45 +08:00
|
|
|
/** Redefine this plane based on a normal and a point. */
|
|
|
|
void redefine(const Vec3& rkNormal, const Vec3& rkPoint);
|
2015-02-11 18:14:22 +08:00
|
|
|
|
2021-12-25 10:04:45 +08:00
|
|
|
/** Project a vector onto the plane.
|
|
|
|
@remarks This gives you the element of the input vector that is perpendicular
|
|
|
|
to the normal of the plane. You can get the element which is parallel
|
|
|
|
to the normal of the plane by subtracting the result of this method
|
|
|
|
from the original vector, since parallel + perpendicular = original.
|
|
|
|
@param v The input vector
|
|
|
|
*/
|
|
|
|
Vec3 projectVector(const Vec3& v) const;
|
2015-02-11 18:14:22 +08:00
|
|
|
|
|
|
|
/** Normalises the plane.
|
|
|
|
@remarks
|
|
|
|
This method normalises the plane's normal and the length scale of d
|
|
|
|
is as well.
|
|
|
|
@note
|
|
|
|
This function will not crash for zero-sized vectors, but there
|
|
|
|
will be no changes made to their components.
|
|
|
|
@return The previous length of the plane's normal.
|
|
|
|
*/
|
2019-07-22 09:38:46 +08:00
|
|
|
float normalize();
|
2015-02-11 18:14:22 +08:00
|
|
|
|
2021-12-25 10:04:45 +08:00
|
|
|
Vec3 normal;
|
2015-02-11 18:14:22 +08:00
|
|
|
float d;
|
|
|
|
|
|
|
|
/// Comparison operator
|
2021-12-25 10:04:45 +08:00
|
|
|
bool operator==(const PUPlane& rhs) const { return (rhs.d == d && rhs.normal == normal); }
|
|
|
|
bool operator!=(const PUPlane& rhs) const { return (rhs.d != d || rhs.normal != normal); }
|
2015-02-11 18:14:22 +08:00
|
|
|
};
|
|
|
|
|
|
|
|
typedef std::vector<PUPlane> PlaneList;
|
|
|
|
NS_CC_END
|
|
|
|
|
|
|
|
#endif
|