diff options
Diffstat (limited to 'indra/newview/llviewerdisplay.cpp')
-rw-r--r-- | indra/newview/llviewerdisplay.cpp | 204 |
1 files changed, 175 insertions, 29 deletions
diff --git a/indra/newview/llviewerdisplay.cpp b/indra/newview/llviewerdisplay.cpp index 9c3643128b..837eaa90e9 100644 --- a/indra/newview/llviewerdisplay.cpp +++ b/indra/newview/llviewerdisplay.cpp @@ -44,6 +44,9 @@ #include "llfloatertools.h" #include "llviewerimagelist.h" #include "llfocusmgr.h" +#include "llcubemap.h" +#include "llviewerregion.h" +#include "lldrawpoolwater.h" extern U32 gFrameCount; extern LLPointer<LLImageGL> gStartImageGL; @@ -84,8 +87,12 @@ void display_startup() return; } - LLDynamicTexture::updateAllInstances(); - + // Required for HTML update in login screen + static S32 frame_count = 0; + if (frame_count++ > 1) // make sure we have rendered a frame first + { + LLDynamicTexture::updateAllInstances(); + } glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT | GL_STENCIL_BUFFER_BIT); LLGLSDefault gls_default; LLGLSUIDefault gls_ui; @@ -364,6 +371,7 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield) // gCamera->setZoomParameters(zoom_factor, subfield); + gCamera->setNear(MIN_NEAR_PLANE); ////////////////////////// // @@ -379,6 +387,8 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield) else if (!gViewerWindow->isPickPending()) { glClear( GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT ); + //DEBUG TEMPORARY + glClear(GL_COLOR_BUFFER_BIT); } gViewerWindow->setupViewport(); @@ -399,7 +409,13 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield) glClearColor(0.5f, 0.5f, 0.5f, 0.f); glClear(GL_COLOR_BUFFER_BIT); glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); + LLPipeline::sUseOcclusion = FALSE; } + else + { + LLPipeline::sUseOcclusion = gSavedSettings.getBOOL("UseOcclusion") && gGLManager.mHasOcclusionQuery; + } + stop_glerror(); /////////////////////////////////////// @@ -412,7 +428,8 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield) glLightModelfv (GL_LIGHT_MODEL_AMBIENT,one); stop_glerror(); - //LLGLState::verify(); + //Increment drawable frame counter + LLDrawable::incrementVisible(); ///////////////////////////////////// // @@ -422,6 +439,11 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield) // if (!gDisconnected) { + if (gPipeline.hasRenderType(LLPipeline::RENDER_TYPE_HUD)) + { //don't draw hud objects in this frame + gPipeline.toggleRenderType(LLPipeline::RENDER_TYPE_HUD); + } + LLFastTimer t(LLFastTimer::FTM_WORLD_UPDATE); stop_glerror(); display_update_camera(); @@ -437,34 +459,41 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield) gPipeline.updateGeom(max_geom_update_time); stop_glerror(); + LLSpatialPartition* part = gPipeline.getSpatialPartition(LLPipeline::PARTITION_VOLUME); + part->processImagery(gCamera); + + display_update_camera(); + gFrameStats.start(LLFrameStats::UPDATE_CULL); - gPipeline.updateCull(); + gPipeline.updateCull(*gCamera); stop_glerror(); - if (rebuild) + /////////////////////////////////// + // + // StateSort + // + // Responsible for taking visible objects, and adding them to the appropriate draw orders. + // In the case of alpha objects, z-sorts them first. + // Also creates special lists for outlines and selected face rendering. + // { LLFastTimer t(LLFastTimer::FTM_REBUILD); - - /////////////////////////////////// - // - // StateSort - // - // Responsible for taking visible objects, and adding them to the appropriate draw orders. - // In the case of alpha objects, z-sorts them first. - // Also creates special lists for outlines and selected face rendering. - // - gFrameStats.start(LLFrameStats::STATE_SORT); - gPipeline.stateSort(); - stop_glerror(); - ////////////////////////////////////// - // - // rebuildPools - // - // - gFrameStats.start(LLFrameStats::REBUILD); - gPipeline.rebuildPools(); + gFrameStats.start(LLFrameStats::STATE_SORT); + gPipeline.stateSort(*gCamera); stop_glerror(); + + if (rebuild) + { + ////////////////////////////////////// + // + // rebuildPools + // + // + gFrameStats.start(LLFrameStats::REBUILD); + gPipeline.rebuildPools(); + stop_glerror(); + } } } @@ -509,10 +538,65 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield) && !gRestoreGL && !gDisconnected) { - gPipeline.renderGeom(); + gPipeline.renderGeom(*gCamera); stop_glerror(); } + //render hud attachments + glMatrixMode(GL_PROJECTION); + glPushMatrix(); + glMatrixMode(GL_MODELVIEW); + glPushMatrix(); + if (LLPipeline::sShowHUDAttachments && !gDisconnected && setup_hud_matrices(FALSE)) + { + LLCamera hud_cam = *gCamera; + glClear(GL_DEPTH_BUFFER_BIT); + LLVector3 origin = hud_cam.getOrigin(); + hud_cam.setOrigin(-1.f,0,0); + hud_cam.setAxes(LLVector3(1,0,0), LLVector3(0,1,0), LLVector3(0,0,1)); + LLViewerCamera::updateFrustumPlanes(hud_cam, TRUE); + //only render hud objects + U32 mask = gPipeline.getRenderTypeMask(); + gPipeline.setRenderTypeMask(0); + gPipeline.toggleRenderType(LLPipeline::RENDER_TYPE_HUD); + + BOOL has_ui = gPipeline.hasRenderDebugFeatureMask(LLPipeline::RENDER_DEBUG_FEATURE_UI); + if (has_ui) + { + gPipeline.toggleRenderDebugFeature((void*) LLPipeline::RENDER_DEBUG_FEATURE_UI); + } + + BOOL use_occlusion = gSavedSettings.getBOOL("UseOcclusion"); + gSavedSettings.setBOOL("UseOcclusion", FALSE); + + //cull, sort, and render hud objects + gPipeline.updateCull(hud_cam); + + gPipeline.toggleRenderType(LLDrawPool::POOL_ALPHA_POST_WATER); + gPipeline.toggleRenderType(LLPipeline::RENDER_TYPE_BUMP); + gPipeline.toggleRenderType(LLPipeline::RENDER_TYPE_SIMPLE); + gPipeline.toggleRenderType(LLPipeline::RENDER_TYPE_VOLUME); + + { + LLFastTimer ftm(LLFastTimer::FTM_REBUILD); + gPipeline.stateSort(hud_cam); + } + + gPipeline.renderGeom(hud_cam); + + //restore type mask + gPipeline.setRenderTypeMask(mask); + if (has_ui) + { + gPipeline.toggleRenderDebugFeature((void*) LLPipeline::RENDER_DEBUG_FEATURE_UI); + } + gSavedSettings.setBOOL("UseOcclusion", use_occlusion); + } + glMatrixMode(GL_PROJECTION); + glPopMatrix(); + glMatrixMode(GL_MODELVIEW); + glPopMatrix(); + gFrameStats.start(LLFrameStats::RENDER_UI); if (gHandleKeysAsync) @@ -535,6 +619,64 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield) } +BOOL setup_hud_matrices(BOOL for_select) +{ + LLVOAvatar* my_avatarp = gAgent.getAvatarObject(); + if (my_avatarp && my_avatarp->hasHUDAttachment()) + { + if (!for_select) + { + // clamp target zoom level to reasonable values + my_avatarp->mHUDTargetZoom = llclamp(my_avatarp->mHUDTargetZoom, 0.1f, 1.f); + // smoothly interpolate current zoom level + my_avatarp->mHUDCurZoom = lerp(my_avatarp->mHUDCurZoom, my_avatarp->mHUDTargetZoom, LLCriticalDamp::getInterpolant(0.03f)); + } + + F32 zoom_level = my_avatarp->mHUDCurZoom; + // clear z buffer and set up transform for hud + if (!for_select) + { + glClear(GL_DEPTH_BUFFER_BIT); + } + LLBBox hud_bbox = my_avatarp->getHUDBBox(); + + // set up transform to encompass bounding box of HUD + glMatrixMode(GL_PROJECTION); + glLoadIdentity(); + F32 hud_depth = llmax(1.f, hud_bbox.getExtentLocal().mV[VX] * 1.1f); + if (for_select) + { + //RN: reset viewport to window extents so ortho screen is calculated with proper reference frame + gViewerWindow->setupViewport(); + } + glOrtho(-0.5f * gCamera->getAspect(), 0.5f * gCamera->getAspect(), -0.5f, 0.5f, 0.f, hud_depth); + + // apply camera zoom transform (for high res screenshots) + F32 zoom_factor = gCamera->getZoomFactor(); + S16 sub_region = gCamera->getZoomSubRegion(); + if (zoom_factor > 1.f) + { + float offset = zoom_factor - 1.f; + int pos_y = sub_region / llceil(zoom_factor); + int pos_x = sub_region - (pos_y*llceil(zoom_factor)); + glTranslatef(gCamera->getAspect() * 0.5f * (offset - (F32)pos_x * 2.f), 0.5f * (offset - (F32)pos_y * 2.f), 0.f); + glScalef(zoom_factor, zoom_factor, 1.f); + } + + glMatrixMode(GL_MODELVIEW); + glLoadIdentity(); + glLoadMatrixf(OGL_TO_CFR_ROTATION); // Load Cory's favorite reference frame + glTranslatef(-hud_bbox.getCenterLocal().mV[VX] + (hud_depth * 0.5f), 0.f, 0.f); + glScalef(zoom_level, zoom_level, zoom_level); + + return TRUE; + } + else + { + return FALSE; + } +} + void render_ui_and_swap() { @@ -546,7 +688,7 @@ void render_ui_and_swap() { LLGLSUIDefault gls_ui; gPipeline.disableLights(); - + LLVertexBuffer::startRender(); if (gPipeline.hasRenderDebugFeatureMask(LLPipeline::RENDER_DEBUG_FEATURE_UI)) { LLFastTimer t(LLFastTimer::FTM_RENDER_UI); @@ -563,6 +705,8 @@ void render_ui_and_swap() LLGLState::checkStates(); #endif } + LLVertexBuffer::stopRender(); + glFlush(); // now do the swap buffer if (gDisplaySwapBuffers) @@ -570,6 +714,11 @@ void render_ui_and_swap() LLFastTimer t(LLFastTimer::FTM_SWAP); gViewerWindow->mWindow->swapBuffers(); } + + { +// LLFastTimer ftm(LLFastTimer::FTM_TEMP6); + LLVertexBuffer::clientCopy(); + } } } @@ -585,8 +734,6 @@ void render_ui_3d() // // Render selections - - glDisableClientState(GL_VERTEX_ARRAY); glDisableClientState(GL_COLOR_ARRAY); glDisableClientState(GL_TEXTURE_COORD_ARRAY); glDisableClientState(GL_NORMAL_ARRAY); @@ -643,7 +790,6 @@ void render_ui_2d() LLFontGL::sCurOrigin.mY -= llround((F32)gViewerWindow->getWindowHeight() * (F32)pos_y / zoom_factor); } - stop_glerror(); glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); |