From 4561c5920370ae410539158c60d38ae77ebe7acd Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Mon, 4 May 2015 13:49:43 -0700 Subject: [PATCH] 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