[WL21389] Set Simulation::DIRTY_SHAPE flag when entity::Shape changes (details below).

* Fixes an issue where ShapeEntityItem's collisionShapeType wasn't updated when its
  entity::Shape type was changed.
* Adds getNameForShapeType static method to ShapeInfo.
** Moves shapeTypeNames[] from EntityItemProperties.cpp to ShapeInfo.cpp
* Adds collisionShapeType to ShapeEntityItem::debugDump

* Tested creating shapes within the Creation Menu:
** Create Menu -> (Box/Sphere)
*** Observe Properties tab auto-focus
** From Properties tab elect alternate shape type from the Shape Dropdown list.

NOTE:  While this fixes an issue with the collision shape, it doesn't completely
       resolve the issues seen with the polyhedra or polygonal shapes noticed on
       RELEASE-7130 rebase.

Reviewed-by: Leander Hasty <leander@1stplayable.com>

Changes Committed:
    modified:   libraries/entities/src/EntityItemProperties.cpp
    modified:   libraries/entities/src/ShapeEntityItem.cpp
    modified:   libraries/shared/src/ShapeInfo.cpp
    modified:   libraries/shared/src/ShapeInfo.h
This commit is contained in:
LaShonda Hopper 2017-10-09 17:49:13 -04:00
parent 7f9ce5a4cd
commit dbd1a80046
4 changed files with 40 additions and 21 deletions

View file

@ -84,28 +84,11 @@ void EntityItemProperties::setLastEdited(quint64 usecTime) {
_lastEdited = usecTime > _created ? usecTime : _created;
}
const char* shapeTypeNames[] = {
"none",
"box",
"sphere",
"capsule-x",
"capsule-y",
"capsule-z",
"cylinder-x",
"cylinder-y",
"cylinder-z",
"hull",
"plane",
"compound",
"simple-hull",
"simple-compound",
"static-mesh"
};
QHash<QString, ShapeType> stringToShapeTypeLookup;
void addShapeType(ShapeType type) {
stringToShapeTypeLookup[shapeTypeNames[type]] = type;
stringToShapeTypeLookup[ShapeInfo::getNameForShapeType(type)] = type;
}
void buildStringToShapeTypeLookup() {
@ -180,9 +163,7 @@ void EntityItemProperties::setCollisionMaskFromString(const QString& maskString)
}
QString EntityItemProperties::getShapeTypeAsString() const {
if (_shapeType < sizeof(shapeTypeNames) / sizeof(char *))
return QString(shapeTypeNames[_shapeType]);
return QString(shapeTypeNames[SHAPE_TYPE_NONE]);
return ShapeInfo::getNameForShapeType(_shapeType);
}
void EntityItemProperties::setShapeTypeFromString(const QString& shapeName) {

View file

@ -95,6 +95,7 @@ EntityItemProperties ShapeEntityItem::getProperties(EntityPropertyFlags desiredP
}
void ShapeEntityItem::setShape(const entity::Shape& shape) {
const entity::Shape prevShape = _shape;
_shape = shape;
switch (_shape) {
case entity::Shape::Cube:
@ -107,6 +108,11 @@ void ShapeEntityItem::setShape(const entity::Shape& shape) {
_type = EntityTypes::Shape;
break;
}
if (_shape != prevShape) {
// Internally grabs writeLock
markDirtyFlags(Simulation::DIRTY_SHAPE);
}
}
bool ShapeEntityItem::setProperties(const EntityItemProperties& properties) {
@ -227,6 +233,7 @@ void ShapeEntityItem::debugDump() const {
qCDebug(entities) << "SHAPE EntityItem id:" << getEntityItemID() << "---------------------------------------------";
qCDebug(entities) << " name:" << _name;
qCDebug(entities) << " shape:" << stringFromShape(_shape) << " (EnumId: " << _shape << " )";
qCDebug(entities) << " collisionShapeType:" << ShapeInfo::getNameForShapeType(getShapeType());
qCDebug(entities) << " color:" << _color[0] << "," << _color[1] << "," << _color[2];
qCDebug(entities) << " position:" << debugTreeVector(getPosition());
qCDebug(entities) << " dimensions:" << debugTreeVector(getDimensions());

View file

@ -15,9 +15,38 @@
#include "NumericalConstants.h" // for MILLIMETERS_PER_METER
// Originally within EntityItemProperties.cpp
const char* shapeTypeNames[] = {
"none",
"box",
"sphere",
"capsule-x",
"capsule-y",
"capsule-z",
"cylinder-x",
"cylinder-y",
"cylinder-z",
"hull",
"plane",
"compound",
"simple-hull",
"simple-compound",
"static-mesh"
};
static const size_t SHAPETYPE_NAME_COUNT = (sizeof(shapeTypeNames) / sizeof((shapeTypeNames)[0]));
// Bullet doesn't support arbitrarily small shapes
const float MIN_HALF_EXTENT = 0.005f; // 0.5 cm
QString ShapeInfo::getNameForShapeType(ShapeType type) {
if (((int)type <= 0) || ((int)type >= SHAPETYPE_NAME_COUNT)) {
type = (ShapeType)0;
}
return shapeTypeNames[(int)type];
}
void ShapeInfo::clear() {
_url.clear();
_pointCollection.clear();

View file

@ -58,6 +58,8 @@ public:
using PointCollection = QVector<PointList>;
using TriangleIndices = QVector<int32_t>;
static QString getNameForShapeType(ShapeType type);
void clear();
void setParams(ShapeType type, const glm::vec3& halfExtents, QString url="");