123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520 |
- /****************************************************************************
- Copyright (c) 2015-2017 Chukong Technologies Inc.
-
- http://www.cocos2d-x.org
-
- 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:
-
- The above copyright notice and this permission notice shall be included in
- all copies or substantial portions of the Software.
-
- 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 __PHYSICS_3D_OBJECT_H__
- #define __PHYSICS_3D_OBJECT_H__
- #include "math/CCMath.h"
- #include "base/CCRef.h"
- #include "base/ccConfig.h"
- #include <vector>
- #if CC_USE_3D_PHYSICS
- #if (CC_ENABLE_BULLET_INTEGRATION)
- class btCollisionShape;
- class btRigidBody;
- class btPersistentManifold;
- class btGhostObject;
- NS_CC_BEGIN
- /**
- * @addtogroup _3d
- * @{
- */
- class Physics3DShape;
- class Physics3DWorld;
- class Physics3DConstraint;
- class Physics3DObject;
- /**
- * @brief The collision information of Physics3DObject.
- */
- struct CC_DLL Physics3DCollisionInfo
- {
- struct CollisionPoint
- {
- Vec3 localPositionOnA;
- Vec3 worldPositionOnA;
- Vec3 localPositionOnB;
- Vec3 worldPositionOnB;
- Vec3 worldNormalOnB;
- };
- Physics3DObject *objA;
- Physics3DObject *objB;
- std::vector<CollisionPoint> collisionPointList;
- };
- /**
- * @brief Inherit from Ref, base class
- */
- class CC_DLL Physics3DObject : public Ref
- {
- public:
- typedef std::function<void(const Physics3DCollisionInfo &ci)> CollisionCallbackFunc;
- enum class PhysicsObjType
- {
- UNKNOWN = 0,
- RIGID_BODY,
- COLLIDER,
- };
-
- /** Get the Physics3DObject Type. */
- virtual PhysicsObjType getObjType() const { return _type; }
-
- /** Set the user data. */
- void setUserData(void* userData) { _userData = userData; }
-
- /** Get the user data. */
- void* getUserData() const { return _userData; }
-
- /** Internal method. Set the pointer of Physics3DWorld. */
- void setPhysicsWorld(Physics3DWorld* world) { _physicsWorld = world; };
-
- /** Get the pointer of Physics3DWorld. */
- Physics3DWorld* getPhysicsWorld() const { return _physicsWorld; }
-
- /** Get the world matrix of Physics3DObject. */
- virtual cocos2d::Mat4 getWorldTransform() const = 0;
- /** Set the collision callback function. */
- void setCollisionCallback(const CollisionCallbackFunc &func) { _collisionCallbackFunc = func; };
- /** Get the collision callback function. */
- const CollisionCallbackFunc& getCollisionCallback() const { return _collisionCallbackFunc; }
- /** Check has collision callback function. */
- bool needCollisionCallback() { return _collisionCallbackFunc != nullptr; };
- /** Set the mask of Physics3DObject. */
- void setMask(unsigned int mask) { _mask = mask; };
- /** Get the mask of Physics3DObject. */
- unsigned int getMask() const { return _mask; };
-
- CC_CONSTRUCTOR_ACCESS:
- Physics3DObject()
- : _type(PhysicsObjType::UNKNOWN)
- , _userData(nullptr)
- , _isEnabled(true)
- , _physicsWorld(nullptr)
- , _mask(-1)
- {
-
- }
- virtual ~Physics3DObject(){}
-
- protected:
- bool _isEnabled;
- PhysicsObjType _type;
- void* _userData;
- Physics3DWorld* _physicsWorld;
- CollisionCallbackFunc _collisionCallbackFunc;
- unsigned int _mask;
- };
- /**
- * @brief The description of Physics3DRigidBody.
- */
- struct CC_DLL Physics3DRigidBodyDes
- {
- float mass; //Note: mass equals zero means static, default 0
- cocos2d::Vec3 localInertia; //default (0, 0, 0)
- Physics3DShape* shape;
- cocos2d::Mat4 originalTransform;
- bool disableSleep; //it is always active if disabled
-
- Physics3DRigidBodyDes()
- : mass(0.f)
- , localInertia(0.f, 0.f, 0.f)
- , shape(nullptr)
- , disableSleep(false)
- {
-
- }
- };
- /**
- * @brief Inherit from Physics3DObject, the main class for rigid body objects
- */
- class CC_DLL Physics3DRigidBody : public Physics3DObject
- {
- friend class Physics3DWorld;
- public:
-
- /**
- * Creates a Physics3DRigidBody with Physics3DRigidBody.
- *
- * @return An autoreleased Physics3DRigidBody object.
- */
- static Physics3DRigidBody* create(Physics3DRigidBodyDes* info);
-
- /** Get the pointer of btRigidBody. */
- btRigidBody* getRigidBody() const { return _btRigidBody; }
-
- /**
- * Apply a force.
- *
- * @param force the value of the force
- * @param rel_pos the position of the force
- */
- void applyForce(const cocos2d::Vec3& force, const cocos2d::Vec3& rel_pos);
- /**
- * Apply a central force.
- *
- * @param force the value of the force
- */
- void applyCentralForce(const cocos2d::Vec3& force);
- /**
- * Apply a central impulse.
- *
- * @param impulse the value of the impulse
- */
- void applyCentralImpulse(const cocos2d::Vec3& impulse);
- /**
- * Apply a torque.
- *
- * @param torque the value of the torque
- */
- void applyTorque(const cocos2d::Vec3& torque);
- /**
- * Apply a torque impulse.
- *
- * @param torque the value of the torque
- */
- void applyTorqueImpulse(const cocos2d::Vec3& torque);
- /**
- * Apply a impulse.
- *
- * @param impulse the value of the impulse
- * @param rel_pos the position of the impulse
- */
- void applyImpulse(const cocos2d::Vec3& impulse, const cocos2d::Vec3& rel_pos);
- /** Damps the velocity, using the given linearDamping and angularDamping. */
- void applyDamping(float timeStep);
- /** Set the linear velocity. */
- void setLinearVelocity(const cocos2d::Vec3& lin_vel);
- /** Get the linear velocity. */
- cocos2d::Vec3 getLinearVelocity() const;
- /** Set the linear factor. */
- void setLinearFactor(const cocos2d::Vec3& linearFactor);
- /** Get the linear factor. */
- cocos2d::Vec3 getLinearFactor() const;
- /** Set the angular factor. */
- void setAngularFactor(const cocos2d::Vec3& angFac);
- /** Set the angular factor, use unified factor. */
- void setAngularFactor(float angFac);
- /** Get the angular factor. */
- cocos2d::Vec3 getAngularFactor() const;
- /** Set the angular velocity. */
- void setAngularVelocity(const cocos2d::Vec3& ang_vel);
- /** Get the angular velocity. */
- cocos2d::Vec3 getAngularVelocity() const;
- /** Set the center of mass. */
- void setCenterOfMassTransform(const cocos2d::Mat4& xform);
- /** Get the center of mass. */
- cocos2d::Mat4 getCenterOfMassTransform() const;
- /** Set linear damping and angular damping. */
- void setDamping(float lin_damping, float ang_damping);
- /** Get linear damping. */
- float getLinearDamping() const;
- /** Get angular damping. */
- float getAngularDamping() const;
- /** Set the acceleration. */
- void setGravity(const cocos2d::Vec3& acceleration);
- /** Get the acceleration. */
- cocos2d::Vec3 getGravity() const;
- /** Set the inverse of local inertia. */
- void setInvInertiaDiagLocal(const cocos2d::Vec3& diagInvInertia);
- /** Get the inverse of local inertia. */
- cocos2d::Vec3 getInvInertiaDiagLocal() const;
- /** Set mass and inertia. */
- void setMassProps(float mass, const cocos2d::Vec3& inertia);
- /** Get inverse of mass. */
- float getInvMass() const;
- /** Get total force. */
- cocos2d::Vec3 getTotalForce() const;
- /** Get total torque. */
- cocos2d::Vec3 getTotalTorque() const;
- /** Set restitution. */
- void setRestitution(float rest);
- /** Get restitution. */
- float getRestitution() const;
- /** Set friction. */
- void setFriction(float frict);
- /** Get friction. */
- float getFriction() const;
- /** Set rolling friction. */
- void setRollingFriction(float frict);
- /** Get rolling friction. */
- float getRollingFriction() const;
- /** Set hit friction. */
- void setHitFraction(float hitFraction);
- /** Get hit friction. */
- float getHitFraction() const;
- /** Set motion threshold, don't do continuous collision detection if the motion (in one step) is less then ccdMotionThreshold */
- void setCcdMotionThreshold(float ccdMotionThreshold);
- /** Get motion threshold. */
- float getCcdMotionThreshold() const;
- /** Set swept sphere radius. */
- void setCcdSweptSphereRadius(float radius);
- /** Get swept sphere radius. */
- float getCcdSweptSphereRadius() const;
-
- /** Set kinematic object. */
- void setKinematic(bool kinematic);
-
- /** Check rigid body is kinematic object. */
- bool isKinematic() const;
-
- /** override. */
- virtual cocos2d::Mat4 getWorldTransform() const override;
-
- /** Get constraint by index. */
- Physics3DConstraint* getConstraint(unsigned int idx) const;
- /** Get the total number of constraints. */
- unsigned int getConstraintCount() const;
-
- /** Active or inactive. */
- void setActive(bool active);
- CC_CONSTRUCTOR_ACCESS:
- Physics3DRigidBody();
- virtual ~Physics3DRigidBody();
-
- bool init(Physics3DRigidBodyDes* info);
-
- void addConstraint(Physics3DConstraint *constraint);
- void removeConstraint(Physics3DConstraint *constraint);
- void removeConstraint(unsigned int idx);
-
- protected:
- btRigidBody* _btRigidBody;
- Physics3DShape *_physics3DShape;
- std::vector<Physics3DConstraint *> _constraintList;
- };
- /**
- * @brief The description of Physics3DCollider.
- */
- struct CC_DLL Physics3DColliderDes
- {
- /**shape pointer*/
- Physics3DShape* shape;
- /**original world Transform*/
- cocos2d::Mat4 originalTransform;
- /**Is collider a trigger?*/
- bool isTrigger;
- /**the friction*/
- float friction;
- /**the rolling friction*/
- float rollingFriction;
- /**the restitution*/
- float restitution;
- /**the hit fraction*/
- float hitFraction;
- /**the swept sphere radius*/
- float ccdSweptSphereRadius;
- /**the motion threshold*/
- float ccdMotionThreshold;
-
- Physics3DColliderDes()
- : shape(nullptr)
- , isTrigger(false)
- , friction(0.5f)
- , rollingFriction(0.0f)
- , restitution(0.0f)
- , hitFraction(1.0f)
- , ccdSweptSphereRadius(0.0f)
- , ccdMotionThreshold(0.0f)
- {
-
- }
- };
- /**
- * @brief Inherit from Physics3DObject, the main class for Colliders.
- */
- class CC_DLL Physics3DCollider : public Physics3DObject
- {
- public:
- /**
- * Creates a Physics3DCollider with Physics3DColliderDes.
- *
- * @return An autoreleased Physics3DCollider object.
- */
- static Physics3DCollider* create(Physics3DColliderDes *info);
- /** Get the pointer of btGhostObject.
- * @return The pointer of btGhostObject.
- */
- btGhostObject* getGhostObject() const { return _btGhostObject; }
- /** Set trigger.
- * @param isTrigger Is a trigger.
- */
- void setTrigger(bool isTrigger);
- /** Check is a trigger.
- * @return Is a trigger.
- */
- bool isTrigger() const;
- /** Set restitution.
- * @param rest The restitution.
- */
- void setRestitution(float rest);
- /** Get restitution.
- * @return The restitution.
- */
- float getRestitution() const;
- /** Set friction.
- * @param frict The friction.
- */
- void setFriction(float frict);
- /** Get friction.
- * @return The friction.
- */
- float getFriction() const;
- /** Set rolling friction.
- * @param frict The rolling friction.
- */
- void setRollingFriction(float frict);
- /** Get rolling friction.
- * @return The rolling friction.
- */
- float getRollingFriction() const;
- /** Set hit friction.
- * @param hitFraction The hit friction.
- */
- void setHitFraction(float hitFraction);
- /** Get hit friction.
- * @return The hit friction.
- */
- float getHitFraction() const;
- /** Set motion threshold, don't do continuous collision detection if the motion (in one step) is less then ccdMotionThreshold.
- * @param ccdMotionThreshold The motion threshold.
- */
- void setCcdMotionThreshold(float ccdMotionThreshold);
- /** Get motion threshold.
- * @return The motion threshold.
- */
- float getCcdMotionThreshold() const;
- /** Set swept sphere radius.
- * @param radius The swept sphere radius.
- */
- void setCcdSweptSphereRadius(float radius);
- /** Get swept sphere radius.
- * @return The swept sphere radius.
- */
- float getCcdSweptSphereRadius() const;
- /** override. */
- virtual cocos2d::Mat4 getWorldTransform() const;
- /** Set a callback when trigger enter. */
- std::function<void(Physics3DObject *otherObject)> onTriggerEnter;
- /** Set a callback when trigger exit. */
- std::function<void(Physics3DObject *otherObject)> onTriggerExit;
- CC_CONSTRUCTOR_ACCESS :
- Physics3DCollider();
- virtual ~Physics3DCollider();
- bool init(Physics3DColliderDes *info);
- protected:
- btGhostObject *_btGhostObject;
- Physics3DShape *_physics3DShape;
- };
- // end of 3d group
- /// @}
- NS_CC_END
- #endif // CC_ENABLE_BULLET_INTEGRATION
- #endif //CC_USE_3D_PHYSICS
- #endif // __PHYSICS_3D_OBJECT_H__
|