From 31dd59d21201b6abaa5e932bc806b3f7f1204f89 Mon Sep 17 00:00:00 2001 From: Andrew Meadows Date: Fri, 4 May 2018 17:11:14 -0700 Subject: [PATCH] double bits in collision groups --- interface/src/avatar/AvatarMotionState.cpp | 2 +- interface/src/avatar/AvatarMotionState.h | 2 +- interface/src/avatar/MyAvatar.h | 2 +- libraries/entities/src/EntityItem.cpp | 10 ++-- libraries/entities/src/EntityItem.h | 6 +-- libraries/physics/src/CharacterController.cpp | 14 +++--- libraries/physics/src/CharacterController.h | 4 +- .../physics/src/CharacterGhostObject.cpp | 4 +- libraries/physics/src/CharacterGhostObject.h | 8 ++-- libraries/physics/src/EntityMotionState.cpp | 2 +- libraries/physics/src/EntityMotionState.h | 2 +- libraries/physics/src/ObjectMotionState.h | 2 +- libraries/physics/src/PhysicsEngine.cpp | 2 +- libraries/shared/src/PhysicsCollisionGroups.h | 46 +++++++++---------- libraries/shared/src/PhysicsHelpers.cpp | 2 +- libraries/shared/src/PhysicsHelpers.h | 2 +- 16 files changed, 55 insertions(+), 55 deletions(-) diff --git a/interface/src/avatar/AvatarMotionState.cpp b/interface/src/avatar/AvatarMotionState.cpp index beb7e34439..6fc1bd8196 100644 --- a/interface/src/avatar/AvatarMotionState.cpp +++ b/interface/src/avatar/AvatarMotionState.cpp @@ -160,7 +160,7 @@ QUuid AvatarMotionState::getSimulatorID() const { } // virtual -void AvatarMotionState::computeCollisionGroupAndMask(int16_t& group, int16_t& mask) const { +void AvatarMotionState::computeCollisionGroupAndMask(int32_t& group, int32_t& mask) const { group = BULLET_COLLISION_GROUP_OTHER_AVATAR; mask = Physics::getDefaultCollisionMask(group); } diff --git a/interface/src/avatar/AvatarMotionState.h b/interface/src/avatar/AvatarMotionState.h index 73fb853312..2738aba8ee 100644 --- a/interface/src/avatar/AvatarMotionState.h +++ b/interface/src/avatar/AvatarMotionState.h @@ -65,7 +65,7 @@ public: void addDirtyFlags(uint32_t flags) { _dirtyFlags |= flags; } - virtual void computeCollisionGroupAndMask(int16_t& group, int16_t& mask) const override; + virtual void computeCollisionGroupAndMask(int32_t& group, int32_t& mask) const override; virtual float getMass() const override; diff --git a/interface/src/avatar/MyAvatar.h b/interface/src/avatar/MyAvatar.h index fa6a675d99..a1eb29b38b 100644 --- a/interface/src/avatar/MyAvatar.h +++ b/interface/src/avatar/MyAvatar.h @@ -1402,7 +1402,7 @@ private: SharedSoundPointer _collisionSound; MyCharacterController _characterController; - int16_t _previousCollisionGroup { BULLET_COLLISION_GROUP_MY_AVATAR }; + int32_t _previousCollisionGroup { BULLET_COLLISION_GROUP_MY_AVATAR }; AvatarWeakPointer _lookAtTargetAvatar; glm::vec3 _targetAvatarPosition; diff --git a/libraries/entities/src/EntityItem.cpp b/libraries/entities/src/EntityItem.cpp index 645c310062..ec8ca76258 100644 --- a/libraries/entities/src/EntityItem.cpp +++ b/libraries/entities/src/EntityItem.cpp @@ -1914,7 +1914,7 @@ void EntityItem::setCreated(quint64 value) { }); } -void EntityItem::computeCollisionGroupAndFinalMask(int16_t& group, int16_t& mask) const { +void EntityItem::computeCollisionGroupAndFinalMask(int32_t& group, int32_t& mask) const { if (_collisionless) { group = BULLET_COLLISION_GROUP_COLLISIONLESS; mask = 0; @@ -1927,7 +1927,7 @@ void EntityItem::computeCollisionGroupAndFinalMask(int16_t& group, int16_t& mask group = BULLET_COLLISION_GROUP_STATIC; } - uint8_t userMask = getCollisionMask(); + uint16_t userMask = getCollisionMask(); if ((bool)(userMask & USER_COLLISION_GROUP_MY_AVATAR) != (bool)(userMask & USER_COLLISION_GROUP_OTHER_AVATAR)) { @@ -1941,7 +1941,7 @@ void EntityItem::computeCollisionGroupAndFinalMask(int16_t& group, int16_t& mask if ((bool)(_flags & Simulation::SPECIAL_FLAGS_NO_BOOTSTRAPPING)) { userMask &= ~USER_COLLISION_GROUP_MY_AVATAR; } - mask = Physics::getDefaultCollisionMask(group) & (int16_t)(userMask); + mask = Physics::getDefaultCollisionMask(group) & (int32_t)(userMask); } } @@ -2795,8 +2795,8 @@ bool EntityItem::getCollisionless() const { return result; } -uint8_t EntityItem::getCollisionMask() const { - uint8_t result; +uint16_t EntityItem::getCollisionMask() const { + uint16_t result; withReadLock([&] { result = _collisionMask; }); diff --git a/libraries/entities/src/EntityItem.h b/libraries/entities/src/EntityItem.h index edd4dcbd34..431c87cf68 100644 --- a/libraries/entities/src/EntityItem.h +++ b/libraries/entities/src/EntityItem.h @@ -288,10 +288,10 @@ public: bool getCollisionless() const; void setCollisionless(bool value); - uint8_t getCollisionMask() const; + uint16_t getCollisionMask() const; void setCollisionMask(uint8_t value); - void computeCollisionGroupAndFinalMask(int16_t& group, int16_t& mask) const; + void computeCollisionGroupAndFinalMask(int32_t& group, int32_t& mask) const; bool getDynamic() const; void setDynamic(bool value); @@ -580,7 +580,7 @@ protected: bool _visible { ENTITY_ITEM_DEFAULT_VISIBLE }; bool _canCastShadow{ ENTITY_ITEM_DEFAULT_CAN_CAST_SHADOW }; bool _collisionless { ENTITY_ITEM_DEFAULT_COLLISIONLESS }; - uint8_t _collisionMask { ENTITY_COLLISION_MASK_DEFAULT }; + uint16_t _collisionMask { ENTITY_COLLISION_MASK_DEFAULT }; bool _dynamic { ENTITY_ITEM_DEFAULT_DYNAMIC }; bool _locked { ENTITY_ITEM_DEFAULT_LOCKED }; QString _userData { ENTITY_ITEM_DEFAULT_USER_DATA }; diff --git a/libraries/physics/src/CharacterController.cpp b/libraries/physics/src/CharacterController.cpp index 9b6e9fe7a0..64eda975cf 100755 --- a/libraries/physics/src/CharacterController.cpp +++ b/libraries/physics/src/CharacterController.cpp @@ -109,7 +109,7 @@ void CharacterController::setDynamicsWorld(btDynamicsWorld* world) { } _dynamicsWorld = nullptr; } - int16_t collisionGroup = computeCollisionGroup(); + int32_t collisionGroup = computeCollisionGroup(); if (_rigidBody) { updateMassProperties(); } @@ -325,7 +325,7 @@ void CharacterController::playerStep(btCollisionWorld* collisionWorld, btScalar _ghost.setWorldTransform(_rigidBody->getWorldTransform()); } -void CharacterController::jump() { +void CharacterController::jump(const btVector3& dir) { _pendingFlags |= PENDING_FLAG_JUMP; } @@ -352,7 +352,7 @@ static const char* stateToStr(CharacterController::State state) { #endif // #ifdef DEBUG_STATE_CHANGE void CharacterController::updateCurrentGravity() { - int16_t collisionGroup = computeCollisionGroup(); + int32_t collisionGroup = computeCollisionGroup(); if (_state == State::Hover || collisionGroup == BULLET_COLLISION_GROUP_COLLISIONLESS) { _currentGravity = 0.0f; } else { @@ -433,7 +433,7 @@ void CharacterController::setCollisionless(bool collisionless) { } } -int16_t CharacterController::computeCollisionGroup() const { +int32_t CharacterController::computeCollisionGroup() const { if (_collisionless) { return _collisionlessAllowed ? BULLET_COLLISION_GROUP_COLLISIONLESS : BULLET_COLLISION_GROUP_MY_AVATAR; } else { @@ -446,7 +446,7 @@ void CharacterController::handleChangedCollisionGroup() { // ATM the easiest way to update collision groups is to remove/re-add the RigidBody if (_dynamicsWorld) { _dynamicsWorld->removeRigidBody(_rigidBody); - int16_t collisionGroup = computeCollisionGroup(); + int32_t collisionGroup = computeCollisionGroup(); _dynamicsWorld->addRigidBody(_rigidBody, collisionGroup, BULLET_COLLISION_MASK_MY_AVATAR); } _pendingFlags &= ~PENDING_FLAG_UPDATE_COLLISION_GROUP; @@ -538,7 +538,7 @@ void CharacterController::applyMotor(int index, btScalar dt, btVector3& worldVel btScalar angle = motor.rotation.getAngle(); btVector3 velocity = worldVelocity.rotate(axis, -angle); - int16_t collisionGroup = computeCollisionGroup(); + int32_t collisionGroup = computeCollisionGroup(); if (collisionGroup == BULLET_COLLISION_GROUP_COLLISIONLESS || _state == State::Hover || motor.hTimescale == motor.vTimescale) { // modify velocity @@ -679,7 +679,7 @@ void CharacterController::updateState() { btVector3 rayStart = _position; btScalar rayLength = _radius; - int16_t collisionGroup = computeCollisionGroup(); + int32_t collisionGroup = computeCollisionGroup(); if (collisionGroup == BULLET_COLLISION_GROUP_MY_AVATAR) { rayLength += _scaleFactor * DEFAULT_AVATAR_FALL_HEIGHT; } else { diff --git a/libraries/physics/src/CharacterController.h b/libraries/physics/src/CharacterController.h index 96e479dcad..50db2bea12 100644 --- a/libraries/physics/src/CharacterController.h +++ b/libraries/physics/src/CharacterController.h @@ -70,7 +70,7 @@ public: virtual void preStep(btCollisionWorld *collisionWorld) override; virtual void playerStep(btCollisionWorld *collisionWorld, btScalar dt) override; virtual bool canJump() const override { assert(false); return false; } // never call this - virtual void jump() override; + virtual void jump(const btVector3& dir = btVector3(0.0f, 0.0f, 0.0f)) override; virtual bool onGround() const override; void clearMotors(); @@ -120,7 +120,7 @@ public: bool isStuck() const { return _isStuck; } void setCollisionless(bool collisionless); - int16_t computeCollisionGroup() const; + int32_t computeCollisionGroup() const; void handleChangedCollisionGroup(); bool getRigidBodyLocation(glm::vec3& avatarRigidBodyPosition, glm::quat& avatarRigidBodyRotation); diff --git a/libraries/physics/src/CharacterGhostObject.cpp b/libraries/physics/src/CharacterGhostObject.cpp index 331485dd01..a771a52384 100755 --- a/libraries/physics/src/CharacterGhostObject.cpp +++ b/libraries/physics/src/CharacterGhostObject.cpp @@ -29,13 +29,13 @@ CharacterGhostObject::~CharacterGhostObject() { } } -void CharacterGhostObject::setCollisionGroupAndMask(int16_t group, int16_t mask) { +void CharacterGhostObject::setCollisionGroupAndMask(int32_t group, int32_t mask) { _collisionFilterGroup = group; _collisionFilterMask = mask; // TODO: if this probe is in the world reset ghostObject overlap cache } -void CharacterGhostObject::getCollisionGroupAndMask(int16_t& group, int16_t& mask) const { +void CharacterGhostObject::getCollisionGroupAndMask(int32_t& group, int32_t& mask) const { group = _collisionFilterGroup; mask = _collisionFilterMask; } diff --git a/libraries/physics/src/CharacterGhostObject.h b/libraries/physics/src/CharacterGhostObject.h index 1e4625c6f6..44ab5c938a 100755 --- a/libraries/physics/src/CharacterGhostObject.h +++ b/libraries/physics/src/CharacterGhostObject.h @@ -28,8 +28,8 @@ public: CharacterGhostObject() { } ~CharacterGhostObject(); - void setCollisionGroupAndMask(int16_t group, int16_t mask); - void getCollisionGroupAndMask(int16_t& group, int16_t& mask) const; + void setCollisionGroupAndMask(int32_t group, int32_t mask); + void getCollisionGroupAndMask(int32_t& group, int32_t& mask) const; void setRadiusAndHalfHeight(btScalar radius, btScalar halfHeight); void setUpDirection(const btVector3& up); @@ -54,8 +54,8 @@ protected: btScalar _radius { 0.0f }; btConvexHullShape* _characterShape { nullptr }; // input, shape of character CharacterGhostShape* _ghostShape { nullptr }; // internal, shape whose Aabb is used for overlap cache - int16_t _collisionFilterGroup { 0 }; - int16_t _collisionFilterMask { 0 }; + int32_t _collisionFilterGroup { 0 }; + int32_t _collisionFilterMask { 0 }; bool _inWorld { false }; // internal, was added to world }; diff --git a/libraries/physics/src/EntityMotionState.cpp b/libraries/physics/src/EntityMotionState.cpp index 7a0ead3e0d..30bbcd1fb8 100644 --- a/libraries/physics/src/EntityMotionState.cpp +++ b/libraries/physics/src/EntityMotionState.cpp @@ -779,7 +779,7 @@ QString EntityMotionState::getName() const { } // virtual -void EntityMotionState::computeCollisionGroupAndMask(int16_t& group, int16_t& mask) const { +void EntityMotionState::computeCollisionGroupAndMask(int32_t& group, int32_t& mask) const { _entity->computeCollisionGroupAndFinalMask(group, mask); } diff --git a/libraries/physics/src/EntityMotionState.h b/libraries/physics/src/EntityMotionState.h index 376cc5afe2..603130b5ff 100644 --- a/libraries/physics/src/EntityMotionState.h +++ b/libraries/physics/src/EntityMotionState.h @@ -84,7 +84,7 @@ public: virtual QString getName() const override; - virtual void computeCollisionGroupAndMask(int16_t& group, int16_t& mask) const override; + virtual void computeCollisionGroupAndMask(int32_t& group, int32_t& mask) const override; bool shouldSendBid(); bool isLocallyOwned() const override; diff --git a/libraries/physics/src/ObjectMotionState.h b/libraries/physics/src/ObjectMotionState.h index e1cf5a4285..24dd655342 100644 --- a/libraries/physics/src/ObjectMotionState.h +++ b/libraries/physics/src/ObjectMotionState.h @@ -154,7 +154,7 @@ public: virtual QString getName() const { return ""; } - virtual void computeCollisionGroupAndMask(int16_t& group, int16_t& mask) const = 0; + virtual void computeCollisionGroupAndMask(int32_t& group, int32_t& mask) const = 0; bool isActive() const { return _body ? _body->isActive() : false; } diff --git a/libraries/physics/src/PhysicsEngine.cpp b/libraries/physics/src/PhysicsEngine.cpp index 83ffa21a55..9aab27c3e9 100644 --- a/libraries/physics/src/PhysicsEngine.cpp +++ b/libraries/physics/src/PhysicsEngine.cpp @@ -148,7 +148,7 @@ void PhysicsEngine::addObjectToDynamicsWorld(ObjectMotionState* motionState) { body->setFlags(BT_DISABLE_WORLD_GRAVITY); motionState->updateBodyMaterialProperties(); - int16_t group, mask; + int32_t group, mask; motionState->computeCollisionGroupAndMask(group, mask); _dynamicsWorld->addRigidBody(body, group, mask); diff --git a/libraries/shared/src/PhysicsCollisionGroups.h b/libraries/shared/src/PhysicsCollisionGroups.h index edec61dc67..9d99ec3532 100644 --- a/libraries/shared/src/PhysicsCollisionGroups.h +++ b/libraries/shared/src/PhysicsCollisionGroups.h @@ -34,13 +34,13 @@ enum CollisionFilterGroups { * */ -const int16_t BULLET_COLLISION_GROUP_STATIC = 1 << 0; -const int16_t BULLET_COLLISION_GROUP_DYNAMIC = 1 << 1; -const int16_t BULLET_COLLISION_GROUP_KINEMATIC = 1 << 2; -const int16_t BULLET_COLLISION_GROUP_MY_AVATAR = 1 << 3; -const int16_t BULLET_COLLISION_GROUP_OTHER_AVATAR = 1 << 4; +const int32_t BULLET_COLLISION_GROUP_STATIC = 1 << 0; +const int32_t BULLET_COLLISION_GROUP_DYNAMIC = 1 << 1; +const int32_t BULLET_COLLISION_GROUP_KINEMATIC = 1 << 2; +const int32_t BULLET_COLLISION_GROUP_MY_AVATAR = 1 << 3; +const int32_t BULLET_COLLISION_GROUP_OTHER_AVATAR = 1 << 4; // ... -const int16_t BULLET_COLLISION_GROUP_COLLISIONLESS = 1 << 14; +const int32_t BULLET_COLLISION_GROUP_COLLISIONLESS = 1 << 31; /* Note: In order for objectA to collide with objectB at the filter stage @@ -48,21 +48,21 @@ const int16_t BULLET_COLLISION_GROUP_COLLISIONLESS = 1 << 14; */ // the default collision mask is: collides with everything except collisionless -const int16_t BULLET_COLLISION_MASK_DEFAULT = ~ BULLET_COLLISION_GROUP_COLLISIONLESS; +const int32_t BULLET_COLLISION_MASK_DEFAULT = ~ BULLET_COLLISION_GROUP_COLLISIONLESS; // STATIC does not collide with itself (as optimization of physics simulation) -const int16_t BULLET_COLLISION_MASK_STATIC = ~ (BULLET_COLLISION_GROUP_COLLISIONLESS | BULLET_COLLISION_GROUP_KINEMATIC | BULLET_COLLISION_GROUP_STATIC); +const int32_t BULLET_COLLISION_MASK_STATIC = ~ (BULLET_COLLISION_GROUP_COLLISIONLESS | BULLET_COLLISION_GROUP_KINEMATIC | BULLET_COLLISION_GROUP_STATIC); -const int16_t BULLET_COLLISION_MASK_DYNAMIC = BULLET_COLLISION_MASK_DEFAULT; -const int16_t BULLET_COLLISION_MASK_KINEMATIC = BULLET_COLLISION_MASK_STATIC; +const int32_t BULLET_COLLISION_MASK_DYNAMIC = BULLET_COLLISION_MASK_DEFAULT; +const int32_t BULLET_COLLISION_MASK_KINEMATIC = BULLET_COLLISION_MASK_STATIC; // MY_AVATAR does not collide with itself -const int16_t BULLET_COLLISION_MASK_MY_AVATAR = ~(BULLET_COLLISION_GROUP_COLLISIONLESS | BULLET_COLLISION_GROUP_MY_AVATAR); +const int32_t BULLET_COLLISION_MASK_MY_AVATAR = ~(BULLET_COLLISION_GROUP_COLLISIONLESS | BULLET_COLLISION_GROUP_MY_AVATAR); -const int16_t BULLET_COLLISION_MASK_OTHER_AVATAR = BULLET_COLLISION_MASK_DEFAULT; +const int32_t BULLET_COLLISION_MASK_OTHER_AVATAR = BULLET_COLLISION_MASK_DEFAULT; // COLLISIONLESS gets an empty mask. -const int16_t BULLET_COLLISION_MASK_COLLISIONLESS = 0; +const int32_t BULLET_COLLISION_MASK_COLLISIONLESS = 0; /**jsdoc *

An entity may collide with the following types of items:

@@ -72,35 +72,35 @@ const int16_t BULLET_COLLISION_MASK_COLLISIONLESS = 0; * * * 1Static entities — non-dynamic entities with no velocity. - * 2Dynamic entities — entities that have their dynamic property set to + * 2Dynamic entities — entities that have their dynamic property set to * true. * 4Kinematic entities — non-dynamic entities with velocity. * 8My avatar. * 16Other avatars. * * - *

The values for the collision types that are enabled are added together to give the CollisionMask value. For example, a + *

The values for the collision types that are enabled are added together to give the CollisionMask value. For example, a * value of 31 means that an entity will collide with all item types.

* @typedef {number} Entities.CollisionMask */ // The USER collision groups are exposed to script and can be used to generate per-object collision masks. // They are not necessarily the same as the BULLET_COLLISION_GROUPS, but we start them off with matching numbers. -const uint8_t USER_COLLISION_GROUP_STATIC = 1 << 0; -const uint8_t USER_COLLISION_GROUP_DYNAMIC = 1 << 1; -const uint8_t USER_COLLISION_GROUP_KINEMATIC = 1 << 2; -const uint8_t USER_COLLISION_GROUP_MY_AVATAR = 1 << 3; -const uint8_t USER_COLLISION_GROUP_OTHER_AVATAR = 1 << 4; +const uint16_t USER_COLLISION_GROUP_STATIC = 1 << 0; +const uint16_t USER_COLLISION_GROUP_DYNAMIC = 1 << 1; +const uint16_t USER_COLLISION_GROUP_KINEMATIC = 1 << 2; +const uint16_t USER_COLLISION_GROUP_MY_AVATAR = 1 << 3; +const uint16_t USER_COLLISION_GROUP_OTHER_AVATAR = 1 << 4; -const uint8_t ENTITY_COLLISION_MASK_DEFAULT = +const uint16_t ENTITY_COLLISION_MASK_DEFAULT = USER_COLLISION_GROUP_STATIC | USER_COLLISION_GROUP_DYNAMIC | USER_COLLISION_GROUP_KINEMATIC | USER_COLLISION_GROUP_MY_AVATAR | USER_COLLISION_GROUP_OTHER_AVATAR; -const uint8_t USER_COLLISION_MASK_AVATARS = USER_COLLISION_GROUP_MY_AVATAR | USER_COLLISION_GROUP_OTHER_AVATAR; +const uint16_t USER_COLLISION_MASK_AVATARS = USER_COLLISION_GROUP_MY_AVATAR | USER_COLLISION_GROUP_OTHER_AVATAR; -const int NUM_USER_COLLISION_GROUPS = 5; +const int32_t NUM_USER_COLLISION_GROUPS = 5; #endif // hifi_PhysicsCollisionGroups_h diff --git a/libraries/shared/src/PhysicsHelpers.cpp b/libraries/shared/src/PhysicsHelpers.cpp index 18accfd799..b43d55020e 100644 --- a/libraries/shared/src/PhysicsHelpers.cpp +++ b/libraries/shared/src/PhysicsHelpers.cpp @@ -61,7 +61,7 @@ glm::quat computeBulletRotationStep(const glm::vec3& angularVelocity, float time } /* end Bullet code derivation*/ -int16_t Physics::getDefaultCollisionMask(int16_t group) { +int32_t Physics::getDefaultCollisionMask(int32_t group) { switch(group) { case BULLET_COLLISION_GROUP_STATIC: return BULLET_COLLISION_MASK_STATIC; diff --git a/libraries/shared/src/PhysicsHelpers.h b/libraries/shared/src/PhysicsHelpers.h index 67442187a3..332100f03b 100644 --- a/libraries/shared/src/PhysicsHelpers.h +++ b/libraries/shared/src/PhysicsHelpers.h @@ -31,7 +31,7 @@ const float KINEMATIC_ANGULAR_SPEED_THRESHOLD = 0.008f; // ~0.5 deg/sec glm::quat computeBulletRotationStep(const glm::vec3& angularVelocity, float timeStep); namespace Physics { - int16_t getDefaultCollisionMask(int16_t group); + int32_t getDefaultCollisionMask(int32_t group); void setSessionUUID(const QUuid& sessionID); const QUuid& getSessionUUID();