History

Merge pull request #4780 from samcake/blue

Add support for Skybox and rendering path of background according to Zones

Brad Hefta-Gaub committed 11 years ago

Commit 55519972 parents 719747e 8fd77f936 files · +1048 −604Browse files

Showing the changes to interface/src/Application.cpp (1 of 36 files). Show all

Unified · Split

interface/src/Application.cpp+52−36
@@ -3161,39 +3161,62 @@ void Application::displaySide(Camera& theCamera, bool selfAvatarOnly, RenderArgs · 3160 unmodified lines
3161 glTexGenfv(GL_R, GL_EYE_PLANE, (const GLfloat*)&_shadowMatrices[i][2]);3161 glTexGenfv(GL_R, GL_EYE_PLANE, (const GLfloat*)&_shadowMatrices[i][2]);
3162 }3162 }
3163 3163
3164 if (!selfAvatarOnly && Menu::getInstance()->isOptionChecked(MenuOption::Stars)) {3164 // Background rendering decision
3165 PerformanceTimer perfTimer("stars");3165 auto skyStage = DependencyManager::get<SceneScriptingInterface>()->getSkyStage();
3166 PerformanceWarning warn(Menu::getInstance()->isOptionChecked(MenuOption::PipelineWarnings),3166 if (skyStage->getBackgroundMode() == model::SunSkyStage::NO_BACKGROUND) {
3167 "Application::displaySide() ... stars...");3167 } else if (skyStage->getBackgroundMode() == model::SunSkyStage::SKY_DOME) {
3168 if (!_stars.isStarsLoaded()) {3168 if (!selfAvatarOnly && Menu::getInstance()->isOptionChecked(MenuOption::Stars)) {
3169 _stars.generate(STARFIELD_NUM_STARS, STARFIELD_SEED);3169 PerformanceTimer perfTimer("stars");
3170 }3170 PerformanceWarning warn(Menu::getInstance()->isOptionChecked(MenuOption::PipelineWarnings),
3171 // should be the first rendering pass - w/o depth buffer / lighting3171 "Application::displaySide() ... stars...");
3172 3172 if (!_stars.isStarsLoaded()) {
3173 // compute starfield alpha based on distance from atmosphere3173 _stars.generate(STARFIELD_NUM_STARS, STARFIELD_SEED);
3174 float alpha = 1.0f;3174 }
3175 bool hasStars = true;3175 // should be the first rendering pass - w/o depth buffer / lighting
3176 if (Menu::getInstance()->isOptionChecked(MenuOption::Atmosphere)) {3176
3177 // TODO: handle this correctly for zones3177 // compute starfield alpha based on distance from atmosphere
3178 const EnvironmentData& closestData = _environment.getClosestData(theCamera.getPosition());3178 float alpha = 1.0f;
3179 bool hasStars = true;
3180 if (Menu::getInstance()->isOptionChecked(MenuOption::Atmosphere)) {
3181 // TODO: handle this correctly for zones
3182 const EnvironmentData& closestData = _environment.getClosestData(theCamera.getPosition());
3179 3183
3180 if (closestData.getHasStars()) {3184 if (closestData.getHasStars()) {
3181 float height = glm::distance(theCamera.getPosition(), closestData.getAtmosphereCenter());3185 float height = glm::distance(theCamera.getPosition(), closestData.getAtmosphereCenter());
3182 if (height < closestData.getAtmosphereInnerRadius()) {3186 if (height < closestData.getAtmosphereInnerRadius()) {
3183 alpha = 0.0f;3187 alpha = 0.0f;
3184 3188
3185 } else if (height < closestData.getAtmosphereOuterRadius()) {3189 } else if (height < closestData.getAtmosphereOuterRadius()) {
3186 alpha = (height - closestData.getAtmosphereInnerRadius()) /3190 alpha = (height - closestData.getAtmosphereInnerRadius()) /
3187 (closestData.getAtmosphereOuterRadius() - closestData.getAtmosphereInnerRadius());3191 (closestData.getAtmosphereOuterRadius() - closestData.getAtmosphereInnerRadius());
3192 }
3193 } else {
3194 hasStars = false;
3188 }3195 }
3189 } else {
3190 hasStars = false;
3191 }3196 }
3192 }
3193 3197
3194 // finally render the starfield3198 // finally render the starfield
3195 if (hasStars) {3199 if (hasStars) {
3196 _stars.render(theCamera.getFieldOfView(), theCamera.getAspectRatio(), theCamera.getNearClip(), alpha);3200 _stars.render(theCamera.getFieldOfView(), theCamera.getAspectRatio(), theCamera.getNearClip(), alpha);
3201 }
3202
3203 // draw the sky dome
3204 if (!selfAvatarOnly && Menu::getInstance()->isOptionChecked(MenuOption::Atmosphere)) {
3205 PerformanceTimer perfTimer("atmosphere");
3206 PerformanceWarning warn(Menu::getInstance()->isOptionChecked(MenuOption::PipelineWarnings),
3207 "Application::displaySide() ... atmosphere...");
3208 _environment.renderAtmospheres(theCamera);
3209 }
3210
3211 }
3212 } else if (skyStage->getBackgroundMode() == model::SunSkyStage::SKY_BOX) {
3213 auto skybox = skyStage->getSkybox();
3214 if (skybox) {
3215 gpu::Batch batch;
3216 model::Skybox::render(batch, _viewFrustum, *skybox);
3217
3218 gpu::GLBackend::renderBatch(batch);
3219 glUseProgram(0);
3197 }3220 }
3198 }3221 }
3199 3222
@@ -3201,13 +3224,6 @@ void Application::displaySide(Camera& theCamera, bool selfAvatarOnly, RenderArgs · 1 unmodified line
3201 glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);3224 glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
3202 }3225 }
3203 3226
3204 // draw the sky dome
3205 if (!selfAvatarOnly && Menu::getInstance()->isOptionChecked(MenuOption::Atmosphere)) {
3206 PerformanceTimer perfTimer("atmosphere");
3207 PerformanceWarning warn(Menu::getInstance()->isOptionChecked(MenuOption::PipelineWarnings),
3208 "Application::displaySide() ... atmosphere...");
3209 _environment.renderAtmospheres(theCamera);
3210 }
3211 glEnable(GL_LIGHTING);3227 glEnable(GL_LIGHTING);
3212 glEnable(GL_DEPTH_TEST);3228 glEnable(GL_DEPTH_TEST);
3213 3229