From 8c47736c3b63c6e10bc840ff902d131fede6ae8a Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Mon, 4 May 2015 11:41:03 -0700 Subject: [PATCH] add skybox mode property --- .../entities/src/EntityItemProperties.cpp | 43 ++++++++++++++++++- libraries/entities/src/EntityItemProperties.h | 2 + libraries/entities/src/EntityPropertyFlags.h | 8 ++++ libraries/entities/src/ZoneEntityItem.cpp | 21 +++++++++ libraries/entities/src/ZoneEntityItem.h | 5 +++ 5 files changed, 78 insertions(+), 1 deletion(-) diff --git a/libraries/entities/src/EntityItemProperties.cpp b/libraries/entities/src/EntityItemProperties.cpp index b7549a5f63..480233e538 100644 --- a/libraries/entities/src/EntityItemProperties.cpp +++ b/libraries/entities/src/EntityItemProperties.cpp @@ -89,6 +89,7 @@ EntityItemProperties::EntityItemProperties() : CONSTRUCT_PROPERTY(stageDay, ZoneEntityItem::DEFAULT_STAGE_DAY), CONSTRUCT_PROPERTY(stageHour, ZoneEntityItem::DEFAULT_STAGE_HOUR), CONSTRUCT_PROPERTY(name, ENTITY_ITEM_DEFAULT_NAME), + CONSTRUCT_PROPERTY(skyboxMode, SKYBOX_MODE_INHERIT), _id(UNKNOWN_ENTITY_ID), _idSet(false), @@ -236,6 +237,37 @@ void EntityItemProperties::setShapeTypeFromString(const QString& shapeName) { } } +const char* skyboxModeNames[] = {"inherit", "atmosphere", "texture" }; + +QHash stringToSkyboxModeLookup; + +void addSkyboxMode(SkyboxMode type) { + stringToSkyboxModeLookup[skyboxModeNames[type]] = type; +} + +void buildStringToSkyboxModeLookup() { + addSkyboxMode(SKYBOX_MODE_INHERIT); + addSkyboxMode(SKYBOX_MODE_ATMOSPHERE); + addSkyboxMode(SKYBOX_MODE_TEXTURE); +} + +QString EntityItemProperties::getSkyboxModeAsString() const { + if (_skyboxMode < sizeof(skyboxModeNames) / sizeof(char *)) + return QString(skyboxModeNames[_skyboxMode]); + return QString(skyboxModeNames[SKYBOX_MODE_INHERIT]); +} + +void EntityItemProperties::setSkyboxModeFromString(const QString& shapeName) { + if (stringToSkyboxModeLookup.empty()) { + buildStringToSkyboxModeLookup(); + } + auto skyboxModeItr = stringToSkyboxModeLookup.find(shapeName.toLower()); + if (skyboxModeItr != stringToSkyboxModeLookup.end()) { + _skyboxMode = skyboxModeItr.value(); + _skyboxModeChanged = true; + } +} + EntityPropertyFlags EntityItemProperties::getChangedProperties() const { EntityPropertyFlags changedProperties; @@ -295,6 +327,8 @@ EntityPropertyFlags EntityItemProperties::getChangedProperties() const { CHECK_PROPERTY_CHANGE(PROP_STAGE_ALTITUDE, stageAltitude); CHECK_PROPERTY_CHANGE(PROP_STAGE_DAY, stageDay); CHECK_PROPERTY_CHANGE(PROP_STAGE_HOUR, stageHour); + + CHECK_PROPERTY_CHANGE(PROP_SKYBOX_MODE, skyboxMode); changedProperties += _atmosphere.getChangedProperties(); @@ -379,6 +413,7 @@ QScriptValue EntityItemProperties::copyToScriptValue(QScriptEngine* engine, bool COPY_PROPERTY_TO_QSCRIPTVALUE(stageAltitude); COPY_PROPERTY_TO_QSCRIPTVALUE(stageDay); COPY_PROPERTY_TO_QSCRIPTVALUE(stageHour); + COPY_PROPERTY_TO_QSCRIPTVALUE_GETTER(skyboxMode, getSkyboxModeAsString()); // Sitting properties support if (!skipDefaults) { @@ -484,6 +519,8 @@ void EntityItemProperties::copyFromScriptValue(const QScriptValue& object) { COPY_PROPERTY_FROM_QSCRIPTVALUE_INT(stageDay, setStageDay); COPY_PROPERTY_FROM_QSCRIPTVALUE_FLOAT(stageHour, setStageHour); + COPY_PROPERTY_FROM_QSCRITPTVALUE_ENUM(skyboxMode, SkyboxMode); + _atmosphere.copyFromScriptValue(object, _defaultSettings); _lastEdited = usecTimestampNow(); @@ -690,6 +727,8 @@ bool EntityItemProperties::encodeEntityEditPacket(PacketType command, EntityItem APPEND_ENTITY_PROPERTY(PROP_SHAPE_TYPE, appendValue, (uint32_t)properties.getShapeType()); APPEND_ENTITY_PROPERTY(PROP_COMPOUND_SHAPE_URL, appendValue, properties.getCompoundShapeURL()); + + APPEND_ENTITY_PROPERTY(PROP_SKYBOX_MODE, appendValue, (uint32_t)properties.getSkyboxMode()); _staticAtmosphere.setProperties(properties); _staticAtmosphere.appentToEditPacket(packetData, requestedProperties, propertyFlags, propertiesDidntFit, propertyCount, appendState ); @@ -942,6 +981,7 @@ bool EntityItemProperties::decodeEntityEditPacket(const unsigned char* data, int READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_STAGE_HOUR, float, setStageHour); READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_SHAPE_TYPE, ShapeType, setShapeType); READ_ENTITY_PROPERTY_STRING_TO_PROPERTIES(PROP_COMPOUND_SHAPE_URL, setCompoundShapeURL); + READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_SKYBOX_MODE, SkyboxMode, setSkyboxMode); qDebug() << "EntityItemProperties::decodeEntityEditPacket()...."; properties.getAtmosphere().decodeFromEditPacket(propertyFlags, dataAt , processedBytes); @@ -1048,8 +1088,9 @@ void EntityItemProperties::markAllChanged() { _stageDayChanged = true; _stageHourChanged = true; + _skyboxModeChanged = true; _atmosphere.markAllChanged(); - + } /// The maximum bounding cube for the entity, independent of it's rotation. diff --git a/libraries/entities/src/EntityItemProperties.h b/libraries/entities/src/EntityItemProperties.h index 377f0a3a1a..591b89f22d 100644 --- a/libraries/entities/src/EntityItemProperties.h +++ b/libraries/entities/src/EntityItemProperties.h @@ -138,6 +138,7 @@ public: DEFINE_PROPERTY(PROP_STAGE_HOUR, StageHour, stageHour, float); DEFINE_PROPERTY_REF(PROP_NAME, Name, name, QString); DEFINE_PROPERTY_GROUP(Atmosphere, atmosphere, AtmospherePropertyGroup); + DEFINE_PROPERTY_REF_ENUM(PROP_SKYBOX_MODE, SkyboxMode, skyboxMode, SkyboxMode); public: @@ -272,6 +273,7 @@ inline QDebug operator<<(QDebug debug, const EntityItemProperties& properties) { DEBUG_PROPERTY_IF_CHANGED(debug, properties, LocalGravity, localGravity, ""); DEBUG_PROPERTY_IF_CHANGED(debug, properties, ParticleRadius, particleRadius, ""); DEBUG_PROPERTY_IF_CHANGED(debug, properties, MarketplaceID, marketplaceID, ""); + DEBUG_PROPERTY_IF_CHANGED(debug, properties, SkyboxMode, skyboxMode, ""); debug << " last edited:" << properties.getLastEdited() << "\n"; debug << " edited ago:" << properties.getEditedAgo() << "\n"; diff --git a/libraries/entities/src/EntityPropertyFlags.h b/libraries/entities/src/EntityPropertyFlags.h index 3ee46e1f41..969ed309bb 100644 --- a/libraries/entities/src/EntityPropertyFlags.h +++ b/libraries/entities/src/EntityPropertyFlags.h @@ -155,4 +155,12 @@ typedef PropertyFlags EntityPropertyFlags; // one greater than the last item property due to the enum's auto-incrementing. extern EntityPropertyList PROP_LAST_ITEM; + +enum SkyboxMode { + SKYBOX_MODE_INHERIT, + SKYBOX_MODE_ATMOSPHERE, + SKYBOX_MODE_TEXTURE, +}; + + #endif // hifi_EntityPropertyFlags_h diff --git a/libraries/entities/src/ZoneEntityItem.cpp b/libraries/entities/src/ZoneEntityItem.cpp index be1a8fa3d3..b1c875aae0 100644 --- a/libraries/entities/src/ZoneEntityItem.cpp +++ b/libraries/entities/src/ZoneEntityItem.cpp @@ -60,6 +60,8 @@ ZoneEntityItem::ZoneEntityItem(const EntityItemID& entityItemID, const EntityIte _stageHour = DEFAULT_STAGE_HOUR; _shapeType = DEFAULT_SHAPE_TYPE; _compoundShapeURL = DEFAULT_COMPOUND_SHAPE_URL; + + _skyboxMode = SKYBOX_MODE_INHERIT; setProperties(properties); } @@ -80,6 +82,8 @@ EntityItemProperties ZoneEntityItem::getProperties() const { COPY_ENTITY_PROPERTY_TO_PROPERTIES(shapeType, getShapeType); COPY_ENTITY_PROPERTY_TO_PROPERTIES(compoundShapeURL, getCompoundShapeURL); + COPY_ENTITY_PROPERTY_TO_PROPERTIES(skyboxMode, getSkyboxMode); + _atmospherePropeties.getProperties(properties); return properties; @@ -102,6 +106,8 @@ bool ZoneEntityItem::setProperties(const EntityItemProperties& properties) { SET_ENTITY_PROPERTY_FROM_PROPERTIES(shapeType, updateShapeType); SET_ENTITY_PROPERTY_FROM_PROPERTIES(compoundShapeURL, setCompoundShapeURL); + SET_ENTITY_PROPERTY_FROM_PROPERTIES(skyboxMode, setSkyboxMode); + bool somethingChangedInAtmosphere = _atmospherePropeties.setProperties(properties); somethingChanged = somethingChanged || somethingChangedInAtmosphere; @@ -116,6 +122,10 @@ bool ZoneEntityItem::setProperties(const EntityItemProperties& properties) { } setLastEdited(properties._lastEdited); } + + qDebug() << "ZoneEntityItem::setProperties()"; + debugDump(); + return somethingChanged; } @@ -139,9 +149,15 @@ int ZoneEntityItem::readEntitySubclassDataFromBuffer(const unsigned char* data, READ_ENTITY_PROPERTY_SETTER(PROP_SHAPE_TYPE, ShapeType, updateShapeType); READ_ENTITY_PROPERTY_STRING(PROP_COMPOUND_SHAPE_URL, setCompoundShapeURL); + READ_ENTITY_PROPERTY_SETTER(PROP_SKYBOX_MODE, SkyboxMode, setSkyboxMode); + bytesRead += _atmospherePropeties.readEntitySubclassDataFromBuffer(dataAt, (bytesLeftToRead - bytesRead), args, propertyFlags, overwriteLocalData); + + qDebug() << "ZoneEntityItem::readEntitySubclassDataFromBuffer()"; + debugDump(); + return bytesRead; } @@ -163,6 +179,8 @@ EntityPropertyFlags ZoneEntityItem::getEntityProperties(EncodeBitstreamParams& p requestedProperties += PROP_SHAPE_TYPE; requestedProperties += PROP_COMPOUND_SHAPE_URL; + requestedProperties += PROP_SKYBOX_MODE; + requestedProperties += _atmospherePropeties.getEntityProperties(params); return requestedProperties; @@ -190,6 +208,8 @@ void ZoneEntityItem::appendSubclassData(OctreePacketData* packetData, EncodeBits APPEND_ENTITY_PROPERTY(PROP_STAGE_HOUR, appendValue, getStageHour()); APPEND_ENTITY_PROPERTY(PROP_SHAPE_TYPE, appendValue, (uint32_t)getShapeType()); APPEND_ENTITY_PROPERTY(PROP_COMPOUND_SHAPE_URL, appendValue, getCompoundShapeURL()); + + APPEND_ENTITY_PROPERTY(PROP_SKYBOX_MODE, appendValue, (uint32_t)getShapeType()); // could this be a uint16?? _atmospherePropeties.appendSubclassData(packetData, params, modelTreeElementExtraEncodeData, requestedProperties, propertyFlags, propertiesDidntFit, propertyCount, appendState); @@ -212,6 +232,7 @@ void ZoneEntityItem::debugDump() const { qCDebug(entities) << " _stageAltitude:" << _stageAltitude; qCDebug(entities) << " _stageDay:" << _stageDay; qCDebug(entities) << " _stageHour:" << _stageHour; + qCDebug(entities) << " _skyboxMode:" << _skyboxMode; _atmospherePropeties.debugDump(); } diff --git a/libraries/entities/src/ZoneEntityItem.h b/libraries/entities/src/ZoneEntityItem.h index 1e64b54e93..6819f6b974 100644 --- a/libraries/entities/src/ZoneEntityItem.h +++ b/libraries/entities/src/ZoneEntityItem.h @@ -101,6 +101,10 @@ public: const QString getCompoundShapeURL() const { return _compoundShapeURL; } virtual void setCompoundShapeURL(const QString& url); + void setSkyboxMode(SkyboxMode value) { _skyboxMode = value; } + SkyboxMode getSkyboxMode() const { return _skyboxMode; } + + virtual bool supportsDetailedRayIntersection() const { return true; } virtual bool findDetailedRayIntersection(const glm::vec3& origin, const glm::vec3& direction, bool& keepSearching, OctreeElement*& element, float& distance, BoxFace& face, @@ -137,6 +141,7 @@ protected: ShapeType _shapeType = SHAPE_TYPE_NONE; QString _compoundShapeURL; + SkyboxMode _skyboxMode = SKYBOX_MODE_INHERIT; AtmospherePropertyGroup _atmospherePropeties; static bool _zonesArePickable;