From 17c3c1a18d8c2fe8cb18ccfb22c925f4024daf73 Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Sun, 10 May 2015 15:22:02 -0700 Subject: [PATCH] add support for automatic hour/day calculations and backward compatibility on stage properties --- .../entities/changingAtmosphereExample.js | 14 +++-- .../example/entities/zoneAtmosphereExample.js | 14 +++-- .../example/entities/zoneEntityExample.js | 16 ++--- .../example/entities/zoneSkyboxExample.js | 14 +++-- examples/html/entityProperties.html | 11 ++++ .../src/EntityTreeRenderer.cpp | 4 +- .../entities/src/EntityItemPropertiesMacros.h | 28 +++++++++ libraries/entities/src/EntityPropertyFlags.h | 1 + libraries/entities/src/StagePropertyGroup.cpp | 63 ++++++++++++++++++- libraries/entities/src/StagePropertyGroup.h | 4 ++ libraries/networking/src/PacketHeaders.cpp | 2 +- libraries/networking/src/PacketHeaders.h | 1 + 12 files changed, 141 insertions(+), 31 deletions(-) diff --git a/examples/example/entities/changingAtmosphereExample.js b/examples/example/entities/changingAtmosphereExample.js index 88a25b6a08..02103fc0fb 100644 --- a/examples/example/entities/changingAtmosphereExample.js +++ b/examples/example/entities/changingAtmosphereExample.js @@ -35,12 +35,14 @@ var zoneEntityA = Entities.addEntity({ scatteringWavelengths: { x: 0.650, y: 0.570, z: 0.475 }, hasStars: true }, - stageLatitude: 37.777, - stageLongitude: 122.407, - stageAltitude: 0.03, - stageDay: 183, - stageHour: 5, - stageSunModelEnabled: true + stage: { + latitude: 37.777, + longitude: 122.407, + altitude: 0.03, + day: 183, + hour: 5, + sunModelEnabled: true + } }); diff --git a/examples/example/entities/zoneAtmosphereExample.js b/examples/example/entities/zoneAtmosphereExample.js index b31a453300..dfebf09f2a 100644 --- a/examples/example/entities/zoneAtmosphereExample.js +++ b/examples/example/entities/zoneAtmosphereExample.js @@ -33,12 +33,14 @@ var zoneEntityA = Entities.addEntity({ scatteringWavelengths: { x: 0.650, y: 0.570, z: 0.475 }, hasStars: false }, - stageLatitude: 37.777, - stageLongitude: 122.407, - stageAltitude: 0.03, - stageDay: 60, - stageHour: 0, - stageSunModelEnabled: true + stage: { + latitude: 37.777, + longitude: 122.407, + altitude: 0.03, + day: 60, + hour: 0, + sunModelEnabled: true + } }); diff --git a/examples/example/entities/zoneEntityExample.js b/examples/example/entities/zoneEntityExample.js index b5831a2bb5..2d8b587d53 100644 --- a/examples/example/entities/zoneEntityExample.js +++ b/examples/example/entities/zoneEntityExample.js @@ -34,17 +34,18 @@ var zoneEntityB = Entities.addEntity({ dimensions: { x: 2, y: 2, z: 2 }, keyLightColor: { red: 0, green: 255, blue: 0 }, keyLightIntensity: 0.9, - stageLatitude: 37.777, - stageLongitude: 122.407, - stageAltitude: 0.03, - stageDay: 60, - stageHour: 12, - stageSunModelEnabled: true + stage: { + latitude: 37.777, + longitude: 122.407, + altitude: 0.03, + day: 60, + hour: 0, + sunModelEnabled: true + } }); print("zoneEntityB:" + zoneEntityB); - var zoneEntityC = Entities.addEntity({ type: "Zone", position: { x: 5, y: 10, z: 5 }, @@ -59,7 +60,6 @@ var zoneEntityC = Entities.addEntity({ print("zoneEntityC:" + zoneEntityC); - // register the call back so it fires before each data send Script.update.connect(function(deltaTime) { // stop it... diff --git a/examples/example/entities/zoneSkyboxExample.js b/examples/example/entities/zoneSkyboxExample.js index a1f5f1917a..420482f14d 100644 --- a/examples/example/entities/zoneSkyboxExample.js +++ b/examples/example/entities/zoneSkyboxExample.js @@ -37,12 +37,14 @@ var zoneEntityA = Entities.addEntity({ color: { red: 255, green: 0, blue: 255 }, url: "" }, - stageLatitude: 37.777, - stageLongitude: 122.407, - stageAltitude: 0.03, - stageDay: 60, - stageHour: 0, - stageSunModelEnabled: true + stage: { + latitude: 37.777, + longitude: 122.407, + altitude: 0.03, + day: 60, + hour: 0, + sunModelEnabled: true + } }); var props = Entities.getEntityProperties(zoneEntityA); diff --git a/examples/html/entityProperties.html b/examples/html/entityProperties.html index bdbfbdf6b6..9cf6a8893f 100644 --- a/examples/html/entityProperties.html +++ b/examples/html/entityProperties.html @@ -280,6 +280,7 @@ var elZoneStageLatitude = document.getElementById("property-zone-stage-latitude"); var elZoneStageLongitude = document.getElementById("property-zone-stage-longitude"); var elZoneStageAltitude = document.getElementById("property-zone-stage-altitude"); + var elZoneStageAutomaticHourDay = document.getElementById("property-zone-stage-automatic-hour-day"); var elZoneStageDay = document.getElementById("property-zone-stage-day"); var elZoneStageHour = document.getElementById("property-zone-stage-hour"); @@ -480,6 +481,7 @@ elZoneStageLatitude.value = properties.stage.latitude.toFixed(2); elZoneStageLongitude.value = properties.stage.longitude.toFixed(2); elZoneStageAltitude.value = properties.stage.altitude.toFixed(2); + elZoneStageAutomaticHourDay.checked = properties.stage.automaticHourDay; elZoneStageDay.value = properties.stage.day; elZoneStageHour.value = properties.stage.hour; elShapeType.value = properties.shapeType; @@ -636,6 +638,7 @@ elZoneStageLatitude.addEventListener('change', createEmitGroupNumberPropertyUpdateFunction('stage','latitude')); elZoneStageLongitude.addEventListener('change', createEmitGroupNumberPropertyUpdateFunction('stage','longitude')); elZoneStageAltitude.addEventListener('change', createEmitGroupNumberPropertyUpdateFunction('stage','altitude')); + elZoneStageAutomaticHourDay.addEventListener('change', createEmitGroupCheckedPropertyUpdateFunction('stage','automaticHourDay')); elZoneStageDay.addEventListener('change', createEmitGroupNumberPropertyUpdateFunction('stage','day')); elZoneStageHour.addEventListener('change', createEmitGroupNumberPropertyUpdateFunction('stage','hour')); @@ -1094,6 +1097,14 @@ + +
+ Stage Automatice Hour Day + + + +
+
Stage Day
diff --git a/libraries/entities-renderer/src/EntityTreeRenderer.cpp b/libraries/entities-renderer/src/EntityTreeRenderer.cpp index 79606e687f..943a3824c3 100644 --- a/libraries/entities-renderer/src/EntityTreeRenderer.cpp +++ b/libraries/entities-renderer/src/EntityTreeRenderer.cpp @@ -426,8 +426,8 @@ void EntityTreeRenderer::render(RenderArgs::RenderMode renderMode, scene->setStageSunModelEnable(_bestZone->getStageProperties().getSunModelEnabled()); scene->setStageLocation(_bestZone->getStageProperties().getLongitude(), _bestZone->getStageProperties().getLatitude(), _bestZone->getStageProperties().getAltitude()); - scene->setStageDayTime(_bestZone->getStageProperties().getHour()); - scene->setStageYearTime(_bestZone->getStageProperties().getDay()); + scene->setStageDayTime(_bestZone->getStageProperties().calculateHour()); + scene->setStageYearTime(_bestZone->getStageProperties().calculateDay()); if (_bestZone->getBackgroundMode() == BACKGROUND_MODE_ATMOSPHERE) { EnvironmentData data = _bestZone->getEnvironmentData(); diff --git a/libraries/entities/src/EntityItemPropertiesMacros.h b/libraries/entities/src/EntityItemPropertiesMacros.h index b93e0e211d..825a98fae0 100644 --- a/libraries/entities/src/EntityItemPropertiesMacros.h +++ b/libraries/entities/src/EntityItemPropertiesMacros.h @@ -302,6 +302,15 @@ } \ } +#define COPY_PROPERTY_FROM_QSCRIPTVALUE_FLOAT_GETTER(P, S, G) \ + QScriptValue P = object.property(#P); \ + if (P.isValid()) { \ + float newValue = P.toVariant().toFloat(); \ + if (_defaultSettings || newValue != G()) { \ + S(newValue); \ + } \ + } + #define COPY_GROUP_PROPERTY_FROM_QSCRIPTVALUE_FLOAT(G, P, S) \ { \ QScriptValue G = object.property(#G); \ @@ -339,6 +348,15 @@ } \ } +#define COPY_PROPERTY_FROM_QSCRIPTVALUE_INT_GETTER(P, S, G) \ + QScriptValue P = object.property(#P); \ + if (P.isValid()) { \ + int newValue = P.toVariant().toInt(); \ + if (_defaultSettings || newValue != G()) { \ + S(newValue); \ + } \ + } + #define COPY_PROPERTY_FROM_QSCRIPTVALUE_BOOL(P, S) \ QScriptValue P = object.property(#P); \ if (P.isValid()) { \ @@ -348,6 +366,16 @@ } \ } +#define COPY_PROPERTY_FROM_QSCRIPTVALUE_BOOL_GETTER(P, S, G) \ + QScriptValue P = object.property(#P); \ + if (P.isValid()) { \ + bool newValue = P.toVariant().toBool(); \ + if (_defaultSettings || newValue != G()) { \ + S(newValue); \ + } \ + } + + #define COPY_GROUP_PROPERTY_FROM_QSCRIPTVALUE_BOOL(G, P, S) \ { \ QScriptValue G = object.property(#G); \ diff --git a/libraries/entities/src/EntityPropertyFlags.h b/libraries/entities/src/EntityPropertyFlags.h index f40fa67195..93b8c76216 100644 --- a/libraries/entities/src/EntityPropertyFlags.h +++ b/libraries/entities/src/EntityPropertyFlags.h @@ -146,6 +146,7 @@ enum EntityPropertyList { PROP_BACKGROUND_MODE = PROP_MODEL_URL, PROP_SKYBOX_COLOR = PROP_ANIMATION_URL, PROP_SKYBOX_URL = PROP_ANIMATION_FPS, + PROP_STAGE_AUTOMATIC_HOURDAY = PROP_ANIMATION_FRAME_INDEX, // WARNING!!! DO NOT ADD PROPS_xxx here unless you really really meant to.... Add them UP above }; diff --git a/libraries/entities/src/StagePropertyGroup.cpp b/libraries/entities/src/StagePropertyGroup.cpp index e65a64ba77..80bb763988 100644 --- a/libraries/entities/src/StagePropertyGroup.cpp +++ b/libraries/entities/src/StagePropertyGroup.cpp @@ -9,6 +9,10 @@ // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html // +#include +#include +#include + #include #include "StagePropertyGroup.h" @@ -29,6 +33,7 @@ StagePropertyGroup::StagePropertyGroup() { _altitude = DEFAULT_STAGE_ALTITUDE; _day = DEFAULT_STAGE_DAY; _hour = DEFAULT_STAGE_HOUR; + _automaticHourDay = false; } void StagePropertyGroup::copyToScriptValue(QScriptValue& properties, QScriptEngine* engine, bool skipDefaults, EntityItemProperties& defaultEntityProperties) const { @@ -38,15 +43,26 @@ void StagePropertyGroup::copyToScriptValue(QScriptValue& properties, QScriptEngi COPY_GROUP_PROPERTY_TO_QSCRIPTVALUE(Stage, stage, Altitude, altitude); COPY_GROUP_PROPERTY_TO_QSCRIPTVALUE(Stage, stage, Day, day); COPY_GROUP_PROPERTY_TO_QSCRIPTVALUE(Stage, stage, Hour, hour); + COPY_GROUP_PROPERTY_TO_QSCRIPTVALUE(Stage, stage, AutomaticHourDay, automaticHourDay); } void StagePropertyGroup::copyFromScriptValue(const QScriptValue& object, bool& _defaultSettings) { + + // Backward compatibility support for the old way of doing stage properties + COPY_PROPERTY_FROM_QSCRIPTVALUE_BOOL_GETTER(stageSunModelEnabled, setSunModelEnabled, getSunModelEnabled); + COPY_PROPERTY_FROM_QSCRIPTVALUE_FLOAT_GETTER(stageLatitude, setLatitude, getLatitude); + COPY_PROPERTY_FROM_QSCRIPTVALUE_FLOAT_GETTER(stageLongitude, setLongitude, getLongitude); + COPY_PROPERTY_FROM_QSCRIPTVALUE_FLOAT_GETTER(stageAltitude, setAltitude, getAltitude); + COPY_PROPERTY_FROM_QSCRIPTVALUE_INT_GETTER(stageDay, setDay, getDay); + COPY_PROPERTY_FROM_QSCRIPTVALUE_FLOAT_GETTER(stageHour, setHour, getHour); + COPY_GROUP_PROPERTY_FROM_QSCRIPTVALUE_BOOL(stage, sunModelEnabled, setSunModelEnabled); COPY_GROUP_PROPERTY_FROM_QSCRIPTVALUE_FLOAT(stage, latitude, setLatitude); COPY_GROUP_PROPERTY_FROM_QSCRIPTVALUE_FLOAT(stage, longitude, setLongitude); COPY_GROUP_PROPERTY_FROM_QSCRIPTVALUE_FLOAT(stage, altitude, setAltitude); COPY_GROUP_PROPERTY_FROM_QSCRIPTVALUE_UINT16(stage, day, setDay); COPY_GROUP_PROPERTY_FROM_QSCRIPTVALUE_FLOAT(stage, hour, setHour); + COPY_GROUP_PROPERTY_FROM_QSCRIPTVALUE_BOOL(stage, automaticHourDay, setAutomaticHourDay); } void StagePropertyGroup::debugDump() const { @@ -57,7 +73,7 @@ void StagePropertyGroup::debugDump() const { qDebug() << " _altitude:" << _altitude; qDebug() << " _day:" << _day; qDebug() << " _hour:" << _hour; - + qDebug() << " _automaticHourDay:" << _automaticHourDay; } bool StagePropertyGroup::appentToEditPacket(OctreePacketData* packetData, @@ -75,6 +91,7 @@ bool StagePropertyGroup::appentToEditPacket(OctreePacketData* packetData, APPEND_ENTITY_PROPERTY(PROP_STAGE_ALTITUDE, appendValue, getAltitude()); APPEND_ENTITY_PROPERTY(PROP_STAGE_DAY, appendValue, getDay()); APPEND_ENTITY_PROPERTY(PROP_STAGE_HOUR, appendValue, getHour()); + APPEND_ENTITY_PROPERTY(PROP_STAGE_AUTOMATIC_HOURDAY, appendValue, getAutomaticHourDay()); return true; } @@ -91,6 +108,7 @@ bool StagePropertyGroup::decodeFromEditPacket(EntityPropertyFlags& propertyFlags READ_ENTITY_PROPERTY(PROP_STAGE_ALTITUDE, float, _altitude); READ_ENTITY_PROPERTY(PROP_STAGE_DAY, quint16, _day); READ_ENTITY_PROPERTY(PROP_STAGE_HOUR, float, _hour); + READ_ENTITY_PROPERTY(PROP_STAGE_AUTOMATIC_HOURDAY, bool, _automaticHourDay); DECODE_GROUP_PROPERTY_HAS_CHANGED(PROP_STAGE_SUN_MODEL_ENABLED, SunModelEnabled); DECODE_GROUP_PROPERTY_HAS_CHANGED(PROP_STAGE_LATITUDE, Latitude); @@ -98,6 +116,7 @@ bool StagePropertyGroup::decodeFromEditPacket(EntityPropertyFlags& propertyFlags DECODE_GROUP_PROPERTY_HAS_CHANGED(PROP_STAGE_ALTITUDE, Altitude); DECODE_GROUP_PROPERTY_HAS_CHANGED(PROP_STAGE_DAY, Day); DECODE_GROUP_PROPERTY_HAS_CHANGED(PROP_STAGE_HOUR, Hour); + DECODE_GROUP_PROPERTY_HAS_CHANGED(PROP_STAGE_AUTOMATIC_HOURDAY, AutomaticHourDay); processedBytes += bytesRead; @@ -111,6 +130,7 @@ void StagePropertyGroup::markAllChanged() { _altitudeChanged = true; _dayChanged = true; _hourChanged = true; + _automaticHourDayChanged = true; } EntityPropertyFlags StagePropertyGroup::getChangedProperties() const { @@ -122,6 +142,7 @@ EntityPropertyFlags StagePropertyGroup::getChangedProperties() const { CHECK_PROPERTY_CHANGE(PROP_STAGE_ALTITUDE, altitude); CHECK_PROPERTY_CHANGE(PROP_STAGE_DAY, day); CHECK_PROPERTY_CHANGE(PROP_STAGE_HOUR, hour); + CHECK_PROPERTY_CHANGE(PROP_STAGE_AUTOMATIC_HOURDAY, automaticHourDay); return changedProperties; } @@ -133,6 +154,7 @@ void StagePropertyGroup::getProperties(EntityItemProperties& properties) const { COPY_ENTITY_GROUP_PROPERTY_TO_PROPERTIES(Stage, Altitude, getAltitude); COPY_ENTITY_GROUP_PROPERTY_TO_PROPERTIES(Stage, Day, getDay); COPY_ENTITY_GROUP_PROPERTY_TO_PROPERTIES(Stage, Hour, getHour); + COPY_ENTITY_GROUP_PROPERTY_TO_PROPERTIES(Stage, AutomaticHourDay, getAutomaticHourDay); } bool StagePropertyGroup::setProperties(const EntityItemProperties& properties) { @@ -144,6 +166,7 @@ bool StagePropertyGroup::setProperties(const EntityItemProperties& properties) { SET_ENTITY_GROUP_PROPERTY_FROM_PROPERTIES(Stage, Altitude, altitude, setAltitude); SET_ENTITY_GROUP_PROPERTY_FROM_PROPERTIES(Stage, Day, day, setDay); SET_ENTITY_GROUP_PROPERTY_FROM_PROPERTIES(Stage, Hour, hour, setHour); + SET_ENTITY_GROUP_PROPERTY_FROM_PROPERTIES(Stage, AutomaticHourDay, automaticHourDay, setAutomaticHourDay); return somethingChanged; } @@ -157,6 +180,7 @@ EntityPropertyFlags StagePropertyGroup::getEntityProperties(EncodeBitstreamParam requestedProperties += PROP_STAGE_ALTITUDE; requestedProperties += PROP_STAGE_DAY; requestedProperties += PROP_STAGE_HOUR; + requestedProperties += PROP_STAGE_AUTOMATIC_HOURDAY; return requestedProperties; } @@ -177,7 +201,7 @@ void StagePropertyGroup::appendSubclassData(OctreePacketData* packetData, Encode APPEND_ENTITY_PROPERTY(PROP_STAGE_ALTITUDE, appendValue, getAltitude()); APPEND_ENTITY_PROPERTY(PROP_STAGE_DAY, appendValue, getDay()); APPEND_ENTITY_PROPERTY(PROP_STAGE_HOUR, appendValue, getHour()); - + APPEND_ENTITY_PROPERTY(PROP_STAGE_AUTOMATIC_HOURDAY, appendValue, getAutomaticHourDay()); } int StagePropertyGroup::readEntitySubclassDataFromBuffer(const unsigned char* data, int bytesLeftToRead, @@ -193,6 +217,41 @@ int StagePropertyGroup::readEntitySubclassDataFromBuffer(const unsigned char* da READ_ENTITY_PROPERTY(PROP_STAGE_ALTITUDE, float, _altitude); READ_ENTITY_PROPERTY(PROP_STAGE_DAY, quint16, _day); READ_ENTITY_PROPERTY(PROP_STAGE_HOUR, float, _hour); + READ_ENTITY_PROPERTY(PROP_STAGE_AUTOMATIC_HOURDAY, bool, _automaticHourDay); return bytesRead; } + +static const float TOTAL_LONGITUDES = 360.0f; +static const float HOURS_PER_DAY = 24; +static const float SECONDS_PER_DAY = 60 * 60 * HOURS_PER_DAY; +static const float MSECS_PER_DAY = SECONDS_PER_DAY * MSECS_PER_SECOND; + +float StagePropertyGroup::calculateHour() const { + if (!_automaticHourDay) { + return _hour; + } + + QDateTime utc(QDateTime::currentDateTimeUtc()); + float adjustFromUTC = (_longitude / TOTAL_LONGITUDES); + float offsetFromUTCinMsecs = adjustFromUTC * MSECS_PER_DAY; + int msecsSinceStartOfDay = utc.time().msecsSinceStartOfDay(); + float calutatedHour = ((msecsSinceStartOfDay + offsetFromUTCinMsecs) / MSECS_PER_DAY) * HOURS_PER_DAY; + + // calculate hour based on longitude and time from GMT + return calutatedHour; +} + +uint16_t StagePropertyGroup::calculateDay() const { + + if (!_automaticHourDay) { + return _day; + } + + QDateTime utc(QDateTime::currentDateTimeUtc()); + int calutatedDay = utc.date().dayOfYear(); + + // calculate day based on longitude and time from GMT + return calutatedDay; +} + diff --git a/libraries/entities/src/StagePropertyGroup.h b/libraries/entities/src/StagePropertyGroup.h index 3a1adb1c88..c5df4fe0bd 100644 --- a/libraries/entities/src/StagePropertyGroup.h +++ b/libraries/entities/src/StagePropertyGroup.h @@ -75,6 +75,9 @@ public: static const float DEFAULT_STAGE_ALTITUDE; static const quint16 DEFAULT_STAGE_DAY; static const float DEFAULT_STAGE_HOUR; + + float calculateHour() const; + uint16_t calculateDay() const; DEFINE_PROPERTY(PROP_STAGE_SUN_MODEL_ENABLED, SunModelEnabled, sunModelEnabled, bool); DEFINE_PROPERTY(PROP_STAGE_LATITUDE, Latitude, latitude, float); @@ -82,6 +85,7 @@ public: DEFINE_PROPERTY(PROP_STAGE_ALTITUDE, Altitude, altitude, float); DEFINE_PROPERTY(PROP_STAGE_DAY, Day, day, uint16_t); DEFINE_PROPERTY(PROP_STAGE_HOUR, Hour, hour, float); + DEFINE_PROPERTY(PROP_STAGE_AUTOMATIC_HOURDAY, AutomaticHourDay, automaticHourDay, bool); }; #endif // hifi_StagePropertyGroup_h diff --git a/libraries/networking/src/PacketHeaders.cpp b/libraries/networking/src/PacketHeaders.cpp index ec83e18c3d..2fff9c8bb5 100644 --- a/libraries/networking/src/PacketHeaders.cpp +++ b/libraries/networking/src/PacketHeaders.cpp @@ -74,7 +74,7 @@ PacketVersion versionForPacketType(PacketType type) { return 1; case PacketTypeEntityAddOrEdit: case PacketTypeEntityData: - return VERSION_ENTITIES_ZONE_ENTITIES_HAVE_SKYBOX; + return VERSION_ENTITIES_ZONE_ENTITIES_STAGE_HAS_AUTOMATIC_HOURDAY; case PacketTypeEntityErase: return 2; case PacketTypeAudioStreamStats: diff --git a/libraries/networking/src/PacketHeaders.h b/libraries/networking/src/PacketHeaders.h index 38aeed4993..80d32446c8 100644 --- a/libraries/networking/src/PacketHeaders.h +++ b/libraries/networking/src/PacketHeaders.h @@ -142,5 +142,6 @@ const PacketVersion VERSION_ENTITIES_ZONE_ENTITIES_HAVE_DYNAMIC_SHAPE = 18; const PacketVersion VERSION_ENTITIES_HAVE_NAMES = 19; const PacketVersion VERSION_ENTITIES_ZONE_ENTITIES_HAVE_ATMOSPHERE = 20; const PacketVersion VERSION_ENTITIES_ZONE_ENTITIES_HAVE_SKYBOX = 21; +const PacketVersion VERSION_ENTITIES_ZONE_ENTITIES_STAGE_HAS_AUTOMATIC_HOURDAY = 22; #endif // hifi_PacketHeaders_h