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 @@
+
+
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;