diff options
50 files changed, 1191 insertions, 1567 deletions
| diff --git a/indra/cmake/CMakeLists.txt b/indra/cmake/CMakeLists.txt index 73b614e0af..cc217b0563 100644 --- a/indra/cmake/CMakeLists.txt +++ b/indra/cmake/CMakeLists.txt @@ -26,6 +26,7 @@ set(cmake_SOURCE_FILES          FreeType.cmake          GLEXT.cmake          GLH.cmake +        GLM.cmake          Havok.cmake          Hunspell.cmake          LLAddBuildTest.cmake diff --git a/indra/llcommon/llstrider.h b/indra/llcommon/llstrider.h index 06cf8d3480..d756aca62b 100644 --- a/indra/llcommon/llstrider.h +++ b/indra/llcommon/llstrider.h @@ -41,6 +41,13 @@ public:      LLStrider(Object* first) { mObjectp = first; mSkip = sizeof(Object); }      ~LLStrider() { } +    const LLStrider<Object>& operator=(const LLStrider<Object>& rhs) +    { +        mBytep = rhs.mBytep; +        mSkip = rhs.mSkip; +        return *this; +    } +      const LLStrider<Object>& operator =  (Object *first)    { mObjectp = first; return *this;}      void setStride (S32 skipBytes)  { mSkip = (skipBytes ? skipBytes : sizeof(Object));} diff --git a/indra/llprimitive/CMakeLists.txt b/indra/llprimitive/CMakeLists.txt index 19a43839af..3d8e02cb16 100644 --- a/indra/llprimitive/CMakeLists.txt +++ b/indra/llprimitive/CMakeLists.txt @@ -7,7 +7,6 @@ include(LLCommon)  include(LLCoreHttp)  include(LLPhysicsExtensions)  include(LLPrimitive) -include(GLH)  include(GLM)  include(TinyGLTF) @@ -70,7 +69,7 @@ target_link_libraries(llprimitive          llrender          llphysicsextensions_impl          ll::colladadom -        ll::glh_linear +        ll::glm          )  #add unit tests diff --git a/indra/llprimitive/lldaeloader.cpp b/indra/llprimitive/lldaeloader.cpp index 4f47f16e33..f286bff353 100644 --- a/indra/llprimitive/lldaeloader.cpp +++ b/indra/llprimitive/lldaeloader.cpp @@ -51,7 +51,8 @@  #include "llsdserialize.h"  #include "lljoint.h" -#include "glh/glh_linear.h" +#include "glm/mat4x4.hpp" +#include "glm/gtc/type_ptr.hpp"  #include "llmatrix4a.h"  #include <boost/regex.hpp> @@ -1218,9 +1219,9 @@ void LLDAELoader::processDomModel(LLModel* model, DAE* dae, daeElement* root, do          mesh_scale *= normalized_transformation;          normalized_transformation = mesh_scale; -        glh::matrix4f inv_mat((F32*) normalized_transformation.mMatrix); -        inv_mat = inv_mat.inverse(); -        LLMatrix4 inverse_normalized_transformation(inv_mat.m); +        glm::mat4 inv_mat = glm::make_mat4((F32*)normalized_transformation.mMatrix); +        inv_mat = glm::inverse(inv_mat); +        LLMatrix4 inverse_normalized_transformation(glm::value_ptr(inv_mat));          domSkin::domBind_shape_matrix* bind_mat = skin->getBind_shape_matrix(); diff --git a/indra/llprimitive/llgltfloader.cpp b/indra/llprimitive/llgltfloader.cpp index 776f81cc01..480012699a 100644 --- a/indra/llprimitive/llgltfloader.cpp +++ b/indra/llprimitive/llgltfloader.cpp @@ -51,7 +51,6 @@  #include "llsdserialize.h"  #include "lljoint.h" -#include "glh/glh_linear.h"  #include "llmatrix4a.h"  #include <boost/regex.hpp> diff --git a/indra/llprimitive/llmodelloader.cpp b/indra/llprimitive/llmodelloader.cpp index 9a194567d2..ae69c4f8ab 100644 --- a/indra/llprimitive/llmodelloader.cpp +++ b/indra/llprimitive/llmodelloader.cpp @@ -31,7 +31,6 @@  #include "lljoint.h"  #include "llcallbacklist.h" -#include "glh/glh_linear.h"  #include "llmatrix4a.h"  #include <boost/bind.hpp> diff --git a/indra/llrender/llgl.cpp b/indra/llrender/llgl.cpp index 0db1e27b01..c62cacdce6 100644 --- a/indra/llrender/llgl.cpp +++ b/indra/llrender/llgl.cpp @@ -50,6 +50,10 @@  #include "llglheaders.h"  #include "llglslshader.h" +#include "glm/glm.hpp" +#include <glm/gtc/matrix_access.hpp> +#include "glm/gtc/type_ptr.hpp" +  #if LL_WINDOWS  #include "lldxhardware.h"  #endif @@ -2694,7 +2698,7 @@ void parse_glsl_version(S32& major, S32& minor)      LLStringUtil::convertToS32(minor_str, minor);  } -LLGLUserClipPlane::LLGLUserClipPlane(const LLPlane& p, const glh::matrix4f& modelview, const glh::matrix4f& projection, bool apply) +LLGLUserClipPlane::LLGLUserClipPlane(const LLPlane& p, const glm::mat4& modelview, const glm::mat4& projection, bool apply)  {      mApply = apply; @@ -2721,13 +2725,12 @@ void LLGLUserClipPlane::disable()  void LLGLUserClipPlane::setPlane(F32 a, F32 b, F32 c, F32 d)  { -    glh::matrix4f& P = mProjection; -    glh::matrix4f& M = mModelview; +    const glm::mat4& P = mProjection; +    const glm::mat4& M = mModelview; -    glh::matrix4f invtrans_MVP = (P * M).inverse().transpose(); -    glh::vec4f oplane(a,b,c,d); -    glh::vec4f cplane; -    invtrans_MVP.mult_matrix_vec(oplane, cplane); +    glm::mat4 invtrans_MVP = glm::transpose(glm::inverse(P*M)); +    glm::vec4 oplane(a,b,c,d); +    glm::vec4 cplane = invtrans_MVP * oplane;      cplane /= fabs(cplane[2]); // normalize such that depth is not scaled      cplane[3] -= 1; @@ -2735,13 +2738,13 @@ void LLGLUserClipPlane::setPlane(F32 a, F32 b, F32 c, F32 d)      if(cplane[2] < 0)          cplane *= -1; -    glh::matrix4f suffix; -    suffix.set_row(2, cplane); -    glh::matrix4f newP = suffix * P; +    glm::mat4 suffix; +    suffix = glm::row(suffix, 2, cplane); +    glm::mat4 newP = suffix * P;      gGL.matrixMode(LLRender::MM_PROJECTION);      gGL.pushMatrix(); -    gGL.loadMatrix(newP.m); -    gGLObliqueProjectionInverse = LLMatrix4(newP.inverse().transpose().m); +    gGL.loadMatrix(glm::value_ptr(newP)); +    gGLObliqueProjectionInverse = LLMatrix4(glm::value_ptr(glm::transpose(glm::inverse(newP))));      gGL.matrixMode(LLRender::MM_MODELVIEW);  } @@ -2838,31 +2841,27 @@ void LLGLDepthTest::checkState()  LLGLSquashToFarClip::LLGLSquashToFarClip()  { -    glh::matrix4f proj = get_current_projection(); +    glm::mat4 proj = get_current_projection();      setProjectionMatrix(proj, 0);  } -LLGLSquashToFarClip::LLGLSquashToFarClip(glh::matrix4f& P, U32 layer) +LLGLSquashToFarClip::LLGLSquashToFarClip(const glm::mat4& P, U32 layer)  {      setProjectionMatrix(P, layer);  } - -void LLGLSquashToFarClip::setProjectionMatrix(glh::matrix4f& projection, U32 layer) +void LLGLSquashToFarClip::setProjectionMatrix(glm::mat4 projection, U32 layer)  { -      F32 depth = 0.99999f - 0.0001f * layer; -    for (U32 i = 0; i < 4; i++) -    { -        projection.element(2, i) = projection.element(3, i) * depth; -    } +    glm::vec4 P_row_3 = glm::row(projection, 3) * depth; +    projection = glm::row(projection, 2, P_row_3);      LLRender::eMatrixMode last_matrix_mode = gGL.getMatrixMode();      gGL.matrixMode(LLRender::MM_PROJECTION);      gGL.pushMatrix(); -    gGL.loadMatrix(projection.m); +    gGL.loadMatrix(glm::value_ptr(projection));      gGL.matrixMode(last_matrix_mode);  } diff --git a/indra/llrender/llgl.h b/indra/llrender/llgl.h index cd1ba55b16..17f825bd71 100644 --- a/indra/llrender/llgl.h +++ b/indra/llrender/llgl.h @@ -43,7 +43,7 @@  #include "llinstancetracker.h"  #include "llglheaders.h" -#include "glh/glh_linear.h" +#include "glm/mat4x4.hpp"  extern bool gDebugGL;  extern bool gDebugSession; @@ -317,7 +317,7 @@ class LLGLUserClipPlane  {  public: -    LLGLUserClipPlane(const LLPlane& plane, const glh::matrix4f& modelview, const glh::matrix4f& projection, bool apply = true); +    LLGLUserClipPlane(const LLPlane& plane, const glm::mat4& modelview, const glm::mat4& projection, bool apply = true);      ~LLGLUserClipPlane();      void setPlane(F32 a, F32 b, F32 c, F32 d); @@ -326,8 +326,8 @@ public:  private:      bool mApply; -    glh::matrix4f mProjection; -    glh::matrix4f mModelview; +    glm::mat4 mProjection; +    glm::mat4 mModelview;  };  /* @@ -341,9 +341,9 @@ class LLGLSquashToFarClip  {  public:      LLGLSquashToFarClip(); -    LLGLSquashToFarClip(glh::matrix4f& projection, U32 layer = 0); +    LLGLSquashToFarClip(const glm::mat4& projection, U32 layer = 0); -    void setProjectionMatrix(glh::matrix4f& projection, U32 layer); +    void setProjectionMatrix(glm::mat4 projection, U32 layer);      ~LLGLSquashToFarClip();  }; diff --git a/indra/llrender/llimagegl.cpp b/indra/llrender/llimagegl.cpp index 68c20048ec..67b4ada62f 100644 --- a/indra/llrender/llimagegl.cpp +++ b/indra/llrender/llimagegl.cpp @@ -1045,15 +1045,47 @@ void sub_image_lines(U32 target, S32 miplevel, S32 x_offset, S32 y_offset, S32 w  {      LL_PROFILE_ZONE_SCOPED_CATEGORY_TEXTURE; +    LL_PROFILE_ZONE_NUM(width); +    LL_PROFILE_ZONE_NUM(height); +      U32 components = LLImageGL::dataFormatComponents(pixformat);      U32 type_width = type_width_from_pixtype(pixtype);      const U32 line_width = data_width * components * type_width;      const U32 y_offset_end = y_offset + height; -    for (U32 y_pos = y_offset; y_pos < y_offset_end; ++y_pos) + +    if (width == data_width && height % 32 == 0) +    { +        LL_PROFILE_ZONE_NAMED_CATEGORY_TEXTURE("subimage - batched lines"); + +        // full width, batch multiple lines at a time +        // set batch size based on width +        U32 batch_size = 32; + +        if (width > 1024) +        { +            batch_size = 8; +        } +        else if (width > 512) +        { +            batch_size = 16; +        } + +        // full width texture, do 32 lines at a time +        for (U32 y_pos = y_offset; y_pos < y_offset_end; y_pos += batch_size) +        { +            glTexSubImage2D(target, miplevel, x_offset, y_pos, width, batch_size, pixformat, pixtype, src); +            src += line_width * batch_size; +        } +    } +    else      { -        glTexSubImage2D(target, miplevel, x_offset, y_pos, width, 1, pixformat, pixtype, src); -        src += line_width; +        // partial width or strange height +        for (U32 y_pos = y_offset; y_pos < y_offset_end; y_pos += 1) +        { +            glTexSubImage2D(target, miplevel, x_offset, y_pos, width, 1, pixformat, pixtype, src); +            src += line_width; +        }      }  } @@ -2139,6 +2171,8 @@ void LLImageGL::analyzeAlpha(const void* data_in, U32 w, U32 h)          return ;      } +    LL_PROFILE_ZONE_SCOPED_CATEGORY_TEXTURE; +      U32 length = w * h;      U32 alphatotal = 0; @@ -2150,15 +2184,15 @@ void LLImageGL::analyzeAlpha(const void* data_in, U32 w, U32 h)      // this will mid-skew the data (and thus increase the chances of not      // being used as a mask) from high-frequency alpha maps which      // suffer the worst from aliasing when used as alpha masks. -    if (w >= 2 && h >= 2) +    if (w >= 4 && h >= 4)      { -        llassert(w%2 == 0); -        llassert(h%2 == 0); +        llassert(w%4 == 0); +        llassert(h%4 == 0);          const GLubyte* rowstart = ((const GLubyte*) data_in) + mAlphaOffset; -        for (U32 y = 0; y < h; y+=2) +        for (U32 y = 0; y < h; y+=4)          {              const GLubyte* current = rowstart; -            for (U32 x = 0; x < w; x+=2) +            for (U32 x = 0; x < w; x+=4)              {                  const U32 s1 = current[0];                  alphatotal += s1; @@ -2182,7 +2216,7 @@ void LLImageGL::analyzeAlpha(const void* data_in, U32 w, U32 h)              } -            rowstart += 2 * w * mAlphaStride; +            rowstart += 4 * w * mAlphaStride;          }          length *= 2; // we sampled everything twice, essentially      } diff --git a/indra/llrender/llrender.cpp b/indra/llrender/llrender.cpp index 828a509971..16a8309a9a 100644 --- a/indra/llrender/llrender.cpp +++ b/indra/llrender/llrender.cpp @@ -36,6 +36,7 @@  #include "lltexture.h"  #include "llshadermgr.h"  #include "hbxxh.h" +#include "glm/gtc/type_ptr.hpp"  #if LL_WINDOWS  extern void APIENTRY gl_debug_callback(GLenum source, @@ -57,8 +58,8 @@ F32 gGLLastProjection[16];  F32 gGLProjection[16];  // transform from last frame's camera space to this frame's camera space (and inverse) -F32 gGLDeltaModelView[16]; -F32 gGLInverseDeltaModelView[16]; +glm::mat4 gGLDeltaModelView; +glm::mat4 gGLInverseDeltaModelView;  S32 gGLViewport[4]; @@ -735,10 +736,10 @@ void LLLightState::setPosition(const LLVector4& position)      ++gGL.mLightHash;      mPosition = position;      //transform position by current modelview matrix -    glh::vec4f pos(position.mV); -    const glh::matrix4f& mat = gGL.getModelviewMatrix(); -    mat.mult_matrix_vec(pos); -    mPosition.set(pos.v); +    glm::vec4 pos(glm::make_vec4(position.mV)); +    const glm::mat4& mat = gGL.getModelviewMatrix(); +    pos = mat * pos; +    mPosition.set(glm::value_ptr(pos));  }  void LLLightState::setConstantAttenuation(const F32& atten) @@ -790,13 +791,13 @@ void LLLightState::setSpotDirection(const LLVector3& direction)  {      //always set direction because modelview matrix may have changed      ++gGL.mLightHash; -    mSpotDirection = direction; +      //transform direction by current modelview matrix -    glh::vec3f dir(direction.mV); -    const glh::matrix4f& mat = gGL.getModelviewMatrix(); -    mat.mult_matrix_dir(dir); +    glm::vec3 dir(glm::make_vec3(direction.mV)); +    const glm::mat3 mat(gGL.getModelviewMatrix()); +    dir = mat * dir; -    mSpotDirection.set(dir.v); +    mSpotDirection.set(glm::value_ptr(dir));  }  LLRender::LLRender() @@ -830,6 +831,10 @@ LLRender::LLRender()      for (U32 i = 0; i < NUM_MATRIX_MODES; ++i)      { +        for (U32 j = 0; j < LL_MATRIX_STACK_DEPTH; ++j) +        { +            mMatrix[i][j] = glm::identity<glm::mat4>(); +        }          mMatIdx[i] = 0;          mMatHash[i] = 0;          mCurMatHash[i] = 0xFFFFFFFF; @@ -991,12 +996,12 @@ void LLRender::syncMatrices()      LLGLSLShader* shader = LLGLSLShader::sCurBoundShaderPtr; -    static glh::matrix4f cached_mvp; -    static glh::matrix4f cached_inv_mdv; +    static glm::mat4 cached_mvp; +    static glm::mat4 cached_inv_mdv;      static U32 cached_mvp_mdv_hash = 0xFFFFFFFF;      static U32 cached_mvp_proj_hash = 0xFFFFFFFF; -    static glh::matrix4f cached_normal; +    static glm::mat4 cached_normal;      static U32 cached_normal_hash = 0xFFFFFFFF;      if (shader) @@ -1006,15 +1011,15 @@ void LLRender::syncMatrices()          U32 i = MM_MODELVIEW;          if (mMatHash[MM_MODELVIEW] != shader->mMatHash[MM_MODELVIEW])          { //update modelview, normal, and MVP -            glh::matrix4f& mat = mMatrix[MM_MODELVIEW][mMatIdx[MM_MODELVIEW]]; +            const glm::mat4& mat = mMatrix[MM_MODELVIEW][mMatIdx[MM_MODELVIEW]];              // if MDV has changed, update the cached inverse as well              if (cached_mvp_mdv_hash != mMatHash[MM_MODELVIEW])              { -                cached_inv_mdv = mat.inverse(); +                cached_inv_mdv = glm::inverse(mat);              } -            shader->uniformMatrix4fv(name[MM_MODELVIEW], 1, GL_FALSE, mat.m); +            shader->uniformMatrix4fv(name[MM_MODELVIEW], 1, GL_FALSE, glm::value_ptr(mat));              shader->mMatHash[MM_MODELVIEW] = mMatHash[MM_MODELVIEW];              //update normal matrix @@ -1023,17 +1028,17 @@ void LLRender::syncMatrices()              {                  if (cached_normal_hash != mMatHash[i])                  { -                    cached_normal = cached_inv_mdv.transpose(); +                    cached_normal = glm::transpose(cached_inv_mdv);                      cached_normal_hash = mMatHash[i];                  } -                glh::matrix4f& norm = cached_normal; +                auto norm = glm::value_ptr(cached_normal);                  F32 norm_mat[] =                  { -                    norm.m[0], norm.m[1], norm.m[2], -                    norm.m[4], norm.m[5], norm.m[6], -                    norm.m[8], norm.m[9], norm.m[10] +                    norm[0], norm[1], norm[2], +                    norm[4], norm[5], norm[6], +                    norm[8], norm[9], norm[10]                  };                  shader->uniformMatrix3fv(LLShaderMgr::NORMAL_MATRIX, 1, GL_FALSE, norm_mat); @@ -1041,7 +1046,7 @@ void LLRender::syncMatrices()              if (shader->getUniformLocation(LLShaderMgr::INVERSE_MODELVIEW_MATRIX))              { -                shader->uniformMatrix4fv(LLShaderMgr::INVERSE_MODELVIEW_MATRIX, 1, GL_FALSE, cached_inv_mdv.m); +                shader->uniformMatrix4fv(LLShaderMgr::INVERSE_MODELVIEW_MATRIX, 1, GL_FALSE, glm::value_ptr(cached_inv_mdv));              }              //update MVP matrix @@ -1054,36 +1059,36 @@ void LLRender::syncMatrices()                  if (cached_mvp_mdv_hash != mMatHash[i] || cached_mvp_proj_hash != mMatHash[MM_PROJECTION])                  {                      cached_mvp = mat; -                    cached_mvp.mult_left(mMatrix[proj][mMatIdx[proj]]); +                    cached_mvp = mMatrix[proj][mMatIdx[proj]] * cached_mvp;                      cached_mvp_mdv_hash = mMatHash[i];                      cached_mvp_proj_hash = mMatHash[MM_PROJECTION];                  } -                shader->uniformMatrix4fv(LLShaderMgr::MODELVIEW_PROJECTION_MATRIX, 1, GL_FALSE, cached_mvp.m); +                shader->uniformMatrix4fv(LLShaderMgr::MODELVIEW_PROJECTION_MATRIX, 1, GL_FALSE, glm::value_ptr(cached_mvp));              }          }          i = MM_PROJECTION;          if (mMatHash[MM_PROJECTION] != shader->mMatHash[MM_PROJECTION])          { //update projection matrix, normal, and MVP -            glh::matrix4f& mat = mMatrix[MM_PROJECTION][mMatIdx[MM_PROJECTION]]; +            const glm::mat4& mat = mMatrix[MM_PROJECTION][mMatIdx[MM_PROJECTION]];              // GZ: This was previously disabled seemingly due to a bug involving the deferred renderer's regular pushing and popping of mats.              // We're reenabling this and cleaning up the code around that - that would've been the appropriate course initially.              // Anything beyond the standard proj and inv proj mats are special cases.  Please setup special uniforms accordingly in the future.              if (shader->getUniformLocation(LLShaderMgr::INVERSE_PROJECTION_MATRIX))              { -                glh::matrix4f inv_proj = mat.inverse(); -                shader->uniformMatrix4fv(LLShaderMgr::INVERSE_PROJECTION_MATRIX, 1, false, inv_proj.m); +                glm::mat4 inv_proj = glm::inverse(mat); +                shader->uniformMatrix4fv(LLShaderMgr::INVERSE_PROJECTION_MATRIX, 1, false, glm::value_ptr(inv_proj));              }              // Used by some full screen effects - such as full screen lights, glow, etc.              if (shader->getUniformLocation(LLShaderMgr::IDENTITY_MATRIX))              { -                shader->uniformMatrix4fv(LLShaderMgr::IDENTITY_MATRIX, 1, GL_FALSE, glh::matrix4f::identity().m); +                shader->uniformMatrix4fv(LLShaderMgr::IDENTITY_MATRIX, 1, GL_FALSE, glm::value_ptr(glm::identity<glm::mat4>()));              } -            shader->uniformMatrix4fv(name[MM_PROJECTION], 1, GL_FALSE, mat.m); +            shader->uniformMatrix4fv(name[MM_PROJECTION], 1, GL_FALSE, glm::value_ptr(mat));              shader->mMatHash[MM_PROJECTION] = mMatHash[MM_PROJECTION];              if (!mvp_done) @@ -1096,12 +1101,12 @@ void LLRender::syncMatrices()                      {                          U32 mdv = MM_MODELVIEW;                          cached_mvp = mat; -                        cached_mvp.mult_right(mMatrix[mdv][mMatIdx[mdv]]); +                        cached_mvp *= mMatrix[mdv][mMatIdx[mdv]];                          cached_mvp_mdv_hash = mMatHash[MM_MODELVIEW];                          cached_mvp_proj_hash = mMatHash[MM_PROJECTION];                      } -                    shader->uniformMatrix4fv(LLShaderMgr::MODELVIEW_PROJECTION_MATRIX, 1, GL_FALSE, cached_mvp.m); +                    shader->uniformMatrix4fv(LLShaderMgr::MODELVIEW_PROJECTION_MATRIX, 1, GL_FALSE, glm::value_ptr(cached_mvp));                  }              }          } @@ -1110,7 +1115,7 @@ void LLRender::syncMatrices()          {              if (mMatHash[i] != shader->mMatHash[i])              { -                shader->uniformMatrix4fv(name[i], 1, GL_FALSE, mMatrix[i][mMatIdx[i]].m); +                shader->uniformMatrix4fv(name[i], 1, GL_FALSE, glm::value_ptr(mMatrix[i][mMatIdx[i]]));                  shader->mMatHash[i] = mMatHash[i];              }          } @@ -1129,12 +1134,7 @@ void LLRender::translatef(const GLfloat& x, const GLfloat& y, const GLfloat& z)      flush();      { -        glh::matrix4f trans_mat(1,0,0,x, -                                0,1,0,y, -                                0,0,1,z, -                                0,0,0,1); - -        mMatrix[mMatrixMode][mMatIdx[mMatrixMode]].mult_right(trans_mat); +        mMatrix[mMatrixMode][mMatIdx[mMatrixMode]] = glm::translate(mMatrix[mMatrixMode][mMatIdx[mMatrixMode]], glm::vec3(x, y, z));          mMatHash[mMatrixMode]++;      }  } @@ -1144,12 +1144,7 @@ void LLRender::scalef(const GLfloat& x, const GLfloat& y, const GLfloat& z)      flush();      { -        glh::matrix4f scale_mat(x,0,0,0, -                                0,y,0,0, -                                0,0,z,0, -                                0,0,0,1); - -        mMatrix[mMatrixMode][mMatIdx[mMatrixMode]].mult_right(scale_mat); +        mMatrix[mMatrixMode][mMatIdx[mMatrixMode]] = glm::scale(mMatrix[mMatrixMode][mMatIdx[mMatrixMode]], glm::vec3(x, y, z));          mMatHash[mMatrixMode]++;      }  } @@ -1159,13 +1154,7 @@ void LLRender::ortho(F32 left, F32 right, F32 bottom, F32 top, F32 zNear, F32 zF      flush();      { - -        glh::matrix4f ortho_mat(2.f/(right-left),0,0,   -(right+left)/(right-left), -                                0,2.f/(top-bottom),0,   -(top+bottom)/(top-bottom), -                                0,0,-2.f/(zFar-zNear),  -(zFar+zNear)/(zFar-zNear), -                                0,0,0,1); - -        mMatrix[mMatrixMode][mMatIdx[mMatrixMode]].mult_right(ortho_mat); +        mMatrix[mMatrixMode][mMatIdx[mMatrixMode]] *= glm::ortho(left, right, bottom, top, zNear, zFar);          mMatHash[mMatrixMode]++;      }  } @@ -1175,19 +1164,7 @@ void LLRender::rotatef(const GLfloat& a, const GLfloat& x, const GLfloat& y, con      flush();      { -        F32 r = a * DEG_TO_RAD; - -        F32 c = cosf(r); -        F32 s = sinf(r); - -        F32 ic = 1.f-c; - -        glh::matrix4f rot_mat(x*x*ic+c,     x*y*ic-z*s,     x*z*ic+y*s,     0, -                              x*y*ic+z*s,   y*y*ic+c,       y*z*ic-x*s,     0, -                              x*z*ic-y*s,   y*z*ic+x*s,     z*z*ic+c,       0, -                              0,0,0,1); - -        mMatrix[mMatrixMode][mMatIdx[mMatrixMode]].mult_right(rot_mat); +        mMatrix[mMatrixMode][mMatIdx[mMatrixMode]] = glm::rotate(mMatrix[mMatrixMode][mMatIdx[mMatrixMode]], glm::radians(a), glm::vec3(x,y,z));          mMatHash[mMatrixMode]++;      }  } @@ -1229,7 +1206,7 @@ void LLRender::loadMatrix(const GLfloat* m)  {      flush();      { -        mMatrix[mMatrixMode][mMatIdx[mMatrixMode]].set_value((GLfloat*) m); +        mMatrix[mMatrixMode][mMatIdx[mMatrixMode]] = glm::make_mat4((GLfloat*) m);          mMatHash[mMatrixMode]++;      }  } @@ -1238,9 +1215,7 @@ void LLRender::multMatrix(const GLfloat* m)  {      flush();      { -        glh::matrix4f mat((GLfloat*) m); - -        mMatrix[mMatrixMode][mMatIdx[mMatrixMode]].mult_right(mat); +        mMatrix[mMatrixMode][mMatIdx[mMatrixMode]] *= glm::make_mat4(m);          mMatHash[mMatrixMode]++;      }  } @@ -1283,17 +1258,17 @@ void LLRender::loadIdentity()      {          llassert_always(mMatrixMode < NUM_MATRIX_MODES) ; -        mMatrix[mMatrixMode][mMatIdx[mMatrixMode]].make_identity(); +        mMatrix[mMatrixMode][mMatIdx[mMatrixMode]] = glm::identity<glm::mat4>();          mMatHash[mMatrixMode]++;      }  } -const glh::matrix4f& LLRender::getModelviewMatrix() +const glm::mat4& LLRender::getModelviewMatrix()  {      return mMatrix[MM_MODELVIEW][mMatIdx[MM_MODELVIEW]];  } -const glh::matrix4f& LLRender::getProjectionMatrix() +const glm::mat4& LLRender::getProjectionMatrix()  {      return mMatrix[MM_PROJECTION][mMatIdx[MM_PROJECTION]];  } @@ -2214,85 +2189,90 @@ void LLRender::debugTexUnits(void)      LL_INFOS("TextureUnit") << "Active TexUnit Enabled : " << active_enabled << LL_ENDL;  } - - -glh::matrix4f copy_matrix(F32* src) -{ -    glh::matrix4f ret; -    ret.set_value(src); -    return ret; -} - -glh::matrix4f get_current_modelview() +glm::mat4 get_current_modelview()  { -    return copy_matrix(gGLModelView); +    return glm::make_mat4(gGLModelView);  } -glh::matrix4f get_current_projection() +glm::mat4 get_current_projection()  { -    return copy_matrix(gGLProjection); +    return glm::make_mat4(gGLProjection);  } -glh::matrix4f get_last_modelview() +glm::mat4 get_last_modelview()  { -    return copy_matrix(gGLLastModelView); +    return glm::make_mat4(gGLLastModelView);  } -glh::matrix4f get_last_projection() +glm::mat4 get_last_projection()  { -    return copy_matrix(gGLLastProjection); +    return glm::make_mat4(gGLLastProjection);  } -void copy_matrix(const glh::matrix4f& src, F32* dst) +void copy_matrix(const glm::mat4& src, F32* dst)  { +    auto matp = glm::value_ptr(src);      for (U32 i = 0; i < 16; i++)      { -        dst[i] = src.m[i]; +        dst[i] = matp[i];      }  } -void set_current_modelview(const glh::matrix4f& mat) +void set_current_modelview(const glm::mat4& mat)  {      copy_matrix(mat, gGLModelView);  } -void set_current_projection(glh::matrix4f& mat) +void set_current_projection(const glm::mat4& mat)  {      copy_matrix(mat, gGLProjection);  } -glh::matrix4f gl_ortho(GLfloat left, GLfloat right, GLfloat bottom, GLfloat top, GLfloat znear, GLfloat zfar) +void set_last_modelview(const glm::mat4& mat)  { -    glh::matrix4f ret( -        2.f/(right-left), 0.f, 0.f, -(right+left)/(right-left), -        0.f, 2.f/(top-bottom), 0.f, -(top+bottom)/(top-bottom), -        0.f, 0.f, -2.f/(zfar-znear),  -(zfar+znear)/(zfar-znear), -        0.f, 0.f, 0.f, 1.f); - -    return ret; +    copy_matrix(mat, gGLLastModelView);  } -glh::matrix4f gl_perspective(GLfloat fovy, GLfloat aspect, GLfloat zNear, GLfloat zFar) +void set_last_projection(const glm::mat4& mat)  { -    GLfloat f = 1.f/tanf(DEG_TO_RAD*fovy/2.f); - -    return glh::matrix4f(f/aspect, 0, 0, 0, -                         0, f, 0, 0, -                         0, 0, (zFar+zNear)/(zNear-zFar), (2.f*zFar*zNear)/(zNear-zFar), -                         0, 0, -1.f, 0); +    copy_matrix(mat, gGLLastProjection);  } -glh::matrix4f gl_lookat(LLVector3 eye, LLVector3 center, LLVector3 up) +glm::vec3 mul_mat4_vec3(const glm::mat4& mat, const glm::vec3& vec)  { -    LLVector3 f = center-eye; -    f.normVec(); -    up.normVec(); -    LLVector3 s = f % up; -    LLVector3 u = s % f; +    //const float w = vec[0] * mat[0][3] + vec[1] * mat[1][3] + vec[2] * mat[2][3] + mat[3][3]; +    //return glm::vec3( +    //    (vec[0] * mat[0][0] + vec[1] * mat[1][0] + vec[2] * mat[2][0] + mat[3][0]) / w, +    //    (vec[0] * mat[0][1] + vec[1] * mat[1][1] + vec[2] * mat[2][1] + mat[3][1]) / w, +    //    (vec[0] * mat[0][2] + vec[1] * mat[1][2] + vec[2] * mat[2][2] + mat[3][2]) / w +    //); +    LLVector4a x, y, z, s, t, p, q; + +    x.splat(vec.x); +    y.splat(vec.y); +    z.splat(vec.z); + +    s.splat<3>(mat[0].data); +    t.splat<3>(mat[1].data); +    p.splat<3>(mat[2].data); +    q.splat<3>(mat[3].data); + +    s.mul(x); +    t.mul(y); +    p.mul(z); +    q.add(s); +    t.add(p); +    q.add(t); -    return glh::matrix4f(s[0], s[1], s[2], 0, -                      u[0], u[1], u[2], 0, -                      -f[0], -f[1], -f[2], 0, -                      0, 0, 0, 1); +    x.mul(mat[0].data); +    y.mul(mat[1].data); +    z.mul(mat[2].data); +    x.add(y); +    z.add(mat[3].data); +    LLVector4a res; +    res.load3(glm::value_ptr(vec)); +    res.setAdd(x, z); +    res.div(q); +    return glm::make_vec3(res.getF32ptr());  } diff --git a/indra/llrender/llrender.h b/indra/llrender/llrender.h index 39c13e328a..2645597b1a 100644 --- a/indra/llrender/llrender.h +++ b/indra/llrender/llrender.h @@ -42,7 +42,7 @@  #include "llpointer.h"  #include "llglheaders.h"  #include "llmatrix4a.h" -#include "glh/glh_linear.h" +#include "glm/mat4x4.hpp"  #include <array>  #include <list> @@ -401,8 +401,8 @@ public:      void matrixMode(eMatrixMode mode);      eMatrixMode getMatrixMode(); -    const glh::matrix4f& getModelviewMatrix(); -    const glh::matrix4f& getProjectionMatrix(); +    const glm::mat4& getModelviewMatrix(); +    const glm::mat4& getProjectionMatrix();      void syncMatrices();      void syncLightState(); @@ -502,7 +502,7 @@ private:      eMatrixMode mMatrixMode;      U32 mMatIdx[NUM_MATRIX_MODES];      U32 mMatHash[NUM_MATRIX_MODES]; -    glh::matrix4f mMatrix[NUM_MATRIX_MODES][LL_MATRIX_STACK_DEPTH]; +    glm::mat4 mMatrix[NUM_MATRIX_MODES][LL_MATRIX_STACK_DEPTH];      U32 mCurMatHash[NUM_MATRIX_MODES];      U32 mLightHash;      LLColor4 mAmbientLightColor; @@ -536,8 +536,8 @@ extern F32 gGLLastModelView[16];  extern F32 gGLLastProjection[16];  extern F32 gGLProjection[16];  extern S32 gGLViewport[4]; -extern F32 gGLDeltaModelView[16]; -extern F32 gGLInverseDeltaModelView[16]; +extern glm::mat4 gGLDeltaModelView; +extern glm::mat4 gGLInverseDeltaModelView;  extern thread_local LLRender gGL; @@ -548,19 +548,20 @@ const F32 OGL_TO_CFR_ROTATION[16] = {  0.f,  0.f, -1.f,  0.f,   // -Z becomes X                                         0.f,  1.f,  0.f,  0.f,   //  Y becomes Z                                         0.f,  0.f,  0.f,  1.f }; -glh::matrix4f copy_matrix(F32* src); -glh::matrix4f get_current_modelview(); -glh::matrix4f get_current_projection(); -glh::matrix4f get_last_modelview(); -glh::matrix4f get_last_projection(); +glm::mat4 copy_matrix(F32* src); +glm::mat4 get_current_modelview(); +glm::mat4 get_current_projection(); +glm::mat4 get_last_modelview(); +glm::mat4 get_last_projection(); -void copy_matrix(const glh::matrix4f& src, F32* dst); -void set_current_modelview(const glh::matrix4f& mat); -void set_current_projection(glh::matrix4f& mat); +void copy_matrix(const glm::mat4& src, F32* dst); +void set_current_modelview(const glm::mat4& mat); +void set_current_projection(const glm::mat4& mat); +void set_last_modelview(const glm::mat4& mat); +void set_last_projection(const glm::mat4& mat); -glh::matrix4f gl_ortho(GLfloat left, GLfloat right, GLfloat bottom, GLfloat top, GLfloat znear, GLfloat zfar); -glh::matrix4f gl_perspective(GLfloat fovy, GLfloat aspect, GLfloat zNear, GLfloat zFar); -glh::matrix4f gl_lookat(LLVector3 eye, LLVector3 center, LLVector3 up); +// glh compat +glm::vec3 mul_mat4_vec3(const glm::mat4& mat, const glm::vec3& vec);  #define LL_SHADER_LOADING_WARNS(...) LL_WARNS() diff --git a/indra/llrender/llvertexbuffer.cpp b/indra/llrender/llvertexbuffer.cpp index 156e300853..8524b470de 100644 --- a/indra/llrender/llvertexbuffer.cpp +++ b/indra/llrender/llvertexbuffer.cpp @@ -36,6 +36,7 @@  #include "llshadermgr.h"  #include "llglslshader.h"  #include "llmemory.h" +#include <glm/gtc/type_ptr.hpp>  //Next Highest Power Of Two  //helper function, returns first number > v that is a power of 2, or v if v is already a power of 2 @@ -590,13 +591,13 @@ void LLVertexBufferData::draw()      gGL.matrixMode(LLRender::MM_MODELVIEW);      gGL.pushMatrix(); -    gGL.loadMatrix(mModelView.m); +    gGL.loadMatrix(glm::value_ptr(mModelView));      gGL.matrixMode(LLRender::MM_PROJECTION);      gGL.pushMatrix(); -    gGL.loadMatrix(mProjection.m); +    gGL.loadMatrix(glm::value_ptr(mProjection));      gGL.matrixMode(LLRender::MM_TEXTURE0);      gGL.pushMatrix(); -    gGL.loadMatrix(mTexture0.m); +    gGL.loadMatrix(glm::value_ptr(mTexture0));      mVB->setBuffer(); @@ -954,6 +955,25 @@ LLVertexBuffer::LLVertexBuffer(U32 typemask)      }  } +// list of mapped buffers +// NOTE: must not be LLPointer<LLVertexBuffer> to avoid breaking non-ref-counted LLVertexBuffer instances +static std::vector<LLVertexBuffer*> sMappedBuffers; + +//static +void LLVertexBuffer::flushBuffers() +{ +    LL_PROFILE_ZONE_SCOPED_CATEGORY_VERTEX; +    // must only be called from main thread +    llassert(LLCoros::on_main_thread_main_coro()); +    for (auto& buffer : sMappedBuffers) +    { +        buffer->_unmapBuffer(); +        buffer->mMapped = false; +    } + +    sMappedBuffers.resize(0); +} +  //static  U32 LLVertexBuffer::calcOffsets(const U32& typemask, U32* offsets, U32 num_vertices)  { @@ -997,6 +1017,12 @@ U32 LLVertexBuffer::calcVertexSize(const U32& typemask)  //virtual  LLVertexBuffer::~LLVertexBuffer()  { +    if (mMapped) +    { // is on the mapped buffer list but doesn't need to be flushed +        mMapped = false; +        unmapBuffer(); +    } +      destroyGLBuffer();      destroyGLIndices(); @@ -1198,6 +1224,7 @@ bool expand_region(LLVertexBuffer::MappedRegion& region, U32 start, U32 end)  U8* LLVertexBuffer::mapVertexBuffer(LLVertexBuffer::AttributeType type, U32 index, S32 count)  {      LL_PROFILE_ZONE_SCOPED_CATEGORY_VERTEX; +    _mapBuffer();      if (count == -1)      { @@ -1233,6 +1260,7 @@ U8* LLVertexBuffer::mapVertexBuffer(LLVertexBuffer::AttributeType type, U32 inde  U8* LLVertexBuffer::mapIndexBuffer(U32 index, S32 count)  {      LL_PROFILE_ZONE_SCOPED_CATEGORY_VERTEX; +    _mapBuffer();      if (count == -1)      { @@ -1289,11 +1317,11 @@ void LLVertexBuffer::flush_vbo(GLenum target, U32 start, U32 end, void* data, U8          LL_PROFILE_ZONE_NUM(end);          LL_PROFILE_ZONE_NUM(end-start); -        constexpr U32 block_size = 8192; +        constexpr U32 block_size = 65536;          for (U32 i = start; i <= end; i += block_size)          { -            LL_PROFILE_ZONE_NAMED_CATEGORY_VERTEX("glBufferSubData block"); +            //LL_PROFILE_ZONE_NAMED_CATEGORY_VERTEX("glBufferSubData block");              //LL_PROFILE_GPU_ZONE("glBufferSubData");              U32 tend = llmin(i + block_size, end);              U32 size = tend - i + 1; @@ -1305,7 +1333,28 @@ void LLVertexBuffer::flush_vbo(GLenum target, U32 start, U32 end, void* data, U8  void LLVertexBuffer::unmapBuffer()  { +    flushBuffers(); +} + +void LLVertexBuffer::_mapBuffer() +{ +    // must only be called from main thread +    llassert(LLCoros::on_main_thread_main_coro()); +    if (!mMapped) +    { +        mMapped = true; +        sMappedBuffers.push_back(this); +    } +} + +void LLVertexBuffer::_unmapBuffer() +{      STOP_GLERROR; +    if (!mMapped) +    { +        return; +    } +      struct SortMappedRegion      {          bool operator()(const MappedRegion& lhs, const MappedRegion& rhs) @@ -1549,6 +1598,13 @@ void LLVertexBuffer::setBuffer()          return;      }  #endif + +    if (mMapped) +    { +        LL_WARNS_ONCE() << "Missing call to unmapBuffer or flushBuffers" << LL_ENDL; +        _unmapBuffer(); +    } +      // no data may be pending      llassert(mMappedVertexRegions.empty());      llassert(mMappedIndexRegions.empty()); diff --git a/indra/llrender/llvertexbuffer.h b/indra/llrender/llvertexbuffer.h index 2a4affdc60..d4c6fbaf18 100644 --- a/indra/llrender/llvertexbuffer.h +++ b/indra/llrender/llvertexbuffer.h @@ -38,6 +38,7 @@  #include <set>  #include <vector>  #include <list> +#include <glm/gtc/matrix_transform.hpp>  #define LL_MAX_VERTEX_ATTRIB_LOCATION 64 @@ -63,8 +64,11 @@ public:          , mMode(0)          , mCount(0)          , mTexName(0) +        , mProjection(glm::identity<glm::mat4>()) +        , mModelView(glm::identity<glm::mat4>()) +        , mTexture0(glm::identity<glm::mat4>())      {} -    LLVertexBufferData(LLVertexBuffer* buffer, U8 mode, U32 count, U32 tex_name, glh::matrix4f model_view, glh::matrix4f projection, glh::matrix4f texture0) +    LLVertexBufferData(LLVertexBuffer* buffer, U8 mode, U32 count, U32 tex_name, const glm::mat4& model_view, const glm::mat4& projection, const glm::mat4& texture0)          : mVB(buffer)          , mMode(mode)          , mCount(count) @@ -78,9 +82,9 @@ public:      U8 mMode;      U32 mCount;      U32 mTexName; -    glh::matrix4f mProjection; -    glh::matrix4f mModelView; -    glh::matrix4f mTexture0; +    glm::mat4 mProjection; +    glm::mat4 mModelView; +    glm::mat4 mTexture0;  };  typedef std::list<LLVertexBufferData> buffer_data_list_t; @@ -120,6 +124,9 @@ public:      // indexed by the following enum      static U32 calcOffsets(const U32& typemask, U32* offsets, U32 num_vertices); +    // flush any pending mapped buffers +    static void flushBuffers(); +      //WARNING -- when updating these enums you MUST      // 1 - update LLVertexBuffer::sTypeSize      // 2 - update LLVertexBuffer::vb_type_name @@ -190,6 +197,8 @@ public:      // map for data access (see also getFooStrider below)      U8*     mapVertexBuffer(AttributeType type, U32 index, S32 count = -1);      U8*     mapIndexBuffer(U32 index, S32 count = -1); + +    // synonym for flushBuffers      void    unmapBuffer();      // set for rendering @@ -312,6 +321,13 @@ private:      bool    allocateBuffer(S32 nverts, S32 nindices, bool create) { return allocateBuffer(nverts, nindices); } +    // actually unmap buffer +    void _unmapBuffer(); + +    // add to set of mapped buffers +    void _mapBuffer(); +    bool mMapped = false; +  public:      static U64 getBytesAllocated(); diff --git a/indra/llui/llurlentry.cpp b/indra/llui/llurlentry.cpp index 79d2fcd049..3cc0c05ffa 100644 --- a/indra/llui/llurlentry.cpp +++ b/indra/llui/llurlentry.cpp @@ -600,15 +600,15 @@ void LLUrlEntryAgent::callObservers(const std::string &id,  void LLUrlEntryAgent::onAvatarNameCache(const LLUUID& id,                                          const LLAvatarName& av_name)  { -    avatar_name_cache_connection_map_t::iterator it = mAvatarNameCacheConnections.find(id); -    if (it != mAvatarNameCacheConnections.end()) +    auto range = mAvatarNameCacheConnections.equal_range(id); +    for (avatar_name_cache_connection_map_t::iterator it = range.first; it != range.second; ++it)      {          if (it->second.connected())          {              it->second.disconnect();          } -        mAvatarNameCacheConnections.erase(it);      } +    mAvatarNameCacheConnections.erase(range.first, range.second);      std::string label = av_name.getCompleteName(); @@ -695,16 +695,7 @@ std::string LLUrlEntryAgent::getLabel(const std::string &url, const LLUrlLabelCa      }      else      { -        avatar_name_cache_connection_map_t::iterator it = mAvatarNameCacheConnections.find(agent_id); -        if (it != mAvatarNameCacheConnections.end()) -        { -            if (it->second.connected()) -            { -                it->second.disconnect(); -            } -            mAvatarNameCacheConnections.erase(it); -        } -        mAvatarNameCacheConnections[agent_id] = LLAvatarNameCache::get(agent_id, boost::bind(&LLUrlEntryAgent::onAvatarNameCache, this, _1, _2)); +        mAvatarNameCacheConnections.emplace(agent_id, LLAvatarNameCache::get(agent_id, boost::bind(&LLUrlEntryAgent::onAvatarNameCache, this, _1, _2)));          addObserver(agent_id_string, url, cb);          return LLTrans::getString("LoadingData"); @@ -770,17 +761,17 @@ LLUrlEntryAgentName::LLUrlEntryAgentName()  {}  void LLUrlEntryAgentName::onAvatarNameCache(const LLUUID& id, -                                        const LLAvatarName& av_name) +                                            const LLAvatarName& av_name)  { -    avatar_name_cache_connection_map_t::iterator it = mAvatarNameCacheConnections.find(id); -    if (it != mAvatarNameCacheConnections.end()) +    auto range = mAvatarNameCacheConnections.equal_range(id); +    for (avatar_name_cache_connection_map_t::iterator it = range.first; it != range.second; ++it)      {          if (it->second.connected())          {              it->second.disconnect();          } -        mAvatarNameCacheConnections.erase(it);      } +    mAvatarNameCacheConnections.erase(range.first, range.second);      std::string label = getName(av_name);      // received the agent name from the server - tell our observers @@ -815,16 +806,7 @@ std::string LLUrlEntryAgentName::getLabel(const std::string &url, const LLUrlLab      }      else      { -        avatar_name_cache_connection_map_t::iterator it = mAvatarNameCacheConnections.find(agent_id); -        if (it != mAvatarNameCacheConnections.end()) -        { -            if (it->second.connected()) -            { -                it->second.disconnect(); -            } -            mAvatarNameCacheConnections.erase(it); -        } -        mAvatarNameCacheConnections[agent_id] = LLAvatarNameCache::get(agent_id, boost::bind(&LLUrlEntryAgentName::onAvatarNameCache, this, _1, _2)); +        mAvatarNameCacheConnections.emplace(agent_id, LLAvatarNameCache::get(agent_id, boost::bind(&LLUrlEntryAgentName::onAvatarNameCache, this, _1, _2)));          addObserver(agent_id_string, url, cb);          return LLTrans::getString("LoadingData"); diff --git a/indra/llui/llurlentry.h b/indra/llui/llurlentry.h index 84ff278942..fffee88496 100644 --- a/indra/llui/llurlentry.h +++ b/indra/llui/llurlentry.h @@ -232,7 +232,7 @@ protected:  private:      void onAvatarNameCache(const LLUUID& id, const LLAvatarName& av_name); -    typedef std::map<LLUUID, boost::signals2::connection> avatar_name_cache_connection_map_t; +    typedef std::multimap<LLUUID, boost::signals2::connection> avatar_name_cache_connection_map_t;      avatar_name_cache_connection_map_t mAvatarNameCacheConnections;  }; @@ -264,7 +264,7 @@ protected:  private:      void onAvatarNameCache(const LLUUID& id, const LLAvatarName& av_name); -    typedef std::map<LLUUID, boost::signals2::connection> avatar_name_cache_connection_map_t; +    typedef std::multimap<LLUUID, boost::signals2::connection> avatar_name_cache_connection_map_t;      avatar_name_cache_connection_map_t mAvatarNameCacheConnections;  }; diff --git a/indra/llwindow/CMakeLists.txt b/indra/llwindow/CMakeLists.txt index 7b1430c67c..2996f58fe0 100644 --- a/indra/llwindow/CMakeLists.txt +++ b/indra/llwindow/CMakeLists.txt @@ -17,6 +17,7 @@ include(LLImage)  include(LLWindow)  include(UI)  include(ViewerMiscLibs) +include(GLM)  set(llwindow_SOURCE_FILES      llcursortypes.cpp @@ -54,7 +55,7 @@ set(llwindow_LINK_LIBRARIES          llrender          llfilesystem          llxml -        ll::glh_linear +        ll::glm          ll::glext          ll::uilibraries          ll::SDL diff --git a/indra/newview/gltfscenemanager.cpp b/indra/newview/gltfscenemanager.cpp index e55d630940..ce54fa4c12 100644 --- a/indra/newview/gltfscenemanager.cpp +++ b/indra/newview/gltfscenemanager.cpp @@ -807,10 +807,10 @@ void GLTFSceneManager::bind(Asset& asset, Material& material)  LLMatrix4a inverse(const LLMatrix4a& mat)  { -    glh::matrix4f m((F32*)mat.mMatrix); -    m = m.inverse(); +    glm::mat4 m = glm::make_mat4((F32*)mat.mMatrix); +    m = glm::inverse(m);      LLMatrix4a ret; -    ret.loadu(m.m); +    ret.loadu(glm::value_ptr(m));      return ret;  } diff --git a/indra/newview/llattachmentsmgr.cpp b/indra/newview/llattachmentsmgr.cpp index deabcd9f42..8b5db2c0fa 100644 --- a/indra/newview/llattachmentsmgr.cpp +++ b/indra/newview/llattachmentsmgr.cpp @@ -465,7 +465,7 @@ bool LLAttachmentsMgr::isAttachmentStateComplete() const  //  void LLAttachmentsMgr::checkInvalidCOFLinks()  { -    if (!gInventory.isInventoryUsable()) +    if (!gInventory.isInventoryUsable() || mQuestionableCOFLinks.empty())      {          return;      } diff --git a/indra/newview/lldrawable.cpp b/indra/newview/lldrawable.cpp index ae48db24bc..70ae4ee13f 100644 --- a/indra/newview/lldrawable.cpp +++ b/indra/newview/lldrawable.cpp @@ -1067,16 +1067,16 @@ F32 LLDrawable::getVisibilityRadius() const      {          return 0.f;      } -    else if (isLight()) + +    if (isLight())      { -        const LLVOVolume *vov = getVOVolume(); -        if (vov) +        if (const LLVOVolume* vov = getVOVolume())          {              return llmax(getRadius(), vov->getLightRadius()); -        } else { -            // LL_WARNS() ?          } +        // LL_WARNS() ?      } +      return getRadius();  } @@ -1089,16 +1089,14 @@ bool LLDrawable::isVisible() const  {      if (LLViewerOctreeEntryData::isVisible())      { -            return true; +        return true;      } +    LLViewerOctreeGroup* group = mEntry->getGroup(); +    if (group && group->isVisible())      { -        LLViewerOctreeGroup* group = mEntry->getGroup(); -        if (group && group->isVisible()) -        { -            LLViewerOctreeEntryData::setVisible(); -            return true; -        } +        LLViewerOctreeEntryData::setVisible(); +        return true;      }      return false; @@ -1107,27 +1105,30 @@ bool LLDrawable::isVisible() const  //virtual  bool LLDrawable::isRecentlyVisible() const  { -    //currently visible or visible in the previous frame. -    bool vis = LLViewerOctreeEntryData::isRecentlyVisible(); +    // Currently visible or visible in the previous frame. +    if (LLViewerOctreeEntryData::isRecentlyVisible()) +    { +        return true; +    } -    if(!vis) +    const U32 MIN_VIS_FRAME_RANGE = 2 ; // Two frames: the current one and the last one. +    if (sCurVisible - getVisible() < MIN_VIS_FRAME_RANGE)      { -        const U32 MIN_VIS_FRAME_RANGE = 2 ; //two frames:the current one and the last one. -        vis = (sCurVisible - getVisible() < MIN_VIS_FRAME_RANGE); +        return true;      } -    return vis ; +    return false;  }  void LLDrawable::setGroup(LLViewerOctreeGroup *groupp) -    { +{      LLSpatialGroup* cur_groupp = (LLSpatialGroup*)getGroup();      //precondition: mGroupp MUST be null or DEAD or mGroupp MUST NOT contain this      //llassert(!cur_groupp || cur_groupp->isDead() || !cur_groupp->hasElement(this));      //precondition: groupp MUST be null or groupp MUST contain this -    llassert(!groupp || (LLSpatialGroup*)groupp->hasElement(this)); +    llassert(!groupp || groupp->hasElement(this));      if (cur_groupp != groupp && getVOVolume())      { @@ -1136,8 +1137,7 @@ void LLDrawable::setGroup(LLViewerOctreeGroup *groupp)          //contained by its drawable's spatial group          for (S32 i = 0; i < getNumFaces(); ++i)          { -            LLFace* facep = getFace(i); -            if (facep) +            if (LLFace* facep = getFace(i))              {                  facep->clearVertexBuffer();              } @@ -1166,7 +1166,7 @@ LLSpatialPartition* LLDrawable::getSpatialPartition()          !getVOVolume() ||          isStatic())      { -        retval = gPipeline.getSpatialPartition((LLViewerObject*)mVObjp); +        retval = gPipeline.getSpatialPartition(mVObjp);      }      else if (isRoot())      { @@ -1274,13 +1274,12 @@ LLSpatialBridge::LLSpatialBridge(LLDrawable* root, bool render_by_group, U32 dat  LLSpatialBridge::~LLSpatialBridge()  { -    if(mEntry) +    if (mEntry)      { -    LLSpatialGroup* group = getSpatialGroup(); -    if (group) -    { -        group->getSpatialPartition()->remove(this, group); -    } +        if (LLSpatialGroup* group = getSpatialGroup()) +        { +            group->getSpatialPartition()->remove(this, group); +        }      }      //delete octree here so listeners will still be able to access bridge specific state diff --git a/indra/newview/llface.cpp b/indra/newview/llface.cpp index ccfef09b09..48fddc32db 100644 --- a/indra/newview/llface.cpp +++ b/indra/newview/llface.cpp @@ -1487,9 +1487,9 @@ bool LLFace::getGeometryVolume(const LLVolume& volume,              }              //TODO -- cache this (check profile marker above)? -            glh::matrix4f m((F32*) skin->mBindShapeMatrix.getF32ptr()); -            m = m.inverse().transpose(); -            mat_normal.loadu(m.m); +            glm::mat4 m = glm::make_mat4((F32*)skin->mBindShapeMatrix.getF32ptr()); +            m = glm::transpose(glm::inverse(m)); +            mat_normal.loadu(glm::value_ptr(m));          }          else          { @@ -1741,7 +1741,7 @@ bool LLFace::getGeometryVolume(const LLVolume& volume,              { //bump mapped or has material, just do the whole expensive loop                  LL_PROFILE_ZONE_NAMED_CATEGORY_FACE("getGeometryVolume - texgen default"); -                std::vector<LLVector2> bump_tc; +                LLStrider<LLVector2> bump_tc;                  if (mat && !mat->getNormalID().isNull())                  { //writing out normal and specular texture coordinates, not bump offsets @@ -1803,49 +1803,70 @@ bool LLFace::getGeometryVolume(const LLVolume& volume,                      }                      const bool do_xform = (xforms & xform_channel) != XFORM_NONE; +                    // hold onto strider to front of TC array for use later +                    bump_tc = dst; -                    for (S32 i = 0; i < num_vertices; i++)                      { -                        LLVector2 tc(vf.mTexCoords[i]); - -                        LLVector4a& norm = vf.mNormals[i]; - -                        LLVector4a& center = *(vf.mCenter); - -                        if (texgen != LLTextureEntry::TEX_GEN_DEFAULT) +                        // NOTE: split TEX_GEN_PLANAR implementation to reduce branchiness of inner loop +                        // These are per-vertex operations and every little bit counts +                        if (texgen == LLTextureEntry::TEX_GEN_PLANAR)                          { -                            LLVector4a vec = vf.mPositions[i]; +                            LL_PROFILE_ZONE_NAMED_CATEGORY_FACE("tgd - planar"); +                            for (S32 i = 0; i < num_vertices; i++) +                            { +                                LLVector2 tc(vf.mTexCoords[i]); +                                LLVector4a& norm = vf.mNormals[i]; +                                LLVector4a& center = *(vf.mCenter); +                                LLVector4a vec = vf.mPositions[i]; -                            vec.mul(scalea); +                                vec.mul(scalea); -                            if (texgen == LLTextureEntry::TEX_GEN_PLANAR) -                            {                                  planarProjection(tc, norm, center, vec); -                            } -                        } -                        if (tex_mode && mTextureMatrix) -                        { -                            LLVector3 tmp(tc.mV[0], tc.mV[1], 0.f); -                            tmp = tmp * *mTextureMatrix; -                            tc.mV[0] = tmp.mV[0]; -                            tc.mV[1] = tmp.mV[1]; +                                if (tex_mode && mTextureMatrix) +                                { +                                    LLVector3 tmp(tc.mV[0], tc.mV[1], 0.f); +                                    tmp = tmp * *mTextureMatrix; +                                    tc.mV[0] = tmp.mV[0]; +                                    tc.mV[1] = tmp.mV[1]; +                                } +                                else if (do_xform) +                                { +                                    xform(tc, cos_ang, sin_ang, os, ot, ms, mt); +                                } + +                                *dst++ = tc; +                            }                          } -                        else if (do_xform) +                        else                          { -                            xform(tc, cos_ang, sin_ang, os, ot, ms, mt); -                        } +                            LL_PROFILE_ZONE_NAMED_CATEGORY_FACE("tgd - transform"); -                        *dst++ = tc; -                        if (do_bump) -                        { -                            bump_tc.push_back(tc); +                            for (S32 i = 0; i < num_vertices; i++) +                            { +                                LLVector2 tc(vf.mTexCoords[i]); + +                                if (tex_mode && mTextureMatrix) +                                { +                                    LLVector3 tmp(tc.mV[0], tc.mV[1], 0.f); +                                    tmp = tmp * *mTextureMatrix; +                                    tc.mV[0] = tmp.mV[0]; +                                    tc.mV[1] = tmp.mV[1]; +                                } +                                else if (do_xform) +                                { +                                    xform(tc, cos_ang, sin_ang, os, ot, ms, mt); +                                } + +                                *dst++ = tc; +                            }                          }                      }                  }                  if ((!mat && !gltf_mat) && do_bump)                  { +                    LL_PROFILE_ZONE_NAMED_CATEGORY_FACE("tgd - do bump");                      mVertexBuffer->getTexCoord1Strider(tex_coords1, mGeomIndex, mGeomCount);                      mVObjp->getVolume()->genTangents(face_index); diff --git a/indra/newview/llglsandbox.cpp b/indra/newview/llglsandbox.cpp index 930a8c28d9..0248f5710f 100644 --- a/indra/newview/llglsandbox.cpp +++ b/indra/newview/llglsandbox.cpp @@ -1121,57 +1121,6 @@ F32 gpu_benchmark()      LLGLSLShader::unbind(); -    F32 time_passed = 0; // seconds - -    { //run CPU timer benchmark -        glFinish(); -        gBenchmarkProgram.bind(); -        for (S32 c = -1; c < samples && time_passed < time_limit; ++c) -        { -            LLTimer timer; -            timer.start(); - -            for (U32 i = 0; i < count; ++i) -            { -                dest[i].bindTarget(); -                texHolder.bind(i); -                buff->setBuffer(); -                buff->drawArrays(LLRender::TRIANGLES, 0, 3); -                dest[i].flush(); -            } - -            //wait for current batch of copies to finish -            glFinish(); - -            F32 time = timer.getElapsedTimeF32(); -            time_passed += time; - -            if (c >= 0) // <-- ignore the first sample as it tends to be artificially slow -            { -                //store result in gigabytes per second -                F32 gb = (F32)((F64)(res * res * 8 * count)) / (1000000000); -                F32 gbps = gb / time; -                results.push_back(gbps); -            } -        } -        gBenchmarkProgram.unbind(); -    } - -    std::sort(results.begin(), results.end()); - -    F32 gbps = results[results.size()/2]; - -    LL_INFOS("Benchmark") << "Memory bandwidth is " << llformat("%.3f", gbps) << " GB/sec according to CPU timers, " << (F32)results.size() << " tests took " << time_passed << " seconds" << LL_ENDL; - -#if LL_DARWIN -    if (gbps > 512.f) -    { -        LL_WARNS("Benchmark") << "Memory bandwidth is improbably high and likely incorrect; discarding result." << LL_ENDL; -        //OSX is probably lying, discard result -        return -1.f; -    } -#endif -      // run GPU timer benchmark      {          ShaderProfileHelper initProfile; @@ -1196,7 +1145,7 @@ F32 gpu_benchmark()      F64 samples_drawn = (F64)gBenchmarkProgram.mSamplesDrawn;      F64 gpixels_drawn = samples_drawn / 1000000000.0;      F32 samples_sec = (F32)(gpixels_drawn/seconds); -    gbps = samples_sec*4;  // 4 bytes per sample +    F32 gbps = samples_sec*4;  // 4 bytes per sample      LL_INFOS("Benchmark") << "Memory bandwidth is " << llformat("%.3f", gbps) << " GB/sec according to ARB_timer_query, total time " << seconds << " seconds" << LL_ENDL; diff --git a/indra/newview/llgltfmaterialpreviewmgr.cpp b/indra/newview/llgltfmaterialpreviewmgr.cpp index e38ba8762a..294b445694 100644 --- a/indra/newview/llgltfmaterialpreviewmgr.cpp +++ b/indra/newview/llgltfmaterialpreviewmgr.cpp @@ -471,10 +471,10 @@ bool LLGLTFPreviewTexture::render()      PreviewSphere& preview_sphere = get_preview_sphere(mGLTFMaterial, object_transform);      gPipeline.setupHWLights(); -    glh::matrix4f mat = copy_matrix(gGLModelView); -    glh::vec4f transformed_light_dir(light_dir.mV); -    mat.mult_matrix_vec(transformed_light_dir); -    SetTemporarily<LLVector4> force_sun_direction_high_graphics(&gPipeline.mTransformedSunDir, LLVector4(transformed_light_dir.v)); +    glm::mat4 mat = get_current_modelview(); +    glm::vec4 transformed_light_dir = glm::make_vec4(light_dir.mV); +    transformed_light_dir = mat * transformed_light_dir; +    SetTemporarily<LLVector4> force_sun_direction_high_graphics(&gPipeline.mTransformedSunDir, LLVector4(glm::value_ptr(transformed_light_dir)));      // Override lights to ensure the sun is always shining from a certain direction (low graphics)      // See also force_sun_direction_high_graphics and fixup_shader_constants      { diff --git a/indra/newview/llhudrender.cpp b/indra/newview/llhudrender.cpp index f027aa5552..4180e49e94 100644 --- a/indra/newview/llhudrender.cpp +++ b/indra/newview/llhudrender.cpp @@ -38,6 +38,9 @@  #include "llviewerwindow.h"  #include "llui.h" +#include <glm/gtc/matrix_transform.hpp> +#include <glm/gtc/type_ptr.hpp> +  void hud_render_utf8text(const std::string &str, const LLVector3 &pos_agent,                       LLFontVertexBuffer *font_buffer,                       const LLFontGL &font, @@ -102,26 +105,10 @@ void hud_render_text(const LLWString &wstr, const LLVector3 &pos_agent,      //get the render_pos in screen space -    F64 winX, winY, winZ;      LLRect world_view_rect = gViewerWindow->getWorldViewRectRaw(); -    S32 viewport[4]; -    viewport[0] = world_view_rect.mLeft; -    viewport[1] = world_view_rect.mBottom; -    viewport[2] = world_view_rect.getWidth(); -    viewport[3] = world_view_rect.getHeight(); - -    F64 mdlv[16]; -    F64 proj[16]; - -    for (U32 i = 0; i < 16; i++) -    { -        mdlv[i] = (F64) gGLModelView[i]; -        proj[i] = (F64) gGLProjection[i]; -    } +    glm::ivec4 viewport(world_view_rect.mLeft, world_view_rect.mBottom, world_view_rect.getWidth(), world_view_rect.getHeight()); -    gluProject(render_pos.mV[0], render_pos.mV[1], render_pos.mV[2], -                mdlv, proj, (GLint*) viewport, -                &winX, &winY, &winZ); +    glm::vec3 win_coord = glm::project(glm::make_vec3(render_pos.mV), get_current_modelview(), get_current_projection(), viewport);      //fonts all render orthographically, set up projection``      gGL.matrixMode(LLRender::MM_PROJECTION); @@ -133,11 +120,11 @@ void hud_render_text(const LLWString &wstr, const LLVector3 &pos_agent,      gl_state_for_2d(world_view_rect.getWidth(), world_view_rect.getHeight());      gViewerWindow->setup3DViewport(); -    winX -= world_view_rect.mLeft; -    winY -= world_view_rect.mBottom; +    win_coord.x -= world_view_rect.mLeft; +    win_coord.y -= world_view_rect.mBottom;      LLUI::loadIdentity();      gGL.loadIdentity(); -    LLUI::translate((F32) winX*1.0f/LLFontGL::sScaleX, (F32) winY*1.0f/(LLFontGL::sScaleY), -(((F32) winZ*2.f)-1.f)); +    LLUI::translate((F32) win_coord.x*1.0f/LLFontGL::sScaleX, (F32) win_coord.y*1.0f/(LLFontGL::sScaleY), -(((F32) win_coord.z*2.f)-1.f));      F32 right_x;      if (font_buffer) diff --git a/indra/newview/llmaniptranslate.cpp b/indra/newview/llmaniptranslate.cpp index c9c7d26d33..060fe0d600 100644 --- a/indra/newview/llmaniptranslate.cpp +++ b/indra/newview/llmaniptranslate.cpp @@ -1676,9 +1676,9 @@ void LLManipTranslate::highlightIntersection(LLVector3 normal,              normal = -normal;          }          F32 d = -(selection_center * normal); -        glh::vec4f plane(normal.mV[0], normal.mV[1], normal.mV[2], d ); +        glm::vec4 plane(normal.mV[0], normal.mV[1], normal.mV[2], d ); -        gGL.getModelviewMatrix().inverse().mult_vec_matrix(plane); +        plane = glm::inverse(gGL.getModelviewMatrix()) * plane;          static LLStaticHashedString sClipPlane("clip_plane");          gClipProgram.uniform4fv(sClipPlane, 1, plane.v); diff --git a/indra/newview/llmodelpreview.cpp b/indra/newview/llmodelpreview.cpp index df573bd785..ef09cfa55b 100644 --- a/indra/newview/llmodelpreview.cpp +++ b/indra/newview/llmodelpreview.cpp @@ -2828,9 +2828,9 @@ void LLModelPreview::genBuffers(S32 lod, bool include_skin_weights)          LLMatrix4a mat_normal;          if (skinned)          { -            glh::matrix4f m((F32*)mdl->mSkinInfo.mBindShapeMatrix.getF32ptr()); -            m = m.inverse().transpose(); -            mat_normal.loadu(m.m); +            glm::mat4 m = glm::make_mat4((F32*)mdl->mSkinInfo.mBindShapeMatrix.getF32ptr()); +            m = glm::transpose(glm::inverse(m)); +            mat_normal.loadu(glm::value_ptr(m));          }          S32 num_faces = mdl->getNumVolumeFaces(); diff --git a/indra/newview/llpanelprimmediacontrols.cpp b/indra/newview/llpanelprimmediacontrols.cpp index 4e905ae0fd..4db0a5b59d 100644 --- a/indra/newview/llpanelprimmediacontrols.cpp +++ b/indra/newview/llpanelprimmediacontrols.cpp @@ -63,11 +63,10 @@  #include "llfloatertools.h"  // to enable hide if build tools are up  #include "llvector4a.h" -// Functions pulled from pipeline.cpp -glh::matrix4f get_current_modelview(); -glh::matrix4f get_current_projection(); +#include <glm/gtx/transform2.hpp> +  // Functions pulled from llviewerdisplay.cpp -bool get_hud_matrices(glh::matrix4f &proj, glh::matrix4f &model); +bool get_hud_matrices(glm::mat4 &proj, glm::mat4 &model);  // Warning: make sure these two match!  const LLPanelPrimMediaControls::EZoomLevel LLPanelPrimMediaControls::kZoomLevels[] = { ZOOM_NONE, ZOOM_MEDIUM }; @@ -646,13 +645,13 @@ void LLPanelPrimMediaControls::updateShape()          vert_it = vect_face.begin();          vert_end = vect_face.end(); -        glh::matrix4f mat; +        glm::mat4 mat;          if (!is_hud)          {              mat = get_current_projection() * get_current_modelview();          }          else { -            glh::matrix4f proj, modelview; +            glm::mat4 proj, modelview;              if (get_hud_matrices(proj, modelview))                  mat = proj * modelview;          } @@ -661,11 +660,11 @@ void LLPanelPrimMediaControls::updateShape()          for(; vert_it != vert_end; ++vert_it)          {              // project silhouette vertices into screen space -            glh::vec3f screen_vert = glh::vec3f(vert_it->mV); -            mat.mult_matrix_vec(screen_vert); +            glm::vec3 screen_vert(glm::make_vec3(vert_it->mV)); +            screen_vert = mul_mat4_vec3(mat, screen_vert);              // add to screenspace bounding box -            update_min_max(min, max, LLVector3(screen_vert.v)); +            update_min_max(min, max, LLVector3(glm::value_ptr(screen_vert)));          }          // convert screenspace bbox to pixels (in screen coords) diff --git a/indra/newview/llreflectionmap.cpp b/indra/newview/llreflectionmap.cpp index 8d164b6883..f77d37f821 100644 --- a/indra/newview/llreflectionmap.cpp +++ b/indra/newview/llreflectionmap.cpp @@ -253,23 +253,22 @@ bool LLReflectionMap::getBox(LLMatrix4& box)          LLVolume* volume = mViewerObject->getVolume();          if (volume && mViewerObject->getReflectionProbeIsBox())          { -            glh::matrix4f mv(gGLModelView); -            glh::matrix4f scale; +            glm::mat4 mv(get_current_modelview());              LLVector3 s = mViewerObject->getScale().scaledVec(LLVector3(0.5f, 0.5f, 0.5f));              mRadius = s.magVec(); -            scale.set_scale(glh::vec3f(s.mV)); +            glm::mat4 scale = glm::scale(glm::make_vec3(s.mV));              if (mViewerObject->mDrawable != nullptr)              {                  // object to agent space (no scale) -                glh::matrix4f rm((F32*)mViewerObject->mDrawable->getWorldMatrix().mMatrix); +                glm::mat4 rm(glm::make_mat4((F32*)mViewerObject->mDrawable->getWorldMatrix().mMatrix));                  // construct object to camera space (with scale)                  mv = mv * rm * scale;                  // inverse is camera space to object unit cube -                mv = mv.inverse(); +                mv = glm::inverse(mv); -                box = LLMatrix4(mv.m); +                box = LLMatrix4(glm::value_ptr(mv));                  return true;              } diff --git a/indra/newview/llselectmgr.cpp b/indra/newview/llselectmgr.cpp index 342048252f..51da051340 100644 --- a/indra/newview/llselectmgr.cpp +++ b/indra/newview/llselectmgr.cpp @@ -103,20 +103,12 @@ LLViewerObject* getSelectedParentObject(LLViewerObject *object) ;  // Consts  // -const F32 SILHOUETTE_UPDATE_THRESHOLD_SQUARED = 0.02f; -const S32 MAX_SILS_PER_FRAME = 50; -const S32 MAX_OBJECTS_PER_PACKET = 254; +constexpr F32 SILHOUETTE_UPDATE_THRESHOLD_SQUARED = 0.02f; +constexpr S32 MAX_SILS_PER_FRAME = 50; +constexpr S32 MAX_OBJECTS_PER_PACKET = 254;  // For linked sets -const S32 MAX_CHILDREN_PER_TASK = 255; +constexpr S32 MAX_CHILDREN_PER_TASK = 255; -// -// Globals -// - -//bool gDebugSelectMgr = false; - -//bool gHideSelectedObjects = false; -//bool gAllowSelectAvatar = false;  bool LLSelectMgr::sRectSelectInclusive = true;  bool LLSelectMgr::sRenderHiddenSelections = true; diff --git a/indra/newview/llsettingsvo.cpp b/indra/newview/llsettingsvo.cpp index e05b6f3736..6f9de57d2a 100644 --- a/indra/newview/llsettingsvo.cpp +++ b/indra/newview/llsettingsvo.cpp @@ -996,38 +996,33 @@ void LLSettingsVOWater::applySpecial(void *ptarget, bool force)          }          //transform water plane to eye space -        glh::vec3f norm(0.f, 0.f, 1.f); -        glh::vec3f p(0.f, 0.f, water_height); +        glm::vec3 norm(0.f, 0.f, 1.f); +        glm::vec3 p(0.f, 0.f, water_height); -        F32 modelView[16]; -        for (U32 i = 0; i < 16; i++) -        { -            modelView[i] = (F32)gGLModelView[i]; -        } +        glm::mat4 mat = get_current_modelview(); +        glm::mat4 invtrans = glm::transpose(glm::inverse(mat)); +        invtrans[0][3] = invtrans[1][3] = invtrans[2][3] = 0.f; -        glh::matrix4f mat(modelView); -        glh::matrix4f invtrans = mat.inverse().transpose(); -        invtrans.m[3] = invtrans.m[7] = invtrans.m[11] = 0.f; -        glh::vec3f enorm; -        glh::vec3f ep; -        invtrans.mult_matrix_vec(norm, enorm); -        enorm.normalize(); -        mat.mult_matrix_vec(p, ep); +        glm::vec3 enorm; +        glm::vec3 ep; +        enorm = mul_mat4_vec3(invtrans, norm); +        enorm = glm::normalize(enorm); +        ep = mul_mat4_vec3(mat, p); -        LLVector4 waterPlane(enorm.v[0], enorm.v[1], enorm.v[2], -ep.dot(enorm)); +        LLVector4 waterPlane(enorm.x, enorm.y, enorm.z, -glm::dot(ep, enorm)); -        norm = glh::vec3f(gPipeline.mHeroProbeManager.mMirrorNormal.mV); -        p    = glh::vec3f(gPipeline.mHeroProbeManager.mMirrorPosition.mV); -        invtrans.mult_matrix_vec(norm, enorm); -        enorm.normalize(); -        mat.mult_matrix_vec(p, ep); +        norm = glm::make_vec3(gPipeline.mHeroProbeManager.mMirrorNormal.mV); +        p    = glm::make_vec3(gPipeline.mHeroProbeManager.mMirrorPosition.mV); +        enorm = mul_mat4_vec3(invtrans, norm); +        enorm = glm::normalize(enorm); +        ep = mul_mat4_vec3(mat, p); -        LLVector4 mirrorPlane(enorm.v[0], enorm.v[1], enorm.v[2], -ep.dot(enorm)); +        glm::vec4 mirrorPlane(enorm, -glm::dot(ep, enorm));          LLDrawPoolAlpha::sWaterPlane = waterPlane;          shader->uniform4fv(LLShaderMgr::WATER_WATERPLANE, waterPlane.mV); -        shader->uniform4fv(LLShaderMgr::CLIP_PLANE, mirrorPlane.mV); +        shader->uniform4fv(LLShaderMgr::CLIP_PLANE, glm::value_ptr(mirrorPlane));          LLVector4 light_direction = env.getClampedLightNorm();          if (gPipeline.mHeroProbeManager.isMirrorPass()) diff --git a/indra/newview/llskinningutil.cpp b/indra/newview/llskinningutil.cpp index 9b4ed4c946..1c92e06700 100644 --- a/indra/newview/llskinningutil.cpp +++ b/indra/newview/llskinningutil.cpp @@ -315,11 +315,9 @@ void LLSkinningUtil::initJointNums(LLMeshSkinInfo* skin, LLVOAvatar *avatar)      }  } -static LLTrace::BlockTimerStatHandle FTM_FACE_RIGGING_INFO("Face Rigging Info"); -  void LLSkinningUtil::updateRiggingInfo(const LLMeshSkinInfo* skin, LLVOAvatar *avatar, LLVolumeFace& vol_face)  { -    LL_RECORD_BLOCK_TIME(FTM_FACE_RIGGING_INFO); +    LL_PROFILE_ZONE_SCOPED_CATEGORY_AVATAR;      if (vol_face.mJointRiggingInfoTab.needsUpdate())      { diff --git a/indra/newview/llterrainpaintmap.cpp b/indra/newview/llterrainpaintmap.cpp index 4381d14546..8ccde74c93 100644 --- a/indra/newview/llterrainpaintmap.cpp +++ b/indra/newview/llterrainpaintmap.cpp @@ -111,12 +111,12 @@ bool LLTerrainPaintMap::bakeHeightNoiseIntoPBRPaintMapRGB(const LLViewerRegion&      const LLRect texture_rect(0, scratch_target.getHeight(), scratch_target.getWidth(), 0);      glViewport(texture_rect.mLeft, texture_rect.mBottom, texture_rect.getWidth(), texture_rect.getHeight());      // Manually get modelview matrix from camera orientation. -    glh::matrix4f modelview((GLfloat *) OGL_TO_CFR_ROTATION); +    glm::mat4 modelview(glm::make_mat4((GLfloat *) OGL_TO_CFR_ROTATION));      GLfloat ogl_matrix[16];      camera.getOpenGLTransform(ogl_matrix); -    modelview *= glh::matrix4f(ogl_matrix); +    modelview *= glm::make_mat4(ogl_matrix);      gGL.matrixMode(LLRender::MM_MODELVIEW); -    gGL.loadMatrix(modelview.m); +    gGL.loadMatrix(glm::value_ptr(modelview));      // Override the projection matrix from the camera      gGL.matrixMode(LLRender::MM_PROJECTION);      gGL.pushMatrix(); diff --git a/indra/newview/lltoolselect.cpp b/indra/newview/lltoolselect.cpp index cc04f9e3fc..5ccda7d4eb 100644 --- a/indra/newview/lltoolselect.cpp +++ b/indra/newview/lltoolselect.cpp @@ -48,11 +48,8 @@  #include "llvoavatarself.h"  #include "llworld.h" -// Globals -//extern bool gAllowSelectAvatar; - -const F32 SELECTION_ROTATION_TRESHOLD = 0.1f; -const F32 SELECTION_SITTING_ROTATION_TRESHOLD = 3.2f; //radian +constexpr F32 SELECTION_ROTATION_TRESHOLD = 0.1f; +constexpr F32 SELECTION_SITTING_ROTATION_TRESHOLD = 3.2f; //radian  LLToolSelect::LLToolSelect( LLToolComposite* composite )  :   LLTool( std::string("Select"), composite ), diff --git a/indra/newview/llviewercamera.cpp b/indra/newview/llviewercamera.cpp index 766280e145..aa43b2dbad 100644 --- a/indra/newview/llviewercamera.cpp +++ b/indra/newview/llviewercamera.cpp @@ -60,28 +60,6 @@ LLTrace::CountStatHandle<> LLViewerCamera::sAngularVelocityStat("camera_angular_  LLViewerCamera::eCameraID LLViewerCamera::sCurCameraID = LLViewerCamera::CAMERA_WORLD; -//glu pick matrix implementation borrowed from Mesa3D -glh::matrix4f gl_pick_matrix(GLfloat x, GLfloat y, GLfloat width, GLfloat height, GLint* viewport) -{ -    GLfloat m[16]; -    GLfloat sx, sy; -    GLfloat tx, ty; - -    sx = viewport[2] / width; -    sy = viewport[3] / height; -    tx = (viewport[2] + 2.f * (viewport[0] - x)) / width; -    ty = (viewport[3] + 2.f * (viewport[1] - y)) / height; - -    #define M(row,col) m[col*4+row] -    M(0,0) = sx; M(0,1) = 0.f; M(0,2) = 0.f; M(0,3) = tx; -    M(1,0) = 0.f; M(1,1) = sy; M(1,2) = 0.f; M(1,3) = ty; -    M(2,0) = 0.f; M(2,1) = 0.f; M(2,2) = 1.f; M(2,3) = 0.f; -    M(3,0) = 0.f; M(3,1) = 0.f; M(3,2) = 0.f; M(3,3) = 1.f; -    #undef M - -    return glh::matrix4f(m); -} -  LLViewerCamera::LLViewerCamera() : LLCamera()  {      calcProjection(getFar()); @@ -204,59 +182,52 @@ void LLViewerCamera::calcProjection(const F32 far_distance) const  //static  void LLViewerCamera::updateFrustumPlanes(LLCamera& camera, bool ortho, bool zflip, bool no_hacks)  { -    GLint* viewport = (GLint*) gGLViewport; -    F64 model[16]; -    F64 proj[16]; - -    for (U32 i = 0; i < 16; i++) -    { -        model[i] = (F64) gGLModelView[i]; -        proj[i] = (F64) gGLProjection[i]; -    } - -    GLdouble objX,objY,objZ; +    glm::ivec4 viewport = glm::make_vec4((GLint*) gGLViewport); +    glm::mat4 model = get_current_modelview(); +    glm::mat4 proj = get_current_projection();      LLVector3 frust[8]; +    glm::vec3 obj;      if (no_hacks)      { -        gluUnProject(viewport[0],viewport[1],0,model,proj,viewport,&objX,&objY,&objZ); -        frust[0].setVec((F32)objX,(F32)objY,(F32)objZ); -        gluUnProject(viewport[0]+viewport[2],viewport[1],0,model,proj,viewport,&objX,&objY,&objZ); -        frust[1].setVec((F32)objX,(F32)objY,(F32)objZ); -        gluUnProject(viewport[0]+viewport[2],viewport[1]+viewport[3],0,model,proj,viewport,&objX,&objY,&objZ); -        frust[2].setVec((F32)objX,(F32)objY,(F32)objZ); -        gluUnProject(viewport[0],viewport[1]+viewport[3],0,model,proj,viewport,&objX,&objY,&objZ); -        frust[3].setVec((F32)objX,(F32)objY,(F32)objZ); - -        gluUnProject(viewport[0],viewport[1],1,model,proj,viewport,&objX,&objY,&objZ); -        frust[4].setVec((F32)objX,(F32)objY,(F32)objZ); -        gluUnProject(viewport[0]+viewport[2],viewport[1],1,model,proj,viewport,&objX,&objY,&objZ); -        frust[5].setVec((F32)objX,(F32)objY,(F32)objZ); -        gluUnProject(viewport[0]+viewport[2],viewport[1]+viewport[3],1,model,proj,viewport,&objX,&objY,&objZ); -        frust[6].setVec((F32)objX,(F32)objY,(F32)objZ); -        gluUnProject(viewport[0],viewport[1]+viewport[3],1,model,proj,viewport,&objX,&objY,&objZ); -        frust[7].setVec((F32)objX,(F32)objY,(F32)objZ); +        obj = glm::unProject(glm::vec3(viewport[0], viewport[1], 0), model, proj, viewport); +        frust[0].setVec(glm::value_ptr(obj)); +        obj = glm::unProject(glm::vec3(viewport[0]+viewport[2],viewport[1],0),model,proj,viewport); +        frust[1].setVec(glm::value_ptr(obj)); +        obj = glm::unProject(glm::vec3(viewport[0]+viewport[2],viewport[1]+viewport[3],0),model,proj,viewport); +        frust[2].setVec(glm::value_ptr(obj)); +        obj = glm::unProject(glm::vec3(viewport[0],viewport[1]+viewport[3],0),model,proj,viewport); +        frust[3].setVec(glm::value_ptr(obj)); + +        obj = glm::unProject(glm::vec3(viewport[0],viewport[1],1),model,proj,viewport); +        frust[4].setVec(glm::value_ptr(obj)); +        obj = glm::unProject(glm::vec3(viewport[0]+viewport[2],viewport[1],1),model,proj,viewport); +        frust[5].setVec(glm::value_ptr(obj)); +        obj = glm::unProject(glm::vec3(viewport[0]+viewport[2],viewport[1]+viewport[3],1),model,proj,viewport); +        frust[6].setVec(glm::value_ptr(obj)); +        obj = glm::unProject(glm::vec3(viewport[0],viewport[1]+viewport[3],1),model,proj,viewport); +        frust[7].setVec(glm::value_ptr(obj));      }      else if (zflip)      { -        gluUnProject(viewport[0],viewport[1]+viewport[3],0,model,proj,viewport,&objX,&objY,&objZ); -        frust[0].setVec((F32)objX,(F32)objY,(F32)objZ); -        gluUnProject(viewport[0]+viewport[2],viewport[1]+viewport[3],0,model,proj,viewport,&objX,&objY,&objZ); -        frust[1].setVec((F32)objX,(F32)objY,(F32)objZ); -        gluUnProject(viewport[0]+viewport[2],viewport[1],0,model,proj,viewport,&objX,&objY,&objZ); -        frust[2].setVec((F32)objX,(F32)objY,(F32)objZ); -        gluUnProject(viewport[0],viewport[1],0,model,proj,viewport,&objX,&objY,&objZ); -        frust[3].setVec((F32)objX,(F32)objY,(F32)objZ); - -        gluUnProject(viewport[0],viewport[1]+viewport[3],1,model,proj,viewport,&objX,&objY,&objZ); -        frust[4].setVec((F32)objX,(F32)objY,(F32)objZ); -        gluUnProject(viewport[0]+viewport[2],viewport[1]+viewport[3],1,model,proj,viewport,&objX,&objY,&objZ); -        frust[5].setVec((F32)objX,(F32)objY,(F32)objZ); -        gluUnProject(viewport[0]+viewport[2],viewport[1],1,model,proj,viewport,&objX,&objY,&objZ); -        frust[6].setVec((F32)objX,(F32)objY,(F32)objZ); -        gluUnProject(viewport[0],viewport[1],1,model,proj,viewport,&objX,&objY,&objZ); -        frust[7].setVec((F32)objX,(F32)objY,(F32)objZ); +        obj = glm::unProject(glm::vec3(viewport[0],viewport[1]+viewport[3],0),model,proj,viewport); +        frust[0].setVec(glm::value_ptr(obj)); +        obj = glm::unProject(glm::vec3(viewport[0]+viewport[2],viewport[1]+viewport[3],0),model,proj,viewport); +        frust[1].setVec(glm::value_ptr(obj)); +        obj = glm::unProject(glm::vec3(viewport[0]+viewport[2],viewport[1],0),model,proj,viewport); +        frust[2].setVec(glm::value_ptr(obj)); +        obj = glm::unProject(glm::vec3(viewport[0],viewport[1],0),model,proj,viewport); +        frust[3].setVec(glm::value_ptr(obj)); + +        obj = glm::unProject(glm::vec3(viewport[0],viewport[1]+viewport[3],1),model,proj,viewport); +        frust[4].setVec(glm::value_ptr(obj)); +        obj = glm::unProject(glm::vec3(viewport[0]+viewport[2],viewport[1]+viewport[3],1),model,proj,viewport); +        frust[5].setVec(glm::value_ptr(obj)); +        obj = glm::unProject(glm::vec3(viewport[0]+viewport[2],viewport[1],1),model,proj,viewport); +        frust[6].setVec(glm::value_ptr(obj)); +        obj = glm::unProject(glm::vec3(viewport[0],viewport[1],1),model,proj,viewport); +        frust[7].setVec(glm::value_ptr(obj));          for (U32 i = 0; i < 4; i++)          { @@ -267,14 +238,14 @@ void LLViewerCamera::updateFrustumPlanes(LLCamera& camera, bool ortho, bool zfli      }      else      { -        gluUnProject(viewport[0],viewport[1],0,model,proj,viewport,&objX,&objY,&objZ); -        frust[0].setVec((F32)objX,(F32)objY,(F32)objZ); -        gluUnProject(viewport[0]+viewport[2],viewport[1],0,model,proj,viewport,&objX,&objY,&objZ); -        frust[1].setVec((F32)objX,(F32)objY,(F32)objZ); -        gluUnProject(viewport[0]+viewport[2],viewport[1]+viewport[3],0,model,proj,viewport,&objX,&objY,&objZ); -        frust[2].setVec((F32)objX,(F32)objY,(F32)objZ); -        gluUnProject(viewport[0],viewport[1]+viewport[3],0,model,proj,viewport,&objX,&objY,&objZ); -        frust[3].setVec((F32)objX,(F32)objY,(F32)objZ); +        obj = glm::unProject(glm::vec3(viewport[0],viewport[1],0),model,proj,viewport); +        frust[0].setVec(glm::value_ptr(obj)); +        obj = glm::unProject(glm::vec3(viewport[0]+viewport[2],viewport[1],0),model,proj,viewport); +        frust[1].setVec(glm::value_ptr(obj)); +        obj = glm::unProject(glm::vec3(viewport[0]+viewport[2],viewport[1]+viewport[3],0),model,proj,viewport); +        frust[2].setVec(glm::value_ptr(obj)); +        obj = glm::unProject(glm::vec3(viewport[0],viewport[1]+viewport[3],0),model,proj,viewport); +        frust[3].setVec(glm::value_ptr(obj));          if (ortho)          { @@ -304,7 +275,7 @@ void LLViewerCamera::setPerspective(bool for_selection,                                      F32 z_near, F32 z_far)  {      F32 fov_y, aspect; -    fov_y = RAD_TO_DEG * getView(); +    fov_y = getView();      bool z_default_far = false;      if (z_far <= 0)      { @@ -321,20 +292,19 @@ void LLViewerCamera::setPerspective(bool for_selection,      gGL.matrixMode(LLRender::MM_PROJECTION);      gGL.loadIdentity(); -    glh::matrix4f proj_mat; +    glm::mat4 proj_mat = glm::identity<glm::mat4>();      if (for_selection)      {          // make a tiny little viewport          // anything drawn into this viewport will be "selected" -        GLint viewport[4]; -        viewport[0] = gViewerWindow->getWorldViewRectRaw().mLeft; -        viewport[1] = gViewerWindow->getWorldViewRectRaw().mBottom; -        viewport[2] = gViewerWindow->getWorldViewRectRaw().getWidth(); -        viewport[3] = gViewerWindow->getWorldViewRectRaw().getHeight(); +        glm::ivec4 viewport(gViewerWindow->getWorldViewRectRaw().mLeft, +            gViewerWindow->getWorldViewRectRaw().mBottom, +            gViewerWindow->getWorldViewRectRaw().getWidth(), +            gViewerWindow->getWorldViewRectRaw().getHeight()); -        proj_mat = gl_pick_matrix(x+width/2.f, y_from_bot+height/2.f, (GLfloat) width, (GLfloat) height, viewport); +        proj_mat = glm::pickMatrix(glm::vec2(x + width / 2.f, y_from_bot + height / 2.f), glm::vec2((GLfloat)width, (GLfloat)height), viewport);          if (limit_select_distance)          { @@ -365,37 +335,35 @@ void LLViewerCamera::setPerspective(bool for_selection,          float offset = mZoomFactor - 1.f;          int pos_y = mZoomSubregion / llceil(mZoomFactor);          int pos_x = mZoomSubregion - (pos_y*llceil(mZoomFactor)); -        glh::matrix4f translate; -        translate.set_translate(glh::vec3f(offset - (F32)pos_x * 2.f, offset - (F32)pos_y * 2.f, 0.f)); -        glh::matrix4f scale; -        scale.set_scale(glh::vec3f(mZoomFactor, mZoomFactor, 1.f)); -        proj_mat = scale*proj_mat; -        proj_mat = translate*proj_mat; +        glm::mat4 translate; +        translate = glm::translate(glm::vec3(offset - (F32)pos_x * 2.f, offset - (F32)pos_y * 2.f, 0.f)); +        glm::mat4 scale; +        scale = glm::scale(glm::vec3(mZoomFactor, mZoomFactor, 1.f)); + +        proj_mat = scale * proj_mat; +        proj_mat = translate * proj_mat;      }      calcProjection(z_far); // Update the projection matrix cache -    proj_mat *= gl_perspective(fov_y,aspect,z_near,z_far); +    proj_mat *= glm::perspective(fov_y,aspect,z_near,z_far); -    gGL.loadMatrix(proj_mat.m); +    gGL.loadMatrix(glm::value_ptr(proj_mat)); -    for (U32 i = 0; i < 16; i++) -    { -        gGLProjection[i] = proj_mat.m[i]; -    } +    set_current_projection(proj_mat);      gGL.matrixMode(LLRender::MM_MODELVIEW); -    glh::matrix4f modelview((GLfloat*) OGL_TO_CFR_ROTATION); +    glm::mat4 modelview(glm::make_mat4((GLfloat*) OGL_TO_CFR_ROTATION));      GLfloat         ogl_matrix[16];      getOpenGLTransform(ogl_matrix); -    modelview *= glh::matrix4f(ogl_matrix); +    modelview *= glm::make_mat4(ogl_matrix); -    gGL.loadMatrix(modelview.m); +    gGL.loadMatrix(glm::value_ptr(modelview));      if (for_selection && (width > 1 || height > 1))      { @@ -413,10 +381,7 @@ void LLViewerCamera::setPerspective(bool for_selection,      if (!for_selection && mZoomFactor == 1.f)      {          // Save GL matrices for access elsewhere in code, especially project_world_to_screen -        for (U32 i = 0; i < 16; i++) -        { -            gGLModelView[i] = modelview.m[i]; -        } +        set_current_modelview(modelview);      }      updateFrustumPlanes(*this); @@ -427,24 +392,8 @@ void LLViewerCamera::setPerspective(bool for_selection,  // screen coordinates to the agent's region.  void LLViewerCamera::projectScreenToPosAgent(const S32 screen_x, const S32 screen_y, LLVector3* pos_agent) const  { -    GLdouble x, y, z; - -    F64 mdlv[16]; -    F64 proj[16]; - -    for (U32 i = 0; i < 16; i++) -    { -        mdlv[i] = (F64) gGLModelView[i]; -        proj[i] = (F64) gGLProjection[i]; -    } - -    gluUnProject( -        GLdouble(screen_x), GLdouble(screen_y), 0.0, -        mdlv, proj, (GLint*)gGLViewport, -        &x, -        &y, -        &z ); -    pos_agent->setVec( (F32)x, (F32)y, (F32)z ); +    glm::vec3 agent_coord = glm::unProject(glm::vec3(screen_x, screen_y, 0.f), get_current_modelview(), get_current_projection(), glm::make_vec4(gGLViewport)); +    pos_agent->setVec( (F32)agent_coord.x, (F32)agent_coord.y, (F32)agent_coord.z );  }  // Uses the last GL matrices set in set_perspective to project a point from @@ -453,7 +402,6 @@ void LLViewerCamera::projectScreenToPosAgent(const S32 screen_x, const S32 scree  bool LLViewerCamera::projectPosAgentToScreen(const LLVector3 &pos_agent, LLCoordGL &out_point, const bool clamp) const  {      bool in_front = true; -    GLdouble    x, y, z;            // object's window coords, GL-style      LLVector3 dir_to_point = pos_agent - getOrigin();      dir_to_point /= dir_to_point.magVec(); @@ -471,35 +419,20 @@ bool LLViewerCamera::projectPosAgentToScreen(const LLVector3 &pos_agent, LLCoord      }      LLRect world_view_rect = gViewerWindow->getWorldViewRectRaw(); -    S32 viewport[4]; -    viewport[0] = world_view_rect.mLeft; -    viewport[1] = world_view_rect.mBottom; -    viewport[2] = world_view_rect.getWidth(); -    viewport[3] = world_view_rect.getHeight(); - -    F64 mdlv[16]; -    F64 proj[16]; - -    for (U32 i = 0; i < 16; i++) -    { -        mdlv[i] = (F64) gGLModelView[i]; -        proj[i] = (F64) gGLProjection[i]; -    } +    glm::ivec4 viewport(world_view_rect.mLeft, world_view_rect.mBottom, world_view_rect.getWidth(), world_view_rect.getHeight()); +    glm::vec3 win_coord = glm::project(glm::make_vec3(pos_agent.mV), get_current_modelview(), get_current_projection(), viewport); -    if (GL_TRUE == gluProject(pos_agent.mV[VX], pos_agent.mV[VY], pos_agent.mV[VZ], -                                mdlv, proj, (GLint*)viewport, -                                &x, &y, &z))      {          // convert screen coordinates to virtual UI coordinates -        x /= gViewerWindow->getDisplayScale().mV[VX]; -        y /= gViewerWindow->getDisplayScale().mV[VY]; +        win_coord.x /= gViewerWindow->getDisplayScale().mV[VX]; +        win_coord.y /= gViewerWindow->getDisplayScale().mV[VY];          // should now have the x,y coords of grab_point in screen space          LLRect world_rect = gViewerWindow->getWorldViewRectScaled();          // convert to pixel coordinates -        S32 int_x = lltrunc(x); -        S32 int_y = lltrunc(y); +        S32 int_x = lltrunc(win_coord.x); +        S32 int_y = lltrunc(win_coord.y);          bool valid = true; @@ -561,10 +494,6 @@ bool LLViewerCamera::projectPosAgentToScreen(const LLVector3 &pos_agent, LLCoord              return in_front && valid;          }      } -    else -    { -        return false; -    }  }  // Uses the last GL matrices set in set_perspective to project a point from @@ -583,49 +512,33 @@ bool LLViewerCamera::projectPosAgentToScreenEdge(const LLVector3 &pos_agent,      }      LLRect world_view_rect = gViewerWindow->getWorldViewRectRaw(); -    S32 viewport[4]; -    viewport[0] = world_view_rect.mLeft; -    viewport[1] = world_view_rect.mBottom; -    viewport[2] = world_view_rect.getWidth(); -    viewport[3] = world_view_rect.getHeight(); -    GLdouble    x, y, z;            // object's window coords, GL-style -    F64 mdlv[16]; -    F64 proj[16]; - -    for (U32 i = 0; i < 16; i++) -    { -        mdlv[i] = (F64) gGLModelView[i]; -        proj[i] = (F64) gGLProjection[i]; -    } +    glm::ivec4 viewport(world_view_rect.mLeft, world_view_rect.mBottom, world_view_rect.getWidth(), world_view_rect.getHeight()); +    glm::vec3 win_coord = glm::project(glm::make_vec3(pos_agent.mV), get_current_modelview(), get_current_projection(), viewport); -    if (GL_TRUE == gluProject(pos_agent.mV[VX], pos_agent.mV[VY], -                              pos_agent.mV[VZ], mdlv, -                              proj, (GLint*)viewport, -                              &x, &y, &z))      { -        x /= gViewerWindow->getDisplayScale().mV[VX]; -        y /= gViewerWindow->getDisplayScale().mV[VY]; +        win_coord.x /= gViewerWindow->getDisplayScale().mV[VX]; +        win_coord.y /= gViewerWindow->getDisplayScale().mV[VY];          // should now have the x,y coords of grab_point in screen space          const LLRect& world_rect = gViewerWindow->getWorldViewRectScaled();          // ...sanity check -        S32 int_x = lltrunc(x); -        S32 int_y = lltrunc(y); +        S32 int_x = lltrunc(win_coord.x); +        S32 int_y = lltrunc(win_coord.y);          // find the center -        GLdouble center_x = (GLdouble)world_rect.getCenterX(); -        GLdouble center_y = (GLdouble)world_rect.getCenterY(); +        F32 center_x = (F32)world_rect.getCenterX(); +        F32 center_y = (F32)world_rect.getCenterY(); -        if (x == center_x  &&  y == center_y) +        if (win_coord.x == center_x  && win_coord.y == center_y)          {              // can't project to edge from exact center              return false;          }          // find the line from center to local -        GLdouble line_x = x - center_x; -        GLdouble line_y = y - center_y; +        F32 line_x = win_coord.x - center_x; +        F32 line_y = win_coord.y - center_y;          int_x = lltrunc(center_x);          int_y = lltrunc(center_y); @@ -646,11 +559,11 @@ bool LLViewerCamera::projectPosAgentToScreenEdge(const LLVector3 &pos_agent,          else if (0 == world_rect.getWidth())          {              // the diagonal slope of the view is undefined -            if (y < world_rect.mBottom) +            if (win_coord.y < world_rect.mBottom)              {                  int_y = world_rect.mBottom;              } -            else if ( y > world_rect.mTop) +            else if (win_coord.y > world_rect.mTop)              {                  int_y = world_rect.mTop;              } @@ -672,7 +585,7 @@ bool LLViewerCamera::projectPosAgentToScreenEdge(const LLVector3 &pos_agent,                      // top                      int_y = world_rect.mTop;                  } -                int_x = lltrunc(((GLdouble)int_y - center_y) / line_slope + center_x); +                int_x = lltrunc(((F32)int_y - center_y) / line_slope + center_x);              }              else if (fabs(line_slope) < rect_slope)              { @@ -686,7 +599,7 @@ bool LLViewerCamera::projectPosAgentToScreenEdge(const LLVector3 &pos_agent,                      // right                      int_x = world_rect.mRight;                  } -                int_y = lltrunc(((GLdouble)int_x - center_x) * line_slope + center_y); +                int_y = lltrunc(((F32)int_x - center_x) * line_slope + center_y);              }              else              { diff --git a/indra/newview/llviewerdisplay.cpp b/indra/newview/llviewerdisplay.cpp index 9bd0973cc0..301ea5c5f6 100644 --- a/indra/newview/llviewerdisplay.cpp +++ b/indra/newview/llviewerdisplay.cpp @@ -81,6 +81,10 @@  #include "llenvironment.h"  #include "llperfstats.h" +#include <glm/glm.hpp> +#include <glm/gtc/matrix_transform.hpp> +#include <glm/gtc/type_ptr.hpp> +  extern LLPointer<LLViewerTexture> gStartTexture;  extern bool gShiftFrame; @@ -760,8 +764,8 @@ void display(bool rebuild, F32 zoom_factor, int subfield, bool for_snapshot)                  LLGLState::checkStates(); -                glh::matrix4f proj = get_current_projection(); -                glh::matrix4f mod = get_current_modelview(); +                glm::mat4 proj = get_current_projection(); +                glm::mat4 mod = get_current_modelview();                  glViewport(0,0,512,512);                  LLVOAvatar::updateImpostors(); @@ -769,9 +773,9 @@ void display(bool rebuild, F32 zoom_factor, int subfield, bool for_snapshot)                  set_current_projection(proj);                  set_current_modelview(mod);                  gGL.matrixMode(LLRender::MM_PROJECTION); -                gGL.loadMatrix(proj.m); +                gGL.loadMatrix(glm::value_ptr(proj));                  gGL.matrixMode(LLRender::MM_MODELVIEW); -                gGL.loadMatrix(mod.m); +                gGL.loadMatrix(glm::value_ptr(mod));                  gViewerWindow->setup3DViewport();                  LLGLState::checkStates(); @@ -1148,8 +1152,8 @@ void render_hud_attachments()      gGL.matrixMode(LLRender::MM_MODELVIEW);      gGL.pushMatrix(); -    glh::matrix4f current_proj = get_current_projection(); -    glh::matrix4f current_mod = get_current_modelview(); +    glm::mat4 current_proj = get_current_projection(); +    glm::mat4 current_mod = get_current_modelview();      // clamp target zoom level to reasonable values      gAgentCamera.mHUDTargetZoom = llclamp(gAgentCamera.mHUDTargetZoom, 0.1f, 1.f); @@ -1273,7 +1277,7 @@ LLRect get_whole_screen_region()      return whole_screen;  } -bool get_hud_matrices(const LLRect& screen_region, glh::matrix4f &proj, glh::matrix4f &model) +bool get_hud_matrices(const LLRect& screen_region, glm::mat4 &proj, glm::mat4&model)  {      if (isAgentAvatarValid() && gAgentAvatarp->hasHUDAttachment())      { @@ -1281,28 +1285,29 @@ bool get_hud_matrices(const LLRect& screen_region, glh::matrix4f &proj, glh::mat          LLBBox hud_bbox = gAgentAvatarp->getHUDBBox();          F32 hud_depth = llmax(1.f, hud_bbox.getExtentLocal().mV[VX] * 1.1f); -        proj = gl_ortho(-0.5f * LLViewerCamera::getInstance()->getAspect(), 0.5f * LLViewerCamera::getInstance()->getAspect(), -0.5f, 0.5f, 0.f, hud_depth); -        proj.element(2,2) = -0.01f; +        proj = glm::ortho(-0.5f * LLViewerCamera::getInstance()->getAspect(), 0.5f * LLViewerCamera::getInstance()->getAspect(), -0.5f, 0.5f, 0.f, hud_depth); +        proj[2][2] = -0.01f;          F32 aspect_ratio = LLViewerCamera::getInstance()->getAspect(); -        glh::matrix4f mat;          F32 scale_x = (F32)gViewerWindow->getWorldViewWidthScaled() / (F32)screen_region.getWidth();          F32 scale_y = (F32)gViewerWindow->getWorldViewHeightScaled() / (F32)screen_region.getHeight(); -        mat.set_scale(glh::vec3f(scale_x, scale_y, 1.f)); -        mat.set_translate( -            glh::vec3f(clamp_rescale((F32)(screen_region.getCenterX() - screen_region.mLeft), 0.f, (F32)gViewerWindow->getWorldViewWidthScaled(), 0.5f * scale_x * aspect_ratio, -0.5f * scale_x * aspect_ratio), -                       clamp_rescale((F32)(screen_region.getCenterY() - screen_region.mBottom), 0.f, (F32)gViewerWindow->getWorldViewHeightScaled(), 0.5f * scale_y, -0.5f * scale_y), -                       0.f)); -        proj *= mat; - -        glh::matrix4f tmp_model((GLfloat*) OGL_TO_CFR_ROTATION); -        mat.set_scale(glh::vec3f(zoom_level, zoom_level, zoom_level)); -        mat.set_translate(glh::vec3f(-hud_bbox.getCenterLocal().mV[VX] + (hud_depth * 0.5f), 0.f, 0.f)); +        glm::mat4 mat = glm::identity<glm::mat4>(); +        mat = glm::translate(mat, +            glm::vec3(clamp_rescale((F32)(screen_region.getCenterX() - screen_region.mLeft), 0.f, (F32)gViewerWindow->getWorldViewWidthScaled(), 0.5f * scale_x * aspect_ratio, -0.5f * scale_x * aspect_ratio), +                clamp_rescale((F32)(screen_region.getCenterY() - screen_region.mBottom), 0.f, (F32)gViewerWindow->getWorldViewHeightScaled(), 0.5f * scale_y, -0.5f * scale_y), +                0.f)); +        mat = glm::scale(mat, glm::vec3(scale_x, scale_y, 1.f)); +        proj *= mat; +        glm::mat4 tmp_model = glm::make_mat4(OGL_TO_CFR_ROTATION); +        mat = glm::identity<glm::mat4>(); +        mat = glm::translate(mat, glm::vec3(-hud_bbox.getCenterLocal().mV[VX] + (hud_depth * 0.5f), 0.f, 0.f)); +        mat = glm::scale(mat, glm::vec3(zoom_level));          tmp_model *= mat;          model = tmp_model; +          return true;      }      else @@ -1311,7 +1316,7 @@ bool get_hud_matrices(const LLRect& screen_region, glh::matrix4f &proj, glh::mat      }  } -bool get_hud_matrices(glh::matrix4f &proj, glh::matrix4f &model) +bool get_hud_matrices(glm::mat4 &proj, glm::mat4&model)  {      LLRect whole_screen = get_whole_screen_region();      return get_hud_matrices(whole_screen, proj, model); @@ -1325,17 +1330,17 @@ bool setup_hud_matrices()  bool setup_hud_matrices(const LLRect& screen_region)  { -    glh::matrix4f proj, model; +    glm::mat4 proj, model;      bool result = get_hud_matrices(screen_region, proj, model);      if (!result) return result;      // set up transform to keep HUD objects in front of camera      gGL.matrixMode(LLRender::MM_PROJECTION); -    gGL.loadMatrix(proj.m); +    gGL.loadMatrix(glm::value_ptr(proj));      set_current_projection(proj);      gGL.matrixMode(LLRender::MM_MODELVIEW); -    gGL.loadMatrix(model.m); +    gGL.loadMatrix(glm::value_ptr(model));      set_current_modelview(model);      return true;  } @@ -1347,13 +1352,13 @@ void render_ui(F32 zoom_factor, int subfield)      LL_PROFILE_GPU_ZONE("ui");      LLGLState::checkStates(); -    glh::matrix4f saved_view = get_current_modelview(); +    glm::mat4 saved_view = get_current_modelview();      if (!gSnapshot)      {          gGL.pushMatrix();          gGL.loadMatrix(gGLLastModelView); -        set_current_modelview(copy_matrix(gGLLastModelView)); +        set_current_modelview(glm::make_mat4(gGLLastModelView));      }      if(LLSceneMonitor::getInstance()->needsUpdate()) diff --git a/indra/newview/llviewermenu.cpp b/indra/newview/llviewermenu.cpp index d8c4e03d93..df60130c9f 100644 --- a/indra/newview/llviewermenu.cpp +++ b/indra/newview/llviewermenu.cpp @@ -154,27 +154,18 @@ typedef LLPointer<LLViewerObject> LLViewerObjectPtr;  static boost::unordered_map<std::string, LLStringExplicit> sDefaultItemLabels; -bool enable_land_build(void*); -bool enable_object_build(void*); +LLVOAvatar* find_avatar_from_object(LLViewerObject* object); +LLVOAvatar* find_avatar_from_object(const LLUUID& object_id); -LLVOAvatar* find_avatar_from_object( LLViewerObject* object ); -LLVOAvatar* find_avatar_from_object( const LLUUID& object_id ); - -void handle_test_load_url(void*); +void handle_test_load_url();  //  // Evil hackish imported globals -//extern bool   gHideSelectedObjects; -//extern bool gAllowSelectAvatar; -//extern bool gDebugAvatarRotation;  extern bool gDebugClicks;  extern bool gDebugWindowProc;  extern bool gShaderProfileFrame; -//extern bool gDebugTextEditorTips; -//extern bool gDebugSelectMgr; -  //  // Globals  // @@ -214,24 +205,22 @@ LLContextMenu* gDetachBodyPartPieMenus[9];  // Local prototypes  // File Menu -void handle_compress_image(void*); -void handle_compress_file_test(void*); +void handle_compress_image(); +void handle_compress_file_test();  // Edit menu -void handle_dump_group_info(void *); -void handle_dump_capabilities_info(void *); +void handle_dump_group_info(); +void handle_dump_capabilities_info();  // Advanced->Consoles menu -void handle_region_dump_settings(void*); -void handle_region_dump_temp_asset_data(void*); -void handle_region_clear_temp_asset_data(void*); +void handle_region_dump_settings(); +void handle_region_dump_temp_asset_data(); +void handle_region_clear_temp_asset_data();  // Object pie menu  bool sitting_on_selection(); -void near_sit_object(); -//void label_sit_or_stand(std::string& label, void*);  // buy and take alias into the same UI positions, so these  // declarations handle this mess.  bool is_selection_buy_not_take(); @@ -246,107 +235,99 @@ void handle_buy_object(LLSaleInfo sale_info);  void handle_buy_contents(LLSaleInfo sale_info);  // Land pie menu -void near_sit_down_point(bool success, void *); - -// Avatar pie menu +void near_sit_down_point(bool success, void*);  // Debug menu - - -void velocity_interpolate( void* ); -void handle_visual_leak_detector_toggle(void*); -void handle_rebake_textures(void*); -bool check_admin_override(void*); -void handle_admin_override_toggle(void*); +void handle_visual_leak_detector_toggle(); +void handle_rebake_textures(); +bool check_admin_override(); +void handle_admin_override_toggle();  #ifdef TOGGLE_HACKED_GODLIKE_VIEWER -void handle_toggle_hacked_godmode(void*); -bool check_toggle_hacked_godmode(void*); -bool enable_toggle_hacked_godmode(void*); +void handle_toggle_hacked_godmode(); +bool check_toggle_hacked_godmode(); +bool enable_toggle_hacked_godmode();  #endif -void toggle_show_xui_names(void *); -bool check_show_xui_names(void *); +void toggle_show_xui_names(); +bool check_show_xui_names();  // Debug UI -void handle_buy_currency_test(void*); +void handle_buy_currency_test(); -void handle_god_mode(void*); +void handle_god_mode();  // God menu -void handle_leave_god_mode(void*); +void handle_leave_god_mode();  void handle_reset_view(); -void handle_duplicate_in_place(void*); - -void handle_object_owner_self(void*); -void handle_object_owner_permissive(void*); -void handle_object_lock(void*); -void handle_object_asset_ids(void*); -void force_take_copy(void*); - -void handle_force_parcel_owner_to_me(void*); -void handle_force_parcel_to_content(void*); -void handle_claim_public_land(void*); - -void handle_god_request_avatar_geometry(void *);    // Hack for easy testing of new avatar geometry -void reload_vertex_shader(void *); -void handle_disconnect_viewer(void *); - -void force_error_breakpoint(void *); -void force_error_llerror(void *); -void force_error_llerror_msg(void*); -void force_error_bad_memory_access(void *); -void force_error_infinite_loop(void *); -void force_error_software_exception(void *); -void force_error_os_exception(void*); -void force_error_driver_crash(void *); -void force_error_coroutine_crash(void *); -void force_error_thread_crash(void *); - -void handle_force_delete(void*); -void print_object_info(void*); -void print_agent_nvpairs(void*); -void toggle_debug_menus(void*); +void handle_object_owner_self(); +void handle_object_owner_permissive(); +void handle_object_lock(); +void handle_object_asset_ids(); +void force_take_copy(); + +void handle_force_parcel_owner_to_me(); +void handle_force_parcel_to_content(); +void handle_claim_public_land(); + +void handle_god_request_avatar_geometry();    // Hack for easy testing of new avatar geometry +void reload_vertex_shader(); +void handle_disconnect_viewer(); + +void force_error_breakpoint(); +void force_error_llerror(); +void force_error_llerror_msg(); +void force_error_bad_memory_access(); +void force_error_infinite_loop(); +void force_error_software_exception(); +void force_error_os_exception(); +void force_error_driver_crash(); +void force_error_coroutine_crash(); +void force_error_thread_crash(); + +void handle_force_delete(); +void print_object_info(); +void print_agent_nvpairs();  void upload_done_callback(const LLUUID& uuid, void* user_data, S32 result, LLExtStat ext_status); -void dump_select_mgr(void*); +void dump_select_mgr(); -void dump_inventory(void*); -void toggle_visibility(void*); -bool get_visibility(void*); +void dump_inventory(); +void toggle_visibility(LLView* viewp); +bool get_visibility(LLView* viewp);  // Avatar Pie menu  void request_friendship(const LLUUID& agent_id);  // Tools menu -void handle_selected_texture_info(void*); +void handle_selected_texture_info();  void handle_selected_material_info(); -void handle_dump_followcam(void*); -void handle_viewer_enable_message_log(void*); -void handle_viewer_disable_message_log(void*); +void handle_dump_followcam(); +void handle_viewer_enable_message_log(); +void handle_viewer_disable_message_log(); -bool enable_buy_land(void*); +bool enable_buy_land();  // Help menu -void handle_test_male(void *); -void handle_test_female(void *); -void handle_dump_attachments(void *); -void handle_dump_avatar_local_textures(void*); -void handle_debug_avatar_textures(void*); -void handle_grab_baked_texture(void*); -bool enable_grab_baked_texture(void*); -void handle_dump_region_object_cache(void*); -void handle_reset_interest_lists(void *); +void handle_test_male(); +void handle_test_female(); +void handle_dump_attachments(); +void handle_dump_avatar_local_textures(); +void handle_debug_avatar_textures(); +void handle_grab_baked_texture(EBakedTextureIndex baked_tex_index); +bool enable_grab_baked_texture(EBakedTextureIndex baked_tex_index); +void handle_dump_region_object_cache(); +void handle_reset_interest_lists(); -bool enable_save_into_task_inventory(void*); +bool enable_save_into_task_inventory();  bool enable_detach(const LLSD& = LLSD()); -void menu_toggle_attached_lights(void* user_data); -void menu_toggle_attached_particles(void* user_data); +void menu_toggle_attached_lights(); +void menu_toggle_attached_particles();  class LLMenuParcelObserver : public LLParcelObserver  { @@ -383,12 +364,12 @@ void LLMenuParcelObserver::changed()          if (!mLandBuyPassHandle.isDead())          {              LLParcel *parcel = LLViewerParcelMgr::getInstance()->getParcelSelection()->getParcel(); -            static_cast<LLMenuItemCallGL*>(mLandBuyPassHandle.get())->setEnabled(LLPanelLandGeneral::enableBuyPass(NULL) && !(parcel->getOwnerID() == gAgent.getID())); +            static_cast<LLMenuItemCallGL*>(mLandBuyPassHandle.get())->setEnabled(LLPanelLandGeneral::enableBuyPass(nullptr) && parcel->getOwnerID() != gAgentID);          }          if (!mLandBuyHandle.isDead())          { -            bool buyable = enable_buy_land(NULL); +            bool buyable = enable_buy_land();              static_cast<LLMenuItemCallGL*>(mLandBuyHandle.get())->setEnabled(buyable);          }      } @@ -444,7 +425,7 @@ void LLSLMMenuUpdater::setMerchantMenu()      if (marketplacelistings_id.isNull())      {          U32 mkt_status = LLMarketplaceData::instance().getSLMStatus(); -        bool is_merchant = (mkt_status == MarketplaceStatusCodes::MARKET_PLACE_MERCHANT) || (mkt_status == MarketplaceStatusCodes::MARKET_PLACE_MIGRATED_MERCHANT); +        bool is_merchant = mkt_status == MarketplaceStatusCodes::MARKET_PLACE_MERCHANT || mkt_status == MarketplaceStatusCodes::MARKET_PLACE_MIGRATED_MERCHANT;          if (is_merchant)          {              gInventory.ensureCategoryForTypeExists(LLFolderType::FT_MARKETPLACE_LISTINGS); @@ -476,12 +457,14 @@ void LLSLMMenuUpdater::checkMerchantStatus(bool force)  void set_merchant_SLM_menu()  { -   if(gSLMMenuUpdater) gSLMMenuUpdater->setMerchantMenu(); +   if (gSLMMenuUpdater) +       gSLMMenuUpdater->setMerchantMenu();  }  void check_merchant_status(bool force)  { -   if(gSLMMenuUpdater) gSLMMenuUpdater->checkMerchantStatus(force); +   if (gSLMMenuUpdater) +       gSLMMenuUpdater->checkMerchantStatus(force);  }  void init_menus() @@ -623,11 +606,11 @@ class LLAdvancedToggleConsole : public view_listener_t          std::string console_type = userdata.asString();          if ("texture" == console_type)          { -            toggle_visibility( (void*)gTextureView ); +            toggle_visibility(gTextureView);          }          else if ("debug" == console_type)          { -            toggle_visibility( (void*)static_cast<LLUICtrl*>(gDebugView->mDebugConsolep)); +            toggle_visibility(gDebugView->mDebugConsolep);          }          else if ("fast timers" == console_type)          { @@ -635,11 +618,11 @@ class LLAdvancedToggleConsole : public view_listener_t          }          else if ("scene view" == console_type)          { -            toggle_visibility( (void*)gSceneView); +            toggle_visibility(gSceneView);          }          else if ("scene monitor" == console_type)          { -            toggle_visibility( (void*)gSceneMonitorView); +            toggle_visibility(gSceneMonitorView);          }          return true; @@ -653,11 +636,11 @@ class LLAdvancedCheckConsole : public view_listener_t          bool new_value = false;          if ("texture" == console_type)          { -            new_value = get_visibility( (void*)gTextureView ); +            new_value = get_visibility(gTextureView);          }          else if ("debug" == console_type)          { -            new_value = get_visibility( (void*)((LLView*)gDebugView->mDebugConsolep) ); +            new_value = get_visibility(gDebugView->mDebugConsolep);          }          else if ("fast timers" == console_type)          { @@ -665,11 +648,11 @@ class LLAdvancedCheckConsole : public view_listener_t          }          else if ("scene view" == console_type)          { -            new_value = get_visibility( (void*) gSceneView); +            new_value = get_visibility(gSceneView);          }          else if ("scene monitor" == console_type)          { -            new_value = get_visibility( (void*) gSceneMonitorView); +            new_value = get_visibility(gSceneMonitorView);          }          return new_value; @@ -690,15 +673,15 @@ class LLAdvancedDumpInfoToConsole : public view_listener_t          std::string info_type = userdata.asString();          if ("region" == info_type)          { -            handle_region_dump_settings(NULL); +            handle_region_dump_settings();          }          else if ("group" == info_type)          { -            handle_dump_group_info(NULL); +            handle_dump_group_info();          }          else if ("capabilities" == info_type)          { -            handle_dump_capabilities_info(NULL); +            handle_dump_capabilities_info();          }          return true;      } @@ -771,7 +754,7 @@ class LLAdvancedClearGroupCache : public view_listener_t  {      bool handleEvent(const LLSD& userdata)      { -        LLGroupMgr::debugClearAllGroups(NULL); +        LLGroupMgr::debugClearAllGroups(nullptr);          return true;      }  }; @@ -782,7 +765,7 @@ class LLAdvancedClearGroupCache : public view_listener_t  /////////////////  // RENDER TYPE //  ///////////////// -U32 render_type_from_string(std::string render_type) +U32 render_type_from_string(std::string_view render_type)  {      if ("simple" == render_type)      { @@ -901,7 +884,7 @@ class LLAdvancedCheckRenderType : public view_listener_t  /////////////  // FEATURE //  ///////////// -U32 feature_from_string(std::string feature) +U32 feature_from_string(std::string_view feature)  {      if ("ui" == feature)      { @@ -1042,7 +1025,7 @@ class LLAdvancedSetDisplayTextureDensity : public view_listener_t  //////////////////  // INFO DISPLAY //  ////////////////// -U64 info_display_from_string(std::string info_display) +U64 info_display_from_string(std::string_view info_display)  {      if ("verify" == info_display)      { @@ -1271,7 +1254,7 @@ class LLAdvancedSelectedTextureInfo : public view_listener_t  {      bool handleEvent(const LLSD& userdata)      { -        handle_selected_texture_info(NULL); +        handle_selected_texture_info();          return true;      }  }; @@ -1307,7 +1290,7 @@ class LLAdvancedDumpScriptedCamera : public view_listener_t  {      bool handleEvent(const LLSD& userdata)      { -        handle_dump_followcam(NULL); +        handle_dump_followcam();          return true;  }  }; @@ -1323,7 +1306,7 @@ class LLAdvancedDumpRegionObjectCache : public view_listener_t  {      bool handleEvent(const LLSD& userdata)      { -        handle_dump_region_object_cache(NULL); +        handle_dump_region_object_cache();          return true;      }  }; @@ -1382,7 +1365,7 @@ class LLAdvancedResetInterestLists : public view_listener_t  {      bool handleEvent(const LLSD &userdata)      {   // Reset all region interest lists -        handle_reset_interest_lists(NULL); +        handle_reset_interest_lists();          return true;      }  }; @@ -1451,7 +1434,7 @@ class LLAdvancedBuyCurrencyTest : public view_listener_t      {      bool handleEvent(const LLSD& userdata)      { -        handle_buy_currency_test(NULL); +        handle_buy_currency_test();          return true;      }  }; @@ -1466,7 +1449,7 @@ class LLAdvancedDumpSelectMgr : public view_listener_t  {      bool handleEvent(const LLSD& userdata)      { -        dump_select_mgr(NULL); +        dump_select_mgr();          return true;      }  }; @@ -1482,7 +1465,7 @@ class LLAdvancedDumpInventory : public view_listener_t  {      bool handleEvent(const LLSD& userdata)      { -        dump_inventory(NULL); +        dump_inventory();          return true;      }  }; @@ -1498,7 +1481,7 @@ class LLAdvancedPrintSelectedObjectInfo : public view_listener_t  {      bool handleEvent(const LLSD& userdata)      { -        print_object_info(NULL); +        print_object_info();          return true;      }  }; @@ -1514,7 +1497,7 @@ class LLAdvancedPrintAgentInfo : public view_listener_t  {      bool handleEvent(const LLSD& userdata)      { -        print_agent_nvpairs(NULL); +        print_agent_nvpairs();          return true;      }  }; @@ -1627,7 +1610,7 @@ class LLAdvancedToggleXUINameTooltips : public view_listener_t  {      bool handleEvent(const LLSD& userdata)      { -        toggle_show_xui_names(NULL); +        toggle_show_xui_names();          return true;      }  }; @@ -1636,7 +1619,7 @@ class LLAdvancedCheckXUINameTooltips : public view_listener_t  {      bool handleEvent(const LLSD& userdata)      { -        bool new_value = check_show_xui_names(NULL); +        bool new_value = check_show_xui_names();          return new_value;      }  }; @@ -1737,7 +1720,7 @@ class LLAdvancedToggleXUINames : public view_listener_t  {      bool handleEvent(const LLSD& userdata)      { -        toggle_show_xui_names(NULL); +        toggle_show_xui_names();          return true;      }  }; @@ -1746,7 +1729,7 @@ class LLAdvancedCheckXUINames : public view_listener_t  {      bool handleEvent(const LLSD& userdata)      { -        bool new_value = check_show_xui_names(NULL); +        bool new_value = check_show_xui_names();          return new_value;      }  }; @@ -1764,27 +1747,27 @@ class LLAdvancedGrabBakedTexture : public view_listener_t          std::string texture_type = userdata.asString();          if ("iris" == texture_type)          { -            handle_grab_baked_texture( (void*)BAKED_EYES ); +            handle_grab_baked_texture(BAKED_EYES);          }          else if ("head" == texture_type)          { -            handle_grab_baked_texture( (void*)BAKED_HEAD ); +            handle_grab_baked_texture(BAKED_HEAD);          }          else if ("upper" == texture_type)          { -            handle_grab_baked_texture( (void*)BAKED_UPPER ); +            handle_grab_baked_texture(BAKED_UPPER);          }          else if ("lower" == texture_type)          { -            handle_grab_baked_texture( (void*)BAKED_LOWER ); +            handle_grab_baked_texture(BAKED_LOWER);          }          else if ("skirt" == texture_type)          { -            handle_grab_baked_texture( (void*)BAKED_SKIRT ); +            handle_grab_baked_texture(BAKED_SKIRT);          }          else if ("hair" == texture_type)          { -            handle_grab_baked_texture( (void*)BAKED_HAIR ); +            handle_grab_baked_texture(BAKED_HAIR);          }          return true; @@ -1800,27 +1783,27 @@ class LLAdvancedEnableGrabBakedTexture : public view_listener_t          if ("iris" == texture_type)          { -            new_value = enable_grab_baked_texture( (void*)BAKED_EYES ); +            new_value = enable_grab_baked_texture(BAKED_EYES);          }          else if ("head" == texture_type)          { -            new_value = enable_grab_baked_texture( (void*)BAKED_HEAD ); +            new_value = enable_grab_baked_texture(BAKED_HEAD);          }          else if ("upper" == texture_type)          { -            new_value = enable_grab_baked_texture( (void*)BAKED_UPPER ); +            new_value = enable_grab_baked_texture(BAKED_UPPER);          }          else if ("lower" == texture_type)          { -            new_value = enable_grab_baked_texture( (void*)BAKED_LOWER ); +            new_value = enable_grab_baked_texture(BAKED_LOWER);          }          else if ("skirt" == texture_type)          { -            new_value = enable_grab_baked_texture( (void*)BAKED_SKIRT ); +            new_value = enable_grab_baked_texture(BAKED_SKIRT);          }          else if ("hair" == texture_type)          { -            new_value = enable_grab_baked_texture( (void*)BAKED_HAIR ); +            new_value = enable_grab_baked_texture(BAKED_HAIR);          }          return new_value; @@ -1905,7 +1888,7 @@ class LLAdvancedToggleCharacterGeometry : public view_listener_t  {      bool handleEvent(const LLSD& userdata)      { -        handle_god_request_avatar_geometry(NULL); +        handle_god_request_avatar_geometry();          return true;  }  }; @@ -1919,7 +1902,7 @@ class LLAdvancedTestMale : public view_listener_t  {      bool handleEvent(const LLSD& userdata)      { -        handle_test_male(NULL); +        handle_test_male();          return true;      }  }; @@ -1929,7 +1912,7 @@ class LLAdvancedTestFemale : public view_listener_t  {      bool handleEvent(const LLSD& userdata)      { -        handle_test_female(NULL); +        handle_test_female();          return true;      }  }; @@ -1938,7 +1921,7 @@ class LLAdvancedForceParamsToDefault : public view_listener_t  {      bool handleEvent(const LLSD& userdata)      { -        LLAgent::clearVisualParams(NULL); +        LLAgent::clearVisualParams(nullptr);          return true;      }  }; @@ -2001,7 +1984,7 @@ class LLAdvancedReloadVertexShader : public view_listener_t  {      bool handleEvent(const LLSD& userdata)      { -        reload_vertex_shader(NULL); +        reload_vertex_shader();          return true;      }  }; @@ -2165,7 +2148,7 @@ class LLAdvancedDumpAttachments : public view_listener_t  {      bool handleEvent(const LLSD& userdata)      { -        handle_dump_attachments(NULL); +        handle_dump_attachments();          return true;      }  }; @@ -2181,7 +2164,7 @@ class LLAdvancedRebakeTextures : public view_listener_t  {      bool handleEvent(const LLSD& userdata)      { -        handle_rebake_textures(NULL); +        handle_rebake_textures();          return true;      }  }; @@ -2199,7 +2182,7 @@ class LLAdvancedDebugAvatarTextures : public view_listener_t      {          if (gAgent.isGodlike())          { -            handle_debug_avatar_textures(NULL); +            handle_debug_avatar_textures();          }          return true;      } @@ -2215,7 +2198,7 @@ class LLAdvancedDumpAvatarLocalTextures : public view_listener_t      bool handleEvent(const LLSD& userdata)      {  #ifndef LL_RELEASE_FOR_DOWNLOAD -        handle_dump_avatar_local_textures(NULL); +        handle_dump_avatar_local_textures();  #endif          return true;      } @@ -2232,7 +2215,7 @@ class LLAdvancedEnableMessageLog : public view_listener_t  {      bool handleEvent(const LLSD& userdata)      { -        handle_viewer_enable_message_log(NULL); +        handle_viewer_enable_message_log();          return true;      }  }; @@ -2241,7 +2224,7 @@ class LLAdvancedDisableMessageLog : public view_listener_t  {      bool handleEvent(const LLSD& userdata)      { -        handle_viewer_disable_message_log(NULL); +        handle_viewer_disable_message_log();          return true;      }  }; @@ -2432,7 +2415,7 @@ class LLAdvancedCompressImage : public view_listener_t  {      bool handleEvent(const LLSD& userdata)      { -        handle_compress_image(NULL); +        handle_compress_image();          return true;      }  }; @@ -2447,7 +2430,7 @@ class LLAdvancedCompressFileTest : public view_listener_t  {      bool handleEvent(const LLSD& userdata)      { -        handle_compress_file_test(NULL); +        handle_compress_file_test();          return true;      }  }; @@ -2488,7 +2471,7 @@ class LLAdvancedToggleViewAdminOptions : public view_listener_t  {      bool handleEvent(const LLSD& userdata)      { -        handle_admin_override_toggle(NULL); +        handle_admin_override_toggle();          return true;      }  }; @@ -2497,7 +2480,7 @@ class LLAdvancedToggleVisualLeakDetector : public view_listener_t  {      bool handleEvent(const LLSD& userdata)      { -        handle_visual_leak_detector_toggle(NULL); +        handle_visual_leak_detector_toggle();          return true;      }  }; @@ -2506,7 +2489,7 @@ class LLAdvancedCheckViewAdminOptions : public view_listener_t  {      bool handleEvent(const LLSD& userdata)      { -        bool new_value = check_admin_override(NULL) || gAgent.isGodlike(); +        bool new_value = check_admin_override() || gAgent.isGodlike();          return new_value;      }  }; @@ -2520,7 +2503,7 @@ class LLAdvancedRequestAdminStatus : public view_listener_t  {      bool handleEvent(const LLSD& userdata)      { -        handle_god_mode(NULL); +        handle_god_mode();          return true;      }  }; @@ -2529,7 +2512,7 @@ class LLAdvancedLeaveAdminStatus : public view_listener_t  {      bool handleEvent(const LLSD& userdata)      { -        handle_leave_god_mode(NULL); +        handle_leave_god_mode();          return true;      }  }; @@ -2542,7 +2525,7 @@ class LLAdvancedForceErrorBreakpoint : public view_listener_t  {      bool handleEvent(const LLSD& userdata)      { -        force_error_breakpoint(NULL); +        force_error_breakpoint();          return true;      }  }; @@ -2551,7 +2534,7 @@ class LLAdvancedForceErrorLlerror : public view_listener_t  {      bool handleEvent(const LLSD& userdata)      { -        force_error_llerror(NULL); +        force_error_llerror();          return true;      }  }; @@ -2560,7 +2543,7 @@ class LLAdvancedForceErrorLlerrorMsg: public view_listener_t  {      bool handleEvent(const LLSD& userdata)      { -        force_error_llerror_msg(NULL); +        force_error_llerror_msg();          return true;      }  }; @@ -2569,7 +2552,7 @@ class LLAdvancedForceErrorBadMemoryAccess : public view_listener_t  {      bool handleEvent(const LLSD& userdata)      { -        force_error_bad_memory_access(NULL); +        force_error_bad_memory_access();          return true;      }  }; @@ -2584,7 +2567,7 @@ class LLAdvancedForceErrorBadMemoryAccessCoro : public view_listener_t                  // Wait for one mainloop() iteration, letting the enclosing                  // handleEvent() method return.                  llcoro::suspend(); -                force_error_bad_memory_access(NULL); +                force_error_bad_memory_access();              });          return true;      } @@ -2594,7 +2577,7 @@ class LLAdvancedForceErrorInfiniteLoop : public view_listener_t  {      bool handleEvent(const LLSD& userdata)      { -        force_error_infinite_loop(NULL); +        force_error_infinite_loop();          return true;      }  }; @@ -2603,7 +2586,7 @@ class LLAdvancedForceErrorSoftwareException : public view_listener_t  {      bool handleEvent(const LLSD& userdata)      { -        force_error_software_exception(NULL); +        force_error_software_exception();          return true;      }  }; @@ -2612,7 +2595,7 @@ class LLAdvancedForceOSException: public view_listener_t  {      bool handleEvent(const LLSD& userdata)      { -        force_error_os_exception(NULL); +        force_error_os_exception();          return true;      }  }; @@ -2627,7 +2610,7 @@ class LLAdvancedForceErrorSoftwareExceptionCoro : public view_listener_t                  // Wait for one mainloop() iteration, letting the enclosing                  // handleEvent() method return.                  llcoro::suspend(); -                force_error_software_exception(NULL); +                force_error_software_exception();              });          return true;      } @@ -2637,7 +2620,7 @@ class LLAdvancedForceErrorDriverCrash : public view_listener_t  {      bool handleEvent(const LLSD& userdata)      { -        force_error_driver_crash(NULL); +        force_error_driver_crash();          return true;      }  }; @@ -2646,7 +2629,7 @@ class LLAdvancedForceErrorCoroutineCrash : public view_listener_t  {      bool handleEvent(const LLSD& userdata)      { -        force_error_coroutine_crash(NULL); +        force_error_coroutine_crash();          return true;      }  }; @@ -2655,7 +2638,7 @@ class LLAdvancedForceErrorThreadCrash : public view_listener_t  {      bool handleEvent(const LLSD& userdata)      { -        force_error_thread_crash(NULL); +        force_error_thread_crash();          return true;      }  }; @@ -2664,7 +2647,7 @@ class LLAdvancedForceErrorDisconnectViewer : public view_listener_t  {      bool handleEvent(const LLSD& userdata)      { -        handle_disconnect_viewer(NULL); +        handle_disconnect_viewer();          return true;  }  }; @@ -2676,7 +2659,7 @@ class LLAdvancedHandleToggleHackedGodmode : public view_listener_t  {      bool handleEvent(const LLSD& userdata)      { -        handle_toggle_hacked_godmode(NULL); +        handle_toggle_hacked_godmode();          return true;      }  }; @@ -2685,7 +2668,7 @@ class LLAdvancedCheckToggleHackedGodmode : public view_listener_t  {      bool handleEvent(const LLSD& userdata)      { -        check_toggle_hacked_godmode(NULL); +        check_toggle_hacked_godmode();          return true;      }  }; @@ -2694,7 +2677,7 @@ class LLAdvancedEnableToggleHackedGodmode : public view_listener_t  {      bool handleEvent(const LLSD& userdata)      { -        bool new_value = enable_toggle_hacked_godmode(NULL); +        bool new_value = enable_toggle_hacked_godmode();          return new_value;      }  }; @@ -2739,7 +2722,7 @@ class LLAdminForceTakeCopy : public view_listener_t  {      bool handleEvent(const LLSD& userdata)      { -        force_take_copy(NULL); +        force_take_copy();          return true;      }  }; @@ -2748,7 +2731,7 @@ class LLAdminHandleObjectOwnerSelf : public view_listener_t  {      bool handleEvent(const LLSD& userdata)      { -        handle_object_owner_self(NULL); +        handle_object_owner_self();          return true;      }  }; @@ -2756,7 +2739,7 @@ class LLAdminHandleObjectOwnerPermissive : public view_listener_t  {      bool handleEvent(const LLSD& userdata)      { -        handle_object_owner_permissive(NULL); +        handle_object_owner_permissive();          return true;      }  }; @@ -2765,7 +2748,7 @@ class LLAdminHandleForceDelete : public view_listener_t  {      bool handleEvent(const LLSD& userdata)      { -        handle_force_delete(NULL); +        handle_force_delete();          return true;      }  }; @@ -2774,7 +2757,7 @@ class LLAdminHandleObjectLock : public view_listener_t  {      bool handleEvent(const LLSD& userdata)      { -        handle_object_lock(NULL); +        handle_object_lock();          return true;      }  }; @@ -2783,7 +2766,7 @@ class LLAdminHandleObjectAssetIDs: public view_listener_t  {      bool handleEvent(const LLSD& userdata)      { -        handle_object_asset_ids(NULL); +        handle_object_asset_ids();          return true;      }  }; @@ -2793,7 +2776,7 @@ class LLAdminHandleForceParcelOwnerToMe: public view_listener_t  {      bool handleEvent(const LLSD& userdata)      { -        handle_force_parcel_owner_to_me(NULL); +        handle_force_parcel_owner_to_me();          return true;      }  }; @@ -2801,7 +2784,7 @@ class LLAdminHandleForceParcelToContent: public view_listener_t  {      bool handleEvent(const LLSD& userdata)      { -        handle_force_parcel_to_content(NULL); +        handle_force_parcel_to_content();          return true;      }  }; @@ -2809,7 +2792,7 @@ class LLAdminHandleClaimPublicLand: public view_listener_t  {      bool handleEvent(const LLSD& userdata)      { -        handle_claim_public_land(NULL); +        handle_claim_public_land();          return true;      }  }; @@ -2819,7 +2802,7 @@ class LLAdminHandleRegionDumpTempAssetData: public view_listener_t  {      bool handleEvent(const LLSD& userdata)      { -        handle_region_dump_temp_asset_data(NULL); +        handle_region_dump_temp_asset_data();          return true;      }  }; @@ -2829,7 +2812,7 @@ class LLAdminOnSaveState: public view_listener_t  {      bool handleEvent(const LLSD& userdata)      { -        LLPanelRegionTools::onSaveState(NULL); +        LLPanelRegionTools::onSaveState(nullptr);          return true;  }  }; @@ -3315,41 +3298,11 @@ class LLLandEnableBuyPass : public view_listener_t  {      bool handleEvent(const LLSD& userdata)      { -        bool new_value = LLPanelLandGeneral::enableBuyPass(NULL); +        bool new_value = LLPanelLandGeneral::enableBuyPass(nullptr);          return new_value;      }  }; -// BUG: Should really check if CLICK POINT is in a parcel where you can build. -bool enable_land_build(void*) -{ -    if (gAgent.isGodlike()) return true; -    if (gAgent.inPrelude()) return false; - -    bool can_build = false; -    LLParcel* agent_parcel = LLViewerParcelMgr::getInstance()->getAgentParcel(); -    if (agent_parcel) -    { -        can_build = agent_parcel->getAllowModify(); -    } -    return can_build; -} - -// BUG: Should really check if OBJECT is in a parcel where you can build. -bool enable_object_build(void*) -{ -    if (gAgent.isGodlike()) return true; -    if (gAgent.inPrelude()) return false; - -    bool can_build = false; -    LLParcel* agent_parcel = LLViewerParcelMgr::getInstance()->getAgentParcel(); -    if (agent_parcel) -    { -        can_build = agent_parcel->getAllowModify(); -    } -    return can_build; -} -  bool enable_object_edit()  {      if (!isAgentAvatarValid()) return false; @@ -3380,12 +3333,6 @@ bool enable_mute_particle()      return pick.mParticleOwnerID != LLUUID::null && pick.mParticleOwnerID != gAgent.getID();  } -// mutually exclusive - show either edit option or build in menu -bool enable_object_build() -{ -    return !enable_object_edit(); -} -  bool enable_object_select_in_pathfinding_linksets()  {      return LLPathfindingManager::getInstance()->isPathfindingEnabledForCurrentRegion() && LLSelectMgr::getInstance()->selectGetEditableLinksets(); @@ -3484,9 +3431,8 @@ class LLSelfEnableRemoveAllAttachments : public view_listener_t      }  }; -bool enable_has_attachments(void*) +bool enable_has_attachments()  { -      return false;  } @@ -4092,7 +4038,7 @@ void handle_buy_contents(LLSaleInfo sale_info)      LLFloaterBuyContents::show(sale_info);  } -void handle_region_dump_temp_asset_data(void*) +void handle_region_dump_temp_asset_data()  {      LL_INFOS() << "Dumping temporary asset data to simulator logs" << LL_ENDL;      std::vector<std::string> strings; @@ -4100,7 +4046,7 @@ void handle_region_dump_temp_asset_data(void*)      send_generic_message("dumptempassetdata", strings, invoice);  } -void handle_region_clear_temp_asset_data(void*) +void handle_region_clear_temp_asset_data()  {      LL_INFOS() << "Clearing temporary asset data" << LL_ENDL;      std::vector<std::string> strings; @@ -4108,7 +4054,7 @@ void handle_region_clear_temp_asset_data(void*)      send_generic_message("cleartempassetdata", strings, invoice);  } -void handle_region_dump_settings(void*) +void handle_region_dump_settings()  {      LLViewerRegion* regionp = gAgent.getRegion();      if (regionp) @@ -4124,12 +4070,12 @@ void handle_region_dump_settings(void*)      }  } -void handle_dump_group_info(void *) +void handle_dump_group_info()  {      gAgent.dumpGroupInfo();  } -void handle_dump_capabilities_info(void *) +void handle_dump_capabilities_info()  {      LLViewerRegion* regionp = gAgent.getRegion();      if (regionp) @@ -4138,7 +4084,7 @@ void handle_dump_capabilities_info(void *)      }  } -void handle_dump_region_object_cache(void*) +void handle_dump_region_object_cache()  {      LLViewerRegion* regionp = gAgent.getRegion();      if (regionp) @@ -4147,7 +4093,7 @@ void handle_dump_region_object_cache(void*)      }  } -void handle_reset_interest_lists(void *) +void handle_reset_interest_lists()  {      // Check all regions and reset their interest list      for (LLWorld::region_list_t::const_iterator iter = LLWorld::getInstance()->getRegionList().begin(); @@ -4290,12 +4236,12 @@ class LLTogglePanelPeopleTab : public view_listener_t      }  }; -bool check_admin_override(void*) +bool check_admin_override()  {      return gAgent.getAdminOverride();  } -void handle_admin_override_toggle(void*) +void handle_admin_override_toggle()  {      gAgent.setAdminOverride(!gAgent.getAdminOverride()); @@ -4303,7 +4249,7 @@ void handle_admin_override_toggle(void*)      show_debug_menus();  } -void handle_visual_leak_detector_toggle(void*) +void handle_visual_leak_detector_toggle()  {      static bool vld_enabled = false; @@ -4332,12 +4278,12 @@ void handle_visual_leak_detector_toggle(void*)      };  } -void handle_god_mode(void*) +void handle_god_mode()  {      gAgent.requestEnterGodMode();  } -void handle_leave_god_mode(void*) +void handle_leave_god_mode()  {      gAgent.requestLeaveGodMode();  } @@ -4384,18 +4330,18 @@ void set_god_level(U8 god_level)  }  #ifdef TOGGLE_HACKED_GODLIKE_VIEWER -void handle_toggle_hacked_godmode(void*) +void handle_toggle_hacked_godmode()  {      gHackGodmode = !gHackGodmode;      set_god_level(gHackGodmode ? GOD_MAINTENANCE : GOD_NOT);  } -bool check_toggle_hacked_godmode(void*) +bool check_toggle_hacked_godmode()  {      return gHackGodmode;  } -bool enable_toggle_hacked_godmode(void*) +bool enable_toggle_hacked_godmode()  {    return !LLGridManager::getInstance()->isInProductionGrid();  } @@ -4419,41 +4365,6 @@ void process_grant_godlike_powers(LLMessageSystem* msg, void**)      }  } -/* -class LLHaveCallingcard : public LLInventoryCollectFunctor -{ -public: -    LLHaveCallingcard(const LLUUID& agent_id); -    virtual ~LLHaveCallingcard() {} -    virtual bool operator()(LLInventoryCategory* cat, -                            LLInventoryItem* item); -    bool isThere() const { return mIsThere;} -protected: -    LLUUID mID; -    bool mIsThere; -}; - -LLHaveCallingcard::LLHaveCallingcard(const LLUUID& agent_id) : -    mID(agent_id), -    mIsThere(false) -{ -} - -bool LLHaveCallingcard::operator()(LLInventoryCategory* cat, -                                   LLInventoryItem* item) -{ -    if(item) -    { -        if((item->getType() == LLAssetType::AT_CALLINGCARD) -           && (item->getCreatorUUID() == mID)) -        { -            mIsThere = true; -        } -    } -    return false; -} -*/ -  bool is_agent_mappable(const LLUUID& agent_id)  {      const LLRelationship* buddy_info = NULL; @@ -4554,7 +4465,7 @@ bool is_object_sittable()  }  // only works on pie menu -void handle_object_sit(LLViewerObject *object, const LLVector3 &offset) +void handle_object_sit(LLViewerObject* object, const LLVector3& offset)  {      // get object selection offset @@ -4603,7 +4514,7 @@ void handle_object_sit(const LLUUID& object_id)      handle_object_sit(obj, offset);  } -void near_sit_down_point(bool success, void *) +void near_sit_down_point(bool success, void*)  {      if (success)      { @@ -4653,7 +4564,7 @@ class LLLandCanSit : public view_listener_t  //  // Major mode switching  // -void reset_view_final( bool proceed ); +void reset_view_final(bool proceed);  void handle_reset_view()  { @@ -4663,7 +4574,7 @@ void handle_reset_view()          LLFloaterSidePanelContainer::showPanel("appearance", LLSD().with("type", "my_outfits"));      }      gAgentCamera.setFocusOnAvatar(true, false, false); -    reset_view_final( true ); +    reset_view_final(true);      LLFloaterCamera::resetCameraMode();  } @@ -4677,7 +4588,7 @@ class LLViewResetView : public view_listener_t  };  // Note: extra parameters allow this function to be called from dialog. -void reset_view_final( bool proceed ) +void reset_view_final(bool proceed)  {      if( !proceed )      { @@ -4765,54 +4676,7 @@ class LLViewToggleUI : public view_listener_t      }  }; -void handle_duplicate_in_place(void*) -{ -    LL_INFOS() << "handle_duplicate_in_place" << LL_ENDL; - -    LLVector3 offset(0.f, 0.f, 0.f); -    LLSelectMgr::getInstance()->selectDuplicate(offset, true); -} - - - -/* - * No longer able to support viewer side manipulations in this way - * -void god_force_inv_owner_permissive(LLViewerObject* object, -                                    LLInventoryObject::object_list_t* inventory, -                                    S32 serial_num, -                                    void*) -{ -    typedef std::vector<LLPointer<LLViewerInventoryItem> > item_array_t; -    item_array_t items; - -    LLInventoryObject::object_list_t::const_iterator inv_it = inventory->begin(); -    LLInventoryObject::object_list_t::const_iterator inv_end = inventory->end(); -    for ( ; inv_it != inv_end; ++inv_it) -    { -        if(((*inv_it)->getType() != LLAssetType::AT_CATEGORY)) -        { -            LLInventoryObject* obj = *inv_it; -            LLPointer<LLViewerInventoryItem> new_item = new LLViewerInventoryItem((LLViewerInventoryItem*)obj); -            LLPermissions perm(new_item->getPermissions()); -            perm.setMaskBase(PERM_ALL); -            perm.setMaskOwner(PERM_ALL); -            new_item->setPermissions(perm); -            items.push_back(new_item); -        } -    } -    item_array_t::iterator end = items.end(); -    item_array_t::iterator it; -    for(it = items.begin(); it != end; ++it) -    { -        // since we have the inventory item in the callback, it should not -        // invalidate iteration through the selection manager. -        object->updateInventory((*it), TASK_INVENTORY_ITEM_KEY, false); -    } -} -*/ - -void handle_object_owner_permissive(void*) +void handle_object_owner_permissive()  {      // only send this if they're a god.      if(gAgent.isGodlike()) @@ -4823,7 +4687,7 @@ void handle_object_owner_permissive(void*)      }  } -void handle_object_owner_self(void*) +void handle_object_owner_self()  {      // only send this if they're a god.      if(gAgent.isGodlike()) @@ -4833,12 +4697,12 @@ void handle_object_owner_self(void*)  }  // Shortcut to set owner permissions to not editable. -void handle_object_lock(void*) +void handle_object_lock()  {      LLSelectMgr::getInstance()->selectionSetObjectPermissions(PERM_OWNER, false, PERM_MODIFY);  } -void handle_object_asset_ids(void*) +void handle_object_asset_ids()  {      // only send this if they're a god.      if (gAgent.isGodlike()) @@ -4847,17 +4711,17 @@ void handle_object_asset_ids(void*)      }  } -void handle_force_parcel_owner_to_me(void*) +void handle_force_parcel_owner_to_me()  {      LLViewerParcelMgr::getInstance()->sendParcelGodForceOwner( gAgent.getID() );  } -void handle_force_parcel_to_content(void*) +void handle_force_parcel_to_content()  {      LLViewerParcelMgr::getInstance()->sendParcelGodForceToContent();  } -void handle_claim_public_land(void*) +void handle_claim_public_land()  {      if (LLViewerParcelMgr::getInstance()->getSelectionRegion() != gAgent.getRegion())      { @@ -4899,7 +4763,7 @@ void handle_claim_public_land(void*)  // HACK for easily testing new avatar geometry -void handle_god_request_avatar_geometry(void *) +void handle_god_request_avatar_geometry()  {      if (gAgent.isGodlike())      { @@ -5169,7 +5033,7 @@ void handle_link_objects()  class LLObjectReturn : public view_listener_t  {  public: -    LLObjectReturn() : mFirstRegion(NULL) {} +    LLObjectReturn() : mFirstRegion() {}  private:      bool handleEvent(const LLSD& userdata) @@ -5239,7 +5103,7 @@ class LLObjectEnableReturn : public view_listener_t      }  }; -void force_take_copy(void*) +void force_take_copy()  {      if (LLSelectMgr::getInstance()->getSelection()->isEmpty()) return;      const LLUUID category_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_OBJECT); @@ -5347,7 +5211,7 @@ void handle_take(bool take_separate)          }      }); -    if(locked_but_takeable_object || +    if (locked_but_takeable_object ||         !you_own_everything)      {          if(locked_but_takeable_object && you_own_everything) @@ -5930,7 +5794,7 @@ class LLToolsSelectNextPartFace : public view_listener_t          {              if (gFocusMgr.childHasKeyboardFocus(gFloaterTools))              { -                gFocusMgr.setKeyboardFocus(NULL);   // force edit toolbox to commit any changes +                gFocusMgr.setKeyboardFocus(nullptr);   // force edit toolbox to commit any changes              }              if (fwd || prev)              { @@ -6003,7 +5867,7 @@ class LLEditCut : public view_listener_t  {      bool handleEvent(const LLSD& userdata)      { -        if( LLEditMenuHandler::gEditMenuHandler ) +        if (LLEditMenuHandler::gEditMenuHandler)          {              LLEditMenuHandler::gEditMenuHandler->cut();          } @@ -6024,7 +5888,7 @@ class LLEditCopy : public view_listener_t  {      bool handleEvent(const LLSD& userdata)      { -        if( LLEditMenuHandler::gEditMenuHandler ) +        if (LLEditMenuHandler::gEditMenuHandler)          {              LLEditMenuHandler::gEditMenuHandler->copy();          } @@ -6045,7 +5909,7 @@ class LLEditPaste : public view_listener_t  {      bool handleEvent(const LLSD& userdata)      { -        if( LLEditMenuHandler::gEditMenuHandler ) +        if (LLEditMenuHandler::gEditMenuHandler)          {              LLEditMenuHandler::gEditMenuHandler->paste();          } @@ -6068,7 +5932,7 @@ class LLEditDelete : public view_listener_t      {          // If a text field can do a deletion, it gets precedence over deleting          // an object in the world. -        if( LLEditMenuHandler::gEditMenuHandler && LLEditMenuHandler::gEditMenuHandler->canDoDelete()) +        if (LLEditMenuHandler::gEditMenuHandler && LLEditMenuHandler::gEditMenuHandler->canDoDelete())          {              LLEditMenuHandler::gEditMenuHandler->doDelete();          } @@ -6179,7 +6043,7 @@ bool enable_object_delete()  class LLObjectsReturnPackage  {  public: -    LLObjectsReturnPackage() : mObjectSelection(), mReturnableObjects(), mError(),  mFirstRegion(NULL) {}; +    LLObjectsReturnPackage() : mObjectSelection(), mReturnableObjects(), mError(),  mFirstRegion(nullptr) {};      ~LLObjectsReturnPackage()      {          mObjectSelection.clear(); @@ -6236,7 +6100,7 @@ void handle_object_delete()          return;  } -void handle_force_delete(void*) +void handle_force_delete()  {      LLSelectMgr::getInstance()->selectForceDelete();  } @@ -6348,12 +6212,12 @@ class LLEditRedo : public view_listener_t -void print_object_info(void*) +void print_object_info()  {      LLSelectMgr::getInstance()->selectionDump();  } -void print_agent_nvpairs(void*) +void print_agent_nvpairs()  {      LLViewerObject *objectp; @@ -6402,53 +6266,13 @@ void show_debug_menus()      }  } -void toggle_debug_menus(void*) +void toggle_debug_menus()  {      bool visible = ! gSavedSettings.getBOOL("UseDebugMenus");      gSavedSettings.setBOOL("UseDebugMenus", visible);      show_debug_menus();  } - -// LLUUID gExporterRequestID; -// std::string gExportDirectory; - -// LLUploadDialog *gExportDialog = NULL; - -// void handle_export_selected( void * ) -// { -//  LLObjectSelectionHandle selection = LLSelectMgr::getInstance()->getSelection(); -//  if (selection->isEmpty()) -//  { -//      return; -//  } -//  LL_INFOS() << "Exporting selected objects:" << LL_ENDL; - -//  gExporterRequestID.generate(); -//  gExportDirectory = ""; - -//  LLMessageSystem* msg = gMessageSystem; -//  msg->newMessageFast(_PREHASH_ObjectExportSelected); -//  msg->nextBlockFast(_PREHASH_AgentData); -//  msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID()); -//  msg->addUUIDFast(_PREHASH_RequestID, gExporterRequestID); -//  msg->addS16Fast(_PREHASH_VolumeDetail, 4); - -//  for (LLObjectSelection::root_iterator iter = selection->root_begin(); -//       iter != selection->root_end(); iter++) -//  { -//      LLSelectNode* node = *iter; -//      LLViewerObject* object = node->getObject(); -//      msg->nextBlockFast(_PREHASH_ObjectData); -//      msg->addUUIDFast(_PREHASH_ObjectID, object->getID()); -//      LL_INFOS() << "Object: " << object->getID() << LL_ENDL; -//  } -//  msg->sendReliable(gAgent.getRegion()->getHost()); - -//  gExportDialog = LLUploadDialog::modalUploadDialog("Exporting selected objects..."); -// } -// -  class LLCommunicateNearbyChat : public view_listener_t  {      bool handleEvent(const LLSD& userdata) @@ -6626,7 +6450,7 @@ void handle_look_at_selection(const LLSD& param)      }  } -void handle_zoom_to_object(LLUUID object_id) +void handle_zoom_to_object(const LLUUID& object_id)  {      const F32 PADDING_FACTOR = 2.f; @@ -6937,28 +6761,28 @@ bool enable_object_sit(LLUICtrl* ctrl)      return !sitting_on_sel && is_object_sittable();  } -void dump_select_mgr(void*) +void dump_select_mgr()  {      LLSelectMgr::getInstance()->dump();  } -void dump_inventory(void*) +void dump_inventory()  {      gInventory.dumpInventory();  } -void handle_dump_followcam(void*) +void handle_dump_followcam()  {      LLFollowCamMgr::getInstance()->dump();  } -void handle_viewer_enable_message_log(void*) +void handle_viewer_enable_message_log()  {      gMessageSystem->startLogging();  } -void handle_viewer_disable_message_log(void*) +void handle_viewer_disable_message_log()  {      gMessageSystem->stopLogging();  } @@ -7325,7 +7149,7 @@ class LLWorldEnableBuyLand : public view_listener_t      }  }; -bool enable_buy_land(void*) +bool enable_buy_land()  {      return LLViewerParcelMgr::getInstance()->canAgentBuyParcel(                  LLViewerParcelMgr::getInstance()->getParcelSelection()->getParcel(), false); @@ -7411,7 +7235,7 @@ void LLObjectAttachToAvatar::onNearAttachObject(bool success, void *user_data)          }          LLSelectMgr::getInstance()->sendAttach(cb_data->getSelection(), attachment_id, cb_data->mReplace);      } -    LLObjectAttachToAvatar::setObjectSelection(NULL); +    LLObjectAttachToAvatar::setObjectSelection(nullptr);      delete cb_data;  } @@ -7990,7 +7814,7 @@ class LLToolsSelectedScriptAction : public view_listener_t      }  }; -void handle_selected_texture_info(void*) +void handle_selected_texture_info()  {      for (LLObjectSelection::valid_iterator iter = LLSelectMgr::getInstance()->getSelection()->valid_begin();          iter != LLSelectMgr::getInstance()->getSelection()->valid_end(); iter++) @@ -8078,21 +7902,22 @@ void handle_selected_material_info()      }  } -void handle_test_male(void*) +void handle_test_male()  {      LLAppearanceMgr::instance().wearOutfitByName("Male Shape & Outfit");      //gGestureList.requestResetFromServer( true );  } -void handle_test_female(void*) +void handle_test_female()  {      LLAppearanceMgr::instance().wearOutfitByName("Female Shape & Outfit");      //gGestureList.requestResetFromServer( false );  } -void handle_dump_attachments(void*) +void handle_dump_attachments()  { -    if(!isAgentAvatarValid()) return; +    if (!isAgentAvatarValid()) +        return;      for (LLVOAvatar::attachment_map_t::iterator iter = gAgentAvatarp->mAttachmentPoints.begin();           iter != gAgentAvatarp->mAttachmentPoints.end(); ) @@ -8294,12 +8119,12 @@ class LLToggleShaderControl : public view_listener_t      }  }; -void menu_toggle_attached_lights(void* user_data) +void menu_toggle_attached_lights()  {      LLPipeline::sRenderAttachedLights = gSavedSettings.getBOOL("RenderAttachedLights");  } -void menu_toggle_attached_particles(void* user_data) +void menu_toggle_attached_particles()  {      LLPipeline::sRenderAttachedParticles = gSavedSettings.getBOOL("RenderAttachedParticles");  } @@ -8317,11 +8142,11 @@ class LLAdvancedHandleAttachedLightParticles: public view_listener_t          // update internal flags          if (control_name == "RenderAttachedLights")          { -            menu_toggle_attached_lights(NULL); +            menu_toggle_attached_lights();          }          else if (control_name == "RenderAttachedParticles")          { -            menu_toggle_attached_particles(NULL); +            menu_toggle_attached_particles();          }          return true;      } @@ -8436,7 +8261,7 @@ bool LLHasAsset::operator()(LLInventoryCategory* cat,  } -bool enable_save_into_task_inventory(void*) +bool enable_save_into_task_inventory()  {      LLSelectNode* node = LLSelectMgr::getInstance()->getSelection()->getFirstRootNode();      if(node && (node->mValid) && (!node->mFromTaskID.isNull())) @@ -8455,7 +8280,7 @@ class LLToolsEnableSaveToObjectInventory : public view_listener_t  {      bool handleEvent(const LLSD& userdata)      { -        bool new_value = enable_save_into_task_inventory(NULL); +        bool new_value = enable_save_into_task_inventory();          return new_value;      }  }; @@ -8518,12 +8343,12 @@ class LLWorldEnableTeleportHome : public view_listener_t      }  }; -bool enable_god_full(void*) +bool enable_god_full()  {      return gAgent.getGodLevel() >= GOD_FULL;  } -bool enable_god_liaison(void*) +bool enable_god_liaison()  {      return gAgent.getGodLevel() >= GOD_LIAISON;  } @@ -8533,18 +8358,18 @@ bool is_god_customer_service()      return gAgent.getGodLevel() >= GOD_CUSTOMER_SERVICE;  } -bool enable_god_basic(void*) +bool enable_god_basic()  {      return gAgent.getGodLevel() > GOD_NOT;  } -void toggle_show_xui_names(void *) +void toggle_show_xui_names()  {      gSavedSettings.setBOOL("DebugShowXUINames", !gSavedSettings.getBOOL("DebugShowXUINames"));  } -bool check_show_xui_names(void *) +bool check_show_xui_names()  {      return gSavedSettings.getBOOL("DebugShowXUINames");  } @@ -8650,12 +8475,12 @@ class LLToolsEditLinkedParts : public view_listener_t      }  }; -void reload_vertex_shader(void *) +void reload_vertex_shader()  {      //THIS WOULD BE AN AWESOME PLACE TO RELOAD SHADERS... just a thought    - DaveP  } -void handle_dump_avatar_local_textures(void*) +void handle_dump_avatar_local_textures()  {      gAgentAvatarp->dumpLocalTextures();  } @@ -8665,7 +8490,7 @@ void handle_dump_timers()      LLTrace::BlockTimer::dumpCurTimes();  } -void handle_debug_avatar_textures(void*) +void handle_debug_avatar_textures()  {      LLViewerObject* objectp = LLSelectMgr::getInstance()->getSelection()->getPrimaryObject();      if (objectp) @@ -8674,10 +8499,10 @@ void handle_debug_avatar_textures(void*)      }  } -void handle_grab_baked_texture(void* data) +void handle_grab_baked_texture(EBakedTextureIndex baked_tex_index)  { -    EBakedTextureIndex baked_tex_index = (EBakedTextureIndex)((intptr_t)data); -    if (!isAgentAvatarValid()) return; +    if (!isAgentAvatarValid()) +        return;      const LLUUID& asset_id = gAgentAvatarp->grabBakedTexture(baked_tex_index);      LL_INFOS("texture") << "Adding baked texture " << asset_id << " to inventory." << LL_ENDL; @@ -8740,19 +8565,18 @@ void handle_grab_baked_texture(void* data)      }  } -bool enable_grab_baked_texture(void* data) +bool enable_grab_baked_texture(EBakedTextureIndex baked_tex_index)  { -    EBakedTextureIndex index = (EBakedTextureIndex)((intptr_t)data);      if (isAgentAvatarValid())      { -        return gAgentAvatarp->canGrabBakedTexture(index); +        return gAgentAvatarp->canGrabBakedTexture(baked_tex_index);      }      return false;  }  // Returns a pointer to the avatar give the UUID of the avatar OR of an attachment the avatar is wearing.  // Returns NULL on failure. -LLVOAvatar* find_avatar_from_object( LLViewerObject* object ) +LLVOAvatar* find_avatar_from_object(LLViewerObject* object)  {      if (object)      { @@ -8776,63 +8600,63 @@ LLVOAvatar* find_avatar_from_object( LLViewerObject* object )  // Returns a pointer to the avatar give the UUID of the avatar OR of an attachment the avatar is wearing.  // Returns NULL on failure. -LLVOAvatar* find_avatar_from_object( const LLUUID& object_id ) +LLVOAvatar* find_avatar_from_object(const LLUUID& object_id)  {      return find_avatar_from_object( gObjectList.findObject(object_id) );  } -void handle_disconnect_viewer(void *) +void handle_disconnect_viewer()  {      LLAppViewer::instance()->forceDisconnect(LLTrans::getString("TestingDisconnect"));  } -void force_error_breakpoint(void *) +void force_error_breakpoint()  {      LLAppViewer::instance()->forceErrorBreakpoint();  } -void force_error_llerror(void *) +void force_error_llerror()  {      LLAppViewer::instance()->forceErrorLLError();  } -void force_error_llerror_msg(void*) +void force_error_llerror_msg()  {      LLAppViewer::instance()->forceErrorLLErrorMsg();  } -void force_error_bad_memory_access(void *) +void force_error_bad_memory_access()  {      LLAppViewer::instance()->forceErrorBadMemoryAccess();  } -void force_error_infinite_loop(void *) +void force_error_infinite_loop()  {      LLAppViewer::instance()->forceErrorInfiniteLoop();  } -void force_error_software_exception(void *) +void force_error_software_exception()  {      LLAppViewer::instance()->forceErrorSoftwareException();  } -void force_error_os_exception(void*) +void force_error_os_exception()  {      LLAppViewer::instance()->forceErrorOSSpecificException();  } -void force_error_driver_crash(void *) +void force_error_driver_crash()  {      LLAppViewer::instance()->forceErrorDriverCrash();  } -void force_error_coroutine_crash(void *) +void force_error_coroutine_crash()  {      LLAppViewer::instance()->forceErrorCoroutineCrash();  } -void force_error_thread_crash(void *) +void force_error_thread_crash()  {      LLAppViewer::instance()->forceErrorThreadCrash();  } @@ -8857,7 +8681,7 @@ class LLToolsUseSelectionForGrid : public view_listener_t      }  }; -void handle_test_load_url(void*) +void handle_test_load_url()  {      LLWeb::loadURL("");      LLWeb::loadURL("hacker://www.google.com/"); @@ -8965,7 +8789,7 @@ void handle_report_bug(const LLSD& param)      LLWeb::loadURLExternal(url);  } -void handle_buy_currency_test(void*) +void handle_buy_currency_test()  {      std::string url =          "http://sarahd-sl-13041.webdev.lindenlab.com/app/lindex/index.php?agent_id=[AGENT_ID]&secure_session_id=[SESSION_ID]&lang=[LANGUAGE]"; @@ -8982,7 +8806,7 @@ void handle_buy_currency_test(void*)  }  // SUNSHINE CLEANUP - is only the request update at the end needed now? -void handle_rebake_textures(void*) +void handle_rebake_textures()  {      if (!isAgentAvatarValid()) return; @@ -8995,15 +8819,13 @@ void handle_rebake_textures(void*)      }  } -void toggle_visibility(void* user_data) +void toggle_visibility(LLView* viewp)  { -    LLView* viewp = (LLView*)user_data;      viewp->setVisible(!viewp->getVisible());  } -bool get_visibility(void* user_data) +bool get_visibility(LLView* viewp)  { -    LLView* viewp = (LLView*)user_data;      return viewp->getVisible();  } @@ -10221,7 +10043,6 @@ void initialize_menus()      enable.add("EnablePayAvatar", boost::bind(&enable_pay_avatar));      enable.add("EnableEdit", boost::bind(&enable_object_edit));      enable.add("EnableMuteParticle", boost::bind(&enable_mute_particle)); -    enable.add("VisibleBuild", boost::bind(&enable_object_build));      commit.add("Pathfinding.Linksets.Select", boost::bind(&LLFloaterPathfindingLinksets::openLinksetsWithSelectedObjects));      enable.add("EnableSelectInPathfindingLinksets", boost::bind(&enable_object_select_in_pathfinding_linksets));      enable.add("VisibleSelectInPathfindingLinksets", boost::bind(&visible_object_select_in_pathfinding_linksets)); diff --git a/indra/newview/llviewermenu.h b/indra/newview/llviewermenu.h index 8c5e0705d0..68c3dbc126 100644 --- a/indra/newview/llviewermenu.h +++ b/indra/newview/llviewermenu.h @@ -44,54 +44,21 @@ void init_menus();  void cleanup_menus();  void show_debug_menus(); // checks for if menus should be shown first. -void toggle_debug_menus(void*); -void show_context_menu( S32 x, S32 y, MASK mask ); -void show_build_mode_context_menu(S32 x, S32 y, MASK mask); +void toggle_debug_menus();  void show_navbar_context_menu(LLView* ctrl, S32 x, S32 y);  void show_topinfobar_context_menu(LLView* ctrl, S32 x, S32 y);  void handle_reset_view(); -void handle_cut(void*); -void handle_copy(void*); -void handle_paste(void*); -void handle_delete(void*); -void handle_redo(void*); -void handle_undo(void*); -void handle_select_all(void*); -void handle_deselect(void*); -void handle_delete_object(); -void handle_duplicate(void*); -void handle_duplicate_in_place(void*); -bool enable_not_have_card(void *userdata);  void process_grant_godlike_powers(LLMessageSystem* msg, void**); -bool enable_cut(void*); -bool enable_copy(void*); -bool enable_paste(void*); -bool enable_select_all(void*); -bool enable_deselect(void*); -bool enable_undo(void*); -bool enable_redo(void*); -  bool is_agent_mappable(const LLUUID& agent_id); -void confirm_replace_attachment(S32 option, void* user_data); -void handle_detach_from_avatar(const LLSD& user_data); -void attach_label(std::string& label, const LLSD&); -void detach_label(std::string& label, const LLSD&); -void handle_detach(void*); -bool enable_god_full(void* user_data); -bool enable_god_liaison(void* user_data); -bool enable_god_basic(void* user_data); +bool enable_god_full(); +bool enable_god_liaison(); +bool enable_god_basic();  void check_merchant_status(bool force = false); -void exchange_callingcard(const LLUUID& dest_id); - -void handle_gestures(void*); -void handle_sit_down(void*); -void handle_object_build(void*);  void handle_object_touch();  bool enable_object_edit_gltf_material(); -bool enable_object_save_gltf_material();  bool enable_object_open();  void handle_object_open(); @@ -106,12 +73,11 @@ void handle_buy();  void handle_take(bool take_separate = false);  void handle_take_copy();  void handle_look_at_selection(const LLSD& param); -void handle_zoom_to_object(LLUUID object_id); +void handle_zoom_to_object(const LLUUID& object_id);  void handle_object_return();  void handle_object_delete();  void handle_object_edit();  void handle_object_edit_gltf_material(); -void handle_object_save_gltf_material();  void handle_attachment_edit(const LLUUID& inv_item_id);  void handle_attachment_touch(const LLUUID& inv_item_id); @@ -144,13 +110,10 @@ bool enable_pay_object();  bool enable_buy_object();  bool handle_go_to(); -// Export to XML or Collada -void handle_export_selected( void * ); -  // Convert strings to internal types -U32 render_type_from_string(std::string render_type); -U32 feature_from_string(std::string feature); -U64 info_display_from_string(std::string info_display); +U32 render_type_from_string(std::string_view render_type); +U32 feature_from_string(std::string_view feature); +U64 info_display_from_string(std::string_view info_display);  class LLViewerMenuHolderGL : public LLMenuHolderGL  { diff --git a/indra/newview/llviewermenufile.cpp b/indra/newview/llviewermenufile.cpp index 83f8e96f9a..ce66dbc03f 100644 --- a/indra/newview/llviewermenufile.cpp +++ b/indra/newview/llviewermenufile.cpp @@ -990,7 +990,7 @@ class LLFileQuit : public view_listener_t  }; -void handle_compress_image(void*) +void handle_compress_image()  {      LLFilePicker& picker = LLFilePicker::instance();      if (picker.getMultipleOpenFiles(LLFilePicker::FFLOAD_IMAGE)) @@ -1040,7 +1040,7 @@ size_t get_file_size(std::string &filename)      return file_length;  } -void handle_compress_file_test(void*) +void handle_compress_file_test()  {      LLFilePicker& picker = LLFilePicker::instance();      if (picker.getOpenFile()) diff --git a/indra/newview/llviewerregion.cpp b/indra/newview/llviewerregion.cpp index 71add76dd2..d59dfb88a8 100755 --- a/indra/newview/llviewerregion.cpp +++ b/indra/newview/llviewerregion.cpp @@ -2489,7 +2489,16 @@ void LLViewerRegion::setSimulatorFeatures(const LLSD& sim_features)              if (features.has("GLTFEnabled"))              {                  bool enabled = features["GLTFEnabled"]; -                gSavedSettings.setBOOL("GLTFEnabled", enabled); + +                // call setShaders the first time GLTFEnabled is received as true (causes GLTF specific shaders to be loaded) +                if (enabled != gSavedSettings.getBOOL("GLTFEnabled")) +                { +                    gSavedSettings.setBOOL("GLTFEnabled", enabled); +                    if (enabled) +                    { +                        LLViewerShaderMgr::instance()->setShaders(); +                    } +                }              }              else              { diff --git a/indra/newview/llviewershadermgr.cpp b/indra/newview/llviewershadermgr.cpp index a446be8b58..58b541b19b 100644 --- a/indra/newview/llviewershadermgr.cpp +++ b/indra/newview/llviewershadermgr.cpp @@ -439,13 +439,20 @@ void LLViewerShaderMgr::finalizeShaderList()      mShaderList.push_back(&gDeferredDiffuseProgram);      mShaderList.push_back(&gDeferredBumpProgram);      mShaderList.push_back(&gDeferredPBROpaqueProgram); -    mShaderList.push_back(&gGLTFPBRMetallicRoughnessProgram); + +    if (gSavedSettings.getBOOL("GLTFEnabled")) +    { +        mShaderList.push_back(&gGLTFPBRMetallicRoughnessProgram); +    } +      mShaderList.push_back(&gDeferredAvatarProgram);      mShaderList.push_back(&gDeferredTerrainProgram); +      for (U32 paint_type = 0; paint_type < TERRAIN_PAINT_TYPE_COUNT; ++paint_type)      {          mShaderList.push_back(&gDeferredPBRTerrainProgram[paint_type]);      } +      mShaderList.push_back(&gDeferredDiffuseAlphaMaskProgram);      mShaderList.push_back(&gDeferredNonIndexedDiffuseAlphaMaskProgram);      mShaderList.push_back(&gDeferredTreeProgram); @@ -1340,26 +1347,29 @@ bool LLViewerShaderMgr::loadShadersDeferred()          llassert(success);      } -    if (success) +    if (gSavedSettings.getBOOL("GLTFEnabled"))      { -        gGLTFPBRMetallicRoughnessProgram.mName = "GLTF PBR Metallic Roughness Shader"; -        gGLTFPBRMetallicRoughnessProgram.mFeatures.hasSrgb = true; +        if (success) +        { +            gGLTFPBRMetallicRoughnessProgram.mName = "GLTF PBR Metallic Roughness Shader"; +            gGLTFPBRMetallicRoughnessProgram.mFeatures.hasSrgb = true; -        gGLTFPBRMetallicRoughnessProgram.mShaderFiles.clear(); -        gGLTFPBRMetallicRoughnessProgram.mShaderFiles.push_back(make_pair("gltf/pbrmetallicroughnessV.glsl", GL_VERTEX_SHADER)); -        gGLTFPBRMetallicRoughnessProgram.mShaderFiles.push_back(make_pair("gltf/pbrmetallicroughnessF.glsl", GL_FRAGMENT_SHADER)); -        gGLTFPBRMetallicRoughnessProgram.mShaderLevel = mShaderLevel[SHADER_DEFERRED]; -        gGLTFPBRMetallicRoughnessProgram.clearPermutations(); +            gGLTFPBRMetallicRoughnessProgram.mShaderFiles.clear(); +            gGLTFPBRMetallicRoughnessProgram.mShaderFiles.push_back(make_pair("gltf/pbrmetallicroughnessV.glsl", GL_VERTEX_SHADER)); +            gGLTFPBRMetallicRoughnessProgram.mShaderFiles.push_back(make_pair("gltf/pbrmetallicroughnessF.glsl", GL_FRAGMENT_SHADER)); +            gGLTFPBRMetallicRoughnessProgram.mShaderLevel = mShaderLevel[SHADER_DEFERRED]; +            gGLTFPBRMetallicRoughnessProgram.clearPermutations(); -        success = make_gltf_variants(gGLTFPBRMetallicRoughnessProgram, use_sun_shadow); +            success = make_gltf_variants(gGLTFPBRMetallicRoughnessProgram, use_sun_shadow); -        //llassert(success); -        if (!success) -        { -            LL_WARNS() << "Failed to create GLTF PBR Metallic Roughness Shader, disabling!" << LL_ENDL; -            gSavedSettings.setBOOL("RenderCanUseGLTFPBROpaqueShaders", false); -            // continue as if this shader never happened -            success = true; +            //llassert(success); +            if (!success) +            { +                LL_WARNS() << "Failed to create GLTF PBR Metallic Roughness Shader, disabling!" << LL_ENDL; +                gSavedSettings.setBOOL("RenderCanUseGLTFPBROpaqueShaders", false); +                // continue as if this shader never happened +                success = true; +            }          }      } @@ -3140,29 +3150,32 @@ bool LLViewerShaderMgr::loadShadersInterface()          success = gCopyDepthProgram.createShader();      } -    if (success) +    if (gSavedSettings.getBOOL("LocalTerrainPaintEnabled"))      { -        LLGLSLShader* shader = &gPBRTerrainBakeProgram; -        U32 bit_depth = gSavedSettings.getU32("TerrainPaintBitDepth"); -        // LLTerrainPaintMap currently uses an RGB8 texture internally -        bit_depth = llclamp(bit_depth, 1, 8); -        shader->mName = llformat("Terrain Bake Shader RGB%o", bit_depth); -        shader->mFeatures.isPBRTerrain = true; - -        shader->mShaderFiles.clear(); -        shader->mShaderFiles.push_back(make_pair("interface/pbrTerrainBakeV.glsl", GL_VERTEX_SHADER)); -        shader->mShaderFiles.push_back(make_pair("interface/pbrTerrainBakeF.glsl", GL_FRAGMENT_SHADER)); -        shader->mShaderLevel = mShaderLevel[SHADER_INTERFACE]; -        const U32 value_range = (1 << bit_depth) - 1; -        shader->addPermutation("TERRAIN_PAINT_PRECISION", llformat("%d", value_range)); -        success = success && shader->createShader(); -        //llassert(success); -        if (!success) +        if (success)          { -            LL_WARNS() << "Failed to create shader '" << shader->mName << "', disabling!" << LL_ENDL; -            gSavedSettings.setBOOL("RenderCanUseTerrainBakeShaders", false); -            // continue as if this shader never happened -            success = true; +            LLGLSLShader* shader = &gPBRTerrainBakeProgram; +            U32 bit_depth = gSavedSettings.getU32("TerrainPaintBitDepth"); +            // LLTerrainPaintMap currently uses an RGB8 texture internally +            bit_depth = llclamp(bit_depth, 1, 8); +            shader->mName = llformat("Terrain Bake Shader RGB%o", bit_depth); +            shader->mFeatures.isPBRTerrain = true; + +            shader->mShaderFiles.clear(); +            shader->mShaderFiles.push_back(make_pair("interface/pbrTerrainBakeV.glsl", GL_VERTEX_SHADER)); +            shader->mShaderFiles.push_back(make_pair("interface/pbrTerrainBakeF.glsl", GL_FRAGMENT_SHADER)); +            shader->mShaderLevel = mShaderLevel[SHADER_INTERFACE]; +            const U32 value_range = (1 << bit_depth) - 1; +            shader->addPermutation("TERRAIN_PAINT_PRECISION", llformat("%d", value_range)); +            success = success && shader->createShader(); +            //llassert(success); +            if (!success) +            { +                LL_WARNS() << "Failed to create shader '" << shader->mName << "', disabling!" << LL_ENDL; +                gSavedSettings.setBOOL("RenderCanUseTerrainBakeShaders", false); +                // continue as if this shader never happened +                success = true; +            }          }      } diff --git a/indra/newview/llviewertexture.cpp b/indra/newview/llviewertexture.cpp index 681d91c945..9e1cb84bd1 100644 --- a/indra/newview/llviewertexture.cpp +++ b/indra/newview/llviewertexture.cpp @@ -1361,51 +1361,6 @@ void LLViewerFetchedTexture::addToCreateTexture()      }      else      { -        LL_PROFILE_ZONE_SCOPED_CATEGORY_TEXTURE; -#if 1 -        // -        //if mRequestedDiscardLevel > mDesiredDiscardLevel, we assume the required image res keep going up, -        //so do not scale down the over qualified image. -        //Note: scaling down image is expensensive. Do it only when very necessary. -        // -        if(mRequestedDiscardLevel <= mDesiredDiscardLevel && !mForceToSaveRawImage) -        { -            U32 w = mFullWidth >> mRawDiscardLevel; -            U32 h = mFullHeight >> mRawDiscardLevel; - -            //if big image, do not load extra data -            //scale it down to size >= LLViewerTexture::sMinLargeImageSize -            if(w * h > LLViewerTexture::sMinLargeImageSize) -            { -                S32 d_level = llmin(mRequestedDiscardLevel, (S32)mDesiredDiscardLevel) - mRawDiscardLevel; - -                if(d_level > 0) -                { -                    S32 i = 0; -                    while((d_level > 0) && ((w >> i) * (h >> i) > LLViewerTexture::sMinLargeImageSize)) -                    { -                        i++; -                        d_level--; -                    } -                    if(i > 0) -                    { -                        mRawDiscardLevel += i; -                        if(mRawDiscardLevel >= getDiscardLevel() && getDiscardLevel() > 0) -                        { -                            mNeedsCreateTexture = false; -                            destroyRawImage(); -                            return; -                        } - -                        { -                            //make a duplicate in case somebody else is using this raw image -                            mRawImage = mRawImage->scaled(w >> i, h >> i); -                        } -                    } -                } -            } -        } -#endif          scheduleCreateTexture();      }      return; diff --git a/indra/newview/llviewerwindow.cpp b/indra/newview/llviewerwindow.cpp index 8ea8fbf905..1be80a5e02 100644 --- a/indra/newview/llviewerwindow.cpp +++ b/indra/newview/llviewerwindow.cpp @@ -5358,8 +5358,8 @@ bool LLViewerWindow::cubeSnapshot(const LLVector3& origin, LLCubeMapArray* cubea      LLViewerCamera* camera = LLViewerCamera::getInstance();      LLViewerCamera saved_camera = LLViewerCamera::instance(); -    glh::matrix4f saved_proj = get_current_projection(); -    glh::matrix4f saved_mod = get_current_modelview(); +    glm::mat4 saved_proj = get_current_projection(); +    glm::mat4 saved_mod = get_current_modelview();      // camera constants for the square, cube map capture image      camera->setAspect(1.0); // must set aspect ratio first to avoid undesirable clamping of vertical FoV diff --git a/indra/newview/llvoavatar.cpp b/indra/newview/llvoavatar.cpp index b04bb99b97..1b52e4f870 100644 --- a/indra/newview/llvoavatar.cpp +++ b/indra/newview/llvoavatar.cpp @@ -1554,7 +1554,8 @@ void LLVOAvatar::calculateSpatialExtents(LLVector4a& newMin, LLVector4a& newMax)      size.setSub(newMax,newMin);      size.mul(0.5f); -    mPixelArea = LLPipeline::calcPixelArea(center, size, *LLViewerCamera::getInstance()); +    F32 pixel_area = LLPipeline::calcPixelArea(center, size, *LLViewerCamera::getInstance()); +    setCorrectedPixelArea(pixel_area);  }  void render_sphere_and_line(const LLVector3& begin_pos, const LLVector3& end_pos, F32 sphere_scale, const LLVector3& occ_color, const LLVector3& visible_color) @@ -1846,36 +1847,36 @@ bool LLVOAvatar::lineSegmentIntersect(const LLVector4a& start, const LLVector4a&          {              mCollisionVolumes[i].updateWorldMatrix(); -            glh::matrix4f mat((F32*) mCollisionVolumes[i].getXform()->getWorldMatrix().mMatrix); -            glh::matrix4f inverse = mat.inverse(); -            glh::matrix4f norm_mat = inverse.transpose(); +            glm::mat4 mat(glm::make_mat4((F32*) mCollisionVolumes[i].getXform()->getWorldMatrix().mMatrix)); +            glm::mat4 inverse = glm::inverse(mat); +            glm::mat4 norm_mat = glm::transpose(inverse); -            glh::vec3f p1(start.getF32ptr()); -            glh::vec3f p2(end.getF32ptr()); +            glm::vec3 p1(glm::make_vec3(start.getF32ptr())); +            glm::vec3 p2(glm::make_vec3(end.getF32ptr())); -            inverse.mult_matrix_vec(p1); -            inverse.mult_matrix_vec(p2); +            p1 = mul_mat4_vec3(inverse, p1); +            p2 = mul_mat4_vec3(inverse, p2);              LLVector3 position;              LLVector3 norm; -            if (linesegment_sphere(LLVector3(p1.v), LLVector3(p2.v), LLVector3(0,0,0), 1.f, position, norm)) +            if (linesegment_sphere(LLVector3(glm::value_ptr(p1)), LLVector3(glm::value_ptr(p2)), LLVector3(0,0,0), 1.f, position, norm))              { -                glh::vec3f res_pos(position.mV); -                mat.mult_matrix_vec(res_pos); +                glm::vec3 res_pos(glm::make_vec3(position.mV)); +                res_pos = mul_mat4_vec3(mat, res_pos); -                norm.normalize(); -                glh::vec3f res_norm(norm.mV); -                norm_mat.mult_matrix_dir(res_norm); +                 glm::vec3 res_norm(glm::make_vec3(norm.mV)); +                res_norm = glm::normalize(res_norm); +                res_norm = glm::mat3(norm_mat) * res_norm;                  if (intersection)                  { -                    intersection->load3(res_pos.v); +                    intersection->load3(glm::value_ptr(res_pos));                  }                  if (normal)                  { -                    normal->load3(res_norm.v); +                    normal->load3(glm::value_ptr(res_norm));                  }                  return true; @@ -2880,7 +2881,7 @@ static void override_bbox(LLDrawable* drawable, LLVector4a* extents)  {      LL_PROFILE_ZONE_SCOPED_CATEGORY_SPATIAL;      drawable->setSpatialExtents(extents[0], extents[1]); -    drawable->setPositionGroup(LLVector4a(0, 0, 0)); +    drawable->setPositionGroup(LLVector4a(0.f, 0.f, 0.f));      drawable->movePartition();  } @@ -2901,19 +2902,12 @@ void LLVOAvatar::idleUpdateMisc(bool detailed_update)      if (detailed_update)      {          U32 draw_order = 0; -        S32 attachment_selected = LLSelectMgr::getInstance()->getSelection()->getObjectCount() && LLSelectMgr::getInstance()->getSelection()->isAttachment(); -        for (attachment_map_t::iterator iter = mAttachmentPoints.begin(); -             iter != mAttachmentPoints.end(); -             ++iter) +        bool attachment_selected = LLSelectMgr::getInstance()->getSelection()->getObjectCount() > 0 && LLSelectMgr::getInstance()->getSelection()->isAttachment(); +        for (const auto& [attachment_point_id, attachment] : mAttachmentPoints)          { -            LLViewerJointAttachment* attachment = iter->second; - -            for (LLViewerJointAttachment::attachedobjs_vec_t::iterator attachment_iter = attachment->mAttachedObjects.begin(); -                 attachment_iter != attachment->mAttachedObjects.end(); -                 ++attachment_iter) +            for (auto& attached_object : attachment->mAttachedObjects)              { -                LLViewerObject* attached_object = attachment_iter->get(); -                if (!attached_object +                if (attached_object.isNull()                      || attached_object->isDead()                      || !attachment->getValid()                      || attached_object->mDrawable.isNull()) @@ -3695,21 +3689,22 @@ LLVector3 LLVOAvatar::idleCalcNameTagPosition(const LLVector3 &root_pos_last)      name_position += (local_camera_up * root_rot) - (projected_vec(local_camera_at * root_rot, camera_to_av));      name_position += pixel_up_vec * NAMETAG_VERTICAL_SCREEN_OFFSET; -    const F32 water_height = getRegion()->getWaterHeight(); -    static const F32 WATER_HEIGHT_DELTA = 0.25f; -    if (name_position[VZ] < water_height + WATER_HEIGHT_DELTA) +    // Avoid of crossing the name tag by the water surface +    if (mNameText)      { -        if (LLViewerCamera::getInstance()->getOrigin()[VZ] >= water_height) +        F32 water_height = getRegion()->getWaterHeight(); +        static const F32 WATER_HEIGHT_ABOVE_DELTA = 0.25; +        if (name_position[VZ] < water_height + WATER_HEIGHT_ABOVE_DELTA)          { -            name_position[VZ] = water_height; -        } -        else if (mNameText) // both camera and HUD are below watermark -        { -            F32 name_world_height = mNameText->getWorldHeight(); -            F32 max_z_position = water_height - name_world_height; -            if (name_position[VZ] > max_z_position) +            F32 camera_height = LLViewerCamera::getInstance()->getOrigin()[VZ]; +            if (camera_height >= water_height)              { -                name_position[VZ] = max_z_position; +                F32 name_world_height = mNameText->getWorldHeight(); +                static const F32 WATER_HEIGHT_BELOW_DELTA = 0.5; +                if (name_position[VZ] + name_world_height > water_height - WATER_HEIGHT_BELOW_DELTA) +                { +                    name_position[VZ] = water_height + WATER_HEIGHT_ABOVE_DELTA; +                }              }          }      } @@ -4935,27 +4930,22 @@ void LLVOAvatar::updateVisibility()          {              visible = true;          } -        else -        { -            visible = false; -        } -        if(isSelf()) +        if (isSelf())          {              if (!gAgentWearables.areWearablesLoaded())              {                  visible = false;              }          } -        else if( !mFirstAppearanceMessageReceived ) +        else if (!mFirstAppearanceMessageReceived)          {              visible = false;          }          if (sDebugInvisible)          { -            LLNameValue* firstname = getNVPair("FirstName"); -            if (firstname) +            if (LLNameValue* firstname = getNVPair("FirstName"))              {                  LL_DEBUGS("Avatar") << avString() << " updating visibility" << LL_ENDL;              } @@ -5044,11 +5034,14 @@ void LLVOAvatar::updateVisibility()          }      } -    if ( visible != mVisible ) +    if (visible != mVisible)      {          LL_DEBUGS("AvatarRender") << "visible was " << mVisible << " now " << visible << LL_ENDL;      } +      mVisible = visible; + +    mVisibilityPreference = visible ? getPixelArea() : 0;  }  // private @@ -7110,6 +7103,18 @@ void LLVOAvatar::updateVisualParams()      dirtyMesh();      updateHeadOffset();  } + +void LLVOAvatar::setCorrectedPixelArea(F32 area) +{ +    // We always want to look good to ourselves +    if (isSelf()) +    { +        area = llmax(area, F32(getTexImageSize() / 16)); +    } + +    setPixelArea(area); +} +  //-----------------------------------------------------------------------------  // isActive()  //----------------------------------------------------------------------------- @@ -7137,7 +7142,7 @@ void LLVOAvatar::setPixelAreaAndAngle(LLAgent &agent)      size.mul(0.5f);      mImpostorPixelArea = LLPipeline::calcPixelArea(center, size, *LLViewerCamera::getInstance()); -    mPixelArea = mImpostorPixelArea; +    setCorrectedPixelArea(mImpostorPixelArea);      F32 range = mDrawable->mDistanceWRTCamera; @@ -7150,12 +7155,6 @@ void LLVOAvatar::setPixelAreaAndAngle(LLAgent &agent)          F32 radius = size.getLength3().getF32();          mAppAngle = (F32) atan2( radius, range) * RAD_TO_DEG;      } - -    // We always want to look good to ourselves -    if( isSelf() ) -    { -        mPixelArea = llmax( mPixelArea, F32(getTexImageSize() / 16) ); -    }  }  //----------------------------------------------------------------------------- @@ -8610,60 +8609,53 @@ void LLVOAvatar::updateMeshVisibility()      if (getOverallAppearance() == AOA_NORMAL)      { -        for (attachment_map_t::iterator iter = mAttachmentPoints.begin(); -             iter != mAttachmentPoints.end(); -             ++iter) +        for (const auto& [attachment_point_id, attachment] : mAttachmentPoints)          { -            LLViewerJointAttachment* attachment = iter->second; -            if (attachment) +            if (!attachment) +                continue; + +            for (const auto& objectp : attachment->mAttachedObjects)              { -                for (LLViewerJointAttachment::attachedobjs_vec_t::iterator attachment_iter = attachment->mAttachedObjects.begin(); -                     attachment_iter != attachment->mAttachedObjects.end(); -                     ++attachment_iter) +                if (objectp.isNull()) +                    continue; + +                for (int face_index = 0; face_index < objectp->getNumTEs(); face_index++)                  { -                    LLViewerObject *objectp = attachment_iter->get(); -                    if (objectp) -                    { -                        for (int face_index = 0; face_index < objectp->getNumTEs(); face_index++) -                        { -                            LLTextureEntry* tex_entry = objectp->getTE(face_index); -                            bake_flag[BAKED_HEAD] |= (tex_entry->getID() == IMG_USE_BAKED_HEAD); -                            bake_flag[BAKED_EYES] |= (tex_entry->getID() == IMG_USE_BAKED_EYES); -                            bake_flag[BAKED_HAIR] |= (tex_entry->getID() == IMG_USE_BAKED_HAIR); -                            bake_flag[BAKED_LOWER] |= (tex_entry->getID() == IMG_USE_BAKED_LOWER); -                            bake_flag[BAKED_UPPER] |= (tex_entry->getID() == IMG_USE_BAKED_UPPER); -                            bake_flag[BAKED_SKIRT] |= (tex_entry->getID() == IMG_USE_BAKED_SKIRT); -                            bake_flag[BAKED_LEFT_ARM] |= (tex_entry->getID() == IMG_USE_BAKED_LEFTARM); -                            bake_flag[BAKED_LEFT_LEG] |= (tex_entry->getID() == IMG_USE_BAKED_LEFTLEG); -                            bake_flag[BAKED_AUX1] |= (tex_entry->getID() == IMG_USE_BAKED_AUX1); -                            bake_flag[BAKED_AUX2] |= (tex_entry->getID() == IMG_USE_BAKED_AUX2); -                            bake_flag[BAKED_AUX3] |= (tex_entry->getID() == IMG_USE_BAKED_AUX3); -                        } -                    } +                    LLTextureEntry* tex_entry = objectp->getTE(face_index); +                    const auto& tex_id = tex_entry->getID(); +                    bake_flag[BAKED_HEAD] |= (tex_id == IMG_USE_BAKED_HEAD); +                    bake_flag[BAKED_EYES] |= (tex_id == IMG_USE_BAKED_EYES); +                    bake_flag[BAKED_HAIR] |= (tex_id == IMG_USE_BAKED_HAIR); +                    bake_flag[BAKED_LOWER] |= (tex_id == IMG_USE_BAKED_LOWER); +                    bake_flag[BAKED_UPPER] |= (tex_id == IMG_USE_BAKED_UPPER); +                    bake_flag[BAKED_SKIRT] |= (tex_id == IMG_USE_BAKED_SKIRT); +                    bake_flag[BAKED_LEFT_ARM] |= (tex_id == IMG_USE_BAKED_LEFTARM); +                    bake_flag[BAKED_LEFT_LEG] |= (tex_id == IMG_USE_BAKED_LEFTLEG); +                    bake_flag[BAKED_AUX1] |= (tex_id == IMG_USE_BAKED_AUX1); +                    bake_flag[BAKED_AUX2] |= (tex_id == IMG_USE_BAKED_AUX2); +                    bake_flag[BAKED_AUX3] |= (tex_id == IMG_USE_BAKED_AUX3); +                } -                    LLViewerObject::const_child_list_t& child_list = objectp->getChildren(); -                    for (LLViewerObject::child_list_t::const_iterator iter1 = child_list.begin(); -                         iter1 != child_list.end(); ++iter1) +                for (const auto& objectchild : objectp->getChildren()) +                { +                    if (objectchild.isNull()) +                        continue; + +                    for (int face_index = 0; face_index < objectchild->getNumTEs(); face_index++)                      { -                        LLViewerObject* objectchild = *iter1; -                        if (objectchild) -                        { -                            for (int face_index = 0; face_index < objectchild->getNumTEs(); face_index++) -                            { -                                LLTextureEntry* tex_entry = objectchild->getTE(face_index); -                                bake_flag[BAKED_HEAD] |= (tex_entry->getID() == IMG_USE_BAKED_HEAD); -                                bake_flag[BAKED_EYES] |= (tex_entry->getID() == IMG_USE_BAKED_EYES); -                                bake_flag[BAKED_HAIR] |= (tex_entry->getID() == IMG_USE_BAKED_HAIR); -                                bake_flag[BAKED_LOWER] |= (tex_entry->getID() == IMG_USE_BAKED_LOWER); -                                bake_flag[BAKED_UPPER] |= (tex_entry->getID() == IMG_USE_BAKED_UPPER); -                                bake_flag[BAKED_SKIRT] |= (tex_entry->getID() == IMG_USE_BAKED_SKIRT); -                                bake_flag[BAKED_LEFT_ARM] |= (tex_entry->getID() == IMG_USE_BAKED_LEFTARM); -                                bake_flag[BAKED_LEFT_LEG] |= (tex_entry->getID() == IMG_USE_BAKED_LEFTLEG); -                                bake_flag[BAKED_AUX1] |= (tex_entry->getID() == IMG_USE_BAKED_AUX1); -                                bake_flag[BAKED_AUX2] |= (tex_entry->getID() == IMG_USE_BAKED_AUX2); -                                bake_flag[BAKED_AUX3] |= (tex_entry->getID() == IMG_USE_BAKED_AUX3); -                            } -                        } +                        LLTextureEntry* tex_entry = objectchild->getTE(face_index); +                        const auto& tex_id = tex_entry->getID(); +                        bake_flag[BAKED_HEAD] |= (tex_id == IMG_USE_BAKED_HEAD); +                        bake_flag[BAKED_EYES] |= (tex_id == IMG_USE_BAKED_EYES); +                        bake_flag[BAKED_HAIR] |= (tex_id == IMG_USE_BAKED_HAIR); +                        bake_flag[BAKED_LOWER] |= (tex_id == IMG_USE_BAKED_LOWER); +                        bake_flag[BAKED_UPPER] |= (tex_id == IMG_USE_BAKED_UPPER); +                        bake_flag[BAKED_SKIRT] |= (tex_id == IMG_USE_BAKED_SKIRT); +                        bake_flag[BAKED_LEFT_ARM] |= (tex_id == IMG_USE_BAKED_LEFTARM); +                        bake_flag[BAKED_LEFT_LEG] |= (tex_id == IMG_USE_BAKED_LEFTLEG); +                        bake_flag[BAKED_AUX1] |= (tex_id == IMG_USE_BAKED_AUX1); +                        bake_flag[BAKED_AUX2] |= (tex_id == IMG_USE_BAKED_AUX2); +                        bake_flag[BAKED_AUX3] |= (tex_id == IMG_USE_BAKED_AUX3);                      }                  }              } @@ -9787,7 +9779,7 @@ void LLVOAvatar::applyParsedAppearanceMessage(LLAppearanceMessageContents& conte      setCompositeUpdatesEnabled( true );      // If all of the avatars are completely baked, release the global image caches to conserve memory. -    LLVOAvatar::cullAvatarsByPixelArea(); +    cullAvatarsByPixelArea();      if (isSelf())      { @@ -10419,12 +10411,10 @@ void LLVOAvatar::dumpArchetypeXML(const std::string& prefix, bool group_by_weara  void LLVOAvatar::setVisibilityRank(U32 rank)  { -    if (mDrawable.isNull() || mDrawable->isDead()) +    if (mDrawable.notNull() && !mDrawable->isDead())      { -        // do nothing -        return; +        mVisibilityRank = rank;      } -    mVisibilityRank = rank;  }  // Assumes LLVOAvatar::sInstances has already been sorted. @@ -10455,32 +10445,34 @@ void LLVOAvatar::cullAvatarsByPixelArea()  {      LLCharacter::sInstances.sort([](LLCharacter* lhs, LLCharacter* rhs)          { -            return lhs->getPixelArea() > rhs->getPixelArea(); +            return ((LLVOAvatar*)lhs)->mVisibilityPreference > ((LLVOAvatar*)rhs)->mVisibilityPreference;          });      // Update the avatars that have changed status +    U32 rank = 2; // Rank 1 is reserved for self. +    for (LLCharacter* character : LLCharacter::sInstances)      { -        U32 rank = 2; //1 is reserved for self. -        for (LLCharacter* character : LLCharacter::sInstances) -        { -            LLVOAvatar* inst = (LLVOAvatar*)character; -            bool culled = !inst->isSelf() && !inst->isFullyBaked(); +        LLVOAvatar* inst = (LLVOAvatar*)character; +        bool culled = !inst->isSelf() && !inst->isFullyBaked(); -            if (inst->mCulled != culled) -            { -                inst->mCulled = culled; -                LL_DEBUGS() << "avatar " << inst->getID() << (culled ? " start culled" : " start not culled" ) << LL_ENDL; -                inst->updateMeshTextures(); -            } +        if (inst->mCulled != culled) +        { +            inst->mCulled = culled; +            LL_DEBUGS() << "avatar " << inst->getID() << (culled ? " start culled" : " start not culled" ) << LL_ENDL; +            inst->updateMeshTextures(); +        } -            if (inst->isSelf()) -            { -                inst->setVisibilityRank(1); -            } -            else if (inst->mDrawable.notNull() && inst->mDrawable->isVisible()) -            { -                inst->setVisibilityRank(rank++); -            } +        if (inst->isSelf()) +        { +            inst->setVisibilityRank(1); +        } +        else if (inst->mDrawable.notNull() && inst->mDrawable->isVisible()) +        { +            inst->setVisibilityRank(rank++); +        } +        else +        { +            inst->setVisibilityRank(sMaxNonImpostors * 5);          }      } @@ -10684,14 +10676,18 @@ void LLVOAvatar::updateRiggingInfo()      std::map<LLUUID, S32> curr_rigging_info_key; -    // Get current rigging info key -    for (LLVOVolume* vol : volumes)      { -        if (vol->isMesh() && vol->getVolume()) +        LL_PROFILE_ZONE_NAMED_CATEGORY_AVATAR("update rig info - get key") + +        // Get current rigging info key +        for (LLVOVolume* vol : volumes)          { -            const LLUUID& mesh_id = vol->getVolume()->getParams().getSculptID(); -            S32 max_lod = llmax(vol->getLOD(), vol->mLastRiggingInfoLOD); -            curr_rigging_info_key[mesh_id] = max_lod; +            if (vol->isMesh() && vol->getVolume()) +            { +                const LLUUID& mesh_id = vol->getVolume()->getParams().getSculptID(); +                S32 max_lod = llmax(vol->getLOD(), vol->mLastRiggingInfoLOD); +                curr_rigging_info_key[mesh_id] = max_lod; +            }          }      } diff --git a/indra/newview/llvoavatar.h b/indra/newview/llvoavatar.h index aa6aee0de5..2efb232704 100644 --- a/indra/newview/llvoavatar.h +++ b/indra/newview/llvoavatar.h @@ -127,17 +127,18 @@ public:      /*virtual*/ void            updateGL();      /*virtual*/ LLVOAvatar*     asAvatar(); -    virtual U32             processUpdateMessage(LLMessageSystem *mesgsys, +    virtual U32                 processUpdateMessage(LLMessageSystem *mesgsys,                                                       void **user_data,                                                       U32 block_num,                                                       const EObjectUpdateType update_type,                                                       LLDataPacker *dp); -    virtual void            idleUpdate(LLAgent &agent, const F64 &time); +    virtual void                idleUpdate(LLAgent &agent, const F64 &time);      /*virtual*/ bool            updateLOD(); -    bool                    updateJointLODs(); -    void                    updateLODRiggedAttachments( void ); +    bool                        updateJointLODs(); +    void                        updateLODRiggedAttachments(void); +    void                        setCorrectedPixelArea(F32 area);      /*virtual*/ bool            isActive() const; // Whether this object needs to do an idleUpdate. -    S32Bytes                totalTextureMemForUUIDS(std::set<LLUUID>& ids); +    S32Bytes                    totalTextureMemForUUIDS(std::set<LLUUID>& ids);      bool                        allTexturesCompletelyDownloaded(std::set<LLUUID>& ids) const;      bool                        allLocalTexturesCompletelyDownloaded() const;      bool                        allBakedTexturesCompletelyDownloaded() const; @@ -620,6 +621,7 @@ public:  protected:      void        updateVisibility();  private: +    F32         mVisibilityPreference;      U32         mVisibilityRank;      bool        mVisible; diff --git a/indra/newview/llvoicevivox.cpp b/indra/newview/llvoicevivox.cpp index d2a8b4e5cf..1e934ade59 100644 --- a/indra/newview/llvoicevivox.cpp +++ b/indra/newview/llvoicevivox.cpp @@ -5011,8 +5011,7 @@ bool LLVivoxVoiceClient::isVoiceWorking() const      //Added stateSessionTerminated state to avoid problems with call in parcels with disabled voice (EXT-4758)      // Condition with joining spatial num was added to take into account possible problems with connection to voice      // server(EXT-4313). See bug descriptions and comments for MAX_NORMAL_JOINING_SPATIAL_NUM for more info. -    return (mSpatialJoiningNum < MAX_NORMAL_JOINING_SPATIAL_NUM) && mIsProcessingChannels; -//  return (mSpatialJoiningNum < MAX_NORMAL_JOINING_SPATIAL_NUM) && (stateLoggedIn <= mState) && (mState <= stateSessionTerminated); +    return (mSpatialJoiningNum < MAX_NORMAL_JOINING_SPATIAL_NUM) && mIsLoggedIn;  }  // Returns true if the indicated participant in the current audio session is really an SL avatar. diff --git a/indra/newview/llvoicewebrtc.cpp b/indra/newview/llvoicewebrtc.cpp index 31d9574f38..3d684e5a1b 100644 --- a/indra/newview/llvoicewebrtc.cpp +++ b/indra/newview/llvoicewebrtc.cpp @@ -420,7 +420,7 @@ void LLWebRTCVoiceClient::notifyStatusObservers(LLVoiceClientStatusObserver::ESt          status != LLVoiceClientStatusObserver::STATUS_LEFT_CHANNEL &&          status != LLVoiceClientStatusObserver::STATUS_VOICE_DISABLED)      { -        bool voice_status = LLVoiceClient::getInstance()->voiceEnabled() && LLVoiceClient::getInstance()->isVoiceWorking(); +        bool voice_status = LLVoiceClient::getInstance()->voiceEnabled() && mIsProcessingChannels;          gAgent.setVoiceConnected(voice_status); @@ -1335,7 +1335,10 @@ bool LLWebRTCVoiceClient::startAdHocSession(const LLSD& channelInfo, bool notify  bool LLWebRTCVoiceClient::isVoiceWorking() const  { -    return mIsProcessingChannels; +    // webrtc is working if the coroutine is active in the case of +    // webrtc. WebRTC doesn't need to connect to a secondary process +    // or a login server to become active. +    return mIsCoroutineActive;  }  // Returns true if calling back the session URI after the session has closed is possible. diff --git a/indra/newview/llvotree.cpp b/indra/newview/llvotree.cpp index d982592ee7..14b4273b02 100644 --- a/indra/newview/llvotree.cpp +++ b/indra/newview/llvotree.cpp @@ -1047,10 +1047,9 @@ void LLVOTree::genBranchPipeline(LLStrider<LLVector3>& vertices,                  scale_mat.mMatrix[2][2] = scale*length;                  scale_mat *= matrix; -                glh::matrix4f norm((F32*) scale_mat.mMatrix); -                LLMatrix4 norm_mat = LLMatrix4(norm.inverse().transpose().m); +                glm::mat4 norm(glm::make_mat4((F32*) scale_mat.mMatrix)); +                LLMatrix4 norm_mat = LLMatrix4(glm::value_ptr(glm::transpose(glm::inverse(norm)))); -                norm_mat.invert();                  appendMesh(vertices, normals, tex_coords, colors, indices, index_offset, scale_mat, norm_mat,                              sLODVertexOffset[trunk_LOD], sLODVertexCount[trunk_LOD], sLODIndexCount[trunk_LOD], sLODIndexOffset[trunk_LOD]);              } @@ -1097,8 +1096,8 @@ void LLVOTree::genBranchPipeline(LLStrider<LLVector3>& vertices,                  scale_mat *= matrix; -                glh::matrix4f norm((F32*) scale_mat.mMatrix); -                LLMatrix4 norm_mat = LLMatrix4(norm.inverse().transpose().m); +                glm::mat4 norm(glm::make_mat4((F32*)scale_mat.mMatrix)); +                LLMatrix4 norm_mat = LLMatrix4(glm::value_ptr(glm::transpose(glm::inverse(norm))));                  appendMesh(vertices, normals, tex_coords, colors, indices, index_offset, scale_mat, norm_mat, 0, LEAF_VERTICES, LEAF_INDICES, 0);              } diff --git a/indra/newview/llvovolume.cpp b/indra/newview/llvovolume.cpp index 4b63354893..4f48a070e3 100644 --- a/indra/newview/llvovolume.cpp +++ b/indra/newview/llvovolume.cpp @@ -6028,8 +6028,8 @@ void LLVolumeGeometryManager::rebuildMesh(LLSpatialGroup* group)              group->mBuilt = 1.f; -            const U32 MAX_BUFFER_COUNT = 4096; -            LLVertexBuffer* locked_buffer[MAX_BUFFER_COUNT]; +            static std::vector<LLVertexBuffer*> locked_buffer; +            locked_buffer.resize(0);              U32 buffer_count = 0; @@ -6074,8 +6074,6 @@ void LLVolumeGeometryManager::rebuildMesh(LLSpatialGroup* group)                                      group->dirtyGeom();                                      gPipeline.markRebuild(group);                                  } - -                                buff->unmapBuffer();                              }                          }                      } @@ -6091,17 +6089,7 @@ void LLVolumeGeometryManager::rebuildMesh(LLSpatialGroup* group)              {                  LL_PROFILE_ZONE_NAMED("rebuildMesh - flush"); -                for (LLVertexBuffer** iter = locked_buffer, ** end_iter = locked_buffer+buffer_count; iter != end_iter; ++iter) -                { -                    (*iter)->unmapBuffer(); -                } - -                // don't forget alpha -                if(group != NULL && -                   !group->mVertexBuffer.isNull()) -                { -                    group->mVertexBuffer->unmapBuffer(); -                } +                LLVertexBuffer::flushBuffers();              }              group->clearState(LLSpatialGroup::MESH_DIRTY | LLSpatialGroup::NEW_DRAWINFO); @@ -6783,11 +6771,6 @@ U32 LLVolumeGeometryManager::genDrawInfo(LLSpatialGroup* group, U32 mask, LLFace              ++face_iter;          } - -        if (buffer) -        { -            buffer->unmapBuffer(); -        }      }      group->mBufferMap[mask].clear(); diff --git a/indra/newview/llwearablelist.cpp b/indra/newview/llwearablelist.cpp index 76348d4ea1..2d59712142 100644 --- a/indra/newview/llwearablelist.cpp +++ b/indra/newview/llwearablelist.cpp @@ -36,6 +36,7 @@  #include "llnotificationsutil.h"  #include "llinventorymodel.h"  #include "lltrans.h" +#include "llappviewer.h"  // Callback struct  struct LLWearableArrivedData @@ -97,6 +98,22 @@ void LLWearableList::getAsset(const LLAssetID& assetID, const std::string& weara  // static  void LLWearableList::processGetAssetReply( const char* filename, const LLAssetID& uuid, void* userdata, S32 status, LLExtStat ext_status )  { +    if (!LLCoros::on_main_coro()) +    { +        // if triggered from a coroutine, dispatch to main thread before accessing app state +        std::string filename_in = filename; +        LLUUID uuid_in = uuid; + +        LLAppViewer::instance()->postToMainCoro([=]() +            { +                processGetAssetReply(filename_in.c_str(), uuid_in, userdata, status, ext_status); +            }); + +        return; +    } + +    LL_PROFILE_ZONE_SCOPED_CATEGORY_AVATAR; +      bool isNewWearable = false;      LLWearableArrivedData* data = (LLWearableArrivedData*) userdata;      LLViewerWearable* wearable = NULL; // NULL indicates failure diff --git a/indra/newview/pipeline.cpp b/indra/newview/pipeline.cpp index 7b8739c7df..081f4a3564 100644 --- a/indra/newview/pipeline.cpp +++ b/indra/newview/pipeline.cpp @@ -228,7 +228,6 @@ const F32 DEFERRED_LIGHT_FALLOFF = 0.5f;  const U32 DEFERRED_VB_MASK = LLVertexBuffer::MAP_VERTEX | LLVertexBuffer::MAP_TEXCOORD0 | LLVertexBuffer::MAP_TEXCOORD1;  extern S32 gBoxFrame; -//extern bool gHideSelectedObjects;  extern bool gDisplaySwapBuffers;  extern bool gDebugGL;  extern bool gCubeSnapshot; @@ -2110,9 +2109,9 @@ F32 LLPipeline::calcPixelArea(const LLVector4a& center, const LLVector4a& size,      }      //get area of circle around node -    F32 app_angle = atanf(size.getLength3().getF32()/dist); -    F32 radius = app_angle*LLDrawable::sCurPixelAngle; -    return radius*radius * F_PI; +    F32 app_angle = atanf(size.getLength3().getF32() / dist); +    F32 radius = app_angle * LLDrawable::sCurPixelAngle; +    return radius * radius * F_PI;  }  void LLPipeline::grabReferences(LLCullResult& result) @@ -3895,20 +3894,17 @@ void LLPipeline::renderGeomDeferred(LLCamera& camera, bool do_occlusion)      if (&camera == LLViewerCamera::getInstance())      {   // a bit hacky, this is the start of the main render frame, figure out delta between last modelview matrix and          // current modelview matrix -        glh::matrix4f last_modelview(gGLLastModelView); -        glh::matrix4f cur_modelview(gGLModelView); +        glm::mat4 last_modelview = get_last_modelview(); +        glm::mat4 cur_modelview = get_current_modelview();          // goal is to have a matrix here that goes from the last frame's camera space to the current frame's camera space -        glh::matrix4f m = last_modelview.inverse();  // last camera space to world space -        m.mult_left(cur_modelview); // world space to camera space +        glm::mat4 m = glm::inverse(last_modelview);  // last camera space to world space +        m = cur_modelview * m; // world space to camera space -        glh::matrix4f n = m.inverse(); +        glm::mat4 n = glm::inverse(m); -        for (U32 i = 0; i < 16; ++i) -        { -            gGLDeltaModelView[i] = m.m[i]; -            gGLInverseDeltaModelView[i] = n.m[i]; -        } +        gGLDeltaModelView = m; +        gGLInverseDeltaModelView = n;      }      bool occlude = LLPipeline::sUseOcclusion > 1 && do_occlusion && !LLGLSLShader::sProfileEnabled; @@ -8075,7 +8071,7 @@ void LLPipeline::bindDeferredShader(LLGLSLShader& shader, LLRenderTarget* light_      if (sReflectionRender && !shader.getUniformLocation(LLShaderMgr::MODELVIEW_MATRIX))      { -        shader.uniformMatrix4fv(LLShaderMgr::MODELVIEW_MATRIX, 1, false, mReflectionModelView.m); +        shader.uniformMatrix4fv(LLShaderMgr::MODELVIEW_MATRIX, 1, false, glm::value_ptr(mReflectionModelView));      }      channel = shader.enableTexture(LLShaderMgr::DEFERRED_NOISE); @@ -8112,12 +8108,12 @@ void LLPipeline::bindDeferredShader(LLGLSLShader& shader, LLRenderTarget* light_      F32 mat[16*6];      for (U32 i = 0; i < 16; i++)      { -        mat[i] = mSunShadowMatrix[0].m[i]; -        mat[i+16] = mSunShadowMatrix[1].m[i]; -        mat[i+32] = mSunShadowMatrix[2].m[i]; -        mat[i+48] = mSunShadowMatrix[3].m[i]; -        mat[i+64] = mSunShadowMatrix[4].m[i]; -        mat[i+80] = mSunShadowMatrix[5].m[i]; +        mat[i] = glm::value_ptr(mSunShadowMatrix[0])[i]; +        mat[i+16] = glm::value_ptr(mSunShadowMatrix[1])[i]; +        mat[i+32] = glm::value_ptr(mSunShadowMatrix[2])[i]; +        mat[i+48] = glm::value_ptr(mSunShadowMatrix[3])[i]; +        mat[i+64] = glm::value_ptr(mSunShadowMatrix[4])[i]; +        mat[i+80] = glm::value_ptr(mSunShadowMatrix[5])[i];      }      shader.uniformMatrix4fv(LLShaderMgr::DEFERRED_SHADOW_MATRIX, 6, false, mat); @@ -8223,15 +8219,15 @@ void LLPipeline::bindDeferredShader(LLGLSLShader& shader, LLRenderTarget* light_      shader.uniform1f(LLShaderMgr::DEFERRED_DEPTH_CUTOFF, RenderEdgeDepthCutoff);      shader.uniform1f(LLShaderMgr::DEFERRED_NORM_CUTOFF, RenderEdgeNormCutoff); -    shader.uniformMatrix4fv(LLShaderMgr::MODELVIEW_DELTA_MATRIX, 1, GL_FALSE, gGLDeltaModelView); -    shader.uniformMatrix4fv(LLShaderMgr::INVERSE_MODELVIEW_DELTA_MATRIX, 1, GL_FALSE, gGLInverseDeltaModelView); +    shader.uniformMatrix4fv(LLShaderMgr::MODELVIEW_DELTA_MATRIX, 1, GL_FALSE, glm::value_ptr(gGLDeltaModelView)); +    shader.uniformMatrix4fv(LLShaderMgr::INVERSE_MODELVIEW_DELTA_MATRIX, 1, GL_FALSE, glm::value_ptr(gGLInverseDeltaModelView));      shader.uniform1i(LLShaderMgr::CUBE_SNAPSHOT, gCubeSnapshot ? 1 : 0);      if (shader.getUniformLocation(LLShaderMgr::DEFERRED_NORM_MATRIX) >= 0)      { -        glh::matrix4f norm_mat = get_current_modelview().inverse().transpose(); -        shader.uniformMatrix4fv(LLShaderMgr::DEFERRED_NORM_MATRIX, 1, false, norm_mat.m); +        glm::mat4 norm_mat = glm::transpose(glm::inverse(get_current_modelview())); +        shader.uniformMatrix4fv(LLShaderMgr::DEFERRED_NORM_MATRIX, 1, false, glm::value_ptr(norm_mat));      }      // auto adjust legacy sun color if needed @@ -8305,17 +8301,17 @@ void LLPipeline::renderDeferredLighting()          LLGLEnable cull(GL_CULL_FACE);          LLGLEnable blend(GL_BLEND); -        glh::matrix4f mat = copy_matrix(gGLModelView); +        glm::mat4 mat = get_current_modelview();          setupHWLights();  // to set mSun/MoonDir; -        glh::vec4f tc(mSunDir.mV); -        mat.mult_matrix_vec(tc); -        mTransformedSunDir.set(tc.v); +        glm::vec4 tc(glm::make_vec4(mSunDir.mV)); +        tc = mat * tc; +        mTransformedSunDir.set(glm::value_ptr(tc)); -        glh::vec4f tc_moon(mMoonDir.mV); -        mat.mult_matrix_vec(tc_moon); -        mTransformedMoonDir.set(tc_moon.v); +        glm::vec4 tc_moon(glm::make_vec4(mMoonDir.mV)); +        tc_moon = mat * tc_moon; +        mTransformedMoonDir.set(glm::value_ptr(tc_moon));          if ((RenderDeferredSSAO && !gCubeSnapshot) || RenderShadowDetail > 0)          { @@ -8331,26 +8327,6 @@ void LLPipeline::renderDeferredLighting()                  deferred_light_target->clear(GL_COLOR_BUFFER_BIT);                  glClearColor(0, 0, 0, 0); -                glh::matrix4f inv_trans = get_current_modelview().inverse().transpose(); - -                const U32 slice = 32; -                F32       offset[slice * 3]; -                for (U32 i = 0; i < 4; i++) -                { -                    for (U32 j = 0; j < 8; j++) -                    { -                        glh::vec3f v; -                        v.set_value(sinf(6.284f / 8 * j), cosf(6.284f / 8 * j), -(F32) i); -                        v.normalize(); -                        inv_trans.mult_matrix_vec(v); -                        v.normalize(); -                        offset[(i * 8 + j) * 3 + 0] = v.v[0]; -                        offset[(i * 8 + j) * 3 + 1] = v.v[2]; -                        offset[(i * 8 + j) * 3 + 2] = v.v[1]; -                    } -                } - -                sun_shader.uniform3fv(sOffset, slice, offset);                  sun_shader.uniform2f(LLShaderMgr::DEFERRED_SCREEN_RES,                                                (GLfloat)deferred_light_target->getWidth(),                                                (GLfloat)deferred_light_target->getHeight()); @@ -8583,10 +8559,10 @@ void LLPipeline::renderDeferredLighting()                              continue;                          } -                        glh::vec3f tc(c); -                        mat.mult_matrix_vec(tc); +                        glm::vec3 tc(glm::make_vec3(c)); +                        tc = mul_mat4_vec3(mat, tc); -                        fullscreen_lights.push_back(LLVector4(tc.v[0], tc.v[1], tc.v[2], s)); +                        fullscreen_lights.push_back(LLVector4(tc.x, tc.y, tc.z, s));                          light_colors.push_back(LLVector4(col.mV[0], col.mV[1], col.mV[2], volume->getLightFalloff(DEFERRED_LIGHT_FALLOFF)));                      }                  } @@ -8693,15 +8669,15 @@ void LLPipeline::renderDeferredLighting()                      sVisibleLightCount++; -                    glh::vec3f tc(c); -                    mat.mult_matrix_vec(tc); +                    glm::vec3 tc(glm::make_vec3(c)); +                    tc = mul_mat4_vec3(mat, tc);                      setupSpotLight(gDeferredMultiSpotLightProgram, drawablep);                      // send light color to shader in linear space                      LLColor3 col = volume->getLightLinearColor() * light_scale; -                    gDeferredMultiSpotLightProgram.uniform3fv(LLShaderMgr::LIGHT_CENTER, 1, tc.v); +                    gDeferredMultiSpotLightProgram.uniform3fv(LLShaderMgr::LIGHT_CENTER, 1, glm::value_ptr(tc));                      gDeferredMultiSpotLightProgram.uniform1f(LLShaderMgr::LIGHT_SIZE, light_size_final);                      gDeferredMultiSpotLightProgram.uniform3fv(LLShaderMgr::DIFFUSE_COLOR, 1, col.mV);                      gDeferredMultiSpotLightProgram.uniform1f(LLShaderMgr::LIGHT_FALLOFF, light_falloff_final); @@ -8944,10 +8920,10 @@ void LLPipeline::setupSpotLight(LLGLSLShader& shader, LLDrawable* drawablep)      //matrix from volume space to agent space      LLMatrix4 light_mat(quat, LLVector4(origin,1.f)); -    glh::matrix4f light_to_agent((F32*) light_mat.mMatrix); -    glh::matrix4f light_to_screen = get_current_modelview() * light_to_agent; +    glm::mat4 light_to_agent(glm::make_mat4((F32*) light_mat.mMatrix)); +    glm::mat4 light_to_screen = get_current_modelview() * light_to_agent; -    glh::matrix4f screen_to_light = light_to_screen.inverse(); +    glm::mat4 screen_to_light = glm::inverse(light_to_screen);      F32 s = volume->getLightRadius()*1.5f;      F32 near_clip = dist; @@ -8955,34 +8931,34 @@ void LLPipeline::setupSpotLight(LLGLSLShader& shader, LLDrawable* drawablep)      F32 height = scale.mV[VY];      F32 far_clip = s+dist-scale.mV[VZ]; -    F32 fovy = fov * RAD_TO_DEG; +    F32 fovy = fov; // radians      F32 aspect = width/height; -    glh::matrix4f trans(0.5f, 0.f, 0.f, 0.5f, -                0.f, 0.5f, 0.f, 0.5f, -                0.f, 0.f, 0.5f, 0.5f, -                0.f, 0.f, 0.f, 1.f); +    glm::mat4 trans(0.5f, 0.0f, 0.0f, 0.0f, +                        0.0f, 0.5f, 0.0f, 0.0f, +                        0.0f, 0.0f, 0.5f, 0.0f, +                        0.5f, 0.5f, 0.5f, 1.0f); -    glh::vec3f p1(0, 0, -(near_clip+0.01f)); -    glh::vec3f p2(0, 0, -(near_clip+1.f)); +    glm::vec3 p1(0, 0, -(near_clip+0.01f)); +    glm::vec3 p2(0, 0, -(near_clip+1.f)); -    glh::vec3f screen_origin(0, 0, 0); +    glm::vec3 screen_origin(0, 0, 0); -    light_to_screen.mult_matrix_vec(p1); -    light_to_screen.mult_matrix_vec(p2); -    light_to_screen.mult_matrix_vec(screen_origin); +    p1 = mul_mat4_vec3(light_to_screen, p1); +    p2 = mul_mat4_vec3(light_to_screen, p2); +    screen_origin = mul_mat4_vec3(light_to_screen, screen_origin); -    glh::vec3f n = p2-p1; -    n.normalize(); +    glm::vec3 n = p2-p1; +    n = glm::normalize(n);      F32 proj_range = far_clip - near_clip; -    glh::matrix4f light_proj = gl_perspective(fovy, aspect, near_clip, far_clip); +    glm::mat4 light_proj = glm::perspective(fovy, aspect, near_clip, far_clip);      screen_to_light = trans * light_proj * screen_to_light; -    shader.uniformMatrix4fv(LLShaderMgr::PROJECTOR_MATRIX, 1, false, screen_to_light.m); +    shader.uniformMatrix4fv(LLShaderMgr::PROJECTOR_MATRIX, 1, false, glm::value_ptr(screen_to_light));      shader.uniform1f(LLShaderMgr::PROJECTOR_NEAR, near_clip); -    shader.uniform3fv(LLShaderMgr::PROJECTOR_P, 1, p1.v); -    shader.uniform3fv(LLShaderMgr::PROJECTOR_N, 1, n.v); -    shader.uniform3fv(LLShaderMgr::PROJECTOR_ORIGIN, 1, screen_origin.v); +    shader.uniform3fv(LLShaderMgr::PROJECTOR_P, 1, glm::value_ptr(p1)); +    shader.uniform3fv(LLShaderMgr::PROJECTOR_N, 1, glm::value_ptr(n)); +    shader.uniform3fv(LLShaderMgr::PROJECTOR_ORIGIN, 1, glm::value_ptr(screen_origin));      shader.uniform1f(LLShaderMgr::PROJECTOR_RANGE, proj_range);      shader.uniform1f(LLShaderMgr::PROJECTOR_AMBIANCE, params.mV[2]);      S32 s_idx = -1; @@ -9220,10 +9196,8 @@ inline float sgn(float a)      return (0.0F);  } -glh::matrix4f look(const LLVector3 pos, const LLVector3 dir, const LLVector3 up) +glm::mat4 look(const LLVector3 pos, const LLVector3 dir, const LLVector3 up)  { -    glh::matrix4f ret; -      LLVector3 dirN;      LLVector3 upN;      LLVector3 lftN; @@ -9237,53 +9211,28 @@ glh::matrix4f look(const LLVector3 pos, const LLVector3 dir, const LLVector3 up)      dirN = dir;      dirN.normVec(); -    ret.m[ 0] = lftN[0]; -    ret.m[ 1] = upN[0]; -    ret.m[ 2] = -dirN[0]; -    ret.m[ 3] = 0.f; +    F32 ret[16]; +    ret[ 0] = lftN[0]; +    ret[ 1] = upN[0]; +    ret[ 2] = -dirN[0]; +    ret[ 3] = 0.f; -    ret.m[ 4] = lftN[1]; -    ret.m[ 5] = upN[1]; -    ret.m[ 6] = -dirN[1]; -    ret.m[ 7] = 0.f; +    ret[ 4] = lftN[1]; +    ret[ 5] = upN[1]; +    ret[ 6] = -dirN[1]; +    ret[ 7] = 0.f; -    ret.m[ 8] = lftN[2]; -    ret.m[ 9] = upN[2]; -    ret.m[10] = -dirN[2]; -    ret.m[11] = 0.f; +    ret[ 8] = lftN[2]; +    ret[ 9] = upN[2]; +    ret[10] = -dirN[2]; +    ret[11] = 0.f; -    ret.m[12] = -(lftN*pos); -    ret.m[13] = -(upN*pos); -    ret.m[14] = dirN*pos; -    ret.m[15] = 1.f; +    ret[12] = -(lftN*pos); +    ret[13] = -(upN*pos); +    ret[14] = dirN*pos; +    ret[15] = 1.f; -    return ret; -} - -glh::matrix4f scale_translate_to_fit(const LLVector3 min, const LLVector3 max) -{ -    glh::matrix4f ret; -    ret.m[ 0] = 2/(max[0]-min[0]); -    ret.m[ 4] = 0; -    ret.m[ 8] = 0; -    ret.m[12] = -(max[0]+min[0])/(max[0]-min[0]); - -    ret.m[ 1] = 0; -    ret.m[ 5] = 2/(max[1]-min[1]); -    ret.m[ 9] = 0; -    ret.m[13] = -(max[1]+min[1])/(max[1]-min[1]); - -    ret.m[ 2] = 0; -    ret.m[ 6] = 0; -    ret.m[10] = 2/(max[2]-min[2]); -    ret.m[14] = -(max[2]+min[2])/(max[2]-min[2]); - -    ret.m[ 3] = 0; -    ret.m[ 7] = 0; -    ret.m[11] = 0; -    ret.m[15] = 1; - -    return ret; +    return glm::make_mat4(ret);  }  static LLTrace::BlockTimerStatHandle FTM_SHADOW_RENDER("Render Shadows"); @@ -9297,7 +9246,7 @@ static LLTrace::BlockTimerStatHandle FTM_SHADOW_ALPHA_TREE("Alpha Tree");  static LLTrace::BlockTimerStatHandle FTM_SHADOW_ALPHA_GRASS("Alpha Grass");  static LLTrace::BlockTimerStatHandle FTM_SHADOW_FULLBRIGHT_ALPHA_MASKED("Fullbright Alpha Masked"); -void LLPipeline::renderShadow(glh::matrix4f& view, glh::matrix4f& proj, LLCamera& shadow_cam, LLCullResult& result, bool depth_clamp) +void LLPipeline::renderShadow(const glm::mat4& view, const glm::mat4& proj, LLCamera& shadow_cam, LLCullResult& result, bool depth_clamp)  {      LL_PROFILE_ZONE_SCOPED_CATEGORY_PIPELINE; //LL_RECORD_BLOCK_TIME(FTM_SHADOW_RENDER);      LL_PROFILE_GPU_ZONE("renderShadow"); @@ -9340,10 +9289,10 @@ void LLPipeline::renderShadow(glh::matrix4f& view, glh::matrix4f& proj, LLCamera      //generate shadow map      gGL.matrixMode(LLRender::MM_PROJECTION);      gGL.pushMatrix(); -    gGL.loadMatrix(proj.m); +    gGL.loadMatrix(glm::value_ptr(proj));      gGL.matrixMode(LLRender::MM_MODELVIEW);      gGL.pushMatrix(); -    gGL.loadMatrix(view.m); +    gGL.loadMatrix(glm::value_ptr(view));      stop_glerror();      gGLLastMatrix = NULL; @@ -9753,13 +9702,8 @@ void LLPipeline::generateSunShadow(LLCamera& camera)          gAgentAvatarp->updateAttachmentVisibility(CAMERA_MODE_THIRD_PERSON);      } -    F64 last_modelview[16]; -    F64 last_projection[16]; -    for (U32 i = 0; i < 16; i++) -    { //store last_modelview of world camera -        last_modelview[i] = gGLLastModelView[i]; -        last_projection[i] = gGLLastProjection[i]; -    } +    glm::mat4 last_modelview = get_last_modelview(); +    glm::mat4 last_projection = get_last_projection();      pushRenderTypeMask();      andRenderTypeMask(LLPipeline::RENDER_TYPE_SIMPLE, @@ -9838,12 +9782,12 @@ void LLPipeline::generateSunShadow(LLCamera& camera)      //get sun view matrix      //store current projection/modelview matrix -    glh::matrix4f saved_proj = get_current_projection(); -    glh::matrix4f saved_view = get_current_modelview(); -    glh::matrix4f inv_view = saved_view.inverse(); +    glm::mat4 saved_proj = get_current_projection(); +    glm::mat4 saved_view = get_current_modelview(); +    glm::mat4 inv_view = glm::inverse(saved_view); -    glh::matrix4f view[6]; -    glh::matrix4f proj[6]; +    glm::mat4 view[6]; +    glm::mat4 proj[6];      LLVector3 caster_dir(environment.getIsSunUp() ? mSunDir : mMoonDir); @@ -9858,7 +9802,7 @@ void LLPipeline::generateSunShadow(LLCamera& camera)      LLVector3 lightDir = -caster_dir;      lightDir.normVec(); -    glh::vec3f light_dir(lightDir.mV); +    glm::vec3 light_dir(glm::make_vec3(lightDir.mV));      //create light space camera matrix @@ -9913,9 +9857,9 @@ void LLPipeline::generateSunShadow(LLCamera& camera)          //get good split distances for frustum          for (U32 i = 0; i < fp.size(); ++i)          { -            glh::vec3f v(fp[i].mV); -            saved_view.mult_matrix_vec(v); -            fp[i].setVec(v.v); +            glm::vec3 v(glm::make_vec3(fp[i].mV)); +            v = mul_mat4_vec3(saved_view, v); +            fp[i].setVec(glm::value_ptr(v));          }          min = fp[0]; @@ -10064,9 +10008,9 @@ void LLPipeline::generateSunShadow(LLCamera& camera)              for (U32 i = 0; i < fp.size(); i++)              { -                glh::vec3f p = glh::vec3f(fp[i].mV); -                view[j].mult_matrix_vec(p); -                wpf.push_back(LLVector3(p.v)); +                glm::vec3 p = glm::make_vec3(fp[i].mV); +                p = mul_mat4_vec3(view[j], p); +                wpf.push_back(LLVector3(glm::value_ptr(p)));              }              min = wpf[0]; @@ -10166,7 +10110,7 @@ void LLPipeline::generateSunShadow(LLCamera& camera)                  { //just use ortho projection                      mShadowFOV.mV[j] = -1.f;                      origin.clearVec(); -                    proj[j] = gl_ortho(min.mV[0], max.mV[0], +                    proj[j] = glm::ortho(min.mV[0], max.mV[0],                                          min.mV[1], max.mV[1],                                          -max.mV[2], -min.mV[2]);                  } @@ -10257,37 +10201,37 @@ void LLPipeline::generateSunShadow(LLCamera& camera)                      { //just use ortho projection                          origin.clearVec();                          mShadowError.mV[j] = -1.f; -                        proj[j] = gl_ortho(min.mV[0], max.mV[0], +                        proj[j] = glm::ortho(min.mV[0], max.mV[0],                                  min.mV[1], max.mV[1],                                  -max.mV[2], -min.mV[2]);                      }                      else                      {                          //get perspective projection -                        view[j] = view[j].inverse(); +                        view[j] = glm::inverse(view[j]);                          //llassert(origin.isFinite()); -                        glh::vec3f origin_agent(origin.mV); +                        glm::vec3 origin_agent(glm::make_vec3(origin.mV));                          //translate view to origin -                        view[j].mult_matrix_vec(origin_agent); +                        origin_agent = mul_mat4_vec3(view[j], origin_agent); -                        eye = LLVector3(origin_agent.v); +                        eye = LLVector3(glm::value_ptr(origin_agent));                          //llassert(eye.isFinite());                          if (!hasRenderDebugMask(LLPipeline::RENDER_DEBUG_SHADOW_FRUSTA) && !gCubeSnapshot)                          {                              mShadowFrustOrigin[j] = eye;                          } -                        view[j] = look(LLVector3(origin_agent.v), lightDir, -up); +                        view[j] = look(LLVector3(glm::value_ptr(origin_agent)), lightDir, -up);                          F32 fx = 1.f/tanf(fovx);                          F32 fz = 1.f/tanf(fovz); -                        proj[j] = glh::matrix4f(-fx, 0, 0, 0, -                                                0, (yfar+ynear)/(ynear-yfar), 0, (2.f*yfar*ynear)/(ynear-yfar), -                                                0, 0, -fz, 0, -                                                0, -1.f, 0, 0); +                        proj[j] = glm::mat4(-fx, 0, 0, 0, +                            0, (yfar + ynear) / (ynear - yfar), 0, -1.0f, +                            0, 0, -fz, 0, +                            0, (2.f * yfar * ynear) / (ynear - yfar), 0, 0);                      }                  }              } @@ -10306,19 +10250,16 @@ void LLPipeline::generateSunShadow(LLCamera& camera)              shadow_cam.getAgentPlane(LLCamera::AGENT_PLANE_NEAR).set(shadow_near_clip);              //translate and scale to from [-1, 1] to [0, 1] -            glh::matrix4f trans(0.5f, 0.f, 0.f, 0.5f, -                            0.f, 0.5f, 0.f, 0.5f, -                            0.f, 0.f, 0.5f, 0.5f, -                            0.f, 0.f, 0.f, 1.f); +            glm::mat4 trans(0.5f, 0.0f, 0.0f, 0.0f, +                            0.0f, 0.5f, 0.0f, 0.0f, +                            0.0f, 0.0f, 0.5f, 0.0f, +                            0.5f, 0.5f, 0.5f, 1.0f);              set_current_modelview(view[j]);              set_current_projection(proj[j]); -            for (U32 i = 0; i < 16; i++) -            { -                gGLLastModelView[i] = mShadowModelview[j].m[i]; -                gGLLastProjection[i] = mShadowProjection[j].m[i]; -            } +            set_last_modelview(mShadowModelview[j]); +            set_last_projection(mShadowProjection[j]);              mShadowModelview[j] = view[j];              mShadowProjection[j] = proj[j]; @@ -10433,9 +10374,9 @@ void LLPipeline::generateSunShadow(LLCamera& camera)              LLMatrix4 mat(quat, LLVector4(origin, 1.f)); -            view[i + 4] = glh::matrix4f((F32*)mat.mMatrix); +            view[i + 4] = glm::make_mat4((F32*)mat.mMatrix); -            view[i + 4] = view[i + 4].inverse(); +            view[i + 4] = glm::inverse(view[i + 4]);              //get perspective matrix              F32 near_clip = dist + 0.01f; @@ -10443,27 +10384,24 @@ void LLPipeline::generateSunShadow(LLCamera& camera)              F32 height = scale.mV[VY];              F32 far_clip = dist + volume->getLightRadius() * 1.5f; -            F32 fovy = fov * RAD_TO_DEG; +            F32 fovy = fov; // radians              F32 aspect = width / height; -            proj[i + 4] = gl_perspective(fovy, aspect, near_clip, far_clip); +            proj[i + 4] = glm::perspective(fovy, aspect, near_clip, far_clip);              //translate and scale to from [-1, 1] to [0, 1] -            glh::matrix4f trans(0.5f, 0.f, 0.f, 0.5f, -                0.f, 0.5f, 0.f, 0.5f, -                0.f, 0.f, 0.5f, 0.5f, -                0.f, 0.f, 0.f, 1.f); +            glm::mat4 trans(0.5f, 0.0f, 0.0f, 0.0f, +                            0.0f, 0.5f, 0.0f, 0.0f, +                            0.0f, 0.0f, 0.5f, 0.0f, +                            0.5f, 0.5f, 0.5f, 1.0f);              set_current_modelview(view[i + 4]);              set_current_projection(proj[i + 4]);              mSunShadowMatrix[i + 4] = trans * proj[i + 4] * view[i + 4] * inv_view; -            for (U32 j = 0; j < 16; j++) -            { -                gGLLastModelView[j] = mShadowModelview[i + 4].m[j]; -                gGLLastProjection[j] = mShadowProjection[i + 4].m[j]; -            } +            set_last_modelview(mShadowModelview[i + 4]); +            set_last_projection(mShadowProjection[i + 4]);              mShadowModelview[i + 4] = view[i + 4];              mShadowProjection[i + 4] = proj[i + 4]; @@ -10511,18 +10449,15 @@ void LLPipeline::generateSunShadow(LLCamera& camera)      {          set_current_modelview(view[1]);          set_current_projection(proj[1]); -        gGL.loadMatrix(view[1].m); +        gGL.loadMatrix(glm::value_ptr(view[1]));          gGL.matrixMode(LLRender::MM_PROJECTION); -        gGL.loadMatrix(proj[1].m); +        gGL.loadMatrix(glm::value_ptr(proj[1]));          gGL.matrixMode(LLRender::MM_MODELVIEW);      }      gGL.setColorMask(true, true); -    for (U32 i = 0; i < 16; i++) -    { -        gGLLastModelView[i] = (F32)last_modelview[i]; -        gGLLastProjection[i] = (F32)last_projection[i]; -    } +    set_last_modelview(last_modelview); +    set_last_projection(last_projection);      popRenderTypeMask(); @@ -10822,18 +10757,18 @@ void LLPipeline::generateImpostor(LLVOAvatar* avatar, bool preview_avatar, bool          F32 distance = (pos-camera.getOrigin()).length();          F32 fov = atanf(tdim.mV[1]/distance)*2.f*RAD_TO_DEG;          F32 aspect = tdim.mV[0]/tdim.mV[1]; -        glh::matrix4f persp = gl_perspective(fov, aspect, 1.f, 256.f); +        glm::mat4 persp = glm::perspective(glm::radians(fov), aspect, 1.f, 256.f);          set_current_projection(persp); -        gGL.loadMatrix(persp.m); +        gGL.loadMatrix(glm::value_ptr(persp));          gGL.matrixMode(LLRender::MM_MODELVIEW);          gGL.pushMatrix(); -        glh::matrix4f mat; -        camera.getOpenGLTransform(mat.m); -        mat = glh::matrix4f((GLfloat*) OGL_TO_CFR_ROTATION) * mat; +        F32 ogl_mat[16]; +        camera.getOpenGLTransform(ogl_mat); +        glm::mat4 mat = glm::make_mat4((GLfloat*) OGL_TO_CFR_ROTATION) * glm::make_mat4(ogl_mat); -        gGL.loadMatrix(mat.m); +        gGL.loadMatrix(glm::value_ptr(mat));          set_current_modelview(mat);          glClearColor(0.0f,0.0f,0.0f,0.0f); diff --git a/indra/newview/pipeline.h b/indra/newview/pipeline.h index 3687ab32fa..a3ecab3208 100644 --- a/indra/newview/pipeline.h +++ b/indra/newview/pipeline.h @@ -345,7 +345,7 @@ public:      void renderHighlight(const LLViewerObject* obj, F32 fade); -    void renderShadow(glh::matrix4f& view, glh::matrix4f& proj, LLCamera& camera, LLCullResult& result, bool depth_clamp); +    void renderShadow(const glm::mat4& view, const glm::mat4& proj, LLCamera& camera, LLCullResult& result, bool depth_clamp);      void renderSelectedFaces(const LLColor4& color);      void renderHighlights();      void renderDebug(); @@ -760,10 +760,10 @@ public:      LLCamera                mShadowCamera[8];      LLVector3               mShadowExtents[4][2];      // TODO : separate Sun Shadow and Spot Shadow matrices -    glh::matrix4f           mSunShadowMatrix[6]; -    glh::matrix4f           mShadowModelview[6]; -    glh::matrix4f           mShadowProjection[6]; -    glh::matrix4f           mReflectionModelView; +    glm::mat4               mSunShadowMatrix[6]; +    glm::mat4               mShadowModelview[6]; +    glm::mat4               mShadowProjection[6]; +    glm::mat4               mReflectionModelView;      LLPointer<LLDrawable>   mShadowSpotLight[2];      F32                     mSpotLightFade[2]; | 
