From 496da6fcd5b87cef690d5147eb5ea17aa55f0571 Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Wed, 6 May 2015 20:36:06 -0700 Subject: [PATCH] wire up the skybox color property to the new skybox renderer --- examples/example/entities/zoneSkyboxExample.js | 4 ++-- .../entities-renderer/src/EntityTreeRenderer.cpp | 16 ++++++++++++++++ libraries/entities/src/EntityItemProperties.cpp | 4 ++-- .../entities/src/EntityItemPropertiesMacros.h | 8 +++----- libraries/entities/src/EntityPropertyFlags.h | 2 +- libraries/entities/src/SkyboxPropertyGroup.h | 8 ++++++++ libraries/entities/src/ZoneEntityItem.cpp | 12 +++++++++--- libraries/entities/src/ZoneEntityItem.h | 2 ++ libraries/model/src/model/Skybox.cpp | 5 ++++- libraries/model/src/model/Skybox.h | 1 + libraries/shared/src/SharedUtil.h | 10 +++++++++- 11 files changed, 57 insertions(+), 15 deletions(-) diff --git a/examples/example/entities/zoneSkyboxExample.js b/examples/example/entities/zoneSkyboxExample.js index 40b99d6c75..a1f5f1917a 100644 --- a/examples/example/entities/zoneSkyboxExample.js +++ b/examples/example/entities/zoneSkyboxExample.js @@ -34,8 +34,8 @@ var zoneEntityA = Entities.addEntity({ hasStars: false }, skybox: { - color: { red: 255, green: 0, blue: 0 }, - url: "http://google.com" + color: { red: 255, green: 0, blue: 255 }, + url: "" }, stageLatitude: 37.777, stageLongitude: 122.407, diff --git a/libraries/entities-renderer/src/EntityTreeRenderer.cpp b/libraries/entities-renderer/src/EntityTreeRenderer.cpp index 97676d6e5d..0f913ff505 100644 --- a/libraries/entities-renderer/src/EntityTreeRenderer.cpp +++ b/libraries/entities-renderer/src/EntityTreeRenderer.cpp @@ -445,7 +445,22 @@ void EntityTreeRenderer::render(RenderArgs::RenderMode renderMode, data.setSunBrightness(sunBrightness); _viewState->overrideEnvironmentData(data); + scene->getSkyStage()->setBackgroundMode(model::SunSkyStage::SKY_DOME); + + } else { + _viewState->endOverrideEnvironmentData(); + if (_bestZone->getBackgroundMode() == BACKGROUND_MODE_SKYBOX) { + auto stage = scene->getSkyStage(); + stage->getSkybox()->setColor(_bestZone->getSkyboxProperties().getColorVec3()); + if (_bestZone->getSkyboxProperties().getURL().isEmpty()) { + stage->getSkybox()->clearCubemap(); + } else { + stage->getSkybox()->clearCubemap(); // NOTE: this should be changed to do something to set the cubemap + } + stage->setBackgroundMode(model::SunSkyStage::SKY_BOX); + } } + } else { if (_hasPreviousZone) { scene->setKeyLightColor(_previousKeyLightColor); @@ -460,6 +475,7 @@ void EntityTreeRenderer::render(RenderArgs::RenderMode renderMode, _hasPreviousZone = false; } _viewState->endOverrideEnvironmentData(); + scene->getSkyStage()->setBackgroundMode(model::SunSkyStage::SKY_DOME); } // we must call endScene while we still have the tree locked so that no one deletes a model diff --git a/libraries/entities/src/EntityItemProperties.cpp b/libraries/entities/src/EntityItemProperties.cpp index 2cc8ec6c8f..ab41367fa9 100644 --- a/libraries/entities/src/EntityItemProperties.cpp +++ b/libraries/entities/src/EntityItemProperties.cpp @@ -238,7 +238,7 @@ void EntityItemProperties::setShapeTypeFromString(const QString& shapeName) { } } -const char* backgroundModeNames[] = {"inherit", "atmosphere", "texture" }; +const char* backgroundModeNames[] = {"inherit", "atmosphere", "skybox" }; QHash stringToBackgroundModeLookup; @@ -249,7 +249,7 @@ void addBackgroundMode(BackgroundMode type) { void buildStringToBackgroundModeLookup() { addBackgroundMode(BACKGROUND_MODE_INHERIT); addBackgroundMode(BACKGROUND_MODE_ATMOSPHERE); - addBackgroundMode(BACKGROUND_MODE_TEXTURE); + addBackgroundMode(BACKGROUND_MODE_SKYBOX); } QString EntityItemProperties::getBackgroundModeAsString() const { diff --git a/libraries/entities/src/EntityItemPropertiesMacros.h b/libraries/entities/src/EntityItemPropertiesMacros.h index 39a159d6ea..3f25f9353e 100644 --- a/libraries/entities/src/EntityItemPropertiesMacros.h +++ b/libraries/entities/src/EntityItemPropertiesMacros.h @@ -118,12 +118,10 @@ #define READ_ENTITY_PROPERTY_XCOLOR(P,M) \ if (propertyFlags.getHasProperty(P)) { \ - rgbColor temp; \ if (overwriteLocalData) { \ - memcpy(temp, dataAt, sizeof(temp)); \ - M.red = temp[RED_INDEX]; \ - M.green = temp[GREEN_INDEX]; \ - M.blue = temp[BLUE_INDEX]; \ + M.red = dataAt[RED_INDEX]; \ + M.green = dataAt[GREEN_INDEX]; \ + M.blue = dataAt[BLUE_INDEX]; \ } \ dataAt += sizeof(rgbColor); \ bytesRead += sizeof(rgbColor); \ diff --git a/libraries/entities/src/EntityPropertyFlags.h b/libraries/entities/src/EntityPropertyFlags.h index e6ba8a13f3..f40fa67195 100644 --- a/libraries/entities/src/EntityPropertyFlags.h +++ b/libraries/entities/src/EntityPropertyFlags.h @@ -160,7 +160,7 @@ extern EntityPropertyList PROP_LAST_ITEM; enum BackgroundMode { BACKGROUND_MODE_INHERIT, BACKGROUND_MODE_ATMOSPHERE, - BACKGROUND_MODE_TEXTURE, + BACKGROUND_MODE_SKYBOX, }; diff --git a/libraries/entities/src/SkyboxPropertyGroup.h b/libraries/entities/src/SkyboxPropertyGroup.h index bc2896402b..a92ec5abbb 100644 --- a/libraries/entities/src/SkyboxPropertyGroup.h +++ b/libraries/entities/src/SkyboxPropertyGroup.h @@ -68,6 +68,14 @@ public: virtual int readEntitySubclassDataFromBuffer(const unsigned char* data, int bytesLeftToRead, ReadBitstreamToTreeParams& args, EntityPropertyFlags& propertyFlags, bool overwriteLocalData); + + glm::vec3 getColorVec3() const { + const quint8 MAX_COLOR = 255; + glm::vec3 color = { (float)_color.red / (float)MAX_COLOR, + (float)_color.green / (float)MAX_COLOR, + (float)_color.blue / (float)MAX_COLOR }; + return color; + } DEFINE_PROPERTY_REF(PROP_SKYBOX_COLOR, Color, color, xColor); diff --git a/libraries/entities/src/ZoneEntityItem.cpp b/libraries/entities/src/ZoneEntityItem.cpp index 310dd35417..8dad5e2939 100644 --- a/libraries/entities/src/ZoneEntityItem.cpp +++ b/libraries/entities/src/ZoneEntityItem.cpp @@ -167,11 +167,17 @@ 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_BACKGROUND_MODE, BackgroundMode, setBackgroundMode); - bytesRead += _atmosphereProperties.readEntitySubclassDataFromBuffer(dataAt, (bytesLeftToRead - bytesRead), args, - propertyFlags, overwriteLocalData); - bytesRead += _skyboxProperties.readEntitySubclassDataFromBuffer(dataAt, (bytesLeftToRead - bytesRead), args, + int bytesFromAtmosphere = _atmosphereProperties.readEntitySubclassDataFromBuffer(dataAt, (bytesLeftToRead - bytesRead), args, + propertyFlags, overwriteLocalData); + + bytesRead += bytesFromAtmosphere; + dataAt += bytesFromAtmosphere; + + int bytesFromSkybox = _skyboxProperties.readEntitySubclassDataFromBuffer(dataAt, (bytesLeftToRead - bytesRead), args, propertyFlags, overwriteLocalData); + bytesRead += bytesFromSkybox; + dataAt += bytesFromSkybox; return bytesRead; } diff --git a/libraries/entities/src/ZoneEntityItem.h b/libraries/entities/src/ZoneEntityItem.h index 37b3816ec9..a19659293f 100644 --- a/libraries/entities/src/ZoneEntityItem.h +++ b/libraries/entities/src/ZoneEntityItem.h @@ -110,6 +110,8 @@ public: BackgroundMode getBackgroundMode() const { return _backgroundMode; } EnvironmentData getEnvironmentData() const; + const AtmospherePropertyGroup& getAtmosphereProperties() const { return _atmosphereProperties; } + const SkyboxPropertyGroup& getSkyboxProperties() const { return _skyboxProperties; } virtual bool supportsDetailedRayIntersection() const { return true; } virtual bool findDetailedRayIntersection(const glm::vec3& origin, const glm::vec3& direction, diff --git a/libraries/model/src/model/Skybox.cpp b/libraries/model/src/model/Skybox.cpp index 8495baf600..d10b97a455 100755 --- a/libraries/model/src/model/Skybox.cpp +++ b/libraries/model/src/model/Skybox.cpp @@ -41,10 +41,13 @@ void Skybox::setCubemap(const gpu::TexturePointer& cubemap) { _cubemap = cubemap; } +void Skybox::clearCubemap() { + _cubemap.reset(); +} + void Skybox::render(gpu::Batch& batch, const ViewFrustum& viewFrustum, const Skybox& skybox) { if (skybox.getCubemap()) { - static gpu::PipelinePointer thePipeline; static gpu::BufferPointer theBuffer; static gpu::Stream::FormatPointer theFormat; diff --git a/libraries/model/src/model/Skybox.h b/libraries/model/src/model/Skybox.h index 8eb910a96e..de0ede8d90 100755 --- a/libraries/model/src/model/Skybox.h +++ b/libraries/model/src/model/Skybox.h @@ -32,6 +32,7 @@ public: void setCubemap(const gpu::TexturePointer& cubemap); const gpu::TexturePointer& getCubemap() const { return _cubemap; } + void clearCubemap(); static void render(gpu::Batch& batch, const ViewFrustum& frustum, const Skybox& skybox); diff --git a/libraries/shared/src/SharedUtil.h b/libraries/shared/src/SharedUtil.h index 68d448114c..17a32e7910 100644 --- a/libraries/shared/src/SharedUtil.h +++ b/libraries/shared/src/SharedUtil.h @@ -23,11 +23,19 @@ const int BYTES_PER_COLOR = 3; const int BYTES_PER_FLAGS = 1; -typedef unsigned char rgbColor[BYTES_PER_COLOR]; typedef unsigned char colorPart; typedef unsigned char nodeColor[BYTES_PER_COLOR + BYTES_PER_FLAGS]; typedef unsigned char rgbColor[BYTES_PER_COLOR]; +inline QDebug& operator<<(QDebug& dbg, const rgbColor& c) { + dbg.nospace() << "{type='rgbColor'" + ", red=" << c[0] << + ", green=" << c[1] << + ", blue=" << c[2] << + "}"; + return dbg; +} + struct xColor { unsigned char red; unsigned char green;