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 561f39edd2..56fc84ef96 100644 --- a/examples/html/entityProperties.html +++ b/examples/html/entityProperties.html @@ -286,6 +286,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"); @@ -473,7 +474,7 @@ elZoneSections[i].style.display = 'block'; } - elZoneStageSunModelEnabled.checked = properties.stageSunModelEnabled; + elZoneStageSunModelEnabled.checked = properties.stage.sunModelEnabled; elZoneKeyLightColorRed.value = properties.keyLightColor.red; elZoneKeyLightColorGreen.value = properties.keyLightColor.green; elZoneKeyLightColorBlue.value = properties.keyLightColor.blue; @@ -483,11 +484,12 @@ elZoneKeyLightDirectionY.value = properties.keyLightDirection.y.toFixed(2); elZoneKeyLightDirectionZ.value = properties.keyLightDirection.z.toFixed(2); - elZoneStageLatitude.value = properties.stageLatitude.toFixed(2); - elZoneStageLongitude.value = properties.stageLongitude.toFixed(2); - elZoneStageAltitude.value = properties.stageAltitude.toFixed(2); - elZoneStageDay.value = properties.stageDay; - elZoneStageHour.value = properties.stageHour; + 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; elCompoundShapeURL.value = properties.compoundShapeURL; @@ -627,7 +629,7 @@ elTextBackgroundColorGreen.addEventListener('change', textBackgroundColorChangeFunction); elTextBackgroundColorBlue.addEventListener('change', textBackgroundColorChangeFunction); - elZoneStageSunModelEnabled.addEventListener('change', createEmitCheckedPropertyUpdateFunction('stageSunModelEnabled')); + elZoneStageSunModelEnabled.addEventListener('change', createEmitGroupCheckedPropertyUpdateFunction('stage','sunModelEnabled')); var zoneKeyLightColorChangeFunction = createEmitColorPropertyUpdateFunction( 'keyLightColor', elZoneKeyLightColorRed, elZoneKeyLightColorGreen, elZoneKeyLightColorBlue); elZoneKeyLightColorRed.addEventListener('change', zoneKeyLightColorChangeFunction); @@ -641,11 +643,12 @@ elZoneKeyLightDirectionY.addEventListener('change', zoneKeyLightDirectionChangeFunction); elZoneKeyLightDirectionZ.addEventListener('change', zoneKeyLightDirectionChangeFunction); - elZoneStageLatitude.addEventListener('change', createEmitNumberPropertyUpdateFunction('stageLatitude')); - elZoneStageLongitude.addEventListener('change', createEmitNumberPropertyUpdateFunction('stageLongitude')); - elZoneStageAltitude.addEventListener('change', createEmitNumberPropertyUpdateFunction('stageAltitude')); - elZoneStageDay.addEventListener('change', createEmitNumberPropertyUpdateFunction('stageDay')); - elZoneStageHour.addEventListener('change', createEmitNumberPropertyUpdateFunction('stageHour')); + 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')); elZoneBackgroundMode.addEventListener('change', createEmitTextPropertyUpdateFunction('backgroundMode')); @@ -1102,6 +1105,14 @@ + +
+ Automatically calculate stage hour and day from location and clock. + + + +
+
Stage Day
diff --git a/libraries/entities-renderer/src/EntityTreeRenderer.cpp b/libraries/entities-renderer/src/EntityTreeRenderer.cpp index c10d673890..943a3824c3 100644 --- a/libraries/entities-renderer/src/EntityTreeRenderer.cpp +++ b/libraries/entities-renderer/src/EntityTreeRenderer.cpp @@ -142,7 +142,7 @@ QString EntityTreeRenderer::loadScriptContents(const QString& scriptMaybeURLorTe QUrl url(scriptMaybeURLorText); // If the url is not valid, this must be script text... - if (!url.isValid() || scriptMaybeURLorText.startsWith("(")) { + if (!url.isValid()) { isURL = false; return scriptMaybeURLorText; } @@ -423,11 +423,11 @@ void EntityTreeRenderer::render(RenderArgs::RenderMode renderMode, scene->setKeyLightIntensity(_bestZone->getKeyLightIntensity()); scene->setKeyLightAmbientIntensity(_bestZone->getKeyLightAmbientIntensity()); scene->setKeyLightDirection(_bestZone->getKeyLightDirection()); - scene->setStageSunModelEnable(_bestZone->getStageSunModelEnabled()); - scene->setStageLocation(_bestZone->getStageLongitude(), _bestZone->getStageLatitude(), - _bestZone->getStageAltitude()); - scene->setStageDayTime(_bestZone->getStageHour()); - scene->setStageYearTime(_bestZone->getStageDay()); + scene->setStageSunModelEnable(_bestZone->getStageProperties().getSunModelEnabled()); + scene->setStageLocation(_bestZone->getStageProperties().getLongitude(), _bestZone->getStageProperties().getLatitude(), + _bestZone->getStageProperties().getAltitude()); + 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/EntityItemProperties.cpp b/libraries/entities/src/EntityItemProperties.cpp index 0b3472fc09..ff54ef88fe 100644 --- a/libraries/entities/src/EntityItemProperties.cpp +++ b/libraries/entities/src/EntityItemProperties.cpp @@ -29,6 +29,7 @@ AtmospherePropertyGroup EntityItemProperties::_staticAtmosphere; SkyboxPropertyGroup EntityItemProperties::_staticSkybox; +StagePropertyGroup EntityItemProperties::_staticStage; EntityPropertyList PROP_LAST_ITEM = (EntityPropertyList)(PROP_AFTER_LAST_ITEM - 1); @@ -83,12 +84,6 @@ EntityItemProperties::EntityItemProperties() : CONSTRUCT_PROPERTY(keyLightIntensity, ZoneEntityItem::DEFAULT_KEYLIGHT_INTENSITY), CONSTRUCT_PROPERTY(keyLightAmbientIntensity, ZoneEntityItem::DEFAULT_KEYLIGHT_AMBIENT_INTENSITY), CONSTRUCT_PROPERTY(keyLightDirection, ZoneEntityItem::DEFAULT_KEYLIGHT_DIRECTION), - CONSTRUCT_PROPERTY(stageSunModelEnabled, ZoneEntityItem::DEFAULT_STAGE_SUN_MODEL_ENABLED), - CONSTRUCT_PROPERTY(stageLatitude, ZoneEntityItem::DEFAULT_STAGE_LATITUDE), - CONSTRUCT_PROPERTY(stageLongitude, ZoneEntityItem::DEFAULT_STAGE_LONGITUDE), - CONSTRUCT_PROPERTY(stageAltitude, ZoneEntityItem::DEFAULT_STAGE_ALTITUDE), - CONSTRUCT_PROPERTY(stageDay, ZoneEntityItem::DEFAULT_STAGE_DAY), - CONSTRUCT_PROPERTY(stageHour, ZoneEntityItem::DEFAULT_STAGE_HOUR), CONSTRUCT_PROPERTY(name, ENTITY_ITEM_DEFAULT_NAME), CONSTRUCT_PROPERTY(backgroundMode, BACKGROUND_MODE_INHERIT), @@ -332,15 +327,9 @@ EntityPropertyFlags EntityItemProperties::getChangedProperties() const { CHECK_PROPERTY_CHANGE(PROP_KEYLIGHT_INTENSITY, keyLightIntensity); CHECK_PROPERTY_CHANGE(PROP_KEYLIGHT_AMBIENT_INTENSITY, keyLightAmbientIntensity); CHECK_PROPERTY_CHANGE(PROP_KEYLIGHT_DIRECTION, keyLightDirection); - CHECK_PROPERTY_CHANGE(PROP_STAGE_SUN_MODEL_ENABLED, stageSunModelEnabled); - CHECK_PROPERTY_CHANGE(PROP_STAGE_LATITUDE, stageLatitude); - CHECK_PROPERTY_CHANGE(PROP_STAGE_LONGITUDE, stageLongitude); - 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_BACKGROUND_MODE, backgroundMode); - + + changedProperties += _stage.getChangedProperties(); changedProperties += _atmosphere.getChangedProperties(); changedProperties += _skybox.getChangedProperties(); @@ -419,12 +408,6 @@ QScriptValue EntityItemProperties::copyToScriptValue(QScriptEngine* engine, bool COPY_PROPERTY_TO_QSCRIPTVALUE(keyLightIntensity); COPY_PROPERTY_TO_QSCRIPTVALUE(keyLightAmbientIntensity); COPY_PROPERTY_TO_QSCRIPTVALUE_VEC3(keyLightDirection); - COPY_PROPERTY_TO_QSCRIPTVALUE(stageSunModelEnabled); - COPY_PROPERTY_TO_QSCRIPTVALUE(stageLatitude); - COPY_PROPERTY_TO_QSCRIPTVALUE(stageLongitude); - COPY_PROPERTY_TO_QSCRIPTVALUE(stageAltitude); - COPY_PROPERTY_TO_QSCRIPTVALUE(stageDay); - COPY_PROPERTY_TO_QSCRIPTVALUE(stageHour); COPY_PROPERTY_TO_QSCRIPTVALUE_GETTER(backgroundMode, getBackgroundModeAsString()); // Sitting properties support @@ -460,6 +443,7 @@ QScriptValue EntityItemProperties::copyToScriptValue(QScriptEngine* engine, bool COPY_PROPERTY_TO_QSCRIPTVALUE_GETTER_NO_SKIP(originalTextures, textureNamesList); // gettable, but not settable } + _stage.copyToScriptValue(properties, engine, skipDefaults, defaultEntityProperties); _atmosphere.copyToScriptValue(properties, engine, skipDefaults, defaultEntityProperties); _skybox.copyToScriptValue(properties, engine, skipDefaults, defaultEntityProperties); @@ -525,13 +509,9 @@ void EntityItemProperties::copyFromScriptValue(const QScriptValue& object) { COPY_PROPERTY_FROM_QSCRIPTVALUE_FLOAT(keyLightIntensity, setKeyLightIntensity); COPY_PROPERTY_FROM_QSCRIPTVALUE_FLOAT(keyLightAmbientIntensity, setKeyLightAmbientIntensity); COPY_PROPERTY_FROM_QSCRIPTVALUE_VEC3(keyLightDirection, setKeyLightDirection); - COPY_PROPERTY_FROM_QSCRIPTVALUE_BOOL(stageSunModelEnabled, setStageSunModelEnabled); - COPY_PROPERTY_FROM_QSCRIPTVALUE_FLOAT(stageLatitude, setStageLatitude); - COPY_PROPERTY_FROM_QSCRIPTVALUE_FLOAT(stageLongitude, setStageLongitude); - COPY_PROPERTY_FROM_QSCRIPTVALUE_FLOAT(stageAltitude, setStageAltitude); - COPY_PROPERTY_FROM_QSCRIPTVALUE_INT(stageDay, setStageDay); - COPY_PROPERTY_FROM_QSCRIPTVALUE_FLOAT(stageHour, setStageHour); COPY_PROPERTY_FROM_QSCRITPTVALUE_ENUM(backgroundMode, BackgroundMode); + + _stage.copyFromScriptValue(object, _defaultSettings); _atmosphere.copyFromScriptValue(object, _defaultSettings); _skybox.copyFromScriptValue(object, _defaultSettings); _lastEdited = usecTimestampNow(); @@ -729,13 +709,10 @@ bool EntityItemProperties::encodeEntityEditPacket(PacketType command, EntityItem APPEND_ENTITY_PROPERTY(PROP_KEYLIGHT_INTENSITY, appendValue, properties.getKeyLightIntensity()); APPEND_ENTITY_PROPERTY(PROP_KEYLIGHT_AMBIENT_INTENSITY, appendValue, properties.getKeyLightAmbientIntensity()); APPEND_ENTITY_PROPERTY(PROP_KEYLIGHT_DIRECTION, appendValue, properties.getKeyLightDirection()); - APPEND_ENTITY_PROPERTY(PROP_STAGE_SUN_MODEL_ENABLED, appendValue, properties.getStageSunModelEnabled()); - APPEND_ENTITY_PROPERTY(PROP_STAGE_LATITUDE, appendValue, properties.getStageLatitude()); - APPEND_ENTITY_PROPERTY(PROP_STAGE_LONGITUDE, appendValue, properties.getStageLongitude()); - APPEND_ENTITY_PROPERTY(PROP_STAGE_ALTITUDE, appendValue, properties.getStageAltitude()); - APPEND_ENTITY_PROPERTY(PROP_STAGE_DAY, appendValue, properties.getStageDay()); - APPEND_ENTITY_PROPERTY(PROP_STAGE_HOUR, appendValue, properties.getStageHour()); - + + _staticStage.setProperties(properties); + _staticStage.appentToEditPacket(packetData, requestedProperties, propertyFlags, propertiesDidntFit, propertyCount, appendState ); + APPEND_ENTITY_PROPERTY(PROP_SHAPE_TYPE, appendValue, (uint32_t)properties.getShapeType()); APPEND_ENTITY_PROPERTY(PROP_COMPOUND_SHAPE_URL, appendValue, properties.getCompoundShapeURL()); @@ -987,12 +964,9 @@ bool EntityItemProperties::decodeEntityEditPacket(const unsigned char* data, int READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_KEYLIGHT_INTENSITY, float, setKeyLightIntensity); READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_KEYLIGHT_AMBIENT_INTENSITY, float, setKeyLightAmbientIntensity); READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_KEYLIGHT_DIRECTION, glm::vec3, setKeyLightDirection); - READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_STAGE_SUN_MODEL_ENABLED, bool, setStageSunModelEnabled); - READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_STAGE_LATITUDE, float, setStageLatitude); - READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_STAGE_LONGITUDE, float, setStageLongitude); - READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_STAGE_ALTITUDE, float, setStageAltitude); - READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_STAGE_DAY, quint16, setStageDay); - READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_STAGE_HOUR, float, setStageHour); + + properties.getStage().decodeFromEditPacket(propertyFlags, dataAt , processedBytes); + 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_BACKGROUND_MODE, BackgroundMode, setBackgroundMode); @@ -1093,14 +1067,9 @@ void EntityItemProperties::markAllChanged() { _keyLightIntensityChanged = true; _keyLightAmbientIntensityChanged = true; _keyLightDirectionChanged = true; - _stageSunModelEnabledChanged = true; - _stageLatitudeChanged = true; - _stageLongitudeChanged = true; - _stageAltitudeChanged = true; - _stageDayChanged = true; - _stageHourChanged = true; _backgroundModeChanged = true; + _stage.markAllChanged(); _atmosphere.markAllChanged(); _skybox.markAllChanged(); diff --git a/libraries/entities/src/EntityItemProperties.h b/libraries/entities/src/EntityItemProperties.h index 13b2377032..0accdf0899 100644 --- a/libraries/entities/src/EntityItemProperties.h +++ b/libraries/entities/src/EntityItemProperties.h @@ -30,11 +30,12 @@ #include #include "AtmospherePropertyGroup.h" -#include "SkyboxPropertyGroup.h" #include "EntityItemID.h" #include "EntityItemPropertiesMacros.h" #include "EntityTypes.h" #include "EntityPropertyFlags.h" +#include "SkyboxPropertyGroup.h" +#include "StagePropertyGroup.h" const quint64 UNKNOWN_CREATED_TIME = 0; @@ -132,14 +133,9 @@ public: DEFINE_PROPERTY(PROP_KEYLIGHT_INTENSITY, KeyLightIntensity, keyLightIntensity, float); DEFINE_PROPERTY(PROP_KEYLIGHT_AMBIENT_INTENSITY, KeyLightAmbientIntensity, keyLightAmbientIntensity, float); DEFINE_PROPERTY_REF(PROP_KEYLIGHT_DIRECTION, KeyLightDirection, keyLightDirection, glm::vec3); - DEFINE_PROPERTY(PROP_STAGE_SUN_MODEL_ENABLED, StageSunModelEnabled, stageSunModelEnabled, bool); - DEFINE_PROPERTY(PROP_STAGE_LATITUDE, StageLatitude, stageLatitude, float); - DEFINE_PROPERTY(PROP_STAGE_LONGITUDE, StageLongitude, stageLongitude, float); - DEFINE_PROPERTY(PROP_STAGE_ALTITUDE, StageAltitude, stageAltitude, float); - DEFINE_PROPERTY(PROP_STAGE_DAY, StageDay, stageDay, quint16); - DEFINE_PROPERTY(PROP_STAGE_HOUR, StageHour, stageHour, float); DEFINE_PROPERTY_REF(PROP_NAME, Name, name, QString); DEFINE_PROPERTY_REF_ENUM(PROP_BACKGROUND_MODE, BackgroundMode, backgroundMode, BackgroundMode); + DEFINE_PROPERTY_GROUP(Stage, stage, StagePropertyGroup); DEFINE_PROPERTY_GROUP(Atmosphere, atmosphere, AtmospherePropertyGroup); DEFINE_PROPERTY_GROUP(Skybox, skybox, SkyboxPropertyGroup); @@ -280,6 +276,7 @@ inline QDebug operator<<(QDebug debug, const EntityItemProperties& properties) { DEBUG_PROPERTY_IF_CHANGED(debug, properties, MarketplaceID, marketplaceID, ""); DEBUG_PROPERTY_IF_CHANGED(debug, properties, BackgroundMode, backgroundMode, ""); + properties.getStage().debugDump(); properties.getAtmosphere().debugDump(); properties.getSkybox().debugDump(); diff --git a/libraries/entities/src/EntityItemPropertiesMacros.h b/libraries/entities/src/EntityItemPropertiesMacros.h index 1b10b6eb7a..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); \ @@ -316,6 +325,20 @@ } \ } +#define COPY_GROUP_PROPERTY_FROM_QSCRIPTVALUE_UINT16(G, P, S) \ + { \ + QScriptValue G = object.property(#G); \ + if (G.isValid()) { \ + QScriptValue P = G.property(#P); \ + if (P.isValid()) { \ + uint16_t newValue = P.toVariant().toInt(); \ + if (_defaultSettings || newValue != _##P) { \ + S(newValue); \ + } \ + } \ + } \ + } + #define COPY_PROPERTY_FROM_QSCRIPTVALUE_INT(P, S) \ QScriptValue P = object.property(#P); \ if (P.isValid()) { \ @@ -325,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()) { \ @@ -334,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 new file mode 100644 index 0000000000..80bb763988 --- /dev/null +++ b/libraries/entities/src/StagePropertyGroup.cpp @@ -0,0 +1,257 @@ +// +// StagePropertyGroup.cpp +// libraries/entities/src +// +// Created by Brad Hefta-Gaub on 12/4/13. +// Copyright 2013 High Fidelity, Inc. +// +// Distributed under the Apache License, Version 2.0. +// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html +// + +#include +#include +#include + +#include + +#include "StagePropertyGroup.h" +#include "EntityItemProperties.h" +#include "EntityItemPropertiesMacros.h" + +const bool StagePropertyGroup::DEFAULT_STAGE_SUN_MODEL_ENABLED = false; +const float StagePropertyGroup::DEFAULT_STAGE_LATITUDE = 37.777f; +const float StagePropertyGroup::DEFAULT_STAGE_LONGITUDE = 122.407f; +const float StagePropertyGroup::DEFAULT_STAGE_ALTITUDE = 0.03f; +const quint16 StagePropertyGroup::DEFAULT_STAGE_DAY = 60; +const float StagePropertyGroup::DEFAULT_STAGE_HOUR = 12.0f; + +StagePropertyGroup::StagePropertyGroup() { + _sunModelEnabled = DEFAULT_STAGE_SUN_MODEL_ENABLED; + _latitude = DEFAULT_STAGE_LATITUDE; + _longitude = DEFAULT_STAGE_LONGITUDE; + _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 { + COPY_GROUP_PROPERTY_TO_QSCRIPTVALUE(Stage, stage, SunModelEnabled, sunModelEnabled); + COPY_GROUP_PROPERTY_TO_QSCRIPTVALUE(Stage, stage, Latitude, latitude); + COPY_GROUP_PROPERTY_TO_QSCRIPTVALUE(Stage, stage, Longitude, longitude); + 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 { + qDebug() << " StagePropertyGroup: ---------------------------------------------"; + qDebug() << " _sunModelEnabled:" << _sunModelEnabled; + qDebug() << " _latitude:" << _latitude; + qDebug() << " _longitude:" << _longitude; + qDebug() << " _altitude:" << _altitude; + qDebug() << " _day:" << _day; + qDebug() << " _hour:" << _hour; + qDebug() << " _automaticHourDay:" << _automaticHourDay; +} + +bool StagePropertyGroup::appentToEditPacket(OctreePacketData* packetData, + EntityPropertyFlags& requestedProperties, + EntityPropertyFlags& propertyFlags, + EntityPropertyFlags& propertiesDidntFit, + int& propertyCount, + OctreeElement::AppendState& appendState) const { + + bool successPropertyFits = true; + + APPEND_ENTITY_PROPERTY(PROP_STAGE_SUN_MODEL_ENABLED, appendValue, getSunModelEnabled()); + APPEND_ENTITY_PROPERTY(PROP_STAGE_LATITUDE, appendValue, getLatitude()); + APPEND_ENTITY_PROPERTY(PROP_STAGE_LONGITUDE, appendValue, getLongitude()); + 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; +} + + +bool StagePropertyGroup::decodeFromEditPacket(EntityPropertyFlags& propertyFlags, const unsigned char*& dataAt , int& processedBytes) { + + int bytesRead = 0; + bool overwriteLocalData = true; + + READ_ENTITY_PROPERTY(PROP_STAGE_SUN_MODEL_ENABLED, bool, _sunModelEnabled); + READ_ENTITY_PROPERTY(PROP_STAGE_LATITUDE, float, _latitude); + READ_ENTITY_PROPERTY(PROP_STAGE_LONGITUDE, float, _longitude); + 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); + DECODE_GROUP_PROPERTY_HAS_CHANGED(PROP_STAGE_LONGITUDE, Longitude); + 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; + + return true; +} + +void StagePropertyGroup::markAllChanged() { + _sunModelEnabledChanged = true; + _latitudeChanged = true; + _longitudeChanged = true; + _altitudeChanged = true; + _dayChanged = true; + _hourChanged = true; + _automaticHourDayChanged = true; +} + +EntityPropertyFlags StagePropertyGroup::getChangedProperties() const { + EntityPropertyFlags changedProperties; + + CHECK_PROPERTY_CHANGE(PROP_STAGE_SUN_MODEL_ENABLED, sunModelEnabled); + CHECK_PROPERTY_CHANGE(PROP_STAGE_LATITUDE, latitude); + CHECK_PROPERTY_CHANGE(PROP_STAGE_LONGITUDE, longitude); + 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; +} + +void StagePropertyGroup::getProperties(EntityItemProperties& properties) const { + COPY_ENTITY_GROUP_PROPERTY_TO_PROPERTIES(Stage, SunModelEnabled, getSunModelEnabled); + COPY_ENTITY_GROUP_PROPERTY_TO_PROPERTIES(Stage, Latitude, getLatitude); + COPY_ENTITY_GROUP_PROPERTY_TO_PROPERTIES(Stage, Longitude, getLongitude); + 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) { + bool somethingChanged = false; + + SET_ENTITY_GROUP_PROPERTY_FROM_PROPERTIES(Stage, SunModelEnabled, sunModelEnabled, setSunModelEnabled); + SET_ENTITY_GROUP_PROPERTY_FROM_PROPERTIES(Stage, Latitude, latitude, setLatitude); + SET_ENTITY_GROUP_PROPERTY_FROM_PROPERTIES(Stage, Longitude, longitude, setLongitude); + 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; +} + +EntityPropertyFlags StagePropertyGroup::getEntityProperties(EncodeBitstreamParams& params) const { + EntityPropertyFlags requestedProperties; + + requestedProperties += PROP_STAGE_SUN_MODEL_ENABLED; + requestedProperties += PROP_STAGE_LATITUDE; + requestedProperties += PROP_STAGE_LONGITUDE; + requestedProperties += PROP_STAGE_ALTITUDE; + requestedProperties += PROP_STAGE_DAY; + requestedProperties += PROP_STAGE_HOUR; + requestedProperties += PROP_STAGE_AUTOMATIC_HOURDAY; + + return requestedProperties; +} + +void StagePropertyGroup::appendSubclassData(OctreePacketData* packetData, EncodeBitstreamParams& params, + EntityTreeElementExtraEncodeData* entityTreeElementExtraEncodeData, + EntityPropertyFlags& requestedProperties, + EntityPropertyFlags& propertyFlags, + EntityPropertyFlags& propertiesDidntFit, + int& propertyCount, + OctreeElement::AppendState& appendState) const { + + bool successPropertyFits = true; + + APPEND_ENTITY_PROPERTY(PROP_STAGE_SUN_MODEL_ENABLED, appendValue, getSunModelEnabled()); + APPEND_ENTITY_PROPERTY(PROP_STAGE_LATITUDE, appendValue, getLatitude()); + APPEND_ENTITY_PROPERTY(PROP_STAGE_LONGITUDE, appendValue, getLongitude()); + 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, + ReadBitstreamToTreeParams& args, + EntityPropertyFlags& propertyFlags, bool overwriteLocalData) { + + int bytesRead = 0; + const unsigned char* dataAt = data; + + READ_ENTITY_PROPERTY(PROP_STAGE_SUN_MODEL_ENABLED, bool, _sunModelEnabled); + READ_ENTITY_PROPERTY(PROP_STAGE_LATITUDE, float, _latitude); + READ_ENTITY_PROPERTY(PROP_STAGE_LONGITUDE, float, _longitude); + 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 new file mode 100644 index 0000000000..c5df4fe0bd --- /dev/null +++ b/libraries/entities/src/StagePropertyGroup.h @@ -0,0 +1,91 @@ +// +// StagePropertyGroup.h +// libraries/entities/src +// +// Created by Brad Hefta-Gaub on 12/4/13. +// Copyright 2013 High Fidelity, Inc. +// +// Distributed under the Apache License, Version 2.0. +// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html +// + +#ifndef hifi_StagePropertyGroup_h +#define hifi_StagePropertyGroup_h + +#include + +#include "PropertyGroup.h" +#include "EntityItemPropertiesMacros.h" + +class EntityItemProperties; +class EncodeBitstreamParams; +class OctreePacketData; +class EntityTreeElementExtraEncodeData; +class ReadBitstreamToTreeParams; + +#include +#include + + +class StagePropertyGroup : public PropertyGroup { +public: + StagePropertyGroup(); + virtual ~StagePropertyGroup() {} + + // EntityItemProperty related helpers + virtual void copyToScriptValue(QScriptValue& properties, QScriptEngine* engine, bool skipDefaults, EntityItemProperties& defaultEntityProperties) const; + virtual void copyFromScriptValue(const QScriptValue& object, bool& _defaultSettings); + virtual void debugDump() const; + + virtual bool appentToEditPacket(OctreePacketData* packetData, + EntityPropertyFlags& requestedProperties, + EntityPropertyFlags& propertyFlags, + EntityPropertyFlags& propertiesDidntFit, + int& propertyCount, + OctreeElement::AppendState& appendState) const; + + virtual bool decodeFromEditPacket(EntityPropertyFlags& propertyFlags, const unsigned char*& dataAt , int& processedBytes); + virtual void markAllChanged(); + virtual EntityPropertyFlags getChangedProperties() const; + + // EntityItem related helpers + // methods for getting/setting all properties of an entity + virtual void getProperties(EntityItemProperties& propertiesOut) const; + + /// returns true if something changed + virtual bool setProperties(const EntityItemProperties& properties); + + virtual EntityPropertyFlags getEntityProperties(EncodeBitstreamParams& params) const; + + virtual void appendSubclassData(OctreePacketData* packetData, EncodeBitstreamParams& params, + EntityTreeElementExtraEncodeData* entityTreeElementExtraEncodeData, + EntityPropertyFlags& requestedProperties, + EntityPropertyFlags& propertyFlags, + EntityPropertyFlags& propertiesDidntFit, + int& propertyCount, + OctreeElement::AppendState& appendState) const; + + virtual int readEntitySubclassDataFromBuffer(const unsigned char* data, int bytesLeftToRead, + ReadBitstreamToTreeParams& args, + EntityPropertyFlags& propertyFlags, bool overwriteLocalData); + + static const bool DEFAULT_STAGE_SUN_MODEL_ENABLED; + static const float DEFAULT_STAGE_LATITUDE; + static const float DEFAULT_STAGE_LONGITUDE; + 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); + DEFINE_PROPERTY(PROP_STAGE_LONGITUDE, Longitude, longitude, float); + 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/entities/src/ZoneEntityItem.cpp b/libraries/entities/src/ZoneEntityItem.cpp index f8e8eceb9f..b85c543ce4 100644 --- a/libraries/entities/src/ZoneEntityItem.cpp +++ b/libraries/entities/src/ZoneEntityItem.cpp @@ -26,12 +26,6 @@ const xColor ZoneEntityItem::DEFAULT_KEYLIGHT_COLOR = { 255, 255, 255 }; const float ZoneEntityItem::DEFAULT_KEYLIGHT_INTENSITY = 1.0f; const float ZoneEntityItem::DEFAULT_KEYLIGHT_AMBIENT_INTENSITY = 0.5f; const glm::vec3 ZoneEntityItem::DEFAULT_KEYLIGHT_DIRECTION = { 0.0f, -1.0f, 0.0f }; -const bool ZoneEntityItem::DEFAULT_STAGE_SUN_MODEL_ENABLED = false; -const float ZoneEntityItem::DEFAULT_STAGE_LATITUDE = 37.777f; -const float ZoneEntityItem::DEFAULT_STAGE_LONGITUDE = 122.407f; -const float ZoneEntityItem::DEFAULT_STAGE_ALTITUDE = 0.03f; -const quint16 ZoneEntityItem::DEFAULT_STAGE_DAY = 60; -const float ZoneEntityItem::DEFAULT_STAGE_HOUR = 12.0f; const ShapeType ZoneEntityItem::DEFAULT_SHAPE_TYPE = SHAPE_TYPE_BOX; const QString ZoneEntityItem::DEFAULT_COMPOUND_SHAPE_URL = ""; @@ -53,12 +47,6 @@ ZoneEntityItem::ZoneEntityItem(const EntityItemID& entityItemID, const EntityIte _keyLightIntensity = DEFAULT_KEYLIGHT_INTENSITY; _keyLightAmbientIntensity = DEFAULT_KEYLIGHT_AMBIENT_INTENSITY; _keyLightDirection = DEFAULT_KEYLIGHT_DIRECTION; - _stageSunModelEnabled = DEFAULT_STAGE_SUN_MODEL_ENABLED; - _stageLatitude = DEFAULT_STAGE_LATITUDE; - _stageLongitude = DEFAULT_STAGE_LONGITUDE; - _stageAltitude = DEFAULT_STAGE_ALTITUDE; - _stageDay = DEFAULT_STAGE_DAY; - _stageHour = DEFAULT_STAGE_HOUR; _shapeType = DEFAULT_SHAPE_TYPE; _compoundShapeURL = DEFAULT_COMPOUND_SHAPE_URL; @@ -94,15 +82,11 @@ EntityItemProperties ZoneEntityItem::getProperties() const { COPY_ENTITY_PROPERTY_TO_PROPERTIES(keyLightIntensity, getKeyLightIntensity); COPY_ENTITY_PROPERTY_TO_PROPERTIES(keyLightAmbientIntensity, getKeyLightAmbientIntensity); COPY_ENTITY_PROPERTY_TO_PROPERTIES(keyLightDirection, getKeyLightDirection); - COPY_ENTITY_PROPERTY_TO_PROPERTIES(stageSunModelEnabled, getStageSunModelEnabled); - COPY_ENTITY_PROPERTY_TO_PROPERTIES(stageLatitude, getStageLatitude); - COPY_ENTITY_PROPERTY_TO_PROPERTIES(stageLongitude, getStageLongitude); - COPY_ENTITY_PROPERTY_TO_PROPERTIES(stageAltitude, getStageAltitude); - COPY_ENTITY_PROPERTY_TO_PROPERTIES(stageDay, getStageDay); - COPY_ENTITY_PROPERTY_TO_PROPERTIES(stageHour, getStageHour); + + _stageProperties.getProperties(properties); + COPY_ENTITY_PROPERTY_TO_PROPERTIES(shapeType, getShapeType); COPY_ENTITY_PROPERTY_TO_PROPERTIES(compoundShapeURL, getCompoundShapeURL); - COPY_ENTITY_PROPERTY_TO_PROPERTIES(backgroundMode, getBackgroundMode); _atmosphereProperties.getProperties(properties); @@ -119,12 +103,9 @@ bool ZoneEntityItem::setProperties(const EntityItemProperties& properties) { SET_ENTITY_PROPERTY_FROM_PROPERTIES(keyLightIntensity, setKeyLightIntensity); SET_ENTITY_PROPERTY_FROM_PROPERTIES(keyLightAmbientIntensity, setKeyLightAmbientIntensity); SET_ENTITY_PROPERTY_FROM_PROPERTIES(keyLightDirection, setKeyLightDirection); - SET_ENTITY_PROPERTY_FROM_PROPERTIES(stageSunModelEnabled, setStageSunModelEnabled); - SET_ENTITY_PROPERTY_FROM_PROPERTIES(stageLatitude, setStageLatitude); - SET_ENTITY_PROPERTY_FROM_PROPERTIES(stageLongitude, setStageLongitude); - SET_ENTITY_PROPERTY_FROM_PROPERTIES(stageAltitude, setStageAltitude); - SET_ENTITY_PROPERTY_FROM_PROPERTIES(stageDay, setStageDay); - SET_ENTITY_PROPERTY_FROM_PROPERTIES(stageHour, setStageHour); + + bool somethingChangedInStage = _stageProperties.setProperties(properties); + SET_ENTITY_PROPERTY_FROM_PROPERTIES(shapeType, updateShapeType); SET_ENTITY_PROPERTY_FROM_PROPERTIES(compoundShapeURL, setCompoundShapeURL); SET_ENTITY_PROPERTY_FROM_PROPERTIES(backgroundMode, setBackgroundMode); @@ -132,7 +113,7 @@ bool ZoneEntityItem::setProperties(const EntityItemProperties& properties) { bool somethingChangedInAtmosphere = _atmosphereProperties.setProperties(properties); bool somethingChangedInSkybox = _skyboxProperties.setProperties(properties); - somethingChanged = somethingChanged || somethingChangedInAtmosphere || somethingChangedInSkybox; + somethingChanged = somethingChanged || somethingChangedInStage || somethingChangedInAtmosphere || somethingChangedInSkybox; if (somethingChanged) { bool wantDebug = false; @@ -158,12 +139,13 @@ int ZoneEntityItem::readEntitySubclassDataFromBuffer(const unsigned char* data, READ_ENTITY_PROPERTY(PROP_KEYLIGHT_INTENSITY, float, _keyLightIntensity); READ_ENTITY_PROPERTY(PROP_KEYLIGHT_AMBIENT_INTENSITY, float, _keyLightAmbientIntensity); READ_ENTITY_PROPERTY(PROP_KEYLIGHT_DIRECTION, glm::vec3, _keyLightDirection); - READ_ENTITY_PROPERTY(PROP_STAGE_SUN_MODEL_ENABLED, bool, _stageSunModelEnabled); - READ_ENTITY_PROPERTY(PROP_STAGE_LATITUDE, float, _stageLatitude); - READ_ENTITY_PROPERTY(PROP_STAGE_LONGITUDE, float, _stageLongitude); - READ_ENTITY_PROPERTY(PROP_STAGE_ALTITUDE, float, _stageAltitude); - READ_ENTITY_PROPERTY(PROP_STAGE_DAY, quint16, _stageDay); - READ_ENTITY_PROPERTY(PROP_STAGE_HOUR, float, _stageHour); + + int bytesFromStage = _stageProperties.readEntitySubclassDataFromBuffer(dataAt, (bytesLeftToRead - bytesRead), args, + propertyFlags, overwriteLocalData); + + bytesRead += bytesFromStage; + dataAt += bytesFromStage; + READ_ENTITY_PROPERTY_SETTER(PROP_SHAPE_TYPE, ShapeType, updateShapeType); READ_ENTITY_PROPERTY_STRING(PROP_COMPOUND_SHAPE_URL, setCompoundShapeURL); READ_ENTITY_PROPERTY_SETTER(PROP_BACKGROUND_MODE, BackgroundMode, setBackgroundMode); @@ -191,15 +173,10 @@ EntityPropertyFlags ZoneEntityItem::getEntityProperties(EncodeBitstreamParams& p requestedProperties += PROP_KEYLIGHT_INTENSITY; requestedProperties += PROP_KEYLIGHT_AMBIENT_INTENSITY; requestedProperties += PROP_KEYLIGHT_DIRECTION; - requestedProperties += PROP_STAGE_SUN_MODEL_ENABLED; - requestedProperties += PROP_STAGE_LATITUDE; - requestedProperties += PROP_STAGE_LONGITUDE; - requestedProperties += PROP_STAGE_ALTITUDE; - requestedProperties += PROP_STAGE_DAY; - requestedProperties += PROP_STAGE_HOUR; requestedProperties += PROP_SHAPE_TYPE; requestedProperties += PROP_COMPOUND_SHAPE_URL; requestedProperties += PROP_BACKGROUND_MODE; + requestedProperties += _stageProperties.getEntityProperties(params); requestedProperties += _atmosphereProperties.getEntityProperties(params); requestedProperties += _skyboxProperties.getEntityProperties(params); @@ -220,12 +197,11 @@ void ZoneEntityItem::appendSubclassData(OctreePacketData* packetData, EncodeBits APPEND_ENTITY_PROPERTY(PROP_KEYLIGHT_INTENSITY, appendValue, getKeyLightIntensity()); APPEND_ENTITY_PROPERTY(PROP_KEYLIGHT_AMBIENT_INTENSITY, appendValue, getKeyLightAmbientIntensity()); APPEND_ENTITY_PROPERTY(PROP_KEYLIGHT_DIRECTION, appendValue, getKeyLightDirection()); - APPEND_ENTITY_PROPERTY(PROP_STAGE_SUN_MODEL_ENABLED, appendValue, getStageSunModelEnabled()); - APPEND_ENTITY_PROPERTY(PROP_STAGE_LATITUDE, appendValue, getStageLatitude()); - APPEND_ENTITY_PROPERTY(PROP_STAGE_LONGITUDE, appendValue, getStageLongitude()); - APPEND_ENTITY_PROPERTY(PROP_STAGE_ALTITUDE, appendValue, getStageAltitude()); - APPEND_ENTITY_PROPERTY(PROP_STAGE_DAY, appendValue, getStageDay()); - APPEND_ENTITY_PROPERTY(PROP_STAGE_HOUR, appendValue, getStageHour()); + + _stageProperties.appendSubclassData(packetData, params, modelTreeElementExtraEncodeData, requestedProperties, + propertyFlags, propertiesDidntFit, propertyCount, appendState); + + APPEND_ENTITY_PROPERTY(PROP_SHAPE_TYPE, appendValue, (uint32_t)getShapeType()); APPEND_ENTITY_PROPERTY(PROP_COMPOUND_SHAPE_URL, appendValue, getCompoundShapeURL()); APPEND_ENTITY_PROPERTY(PROP_BACKGROUND_MODE, appendValue, (uint32_t)getBackgroundMode()); // could this be a uint16?? @@ -248,14 +224,9 @@ void ZoneEntityItem::debugDump() const { qCDebug(entities) << " _keyLightIntensity:" << _keyLightIntensity; qCDebug(entities) << " _keyLightAmbientIntensity:" << _keyLightAmbientIntensity; qCDebug(entities) << " _keyLightDirection:" << _keyLightDirection; - qCDebug(entities) << " _stageSunModelEnabled:" << _stageSunModelEnabled; - qCDebug(entities) << " _stageLatitude:" << _stageLatitude; - qCDebug(entities) << " _stageLongitude:" << _stageLongitude; - qCDebug(entities) << " _stageAltitude:" << _stageAltitude; - qCDebug(entities) << " _stageDay:" << _stageDay; - qCDebug(entities) << " _stageHour:" << _stageHour; qCDebug(entities) << " _backgroundMode:" << EntityItemProperties::getBackgroundModeString(_backgroundMode); + _stageProperties.debugDump(); _atmosphereProperties.debugDump(); _skyboxProperties.debugDump(); } diff --git a/libraries/entities/src/ZoneEntityItem.h b/libraries/entities/src/ZoneEntityItem.h index 6c67ea72dd..4388bf908a 100644 --- a/libraries/entities/src/ZoneEntityItem.h +++ b/libraries/entities/src/ZoneEntityItem.h @@ -69,24 +69,6 @@ public: const glm::vec3& getKeyLightDirection() const { return _keyLightDirection; } void setKeyLightDirection(const glm::vec3& value) { _keyLightDirection = value; } - bool getStageSunModelEnabled() const { return _stageSunModelEnabled; } - void setStageSunModelEnabled(bool value) { _stageSunModelEnabled = value; } - - float getStageLatitude() const { return _stageLatitude; } - void setStageLatitude(float value) { _stageLatitude = value; } - - float getStageLongitude() const { return _stageLongitude; } - void setStageLongitude(float value) { _stageLongitude = value; } - - float getStageAltitude() const { return _stageAltitude; } - void setStageAltitude(float value) { _stageAltitude = value; } - - uint16_t getStageDay() const { return _stageDay; } - void setStageDay(uint16_t value) { _stageDay = value; } - - float getStageHour() const { return _stageHour; } - void setStageHour(float value) { _stageHour = value; } - static bool getZonesArePickable() { return _zonesArePickable; } static void setZonesArePickable(bool value) { _zonesArePickable = value; } @@ -107,6 +89,7 @@ public: EnvironmentData getEnvironmentData() const; const AtmospherePropertyGroup& getAtmosphereProperties() const { return _atmosphereProperties; } const SkyboxPropertyGroup& getSkyboxProperties() const { return _skyboxProperties; } + const StagePropertyGroup& getStageProperties() const { return _stageProperties; } virtual bool supportsDetailedRayIntersection() const { return true; } virtual bool findDetailedRayIntersection(const glm::vec3& origin, const glm::vec3& direction, @@ -119,12 +102,6 @@ public: static const float DEFAULT_KEYLIGHT_INTENSITY; static const float DEFAULT_KEYLIGHT_AMBIENT_INTENSITY; static const glm::vec3 DEFAULT_KEYLIGHT_DIRECTION; - static const bool DEFAULT_STAGE_SUN_MODEL_ENABLED; - static const float DEFAULT_STAGE_LATITUDE; - static const float DEFAULT_STAGE_LONGITUDE; - static const float DEFAULT_STAGE_ALTITUDE; - static const quint16 DEFAULT_STAGE_DAY; - static const float DEFAULT_STAGE_HOUR; static const ShapeType DEFAULT_SHAPE_TYPE; static const QString DEFAULT_COMPOUND_SHAPE_URL; @@ -134,17 +111,13 @@ protected: float _keyLightIntensity; float _keyLightAmbientIntensity; glm::vec3 _keyLightDirection; - bool _stageSunModelEnabled; - float _stageLatitude; - float _stageLongitude; - float _stageAltitude; - uint16_t _stageDay; - float _stageHour; ShapeType _shapeType = DEFAULT_SHAPE_TYPE; QString _compoundShapeURL; BackgroundMode _backgroundMode = BACKGROUND_MODE_INHERIT; + + StagePropertyGroup _stageProperties; AtmospherePropertyGroup _atmosphereProperties; SkyboxPropertyGroup _skyboxProperties; diff --git a/libraries/networking/src/PacketHeaders.cpp b/libraries/networking/src/PacketHeaders.cpp index 32c64becc0..c2b65dbd55 100644 --- a/libraries/networking/src/PacketHeaders.cpp +++ b/libraries/networking/src/PacketHeaders.cpp @@ -72,7 +72,7 @@ PacketVersion versionForPacketType(PacketType packetType) { 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 196b9eaaff..978ba190bb 100644 --- a/libraries/networking/src/PacketHeaders.h +++ b/libraries/networking/src/PacketHeaders.h @@ -172,5 +172,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 diff --git a/libraries/networking/src/ResourceCache.cpp b/libraries/networking/src/ResourceCache.cpp index c182b9c1d8..0b6e39b151 100644 --- a/libraries/networking/src/ResourceCache.cpp +++ b/libraries/networking/src/ResourceCache.cpp @@ -350,7 +350,7 @@ void Resource::maybeRefresh() { QDateTime lastModified = variant.value(); QDateTime lastModifiedOld = metaData.lastModified(); if (lastModified.isValid() && lastModifiedOld.isValid() && - lastModifiedOld >= lastModified) { + lastModifiedOld >= lastModified) { // With >=, cache won't thrash in eventually-consistent cdn. qCDebug(networking) << "Using cached version of" << _url.fileName(); // We don't need to update, return return;