diff --git a/examples/controllers/handControllerGrab.js b/examples/controllers/handControllerGrab.js index 06fde5e002..be5fdd7edb 100644 --- a/examples/controllers/handControllerGrab.js +++ b/examples/controllers/handControllerGrab.js @@ -163,12 +163,9 @@ var POINT_HAND_STATES = [STATE_NEAR_TRIGGER, STATE_CONTINUE_NEAR_TRIGGER, STATE_ var FAR_GRASP_HAND_STATES = [STATE_DISTANCE_HOLDING, STATE_CONTINUE_DISTANCE_HOLDING]; // otherwise grasp -var COLLISION_GROUP_STATIC = 0x01; // bit 0 -var COLLISION_GROUP_DYNAMIC = 0x02; // bit 1 -var COLLISION_GROUP_KINEMATIC = 0x04; // bit 2 -var COLLISION_GROUP_MY_AVATAR = 0x08; // bit 3 -var COLLISION_GROUP_OTHER_AVATAR = 0x10; // bit 4 -var COLLISION_MASK_WHILE_GRABBED = COLLISION_GROUP_DYNAMIC | COLLISION_GROUP_OTHER_AVATAR; +// collision masks are specified by comma-separated list of group names +// the possible list of names is: static, dynamic, kinematic, myAvatar, otherAvatar +var COLLISION_MASK_WHILE_GRABBED = "dynamic,otherAvatar"; function stateToName(state) { @@ -1845,7 +1842,7 @@ function MyController(hand) { y: 0, z: 0 }, - collisionMask: COLLISION_MASK_WHILE_GRABBED & grabbedProperties.collisionMask + "collisionMask": COLLISION_MASK_WHILE_GRABBED }; Entities.editEntity(entityID, whileHeldProperties); } diff --git a/libraries/entities/src/EntityItemProperties.cpp b/libraries/entities/src/EntityItemProperties.cpp index d647896d1f..f8dcb6ee56 100644 --- a/libraries/entities/src/EntityItemProperties.cpp +++ b/libraries/entities/src/EntityItemProperties.cpp @@ -116,6 +116,59 @@ void buildStringToShapeTypeLookup() { addShapeType(SHAPE_TYPE_CYLINDER_Z); } +QString getCollisionGroupAsString(uint8_t group) { + switch (group) { + case USER_COLLISION_GROUP_DYNAMIC: + return "dynamic"; + case USER_COLLISION_GROUP_STATIC: + return "static"; + case USER_COLLISION_GROUP_KINEMATIC: + return "kinematic"; + case USER_COLLISION_GROUP_MY_AVATAR: + return "myAvatar"; + case USER_COLLISION_GROUP_OTHER_AVATAR: + return "otherAvatar"; + }; + return ""; +} + +uint8_t getCollisionGroupAsBitMask(const QStringRef& name) { + if (0 == name.compare("dynamic")) { + return USER_COLLISION_GROUP_DYNAMIC; + } else if (0 == name.compare("static")) { + return USER_COLLISION_GROUP_STATIC; + } else if (0 == name.compare("kinematic")) { + return USER_COLLISION_GROUP_KINEMATIC; + } else if (0 == name.compare("myAvatar")) { + return USER_COLLISION_GROUP_MY_AVATAR; + } else if (0 == name.compare("otherAvatar")) { + return USER_COLLISION_GROUP_OTHER_AVATAR; + } + return 0; +} + +QString EntityItemProperties::getCollisionMaskAsString() const { + QString maskString(""); + for (int i = 0; i < NUM_USER_COLLISION_GROUPS; ++i) { + uint8_t group = 0x01 << i; + if (group & _collisionMask) { + maskString.append(getCollisionGroupAsString(group)); + maskString.append(','); + } + } + return maskString; +} + +void EntityItemProperties::setCollisionMaskFromString(const QString& maskString) { + QVector groups = maskString.splitRef(','); + uint8_t mask = 0x00; + for (auto group : groups) { + mask |= getCollisionGroupAsBitMask(group); + } + _collisionMask = mask; + _collisionMaskChanged = true; +} + QString EntityItemProperties::getShapeTypeAsString() const { if (_shapeType < sizeof(shapeTypeNames) / sizeof(char *)) return QString(shapeTypeNames[_shapeType]); @@ -318,7 +371,7 @@ QScriptValue EntityItemProperties::copyToScriptValue(QScriptEngine* engine, bool COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_ANGULAR_DAMPING, angularDamping); COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_VISIBLE, visible); COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_IGNORE_FOR_COLLISIONS, ignoreForCollisions); - COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_COLLISION_MASK, collisionMask); + COPY_PROPERTY_TO_QSCRIPTVALUE_GETTER(PROP_COLLISION_MASK, collisionMask, getCollisionMaskAsString()); COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_COLLISIONS_WILL_MOVE, collisionsWillMove); COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_HREF, href); COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_DESCRIPTION, description); @@ -540,7 +593,7 @@ void EntityItemProperties::copyFromScriptValue(const QScriptValue& object, bool COPY_PROPERTY_FROM_QSCRIPTVALUE(glowLevel, float, setGlowLevel); COPY_PROPERTY_FROM_QSCRIPTVALUE(localRenderAlpha, float, setLocalRenderAlpha); COPY_PROPERTY_FROM_QSCRIPTVALUE(ignoreForCollisions, bool, setIgnoreForCollisions); - COPY_PROPERTY_FROM_QSCRIPTVALUE(collisionMask, uint8_t, setCollisionMask); + COPY_PROPERTY_FROM_QSCRITPTVALUE_ENUM(collisionMask, CollisionMask); COPY_PROPERTY_FROM_QSCRIPTVALUE(collisionsWillMove, bool, setCollisionsWillMove); COPY_PROPERTY_FROM_QSCRIPTVALUE(isSpotlight, bool, setIsSpotlight); COPY_PROPERTY_FROM_QSCRIPTVALUE(intensity, float, setIntensity); diff --git a/libraries/entities/src/EntityItemProperties.h b/libraries/entities/src/EntityItemProperties.h index 46af6a1da9..087925b139 100644 --- a/libraries/entities/src/EntityItemProperties.h +++ b/libraries/entities/src/EntityItemProperties.h @@ -274,6 +274,10 @@ public: void setJointRotationsDirty() { _jointRotationsSetChanged = true; _jointRotationsChanged = true; } void setJointTranslationsDirty() { _jointTranslationsSetChanged = true; _jointTranslationsChanged = true; } +protected: + QString getCollisionMaskAsString() const; + void setCollisionMaskFromString(const QString& maskString); + private: QUuid _id; bool _idSet; diff --git a/libraries/shared/src/PhysicsCollisionGroups.h b/libraries/shared/src/PhysicsCollisionGroups.h index e7f9d57fef..6d320e69cb 100644 --- a/libraries/shared/src/PhysicsCollisionGroups.h +++ b/libraries/shared/src/PhysicsCollisionGroups.h @@ -82,4 +82,6 @@ const uint8_t ENTITY_COLLISION_MASK_DEFAULT = const uint8_t USER_COLLISION_MASK_AVATARS = USER_COLLISION_GROUP_MY_AVATAR | USER_COLLISION_GROUP_OTHER_AVATAR; +const int NUM_USER_COLLISION_GROUPS = 5; + #endif // hifi_PhysicsCollisionGroups_h