From d053379831d2b9a31f9e80131ed95886a83b1d4d Mon Sep 17 00:00:00 2001 From: David Rowe Date: Wed, 29 Apr 2015 21:23:47 -0700 Subject: [PATCH 01/28] Add "Mute Face Tracking" menu item --- interface/src/Application.cpp | 42 ++++++++++++++++++------ interface/src/Application.h | 2 ++ interface/src/Menu.cpp | 6 ++++ interface/src/Menu.h | 1 + interface/src/avatar/Head.cpp | 2 +- interface/src/avatar/MyAvatar.cpp | 2 +- interface/src/devices/DdeFaceTracker.cpp | 11 +++++-- interface/src/devices/FaceTracker.cpp | 13 +++++++- interface/src/devices/FaceTracker.h | 11 ++++++- interface/src/devices/Faceshift.cpp | 15 ++++++--- interface/src/devices/Faceshift.h | 3 +- tests/ui/src/main.cpp | 1 + 12 files changed, 87 insertions(+), 22 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index d0d01f4534..80231d6342 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -585,6 +585,14 @@ Application::Application(int& argc, char** argv, QElapsedTimer &startup_time) : // The offscreen UI needs to intercept the mouse and keyboard // events coming from the onscreen window _glWidget->installEventFilter(DependencyManager::get().data()); + + // initialize our face trackers after loading the menu settings + auto faceshiftTracker = DependencyManager::get(); + faceshiftTracker->init(); + connect(faceshiftTracker.data(), &FaceTracker::muteToggled, this, &Application::faceTrackerMuteToggled); + auto ddeTracker = DependencyManager::get(); + ddeTracker->init(); + connect(ddeTracker.data(), &FaceTracker::muteToggled, this, &Application::faceTrackerMuteToggled); } @@ -911,6 +919,12 @@ void Application::audioMuteToggled() { muteAction->setChecked(DependencyManager::get()->isMuted()); } +void Application::faceTrackerMuteToggled() { + QAction* muteAction = Menu::getInstance()->getActionForOption(MenuOption::MuteFaceTracking); + Q_CHECK_PTR(muteAction); + muteAction->setChecked(getActiveFaceTracker()->isMuted()); +} + void Application::aboutApp() { InfoView::forcedShow(INFO_HELP_PATH); } @@ -1889,17 +1903,29 @@ FaceTracker* Application::getActiveFaceTracker() { } void Application::setActiveFaceTracker() { + bool isMuted = Menu::getInstance()->isOptionChecked(MenuOption::MuteFaceTracking); #ifdef HAVE_FACESHIFT - DependencyManager::get()->setTCPEnabled(Menu::getInstance()->isOptionChecked(MenuOption::Faceshift)); + auto faceshiftTracker = DependencyManager::get(); + faceshiftTracker->setTCPEnabled(Menu::getInstance()->isOptionChecked(MenuOption::Faceshift)); + faceshiftTracker->setIsMuted(isMuted); #endif #ifdef HAVE_DDE bool isUsingDDE = Menu::getInstance()->isOptionChecked(MenuOption::UseCamera); Menu::getInstance()->getActionForOption(MenuOption::UseAudioForMouth)->setVisible(isUsingDDE); Menu::getInstance()->getActionForOption(MenuOption::VelocityFilter)->setVisible(isUsingDDE); - DependencyManager::get()->setEnabled(isUsingDDE); + auto ddeTracker = DependencyManager::get(); + ddeTracker->setEnabled(isUsingDDE); + ddeTracker->setIsMuted(isMuted); #endif } +void Application::toggleFaceTrackerMute() { + FaceTracker* faceTracker = getActiveFaceTracker(); + if (faceTracker) { + faceTracker->toggleMute(); + } +} + bool Application::exportEntities(const QString& filename, const QVector& entityIDs) { QVector entities; @@ -2068,10 +2094,6 @@ void Application::init() { SixenseManager::getInstance().toggleSixense(true); #endif - // initialize our face trackers after loading the menu settings - DependencyManager::get()->init(); - DependencyManager::get()->init(); - Leapmotion::init(); RealSense::init(); @@ -2209,7 +2231,7 @@ void Application::updateMyAvatarLookAtPosition() { isLookingAtSomeone = true; // If I am looking at someone else, look directly at one of their eyes - if (tracker) { + if (tracker && !tracker->isMuted()) { // If a face tracker is active, look at the eye for the side my gaze is biased toward if (tracker->getEstimatedEyeYaw() > _myAvatar->getHead()->getFinalYaw()) { // Look at their right eye @@ -2235,7 +2257,7 @@ void Application::updateMyAvatarLookAtPosition() { // // Deflect the eyes a bit to match the detected Gaze from 3D camera if active // - if (tracker) { + if (tracker && !tracker->isMuted()) { float eyePitch = tracker->getEstimatedEyePitch(); float eyeYaw = tracker->getEstimatedEyeYaw(); const float GAZE_DEFLECTION_REDUCTION_DURING_EYE_CONTACT = 0.1f; @@ -2290,7 +2312,7 @@ void Application::updateCamera(float deltaTime) { if (!OculusManager::isConnected() && !TV3DManager::isConnected() && Menu::getInstance()->isOptionChecked(MenuOption::OffAxisProjection)) { FaceTracker* tracker = getActiveFaceTracker(); - if (tracker) { + if (tracker && !tracker->isMuted()) { const float EYE_OFFSET_SCALE = 0.025f; glm::vec3 position = tracker->getHeadTranslation() * EYE_OFFSET_SCALE; float xSign = (_myCamera.getMode() == CAMERA_MODE_MIRROR) ? 1.0f : -1.0f; @@ -2353,7 +2375,7 @@ void Application::update(float deltaTime) { PerformanceTimer perfTimer("devices"); DeviceTracker::updateAll(); FaceTracker* tracker = getActiveFaceTracker(); - if (tracker) { + if (tracker && !tracker->isMuted()) { tracker->update(deltaTime); } SixenseManager::getInstance().update(deltaTime); diff --git a/interface/src/Application.h b/interface/src/Application.h index 9f87d05711..91bded9267 100644 --- a/interface/src/Application.h +++ b/interface/src/Application.h @@ -391,6 +391,7 @@ public slots: void resetSensors(); void setActiveFaceTracker(); + void toggleFaceTrackerMute(); void aboutApp(); void showEditEntitiesHelp(); @@ -432,6 +433,7 @@ private slots: void runTests(); void audioMuteToggled(); + void faceTrackerMuteToggled(); void setCursorVisible(bool visible); diff --git a/interface/src/Menu.cpp b/interface/src/Menu.cpp index 90a9d3b22c..789a1ebb27 100644 --- a/interface/src/Menu.cpp +++ b/interface/src/Menu.cpp @@ -394,6 +394,12 @@ Menu::Menu() { QAction* ddeFiltering = addCheckableActionToQMenuAndActionHash(faceTrackingMenu, MenuOption::VelocityFilter, 0, true); ddeFiltering->setVisible(false); #endif +#if defined(HAVE_FACESHIFT) || defined(HAVE_DDE) + faceTrackingMenu->addSeparator(); + addCheckableActionToQMenuAndActionHash(faceTrackingMenu, MenuOption::MuteFaceTracking, + 0, false, + qApp, SLOT(toggleFaceTrackerMute())); +#endif auto avatarManager = DependencyManager::get(); addCheckableActionToQMenuAndActionHash(avatarDebugMenu, MenuOption::AvatarReceiveStats, 0, false, diff --git a/interface/src/Menu.h b/interface/src/Menu.h index 7d105687ab..a622668742 100644 --- a/interface/src/Menu.h +++ b/interface/src/Menu.h @@ -211,6 +211,7 @@ namespace MenuOption { const QString Mirror = "Mirror"; const QString MuteAudio = "Mute Microphone"; const QString MuteEnvironment = "Mute Environment"; + const QString MuteFaceTracking = "Mute Face Tracking"; const QString NoFaceTracking = "None"; const QString OctreeStats = "Entity Statistics"; const QString OffAxisProjection = "Off-Axis Projection"; diff --git a/interface/src/avatar/Head.cpp b/interface/src/avatar/Head.cpp index 41c2e9b54c..16cd906133 100644 --- a/interface/src/avatar/Head.cpp +++ b/interface/src/avatar/Head.cpp @@ -90,7 +90,7 @@ void Head::simulate(float deltaTime, bool isMine, bool billboard) { // Only use face trackers when not playing back a recording. if (!myAvatar->isPlaying()) { FaceTracker* faceTracker = Application::getInstance()->getActiveFaceTracker(); - _isFaceTrackerConnected = faceTracker != NULL; + _isFaceTrackerConnected = faceTracker != NULL && !faceTracker->isMuted(); if (_isFaceTrackerConnected) { _blendshapeCoefficients = faceTracker->getBlendshapeCoefficients(); diff --git a/interface/src/avatar/MyAvatar.cpp b/interface/src/avatar/MyAvatar.cpp index 557d630ebf..73c2e6a6e8 100644 --- a/interface/src/avatar/MyAvatar.cpp +++ b/interface/src/avatar/MyAvatar.cpp @@ -243,7 +243,7 @@ void MyAvatar::updateFromTrackers(float deltaTime) { estimatedPosition /= OCULUS_LEAN_SCALE; } else { FaceTracker* tracker = Application::getInstance()->getActiveFaceTracker(); - if (tracker) { + if (tracker && !tracker->isMuted()) { estimatedPosition = tracker->getHeadTranslation(); _trackedHeadPosition = estimatedPosition; estimatedRotation = glm::degrees(safeEulerAngles(tracker->getHeadRotation())); diff --git a/interface/src/devices/DdeFaceTracker.cpp b/interface/src/devices/DdeFaceTracker.cpp index b6525ffb52..72c53e5826 100644 --- a/interface/src/devices/DdeFaceTracker.cpp +++ b/interface/src/devices/DdeFaceTracker.cpp @@ -316,7 +316,13 @@ float DdeFaceTracker::getBlendshapeCoefficient(int index) const { } void DdeFaceTracker::decodePacket(const QByteArray& buffer) { - if(buffer.size() > MIN_PACKET_SIZE) { + _lastReceiveTimestamp = usecTimestampNow(); + + if (_isMuted) { + return; + } + + if (buffer.size() > MIN_PACKET_SIZE) { bool isFiltering = Menu::getInstance()->isOptionChecked(MenuOption::VelocityFilter); Packet packet; @@ -328,7 +334,7 @@ void DdeFaceTracker::decodePacket(const QByteArray& buffer) { memcpy(&translation, packet.translation, sizeof(packet.translation)); glm::quat rotation; memcpy(&rotation, &packet.rotation, sizeof(packet.rotation)); - if (_reset || (_lastReceiveTimestamp == 0)) { + if (_reset || (_lastMessageReceived == 0)) { memcpy(&_referenceTranslation, &translation, sizeof(glm::vec3)); memcpy(&_referenceRotation, &rotation, sizeof(glm::quat)); _reset = false; @@ -503,5 +509,4 @@ void DdeFaceTracker::decodePacket(const QByteArray& buffer) { } else { qCWarning(interfaceapp) << "DDE Face Tracker: Decode error"; } - _lastReceiveTimestamp = usecTimestampNow(); } diff --git a/interface/src/devices/FaceTracker.cpp b/interface/src/devices/FaceTracker.cpp index 0d40249c26..a6351c2d64 100644 --- a/interface/src/devices/FaceTracker.cpp +++ b/interface/src/devices/FaceTracker.cpp @@ -15,16 +15,22 @@ #include "FaceTracker.h" #include "InterfaceLogging.h" +#include "Menu.h" const int FPS_TIMER_DELAY = 2000; // ms const int FPS_TIMER_DURATION = 2000; // ms FaceTracker::FaceTracker() : _isCalculatingFPS(false), - _frameCount(0) + _frameCount(0), + _isMuted(false) { } +void FaceTracker::init() { + _isMuted = Menu::getInstance()->isOptionChecked(MenuOption::MuteFaceTracking); +} + inline float FaceTracker::getBlendshapeCoefficient(int index) const { return isValidBlendshapeIndex(index) ? glm::mix(0.0f, _blendshapeCoefficients[index], getFadeCoefficient()) : 0.0f; @@ -101,3 +107,8 @@ void FaceTracker::finishFPSTimer() { qCDebug(interfaceapp) << "Face tracker FPS =" << (float)_frameCount / ((float)FPS_TIMER_DURATION / 1000.0f); _isCalculatingFPS = false; } + +void FaceTracker::toggleMute() { + _isMuted = !_isMuted; + emit muteToggled(); +} diff --git a/interface/src/devices/FaceTracker.h b/interface/src/devices/FaceTracker.h index a0a434ee9e..2ffd9f01bf 100644 --- a/interface/src/devices/FaceTracker.h +++ b/interface/src/devices/FaceTracker.h @@ -26,7 +26,7 @@ public: virtual bool isActive() const { return false; } virtual bool isTracking() const { return false; } - virtual void init() {} + virtual void init(); virtual void update(float deltaTime); virtual void reset(); @@ -42,6 +42,13 @@ public: bool isValidBlendshapeIndex(int index) const { return index >= 0 && index < getNumBlendshapes(); } const QVector& getBlendshapeCoefficients() const; float getBlendshapeCoefficient(int index) const; + + bool isMuted() const { return _isMuted; } + void setIsMuted(bool isMuted) { _isMuted = isMuted; } + void toggleMute(); + +signals: + void muteToggled(); protected: FaceTracker(); @@ -56,6 +63,8 @@ protected: float _relaxationStatus = 0.0f; // Between 0.0f and 1.0f float _fadeCoefficient = 0.0f; // Between 0.0f and 1.0f + bool _isMuted; + void countFrame(); private slots: diff --git a/interface/src/devices/Faceshift.cpp b/interface/src/devices/Faceshift.cpp index 8a0e5a324c..3c3386a076 100644 --- a/interface/src/devices/Faceshift.cpp +++ b/interface/src/devices/Faceshift.cpp @@ -50,6 +50,7 @@ Faceshift::Faceshift() : #ifdef HAVE_FACESHIFT void Faceshift::init() { setTCPEnabled(Menu::getInstance()->isOptionChecked(MenuOption::Faceshift)); + FaceTracker::init(); } void Faceshift::update(float deltaTime) { @@ -92,7 +93,7 @@ void Faceshift::reset() { bool Faceshift::isActive() const { const quint64 ACTIVE_TIMEOUT_USECS = 1000000; - return (usecTimestampNow() - _lastTrackingStateReceived) < ACTIVE_TIMEOUT_USECS; + return (usecTimestampNow() - _lastReceiveTimestamp) < ACTIVE_TIMEOUT_USECS; } bool Faceshift::isTracking() const { @@ -196,6 +197,12 @@ void Faceshift::send(const std::string& message) { void Faceshift::receive(const QByteArray& buffer) { #ifdef HAVE_FACESHIFT + _lastReceiveTimestamp = usecTimestampNow(); + + if (_isMuted) { + return; + } + _stream.received(buffer.size(), buffer.constData()); fsMsgPtr msg; for (fsMsgPtr msg; (msg = _stream.get_message()); ) { @@ -240,11 +247,11 @@ void Faceshift::receive(const QByteArray& buffer) { const float FRAME_AVERAGING_FACTOR = 0.99f; quint64 usecsNow = usecTimestampNow(); - if (_lastTrackingStateReceived != 0) { + if (_lastMessageReceived != 0) { _averageFrameTime = FRAME_AVERAGING_FACTOR * _averageFrameTime + - (1.0f - FRAME_AVERAGING_FACTOR) * (float)(usecsNow - _lastTrackingStateReceived) / 1000000.0f; + (1.0f - FRAME_AVERAGING_FACTOR) * (float)(usecsNow - _lastMessageReceived) / 1000000.0f; } - _lastTrackingStateReceived = usecsNow; + _lastMessageReceived = usecsNow; } break; } diff --git a/interface/src/devices/Faceshift.h b/interface/src/devices/Faceshift.h index 3d38af5654..d2d9821382 100644 --- a/interface/src/devices/Faceshift.h +++ b/interface/src/devices/Faceshift.h @@ -114,7 +114,8 @@ private: bool _tcpEnabled = true; int _tcpRetryCount = 0; bool _tracking = false; - quint64 _lastTrackingStateReceived = 0; + quint64 _lastReceiveTimestamp = 0; + quint64 _lastMessageReceived = 0; float _averageFrameTime = STARTING_FACESHIFT_FRAME_TIME; glm::vec3 _headAngularVelocity = glm::vec3(0.0f); diff --git a/tests/ui/src/main.cpp b/tests/ui/src/main.cpp index a5bc50b288..b9bd195ded 100644 --- a/tests/ui/src/main.cpp +++ b/tests/ui/src/main.cpp @@ -161,6 +161,7 @@ public: Mirror, MuteAudio, MuteEnvironment, + MuteFaceTracking, NoFaceTracking, NoShadows, OctreeStats, From bc051595041a9369fd8de7932b87ce5e4f109b4b Mon Sep 17 00:00:00 2001 From: David Rowe Date: Thu, 30 Apr 2015 16:55:10 -0700 Subject: [PATCH 02/28] Add face tracking toggle button beside microphone toggle button --- interface/src/Application.cpp | 9 ++- interface/src/audio/AudioToolBox.cpp | 4 +- interface/src/audio/AudioToolBox.h | 2 +- interface/src/devices/CameraToolBox.cpp | 85 +++++++++++++++++++++++++ interface/src/devices/CameraToolBox.h | 36 +++++++++++ interface/src/ui/ApplicationOverlay.cpp | 74 ++++++++++++++------- interface/src/ui/ApplicationOverlay.h | 1 + 7 files changed, 185 insertions(+), 26 deletions(-) create mode 100644 interface/src/devices/CameraToolBox.cpp create mode 100644 interface/src/devices/CameraToolBox.h diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 80231d6342..7619b72099 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -103,6 +103,7 @@ #include "audio/AudioIOStatsRenderer.h" #include "audio/AudioScope.h" +#include "devices/CameraToolBox.h" #include "devices/DdeFaceTracker.h" #include "devices/Faceshift.h" #include "devices/Leapmotion.h" @@ -266,6 +267,7 @@ bool setupEssentials(int& argc, char** argv) { auto ddeFaceTracker = DependencyManager::set(); auto modelBlender = DependencyManager::set(); auto audioToolBox = DependencyManager::set(); + auto cameraToolBox = DependencyManager::set(); auto avatarManager = DependencyManager::set(); auto lodManager = DependencyManager::set(); auto jsConsole = DependencyManager::set(); @@ -1504,7 +1506,12 @@ void Application::mousePressEvent(QMouseEvent* event, unsigned int deviceID) { // stop propagation return; } - + + if (DependencyManager::get()->mousePressEvent(getMouseX(), getMouseY())) { + // stop propagation + return; + } + if (_rearMirrorTools->mousePressEvent(getMouseX(), getMouseY())) { // stop propagation return; diff --git a/interface/src/audio/AudioToolBox.cpp b/interface/src/audio/AudioToolBox.cpp index 330e7bc194..e37c154429 100644 --- a/interface/src/audio/AudioToolBox.cpp +++ b/interface/src/audio/AudioToolBox.cpp @@ -35,7 +35,7 @@ bool AudioToolBox::mousePressEvent(int x, int y) { return false; } -void AudioToolBox::render(int x, int y, bool boxed) { +void AudioToolBox::render(int x, int y, int padding, bool boxed) { glEnable(GL_TEXTURE_2D); auto glCanvas = Application::getInstance()->getGLWidget(); @@ -79,7 +79,7 @@ void AudioToolBox::render(int x, int y, bool boxed) { float iconColor = 1.0f; - _iconBounds = QRect(x, y, MUTE_ICON_SIZE, MUTE_ICON_SIZE); + _iconBounds = QRect(x + padding, y, MUTE_ICON_SIZE, MUTE_ICON_SIZE); if (!audioIO->isMuted()) { glBindTexture(GL_TEXTURE_2D, _micTextureId); iconColor = 1.0f; diff --git a/interface/src/audio/AudioToolBox.h b/interface/src/audio/AudioToolBox.h index 526de89b9c..7fbbab8fad 100644 --- a/interface/src/audio/AudioToolBox.h +++ b/interface/src/audio/AudioToolBox.h @@ -18,7 +18,7 @@ class AudioToolBox : public Dependency { SINGLETON_DEPENDENCY public: - void render(int x, int y, bool boxed); + void render(int x, int y, int padding, bool boxed); bool mousePressEvent(int x, int y); protected: diff --git a/interface/src/devices/CameraToolBox.cpp b/interface/src/devices/CameraToolBox.cpp new file mode 100644 index 0000000000..ff20b0b55e --- /dev/null +++ b/interface/src/devices/CameraToolBox.cpp @@ -0,0 +1,85 @@ +// +// CameraToolBox.cpp +// interface/src/devices +// +// Created by David Rowe on 30 Apr 2015. +// Copyright 2015 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 "InterfaceConfig.h" + +#include +#include + +#include "Application.h" +#include "CameraToolBox.h" +#include "FaceTracker.h" + + +CameraToolBox::CameraToolBox() : + _iconPulseTimeReference(usecTimestampNow()) +{ +} + +bool CameraToolBox::mousePressEvent(int x, int y) { + if (_iconBounds.contains(x, y)) { + FaceTracker* faceTracker = Application::getInstance()->getActiveFaceTracker(); + if (faceTracker) { + faceTracker->toggleMute(); + } + return true; + } + return false; +} + +void CameraToolBox::render(int x, int y, bool boxed) { + glEnable(GL_TEXTURE_2D); + + auto glCanvas = Application::getInstance()->getGLWidget(); + if (_enabledTextureId == 0) { + _enabledTextureId = glCanvas->bindTexture(QImage(PathUtils::resourcesPath() + "images/mic.svg")); + } + if (_mutedTextureId == 0) { + _mutedTextureId = glCanvas->bindTexture(QImage(PathUtils::resourcesPath() + "images/mic-mute.svg")); + } + + const int MUTE_ICON_SIZE = 24; + _iconBounds = QRect(x, y, MUTE_ICON_SIZE, MUTE_ICON_SIZE); + float iconColor = 1.0f; + if (!Menu::getInstance()->isOptionChecked(MenuOption::MuteFaceTracking)) { + glBindTexture(GL_TEXTURE_2D, _enabledTextureId); + } else { + glBindTexture(GL_TEXTURE_2D, _mutedTextureId); + + // Make muted icon pulsate + static const float PULSE_MIN = 0.4f; + static const float PULSE_MAX = 1.0f; + static const float PULSE_FREQUENCY = 1.0f; // in Hz + qint64 now = usecTimestampNow(); + if (now - _iconPulseTimeReference > (qint64)USECS_PER_SECOND) { + // Prevents t from getting too big, which would diminish glm::cos precision + _iconPulseTimeReference = now - ((now - _iconPulseTimeReference) % USECS_PER_SECOND); + } + float t = (float)(now - _iconPulseTimeReference) / (float)USECS_PER_SECOND; + float pulseFactor = (glm::cos(t * PULSE_FREQUENCY * 2.0f * PI) + 1.0f) / 2.0f; + iconColor = PULSE_MIN + (PULSE_MAX - PULSE_MIN) * pulseFactor; + } + + glm::vec4 quadColor(iconColor, iconColor, iconColor, 1.0f); + + glm::vec2 topLeft(_iconBounds.left(), _iconBounds.top()); + glm::vec2 bottomRight(_iconBounds.right(), _iconBounds.bottom()); + glm::vec2 texCoordTopLeft(1,1); + glm::vec2 texCoordBottomRight(0,0); + + if (_boxQuadID == GeometryCache::UNKNOWN_ID) { + _boxQuadID = DependencyManager::get()->allocateID(); + } + + DependencyManager::get()->renderQuad(topLeft, bottomRight, texCoordTopLeft, texCoordBottomRight, quadColor, _boxQuadID); + + glDisable(GL_TEXTURE_2D); +} \ No newline at end of file diff --git a/interface/src/devices/CameraToolBox.h b/interface/src/devices/CameraToolBox.h new file mode 100644 index 0000000000..3c8fad5468 --- /dev/null +++ b/interface/src/devices/CameraToolBox.h @@ -0,0 +1,36 @@ +// +// CameraToolBox.h +// interface/src/devices +// +// Created by David Rowe on 30 Apr 2015. +// Copyright 2015 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_CameraToolBox_h +#define hifi_CameraToolBox_h + +#include +#include + +class CameraToolBox : public Dependency { + SINGLETON_DEPENDENCY + +public: + void render(int x, int y, bool boxed); + bool mousePressEvent(int x, int y); + +protected: + CameraToolBox(); + +private: + GLuint _enabledTextureId = 0; + GLuint _mutedTextureId = 0; + int _boxQuadID = GeometryCache::UNKNOWN_ID; + QRect _iconBounds; + qint64 _iconPulseTimeReference = 0; +}; + +#endif // hifi_CameraToolBox_h \ No newline at end of file diff --git a/interface/src/ui/ApplicationOverlay.cpp b/interface/src/ui/ApplicationOverlay.cpp index 8704a61261..c044bb0674 100644 --- a/interface/src/ui/ApplicationOverlay.cpp +++ b/interface/src/ui/ApplicationOverlay.cpp @@ -25,6 +25,7 @@ #include "audio/AudioToolBox.h" #include "Application.h" #include "ApplicationOverlay.h" +#include "devices/CameraToolBox.h" #include "devices/OculusManager.h" #include "Util.h" @@ -211,6 +212,7 @@ void ApplicationOverlay::renderOverlay() { glMatrixMode(GL_MODELVIEW); renderAudioMeter(); + renderCameraToggle(); renderStatsAndLogs(); @@ -808,18 +810,46 @@ void ApplicationOverlay::renderMagnifier(glm::vec2 magPos, float sizeMult, bool } glPopMatrix(); } +const int AUDIO_METER_GAP = 5; +const int MUTE_ICON_PADDING = 10; + +void ApplicationOverlay::renderCameraToggle() { + if (Menu::getInstance()->isOptionChecked(MenuOption::NoFaceTracking)) { + return; + } + + int audioMeterY; + bool smallMirrorVisible = Menu::getInstance()->isOptionChecked(MenuOption::Mirror) && !OculusManager::isConnected(); + bool boxed = smallMirrorVisible && + !Menu::getInstance()->isOptionChecked(MenuOption::FullscreenMirror); + if (boxed) { + audioMeterY = MIRROR_VIEW_HEIGHT + AUDIO_METER_GAP + MUTE_ICON_PADDING; + } else { + audioMeterY = AUDIO_METER_GAP + MUTE_ICON_PADDING; + } + + DependencyManager::get()->render(MIRROR_VIEW_LEFT_PADDING + AUDIO_METER_GAP, audioMeterY, boxed); +} + void ApplicationOverlay::renderAudioMeter() { auto glCanvas = Application::getInstance()->getGLWidget(); auto audio = DependencyManager::get(); // Audio VU Meter and Mute Icon const int MUTE_ICON_SIZE = 24; - const int MUTE_ICON_PADDING = 10; - const int AUDIO_METER_WIDTH = MIRROR_VIEW_WIDTH - MUTE_ICON_SIZE - MUTE_ICON_PADDING; - const int AUDIO_METER_SCALE_WIDTH = AUDIO_METER_WIDTH - 2 ; const int AUDIO_METER_HEIGHT = 8; - const int AUDIO_METER_GAP = 5; - const int AUDIO_METER_X = MIRROR_VIEW_LEFT_PADDING + MUTE_ICON_SIZE + AUDIO_METER_GAP; + const int INTER_ICON_GAP = 2; + + int cameraSpace = 0; + int audioMeterWidth = MIRROR_VIEW_WIDTH - MUTE_ICON_SIZE - MUTE_ICON_PADDING; + int audioMeterScaleWidth = audioMeterWidth - 2; + int audioMeterX = MIRROR_VIEW_LEFT_PADDING + MUTE_ICON_SIZE + AUDIO_METER_GAP; + if (!Menu::getInstance()->isOptionChecked(MenuOption::NoFaceTracking)) { + cameraSpace = MUTE_ICON_SIZE + INTER_ICON_GAP; + audioMeterWidth -= cameraSpace; + audioMeterScaleWidth -= cameraSpace; + audioMeterX += cameraSpace; + } int audioMeterY; bool smallMirrorVisible = Menu::getInstance()->isOptionChecked(MenuOption::Mirror) && !OculusManager::isConnected(); @@ -834,13 +864,13 @@ void ApplicationOverlay::renderAudioMeter() { const glm::vec4 AUDIO_METER_BLUE = { 0.0, 0.0, 1.0, 1.0 }; const glm::vec4 AUDIO_METER_GREEN = { 0.0, 1.0, 0.0, 1.0 }; const glm::vec4 AUDIO_METER_RED = { 1.0, 0.0, 0.0, 1.0 }; - const float AUDIO_GREEN_START = 0.25 * AUDIO_METER_SCALE_WIDTH; - const float AUDIO_RED_START = 0.80 * AUDIO_METER_SCALE_WIDTH; const float CLIPPING_INDICATOR_TIME = 1.0f; const float AUDIO_METER_AVERAGING = 0.5; const float LOG2 = log(2.0f); const float METER_LOUDNESS_SCALE = 2.8f / 5.0f; const float LOG2_LOUDNESS_FLOOR = 11.0f; + float audioGreenStart = 0.25f * audioMeterScaleWidth; + float audioRedStart = 0.8f * audioMeterScaleWidth; float audioLevel = 0.0f; float loudness = audio->getLastInputLoudness() + 1.0f; @@ -848,12 +878,12 @@ void ApplicationOverlay::renderAudioMeter() { float log2loudness = log(_trailingAudioLoudness) / LOG2; if (log2loudness <= LOG2_LOUDNESS_FLOOR) { - audioLevel = (log2loudness / LOG2_LOUDNESS_FLOOR) * METER_LOUDNESS_SCALE * AUDIO_METER_SCALE_WIDTH; + audioLevel = (log2loudness / LOG2_LOUDNESS_FLOOR) * METER_LOUDNESS_SCALE * audioMeterScaleWidth; } else { - audioLevel = (log2loudness - (LOG2_LOUDNESS_FLOOR - 1.0f)) * METER_LOUDNESS_SCALE * AUDIO_METER_SCALE_WIDTH; + audioLevel = (log2loudness - (LOG2_LOUDNESS_FLOOR - 1.0f)) * METER_LOUDNESS_SCALE * audioMeterScaleWidth; } - if (audioLevel > AUDIO_METER_SCALE_WIDTH) { - audioLevel = AUDIO_METER_SCALE_WIDTH; + if (audioLevel > audioMeterScaleWidth) { + audioLevel = audioMeterScaleWidth; } bool isClipping = ((audio->getTimeSinceLastClip() > 0.0f) && (audio->getTimeSinceLastClip() < CLIPPING_INDICATOR_TIME)); @@ -863,7 +893,7 @@ void ApplicationOverlay::renderAudioMeter() { renderCollisionOverlay(glCanvas->width(), glCanvas->height(), magnitude, 1.0f); } - DependencyManager::get()->render(MIRROR_VIEW_LEFT_PADDING + AUDIO_METER_GAP, audioMeterY, boxed); + DependencyManager::get()->render(MIRROR_VIEW_LEFT_PADDING + AUDIO_METER_GAP, audioMeterY, cameraSpace, boxed); DependencyManager::get()->render(glCanvas->width(), glCanvas->height()); DependencyManager::get()->render(WHITE_TEXT, glCanvas->width(), glCanvas->height()); @@ -871,10 +901,10 @@ void ApplicationOverlay::renderAudioMeter() { audioMeterY += AUDIO_METER_HEIGHT; // Draw audio meter background Quad - DependencyManager::get()->renderQuad(AUDIO_METER_X, audioMeterY, AUDIO_METER_WIDTH, AUDIO_METER_HEIGHT, + DependencyManager::get()->renderQuad(audioMeterX, audioMeterY, audioMeterWidth, AUDIO_METER_HEIGHT, glm::vec4(0.0f, 0.0f, 0.0f, 1.0f)); - if (audioLevel > AUDIO_RED_START) { + if (audioLevel > audioRedStart) { glm::vec4 quadColor; if (!isClipping) { quadColor = AUDIO_METER_RED; @@ -882,16 +912,16 @@ void ApplicationOverlay::renderAudioMeter() { quadColor = glm::vec4(1, 1, 1, 1); } // Draw Red Quad - DependencyManager::get()->renderQuad(AUDIO_METER_X + AUDIO_RED_START, + DependencyManager::get()->renderQuad(audioMeterX + audioRedStart, audioMeterY, - audioLevel - AUDIO_RED_START, + audioLevel - audioRedStart, AUDIO_METER_HEIGHT, quadColor, _audioRedQuad); - audioLevel = AUDIO_RED_START; + audioLevel = audioRedStart; } - if (audioLevel > AUDIO_GREEN_START) { + if (audioLevel > audioGreenStart) { glm::vec4 quadColor; if (!isClipping) { quadColor = AUDIO_METER_GREEN; @@ -899,13 +929,13 @@ void ApplicationOverlay::renderAudioMeter() { quadColor = glm::vec4(1, 1, 1, 1); } // Draw Green Quad - DependencyManager::get()->renderQuad(AUDIO_METER_X + AUDIO_GREEN_START, + DependencyManager::get()->renderQuad(audioMeterX + audioGreenStart, audioMeterY, - audioLevel - AUDIO_GREEN_START, + audioLevel - audioGreenStart, AUDIO_METER_HEIGHT, quadColor, _audioGreenQuad); - audioLevel = AUDIO_GREEN_START; + audioLevel = audioGreenStart; } if (audioLevel >= 0) { @@ -916,7 +946,7 @@ void ApplicationOverlay::renderAudioMeter() { quadColor = glm::vec4(1, 1, 1, 1); } // Draw Blue (low level) quad - DependencyManager::get()->renderQuad(AUDIO_METER_X, + DependencyManager::get()->renderQuad(audioMeterX, audioMeterY, audioLevel, AUDIO_METER_HEIGHT, quadColor, _audioBlueQuad); diff --git a/interface/src/ui/ApplicationOverlay.h b/interface/src/ui/ApplicationOverlay.h index e6c7526c5d..54c8613f94 100644 --- a/interface/src/ui/ApplicationOverlay.h +++ b/interface/src/ui/ApplicationOverlay.h @@ -101,6 +101,7 @@ private: void renderPointersOculus(const glm::vec3& eyePos); void renderAudioMeter(); + void renderCameraToggle(); void renderStatsAndLogs(); void renderDomainConnectionStatusBorder(); From 528f73897c58e7cffa31aecc98ad088cba51877d Mon Sep 17 00:00:00 2001 From: David Rowe Date: Thu, 30 Apr 2015 22:14:01 -0700 Subject: [PATCH 03/28] Make double click face tracking toggle button reset tracking --- interface/src/Application.cpp | 21 ++++++++++++ interface/src/Application.h | 1 + interface/src/GLCanvas.cpp | 1 + interface/src/devices/CameraToolBox.cpp | 44 ++++++++++++++++++++++--- interface/src/devices/CameraToolBox.h | 11 ++++++- 5 files changed, 73 insertions(+), 5 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 7619b72099..8e3c60907b 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -1016,6 +1016,9 @@ bool Application::event(QEvent* event) { case QEvent::MouseButtonPress: mousePressEvent((QMouseEvent*)event); return true; + case QEvent::MouseButtonDblClick: + mouseDoublePressEvent((QMouseEvent*)event); + return true; case QEvent::MouseButtonRelease: mouseReleaseEvent((QMouseEvent*)event); return true; @@ -1529,6 +1532,24 @@ void Application::mousePressEvent(QMouseEvent* event, unsigned int deviceID) { } } +void Application::mouseDoublePressEvent(QMouseEvent* event, unsigned int deviceID) { + // if one of our scripts have asked to capture this event, then stop processing it + if (_controllerScriptingInterface.isMouseCaptured()) { + return; + } + + if (activeWindow() == _window) { + if (event->button() == Qt::LeftButton) { + if (mouseOnScreen()) { + if (DependencyManager::get()->mouseDoublePressEvent(getMouseX(), getMouseY())) { + // stop propagation + return; + } + } + } + } +} + void Application::mouseReleaseEvent(QMouseEvent* event, unsigned int deviceID) { if (!_aboutToQuit) { diff --git a/interface/src/Application.h b/interface/src/Application.h index 91bded9267..2921741971 100644 --- a/interface/src/Application.h +++ b/interface/src/Application.h @@ -167,6 +167,7 @@ public: void mouseMoveEvent(QMouseEvent* event, unsigned int deviceID = 0); void mousePressEvent(QMouseEvent* event, unsigned int deviceID = 0); + void mouseDoublePressEvent(QMouseEvent* event, unsigned int deviceID = 0); void mouseReleaseEvent(QMouseEvent* event, unsigned int deviceID = 0); void touchBeginEvent(QTouchEvent* event); diff --git a/interface/src/GLCanvas.cpp b/interface/src/GLCanvas.cpp index 9a9512a0b0..e169c96fe1 100644 --- a/interface/src/GLCanvas.cpp +++ b/interface/src/GLCanvas.cpp @@ -131,6 +131,7 @@ bool GLCanvas::event(QEvent* event) { case QEvent::MouseMove: case QEvent::MouseButtonPress: case QEvent::MouseButtonRelease: + case QEvent::MouseButtonDblClick: case QEvent::KeyPress: case QEvent::KeyRelease: case QEvent::FocusIn: diff --git a/interface/src/devices/CameraToolBox.cpp b/interface/src/devices/CameraToolBox.cpp index ff20b0b55e..0f4b1ff5b1 100644 --- a/interface/src/devices/CameraToolBox.cpp +++ b/interface/src/devices/CameraToolBox.cpp @@ -20,21 +20,57 @@ CameraToolBox::CameraToolBox() : - _iconPulseTimeReference(usecTimestampNow()) + _iconPulseTimeReference(usecTimestampNow()), + _doubleClickTimer(NULL) { } +CameraToolBox::~CameraToolBox() { + if (_doubleClickTimer) { + _doubleClickTimer->stop(); + delete _doubleClickTimer; + } +} + bool CameraToolBox::mousePressEvent(int x, int y) { if (_iconBounds.contains(x, y)) { - FaceTracker* faceTracker = Application::getInstance()->getActiveFaceTracker(); - if (faceTracker) { - faceTracker->toggleMute(); + if (!_doubleClickTimer) { + // Toggle mute after waiting to check that it's not a double-click. + const int DOUBLE_CLICK_WAIT = 200; // ms + _doubleClickTimer = new QTimer(this); + connect(_doubleClickTimer, SIGNAL(timeout()), this, SLOT(toggleMute())); + _doubleClickTimer->setSingleShot(true); + _doubleClickTimer->setInterval(DOUBLE_CLICK_WAIT); + _doubleClickTimer->start(); } return true; } return false; } +bool CameraToolBox::mouseDoublePressEvent(int x, int y) { + if (_iconBounds.contains(x, y)) { + if (_doubleClickTimer) { + _doubleClickTimer->stop(); + delete _doubleClickTimer; + _doubleClickTimer = NULL; + } + Application::getInstance()->resetSensors(); + return true; + } + return false; +} + +void CameraToolBox::toggleMute() { + delete _doubleClickTimer; + _doubleClickTimer = NULL; + + FaceTracker* faceTracker = Application::getInstance()->getActiveFaceTracker(); + if (faceTracker) { + faceTracker->toggleMute(); + } +} + void CameraToolBox::render(int x, int y, bool boxed) { glEnable(GL_TEXTURE_2D); diff --git a/interface/src/devices/CameraToolBox.h b/interface/src/devices/CameraToolBox.h index 3c8fad5468..5f9241c81d 100644 --- a/interface/src/devices/CameraToolBox.h +++ b/interface/src/devices/CameraToolBox.h @@ -12,18 +12,26 @@ #ifndef hifi_CameraToolBox_h #define hifi_CameraToolBox_h +#include + #include #include -class CameraToolBox : public Dependency { +class CameraToolBox : public QObject, public Dependency { + Q_OBJECT SINGLETON_DEPENDENCY public: void render(int x, int y, bool boxed); bool mousePressEvent(int x, int y); + bool mouseDoublePressEvent(int x, int y); protected: CameraToolBox(); + ~CameraToolBox(); + +private slots: + void toggleMute(); private: GLuint _enabledTextureId = 0; @@ -31,6 +39,7 @@ private: int _boxQuadID = GeometryCache::UNKNOWN_ID; QRect _iconBounds; qint64 _iconPulseTimeReference = 0; + QTimer* _doubleClickTimer; }; #endif // hifi_CameraToolBox_h \ No newline at end of file From 7bc995be5e0229caa8a44975b9912e596bd80058 Mon Sep 17 00:00:00 2001 From: David Rowe Date: Thu, 30 Apr 2015 23:11:04 -0700 Subject: [PATCH 04/28] Add camera muting icons --- interface/resources/images/face-mute.svg | 14 ++++++++++++++ interface/resources/images/face.svg | 13 +++++++++++++ interface/src/devices/CameraToolBox.cpp | 4 ++-- 3 files changed, 29 insertions(+), 2 deletions(-) create mode 100644 interface/resources/images/face-mute.svg create mode 100644 interface/resources/images/face.svg diff --git a/interface/resources/images/face-mute.svg b/interface/resources/images/face-mute.svg new file mode 100644 index 0000000000..fcf275fb62 --- /dev/null +++ b/interface/resources/images/face-mute.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/interface/resources/images/face.svg b/interface/resources/images/face.svg new file mode 100644 index 0000000000..aac3fb8285 --- /dev/null +++ b/interface/resources/images/face.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/interface/src/devices/CameraToolBox.cpp b/interface/src/devices/CameraToolBox.cpp index 0f4b1ff5b1..69afefff86 100644 --- a/interface/src/devices/CameraToolBox.cpp +++ b/interface/src/devices/CameraToolBox.cpp @@ -76,10 +76,10 @@ void CameraToolBox::render(int x, int y, bool boxed) { auto glCanvas = Application::getInstance()->getGLWidget(); if (_enabledTextureId == 0) { - _enabledTextureId = glCanvas->bindTexture(QImage(PathUtils::resourcesPath() + "images/mic.svg")); + _enabledTextureId = glCanvas->bindTexture(QImage(PathUtils::resourcesPath() + "images/face.svg")); } if (_mutedTextureId == 0) { - _mutedTextureId = glCanvas->bindTexture(QImage(PathUtils::resourcesPath() + "images/mic-mute.svg")); + _mutedTextureId = glCanvas->bindTexture(QImage(PathUtils::resourcesPath() + "images/face-mute.svg")); } const int MUTE_ICON_SIZE = 24; From e689b6a86939c3d461754f7e399ca5a9f363030b Mon Sep 17 00:00:00 2001 From: David Rowe Date: Fri, 1 May 2015 12:07:00 -0700 Subject: [PATCH 05/28] Remove leading Unicode control chars --- interface/resources/images/face-mute.svg | 2 +- interface/resources/images/face.svg | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/interface/resources/images/face-mute.svg b/interface/resources/images/face-mute.svg index fcf275fb62..0a93c366e0 100644 --- a/interface/resources/images/face-mute.svg +++ b/interface/resources/images/face-mute.svg @@ -1,4 +1,4 @@ - + diff --git a/interface/resources/images/face.svg b/interface/resources/images/face.svg index aac3fb8285..09d05af6fc 100644 --- a/interface/resources/images/face.svg +++ b/interface/resources/images/face.svg @@ -1,4 +1,4 @@ - + From 2128b7499ecd95bb46fc87f0cf09ee7dd9942524 Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Fri, 1 May 2015 12:10:12 -0700 Subject: [PATCH 06/28] first cut at adding atmosphere properties to zones --- .../entities/src/AtmospherePropertyGroup.cpp | 97 +++++++++++++++++++ .../entities/src/AtmospherePropertyGroup.h | 94 ++++++++++++++++++ libraries/entities/src/EntityItemProperties.h | 28 ++++-- libraries/entities/src/PropertyGroup.h | 88 +++++++++++++++++ libraries/entities/src/ZoneEntityItem.cpp | 17 ++++ libraries/entities/src/ZoneEntityItem.h | 3 + 6 files changed, 318 insertions(+), 9 deletions(-) create mode 100644 libraries/entities/src/AtmospherePropertyGroup.cpp create mode 100644 libraries/entities/src/AtmospherePropertyGroup.h create mode 100644 libraries/entities/src/PropertyGroup.h diff --git a/libraries/entities/src/AtmospherePropertyGroup.cpp b/libraries/entities/src/AtmospherePropertyGroup.cpp new file mode 100644 index 0000000000..e35d4a6870 --- /dev/null +++ b/libraries/entities/src/AtmospherePropertyGroup.cpp @@ -0,0 +1,97 @@ +// +// AtmospherePropertyGroup.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 "AtmospherePropertyGroup.h" + +QScriptValue AtmospherePropertyGroup::copyToScriptValue(QScriptEngine* engine, bool skipDefaults) const { + QScriptValue result; + return result; +} + +void AtmospherePropertyGroup::copyFromScriptValue(const QScriptValue& object) { +} + +void AtmospherePropertyGroup::debugDump() const { + /* + qCDebug(entities) << " AtmospherePropertyGroup: ---------------------------------------------"; + qCDebug(entities) << " Atmosphere Center:" << getAtmosphereCenter(); + qCDebug(entities) << " Atmosphere Inner Radius:" << getAtmosphereInnerRadius(); + qCDebug(entities) << " Atmosphere Outer Radius:" << getAtmosphereOuterRadius(); + qCDebug(entities) << " ... more ..."; + */ +} + +bool AtmospherePropertyGroup::appentToEditPacket(unsigned char* bufferOut, int sizeIn, int& sizeOut) { + return true; +} + +bool AtmospherePropertyGroup::decodeFromEditPacket(const unsigned char* data, int bytesToRead, int& processedBytes) { + return true; +} + +void AtmospherePropertyGroup::markAllChanged() { +} + +void AtmospherePropertyGroup::getProperties(EntityItemProperties& propertiesOut) const { +} + +bool AtmospherePropertyGroup::setProperties(const EntityItemProperties& properties) { + return true; +} + +EntityPropertyFlags AtmospherePropertyGroup::getEntityProperties(EncodeBitstreamParams& params) const { + EntityPropertyFlags requestedProperties; + + requestedProperties += PROP_ATMOSPHERE_CENTER; + requestedProperties += PROP_ATMOSPHERE_INNER_RADIUS; + requestedProperties += PROP_ATMOSPHERE_OUTER_RADIUS; + requestedProperties += PROP_ATMOSPHERE_MIE_SCATTERING; + requestedProperties += PROP_ATMOSPHERE_RAYLEIGH_SCATTERING; + requestedProperties += PROP_ATMOSPHERE_SCATTERING_WAVELENGTHS; + + return requestedProperties; + +} + +void AtmospherePropertyGroup::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_ATMOSPHERE_CENTER, appendValue, getAtmosphereCenter()); + APPEND_ENTITY_PROPERTY(PROP_ATMOSPHERE_INNER_RADIUS, appendValue, getAtmosphereInnerRadius()); + APPEND_ENTITY_PROPERTY(PROP_ATMOSPHERE_OUTER_RADIUS, appendValue, getAtmosphereOuterRadius()); + APPEND_ENTITY_PROPERTY(PROP_ATMOSPHERE_MIE_SCATTERING, appendValue, getAtmosphereMieScattering()); + APPEND_ENTITY_PROPERTY(PROP_ATMOSPHERE_RAYLEIGH_SCATTERING, appendValue, getAtmosphereRayleighScattering()); + APPEND_ENTITY_PROPERTY(PROP_ATMOSPHERE_SCATTERING_WAVELENGTHS, appendValue, getAtmosphereScatteringWavelengths()); +} + +int AtmospherePropertyGroup::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_ATMOSPHERE_CENTER, glm::vec3, _atmosphereCenter); + READ_ENTITY_PROPERTY(PROP_ATMOSPHERE_INNER_RADIUS, float, _atmosphereInnerRadius); + READ_ENTITY_PROPERTY(PROP_ATMOSPHERE_OUTER_RADIUS, float, _atmosphereOuterRadius); + READ_ENTITY_PROPERTY(PROP_ATMOSPHERE_MIE_SCATTERING, float, _atmosphereMieScattering); + READ_ENTITY_PROPERTY(PROP_ATMOSPHERE_RAYLEIGH_SCATTERING, float, _atmosphereRayleighScattering); + READ_ENTITY_PROPERTY(PROP_ATMOSPHERE_SCATTERING_WAVELENGTHS, glm::vec3, _atmosphereScatteringWavelengths); + + return bytesRead; +} diff --git a/libraries/entities/src/AtmospherePropertyGroup.h b/libraries/entities/src/AtmospherePropertyGroup.h new file mode 100644 index 0000000000..bef73992c3 --- /dev/null +++ b/libraries/entities/src/AtmospherePropertyGroup.h @@ -0,0 +1,94 @@ +// +// AtmospherePropertyGroup.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_AtmospherePropertyGroup_h +#define hifi_AtmospherePropertyGroup_h + +#include + +#include "EntityItemProperties.h" + +#include "PropertyGroup.h" + +class EntityItemProperties; +class EncodeBitstreamParams; +class OctreePacketData; +class EntityTreeElementExtraEncodeData; +class ReadBitstreamToTreeParams; + +/* +#include + +#include +#include + +#include +#include +#include + +#include +#include // for SittingPoint +#include +#include +#include + +#include "EntityItemID.h" +#include "AtmospherePropertyGroupMacros.h" +#include "EntityTypes.h" +*/ + + +class AtmospherePropertyGroup : public PropertyGroup { +public: + AtmospherePropertyGroup() {} + virtual ~AtmospherePropertyGroup() {} + + // EntityItemProperty related helpers + virtual QScriptValue copyToScriptValue(QScriptEngine* engine, bool skipDefaults) const; + virtual void copyFromScriptValue(const QScriptValue& object); + virtual void debugDump() const; + + virtual bool appentToEditPacket(unsigned char* bufferOut, int sizeIn, int& sizeOut); + virtual bool decodeFromEditPacket(const unsigned char* data, int bytesToRead, int& processedBytes); + virtual void markAllChanged(); + + // 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); + + + DEFINE_PROPERTY_REF(PROP_ATMOSPHERE_CENTER, AtmosphereCenter, atmosphereCenter, glm::vec3); + DEFINE_PROPERTY(PROP_ATMOSPHERE_INNER_RADIUS, AtmosphereInnerRadius, atmosphereInnerRadius, float); + DEFINE_PROPERTY(PROP_ATMOSPHERE_OUTER_RADIUS, AtmosphereOuterRadius, atmosphereOuterRadius, float); + DEFINE_PROPERTY(PROP_ATMOSPHERE_MIE_SCATTERING, AtmosphereMieScattering, atmosphereMieScattering, float); + DEFINE_PROPERTY(PROP_ATMOSPHERE_RAYLEIGH_SCATTERING, AtmosphereRayleighScattering, atmosphereRayleighScattering, float); + DEFINE_PROPERTY_REF(PROP_ATMOSPHERE_SCATTERING_WAVELENGTHS, AtmosphereScatteringWavelengths, atmosphereScatteringWavelengths, glm::vec3); + +}; + +#endif // hifi_AtmospherePropertyGroup_h diff --git a/libraries/entities/src/EntityItemProperties.h b/libraries/entities/src/EntityItemProperties.h index 9a1c8ad5a6..573642dcfa 100644 --- a/libraries/entities/src/EntityItemProperties.h +++ b/libraries/entities/src/EntityItemProperties.h @@ -51,6 +51,8 @@ enum EntityPropertyList { // these properties are supported by some derived classes PROP_COLOR, + + // these are used by models only PROP_MODEL_URL, PROP_ANIMATION_URL, PROP_ANIMATION_FPS, @@ -78,11 +80,10 @@ enum EntityPropertyList { // available to all entities PROP_LOCKED, - // used by Model entities - PROP_TEXTURES, - PROP_ANIMATION_SETTINGS, - PROP_USER_DATA, - PROP_SHAPE_TYPE, + PROP_TEXTURES, // used by Model entities + PROP_ANIMATION_SETTINGS, // used by Model entities + PROP_USER_DATA, // all entities + PROP_SHAPE_TYPE, // used by Model + zones entities // used by ParticleEffect entities PROP_MAX_PARTICLES, @@ -93,10 +94,10 @@ enum EntityPropertyList { PROP_LOCAL_GRAVITY, PROP_PARTICLE_RADIUS, - PROP_COMPOUND_SHAPE_URL, - PROP_MARKETPLACE_ID, - PROP_ACCELERATION, - PROP_SIMULATOR_ID, + PROP_COMPOUND_SHAPE_URL, // used by Model + zones entities + PROP_MARKETPLACE_ID, // all entities + PROP_ACCELERATION, // all entities + PROP_SIMULATOR_ID, // all entities //////////////////////////////////////////////////////////////////////////////////////////////////// // ATTENTION: add new properties ABOVE this line @@ -127,6 +128,15 @@ enum EntityPropertyList { PROP_STAGE_ALTITUDE = PROP_SPECULAR_COLOR_UNUSED, PROP_STAGE_DAY = PROP_LINEAR_ATTENUATION_UNUSED, PROP_STAGE_HOUR = PROP_QUADRATIC_ATTENUATION_UNUSED, + PROP_ATMOSPHERE_CENTER = PROP_MAX_PARTICLES, + PROP_ATMOSPHERE_INNER_RADIUS = PROP_LIFESPAN, + PROP_ATMOSPHERE_OUTER_RADIUS = PROP_EMIT_RATE, + PROP_ATMOSPHERE_MIE_SCATTERING = PROP_EMIT_DIRECTION, + PROP_ATMOSPHERE_RAYLEIGH_SCATTERING = PROP_EMIT_STRENGTH, + PROP_ATMOSPHERE_SCATTERING_WAVELENGTHS = PROP_LOCAL_GRAVITY, + PROP_SKYBOX_MODE = PROP_PARTICLE_RADIUS, + // SunBrightness - same as KeyLight Intensity? + // SunLocation (or direction) - same as KeyLight // WARNING!!! DO NOT ADD PROPS_xxx here unless you really really meant to.... Add them UP above }; diff --git a/libraries/entities/src/PropertyGroup.h b/libraries/entities/src/PropertyGroup.h new file mode 100644 index 0000000000..31504f2c11 --- /dev/null +++ b/libraries/entities/src/PropertyGroup.h @@ -0,0 +1,88 @@ +// +// PropertyGroup.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_PropertyGroup_h +#define hifi_PropertyGroup_h + +#include + +#include "EntityItemProperties.h" + +class EntityItemProperties; +class EncodeBitstreamParams; +class OctreePacketData; +class EntityTreeElementExtraEncodeData; +class ReadBitstreamToTreeParams; + +/* +#include + +#include +#include + +#include +#include +#include + +#include +#include // for SittingPoint +#include +#include +#include + +#include "EntityItemID.h" +#include "PropertyGroupMacros.h" +#include "EntityTypes.h" +*/ + + +class PropertyGroup { +public: + PropertyGroup() {} + virtual ~PropertyGroup() {} + + // EntityItemProperty related helpers + virtual QScriptValue copyToScriptValue(QScriptEngine* engine, bool skipDefaults) const = 0; + virtual void copyFromScriptValue(const QScriptValue& object) = 0; + virtual void debugDump() const { } + + virtual bool appentToEditPacket(unsigned char* bufferOut, int sizeIn, int& sizeOut) = 0; + virtual bool decodeFromEditPacket(const unsigned char* data, int bytesToRead, int& processedBytes) = 0; + virtual void markAllChanged() = 0; + + // EntityItem related helpers + // methods for getting/setting all properties of an entity + virtual void getProperties(EntityItemProperties& propertiesOut) const = 0; + + /// returns true if something changed + virtual bool setProperties(const EntityItemProperties& properties) = 0; + + /// Override this in your derived class if you'd like to be informed when something about the state of the entity + /// has changed. This will be called with properties change or when new data is loaded from a stream + virtual void somethingChangedNotification() { } + + + virtual EntityPropertyFlags getEntityProperties(EncodeBitstreamParams& params) const = 0; + + virtual void appendSubclassData(OctreePacketData* packetData, EncodeBitstreamParams& params, + EntityTreeElementExtraEncodeData* entityTreeElementExtraEncodeData, + EntityPropertyFlags& requestedProperties, + EntityPropertyFlags& propertyFlags, + EntityPropertyFlags& propertiesDidntFit, + int& propertyCount, + OctreeElement::AppendState& appendState) const = 0; + + virtual int readEntitySubclassDataFromBuffer(const unsigned char* data, int bytesLeftToRead, + ReadBitstreamToTreeParams& args, + EntityPropertyFlags& propertyFlags, bool overwriteLocalData) = 0; +}; + +#endif // hifi_PropertyGroup_h diff --git a/libraries/entities/src/ZoneEntityItem.cpp b/libraries/entities/src/ZoneEntityItem.cpp index 9ccb2697a0..be1a8fa3d3 100644 --- a/libraries/entities/src/ZoneEntityItem.cpp +++ b/libraries/entities/src/ZoneEntityItem.cpp @@ -80,6 +80,8 @@ EntityItemProperties ZoneEntityItem::getProperties() const { COPY_ENTITY_PROPERTY_TO_PROPERTIES(shapeType, getShapeType); COPY_ENTITY_PROPERTY_TO_PROPERTIES(compoundShapeURL, getCompoundShapeURL); + _atmospherePropeties.getProperties(properties); + return properties; } @@ -100,6 +102,10 @@ bool ZoneEntityItem::setProperties(const EntityItemProperties& properties) { SET_ENTITY_PROPERTY_FROM_PROPERTIES(shapeType, updateShapeType); SET_ENTITY_PROPERTY_FROM_PROPERTIES(compoundShapeURL, setCompoundShapeURL); + bool somethingChangedInAtmosphere = _atmospherePropeties.setProperties(properties); + + somethingChanged = somethingChanged || somethingChangedInAtmosphere; + if (somethingChanged) { bool wantDebug = false; if (wantDebug) { @@ -133,6 +139,9 @@ int ZoneEntityItem::readEntitySubclassDataFromBuffer(const unsigned char* data, READ_ENTITY_PROPERTY_SETTER(PROP_SHAPE_TYPE, ShapeType, updateShapeType); READ_ENTITY_PROPERTY_STRING(PROP_COMPOUND_SHAPE_URL, setCompoundShapeURL); + bytesRead += _atmospherePropeties.readEntitySubclassDataFromBuffer(dataAt, (bytesLeftToRead - bytesRead), args, + propertyFlags, overwriteLocalData); + return bytesRead; } @@ -153,6 +162,8 @@ EntityPropertyFlags ZoneEntityItem::getEntityProperties(EncodeBitstreamParams& p requestedProperties += PROP_STAGE_HOUR; requestedProperties += PROP_SHAPE_TYPE; requestedProperties += PROP_COMPOUND_SHAPE_URL; + + requestedProperties += _atmospherePropeties.getEntityProperties(params); return requestedProperties; } @@ -179,6 +190,10 @@ void ZoneEntityItem::appendSubclassData(OctreePacketData* packetData, EncodeBits APPEND_ENTITY_PROPERTY(PROP_STAGE_HOUR, appendValue, getStageHour()); APPEND_ENTITY_PROPERTY(PROP_SHAPE_TYPE, appendValue, (uint32_t)getShapeType()); APPEND_ENTITY_PROPERTY(PROP_COMPOUND_SHAPE_URL, appendValue, getCompoundShapeURL()); + + _atmospherePropeties.appendSubclassData(packetData, params, modelTreeElementExtraEncodeData, requestedProperties, + propertyFlags, propertiesDidntFit, propertyCount, appendState); + } void ZoneEntityItem::debugDump() const { @@ -197,6 +212,8 @@ void ZoneEntityItem::debugDump() const { qCDebug(entities) << " _stageAltitude:" << _stageAltitude; qCDebug(entities) << " _stageDay:" << _stageDay; qCDebug(entities) << " _stageHour:" << _stageHour; + + _atmospherePropeties.debugDump(); } ShapeType ZoneEntityItem::getShapeType() const { diff --git a/libraries/entities/src/ZoneEntityItem.h b/libraries/entities/src/ZoneEntityItem.h index 4f081969ad..1e64b54e93 100644 --- a/libraries/entities/src/ZoneEntityItem.h +++ b/libraries/entities/src/ZoneEntityItem.h @@ -12,6 +12,7 @@ #ifndef hifi_ZoneEntityItem_h #define hifi_ZoneEntityItem_h +#include "AtmospherePropertyGroup.h" #include "EntityItem.h" class ZoneEntityItem : public EntityItem { @@ -135,6 +136,8 @@ protected: ShapeType _shapeType = SHAPE_TYPE_NONE; QString _compoundShapeURL; + + AtmospherePropertyGroup _atmospherePropeties; static bool _zonesArePickable; }; From 78f7870cbb1d83ce50029ead9c6e574d63a4e835 Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Mon, 4 May 2015 11:13:05 -0700 Subject: [PATCH 07/28] more tweaks to atmosphere properties --- .../entities/src/AtmospherePropertyGroup.cpp | 131 +++++++++++------- .../entities/src/AtmospherePropertyGroup.h | 14 +- .../entities/src/EntityItemProperties.cpp | 18 ++- libraries/entities/src/EntityItemProperties.h | 2 +- .../entities/src/EntityItemPropertiesMacros.h | 71 +++++++++- libraries/networking/src/PacketHeaders.cpp | 2 +- libraries/networking/src/PacketHeaders.h | 1 + 7 files changed, 169 insertions(+), 70 deletions(-) diff --git a/libraries/entities/src/AtmospherePropertyGroup.cpp b/libraries/entities/src/AtmospherePropertyGroup.cpp index 556ba19d8b..dc3dbe0bab 100644 --- a/libraries/entities/src/AtmospherePropertyGroup.cpp +++ b/libraries/entities/src/AtmospherePropertyGroup.cpp @@ -15,30 +15,42 @@ #include "EntityItemProperties.h" #include "EntityItemPropertiesMacros.h" +AtmospherePropertyGroup::AtmospherePropertyGroup() { + _center = glm::vec3(0.0f); + _innerRadius = 0.0f; + _outerRadius = 0.0f; + _mieScattering = 0.0f; + _rayleighScattering = 0.0f; + _scatteringWavelengths = glm::vec3(0.0f); + +} + void AtmospherePropertyGroup::copyToScriptValue(QScriptValue& properties, QScriptEngine* engine, bool skipDefaults, EntityItemProperties& defaultEntityProperties) const { - COPY_GROUP_PROPERTY_TO_QSCRIPTVALUE_VEC3(AtmosphereProperties, AtmosphereCenter, atmosphereCenter); - COPY_GROUP_PROPERTY_TO_QSCRIPTVALUE(AtmosphereProperties, AtmosphereInnerRadius, atmosphereInnerRadius); - COPY_GROUP_PROPERTY_TO_QSCRIPTVALUE(AtmosphereProperties, AtmosphereOuterRadius, atmosphereOuterRadius); - COPY_GROUP_PROPERTY_TO_QSCRIPTVALUE(AtmosphereProperties, AtmosphereMieScattering, atmosphereMieScattering); - COPY_GROUP_PROPERTY_TO_QSCRIPTVALUE(AtmosphereProperties, AtmosphereRayleighScattering, atmosphereRayleighScattering); - COPY_GROUP_PROPERTY_TO_QSCRIPTVALUE_VEC3(AtmosphereProperties, AtmosphereScatteringWavelengths, atmosphereScatteringWavelengths); + COPY_GROUP_PROPERTY_TO_QSCRIPTVALUE_VEC3(Atmosphere, Center, center); + COPY_GROUP_PROPERTY_TO_QSCRIPTVALUE(Atmosphere, InnerRadius, innerRadius); + COPY_GROUP_PROPERTY_TO_QSCRIPTVALUE(Atmosphere, OuterRadius, outerRadius); + COPY_GROUP_PROPERTY_TO_QSCRIPTVALUE(Atmosphere, MieScattering, mieScattering); + COPY_GROUP_PROPERTY_TO_QSCRIPTVALUE(Atmosphere, RayleighScattering, rayleighScattering); + COPY_GROUP_PROPERTY_TO_QSCRIPTVALUE_VEC3(Atmosphere, ScatteringWavelengths, scatteringWavelengths); } void AtmospherePropertyGroup::copyFromScriptValue(const QScriptValue& object, bool& _defaultSettings) { - COPY_PROPERTY_FROM_QSCRIPTVALUE_VEC3(atmosphereCenter, setAtmosphereCenter); - COPY_PROPERTY_FROM_QSCRIPTVALUE_FLOAT(atmosphereInnerRadius, setAtmosphereInnerRadius); - COPY_PROPERTY_FROM_QSCRIPTVALUE_FLOAT(atmosphereOuterRadius, setAtmosphereOuterRadius); - COPY_PROPERTY_FROM_QSCRIPTVALUE_FLOAT(atmosphereMieScattering, setAtmosphereMieScattering); - COPY_PROPERTY_FROM_QSCRIPTVALUE_FLOAT(atmosphereRayleighScattering, setAtmosphereRayleighScattering); - COPY_PROPERTY_FROM_QSCRIPTVALUE_VEC3(atmosphereScatteringWavelengths, setAtmosphereScatteringWavelengths); + COPY_GROUP_PROPERTY_FROM_QSCRIPTVALUE_VEC3(atmosphere, center, setCenter); + COPY_GROUP_PROPERTY_FROM_QSCRIPTVALUE_FLOAT(atmosphere, innerRadius, setInnerRadius); + COPY_GROUP_PROPERTY_FROM_QSCRIPTVALUE_FLOAT(atmosphere, outerRadius, setOuterRadius); + COPY_GROUP_PROPERTY_FROM_QSCRIPTVALUE_FLOAT(atmosphere, mieScattering, setMieScattering); + COPY_GROUP_PROPERTY_FROM_QSCRIPTVALUE_FLOAT(atmosphere, rayleighScattering, setRayleighScattering); + COPY_GROUP_PROPERTY_FROM_QSCRIPTVALUE_VEC3(atmosphere, scatteringWavelengths, setScatteringWavelengths); } void AtmospherePropertyGroup::debugDump() const { qDebug() << " AtmospherePropertyGroup: ---------------------------------------------"; - qDebug() << " Atmosphere Center:" << getAtmosphereCenter(); - qDebug() << " Atmosphere Inner Radius:" << getAtmosphereInnerRadius(); - qDebug() << " Atmosphere Outer Radius:" << getAtmosphereOuterRadius(); - qDebug() << " ... more ..."; + qDebug() << " Center:" << getCenter(); + qDebug() << " Inner Radius:" << getInnerRadius(); + qDebug() << " Outer Radius:" << getOuterRadius(); + qDebug() << " Mie Scattering:" << getMieScattering(); + qDebug() << " Rayleigh Scattering:" << getRayleighScattering(); + qDebug() << " Scattering Wavelengths:" << getScatteringWavelengths(); } bool AtmospherePropertyGroup::appentToEditPacket(OctreePacketData* packetData, @@ -50,12 +62,12 @@ bool AtmospherePropertyGroup::appentToEditPacket(OctreePacketData* packetData, bool successPropertyFits = true; - APPEND_ENTITY_PROPERTY(PROP_ATMOSPHERE_CENTER, appendValue, getAtmosphereCenter()); - APPEND_ENTITY_PROPERTY(PROP_ATMOSPHERE_INNER_RADIUS, appendValue, getAtmosphereInnerRadius()); - APPEND_ENTITY_PROPERTY(PROP_ATMOSPHERE_OUTER_RADIUS, appendValue, getAtmosphereOuterRadius()); - APPEND_ENTITY_PROPERTY(PROP_ATMOSPHERE_MIE_SCATTERING, appendValue, getAtmosphereMieScattering()); - APPEND_ENTITY_PROPERTY(PROP_ATMOSPHERE_RAYLEIGH_SCATTERING, appendValue, getAtmosphereRayleighScattering()); - APPEND_ENTITY_PROPERTY(PROP_ATMOSPHERE_SCATTERING_WAVELENGTHS, appendValue, getAtmosphereScatteringWavelengths()); + APPEND_ENTITY_PROPERTY(PROP_ATMOSPHERE_CENTER, appendValue, getCenter()); + APPEND_ENTITY_PROPERTY(PROP_ATMOSPHERE_INNER_RADIUS, appendValue, getInnerRadius()); + APPEND_ENTITY_PROPERTY(PROP_ATMOSPHERE_OUTER_RADIUS, appendValue, getOuterRadius()); + APPEND_ENTITY_PROPERTY(PROP_ATMOSPHERE_MIE_SCATTERING, appendValue, getMieScattering()); + APPEND_ENTITY_PROPERTY(PROP_ATMOSPHERE_RAYLEIGH_SCATTERING, appendValue, getRayleighScattering()); + APPEND_ENTITY_PROPERTY(PROP_ATMOSPHERE_SCATTERING_WAVELENGTHS, appendValue, getScatteringWavelengths()); return true; } @@ -66,12 +78,12 @@ bool AtmospherePropertyGroup::decodeFromEditPacket(EntityPropertyFlags& property int bytesRead = 0; bool overwriteLocalData = true; - READ_ENTITY_PROPERTY(PROP_ATMOSPHERE_CENTER, glm::vec3, _atmosphereCenter); - READ_ENTITY_PROPERTY(PROP_ATMOSPHERE_INNER_RADIUS, float, _atmosphereInnerRadius); - READ_ENTITY_PROPERTY(PROP_ATMOSPHERE_OUTER_RADIUS, float, _atmosphereOuterRadius); - READ_ENTITY_PROPERTY(PROP_ATMOSPHERE_MIE_SCATTERING, float, _atmosphereMieScattering); - READ_ENTITY_PROPERTY(PROP_ATMOSPHERE_RAYLEIGH_SCATTERING, float, _atmosphereRayleighScattering); - READ_ENTITY_PROPERTY(PROP_ATMOSPHERE_SCATTERING_WAVELENGTHS, glm::vec3, _atmosphereScatteringWavelengths); + READ_ENTITY_PROPERTY(PROP_ATMOSPHERE_CENTER, glm::vec3, _center); + READ_ENTITY_PROPERTY(PROP_ATMOSPHERE_INNER_RADIUS, float, _innerRadius); + READ_ENTITY_PROPERTY(PROP_ATMOSPHERE_OUTER_RADIUS, float, _outerRadius); + READ_ENTITY_PROPERTY(PROP_ATMOSPHERE_MIE_SCATTERING, float, _mieScattering); + READ_ENTITY_PROPERTY(PROP_ATMOSPHERE_RAYLEIGH_SCATTERING, float, _rayleighScattering); + READ_ENTITY_PROPERTY(PROP_ATMOSPHERE_SCATTERING_WAVELENGTHS, glm::vec3, _scatteringWavelengths); processedBytes += bytesRead; @@ -79,26 +91,48 @@ bool AtmospherePropertyGroup::decodeFromEditPacket(EntityPropertyFlags& property } void AtmospherePropertyGroup::markAllChanged() { + _centerChanged = true; + _innerRadiusChanged = true; + _outerRadiusChanged = true; + _mieScatteringChanged = true; + _rayleighScatteringChanged = true; + _scatteringWavelengthsChanged = true; } EntityPropertyFlags AtmospherePropertyGroup::getChangedProperties() const { EntityPropertyFlags changedProperties; - CHECK_PROPERTY_CHANGE(PROP_ATMOSPHERE_CENTER, atmosphereCenter); - CHECK_PROPERTY_CHANGE(PROP_ATMOSPHERE_INNER_RADIUS, atmosphereInnerRadius); - CHECK_PROPERTY_CHANGE(PROP_ATMOSPHERE_OUTER_RADIUS, atmosphereOuterRadius); - CHECK_PROPERTY_CHANGE(PROP_ATMOSPHERE_MIE_SCATTERING, atmosphereMieScattering); - CHECK_PROPERTY_CHANGE(PROP_ATMOSPHERE_RAYLEIGH_SCATTERING, atmosphereRayleighScattering); - CHECK_PROPERTY_CHANGE(PROP_ATMOSPHERE_SCATTERING_WAVELENGTHS, atmosphereScatteringWavelengths); + CHECK_PROPERTY_CHANGE(PROP_ATMOSPHERE_CENTER, center); + CHECK_PROPERTY_CHANGE(PROP_ATMOSPHERE_INNER_RADIUS, innerRadius); + CHECK_PROPERTY_CHANGE(PROP_ATMOSPHERE_OUTER_RADIUS, outerRadius); + CHECK_PROPERTY_CHANGE(PROP_ATMOSPHERE_MIE_SCATTERING, mieScattering); + CHECK_PROPERTY_CHANGE(PROP_ATMOSPHERE_RAYLEIGH_SCATTERING, rayleighScattering); + CHECK_PROPERTY_CHANGE(PROP_ATMOSPHERE_SCATTERING_WAVELENGTHS, scatteringWavelengths); return changedProperties; } -void AtmospherePropertyGroup::getProperties(EntityItemProperties& propertiesOut) const { +void AtmospherePropertyGroup::getProperties(EntityItemProperties& properties) const { + COPY_ENTITY_GROUP_PROPERTY_TO_PROPERTIES(Atmosphere, Center, getCenter); + COPY_ENTITY_GROUP_PROPERTY_TO_PROPERTIES(Atmosphere, InnerRadius, getInnerRadius); + COPY_ENTITY_GROUP_PROPERTY_TO_PROPERTIES(Atmosphere, OuterRadius, getOuterRadius); + COPY_ENTITY_GROUP_PROPERTY_TO_PROPERTIES(Atmosphere, MieScattering, getMieScattering); + COPY_ENTITY_GROUP_PROPERTY_TO_PROPERTIES(Atmosphere, MieScattering, getMieScattering); + COPY_ENTITY_GROUP_PROPERTY_TO_PROPERTIES(Atmosphere, RayleighScattering, getRayleighScattering); + COPY_ENTITY_GROUP_PROPERTY_TO_PROPERTIES(Atmosphere, ScatteringWavelengths, getScatteringWavelengths); } bool AtmospherePropertyGroup::setProperties(const EntityItemProperties& properties) { - return true; + bool somethingChanged = false; + + SET_ENTITY_GROUP_PROPERTY_FROM_PROPERTIES(Atmosphere, Center, center, setCenter); + SET_ENTITY_GROUP_PROPERTY_FROM_PROPERTIES(Atmosphere, InnerRadius, innerRadius, setInnerRadius); + SET_ENTITY_GROUP_PROPERTY_FROM_PROPERTIES(Atmosphere, OuterRadius, outerRadius, setOuterRadius); + SET_ENTITY_GROUP_PROPERTY_FROM_PROPERTIES(Atmosphere, MieScattering, mieScattering, setMieScattering); + SET_ENTITY_GROUP_PROPERTY_FROM_PROPERTIES(Atmosphere, RayleighScattering, rayleighScattering, setRayleighScattering); + SET_ENTITY_GROUP_PROPERTY_FROM_PROPERTIES(Atmosphere, ScatteringWavelengths, scatteringWavelengths, setScatteringWavelengths); + + return somethingChanged; } EntityPropertyFlags AtmospherePropertyGroup::getEntityProperties(EncodeBitstreamParams& params) const { @@ -112,7 +146,6 @@ EntityPropertyFlags AtmospherePropertyGroup::getEntityProperties(EncodeBitstream requestedProperties += PROP_ATMOSPHERE_SCATTERING_WAVELENGTHS; return requestedProperties; - } void AtmospherePropertyGroup::appendSubclassData(OctreePacketData* packetData, EncodeBitstreamParams& params, @@ -125,12 +158,12 @@ void AtmospherePropertyGroup::appendSubclassData(OctreePacketData* packetData, E bool successPropertyFits = true; - APPEND_ENTITY_PROPERTY(PROP_ATMOSPHERE_CENTER, appendValue, getAtmosphereCenter()); - APPEND_ENTITY_PROPERTY(PROP_ATMOSPHERE_INNER_RADIUS, appendValue, getAtmosphereInnerRadius()); - APPEND_ENTITY_PROPERTY(PROP_ATMOSPHERE_OUTER_RADIUS, appendValue, getAtmosphereOuterRadius()); - APPEND_ENTITY_PROPERTY(PROP_ATMOSPHERE_MIE_SCATTERING, appendValue, getAtmosphereMieScattering()); - APPEND_ENTITY_PROPERTY(PROP_ATMOSPHERE_RAYLEIGH_SCATTERING, appendValue, getAtmosphereRayleighScattering()); - APPEND_ENTITY_PROPERTY(PROP_ATMOSPHERE_SCATTERING_WAVELENGTHS, appendValue, getAtmosphereScatteringWavelengths()); + APPEND_ENTITY_PROPERTY(PROP_ATMOSPHERE_CENTER, appendValue, getCenter()); + APPEND_ENTITY_PROPERTY(PROP_ATMOSPHERE_INNER_RADIUS, appendValue, getInnerRadius()); + APPEND_ENTITY_PROPERTY(PROP_ATMOSPHERE_OUTER_RADIUS, appendValue, getOuterRadius()); + APPEND_ENTITY_PROPERTY(PROP_ATMOSPHERE_MIE_SCATTERING, appendValue, getMieScattering()); + APPEND_ENTITY_PROPERTY(PROP_ATMOSPHERE_RAYLEIGH_SCATTERING, appendValue, getRayleighScattering()); + APPEND_ENTITY_PROPERTY(PROP_ATMOSPHERE_SCATTERING_WAVELENGTHS, appendValue, getScatteringWavelengths()); } int AtmospherePropertyGroup::readEntitySubclassDataFromBuffer(const unsigned char* data, int bytesLeftToRead, @@ -140,12 +173,12 @@ int AtmospherePropertyGroup::readEntitySubclassDataFromBuffer(const unsigned cha int bytesRead = 0; const unsigned char* dataAt = data; - READ_ENTITY_PROPERTY(PROP_ATMOSPHERE_CENTER, glm::vec3, _atmosphereCenter); - READ_ENTITY_PROPERTY(PROP_ATMOSPHERE_INNER_RADIUS, float, _atmosphereInnerRadius); - READ_ENTITY_PROPERTY(PROP_ATMOSPHERE_OUTER_RADIUS, float, _atmosphereOuterRadius); - READ_ENTITY_PROPERTY(PROP_ATMOSPHERE_MIE_SCATTERING, float, _atmosphereMieScattering); - READ_ENTITY_PROPERTY(PROP_ATMOSPHERE_RAYLEIGH_SCATTERING, float, _atmosphereRayleighScattering); - READ_ENTITY_PROPERTY(PROP_ATMOSPHERE_SCATTERING_WAVELENGTHS, glm::vec3, _atmosphereScatteringWavelengths); + READ_ENTITY_PROPERTY(PROP_ATMOSPHERE_CENTER, glm::vec3, _center); + READ_ENTITY_PROPERTY(PROP_ATMOSPHERE_INNER_RADIUS, float, _innerRadius); + READ_ENTITY_PROPERTY(PROP_ATMOSPHERE_OUTER_RADIUS, float, _outerRadius); + READ_ENTITY_PROPERTY(PROP_ATMOSPHERE_MIE_SCATTERING, float, _mieScattering); + READ_ENTITY_PROPERTY(PROP_ATMOSPHERE_RAYLEIGH_SCATTERING, float, _rayleighScattering); + READ_ENTITY_PROPERTY(PROP_ATMOSPHERE_SCATTERING_WAVELENGTHS, glm::vec3, _scatteringWavelengths); return bytesRead; } diff --git a/libraries/entities/src/AtmospherePropertyGroup.h b/libraries/entities/src/AtmospherePropertyGroup.h index 76f8dd22a5..3f3f2ff6d2 100644 --- a/libraries/entities/src/AtmospherePropertyGroup.h +++ b/libraries/entities/src/AtmospherePropertyGroup.h @@ -49,7 +49,7 @@ class ReadBitstreamToTreeParams; class AtmospherePropertyGroup : public PropertyGroup { public: - AtmospherePropertyGroup() {} + AtmospherePropertyGroup(); virtual ~AtmospherePropertyGroup() {} // EntityItemProperty related helpers @@ -90,12 +90,12 @@ public: EntityPropertyFlags& propertyFlags, bool overwriteLocalData); - DEFINE_PROPERTY_REF(PROP_ATMOSPHERE_CENTER, AtmosphereCenter, atmosphereCenter, glm::vec3); - DEFINE_PROPERTY(PROP_ATMOSPHERE_INNER_RADIUS, AtmosphereInnerRadius, atmosphereInnerRadius, float); - DEFINE_PROPERTY(PROP_ATMOSPHERE_OUTER_RADIUS, AtmosphereOuterRadius, atmosphereOuterRadius, float); - DEFINE_PROPERTY(PROP_ATMOSPHERE_MIE_SCATTERING, AtmosphereMieScattering, atmosphereMieScattering, float); - DEFINE_PROPERTY(PROP_ATMOSPHERE_RAYLEIGH_SCATTERING, AtmosphereRayleighScattering, atmosphereRayleighScattering, float); - DEFINE_PROPERTY_REF(PROP_ATMOSPHERE_SCATTERING_WAVELENGTHS, AtmosphereScatteringWavelengths, atmosphereScatteringWavelengths, glm::vec3); + DEFINE_PROPERTY_REF(PROP_ATMOSPHERE_CENTER, Center, center, glm::vec3); + DEFINE_PROPERTY(PROP_ATMOSPHERE_INNER_RADIUS, InnerRadius, innerRadius, float); + DEFINE_PROPERTY(PROP_ATMOSPHERE_OUTER_RADIUS, OuterRadius, outerRadius, float); + DEFINE_PROPERTY(PROP_ATMOSPHERE_MIE_SCATTERING, MieScattering, mieScattering, float); + DEFINE_PROPERTY(PROP_ATMOSPHERE_RAYLEIGH_SCATTERING, RayleighScattering, rayleighScattering, float); + DEFINE_PROPERTY_REF(PROP_ATMOSPHERE_SCATTERING_WAVELENGTHS, ScatteringWavelengths, scatteringWavelengths, glm::vec3); }; #endif // hifi_AtmospherePropertyGroup_h diff --git a/libraries/entities/src/EntityItemProperties.cpp b/libraries/entities/src/EntityItemProperties.cpp index dab8dc9edc..b7549a5f63 100644 --- a/libraries/entities/src/EntityItemProperties.cpp +++ b/libraries/entities/src/EntityItemProperties.cpp @@ -27,7 +27,7 @@ #include "TextEntityItem.h" #include "ZoneEntityItem.h" -AtmospherePropertyGroup EntityItemProperties::_staticAtmosphereProperties; +AtmospherePropertyGroup EntityItemProperties::_staticAtmosphere; EntityPropertyList PROP_LAST_ITEM = (EntityPropertyList)(PROP_AFTER_LAST_ITEM - 1); @@ -296,7 +296,7 @@ EntityPropertyFlags EntityItemProperties::getChangedProperties() const { CHECK_PROPERTY_CHANGE(PROP_STAGE_DAY, stageDay); CHECK_PROPERTY_CHANGE(PROP_STAGE_HOUR, stageHour); - changedProperties += _atmosphereProperties.getChangedProperties(); + changedProperties += _atmosphere.getChangedProperties(); return changedProperties; } @@ -413,7 +413,7 @@ QScriptValue EntityItemProperties::copyToScriptValue(QScriptEngine* engine, bool COPY_PROPERTY_TO_QSCRIPTVALUE_GETTER_NO_SKIP(originalTextures, textureNamesList); // gettable, but not settable } - _atmosphereProperties.copyToScriptValue(properties, engine, skipDefaults, defaultEntityProperties); + _atmosphere.copyToScriptValue(properties, engine, skipDefaults, defaultEntityProperties); return properties; } @@ -484,7 +484,7 @@ void EntityItemProperties::copyFromScriptValue(const QScriptValue& object) { COPY_PROPERTY_FROM_QSCRIPTVALUE_INT(stageDay, setStageDay); COPY_PROPERTY_FROM_QSCRIPTVALUE_FLOAT(stageHour, setStageHour); - _atmosphereProperties.copyFromScriptValue(object, _defaultSettings); + _atmosphere.copyFromScriptValue(object, _defaultSettings); _lastEdited = usecTimestampNow(); } @@ -691,7 +691,8 @@ bool EntityItemProperties::encodeEntityEditPacket(PacketType command, EntityItem APPEND_ENTITY_PROPERTY(PROP_SHAPE_TYPE, appendValue, (uint32_t)properties.getShapeType()); APPEND_ENTITY_PROPERTY(PROP_COMPOUND_SHAPE_URL, appendValue, properties.getCompoundShapeURL()); - _staticAtmosphereProperties.appentToEditPacket(packetData, requestedProperties, propertyFlags, propertiesDidntFit, propertyCount, appendState ); + _staticAtmosphere.setProperties(properties); + _staticAtmosphere.appentToEditPacket(packetData, requestedProperties, propertyFlags, propertiesDidntFit, propertyCount, appendState ); } APPEND_ENTITY_PROPERTY(PROP_MARKETPLACE_ID, appendValue, properties.getMarketplaceID()); @@ -941,7 +942,10 @@ bool EntityItemProperties::decodeEntityEditPacket(const unsigned char* data, int READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_STAGE_HOUR, float, setStageHour); READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_SHAPE_TYPE, ShapeType, setShapeType); READ_ENTITY_PROPERTY_STRING_TO_PROPERTIES(PROP_COMPOUND_SHAPE_URL, setCompoundShapeURL); - _staticAtmosphereProperties.decodeFromEditPacket(propertyFlags, dataAt , processedBytes); + + qDebug() << "EntityItemProperties::decodeEntityEditPacket()...."; + properties.getAtmosphere().decodeFromEditPacket(propertyFlags, dataAt , processedBytes); + properties.getAtmosphere().debugDump(); } READ_ENTITY_PROPERTY_STRING_TO_PROPERTIES(PROP_MARKETPLACE_ID, setMarketplaceID); @@ -1044,7 +1048,7 @@ void EntityItemProperties::markAllChanged() { _stageDayChanged = true; _stageHourChanged = true; - _atmosphereProperties.markAllChanged(); + _atmosphere.markAllChanged(); } diff --git a/libraries/entities/src/EntityItemProperties.h b/libraries/entities/src/EntityItemProperties.h index 783fc1902f..377f0a3a1a 100644 --- a/libraries/entities/src/EntityItemProperties.h +++ b/libraries/entities/src/EntityItemProperties.h @@ -137,7 +137,7 @@ public: 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_GROUP(AtmosphereProperties, atmosphereProperties, AtmospherePropertyGroup); + DEFINE_PROPERTY_GROUP(Atmosphere, atmosphere, AtmospherePropertyGroup); public: diff --git a/libraries/entities/src/EntityItemPropertiesMacros.h b/libraries/entities/src/EntityItemPropertiesMacros.h index 65ddc12ab4..a3be19b812 100644 --- a/libraries/entities/src/EntityItemPropertiesMacros.h +++ b/libraries/entities/src/EntityItemPropertiesMacros.h @@ -181,15 +181,25 @@ somethingChanged = true; \ } +#define SET_ENTITY_GROUP_PROPERTY_FROM_PROPERTIES(G,P,p,M) \ + if (properties.get##G().p##Changed()) { \ + M(properties.get##G().get##P()); \ + somethingChanged = true; \ + } + #define SET_ENTITY_PROPERTY_FROM_PROPERTIES_GETTER(C,G,S) \ if (properties.C()) { \ S(properties.G()); \ somethingChanged = true; \ } -#define COPY_ENTITY_PROPERTY_TO_PROPERTIES(M,G) \ - properties._##M = G(); \ - properties._##M##Changed = false; +#define COPY_ENTITY_PROPERTY_TO_PROPERTIES(P,M) \ + properties._##P = M(); \ + properties._##P##Changed = false; + +#define COPY_ENTITY_GROUP_PROPERTY_TO_PROPERTIES(G,P,M) \ + properties.get##G().set##P(M()); \ + properties.get##G().set##P##Changed(false); #define CHECK_PROPERTY_CHANGE(P,M) \ if (_##M##Changed) { \ @@ -199,13 +209,23 @@ #define COPY_GROUP_PROPERTY_TO_QSCRIPTVALUE_VEC3(G,P,p) \ if (!skipDefaults || defaultEntityProperties.get##G().get##P() != _##p) { \ + QScriptValue groupProperties = properties.property(#G); \ + if (!groupProperties.isValid()) { \ + groupProperties = engine->newObject(); \ + } \ QScriptValue V = vec3toScriptValue(engine, _##p); \ - properties.setProperty(#p, V); \ + groupProperties.setProperty(#p, V); \ + properties.setProperty(#G, groupProperties); \ } #define COPY_GROUP_PROPERTY_TO_QSCRIPTVALUE(G,P,p) \ if (!skipDefaults || defaultEntityProperties.get##G().get##P() != _##p) { \ - properties.setProperty(#p, _##p); \ + QScriptValue groupProperties = properties.property(#G); \ + if (!groupProperties.isValid()) { \ + groupProperties = engine->newObject(); \ + } \ + groupProperties.setProperty(#p, _##p); \ + properties.setProperty(#G, groupProperties); \ } #define COPY_PROPERTY_TO_QSCRIPTVALUE_VEC3(P) \ @@ -254,6 +274,20 @@ } \ } +#define COPY_GROUP_PROPERTY_FROM_QSCRIPTVALUE_FLOAT(G, P, S) \ + { \ + QScriptValue G = object.property(#G); \ + if (G.isValid()) { \ + QScriptValue P = G.property(#P); \ + if (P.isValid()) { \ + float newValue = P.toVariant().toFloat(); \ + if (_defaultSettings || newValue != _##P) { \ + S(newValue); \ + } \ + } \ + } \ + } + #define COPY_PROPERTY_FROM_QSCRIPTVALUE_INT(P, S) \ QScriptValue P = object.property(#P); \ if (P.isValid()) { \ @@ -310,6 +344,32 @@ } \ } \ } + +#define COPY_GROUP_PROPERTY_FROM_QSCRIPTVALUE_VEC3(G, P, S) \ + { \ + QScriptValue G = object.property(#G); \ + if (G.isValid()) { \ + QScriptValue P = G.property(#P); \ + if (P.isValid()) { \ + QScriptValue x = P.property("x"); \ + QScriptValue y = P.property("y"); \ + QScriptValue z = P.property("z"); \ + if (x.isValid() && y.isValid() && z.isValid()) { \ + glm::vec3 newValue; \ + newValue.x = x.toVariant().toFloat(); \ + newValue.y = y.toVariant().toFloat(); \ + newValue.z = z.toVariant().toFloat(); \ + bool isValid = !glm::isnan(newValue.x) && \ + !glm::isnan(newValue.y) && \ + !glm::isnan(newValue.z); \ + if (isValid && \ + (_defaultSettings || newValue != _##P)) { \ + S(newValue); \ + } \ + } \ + } \ + } \ + } #define COPY_PROPERTY_FROM_QSCRIPTVALUE_QUAT(P, S) \ QScriptValue P = object.property(#P); \ @@ -371,6 +431,7 @@ #define DEFINE_PROPERTY_GROUP(N, n, T) \ public: \ const T& get##N() const { return _##n; } \ + T& get##N() { return _##n; } \ private: \ T _##n; \ static T _static##N; diff --git a/libraries/networking/src/PacketHeaders.cpp b/libraries/networking/src/PacketHeaders.cpp index a9ccec34bb..3f1c3fbbfa 100644 --- a/libraries/networking/src/PacketHeaders.cpp +++ b/libraries/networking/src/PacketHeaders.cpp @@ -74,7 +74,7 @@ PacketVersion versionForPacketType(PacketType type) { return 1; case PacketTypeEntityAddOrEdit: case PacketTypeEntityData: - return VERSION_ENTITIES_HAVE_NAMES; + return VERSION_ENTITIES_ZONE_ENTITIES_HAVE_ATMOSPHERE; case PacketTypeEntityErase: return 2; case PacketTypeAudioStreamStats: diff --git a/libraries/networking/src/PacketHeaders.h b/libraries/networking/src/PacketHeaders.h index 7b12b1a089..c43b98d41f 100644 --- a/libraries/networking/src/PacketHeaders.h +++ b/libraries/networking/src/PacketHeaders.h @@ -140,5 +140,6 @@ const PacketVersion VERSION_ENTITIES_HAVE_UUIDS = 16; const PacketVersion VERSION_ENTITIES_ZONE_ENTITIES_EXIST = 17; 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; #endif // hifi_PacketHeaders_h From 8c47736c3b63c6e10bc840ff902d131fede6ae8a Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Mon, 4 May 2015 11:41:03 -0700 Subject: [PATCH 08/28] add skybox mode property --- .../entities/src/EntityItemProperties.cpp | 43 ++++++++++++++++++- libraries/entities/src/EntityItemProperties.h | 2 + libraries/entities/src/EntityPropertyFlags.h | 8 ++++ libraries/entities/src/ZoneEntityItem.cpp | 21 +++++++++ libraries/entities/src/ZoneEntityItem.h | 5 +++ 5 files changed, 78 insertions(+), 1 deletion(-) diff --git a/libraries/entities/src/EntityItemProperties.cpp b/libraries/entities/src/EntityItemProperties.cpp index b7549a5f63..480233e538 100644 --- a/libraries/entities/src/EntityItemProperties.cpp +++ b/libraries/entities/src/EntityItemProperties.cpp @@ -89,6 +89,7 @@ EntityItemProperties::EntityItemProperties() : CONSTRUCT_PROPERTY(stageDay, ZoneEntityItem::DEFAULT_STAGE_DAY), CONSTRUCT_PROPERTY(stageHour, ZoneEntityItem::DEFAULT_STAGE_HOUR), CONSTRUCT_PROPERTY(name, ENTITY_ITEM_DEFAULT_NAME), + CONSTRUCT_PROPERTY(skyboxMode, SKYBOX_MODE_INHERIT), _id(UNKNOWN_ENTITY_ID), _idSet(false), @@ -236,6 +237,37 @@ void EntityItemProperties::setShapeTypeFromString(const QString& shapeName) { } } +const char* skyboxModeNames[] = {"inherit", "atmosphere", "texture" }; + +QHash stringToSkyboxModeLookup; + +void addSkyboxMode(SkyboxMode type) { + stringToSkyboxModeLookup[skyboxModeNames[type]] = type; +} + +void buildStringToSkyboxModeLookup() { + addSkyboxMode(SKYBOX_MODE_INHERIT); + addSkyboxMode(SKYBOX_MODE_ATMOSPHERE); + addSkyboxMode(SKYBOX_MODE_TEXTURE); +} + +QString EntityItemProperties::getSkyboxModeAsString() const { + if (_skyboxMode < sizeof(skyboxModeNames) / sizeof(char *)) + return QString(skyboxModeNames[_skyboxMode]); + return QString(skyboxModeNames[SKYBOX_MODE_INHERIT]); +} + +void EntityItemProperties::setSkyboxModeFromString(const QString& shapeName) { + if (stringToSkyboxModeLookup.empty()) { + buildStringToSkyboxModeLookup(); + } + auto skyboxModeItr = stringToSkyboxModeLookup.find(shapeName.toLower()); + if (skyboxModeItr != stringToSkyboxModeLookup.end()) { + _skyboxMode = skyboxModeItr.value(); + _skyboxModeChanged = true; + } +} + EntityPropertyFlags EntityItemProperties::getChangedProperties() const { EntityPropertyFlags changedProperties; @@ -295,6 +327,8 @@ EntityPropertyFlags EntityItemProperties::getChangedProperties() const { CHECK_PROPERTY_CHANGE(PROP_STAGE_ALTITUDE, stageAltitude); CHECK_PROPERTY_CHANGE(PROP_STAGE_DAY, stageDay); CHECK_PROPERTY_CHANGE(PROP_STAGE_HOUR, stageHour); + + CHECK_PROPERTY_CHANGE(PROP_SKYBOX_MODE, skyboxMode); changedProperties += _atmosphere.getChangedProperties(); @@ -379,6 +413,7 @@ QScriptValue EntityItemProperties::copyToScriptValue(QScriptEngine* engine, bool COPY_PROPERTY_TO_QSCRIPTVALUE(stageAltitude); COPY_PROPERTY_TO_QSCRIPTVALUE(stageDay); COPY_PROPERTY_TO_QSCRIPTVALUE(stageHour); + COPY_PROPERTY_TO_QSCRIPTVALUE_GETTER(skyboxMode, getSkyboxModeAsString()); // Sitting properties support if (!skipDefaults) { @@ -484,6 +519,8 @@ void EntityItemProperties::copyFromScriptValue(const QScriptValue& object) { COPY_PROPERTY_FROM_QSCRIPTVALUE_INT(stageDay, setStageDay); COPY_PROPERTY_FROM_QSCRIPTVALUE_FLOAT(stageHour, setStageHour); + COPY_PROPERTY_FROM_QSCRITPTVALUE_ENUM(skyboxMode, SkyboxMode); + _atmosphere.copyFromScriptValue(object, _defaultSettings); _lastEdited = usecTimestampNow(); @@ -690,6 +727,8 @@ bool EntityItemProperties::encodeEntityEditPacket(PacketType command, EntityItem APPEND_ENTITY_PROPERTY(PROP_SHAPE_TYPE, appendValue, (uint32_t)properties.getShapeType()); APPEND_ENTITY_PROPERTY(PROP_COMPOUND_SHAPE_URL, appendValue, properties.getCompoundShapeURL()); + + APPEND_ENTITY_PROPERTY(PROP_SKYBOX_MODE, appendValue, (uint32_t)properties.getSkyboxMode()); _staticAtmosphere.setProperties(properties); _staticAtmosphere.appentToEditPacket(packetData, requestedProperties, propertyFlags, propertiesDidntFit, propertyCount, appendState ); @@ -942,6 +981,7 @@ bool EntityItemProperties::decodeEntityEditPacket(const unsigned char* data, int READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_STAGE_HOUR, float, setStageHour); READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_SHAPE_TYPE, ShapeType, setShapeType); READ_ENTITY_PROPERTY_STRING_TO_PROPERTIES(PROP_COMPOUND_SHAPE_URL, setCompoundShapeURL); + READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_SKYBOX_MODE, SkyboxMode, setSkyboxMode); qDebug() << "EntityItemProperties::decodeEntityEditPacket()...."; properties.getAtmosphere().decodeFromEditPacket(propertyFlags, dataAt , processedBytes); @@ -1048,8 +1088,9 @@ void EntityItemProperties::markAllChanged() { _stageDayChanged = true; _stageHourChanged = true; + _skyboxModeChanged = true; _atmosphere.markAllChanged(); - + } /// The maximum bounding cube for the entity, independent of it's rotation. diff --git a/libraries/entities/src/EntityItemProperties.h b/libraries/entities/src/EntityItemProperties.h index 377f0a3a1a..591b89f22d 100644 --- a/libraries/entities/src/EntityItemProperties.h +++ b/libraries/entities/src/EntityItemProperties.h @@ -138,6 +138,7 @@ public: DEFINE_PROPERTY(PROP_STAGE_HOUR, StageHour, stageHour, float); DEFINE_PROPERTY_REF(PROP_NAME, Name, name, QString); DEFINE_PROPERTY_GROUP(Atmosphere, atmosphere, AtmospherePropertyGroup); + DEFINE_PROPERTY_REF_ENUM(PROP_SKYBOX_MODE, SkyboxMode, skyboxMode, SkyboxMode); public: @@ -272,6 +273,7 @@ inline QDebug operator<<(QDebug debug, const EntityItemProperties& properties) { DEBUG_PROPERTY_IF_CHANGED(debug, properties, LocalGravity, localGravity, ""); DEBUG_PROPERTY_IF_CHANGED(debug, properties, ParticleRadius, particleRadius, ""); DEBUG_PROPERTY_IF_CHANGED(debug, properties, MarketplaceID, marketplaceID, ""); + DEBUG_PROPERTY_IF_CHANGED(debug, properties, SkyboxMode, skyboxMode, ""); debug << " last edited:" << properties.getLastEdited() << "\n"; debug << " edited ago:" << properties.getEditedAgo() << "\n"; diff --git a/libraries/entities/src/EntityPropertyFlags.h b/libraries/entities/src/EntityPropertyFlags.h index 3ee46e1f41..969ed309bb 100644 --- a/libraries/entities/src/EntityPropertyFlags.h +++ b/libraries/entities/src/EntityPropertyFlags.h @@ -155,4 +155,12 @@ typedef PropertyFlags EntityPropertyFlags; // one greater than the last item property due to the enum's auto-incrementing. extern EntityPropertyList PROP_LAST_ITEM; + +enum SkyboxMode { + SKYBOX_MODE_INHERIT, + SKYBOX_MODE_ATMOSPHERE, + SKYBOX_MODE_TEXTURE, +}; + + #endif // hifi_EntityPropertyFlags_h diff --git a/libraries/entities/src/ZoneEntityItem.cpp b/libraries/entities/src/ZoneEntityItem.cpp index be1a8fa3d3..b1c875aae0 100644 --- a/libraries/entities/src/ZoneEntityItem.cpp +++ b/libraries/entities/src/ZoneEntityItem.cpp @@ -60,6 +60,8 @@ ZoneEntityItem::ZoneEntityItem(const EntityItemID& entityItemID, const EntityIte _stageHour = DEFAULT_STAGE_HOUR; _shapeType = DEFAULT_SHAPE_TYPE; _compoundShapeURL = DEFAULT_COMPOUND_SHAPE_URL; + + _skyboxMode = SKYBOX_MODE_INHERIT; setProperties(properties); } @@ -80,6 +82,8 @@ EntityItemProperties ZoneEntityItem::getProperties() const { COPY_ENTITY_PROPERTY_TO_PROPERTIES(shapeType, getShapeType); COPY_ENTITY_PROPERTY_TO_PROPERTIES(compoundShapeURL, getCompoundShapeURL); + COPY_ENTITY_PROPERTY_TO_PROPERTIES(skyboxMode, getSkyboxMode); + _atmospherePropeties.getProperties(properties); return properties; @@ -102,6 +106,8 @@ bool ZoneEntityItem::setProperties(const EntityItemProperties& properties) { SET_ENTITY_PROPERTY_FROM_PROPERTIES(shapeType, updateShapeType); SET_ENTITY_PROPERTY_FROM_PROPERTIES(compoundShapeURL, setCompoundShapeURL); + SET_ENTITY_PROPERTY_FROM_PROPERTIES(skyboxMode, setSkyboxMode); + bool somethingChangedInAtmosphere = _atmospherePropeties.setProperties(properties); somethingChanged = somethingChanged || somethingChangedInAtmosphere; @@ -116,6 +122,10 @@ bool ZoneEntityItem::setProperties(const EntityItemProperties& properties) { } setLastEdited(properties._lastEdited); } + + qDebug() << "ZoneEntityItem::setProperties()"; + debugDump(); + return somethingChanged; } @@ -139,9 +149,15 @@ int ZoneEntityItem::readEntitySubclassDataFromBuffer(const unsigned char* data, READ_ENTITY_PROPERTY_SETTER(PROP_SHAPE_TYPE, ShapeType, updateShapeType); READ_ENTITY_PROPERTY_STRING(PROP_COMPOUND_SHAPE_URL, setCompoundShapeURL); + READ_ENTITY_PROPERTY_SETTER(PROP_SKYBOX_MODE, SkyboxMode, setSkyboxMode); + bytesRead += _atmospherePropeties.readEntitySubclassDataFromBuffer(dataAt, (bytesLeftToRead - bytesRead), args, propertyFlags, overwriteLocalData); + + qDebug() << "ZoneEntityItem::readEntitySubclassDataFromBuffer()"; + debugDump(); + return bytesRead; } @@ -163,6 +179,8 @@ EntityPropertyFlags ZoneEntityItem::getEntityProperties(EncodeBitstreamParams& p requestedProperties += PROP_SHAPE_TYPE; requestedProperties += PROP_COMPOUND_SHAPE_URL; + requestedProperties += PROP_SKYBOX_MODE; + requestedProperties += _atmospherePropeties.getEntityProperties(params); return requestedProperties; @@ -190,6 +208,8 @@ void ZoneEntityItem::appendSubclassData(OctreePacketData* packetData, EncodeBits APPEND_ENTITY_PROPERTY(PROP_STAGE_HOUR, appendValue, getStageHour()); APPEND_ENTITY_PROPERTY(PROP_SHAPE_TYPE, appendValue, (uint32_t)getShapeType()); APPEND_ENTITY_PROPERTY(PROP_COMPOUND_SHAPE_URL, appendValue, getCompoundShapeURL()); + + APPEND_ENTITY_PROPERTY(PROP_SKYBOX_MODE, appendValue, (uint32_t)getShapeType()); // could this be a uint16?? _atmospherePropeties.appendSubclassData(packetData, params, modelTreeElementExtraEncodeData, requestedProperties, propertyFlags, propertiesDidntFit, propertyCount, appendState); @@ -212,6 +232,7 @@ void ZoneEntityItem::debugDump() const { qCDebug(entities) << " _stageAltitude:" << _stageAltitude; qCDebug(entities) << " _stageDay:" << _stageDay; qCDebug(entities) << " _stageHour:" << _stageHour; + qCDebug(entities) << " _skyboxMode:" << _skyboxMode; _atmospherePropeties.debugDump(); } diff --git a/libraries/entities/src/ZoneEntityItem.h b/libraries/entities/src/ZoneEntityItem.h index 1e64b54e93..6819f6b974 100644 --- a/libraries/entities/src/ZoneEntityItem.h +++ b/libraries/entities/src/ZoneEntityItem.h @@ -101,6 +101,10 @@ public: const QString getCompoundShapeURL() const { return _compoundShapeURL; } virtual void setCompoundShapeURL(const QString& url); + void setSkyboxMode(SkyboxMode value) { _skyboxMode = value; } + SkyboxMode getSkyboxMode() const { return _skyboxMode; } + + virtual bool supportsDetailedRayIntersection() const { return true; } virtual bool findDetailedRayIntersection(const glm::vec3& origin, const glm::vec3& direction, bool& keepSearching, OctreeElement*& element, float& distance, BoxFace& face, @@ -137,6 +141,7 @@ protected: ShapeType _shapeType = SHAPE_TYPE_NONE; QString _compoundShapeURL; + SkyboxMode _skyboxMode = SKYBOX_MODE_INHERIT; AtmospherePropertyGroup _atmospherePropeties; static bool _zonesArePickable; From 4561c5920370ae410539158c60d38ae77ebe7acd Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Mon, 4 May 2015 13:49:43 -0700 Subject: [PATCH 09/28] wire up zone to environment atmosphere rendering --- interface/src/Application.cpp | 5 +- interface/src/Application.h | 3 + interface/src/Environment.cpp | 64 +++++++++++-------- interface/src/Environment.h | 12 +++- .../src/EntityTreeRenderer.cpp | 3 + libraries/entities/src/ZoneEntityItem.cpp | 24 +++++-- libraries/entities/src/ZoneEntityItem.h | 5 +- .../src/AbstractViewStateInterface.h | 5 ++ tests/octree/CMakeLists.txt | 2 +- 9 files changed, 84 insertions(+), 39 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index d0d01f4534..c03da4064f 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -3113,9 +3113,9 @@ void Application::displaySide(Camera& theCamera, bool selfAvatarOnly, RenderArgs // compute starfield alpha based on distance from atmosphere float alpha = 1.0f; if (Menu::getInstance()->isOptionChecked(MenuOption::Atmosphere)) { + // TODO: handle this correctly for zones const EnvironmentData& closestData = _environment.getClosestData(theCamera.getPosition()); - float height = glm::distance(theCamera.getPosition(), - closestData.getAtmosphereCenter(theCamera.getPosition())); + float height = glm::distance(theCamera.getPosition(), closestData.getAtmosphereCenter()); if (height < closestData.getAtmosphereInnerRadius()) { alpha = 0.0f; @@ -3126,6 +3126,7 @@ void Application::displaySide(Camera& theCamera, bool selfAvatarOnly, RenderArgs } // finally render the starfield + //qDebug() << "stars alpha:" << alpha; _stars.render(theCamera.getFieldOfView(), theCamera.getAspectRatio(), theCamera.getNearClip(), alpha); } diff --git a/interface/src/Application.h b/interface/src/Application.h index 9f87d05711..34ef19d5dd 100644 --- a/interface/src/Application.h +++ b/interface/src/Application.h @@ -280,6 +280,9 @@ public: virtual int getBoundaryLevelAdjust() const; virtual PickRay computePickRay(float x, float y); virtual const glm::vec3& getAvatarPosition() const { return _myAvatar->getPosition(); } + virtual void overrideEnvironmentData(const EnvironmentData& newData) { _environment.override(newData); } + virtual void endOverrideEnvironmentData() { _environment.endOverride(); } + NodeBounds& getNodeBoundsDisplay() { return _nodeBoundsDisplay; } diff --git a/interface/src/Environment.cpp b/interface/src/Environment.cpp index a08abfc920..a2b78c2ff5 100644 --- a/interface/src/Environment.cpp +++ b/interface/src/Environment.cpp @@ -71,15 +71,46 @@ void Environment::resetToDefault() { void Environment::renderAtmospheres(Camera& camera) { // get the lock for the duration of the call QMutexLocker locker(&_mutex); - - foreach (const ServerData& serverData, _data) { - // TODO: do something about EnvironmentData - foreach (const EnvironmentData& environmentData, serverData) { - renderAtmosphere(camera, environmentData); + + if (_environmentIsOverridden) { + renderAtmosphere(camera, _overrideData); + } else { + foreach (const ServerData& serverData, _data) { + // TODO: do something about EnvironmentData + foreach (const EnvironmentData& environmentData, serverData) { + renderAtmosphere(camera, environmentData); + } } } } +EnvironmentData Environment::getClosestData(const glm::vec3& position) { + if (_environmentIsOverridden) { + return _overrideData; + } + + // get the lock for the duration of the call + QMutexLocker locker(&_mutex); + + EnvironmentData closest; + float closestDistance = FLT_MAX; + foreach (const ServerData& serverData, _data) { + foreach (const EnvironmentData& environmentData, serverData) { + float distance = glm::distance(position, environmentData.getAtmosphereCenter(position)) - + environmentData.getAtmosphereOuterRadius(); + if (distance < closestDistance) { + closest = environmentData; + closestDistance = distance; + } + } + } + return closest; +} + + +// NOTE: Deprecated - I'm leaving this in for now, but it's not actually used. I made it private +// so that if anyone wants to start using this in the future they will consider how to make it +// work with new physics systems. glm::vec3 Environment::getGravity (const glm::vec3& position) { // // 'Default' gravity pulls you downward in Y when you are near the X/Z plane @@ -115,25 +146,6 @@ glm::vec3 Environment::getGravity (const glm::vec3& position) { return gravity; } -const EnvironmentData Environment::getClosestData(const glm::vec3& position) { - // get the lock for the duration of the call - QMutexLocker locker(&_mutex); - - EnvironmentData closest; - float closestDistance = FLT_MAX; - foreach (const ServerData& serverData, _data) { - foreach (const EnvironmentData& environmentData, serverData) { - float distance = glm::distance(position, environmentData.getAtmosphereCenter(position)) - - environmentData.getAtmosphereOuterRadius(); - if (distance < closestDistance) { - closest = environmentData; - closestDistance = distance; - } - } - } - return closest; -} - bool Environment::findCapsulePenetration(const glm::vec3& start, const glm::vec3& end, float radius, glm::vec3& penetration) { // collide with the "floor" @@ -217,14 +229,14 @@ ProgramObject* Environment::createSkyProgram(const char* from, int* locations) { } void Environment::renderAtmosphere(Camera& camera, const EnvironmentData& data) { - glm::vec3 center = data.getAtmosphereCenter(camera.getPosition()); + glm::vec3 center = data.getAtmosphereCenter(); glPushMatrix(); glTranslatef(center.x, center.y, center.z); glm::vec3 relativeCameraPos = camera.getPosition() - center; float height = glm::length(relativeCameraPos); - + // use the appropriate shader depending on whether we're inside or outside ProgramObject* program; int* locations; diff --git a/interface/src/Environment.h b/interface/src/Environment.h index 525f3b7eb4..1a46a10175 100644 --- a/interface/src/Environment.h +++ b/interface/src/Environment.h @@ -30,15 +30,19 @@ public: void init(); void resetToDefault(); void renderAtmospheres(Camera& camera); + + void override(const EnvironmentData& overrideData) { _overrideData = overrideData; _environmentIsOverridden = true; } + void endOverride() { _environmentIsOverridden = false; } - glm::vec3 getGravity (const glm::vec3& position); - const EnvironmentData getClosestData(const glm::vec3& position); + EnvironmentData getClosestData(const glm::vec3& position); - bool findCapsulePenetration(const glm::vec3& start, const glm::vec3& end, float radius, glm::vec3& penetration); int parseData(const HifiSockAddr& senderSockAddr, const QByteArray& packet); private: + glm::vec3 getGravity (const glm::vec3& position); // NOTE: Deprecated + bool findCapsulePenetration(const glm::vec3& start, + const glm::vec3& end, float radius, glm::vec3& penetration); // NOTE: Deprecated ProgramObject* createSkyProgram(const char* from, int* locations); @@ -74,6 +78,8 @@ private: typedef QHash ServerData; QHash _data; + EnvironmentData _overrideData; + bool _environmentIsOverridden = false; QMutex _mutex; }; diff --git a/libraries/entities-renderer/src/EntityTreeRenderer.cpp b/libraries/entities-renderer/src/EntityTreeRenderer.cpp index c9a968a58e..3071d583fe 100644 --- a/libraries/entities-renderer/src/EntityTreeRenderer.cpp +++ b/libraries/entities-renderer/src/EntityTreeRenderer.cpp @@ -427,6 +427,8 @@ void EntityTreeRenderer::render(RenderArgs::RenderMode renderMode, _bestZone->getStageAltitude()); scene->setStageDayTime(_bestZone->getStageHour()); scene->setStageYearTime(_bestZone->getStageDay()); + + _viewState->overrideEnvironmentData(_bestZone->getEnvironmentData()); } else { if (_hasPreviousZone) { scene->setKeyLightColor(_previousKeyLightColor); @@ -440,6 +442,7 @@ void EntityTreeRenderer::render(RenderArgs::RenderMode renderMode, scene->setStageYearTime(_previousStageDay); _hasPreviousZone = false; } + _viewState->endOverrideEnvironmentData(); } // we must call endScene while we still have the tree locked so that no one deletes a model diff --git a/libraries/entities/src/ZoneEntityItem.cpp b/libraries/entities/src/ZoneEntityItem.cpp index b1c875aae0..4f9ae0a30f 100644 --- a/libraries/entities/src/ZoneEntityItem.cpp +++ b/libraries/entities/src/ZoneEntityItem.cpp @@ -66,6 +66,24 @@ ZoneEntityItem::ZoneEntityItem(const EntityItemID& entityItemID, const EntityIte setProperties(properties); } + +EnvironmentData ZoneEntityItem::getEnvironmentData() const { + EnvironmentData result; + + result.setAtmosphereCenter(_atmospherePropeties.getCenter()); + result.setAtmosphereInnerRadius(_atmospherePropeties.getInnerRadius()); + result.setAtmosphereOuterRadius(_atmospherePropeties.getOuterRadius()); + result.setRayleighScattering(_atmospherePropeties.getRayleighScattering()); + result.setMieScattering(_atmospherePropeties.getMieScattering()); + result.setScatteringWavelengths(_atmospherePropeties.getScatteringWavelengths()); + + // defaults for now... + result.setSunLocation(glm::vec3(1000, 900, 1000)); + result.setSunBrightness(20.0f); + + return result; +} + EntityItemProperties ZoneEntityItem::getProperties() const { EntityItemProperties properties = EntityItem::getProperties(); // get the properties from our base class @@ -123,9 +141,6 @@ bool ZoneEntityItem::setProperties(const EntityItemProperties& properties) { setLastEdited(properties._lastEdited); } - qDebug() << "ZoneEntityItem::setProperties()"; - debugDump(); - return somethingChanged; } @@ -155,9 +170,6 @@ int ZoneEntityItem::readEntitySubclassDataFromBuffer(const unsigned char* data, propertyFlags, overwriteLocalData); - qDebug() << "ZoneEntityItem::readEntitySubclassDataFromBuffer()"; - debugDump(); - return bytesRead; } diff --git a/libraries/entities/src/ZoneEntityItem.h b/libraries/entities/src/ZoneEntityItem.h index 6819f6b974..b4c2504790 100644 --- a/libraries/entities/src/ZoneEntityItem.h +++ b/libraries/entities/src/ZoneEntityItem.h @@ -12,6 +12,8 @@ #ifndef hifi_ZoneEntityItem_h #define hifi_ZoneEntityItem_h +#include + #include "AtmospherePropertyGroup.h" #include "EntityItem.h" @@ -103,7 +105,8 @@ public: void setSkyboxMode(SkyboxMode value) { _skyboxMode = value; } SkyboxMode getSkyboxMode() const { return _skyboxMode; } - + + EnvironmentData getEnvironmentData() const; virtual bool supportsDetailedRayIntersection() const { return true; } virtual bool findDetailedRayIntersection(const glm::vec3& origin, const glm::vec3& direction, diff --git a/libraries/render-utils/src/AbstractViewStateInterface.h b/libraries/render-utils/src/AbstractViewStateInterface.h index 0d73614e7c..45cf634186 100644 --- a/libraries/render-utils/src/AbstractViewStateInterface.h +++ b/libraries/render-utils/src/AbstractViewStateInterface.h @@ -18,6 +18,7 @@ class Transform; class QThread; class ViewFrustum; class PickRay; +class EnvironmentData; /// Interface provided by Application to other objects that need access to the current view state details class AbstractViewStateInterface { @@ -32,6 +33,10 @@ public: /// gets the current view frustum for rendering the view state virtual ViewFrustum* getCurrentViewFrustum() = 0; + + /// overrides environment data + virtual void overrideEnvironmentData(const EnvironmentData& newData) = 0; + virtual void endOverrideEnvironmentData() = 0; /// gets the shadow view frustum for rendering the view state virtual ViewFrustum* getShadowViewFrustum() = 0; diff --git a/tests/octree/CMakeLists.txt b/tests/octree/CMakeLists.txt index ffd908741d..b5fb43c260 100644 --- a/tests/octree/CMakeLists.txt +++ b/tests/octree/CMakeLists.txt @@ -3,6 +3,6 @@ set(TARGET_NAME octree-tests) setup_hifi_project(Script Network) # link in the shared libraries -link_hifi_libraries(shared octree gpu model fbx networking entities avatars audio animation script-engine physics) +link_hifi_libraries(shared octree gpu model fbx networking environment entities avatars audio animation script-engine physics) copy_dlls_beside_windows_executable() \ No newline at end of file From cfe717fe08368c5cf16b03a1aaf1fa4aa23e6d93 Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Mon, 4 May 2015 13:53:29 -0700 Subject: [PATCH 10/28] only override environment when skyboxMode is atmosphere --- libraries/entities-renderer/src/EntityTreeRenderer.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/libraries/entities-renderer/src/EntityTreeRenderer.cpp b/libraries/entities-renderer/src/EntityTreeRenderer.cpp index 3071d583fe..04ce52f493 100644 --- a/libraries/entities-renderer/src/EntityTreeRenderer.cpp +++ b/libraries/entities-renderer/src/EntityTreeRenderer.cpp @@ -428,7 +428,9 @@ void EntityTreeRenderer::render(RenderArgs::RenderMode renderMode, scene->setStageDayTime(_bestZone->getStageHour()); scene->setStageYearTime(_bestZone->getStageDay()); - _viewState->overrideEnvironmentData(_bestZone->getEnvironmentData()); + if (_bestZone->getSkyboxMode() == SKYBOX_MODE_ATMOSPHERE) { + _viewState->overrideEnvironmentData(_bestZone->getEnvironmentData()); + } } else { if (_hasPreviousZone) { scene->setKeyLightColor(_previousKeyLightColor); From 741323e6c1dc1ba48d12b8adbc4b1fcd1f398886 Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Mon, 4 May 2015 14:19:13 -0700 Subject: [PATCH 11/28] wire up atmosphere.hasStars property --- interface/src/Application.cpp | 22 +++++++++++++------ .../entities/src/AtmospherePropertyGroup.cpp | 14 +++++++++++- .../entities/src/AtmospherePropertyGroup.h | 1 + .../entities/src/EntityItemPropertiesMacros.h | 14 ++++++++++++ libraries/entities/src/EntityPropertyFlags.h | 3 ++- libraries/entities/src/ZoneEntityItem.cpp | 1 + libraries/environment/src/EnvironmentData.cpp | 3 ++- libraries/environment/src/EnvironmentData.h | 5 +++++ 8 files changed, 53 insertions(+), 10 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index c03da4064f..88496d0510 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -3112,22 +3112,30 @@ void Application::displaySide(Camera& theCamera, bool selfAvatarOnly, RenderArgs // compute starfield alpha based on distance from atmosphere float alpha = 1.0f; + bool hasStars = true; if (Menu::getInstance()->isOptionChecked(MenuOption::Atmosphere)) { // TODO: handle this correctly for zones const EnvironmentData& closestData = _environment.getClosestData(theCamera.getPosition()); - float height = glm::distance(theCamera.getPosition(), closestData.getAtmosphereCenter()); - if (height < closestData.getAtmosphereInnerRadius()) { - alpha = 0.0f; + + if (closestData.getHasStars()) { + float height = glm::distance(theCamera.getPosition(), closestData.getAtmosphereCenter()); + if (height < closestData.getAtmosphereInnerRadius()) { + alpha = 0.0f; - } else if (height < closestData.getAtmosphereOuterRadius()) { - alpha = (height - closestData.getAtmosphereInnerRadius()) / - (closestData.getAtmosphereOuterRadius() - closestData.getAtmosphereInnerRadius()); + } else if (height < closestData.getAtmosphereOuterRadius()) { + alpha = (height - closestData.getAtmosphereInnerRadius()) / + (closestData.getAtmosphereOuterRadius() - closestData.getAtmosphereInnerRadius()); + } + } else { + hasStars = false; } } // finally render the starfield //qDebug() << "stars alpha:" << alpha; - _stars.render(theCamera.getFieldOfView(), theCamera.getAspectRatio(), theCamera.getNearClip(), alpha); + if (hasStars) { + _stars.render(theCamera.getFieldOfView(), theCamera.getAspectRatio(), theCamera.getNearClip(), alpha); + } } if (Menu::getInstance()->isOptionChecked(MenuOption::Wireframe)) { diff --git a/libraries/entities/src/AtmospherePropertyGroup.cpp b/libraries/entities/src/AtmospherePropertyGroup.cpp index dc3dbe0bab..c59882791f 100644 --- a/libraries/entities/src/AtmospherePropertyGroup.cpp +++ b/libraries/entities/src/AtmospherePropertyGroup.cpp @@ -22,7 +22,7 @@ AtmospherePropertyGroup::AtmospherePropertyGroup() { _mieScattering = 0.0f; _rayleighScattering = 0.0f; _scatteringWavelengths = glm::vec3(0.0f); - + _hasStars = true; } void AtmospherePropertyGroup::copyToScriptValue(QScriptValue& properties, QScriptEngine* engine, bool skipDefaults, EntityItemProperties& defaultEntityProperties) const { @@ -32,6 +32,7 @@ void AtmospherePropertyGroup::copyToScriptValue(QScriptValue& properties, QScrip COPY_GROUP_PROPERTY_TO_QSCRIPTVALUE(Atmosphere, MieScattering, mieScattering); COPY_GROUP_PROPERTY_TO_QSCRIPTVALUE(Atmosphere, RayleighScattering, rayleighScattering); COPY_GROUP_PROPERTY_TO_QSCRIPTVALUE_VEC3(Atmosphere, ScatteringWavelengths, scatteringWavelengths); + COPY_GROUP_PROPERTY_TO_QSCRIPTVALUE(Atmosphere, HasStars, hasStars); } void AtmospherePropertyGroup::copyFromScriptValue(const QScriptValue& object, bool& _defaultSettings) { @@ -41,6 +42,7 @@ void AtmospherePropertyGroup::copyFromScriptValue(const QScriptValue& object, bo COPY_GROUP_PROPERTY_FROM_QSCRIPTVALUE_FLOAT(atmosphere, mieScattering, setMieScattering); COPY_GROUP_PROPERTY_FROM_QSCRIPTVALUE_FLOAT(atmosphere, rayleighScattering, setRayleighScattering); COPY_GROUP_PROPERTY_FROM_QSCRIPTVALUE_VEC3(atmosphere, scatteringWavelengths, setScatteringWavelengths); + COPY_GROUP_PROPERTY_FROM_QSCRIPTVALUE_BOOL(atmosphere, hasStars, setHasStars); } void AtmospherePropertyGroup::debugDump() const { @@ -51,6 +53,7 @@ void AtmospherePropertyGroup::debugDump() const { qDebug() << " Mie Scattering:" << getMieScattering(); qDebug() << " Rayleigh Scattering:" << getRayleighScattering(); qDebug() << " Scattering Wavelengths:" << getScatteringWavelengths(); + qDebug() << " Has Stars:" << getHasStars(); } bool AtmospherePropertyGroup::appentToEditPacket(OctreePacketData* packetData, @@ -68,6 +71,7 @@ bool AtmospherePropertyGroup::appentToEditPacket(OctreePacketData* packetData, APPEND_ENTITY_PROPERTY(PROP_ATMOSPHERE_MIE_SCATTERING, appendValue, getMieScattering()); APPEND_ENTITY_PROPERTY(PROP_ATMOSPHERE_RAYLEIGH_SCATTERING, appendValue, getRayleighScattering()); APPEND_ENTITY_PROPERTY(PROP_ATMOSPHERE_SCATTERING_WAVELENGTHS, appendValue, getScatteringWavelengths()); + APPEND_ENTITY_PROPERTY(PROP_ATMOSPHERE_HAS_STARS, appendValue, getHasStars()); return true; } @@ -84,6 +88,7 @@ bool AtmospherePropertyGroup::decodeFromEditPacket(EntityPropertyFlags& property READ_ENTITY_PROPERTY(PROP_ATMOSPHERE_MIE_SCATTERING, float, _mieScattering); READ_ENTITY_PROPERTY(PROP_ATMOSPHERE_RAYLEIGH_SCATTERING, float, _rayleighScattering); READ_ENTITY_PROPERTY(PROP_ATMOSPHERE_SCATTERING_WAVELENGTHS, glm::vec3, _scatteringWavelengths); + READ_ENTITY_PROPERTY(PROP_ATMOSPHERE_HAS_STARS, bool, _hasStars); processedBytes += bytesRead; @@ -97,6 +102,7 @@ void AtmospherePropertyGroup::markAllChanged() { _mieScatteringChanged = true; _rayleighScatteringChanged = true; _scatteringWavelengthsChanged = true; + _hasStarsChanged = true; } EntityPropertyFlags AtmospherePropertyGroup::getChangedProperties() const { @@ -108,6 +114,7 @@ EntityPropertyFlags AtmospherePropertyGroup::getChangedProperties() const { CHECK_PROPERTY_CHANGE(PROP_ATMOSPHERE_MIE_SCATTERING, mieScattering); CHECK_PROPERTY_CHANGE(PROP_ATMOSPHERE_RAYLEIGH_SCATTERING, rayleighScattering); CHECK_PROPERTY_CHANGE(PROP_ATMOSPHERE_SCATTERING_WAVELENGTHS, scatteringWavelengths); + CHECK_PROPERTY_CHANGE(PROP_ATMOSPHERE_HAS_STARS, hasStars); return changedProperties; } @@ -120,6 +127,7 @@ void AtmospherePropertyGroup::getProperties(EntityItemProperties& properties) co COPY_ENTITY_GROUP_PROPERTY_TO_PROPERTIES(Atmosphere, MieScattering, getMieScattering); COPY_ENTITY_GROUP_PROPERTY_TO_PROPERTIES(Atmosphere, RayleighScattering, getRayleighScattering); COPY_ENTITY_GROUP_PROPERTY_TO_PROPERTIES(Atmosphere, ScatteringWavelengths, getScatteringWavelengths); + COPY_ENTITY_GROUP_PROPERTY_TO_PROPERTIES(Atmosphere, HasStars, getHasStars); } bool AtmospherePropertyGroup::setProperties(const EntityItemProperties& properties) { @@ -131,6 +139,7 @@ bool AtmospherePropertyGroup::setProperties(const EntityItemProperties& properti SET_ENTITY_GROUP_PROPERTY_FROM_PROPERTIES(Atmosphere, MieScattering, mieScattering, setMieScattering); SET_ENTITY_GROUP_PROPERTY_FROM_PROPERTIES(Atmosphere, RayleighScattering, rayleighScattering, setRayleighScattering); SET_ENTITY_GROUP_PROPERTY_FROM_PROPERTIES(Atmosphere, ScatteringWavelengths, scatteringWavelengths, setScatteringWavelengths); + SET_ENTITY_GROUP_PROPERTY_FROM_PROPERTIES(Atmosphere, HasStars, hasStars, setHasStars); return somethingChanged; } @@ -144,6 +153,7 @@ EntityPropertyFlags AtmospherePropertyGroup::getEntityProperties(EncodeBitstream requestedProperties += PROP_ATMOSPHERE_MIE_SCATTERING; requestedProperties += PROP_ATMOSPHERE_RAYLEIGH_SCATTERING; requestedProperties += PROP_ATMOSPHERE_SCATTERING_WAVELENGTHS; + requestedProperties += PROP_ATMOSPHERE_HAS_STARS; return requestedProperties; } @@ -164,6 +174,7 @@ void AtmospherePropertyGroup::appendSubclassData(OctreePacketData* packetData, E APPEND_ENTITY_PROPERTY(PROP_ATMOSPHERE_MIE_SCATTERING, appendValue, getMieScattering()); APPEND_ENTITY_PROPERTY(PROP_ATMOSPHERE_RAYLEIGH_SCATTERING, appendValue, getRayleighScattering()); APPEND_ENTITY_PROPERTY(PROP_ATMOSPHERE_SCATTERING_WAVELENGTHS, appendValue, getScatteringWavelengths()); + APPEND_ENTITY_PROPERTY(PROP_ATMOSPHERE_HAS_STARS, appendValue, getHasStars()); } int AtmospherePropertyGroup::readEntitySubclassDataFromBuffer(const unsigned char* data, int bytesLeftToRead, @@ -179,6 +190,7 @@ int AtmospherePropertyGroup::readEntitySubclassDataFromBuffer(const unsigned cha READ_ENTITY_PROPERTY(PROP_ATMOSPHERE_MIE_SCATTERING, float, _mieScattering); READ_ENTITY_PROPERTY(PROP_ATMOSPHERE_RAYLEIGH_SCATTERING, float, _rayleighScattering); READ_ENTITY_PROPERTY(PROP_ATMOSPHERE_SCATTERING_WAVELENGTHS, glm::vec3, _scatteringWavelengths); + READ_ENTITY_PROPERTY(PROP_ATMOSPHERE_HAS_STARS, bool, _hasStars); return bytesRead; } diff --git a/libraries/entities/src/AtmospherePropertyGroup.h b/libraries/entities/src/AtmospherePropertyGroup.h index 3f3f2ff6d2..e081033cd6 100644 --- a/libraries/entities/src/AtmospherePropertyGroup.h +++ b/libraries/entities/src/AtmospherePropertyGroup.h @@ -96,6 +96,7 @@ public: DEFINE_PROPERTY(PROP_ATMOSPHERE_MIE_SCATTERING, MieScattering, mieScattering, float); DEFINE_PROPERTY(PROP_ATMOSPHERE_RAYLEIGH_SCATTERING, RayleighScattering, rayleighScattering, float); DEFINE_PROPERTY_REF(PROP_ATMOSPHERE_SCATTERING_WAVELENGTHS, ScatteringWavelengths, scatteringWavelengths, glm::vec3); + DEFINE_PROPERTY(PROP_ATMOSPHERE_HAS_STARS, HasStars, hasStars, bool); }; #endif // hifi_AtmospherePropertyGroup_h diff --git a/libraries/entities/src/EntityItemPropertiesMacros.h b/libraries/entities/src/EntityItemPropertiesMacros.h index a3be19b812..b8564f650f 100644 --- a/libraries/entities/src/EntityItemPropertiesMacros.h +++ b/libraries/entities/src/EntityItemPropertiesMacros.h @@ -306,6 +306,20 @@ } \ } +#define COPY_GROUP_PROPERTY_FROM_QSCRIPTVALUE_BOOL(G, P, S) \ + { \ + QScriptValue G = object.property(#G); \ + if (G.isValid()) { \ + QScriptValue P = G.property(#P); \ + if (P.isValid()) { \ + float newValue = P.toVariant().toBool(); \ + if (_defaultSettings || newValue != _##P) { \ + S(newValue); \ + } \ + } \ + } \ + } + #define COPY_PROPERTY_FROM_QSCRIPTVALUE_STRING(P, S)\ QScriptValue P = object.property(#P); \ if (P.isValid()) { \ diff --git a/libraries/entities/src/EntityPropertyFlags.h b/libraries/entities/src/EntityPropertyFlags.h index 969ed309bb..0b5d2ce805 100644 --- a/libraries/entities/src/EntityPropertyFlags.h +++ b/libraries/entities/src/EntityPropertyFlags.h @@ -142,7 +142,8 @@ enum EntityPropertyList { PROP_ATMOSPHERE_MIE_SCATTERING = PROP_EMIT_DIRECTION, PROP_ATMOSPHERE_RAYLEIGH_SCATTERING = PROP_EMIT_STRENGTH, PROP_ATMOSPHERE_SCATTERING_WAVELENGTHS = PROP_LOCAL_GRAVITY, - PROP_SKYBOX_MODE = PROP_PARTICLE_RADIUS, + PROP_ATMOSPHERE_HAS_STARS = PROP_PARTICLE_RADIUS, + PROP_SKYBOX_MODE = PROP_MODEL_URL, // SunBrightness - same as KeyLight Intensity? // SunLocation (or direction) - same as KeyLight diff --git a/libraries/entities/src/ZoneEntityItem.cpp b/libraries/entities/src/ZoneEntityItem.cpp index 4f9ae0a30f..cefc0b0de7 100644 --- a/libraries/entities/src/ZoneEntityItem.cpp +++ b/libraries/entities/src/ZoneEntityItem.cpp @@ -76,6 +76,7 @@ EnvironmentData ZoneEntityItem::getEnvironmentData() const { result.setRayleighScattering(_atmospherePropeties.getRayleighScattering()); result.setMieScattering(_atmospherePropeties.getMieScattering()); result.setScatteringWavelengths(_atmospherePropeties.getScatteringWavelengths()); + result.setHasStars(_atmospherePropeties.getHasStars()); // defaults for now... result.setSunLocation(glm::vec3(1000, 900, 1000)); diff --git a/libraries/environment/src/EnvironmentData.cpp b/libraries/environment/src/EnvironmentData.cpp index 913841fe31..f703b667bc 100644 --- a/libraries/environment/src/EnvironmentData.cpp +++ b/libraries/environment/src/EnvironmentData.cpp @@ -27,7 +27,8 @@ EnvironmentData::EnvironmentData(int id) : _mieScattering(0.0010f), _scatteringWavelengths(0.650f, 0.570f, 0.475f), _sunLocation(1000, 900, 1000), - _sunBrightness(20.0f) { + _sunBrightness(20.0f), + _hasStars(true) { } glm::vec3 EnvironmentData::getAtmosphereCenter(const glm::vec3& cameraPosition) const { diff --git a/libraries/environment/src/EnvironmentData.h b/libraries/environment/src/EnvironmentData.h index 52297682fd..ebbb3d1fb0 100644 --- a/libraries/environment/src/EnvironmentData.h +++ b/libraries/environment/src/EnvironmentData.h @@ -28,6 +28,9 @@ public: void setGravity(float gravity) { _gravity = gravity; } float getGravity() const { return _gravity; } + void setHasStars(bool value) { _hasStars = value; } + bool getHasStars() const { return _hasStars; } + void setAtmosphereCenter(const glm::vec3& center) { _atmosphereCenter = center; } void setAtmosphereInnerRadius(float radius) { _atmosphereInnerRadius = radius; } void setAtmosphereOuterRadius(float radius) { _atmosphereOuterRadius = radius; } @@ -73,6 +76,8 @@ private: glm::vec3 _sunLocation; float _sunBrightness; + + bool _hasStars; }; #endif // hifi_EnvironmentData_h From 403ed6d77bb64ce4ce26009794b2dccdbf450085 Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Mon, 4 May 2015 15:20:16 -0700 Subject: [PATCH 12/28] wire up sunlocation from keylight direction --- libraries/entities-renderer/src/EntityTreeRenderer.cpp | 7 ++++++- libraries/entities/src/ZoneEntityItem.cpp | 7 ++++--- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/libraries/entities-renderer/src/EntityTreeRenderer.cpp b/libraries/entities-renderer/src/EntityTreeRenderer.cpp index 04ce52f493..84ad41ff7b 100644 --- a/libraries/entities-renderer/src/EntityTreeRenderer.cpp +++ b/libraries/entities-renderer/src/EntityTreeRenderer.cpp @@ -429,7 +429,12 @@ void EntityTreeRenderer::render(RenderArgs::RenderMode renderMode, scene->setStageYearTime(_bestZone->getStageDay()); if (_bestZone->getSkyboxMode() == SKYBOX_MODE_ATMOSPHERE) { - _viewState->overrideEnvironmentData(_bestZone->getEnvironmentData()); + EnvironmentData data = _bestZone->getEnvironmentData(); + glm::vec3 keyLightDirection = scene->getKeyLightDirection(); + glm::vec3 inverseKeyLightDirection = keyLightDirection * -1.0f; + glm::vec3 keyLightLocation = _viewState->getAvatarPosition() + (inverseKeyLightDirection * data.getAtmosphereOuterRadius()); + data.setSunLocation(keyLightLocation); + _viewState->overrideEnvironmentData(data); } } else { if (_hasPreviousZone) { diff --git a/libraries/entities/src/ZoneEntityItem.cpp b/libraries/entities/src/ZoneEntityItem.cpp index cefc0b0de7..f10e42ee08 100644 --- a/libraries/entities/src/ZoneEntityItem.cpp +++ b/libraries/entities/src/ZoneEntityItem.cpp @@ -78,9 +78,10 @@ EnvironmentData ZoneEntityItem::getEnvironmentData() const { result.setScatteringWavelengths(_atmospherePropeties.getScatteringWavelengths()); result.setHasStars(_atmospherePropeties.getHasStars()); - // defaults for now... - result.setSunLocation(glm::vec3(1000, 900, 1000)); - result.setSunBrightness(20.0f); + // NOTE: The sunLocation and SunBrightness will be overwritten in the EntityTreeRenderer to use the + // keyLight details from the scene interface + //result.setSunLocation(1000, 900, 1000)); + //result.setSunBrightness(20.0f); return result; } From 3827e961a74200ec1158a1213ee9a038d91cd405 Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Mon, 4 May 2015 15:31:50 -0700 Subject: [PATCH 13/28] hook sunBrightness to keyLightIntensity --- libraries/entities-renderer/src/EntityTreeRenderer.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/libraries/entities-renderer/src/EntityTreeRenderer.cpp b/libraries/entities-renderer/src/EntityTreeRenderer.cpp index 84ad41ff7b..f5c56ad04b 100644 --- a/libraries/entities-renderer/src/EntityTreeRenderer.cpp +++ b/libraries/entities-renderer/src/EntityTreeRenderer.cpp @@ -434,6 +434,11 @@ void EntityTreeRenderer::render(RenderArgs::RenderMode renderMode, glm::vec3 inverseKeyLightDirection = keyLightDirection * -1.0f; glm::vec3 keyLightLocation = _viewState->getAvatarPosition() + (inverseKeyLightDirection * data.getAtmosphereOuterRadius()); data.setSunLocation(keyLightLocation); + + consrt float KEY_LIGHT_INTENSITY_TO_SUN_BRIGHTNESS_RATIO = 20.0f; + float sunBrightness = scene->getKeyLightIntensity() * KEY_LIGHT_INTENSITY_TO_SUN_BRIGHTNESS_RATIO; + data.setSunBrightness(sunBrightness); + _viewState->overrideEnvironmentData(data); } } else { From 32ef0c20100a6efd4ed78d680fe4c2aa17aee8cf Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Mon, 4 May 2015 15:49:21 -0700 Subject: [PATCH 14/28] removed some dead code --- interface/src/Application.cpp | 1 - libraries/entities/src/EntityItemProperties.cpp | 3 --- 2 files changed, 4 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 88496d0510..4cb3a85d7e 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -3132,7 +3132,6 @@ void Application::displaySide(Camera& theCamera, bool selfAvatarOnly, RenderArgs } // finally render the starfield - //qDebug() << "stars alpha:" << alpha; if (hasStars) { _stars.render(theCamera.getFieldOfView(), theCamera.getAspectRatio(), theCamera.getNearClip(), alpha); } diff --git a/libraries/entities/src/EntityItemProperties.cpp b/libraries/entities/src/EntityItemProperties.cpp index 480233e538..144bb28419 100644 --- a/libraries/entities/src/EntityItemProperties.cpp +++ b/libraries/entities/src/EntityItemProperties.cpp @@ -982,10 +982,7 @@ bool EntityItemProperties::decodeEntityEditPacket(const unsigned char* data, int READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_SHAPE_TYPE, ShapeType, setShapeType); READ_ENTITY_PROPERTY_STRING_TO_PROPERTIES(PROP_COMPOUND_SHAPE_URL, setCompoundShapeURL); READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_SKYBOX_MODE, SkyboxMode, setSkyboxMode); - - qDebug() << "EntityItemProperties::decodeEntityEditPacket()...."; properties.getAtmosphere().decodeFromEditPacket(propertyFlags, dataAt , processedBytes); - properties.getAtmosphere().debugDump(); } READ_ENTITY_PROPERTY_STRING_TO_PROPERTIES(PROP_MARKETPLACE_ID, setMarketplaceID); From 2c02bfdda5534d6c54633f9ead86fd26c9e47ccb Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Mon, 4 May 2015 16:01:50 -0700 Subject: [PATCH 15/28] fix build buster --- libraries/entities-renderer/src/EntityTreeRenderer.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/entities-renderer/src/EntityTreeRenderer.cpp b/libraries/entities-renderer/src/EntityTreeRenderer.cpp index f5c56ad04b..5ee0dafce8 100644 --- a/libraries/entities-renderer/src/EntityTreeRenderer.cpp +++ b/libraries/entities-renderer/src/EntityTreeRenderer.cpp @@ -435,7 +435,7 @@ void EntityTreeRenderer::render(RenderArgs::RenderMode renderMode, glm::vec3 keyLightLocation = _viewState->getAvatarPosition() + (inverseKeyLightDirection * data.getAtmosphereOuterRadius()); data.setSunLocation(keyLightLocation); - consrt float KEY_LIGHT_INTENSITY_TO_SUN_BRIGHTNESS_RATIO = 20.0f; + const float KEY_LIGHT_INTENSITY_TO_SUN_BRIGHTNESS_RATIO = 20.0f; float sunBrightness = scene->getKeyLightIntensity() * KEY_LIGHT_INTENSITY_TO_SUN_BRIGHTNESS_RATIO; data.setSunBrightness(sunBrightness); From 3f8c52cdd48d533d3730a26e381a0fba245e68d8 Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Mon, 4 May 2015 16:36:38 -0700 Subject: [PATCH 16/28] attempt to fix unix build buster --- libraries/entities/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/entities/CMakeLists.txt b/libraries/entities/CMakeLists.txt index e57bcf67fa..d21906fa3f 100644 --- a/libraries/entities/CMakeLists.txt +++ b/libraries/entities/CMakeLists.txt @@ -13,4 +13,4 @@ find_package(Bullet REQUIRED) target_include_directories(${TARGET_NAME} SYSTEM PRIVATE ${BULLET_INCLUDE_DIRS}) target_link_libraries(${TARGET_NAME} ${BULLET_LIBRARIES}) -link_hifi_libraries(avatars shared octree gpu model fbx networking animation) +link_hifi_libraries(avatars shared octree gpu model fbx networking animation environment) From 8b3b32c70d502d4ef0df46f7b2b8e74759fb6857 Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Mon, 4 May 2015 17:21:50 -0700 Subject: [PATCH 17/28] add example --- .../example/entities/zoneAtmosphereExample.js | 73 +++++++++++++++++++ 1 file changed, 73 insertions(+) create mode 100644 examples/example/entities/zoneAtmosphereExample.js diff --git a/examples/example/entities/zoneAtmosphereExample.js b/examples/example/entities/zoneAtmosphereExample.js new file mode 100644 index 0000000000..57d71a53b6 --- /dev/null +++ b/examples/example/entities/zoneAtmosphereExample.js @@ -0,0 +1,73 @@ +// +// zoneAtmosphereExample.js +// examples +// +// Created by Brad Hefta-Gaub on 4/16/15. +// Copyright 2015 High Fidelity, Inc. +// +// This is an example script that demonstrates creating a zone using the atmosphere features +// +// Distributed under the Apache License, Version 2.0. +// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html +// + +HIFI_PUBLIC_BUCKET = "http://s3.amazonaws.com/hifi-public/"; + +var count = 0; +var stopAfter = 10000; + +var zoneEntityA = Entities.addEntity({ + type: "Zone", + position: { x: 1000, y: 1000, z: 1000}, + dimensions: { x: 2000, y: 2000, z: 2000 }, + keyLightColor: { red: 255, green: 0, blue: 0 }, + stageSunModelEnabled: false, + shapeType: "sphere", + skyboxMode: "atmosphere", + atmosphere: { + center: { x: 1000, y: 0, z: 1000}, + innerRadius: 1000.0, + outerRadius: 1025.0, + rayleighScattering: 0.0025, + mieScattering: 0.0010, + 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 +}); + + +// register the call back so it fires before each data send +Script.update.connect(function(deltaTime) { + // stop it... + if (count >= stopAfter) { + print("calling Script.stop()"); + Script.stop(); + } + count++; + var newHour = (count / 10) % 24; + var newIntensity = ((count / 10) % 24) / 24; + print("newHour:" + newHour); + print("newIntensity:" + newIntensity); + + Entities.editEntity(zoneEntityA, { + skyboxMode: "atmosphere", + atmosphere: { + center: { x: 1000, y: 0, z: 1000}, + innerRadius: 1000.0, + outerRadius: 1025.0, + rayleighScattering: 0.0025, + mieScattering: 0.0010, + scatteringWavelengths: { x: 0.650, y: 0.570, z: 0.475 }, + hasStars: false + }, + stageHour: newHour, + keyLightIntensity: newIntensity + }); +}); + From 4b9c6728e76bbae38543e38a0b031cf56de64f88 Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Mon, 4 May 2015 18:58:35 -0700 Subject: [PATCH 18/28] fix issue with skyboxMode getting randomly set --- examples/example/entities/zoneAtmosphereExample.js | 10 ---------- .../entities-renderer/src/EntityTreeRenderer.cpp | 7 ++++++- libraries/entities/src/AtmospherePropertyGroup.cpp | 14 +++++++------- libraries/entities/src/EntityItemProperties.cpp | 13 ++++++++----- libraries/entities/src/EntityItemProperties.h | 2 ++ .../entities/src/EntityItemPropertiesMacros.h | 5 ++--- libraries/entities/src/ZoneEntityItem.cpp | 12 ++---------- 7 files changed, 27 insertions(+), 36 deletions(-) diff --git a/examples/example/entities/zoneAtmosphereExample.js b/examples/example/entities/zoneAtmosphereExample.js index 57d71a53b6..2f21ea3db2 100644 --- a/examples/example/entities/zoneAtmosphereExample.js +++ b/examples/example/entities/zoneAtmosphereExample.js @@ -56,16 +56,6 @@ Script.update.connect(function(deltaTime) { print("newIntensity:" + newIntensity); Entities.editEntity(zoneEntityA, { - skyboxMode: "atmosphere", - atmosphere: { - center: { x: 1000, y: 0, z: 1000}, - innerRadius: 1000.0, - outerRadius: 1025.0, - rayleighScattering: 0.0025, - mieScattering: 0.0010, - scatteringWavelengths: { x: 0.650, y: 0.570, z: 0.475 }, - hasStars: false - }, stageHour: newHour, keyLightIntensity: newIntensity }); diff --git a/libraries/entities-renderer/src/EntityTreeRenderer.cpp b/libraries/entities-renderer/src/EntityTreeRenderer.cpp index 5ee0dafce8..8c738fe366 100644 --- a/libraries/entities-renderer/src/EntityTreeRenderer.cpp +++ b/libraries/entities-renderer/src/EntityTreeRenderer.cpp @@ -432,7 +432,12 @@ void EntityTreeRenderer::render(RenderArgs::RenderMode renderMode, EnvironmentData data = _bestZone->getEnvironmentData(); glm::vec3 keyLightDirection = scene->getKeyLightDirection(); glm::vec3 inverseKeyLightDirection = keyLightDirection * -1.0f; - glm::vec3 keyLightLocation = _viewState->getAvatarPosition() + (inverseKeyLightDirection * data.getAtmosphereOuterRadius()); + + // NOTE: is this right? It seems like the "sun" should be based on the center of the + // atmosphere, not where the camera is. + glm::vec3 keyLightLocation = _viewState->getAvatarPosition() + + (inverseKeyLightDirection * data.getAtmosphereOuterRadius()); + data.setSunLocation(keyLightLocation); const float KEY_LIGHT_INTENSITY_TO_SUN_BRIGHTNESS_RATIO = 20.0f; diff --git a/libraries/entities/src/AtmospherePropertyGroup.cpp b/libraries/entities/src/AtmospherePropertyGroup.cpp index c59882791f..54e48023b8 100644 --- a/libraries/entities/src/AtmospherePropertyGroup.cpp +++ b/libraries/entities/src/AtmospherePropertyGroup.cpp @@ -47,13 +47,13 @@ void AtmospherePropertyGroup::copyFromScriptValue(const QScriptValue& object, bo void AtmospherePropertyGroup::debugDump() const { qDebug() << " AtmospherePropertyGroup: ---------------------------------------------"; - qDebug() << " Center:" << getCenter(); - qDebug() << " Inner Radius:" << getInnerRadius(); - qDebug() << " Outer Radius:" << getOuterRadius(); - qDebug() << " Mie Scattering:" << getMieScattering(); - qDebug() << " Rayleigh Scattering:" << getRayleighScattering(); - qDebug() << " Scattering Wavelengths:" << getScatteringWavelengths(); - qDebug() << " Has Stars:" << getHasStars(); + qDebug() << " Center:" << getCenter() << " has changed:" << centerChanged(); + qDebug() << " Inner Radius:" << getInnerRadius() << " has changed:" << innerRadiusChanged(); + qDebug() << " Outer Radius:" << getOuterRadius() << " has changed:" << outerRadiusChanged(); + qDebug() << " Mie Scattering:" << getMieScattering() << " has changed:" << mieScatteringChanged(); + qDebug() << " Rayleigh Scattering:" << getRayleighScattering() << " has changed:" << rayleighScatteringChanged(); + qDebug() << " Scattering Wavelengths:" << getScatteringWavelengths() << " has changed:" << scatteringWavelengthsChanged(); + qDebug() << " Has Stars:" << getHasStars() << " has changed:" << hasStarsChanged(); } bool AtmospherePropertyGroup::appentToEditPacket(OctreePacketData* packetData, diff --git a/libraries/entities/src/EntityItemProperties.cpp b/libraries/entities/src/EntityItemProperties.cpp index 144bb28419..7613f1912c 100644 --- a/libraries/entities/src/EntityItemProperties.cpp +++ b/libraries/entities/src/EntityItemProperties.cpp @@ -257,11 +257,17 @@ QString EntityItemProperties::getSkyboxModeAsString() const { return QString(skyboxModeNames[SKYBOX_MODE_INHERIT]); } -void EntityItemProperties::setSkyboxModeFromString(const QString& shapeName) { +QString EntityItemProperties::getSkyboxModeString(SkyboxMode mode) { + if (mode < sizeof(skyboxModeNames) / sizeof(char *)) + return QString(skyboxModeNames[mode]); + return QString(skyboxModeNames[SKYBOX_MODE_INHERIT]); +} + +void EntityItemProperties::setSkyboxModeFromString(const QString& skyboxMode) { if (stringToSkyboxModeLookup.empty()) { buildStringToSkyboxModeLookup(); } - auto skyboxModeItr = stringToSkyboxModeLookup.find(shapeName.toLower()); + auto skyboxModeItr = stringToSkyboxModeLookup.find(skyboxMode.toLower()); if (skyboxModeItr != stringToSkyboxModeLookup.end()) { _skyboxMode = skyboxModeItr.value(); _skyboxModeChanged = true; @@ -518,11 +524,8 @@ void EntityItemProperties::copyFromScriptValue(const QScriptValue& object) { 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(skyboxMode, SkyboxMode); - _atmosphere.copyFromScriptValue(object, _defaultSettings); - _lastEdited = usecTimestampNow(); } diff --git a/libraries/entities/src/EntityItemProperties.h b/libraries/entities/src/EntityItemProperties.h index 595329b4a6..95072f23a0 100644 --- a/libraries/entities/src/EntityItemProperties.h +++ b/libraries/entities/src/EntityItemProperties.h @@ -141,6 +141,8 @@ public: DEFINE_PROPERTY_GROUP(Atmosphere, atmosphere, AtmospherePropertyGroup); DEFINE_PROPERTY_REF_ENUM(PROP_SKYBOX_MODE, SkyboxMode, skyboxMode, SkyboxMode); + static QString getSkyboxModeString(SkyboxMode mode); + public: float getMaxDimension() const { return glm::max(_dimensions.x, _dimensions.y, _dimensions.z); } diff --git a/libraries/entities/src/EntityItemPropertiesMacros.h b/libraries/entities/src/EntityItemPropertiesMacros.h index b8564f650f..aa4bd674cd 100644 --- a/libraries/entities/src/EntityItemPropertiesMacros.h +++ b/libraries/entities/src/EntityItemPropertiesMacros.h @@ -51,7 +51,6 @@ } \ } - #define READ_ENTITY_PROPERTY_QUAT(P,M) \ if (propertyFlags.getHasProperty(P)) { \ glm::quat fromBuffer; \ @@ -458,7 +457,7 @@ void set##N##Changed(bool value) { _##n##Changed = value; } \ private: \ T _##n; \ - bool _##n##Changed; + bool _##n##Changed = false; #define DEFINE_PROPERTY_REF(P, N, n, T) \ public: \ @@ -468,7 +467,7 @@ void set##N##Changed(bool value) { _##n##Changed = value; } \ private: \ T _##n; \ - bool _##n##Changed; + bool _##n##Changed = false; #define DEFINE_PROPERTY_REF_WITH_SETTER(P, N, n, T) \ public: \ diff --git a/libraries/entities/src/ZoneEntityItem.cpp b/libraries/entities/src/ZoneEntityItem.cpp index 69fad0c313..a6e11294b9 100644 --- a/libraries/entities/src/ZoneEntityItem.cpp +++ b/libraries/entities/src/ZoneEntityItem.cpp @@ -126,7 +126,6 @@ bool ZoneEntityItem::setProperties(const EntityItemProperties& properties) { SET_ENTITY_PROPERTY_FROM_PROPERTIES(stageHour, setStageHour); SET_ENTITY_PROPERTY_FROM_PROPERTIES(shapeType, updateShapeType); SET_ENTITY_PROPERTY_FROM_PROPERTIES(compoundShapeURL, setCompoundShapeURL); - SET_ENTITY_PROPERTY_FROM_PROPERTIES(skyboxMode, setSkyboxMode); bool somethingChangedInAtmosphere = _atmospherePropeties.setProperties(properties); @@ -150,7 +149,6 @@ bool ZoneEntityItem::setProperties(const EntityItemProperties& properties) { int ZoneEntityItem::readEntitySubclassDataFromBuffer(const unsigned char* data, int bytesLeftToRead, ReadBitstreamToTreeParams& args, EntityPropertyFlags& propertyFlags, bool overwriteLocalData) { - int bytesRead = 0; const unsigned char* dataAt = data; @@ -166,13 +164,10 @@ int ZoneEntityItem::readEntitySubclassDataFromBuffer(const unsigned char* data, READ_ENTITY_PROPERTY(PROP_STAGE_HOUR, float, _stageHour); READ_ENTITY_PROPERTY_SETTER(PROP_SHAPE_TYPE, ShapeType, updateShapeType); READ_ENTITY_PROPERTY_STRING(PROP_COMPOUND_SHAPE_URL, setCompoundShapeURL); - READ_ENTITY_PROPERTY_SETTER(PROP_SKYBOX_MODE, SkyboxMode, setSkyboxMode); - bytesRead += _atmospherePropeties.readEntitySubclassDataFromBuffer(dataAt, (bytesLeftToRead - bytesRead), args, propertyFlags, overwriteLocalData); - return bytesRead; } @@ -193,9 +188,7 @@ EntityPropertyFlags ZoneEntityItem::getEntityProperties(EncodeBitstreamParams& p requestedProperties += PROP_STAGE_HOUR; requestedProperties += PROP_SHAPE_TYPE; requestedProperties += PROP_COMPOUND_SHAPE_URL; - requestedProperties += PROP_SKYBOX_MODE; - requestedProperties += _atmospherePropeties.getEntityProperties(params); return requestedProperties; @@ -223,8 +216,7 @@ void ZoneEntityItem::appendSubclassData(OctreePacketData* packetData, EncodeBits APPEND_ENTITY_PROPERTY(PROP_STAGE_HOUR, appendValue, getStageHour()); APPEND_ENTITY_PROPERTY(PROP_SHAPE_TYPE, appendValue, (uint32_t)getShapeType()); APPEND_ENTITY_PROPERTY(PROP_COMPOUND_SHAPE_URL, appendValue, getCompoundShapeURL()); - - APPEND_ENTITY_PROPERTY(PROP_SKYBOX_MODE, appendValue, (uint32_t)getShapeType()); // could this be a uint16?? + APPEND_ENTITY_PROPERTY(PROP_SKYBOX_MODE, appendValue, (uint32_t)getSkyboxMode()); // could this be a uint16?? _atmospherePropeties.appendSubclassData(packetData, params, modelTreeElementExtraEncodeData, requestedProperties, propertyFlags, propertiesDidntFit, propertyCount, appendState); @@ -247,7 +239,7 @@ void ZoneEntityItem::debugDump() const { qCDebug(entities) << " _stageAltitude:" << _stageAltitude; qCDebug(entities) << " _stageDay:" << _stageDay; qCDebug(entities) << " _stageHour:" << _stageHour; - qCDebug(entities) << " _skyboxMode:" << _skyboxMode; + qCDebug(entities) << " _skyboxMode:" << EntityItemProperties::getSkyboxModeString(_skyboxMode); _atmospherePropeties.debugDump(); } From 4422c63c791471c5fc705842b5b3e123585d73aa Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Mon, 4 May 2015 20:31:37 -0700 Subject: [PATCH 19/28] another sample for changing atmosphere properties --- .../entities/changingAtmosphereExample.js | 69 +++++++++++++++++++ 1 file changed, 69 insertions(+) create mode 100644 examples/example/entities/changingAtmosphereExample.js diff --git a/examples/example/entities/changingAtmosphereExample.js b/examples/example/entities/changingAtmosphereExample.js new file mode 100644 index 0000000000..82689fa12b --- /dev/null +++ b/examples/example/entities/changingAtmosphereExample.js @@ -0,0 +1,69 @@ +// +// changingAtmosphereExample.js +// examples +// +// Created by Brad Hefta-Gaub on 4/16/15. +// Copyright 2015 High Fidelity, Inc. +// +// This is an example script that demonstrates creating a zone using the atmosphere features that changes scatter properties +// +// Distributed under the Apache License, Version 2.0. +// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html +// + +HIFI_PUBLIC_BUCKET = "http://s3.amazonaws.com/hifi-public/"; + +var count = 0; +var stopAfter = 10000; + +var zoneEntityA = Entities.addEntity({ + type: "Zone", + position: { x: 1000, y: 1000, z: 1000}, + dimensions: { x: 2000, y: 2000, z: 2000 }, + keyLightColor: { red: 255, green: 0, blue: 0 }, + stageSunModelEnabled: false, + shapeType: "sphere", + skyboxMode: "atmosphere", + atmosphere: { + center: { x: 1000, y: 0, z: 1000}, + innerRadius: 1000.0, + outerRadius: 1025.0, + rayleighScattering: 0.0025, // Meaningful values 0 to ~0.01 + mieScattering: 0.0010, // Meaningful values 0 to ~0.01 + + // First two, Meaningful values 0 to 1 each, blue, purple; third meaningful 0.3 to 1 - affects shape + 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 +}); + + +// register the call back so it fires before each data send +Script.update.connect(function(deltaTime) { + // stop it... + if (count >= stopAfter) { + print("calling Script.stop()"); + Script.stop(); + } + count++; + var rayleighScattering = (count / 100000) % 0.01; + var mieScattering = (count / 100000) % 0.01; + var waveX = (count / 2000) % 1; + var waveZ = ((count / 2000) % 0.7) + 0.3; + + Entities.editEntity(zoneEntityA, { + atmosphere: { + rayleighScattering: rayleighScattering, + mieScattering: mieScattering, + scatteringWavelengths: { x: waveX, y: waveX, z: waveZ } + }, + + }); +}); + From 00bea4d274b3249f053252e0f8da904407e44ddd Mon Sep 17 00:00:00 2001 From: Andrew Meadows Date: Tue, 5 May 2015 11:05:28 -0700 Subject: [PATCH 20/28] fix crash for NULL deviceProxy --- interface/src/ui/UserInputMapper.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/interface/src/ui/UserInputMapper.cpp b/interface/src/ui/UserInputMapper.cpp index 892ab6a9b6..259d08b4b7 100755 --- a/interface/src/ui/UserInputMapper.cpp +++ b/interface/src/ui/UserInputMapper.cpp @@ -90,7 +90,7 @@ void UserInputMapper::update(float deltaTime) { bool isActiveModifier = false; for (auto& modifier : modifiersIt->second) { auto deviceProxy = getDeviceProxy(modifier); - if (deviceProxy->getButton(modifier, currentTimestamp)) { + if (deviceProxy && deviceProxy->getButton(modifier, currentTimestamp)) { validModifiers.push_back(modifier); isActiveModifier |= (modifier.getID() == inputMapping._modifier.getID()); } @@ -99,8 +99,8 @@ void UserInputMapper::update(float deltaTime) { } // if enabled: default input or all modifiers on - if (enabled) { - auto deviceProxy = getDeviceProxy(inputID); + auto deviceProxy = getDeviceProxy(inputID); + if (enabled && deviceProxy) { switch (inputMapping._input.getType()) { case ChannelType::BUTTON: { _actionStates[channelInput.first] += inputMapping._scale * float(deviceProxy->getButton(inputID, currentTimestamp));// * deltaTime; // weight the impulse by the deltaTime From 5fc5df7c556463c943470115d971045dd43369cb Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Tue, 5 May 2015 12:38:44 -0700 Subject: [PATCH 21/28] change skyboxMode to backgroundMode --- .../entities/changingAtmosphereExample.js | 2 +- .../example/entities/zoneAtmosphereExample.js | 2 +- .../src/EntityTreeRenderer.cpp | 2 +- .../entities/src/EntityItemProperties.cpp | 60 +++++++++---------- libraries/entities/src/EntityItemProperties.h | 6 +- libraries/entities/src/EntityPropertyFlags.h | 12 ++-- libraries/entities/src/ZoneEntityItem.cpp | 14 ++--- libraries/entities/src/ZoneEntityItem.h | 6 +- 8 files changed, 51 insertions(+), 53 deletions(-) diff --git a/examples/example/entities/changingAtmosphereExample.js b/examples/example/entities/changingAtmosphereExample.js index 82689fa12b..88a25b6a08 100644 --- a/examples/example/entities/changingAtmosphereExample.js +++ b/examples/example/entities/changingAtmosphereExample.js @@ -23,7 +23,7 @@ var zoneEntityA = Entities.addEntity({ keyLightColor: { red: 255, green: 0, blue: 0 }, stageSunModelEnabled: false, shapeType: "sphere", - skyboxMode: "atmosphere", + backgroundMode: "atmosphere", atmosphere: { center: { x: 1000, y: 0, z: 1000}, innerRadius: 1000.0, diff --git a/examples/example/entities/zoneAtmosphereExample.js b/examples/example/entities/zoneAtmosphereExample.js index 2f21ea3db2..b31a453300 100644 --- a/examples/example/entities/zoneAtmosphereExample.js +++ b/examples/example/entities/zoneAtmosphereExample.js @@ -23,7 +23,7 @@ var zoneEntityA = Entities.addEntity({ keyLightColor: { red: 255, green: 0, blue: 0 }, stageSunModelEnabled: false, shapeType: "sphere", - skyboxMode: "atmosphere", + backgroundMode: "atmosphere", atmosphere: { center: { x: 1000, y: 0, z: 1000}, innerRadius: 1000.0, diff --git a/libraries/entities-renderer/src/EntityTreeRenderer.cpp b/libraries/entities-renderer/src/EntityTreeRenderer.cpp index 8c738fe366..97676d6e5d 100644 --- a/libraries/entities-renderer/src/EntityTreeRenderer.cpp +++ b/libraries/entities-renderer/src/EntityTreeRenderer.cpp @@ -428,7 +428,7 @@ void EntityTreeRenderer::render(RenderArgs::RenderMode renderMode, scene->setStageDayTime(_bestZone->getStageHour()); scene->setStageYearTime(_bestZone->getStageDay()); - if (_bestZone->getSkyboxMode() == SKYBOX_MODE_ATMOSPHERE) { + if (_bestZone->getBackgroundMode() == BACKGROUND_MODE_ATMOSPHERE) { EnvironmentData data = _bestZone->getEnvironmentData(); glm::vec3 keyLightDirection = scene->getKeyLightDirection(); glm::vec3 inverseKeyLightDirection = keyLightDirection * -1.0f; diff --git a/libraries/entities/src/EntityItemProperties.cpp b/libraries/entities/src/EntityItemProperties.cpp index 7613f1912c..2e107bc958 100644 --- a/libraries/entities/src/EntityItemProperties.cpp +++ b/libraries/entities/src/EntityItemProperties.cpp @@ -89,7 +89,7 @@ EntityItemProperties::EntityItemProperties() : CONSTRUCT_PROPERTY(stageDay, ZoneEntityItem::DEFAULT_STAGE_DAY), CONSTRUCT_PROPERTY(stageHour, ZoneEntityItem::DEFAULT_STAGE_HOUR), CONSTRUCT_PROPERTY(name, ENTITY_ITEM_DEFAULT_NAME), - CONSTRUCT_PROPERTY(skyboxMode, SKYBOX_MODE_INHERIT), + CONSTRUCT_PROPERTY(backgroundMode, BACKGROUND_MODE_INHERIT), _id(UNKNOWN_ENTITY_ID), _idSet(false), @@ -237,40 +237,40 @@ void EntityItemProperties::setShapeTypeFromString(const QString& shapeName) { } } -const char* skyboxModeNames[] = {"inherit", "atmosphere", "texture" }; +const char* backgroundModeNames[] = {"inherit", "atmosphere", "texture" }; -QHash stringToSkyboxModeLookup; +QHash stringToBackgroundModeLookup; -void addSkyboxMode(SkyboxMode type) { - stringToSkyboxModeLookup[skyboxModeNames[type]] = type; +void addBackgroundMode(BackgroundMode type) { + stringToBackgroundModeLookup[backgroundModeNames[type]] = type; } -void buildStringToSkyboxModeLookup() { - addSkyboxMode(SKYBOX_MODE_INHERIT); - addSkyboxMode(SKYBOX_MODE_ATMOSPHERE); - addSkyboxMode(SKYBOX_MODE_TEXTURE); +void buildStringToBackgroundModeLookup() { + addBackgroundMode(BACKGROUND_MODE_INHERIT); + addBackgroundMode(BACKGROUND_MODE_ATMOSPHERE); + addBackgroundMode(BACKGROUND_MODE_TEXTURE); } -QString EntityItemProperties::getSkyboxModeAsString() const { - if (_skyboxMode < sizeof(skyboxModeNames) / sizeof(char *)) - return QString(skyboxModeNames[_skyboxMode]); - return QString(skyboxModeNames[SKYBOX_MODE_INHERIT]); +QString EntityItemProperties::getBackgroundModeAsString() const { + if (_backgroundMode < sizeof(backgroundModeNames) / sizeof(char *)) + return QString(backgroundModeNames[_backgroundMode]); + return QString(backgroundModeNames[BACKGROUND_MODE_INHERIT]); } -QString EntityItemProperties::getSkyboxModeString(SkyboxMode mode) { - if (mode < sizeof(skyboxModeNames) / sizeof(char *)) - return QString(skyboxModeNames[mode]); - return QString(skyboxModeNames[SKYBOX_MODE_INHERIT]); +QString EntityItemProperties::getBackgroundModeString(BackgroundMode mode) { + if (mode < sizeof(backgroundModeNames) / sizeof(char *)) + return QString(backgroundModeNames[mode]); + return QString(backgroundModeNames[BACKGROUND_MODE_INHERIT]); } -void EntityItemProperties::setSkyboxModeFromString(const QString& skyboxMode) { - if (stringToSkyboxModeLookup.empty()) { - buildStringToSkyboxModeLookup(); +void EntityItemProperties::setBackgroundModeFromString(const QString& backgroundMode) { + if (stringToBackgroundModeLookup.empty()) { + buildStringToBackgroundModeLookup(); } - auto skyboxModeItr = stringToSkyboxModeLookup.find(skyboxMode.toLower()); - if (skyboxModeItr != stringToSkyboxModeLookup.end()) { - _skyboxMode = skyboxModeItr.value(); - _skyboxModeChanged = true; + auto backgroundModeItr = stringToBackgroundModeLookup.find(backgroundMode.toLower()); + if (backgroundModeItr != stringToBackgroundModeLookup.end()) { + _backgroundMode = backgroundModeItr.value(); + _backgroundModeChanged = true; } } @@ -334,7 +334,7 @@ EntityPropertyFlags EntityItemProperties::getChangedProperties() const { CHECK_PROPERTY_CHANGE(PROP_STAGE_DAY, stageDay); CHECK_PROPERTY_CHANGE(PROP_STAGE_HOUR, stageHour); - CHECK_PROPERTY_CHANGE(PROP_SKYBOX_MODE, skyboxMode); + CHECK_PROPERTY_CHANGE(PROP_BACKGROUND_MODE, backgroundMode); changedProperties += _atmosphere.getChangedProperties(); @@ -419,7 +419,7 @@ QScriptValue EntityItemProperties::copyToScriptValue(QScriptEngine* engine, bool COPY_PROPERTY_TO_QSCRIPTVALUE(stageAltitude); COPY_PROPERTY_TO_QSCRIPTVALUE(stageDay); COPY_PROPERTY_TO_QSCRIPTVALUE(stageHour); - COPY_PROPERTY_TO_QSCRIPTVALUE_GETTER(skyboxMode, getSkyboxModeAsString()); + COPY_PROPERTY_TO_QSCRIPTVALUE_GETTER(backgroundMode, getBackgroundModeAsString()); // Sitting properties support if (!skipDefaults) { @@ -524,7 +524,7 @@ void EntityItemProperties::copyFromScriptValue(const QScriptValue& object) { 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(skyboxMode, SkyboxMode); + COPY_PROPERTY_FROM_QSCRITPTVALUE_ENUM(backgroundMode, BackgroundMode); _atmosphere.copyFromScriptValue(object, _defaultSettings); _lastEdited = usecTimestampNow(); } @@ -731,7 +731,7 @@ bool EntityItemProperties::encodeEntityEditPacket(PacketType command, EntityItem APPEND_ENTITY_PROPERTY(PROP_SHAPE_TYPE, appendValue, (uint32_t)properties.getShapeType()); APPEND_ENTITY_PROPERTY(PROP_COMPOUND_SHAPE_URL, appendValue, properties.getCompoundShapeURL()); - APPEND_ENTITY_PROPERTY(PROP_SKYBOX_MODE, appendValue, (uint32_t)properties.getSkyboxMode()); + APPEND_ENTITY_PROPERTY(PROP_BACKGROUND_MODE, appendValue, (uint32_t)properties.getBackgroundMode()); _staticAtmosphere.setProperties(properties); _staticAtmosphere.appentToEditPacket(packetData, requestedProperties, propertyFlags, propertiesDidntFit, propertyCount, appendState ); @@ -984,7 +984,7 @@ bool EntityItemProperties::decodeEntityEditPacket(const unsigned char* data, int READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_STAGE_HOUR, float, setStageHour); READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_SHAPE_TYPE, ShapeType, setShapeType); READ_ENTITY_PROPERTY_STRING_TO_PROPERTIES(PROP_COMPOUND_SHAPE_URL, setCompoundShapeURL); - READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_SKYBOX_MODE, SkyboxMode, setSkyboxMode); + READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_BACKGROUND_MODE, BackgroundMode, setBackgroundMode); properties.getAtmosphere().decodeFromEditPacket(propertyFlags, dataAt , processedBytes); } @@ -1088,7 +1088,7 @@ void EntityItemProperties::markAllChanged() { _stageDayChanged = true; _stageHourChanged = true; - _skyboxModeChanged = true; + _backgroundModeChanged = true; _atmosphere.markAllChanged(); } diff --git a/libraries/entities/src/EntityItemProperties.h b/libraries/entities/src/EntityItemProperties.h index 95072f23a0..ef3bc5cbfb 100644 --- a/libraries/entities/src/EntityItemProperties.h +++ b/libraries/entities/src/EntityItemProperties.h @@ -139,9 +139,9 @@ public: DEFINE_PROPERTY(PROP_STAGE_HOUR, StageHour, stageHour, float); DEFINE_PROPERTY_REF(PROP_NAME, Name, name, QString); DEFINE_PROPERTY_GROUP(Atmosphere, atmosphere, AtmospherePropertyGroup); - DEFINE_PROPERTY_REF_ENUM(PROP_SKYBOX_MODE, SkyboxMode, skyboxMode, SkyboxMode); + DEFINE_PROPERTY_REF_ENUM(PROP_BACKGROUND_MODE, BackgroundMode, backgroundMode, BackgroundMode); - static QString getSkyboxModeString(SkyboxMode mode); + static QString getBackgroundModeString(BackgroundMode mode); public: @@ -276,7 +276,7 @@ inline QDebug operator<<(QDebug debug, const EntityItemProperties& properties) { DEBUG_PROPERTY_IF_CHANGED(debug, properties, LocalGravity, localGravity, ""); DEBUG_PROPERTY_IF_CHANGED(debug, properties, ParticleRadius, particleRadius, ""); DEBUG_PROPERTY_IF_CHANGED(debug, properties, MarketplaceID, marketplaceID, ""); - DEBUG_PROPERTY_IF_CHANGED(debug, properties, SkyboxMode, skyboxMode, ""); + DEBUG_PROPERTY_IF_CHANGED(debug, properties, BackgroundMode, backgroundMode, ""); debug << " last edited:" << properties.getLastEdited() << "\n"; debug << " edited ago:" << properties.getEditedAgo() << "\n"; diff --git a/libraries/entities/src/EntityPropertyFlags.h b/libraries/entities/src/EntityPropertyFlags.h index 0b5d2ce805..3569a3dcc9 100644 --- a/libraries/entities/src/EntityPropertyFlags.h +++ b/libraries/entities/src/EntityPropertyFlags.h @@ -143,9 +143,7 @@ enum EntityPropertyList { PROP_ATMOSPHERE_RAYLEIGH_SCATTERING = PROP_EMIT_STRENGTH, PROP_ATMOSPHERE_SCATTERING_WAVELENGTHS = PROP_LOCAL_GRAVITY, PROP_ATMOSPHERE_HAS_STARS = PROP_PARTICLE_RADIUS, - PROP_SKYBOX_MODE = PROP_MODEL_URL, - // SunBrightness - same as KeyLight Intensity? - // SunLocation (or direction) - same as KeyLight + PROP_BACKGROUND_MODE = PROP_MODEL_URL, // WARNING!!! DO NOT ADD PROPS_xxx here unless you really really meant to.... Add them UP above }; @@ -157,10 +155,10 @@ typedef PropertyFlags EntityPropertyFlags; extern EntityPropertyList PROP_LAST_ITEM; -enum SkyboxMode { - SKYBOX_MODE_INHERIT, - SKYBOX_MODE_ATMOSPHERE, - SKYBOX_MODE_TEXTURE, +enum BackgroundMode { + BACKGROUND_MODE_INHERIT, + BACKGROUND_MODE_ATMOSPHERE, + BACKGROUND_MODE_TEXTURE, }; diff --git a/libraries/entities/src/ZoneEntityItem.cpp b/libraries/entities/src/ZoneEntityItem.cpp index a6e11294b9..c4646bebdf 100644 --- a/libraries/entities/src/ZoneEntityItem.cpp +++ b/libraries/entities/src/ZoneEntityItem.cpp @@ -62,7 +62,7 @@ ZoneEntityItem::ZoneEntityItem(const EntityItemID& entityItemID, const EntityIte _shapeType = DEFAULT_SHAPE_TYPE; _compoundShapeURL = DEFAULT_COMPOUND_SHAPE_URL; - _skyboxMode = SKYBOX_MODE_INHERIT; + _backgroundMode = BACKGROUND_MODE_INHERIT; setProperties(properties); } @@ -103,7 +103,7 @@ EntityItemProperties ZoneEntityItem::getProperties() const { COPY_ENTITY_PROPERTY_TO_PROPERTIES(shapeType, getShapeType); COPY_ENTITY_PROPERTY_TO_PROPERTIES(compoundShapeURL, getCompoundShapeURL); - COPY_ENTITY_PROPERTY_TO_PROPERTIES(skyboxMode, getSkyboxMode); + COPY_ENTITY_PROPERTY_TO_PROPERTIES(backgroundMode, getBackgroundMode); _atmospherePropeties.getProperties(properties); @@ -126,7 +126,7 @@ bool ZoneEntityItem::setProperties(const EntityItemProperties& properties) { SET_ENTITY_PROPERTY_FROM_PROPERTIES(stageHour, setStageHour); SET_ENTITY_PROPERTY_FROM_PROPERTIES(shapeType, updateShapeType); SET_ENTITY_PROPERTY_FROM_PROPERTIES(compoundShapeURL, setCompoundShapeURL); - SET_ENTITY_PROPERTY_FROM_PROPERTIES(skyboxMode, setSkyboxMode); + SET_ENTITY_PROPERTY_FROM_PROPERTIES(backgroundMode, setBackgroundMode); bool somethingChangedInAtmosphere = _atmospherePropeties.setProperties(properties); @@ -164,7 +164,7 @@ int ZoneEntityItem::readEntitySubclassDataFromBuffer(const unsigned char* data, READ_ENTITY_PROPERTY(PROP_STAGE_HOUR, float, _stageHour); READ_ENTITY_PROPERTY_SETTER(PROP_SHAPE_TYPE, ShapeType, updateShapeType); READ_ENTITY_PROPERTY_STRING(PROP_COMPOUND_SHAPE_URL, setCompoundShapeURL); - READ_ENTITY_PROPERTY_SETTER(PROP_SKYBOX_MODE, SkyboxMode, setSkyboxMode); + READ_ENTITY_PROPERTY_SETTER(PROP_BACKGROUND_MODE, BackgroundMode, setBackgroundMode); bytesRead += _atmospherePropeties.readEntitySubclassDataFromBuffer(dataAt, (bytesLeftToRead - bytesRead), args, propertyFlags, overwriteLocalData); @@ -188,7 +188,7 @@ EntityPropertyFlags ZoneEntityItem::getEntityProperties(EncodeBitstreamParams& p requestedProperties += PROP_STAGE_HOUR; requestedProperties += PROP_SHAPE_TYPE; requestedProperties += PROP_COMPOUND_SHAPE_URL; - requestedProperties += PROP_SKYBOX_MODE; + requestedProperties += PROP_BACKGROUND_MODE; requestedProperties += _atmospherePropeties.getEntityProperties(params); return requestedProperties; @@ -216,7 +216,7 @@ void ZoneEntityItem::appendSubclassData(OctreePacketData* packetData, EncodeBits APPEND_ENTITY_PROPERTY(PROP_STAGE_HOUR, appendValue, getStageHour()); APPEND_ENTITY_PROPERTY(PROP_SHAPE_TYPE, appendValue, (uint32_t)getShapeType()); APPEND_ENTITY_PROPERTY(PROP_COMPOUND_SHAPE_URL, appendValue, getCompoundShapeURL()); - APPEND_ENTITY_PROPERTY(PROP_SKYBOX_MODE, appendValue, (uint32_t)getSkyboxMode()); // could this be a uint16?? + APPEND_ENTITY_PROPERTY(PROP_BACKGROUND_MODE, appendValue, (uint32_t)getBackgroundMode()); // could this be a uint16?? _atmospherePropeties.appendSubclassData(packetData, params, modelTreeElementExtraEncodeData, requestedProperties, propertyFlags, propertiesDidntFit, propertyCount, appendState); @@ -239,7 +239,7 @@ void ZoneEntityItem::debugDump() const { qCDebug(entities) << " _stageAltitude:" << _stageAltitude; qCDebug(entities) << " _stageDay:" << _stageDay; qCDebug(entities) << " _stageHour:" << _stageHour; - qCDebug(entities) << " _skyboxMode:" << EntityItemProperties::getSkyboxModeString(_skyboxMode); + qCDebug(entities) << " _backgroundMode:" << EntityItemProperties::getBackgroundModeString(_backgroundMode); _atmospherePropeties.debugDump(); } diff --git a/libraries/entities/src/ZoneEntityItem.h b/libraries/entities/src/ZoneEntityItem.h index a136226346..147cad7e45 100644 --- a/libraries/entities/src/ZoneEntityItem.h +++ b/libraries/entities/src/ZoneEntityItem.h @@ -106,8 +106,8 @@ public: const QString getCompoundShapeURL() const { return _compoundShapeURL; } virtual void setCompoundShapeURL(const QString& url); - void setSkyboxMode(SkyboxMode value) { _skyboxMode = value; } - SkyboxMode getSkyboxMode() const { return _skyboxMode; } + void setBackgroundMode(BackgroundMode value) { _backgroundMode = value; } + BackgroundMode getBackgroundMode() const { return _backgroundMode; } EnvironmentData getEnvironmentData() const; @@ -147,7 +147,7 @@ protected: ShapeType _shapeType = SHAPE_TYPE_NONE; QString _compoundShapeURL; - SkyboxMode _skyboxMode = SKYBOX_MODE_INHERIT; + BackgroundMode _backgroundMode = BACKGROUND_MODE_INHERIT; AtmospherePropertyGroup _atmospherePropeties; static bool _drawZoneBoundaries; From 0d4d5d024e30ad5370a5660929b84705469225b9 Mon Sep 17 00:00:00 2001 From: Andrew Meadows Date: Tue, 5 May 2015 14:59:22 -0700 Subject: [PATCH 22/28] revert last change (fix for invalid DeviceProxy) --- interface/src/ui/UserInputMapper.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/interface/src/ui/UserInputMapper.cpp b/interface/src/ui/UserInputMapper.cpp index 259d08b4b7..892ab6a9b6 100755 --- a/interface/src/ui/UserInputMapper.cpp +++ b/interface/src/ui/UserInputMapper.cpp @@ -90,7 +90,7 @@ void UserInputMapper::update(float deltaTime) { bool isActiveModifier = false; for (auto& modifier : modifiersIt->second) { auto deviceProxy = getDeviceProxy(modifier); - if (deviceProxy && deviceProxy->getButton(modifier, currentTimestamp)) { + if (deviceProxy->getButton(modifier, currentTimestamp)) { validModifiers.push_back(modifier); isActiveModifier |= (modifier.getID() == inputMapping._modifier.getID()); } @@ -99,8 +99,8 @@ void UserInputMapper::update(float deltaTime) { } // if enabled: default input or all modifiers on - auto deviceProxy = getDeviceProxy(inputID); - if (enabled && deviceProxy) { + if (enabled) { + auto deviceProxy = getDeviceProxy(inputID); switch (inputMapping._input.getType()) { case ChannelType::BUTTON: { _actionStates[channelInput.first] += inputMapping._scale * float(deviceProxy->getButton(inputID, currentTimestamp));// * deltaTime; // weight the impulse by the deltaTime From 419cfee7758c3d1126eac3d96abfed169b6c2405 Mon Sep 17 00:00:00 2001 From: Andrew Meadows Date: Tue, 5 May 2015 15:06:51 -0700 Subject: [PATCH 23/28] more correct fix for invalid DeviceProxy crash bug --- interface/src/ui/UserInputMapper.h | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/interface/src/ui/UserInputMapper.h b/interface/src/ui/UserInputMapper.h index 32a1782419..ab63bdbef7 100755 --- a/interface/src/ui/UserInputMapper.h +++ b/interface/src/ui/UserInputMapper.h @@ -57,7 +57,9 @@ public: bool isAxis() const { return getType() == ChannelType::AXIS; } bool isJoint() const { return getType() == ChannelType::JOINT; } - explicit Input() {} + // WORKAROUND: the explicit initializer here avoids a bug in GCC-4.8.2 (but not found in 4.9.2) + // where the default initializer (a C++-11ism) for the union data above is not applied. + explicit Input() : _id(0) {} explicit Input(uint32 id) : _id(id) {} explicit Input(uint16 device, uint16 channel, ChannelType type) : _device(device), _channel(channel), _type(uint16(type)) {} Input(const Input& src) : _id(src._id) {} From 5fb79df4c9356788df42e0e616a8ce9167631f1f Mon Sep 17 00:00:00 2001 From: Philip Rosedale Date: Tue, 5 May 2015 15:18:16 -0700 Subject: [PATCH 24/28] dice don't go away unless 'X' key is clicked, added harmonicOscillator test script --- examples/dice.js | 8 ++--- examples/harmonicOscillator.js | 65 ++++++++++++++++++++++++++++++++++ 2 files changed, 69 insertions(+), 4 deletions(-) create mode 100644 examples/harmonicOscillator.js diff --git a/examples/dice.js b/examples/dice.js index b118a6b289..6bda0c6cbe 100644 --- a/examples/dice.js +++ b/examples/dice.js @@ -13,7 +13,8 @@ // var isDice = false; -var NUMBER_OF_DICE = 2; +var NUMBER_OF_DICE = 4; +var LIFETIME = 10000; // Dice will live for about 3 hours var dice = []; var DIE_SIZE = 0.20; @@ -50,7 +51,7 @@ var diceButton = Overlays.addOverlay("image", { }); var GRAVITY = -3.5; -var LIFETIME = 300; + // NOTE: angularVelocity is in radians/sec var MAX_ANGULAR_SPEED = Math.PI; @@ -105,6 +106,7 @@ function mousePressEvent(event) { var clickedText = false; var clickedOverlay = Overlays.getOverlayAtPoint({x: event.x, y: event.y}); if (clickedOverlay == offButton) { + deleteDice(); Script.stop(); } else if (clickedOverlay == diceButton) { var HOW_HARD = 2.0; @@ -116,10 +118,8 @@ function mousePressEvent(event) { } function scriptEnding() { - deleteDice(); Overlays.deleteOverlay(offButton); Overlays.deleteOverlay(diceButton); - } Entities.entityCollisionWithEntity.connect(entityCollisionWithEntity); diff --git a/examples/harmonicOscillator.js b/examples/harmonicOscillator.js new file mode 100644 index 0000000000..0ffbce8beb --- /dev/null +++ b/examples/harmonicOscillator.js @@ -0,0 +1,65 @@ +// harmonicOscillator.js +// +// Created by Philip Rosedale on May 5, 2015 +// Copyright 2015 High Fidelity, Inc. +// +// An object moves around the edge of a disc while +// changing color. The script is continuously updating +// position, velocity, rotation, and color. The movement +// should appear perfectly smooth to someone else, +// provided their network connection is good. +// +// Distributed under the Apache License, Version 2.0. +// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html +// + +var ball, disc; +var time = 0.0; +var range = 1.0; +var speed = 0.5; + + +var basePosition = Vec3.sum(Camera.getPosition(), Quat.getFront(Camera.getOrientation())); + +ball = Entities.addEntity( + { type: "Box", + position: basePosition, + dimensions: { x: 0.1, y: 0.1, z: 0.1 }, + color: { red: 255, green: 0, blue: 255 } + }); + +disc = Entities.addEntity( + { type: "Sphere", + position: basePosition, + dimensions: { x: range, y: range / 20.0, z: range }, + color: { red: 128, green: 128, blue: 128 } + }); + +function update(deltaTime) { + time += deltaTime * speed; + if (!ball.isKnownID) { + ball = Entities.identifyEntity(ball); + } + rotation = Quat.angleAxis(time/Math.PI * 180.0, { x: 0, y: 1, z: 0 }); + Entities.editEntity(ball, + { + color: { red: 255 * (Math.sin(time)/2.0 + 0.5), + green: 255 - 255 * (Math.sin(time)/2.0 + 0.5), + blue: 0 }, + position: { x: basePosition.x + Math.sin(time) / 2.0 * range, + y: basePosition.y, + z: basePosition.z + Math.cos(time) / 2.0 * range }, + velocity: { x: Math.cos(time)/2.0 * range, + y: 0.0, + z: -Math.sin(time)/2.0 * range }, + rotation: rotation + }); +} + +function scriptEnding() { + Entities.deleteEntity(ball); + Entities.deleteEntity(disc); +} + +Script.scriptEnding.connect(scriptEnding); +Script.update.connect(update); From 1c21874f000ca4d6af1933b181c0588702050c6b Mon Sep 17 00:00:00 2001 From: David Rowe Date: Tue, 5 May 2015 16:51:31 -0700 Subject: [PATCH 25/28] Make face tracker mute action start / stop face tracker --- interface/src/Application.cpp | 25 ++++++++++++++++++++---- interface/src/Application.h | 1 + interface/src/devices/CameraToolBox.cpp | 2 +- interface/src/devices/DdeFaceTracker.cpp | 17 +++++++++------- interface/src/devices/DdeFaceTracker.h | 4 +--- interface/src/devices/FaceTracker.cpp | 8 +------- interface/src/devices/FaceTracker.h | 15 ++++++++------ interface/src/devices/Faceshift.cpp | 12 ++++++------ interface/src/devices/Faceshift.h | 2 +- 9 files changed, 51 insertions(+), 35 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 1f1d8713e7..4d1fa79abc 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -934,7 +934,9 @@ void Application::audioMuteToggled() { void Application::faceTrackerMuteToggled() { QAction* muteAction = Menu::getInstance()->getActionForOption(MenuOption::MuteFaceTracking); Q_CHECK_PTR(muteAction); - muteAction->setChecked(getActiveFaceTracker()->isMuted()); + bool isMuted = getSelectedFaceTracker()->isMuted(); + muteAction->setChecked(isMuted); + getSelectedFaceTracker()->setEnabled(!isMuted); } void Application::aboutApp() { @@ -1887,25 +1889,40 @@ FaceTracker* Application::getActiveFaceTracker() { (faceshift->isActive() ? static_cast(faceshift.data()) : NULL)); } +FaceTracker* Application::getSelectedFaceTracker() { + FaceTracker* faceTracker = NULL; +#ifdef HAVE_FACESHIFT + if (Menu::getInstance()->isOptionChecked(MenuOption::Faceshift)) { + faceTracker = DependencyManager::get().data(); + } +#endif +#ifdef HAVE_DDE + if (Menu::getInstance()->isOptionChecked(MenuOption::UseCamera)) { + faceTracker = DependencyManager::get().data(); + } +#endif + return faceTracker; +} + void Application::setActiveFaceTracker() { bool isMuted = Menu::getInstance()->isOptionChecked(MenuOption::MuteFaceTracking); #ifdef HAVE_FACESHIFT auto faceshiftTracker = DependencyManager::get(); - faceshiftTracker->setTCPEnabled(Menu::getInstance()->isOptionChecked(MenuOption::Faceshift)); faceshiftTracker->setIsMuted(isMuted); + faceshiftTracker->setEnabled(Menu::getInstance()->isOptionChecked(MenuOption::Faceshift) && !isMuted); #endif #ifdef HAVE_DDE bool isUsingDDE = Menu::getInstance()->isOptionChecked(MenuOption::UseCamera); Menu::getInstance()->getActionForOption(MenuOption::UseAudioForMouth)->setVisible(isUsingDDE); Menu::getInstance()->getActionForOption(MenuOption::VelocityFilter)->setVisible(isUsingDDE); auto ddeTracker = DependencyManager::get(); - ddeTracker->setEnabled(isUsingDDE); ddeTracker->setIsMuted(isMuted); + ddeTracker->setEnabled(isUsingDDE && !isMuted); #endif } void Application::toggleFaceTrackerMute() { - FaceTracker* faceTracker = getActiveFaceTracker(); + FaceTracker* faceTracker = getSelectedFaceTracker(); if (faceTracker) { faceTracker->toggleMute(); } diff --git a/interface/src/Application.h b/interface/src/Application.h index ec32d1a590..58e49159a2 100644 --- a/interface/src/Application.h +++ b/interface/src/Application.h @@ -219,6 +219,7 @@ public: bool getLastMouseMoveWasSimulated() const { return _lastMouseMoveWasSimulated; } FaceTracker* getActiveFaceTracker(); + FaceTracker* getSelectedFaceTracker(); QSystemTrayIcon* getTrayIcon() { return _trayIcon; } ApplicationOverlay& getApplicationOverlay() { return _applicationOverlay; } diff --git a/interface/src/devices/CameraToolBox.cpp b/interface/src/devices/CameraToolBox.cpp index 69afefff86..26aff4bf9a 100644 --- a/interface/src/devices/CameraToolBox.cpp +++ b/interface/src/devices/CameraToolBox.cpp @@ -65,7 +65,7 @@ void CameraToolBox::toggleMute() { delete _doubleClickTimer; _doubleClickTimer = NULL; - FaceTracker* faceTracker = Application::getInstance()->getActiveFaceTracker(); + FaceTracker* faceTracker = Application::getInstance()->getSelectedFaceTracker(); if (faceTracker) { faceTracker->toggleMute(); } diff --git a/interface/src/devices/DdeFaceTracker.cpp b/interface/src/devices/DdeFaceTracker.cpp index 5d1d184880..59d2b42a51 100644 --- a/interface/src/devices/DdeFaceTracker.cpp +++ b/interface/src/devices/DdeFaceTracker.cpp @@ -178,9 +178,7 @@ DdeFaceTracker::DdeFaceTracker(const QHostAddress& host, quint16 serverPort, qui _filteredBrowUp(0.0f), _lastEyeBlinks(), _filteredEyeBlinks(), - _lastEyeCoefficients(), - _isCalculatingFPS(false), - _frameCount(0) + _lastEyeCoefficients() { _coefficients.resize(NUM_FACESHIFT_BLENDSHAPES); @@ -203,7 +201,16 @@ DdeFaceTracker::~DdeFaceTracker() { #pragma warning(default:4351) #endif +void DdeFaceTracker::init() { + FaceTracker::init(); + setEnabled(Menu::getInstance()->isOptionChecked(MenuOption::UseCamera) && !_isMuted); +} + void DdeFaceTracker::setEnabled(bool enabled) { + if (!_isInitialized) { + // Don't enable until have explicitly initialized + return; + } #ifdef HAVE_DDE // isOpen() does not work as one might expect on QUdpSocket; don't test isOpen() before closing socket. _udpSocket.close(); @@ -316,10 +323,6 @@ float DdeFaceTracker::getBlendshapeCoefficient(int index) const { void DdeFaceTracker::decodePacket(const QByteArray& buffer) { _lastReceiveTimestamp = usecTimestampNow(); - if (_isMuted) { - return; - } - if (buffer.size() > MIN_PACKET_SIZE) { bool isFiltering = Menu::getInstance()->isOptionChecked(MenuOption::VelocityFilter); diff --git a/interface/src/devices/DdeFaceTracker.h b/interface/src/devices/DdeFaceTracker.h index 9fb0e943f2..9edbd4df58 100644 --- a/interface/src/devices/DdeFaceTracker.h +++ b/interface/src/devices/DdeFaceTracker.h @@ -28,6 +28,7 @@ class DdeFaceTracker : public FaceTracker, public Dependency { SINGLETON_DEPENDENCY public: + virtual void init(); virtual void reset(); virtual bool isActive() const; @@ -120,9 +121,6 @@ private: float _lastEyeBlinks[2]; float _filteredEyeBlinks[2]; float _lastEyeCoefficients[2]; - - bool _isCalculatingFPS; - int _frameCount; }; #endif // hifi_DdeFaceTracker_h diff --git a/interface/src/devices/FaceTracker.cpp b/interface/src/devices/FaceTracker.cpp index a6351c2d64..25a76ff2b1 100644 --- a/interface/src/devices/FaceTracker.cpp +++ b/interface/src/devices/FaceTracker.cpp @@ -20,15 +20,9 @@ const int FPS_TIMER_DELAY = 2000; // ms const int FPS_TIMER_DURATION = 2000; // ms -FaceTracker::FaceTracker() : - _isCalculatingFPS(false), - _frameCount(0), - _isMuted(false) -{ -} - void FaceTracker::init() { _isMuted = Menu::getInstance()->isOptionChecked(MenuOption::MuteFaceTracking); + _isInitialized = true; // FaceTracker can be used now } inline float FaceTracker::getBlendshapeCoefficient(int index) const { diff --git a/interface/src/devices/FaceTracker.h b/interface/src/devices/FaceTracker.h index 2ffd9f01bf..2a0c4438a4 100644 --- a/interface/src/devices/FaceTracker.h +++ b/interface/src/devices/FaceTracker.h @@ -49,11 +49,16 @@ public: signals: void muteToggled(); - + +public slots: + virtual void setEnabled(bool enabled) = 0; + protected: - FaceTracker(); virtual ~FaceTracker() {}; + bool _isInitialized = false; + bool _isMuted = true; + glm::vec3 _headTranslation = glm::vec3(0.0f); glm::quat _headRotation = glm::quat(); float _estimatedEyePitch = 0.0f; @@ -63,8 +68,6 @@ protected: float _relaxationStatus = 0.0f; // Between 0.0f and 1.0f float _fadeCoefficient = 0.0f; // Between 0.0f and 1.0f - bool _isMuted; - void countFrame(); private slots: @@ -72,8 +75,8 @@ private slots: void finishFPSTimer(); private: - bool _isCalculatingFPS; - int _frameCount; + bool _isCalculatingFPS = false; + int _frameCount = 0; }; #endif // hifi_FaceTracker_h diff --git a/interface/src/devices/Faceshift.cpp b/interface/src/devices/Faceshift.cpp index a9b78aa792..409f359afa 100644 --- a/interface/src/devices/Faceshift.cpp +++ b/interface/src/devices/Faceshift.cpp @@ -49,8 +49,8 @@ Faceshift::Faceshift() : #ifdef HAVE_FACESHIFT void Faceshift::init() { - setTCPEnabled(Menu::getInstance()->isOptionChecked(MenuOption::Faceshift)); FaceTracker::init(); + setEnabled(Menu::getInstance()->isOptionChecked(MenuOption::Faceshift) && !_isMuted); } void Faceshift::update(float deltaTime) { @@ -128,7 +128,11 @@ void Faceshift::updateFakeCoefficients(float leftBlink, float rightBlink, float coefficients[FUNNEL_BLENDSHAPE] = mouth3; } -void Faceshift::setTCPEnabled(bool enabled) { +void Faceshift::setEnabled(bool enabled) { + // Don't enable until have explicitly initialized + if (!_isInitialized) { + return; + } #ifdef HAVE_FACESHIFT if ((_tcpEnabled = enabled)) { connectSocket(); @@ -199,10 +203,6 @@ void Faceshift::receive(const QByteArray& buffer) { #ifdef HAVE_FACESHIFT _lastReceiveTimestamp = usecTimestampNow(); - if (_isMuted) { - return; - } - _stream.received(buffer.size(), buffer.constData()); fsMsgPtr msg; for (fsMsgPtr msg; (msg = _stream.get_message()); ) { diff --git a/interface/src/devices/Faceshift.h b/interface/src/devices/Faceshift.h index d2d9821382..9be1766170 100644 --- a/interface/src/devices/Faceshift.h +++ b/interface/src/devices/Faceshift.h @@ -87,7 +87,7 @@ signals: void connectionStateChanged(); public slots: - void setTCPEnabled(bool enabled); + void setEnabled(bool enabled); private slots: void connectSocket(); From 7396bb138d960fc4a809f9643c5894996d8d41d0 Mon Sep 17 00:00:00 2001 From: Chris Collins Date: Tue, 5 May 2015 16:52:38 -0700 Subject: [PATCH 26/28] Removed headmove removed head move, it is not being used by Oculus users at the moment --- examples/defaultScripts.js | 1 - 1 file changed, 1 deletion(-) diff --git a/examples/defaultScripts.js b/examples/defaultScripts.js index a5c086fc44..89d4094856 100644 --- a/examples/defaultScripts.js +++ b/examples/defaultScripts.js @@ -12,7 +12,6 @@ Script.load("progress.js"); Script.load("edit.js"); Script.load("selectAudioDevice.js"); Script.load("controllers/hydra/hydraMove.js"); -Script.load("headMove.js"); Script.load("inspect.js"); Script.load("lobby.js"); Script.load("notifications.js"); From b519884609bbc41065527ecedb59b15da611c57b Mon Sep 17 00:00:00 2001 From: David Rowe Date: Tue, 5 May 2015 20:54:12 -0700 Subject: [PATCH 27/28] Fix lobby not displaying in HMD mode This usage of Glower is similar to that in renderAvatarBillboard(). Both may indicate that something needs changing in the graphics pipeline. --- interface/src/Application.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index e20ee73877..b2879aa29e 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -3241,6 +3241,7 @@ void Application::displaySide(Camera& theCamera, bool selfAvatarOnly, RenderArgs { PerformanceTimer perfTimer("3dOverlaysFront"); glClear(GL_DEPTH_BUFFER_BIT); + Glower glower; // Sets alpha to 1.0 _overlays.renderWorld(true); } activeRenderingThread = nullptr; From 333da936429f9de01f988f6c41ed7029a9cb9af7 Mon Sep 17 00:00:00 2001 From: David Rowe Date: Tue, 5 May 2015 23:20:23 -0700 Subject: [PATCH 28/28] Updated face tracker mute icons --- interface/resources/images/face-mute.svg | 46 ++++++++++++++++-------- interface/resources/images/face.svg | 44 ++++++++++++++++------- 2 files changed, 63 insertions(+), 27 deletions(-) diff --git a/interface/resources/images/face-mute.svg b/interface/resources/images/face-mute.svg index 0a93c366e0..b16b7383c5 100644 --- a/interface/resources/images/face-mute.svg +++ b/interface/resources/images/face-mute.svg @@ -1,14 +1,32 @@ - - - - - - - - - - - - - - + + + + Slice 1 + Created with Sketch. + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/interface/resources/images/face.svg b/interface/resources/images/face.svg index 09d05af6fc..62ce0deb25 100644 --- a/interface/resources/images/face.svg +++ b/interface/resources/images/face.svg @@ -1,13 +1,31 @@ - - - - - - - - - - - - - + + + + Slice 1 + Created with Sketch. + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file