diff options
| author | Brad Linden <46733234+brad-linden@users.noreply.github.com> | 2024-10-04 14:16:04 -0700 | 
|---|---|---|
| committer | GitHub <noreply@github.com> | 2024-10-04 14:16:04 -0700 | 
| commit | da341eb2daa361ffb974e2593a217778dfbb3383 (patch) | |
| tree | 803c64a784bb4be4d8b2dce92e16cb6c32aad8cf /indra | |
| parent | 0e86bebcfc80259476654190880f9bfd5b35934e (diff) | |
cherry pick secondlife/viewer#912 BugSplat Crash 1412267: nvoglv64+0xadcd00 (#2785)
* secondlife/viewer#912 BugSplat Crash 1412267: nvoglv64+0xadcd00
* fix cherry-pick merge breakage.
* Fix signed/unsigned error
---------
Co-authored-by: Alexander Gavriliuk <alexandrgproductengine@lindenlab.com>
Diffstat (limited to 'indra')
| -rw-r--r-- | indra/llprimitive/lldaeloader.cpp | 40 | ||||
| -rw-r--r-- | indra/llprimitive/llmodel.cpp | 16 | ||||
| -rw-r--r-- | indra/llprimitive/llmodel.h | 2 | ||||
| -rw-r--r-- | indra/llprimitive/llmodelloader.cpp | 25 | ||||
| -rw-r--r-- | indra/llprimitive/llmodelloader.h | 41 | ||||
| -rw-r--r-- | indra/newview/llmodelpreview.cpp | 164 | 
6 files changed, 140 insertions, 148 deletions
| diff --git a/indra/llprimitive/lldaeloader.cpp b/indra/llprimitive/lldaeloader.cpp index f286bff353..7fa4230237 100644 --- a/indra/llprimitive/lldaeloader.cpp +++ b/indra/llprimitive/lldaeloader.cpp @@ -1115,19 +1115,17 @@ bool LLDAELoader::OpenFile(const std::string& filename)          if (skin)          { -            domGeometry* geom = daeSafeCast<domGeometry>(skin->getSource().getElement()); - -            if (geom) +            if (domGeometry* geom = daeSafeCast<domGeometry>(skin->getSource().getElement()))              { -                domMesh* mesh = geom->getMesh(); -                if (mesh) +                if (domMesh* mesh = geom->getMesh())                  { -                    std::vector< LLPointer< LLModel > >::iterator i = mModelsMap[mesh].begin(); -                    while (i != mModelsMap[mesh].end()) +                    dae_model_map::const_iterator it = mModelsMap.find(mesh); +                    if (it != mModelsMap.end())                      { -                        LLPointer<LLModel> mdl = *i; -                        LLDAELoader::processDomModel(mdl, &dae, root, mesh, skin); -                        i++; +                        for (const LLPointer<LLModel>& model : it->second) +                        { +                            LLDAELoader::processDomModel(model, &dae, root, mesh, skin); +                        }                      }                  }              } @@ -1297,6 +1295,7 @@ void LLDAELoader::processDomModel(LLModel* model, DAE* dae, daeElement* root, do              }          }          else +        {              //Has one or more skeletons              for (std::vector<domInstance_controller::domSkeleton*>::iterator skel_it = skeletons.begin();                   skel_it != skeletons.end(); ++skel_it) @@ -1381,6 +1380,7 @@ void LLDAELoader::processDomModel(LLModel* model, DAE* dae, daeElement* root, do                      }                  }//got skeleton?              } +        }          domSkin::domJoints* joints = skin->getJoints(); @@ -1681,7 +1681,7 @@ void LLDAELoader::processDomModel(LLModel* model, DAE* dae, daeElement* root, do              materials[model->mMaterialList[i]] = LLImportMaterial();          }          mScene[transformation].push_back(LLModelInstance(model, model->mLabel, transformation, materials)); -        stretch_extents(model, transformation, mExtents[0], mExtents[1], mFirstTransform); +        stretch_extents(model, transformation);      }  } @@ -2074,21 +2074,14 @@ void LLDAELoader::processElement( daeElement* element, bool& badElement, DAE* da          mTransform.condition();      } -    domInstance_geometry* instance_geo = daeSafeCast<domInstance_geometry>(element); -    if (instance_geo) +    if (domInstance_geometry* instance_geo = daeSafeCast<domInstance_geometry>(element))      { -        domGeometry* geo = daeSafeCast<domGeometry>(instance_geo->getUrl().getElement()); -        if (geo) +        if (domGeometry* geo = daeSafeCast<domGeometry>(instance_geo->getUrl().getElement()))          { -            domMesh* mesh = daeSafeCast<domMesh>(geo->getDescendant(daeElement::matchType(domMesh::ID()))); -            if (mesh) +            if (domMesh* mesh = daeSafeCast<domMesh>(geo->getDescendant(daeElement::matchType(domMesh::ID()))))              { - -                std::vector< LLPointer< LLModel > >::iterator i = mModelsMap[mesh].begin(); -                while (i != mModelsMap[mesh].end()) +                for (LLModel* model : mModelsMap.find(mesh)->second)                  { -                    LLModel* model = *i; -                      LLMatrix4 transformation = mTransform;                      if (mTransform.determinant() < 0) @@ -2159,8 +2152,7 @@ void LLDAELoader::processElement( daeElement* element, bool& badElement, DAE* da                      }                      mScene[transformation].push_back(LLModelInstance(model, label, transformation, materials)); -                    stretch_extents(model, transformation, mExtents[0], mExtents[1], mFirstTransform); -                    i++; +                    stretch_extents(model, transformation);                  }              }          } diff --git a/indra/llprimitive/llmodel.cpp b/indra/llprimitive/llmodel.cpp index 9908a155f2..4e3e49ec9f 100644 --- a/indra/llprimitive/llmodel.cpp +++ b/indra/llprimitive/llmodel.cpp @@ -91,19 +91,15 @@ std::string LLModel::getStatusString(U32 status)  } -void LLModel::offsetMesh( const LLVector3& pivotPoint ) +void LLModel::offsetMesh(const LLVector3& pivotPoint)  { -    LLVector4a pivot( pivotPoint[VX], pivotPoint[VY], pivotPoint[VZ] ); +    LLVector4a pivot(pivotPoint[VX], pivotPoint[VY], pivotPoint[VZ]); -    for (std::vector<LLVolumeFace>::iterator faceIt = mVolumeFaces.begin(); faceIt != mVolumeFaces.end(); ) +    for (LLVolumeFace& face : mVolumeFaces)      { -        std::vector<LLVolumeFace>:: iterator currentFaceIt = faceIt++; -        LLVolumeFace& face = *currentFaceIt; -        LLVector4a *pos = (LLVector4a*) face.mPositions; - -        for (S32 i=0; i<face.mNumVertices; ++i ) +        for (S32 i = 0; i < face.mNumVertices; ++i)          { -            pos[i].add( pivot ); +            face.mPositions[i].add(pivot);          }      }  } @@ -338,7 +334,7 @@ void LLModel::normalizeVolumeFaces()      }  } -void LLModel::getNormalizedScaleTranslation(LLVector3& scale_out, LLVector3& translation_out) +void LLModel::getNormalizedScaleTranslation(LLVector3& scale_out, LLVector3& translation_out) const  {      scale_out = mNormalizedScale;      translation_out = mNormalizedTranslation; diff --git a/indra/llprimitive/llmodel.h b/indra/llprimitive/llmodel.h index 96cfb7151e..fe28926720 100644 --- a/indra/llprimitive/llmodel.h +++ b/indra/llprimitive/llmodel.h @@ -206,7 +206,7 @@ public:      void remapVolumeFaces();      void optimizeVolumeFaces();      void offsetMesh( const LLVector3& pivotPoint ); -    void getNormalizedScaleTranslation(LLVector3& scale_out, LLVector3& translation_out); +    void getNormalizedScaleTranslation(LLVector3& scale_out, LLVector3& translation_out) const;      LLVector3 getTransformedCenter(const LLMatrix4& mat);      //reorder face list based on mMaterialList in this and reference so diff --git a/indra/llprimitive/llmodelloader.cpp b/indra/llprimitive/llmodelloader.cpp index ae69c4f8ab..7facd53a72 100644 --- a/indra/llprimitive/llmodelloader.cpp +++ b/indra/llprimitive/llmodelloader.cpp @@ -36,7 +36,7 @@  std::list<LLModelLoader*> LLModelLoader::sActiveLoaderList; -void stretch_extents(LLModel* model, LLMatrix4a& mat, LLVector4a& min, LLVector4a& max, bool& first_transform) +static void stretch_extents(const LLModel* model, const LLMatrix4a& mat, LLVector4a& min, LLVector4a& max, bool& first_transform)  {      LLVector4a box[] =      { @@ -84,19 +84,19 @@ void stretch_extents(LLModel* model, LLMatrix4a& mat, LLVector4a& min, LLVector4      }  } -void stretch_extents(LLModel* model, LLMatrix4& mat, LLVector3& min, LLVector3& max, bool& first_transform) +void LLModelLoader::stretch_extents(const LLModel* model, const LLMatrix4& mat)  {      LLVector4a mina, maxa;      LLMatrix4a mata;      mata.loadu(mat); -    mina.load3(min.mV); -    maxa.load3(max.mV); +    mina.load3(mExtents[0].mV); +    maxa.load3(mExtents[1].mV); -    stretch_extents(model, mata, mina, maxa, first_transform); +    ::stretch_extents(model, mata, mina, maxa, mFirstTransform); -    min.set(mina.getF32ptr()); -    max.set(maxa.getF32ptr()); +    mExtents[0].set(mina.getF32ptr()); +    mExtents[1].set(maxa.getF32ptr());  }  //----------------------------------------------------------------------------- @@ -291,14 +291,7 @@ bool LLModelLoader::loadFromSLM(const std::string& filename)              {                  if (idx >= model[lod].size())                  { -                    if (model[lod].size()) -                    { -                        instance_list[i].mLOD[lod] = model[lod][0]; -                    } -                    else -                    { -                        instance_list[i].mLOD[lod] = NULL; -                    } +                    instance_list[i].mLOD[lod] = model[lod].front();                      continue;                  } @@ -341,7 +334,7 @@ bool LLModelLoader::loadFromSLM(const std::string& filename)      {          LLModelInstance& cur_instance = instance_list[i];          mScene[cur_instance.mTransform].push_back(cur_instance); -        stretch_extents(cur_instance.mModel, cur_instance.mTransform, mExtents[0], mExtents[1], mFirstTransform); +        stretch_extents(cur_instance.mModel, cur_instance.mTransform);      }      setLoadState( DONE ); diff --git a/indra/llprimitive/llmodelloader.h b/indra/llprimitive/llmodelloader.h index 83bd2f5bbd..530e61e2b8 100644 --- a/indra/llprimitive/llmodelloader.h +++ b/indra/llprimitive/llmodelloader.h @@ -34,13 +34,13 @@  class LLJoint; -typedef std::map<std::string, LLMatrix4>            JointTransformMap; -typedef std::map<std::string, LLMatrix4>::iterator  JointTransformMapIt; -typedef std::map<std::string, std::string>          JointMap; -typedef std::deque<std::string>                     JointNameSet; +typedef std::map<std::string, LLMatrix4> JointTransformMap; +typedef std::map<std::string, LLMatrix4>::iterator JointTransformMapIt; +typedef std::map<std::string, std::string> JointMap; +typedef std::deque<std::string> JointNameSet;  const S32 SLM_SUPPORTED_VERSION = 3; -const S32 NUM_LOD                       = 4; +const S32 NUM_LOD = 4;  const U32 LEGACY_RIG_OK = 0;  const U32 LEGACY_RIG_FLAG_TOO_MANY_JOINTS = 1; @@ -50,32 +50,32 @@ class LLModelLoader : public LLThread  {  public: -    typedef std::map<std::string, LLImportMaterial>         material_map; -    typedef std::vector<LLPointer<LLModel > >                   model_list; -    typedef std::vector<LLModelInstance>                        model_instance_list; -    typedef std::map<LLMatrix4, model_instance_list >       scene; +    typedef std::map<std::string, LLImportMaterial> material_map; +    typedef std::vector<LLPointer<LLModel>> model_list; +    typedef std::vector<LLModelInstance> model_instance_list; +    typedef std::map<LLMatrix4, model_instance_list> scene;      // Callback with loaded model data and loaded LoD      // -    typedef boost::function<void (scene&,model_list&,S32,void*) >       load_callback_t; +    typedef boost::function<void (scene&, model_list&, S32, void*)> load_callback_t;      // Function to provide joint lookup by name      // (within preview avi skeleton, for example)      // -    typedef boost::function<LLJoint* (const std::string&,void*) >       joint_lookup_func_t; +    typedef boost::function<LLJoint* (const std::string&, void*)> joint_lookup_func_t;      // Func to load and associate material with all it's textures,      // returned value is the number of textures loaded      // intentionally non-const so func can modify material to      // store platform-specific data      // -    typedef boost::function<U32 (LLImportMaterial&,void*) >             texture_load_func_t; +    typedef boost::function<U32 (LLImportMaterial&, void*)> texture_load_func_t;      // Callback to inform client of state changes      // during loading process (errors will be reported      // as state changes here as well)      // -    typedef boost::function<void (U32,void*) >                              state_callback_t; +    typedef boost::function<void (U32, void*)> state_callback_t;      typedef enum      { @@ -136,7 +136,7 @@ public:          JointNameSet&                       jointsFromNodes,          JointMap&                           legalJointNamesMap,          U32                                 maxJointsPerMesh); -    virtual ~LLModelLoader() ; +    virtual ~LLModelLoader();      virtual void setNoNormalize() { mNoNormalize = true; }      virtual void setNoOptimize() { mNoOptimize = true; } @@ -156,13 +156,13 @@ public:      bool loadFromSLM(const std::string& filename);      void loadModelCallback(); -    void loadTextures() ; //called in the main thread. +    void loadTextures() ; // called in the main thread.      void setLoadState(U32 state); +    void stretch_extents(const LLModel* model, const LLMatrix4& mat); - -    S32 mNumOfFetchingTextures ; //updated in the main thread -    bool areTexturesReady() { return !mNumOfFetchingTextures; } //called in the main thread. +    S32 mNumOfFetchingTextures ; // updated in the main thread +    bool areTexturesReady() { return !mNumOfFetchingTextures; } // called in the main thread.      bool verifyCount( int expected, int result ); @@ -212,10 +212,7 @@ protected:      LLSD mWarningsArray; // preview floater will pull logs from here      static std::list<LLModelLoader*> sActiveLoaderList; -    static bool isAlive(LLModelLoader* loader) ; +    static bool isAlive(LLModelLoader* loader);  }; -class LLMatrix4a; -void stretch_extents(LLModel* model, LLMatrix4a& mat, LLVector4a& min, LLVector4a& max, bool& first_transform); -void stretch_extents(LLModel* model, LLMatrix4& mat, LLVector3& min, LLVector3& max, bool& first_transform);  #endif  // LL_LLMODELLOADER_H diff --git a/indra/newview/llmodelpreview.cpp b/indra/newview/llmodelpreview.cpp index ef09cfa55b..1e7da126b0 100644 --- a/indra/newview/llmodelpreview.cpp +++ b/indra/newview/llmodelpreview.cpp @@ -134,25 +134,17 @@ std::string getLodSuffix(S32 lod)  void FindModel(LLModelLoader::scene& scene, const std::string& name_to_match, LLModel*& baseModelOut, LLMatrix4& matOut)  { -    LLModelLoader::scene::iterator base_iter = scene.begin(); -    bool found = false; -    while (!found && (base_iter != scene.end())) +    for (auto scene_iter = scene.begin(); scene_iter != scene.end(); scene_iter++)      { -        matOut = base_iter->first; - -        LLModelLoader::model_instance_list::iterator base_instance_iter = base_iter->second.begin(); -        while (!found && (base_instance_iter != base_iter->second.end())) +        for (auto model_iter = scene_iter->second.begin(); model_iter != scene_iter->second.end(); model_iter++)          { -            LLModelInstance& base_instance = *base_instance_iter++; -            LLModel* base_model = base_instance.mModel; - -            if (base_model && (base_model->mLabel == name_to_match)) +            if (model_iter->mModel && (model_iter->mModel->mLabel == name_to_match))              { -                baseModelOut = base_model; +                baseModelOut = model_iter->mModel; +                matOut = scene_iter->first;                  return;              }          } -        base_iter++;      }  } @@ -212,9 +204,12 @@ LLModelPreview::LLModelPreview(S32 width, S32 height, LLFloater* fmp)  LLModelPreview::~LLModelPreview()  { +    LLMutexLock lock(this); +      if (mModelLoader)      {          mModelLoader->shutdown(); +        mModelLoader = NULL;      }      if (mPreviewAvatar) @@ -262,7 +257,7 @@ void LLModelPreview::updateDimentionsAndOffsets()              accounted.insert(instance.mModel);              // update instance skin info for each lods pelvisZoffset -            for (int j = 0; j<LLModel::NUM_LODS; ++j) +            for (int j = 0; j < LLModel::NUM_LODS; ++j)              {                  if (instance.mLOD[j])                  { @@ -303,7 +298,7 @@ void LLModelPreview::rebuildUploadData()      bool legacyMatching = gSavedSettings.getBOOL("ImporterLegacyMatching");      U32 load_state = 0; -    for (LLModelLoader::scene::iterator iter = mBaseScene.begin(); iter != mBaseScene.end(); ++iter) +    for (auto iter = mBaseScene.begin(); iter != mBaseScene.end(); ++iter)      { //for each transform in scene          LLMatrix4 mat = iter->first; @@ -322,9 +317,9 @@ void LLModelPreview::rebuildUploadData()          mat *= scale_mat; -        for (LLModelLoader::model_instance_list::iterator model_iter = iter->second.begin(); model_iter != iter->second.end();) +        for (auto model_iter = iter->second.begin(); model_iter != iter->second.end(); ++model_iter)          { // for each instance with said transform applied -            LLModelInstance instance = *model_iter++; +            LLModelInstance instance = *model_iter;              LLModel* base_model = instance.mModel; @@ -910,7 +905,7 @@ void LLModelPreview::clearIncompatible(S32 lod)                  {                      mBaseModel = mModel[lod];                      mBaseScene = mScene[lod]; -                    mVertexBuffer[5].clear(); +                    mVertexBuffer[LLModel::NUM_LODS].clear();                      replaced_base_model = true;                  }              } @@ -1132,7 +1127,7 @@ void LLModelPreview::loadModelCallback(S32 loaded_lod)              mBaseModel = mModel[loaded_lod];              mBaseScene = mScene[loaded_lod]; -            mVertexBuffer[5].clear(); +            mVertexBuffer[LLModel::NUM_LODS].clear();          }          else          { @@ -1248,7 +1243,7 @@ void LLModelPreview::loadModelCallback(S32 loaded_lod)      {          if (!mBaseModel.empty())          { -            const std::string& model_name = mBaseModel[0]->getName(); +            std::string model_name = mBaseModel.front()->getName();              LLLineEditor* description_form = mFMP->getChild<LLLineEditor>("description_form");              if (description_form->getText().empty())              { @@ -1269,6 +1264,8 @@ void LLModelPreview::loadModelCallback(S32 loaded_lod)  void LLModelPreview::resetPreviewTarget()  { +    LLMutexLock lock(this); +      if (mModelLoader)      {          mPreviewTarget = (mModelLoader->mExtents[0] + mModelLoader->mExtents[1]) * 0.5f; @@ -1314,7 +1311,7 @@ void LLModelPreview::generateNormals()              (*it)->generateNormals(angle_cutoff);          } -        mVertexBuffer[5].clear(); +        mVertexBuffer[LLModel::NUM_LODS].clear();      }      bool perform_copy = mModelFacesCopy[which_lod].empty(); @@ -2156,7 +2153,7 @@ void LLModelPreview::updateStatusMessages()      S32 total_verts[LLModel::NUM_LODS];      S32 total_submeshes[LLModel::NUM_LODS]; -    for (U32 i = 0; i < LLModel::NUM_LODS - 1; i++) +    for (U32 i = 0; i < LLModel::NUM_LODS; i++)      {          total_tris[i] = 0;          total_verts[i] = 0; @@ -2460,12 +2457,16 @@ void LLModelPreview::updateStatusMessages()          }      } -    if (mModelNoErrors && mModelLoader) +    if (mModelNoErrors)      { -        if (!mModelLoader->areTexturesReady() && mFMP->childGetValue("upload_textures").asBoolean()) +        LLMutexLock lock(this); +        if (mModelLoader)          { -            // Some textures are still loading, prevent upload until they are done -            mModelNoErrors = false; +            if (!mModelLoader->areTexturesReady() && mFMP->childGetValue("upload_textures").asBoolean()) +            { +                // Some textures are still loading, prevent upload until they are done +                mModelNoErrors = false; +            }          }      } @@ -2794,10 +2795,10 @@ void LLModelPreview::genBuffers(S32 lod, bool include_skin_weights)  {      LLModelLoader::model_list* model = NULL; -    if (lod < 0 || lod > 4) +    if (lod < 0 || lod >= LLModel::NUM_LODS)      {          model = &mBaseModel; -        lod = 5; +        lod = LLModel::NUM_LODS;      }      else      { @@ -3034,8 +3035,9 @@ void LLModelPreview::loadedCallback(      S32 lod,      void* opaque)  { -    LLModelPreview* pPreview = static_cast< LLModelPreview* >(opaque); -    if (pPreview && !LLModelPreview::sIgnoreLoadedCallback) +    LLModelPreview* pPreview = static_cast<LLModelPreview*>(opaque); +    LLMutexLock lock(pPreview); +    if (pPreview && pPreview->mModelLoader && !LLModelPreview::sIgnoreLoadedCallback)      {          // Load loader's warnings into floater's log tab          const LLSD out = pPreview->mModelLoader->logOut(); @@ -3056,7 +3058,9 @@ void LLModelPreview::loadedCallback(          }          const LLVOAvatar* avatarp = pPreview->getPreviewAvatar(); -        if (avatarp) { // set up ground plane for possible rendering +        if (avatarp && avatarp->mRoot && avatarp->mDrawable) +        { +            // set up ground plane for possible rendering              const LLVector3 root_pos = avatarp->mRoot->getPosition();              const LLVector4a* ext = avatarp->mDrawable->getSpatialExtents();              const LLVector4a min = ext[0], max = ext[1]; @@ -3200,12 +3204,12 @@ bool LLModelPreview::render()      LLMutexLock lock(this);      mNeedsUpdate = false; -    bool edges = mViewOption["show_edges"]; -    bool joint_overrides = mViewOption["show_joint_overrides"]; -    bool joint_positions = mViewOption["show_joint_positions"]; -    bool skin_weight = mViewOption["show_skin_weight"]; -    bool textures = mViewOption["show_textures"]; -    bool physics = mViewOption["show_physics"]; +    bool show_edges = mViewOption["show_edges"]; +    bool show_joint_overrides = mViewOption["show_joint_overrides"]; +    bool show_joint_positions = mViewOption["show_joint_positions"]; +    bool show_skin_weight = mViewOption["show_skin_weight"]; +    bool show_textures = mViewOption["show_textures"]; +    bool show_physics = mViewOption["show_physics"];      S32 width = getWidth();      S32 height = getHeight(); @@ -3282,15 +3286,15 @@ bool LLModelPreview::render()                      fmp->childSetValue("upload_skin", true);                      mFirstSkinUpdate = false;                      upload_skin = true; -                    skin_weight = true; +                    show_skin_weight = true;                      mViewOption["show_skin_weight"] = true;                  }                  fmp->enableViewOption("show_skin_weight"); -                fmp->setViewOptionEnabled("show_joint_overrides", skin_weight); -                fmp->setViewOptionEnabled("show_joint_positions", skin_weight); +                fmp->setViewOptionEnabled("show_joint_overrides", show_skin_weight); +                fmp->setViewOptionEnabled("show_joint_positions", show_skin_weight);                  mFMP->childEnable("upload_skin"); -                mFMP->childSetValue("show_skin_weight", skin_weight); +                mFMP->childSetValue("show_skin_weight", show_skin_weight);              }              else if ((flags & LEGACY_RIG_FLAG_TOO_MANY_JOINTS) > 0) @@ -3313,11 +3317,12 @@ bool LLModelPreview::render()              fmp->disableViewOption("show_joint_overrides");              fmp->disableViewOption("show_joint_positions"); -            skin_weight = false; +            show_skin_weight = false;              mFMP->childSetValue("show_skin_weight", false); -            fmp->setViewOptionEnabled("show_skin_weight", skin_weight); +            fmp->setViewOptionEnabled("show_skin_weight", show_skin_weight);          }      } +    //if (this) return TRUE;      if (upload_skin && !has_skin_weights)      { //can't upload skin weights if model has no skin weights @@ -3360,7 +3365,7 @@ bool LLModelPreview::render()          mFMP->childSetEnabled("upload_joints", upload_skin);      } -    F32 explode = (F32)mFMP->childGetValue("physics_explode").asReal(); +    F32 physics_explode = (F32)mFMP->childGetValue("physics_explode").asReal();      LLGLDepthTest gls_depth(GL_TRUE); // SL-12781 re-enable z-buffer for 3D model preview @@ -3380,7 +3385,7 @@ bool LLModelPreview::render()      F32 z_near = 0.001f;      F32 z_far = mCameraDistance*10.0f + mPreviewScale.magVec() + mCameraOffset.magVec(); -    if (skin_weight) +    if (show_skin_weight)      {          target_pos = getPreviewAvatar()->getPositionAgent() + offset;          z_near = 0.01f; @@ -3390,7 +3395,7 @@ bool LLModelPreview::render()          refresh();      } -    gObjectPreviewProgram.bind(skin_weight); +    gObjectPreviewProgram.bind(show_skin_weight);      gGL.loadIdentity();      gPipeline.enableLightsPreview(); @@ -3399,7 +3404,7 @@ bool LLModelPreview::render()          LLQuaternion(mCameraYaw, LLVector3::z_axis);      LLQuaternion av_rot = camera_rot; -    F32 camera_distance = skin_weight ? SKIN_WEIGHT_CAMERA_DISTANCE : mCameraDistance; +    F32 camera_distance = show_skin_weight ? SKIN_WEIGHT_CAMERA_DISTANCE : mCameraDistance;      LLViewerCamera::getInstance()->setOriginAndLookAt(          target_pos + ((LLVector3(camera_distance, 0.f, 0.f) + offset) * av_rot),        // camera          LLVector3::z_axis,                                                                  // up @@ -3415,9 +3420,9 @@ bool LLModelPreview::render()      gGL.pushMatrix();      gGL.color4fv(PREVIEW_EDGE_COL.mV); -    if (!mBaseModel.empty() && mVertexBuffer[5].empty()) +    if (!mBaseModel.empty() && mVertexBuffer[LLModel::NUM_LODS].empty())      { -        genBuffers(-1, skin_weight); +        genBuffers(-1, show_skin_weight);          //genBuffers(3);      } @@ -3432,7 +3437,7 @@ bool LLModelPreview::render()              if (!vb_vec.empty())              {                  const LLVertexBuffer* buff = vb_vec[0]; -                regen = buff->hasDataType(LLVertexBuffer::TYPE_WEIGHT4) != skin_weight; +                regen = buff->hasDataType(LLVertexBuffer::TYPE_WEIGHT4) != show_skin_weight;              }              else              { @@ -3443,15 +3448,15 @@ bool LLModelPreview::render()          if (regen)          { -            genBuffers(mPreviewLOD, skin_weight); +            genBuffers(mPreviewLOD, show_skin_weight);          } -        if (physics && mVertexBuffer[LLModel::LOD_PHYSICS].empty()) +        if (show_physics && mVertexBuffer[LLModel::LOD_PHYSICS].empty())          {              genBuffers(LLModel::LOD_PHYSICS, false);          } -        if (!skin_weight) +        if (!show_skin_weight)          {              for (LLMeshUploadThread::instance_list::iterator iter = mUploadData.begin(); iter != mUploadData.end(); ++iter)              { @@ -3473,11 +3478,7 @@ bool LLModelPreview::render()                  auto num_models = mVertexBuffer[mPreviewLOD][model].size();                  for (size_t i = 0; i < num_models; ++i)                  { -                    LLVertexBuffer* buffer = mVertexBuffer[mPreviewLOD][model][i]; - -                    buffer->setBuffer(); - -                    if (textures) +                    if (show_textures)                      {                          auto materialCnt = instance.mModel->mMaterialList.size();                          if (i < materialCnt) @@ -3501,10 +3502,16 @@ bool LLModelPreview::render()                          gGL.diffuseColor4fv(PREVIEW_BASE_COL.mV);                      } +                    // Zero this variable for an obligatory buffer initialization +                    // See https://github.com/secondlife/viewer/issues/912 +                    LLVertexBuffer::sGLRenderBuffer = 0; +                    LLVertexBuffer* buffer = mVertexBuffer[mPreviewLOD][model][i]; +                    buffer->setBuffer();                      buffer->drawRange(LLRender::TRIANGLES, 0, buffer->getNumVerts() - 1, buffer->getNumIndices(), 0); +                      gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);                      gGL.diffuseColor4fv(PREVIEW_EDGE_COL.mV); -                    if (edges) +                    if (show_edges)                      {                          glLineWidth(PREVIEW_EDGE_WIDTH);                          glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); @@ -3517,7 +3524,7 @@ bool LLModelPreview::render()                  gGL.popMatrix();              } -            if (physics) +            if (show_physics)              {                  glClear(GL_DEPTH_BUFFER_BIT); @@ -3583,12 +3590,12 @@ bool LLModelPreview::render()                                      for (U32 i = 0; i < physics.mMesh.size(); ++i)                                      { -                                        if (explode > 0.f) +                                        if (physics_explode > 0.f)                                          {                                              gGL.pushMatrix();                                              LLVector3 offset = model->mHullCenter[i] - model->mCenterOfHullCenters; -                                            offset *= explode; +                                            offset *= physics_explode;                                              gGL.translatef(offset.mV[0], offset.mV[1], offset.mV[2]);                                          } @@ -3603,7 +3610,7 @@ bool LLModelPreview::render()                                          gGL.diffuseColor4ubv(hull_colors[i].mV);                                          LLVertexBuffer::drawArrays(LLRender::TRIANGLES, physics.mMesh[i].mPositions); -                                        if (explode > 0.f) +                                        if (physics_explode > 0.f)                                          {                                              gGL.popMatrix();                                          } @@ -3618,14 +3625,17 @@ bool LLModelPreview::render()                          if (render_mesh)                          {                              auto num_models = mVertexBuffer[LLModel::LOD_PHYSICS][model].size(); -                            if (pass > 0){ +                            if (pass > 0) +                            {                                  for (size_t i = 0; i < num_models; ++i)                                  { -                                    LLVertexBuffer* buffer = mVertexBuffer[LLModel::LOD_PHYSICS][model][i]; -                                      gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);                                      gGL.diffuseColor4fv(PREVIEW_PSYH_FILL_COL.mV); +                                    // Zero this variable for an obligatory buffer initialization +                                    // See https://github.com/secondlife/viewer/issues/912 +                                    LLVertexBuffer::sGLRenderBuffer = 0; +                                    LLVertexBuffer* buffer = mVertexBuffer[LLModel::LOD_PHYSICS][model][i];                                      buffer->setBuffer();                                      buffer->drawRange(LLRender::TRIANGLES, 0, buffer->getNumVerts() - 1, buffer->getNumIndices(), 0); @@ -3685,10 +3695,11 @@ bool LLModelPreview::render()                                      auto num_models = mVertexBuffer[LLModel::LOD_PHYSICS][model].size();                                      for (size_t v = 0; v < num_models; ++v)                                      { +                                        // Zero this variable for an obligatory buffer initialization +                                        // See https://github.com/secondlife/viewer/issues/912 +                                        LLVertexBuffer::sGLRenderBuffer = 0;                                          LLVertexBuffer* buffer = mVertexBuffer[LLModel::LOD_PHYSICS][model][v]; -                                          buffer->setBuffer(); -                                          LLStrider<LLVector3> pos_strider;                                          buffer->getVertexStrider(pos_strider, 0);                                          LLVector4a* pos = (LLVector4a*)pos_strider.get(); @@ -3752,7 +3763,7 @@ bool LLModelPreview::render()                          U32 joint_count = LLSkinningUtil::getMeshJointCount(skin);                          auto bind_count = skin->mAlternateBindMatrix.size(); -                        if (joint_overrides +                        if (show_joint_overrides                              && bind_count > 0                              && joint_count == bind_count)                          { @@ -3795,16 +3806,15 @@ bool LLModelPreview::render()                              }                          } -                        for (U32 i = 0, e = static_cast<U32>(mVertexBuffer[mPreviewLOD][model].size()); i < e; ++i) +                        std::size_t size = mVertexBuffer[mPreviewLOD][model].size(); +                        for (U32 i = 0; i < size; ++i)                          { -                            LLVertexBuffer* buffer = mVertexBuffer[mPreviewLOD][model][i]; -                              model->mSkinInfo.updateHash();                              LLRenderPass::uploadMatrixPalette(mPreviewAvatar, &model->mSkinInfo);                              gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE); -                            if (textures) +                            if (show_textures)                              {                                  auto materialCnt = instance.mModel->mMaterialList.size();                                  if (i < materialCnt) @@ -3828,10 +3838,14 @@ bool LLModelPreview::render()                                  gGL.diffuseColor4fv(PREVIEW_BASE_COL.mV);                              } +                            // Zero this variable for an obligatory buffer initialization +                            // See https://github.com/secondlife/viewer/issues/912 +                            LLVertexBuffer::sGLRenderBuffer = 0; +                            LLVertexBuffer* buffer = mVertexBuffer[mPreviewLOD][model][i];                              buffer->setBuffer();                              buffer->draw(LLRender::TRIANGLES, buffer->getNumIndices(), 0); -                            if (edges) +                            if (show_edges)                              {                                  gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);                                  gGL.diffuseColor4fv(PREVIEW_EDGE_COL.mV); @@ -3846,7 +3860,7 @@ bool LLModelPreview::render()                  }              } -            if (joint_positions) +            if (show_joint_positions)              {                  LLGLSLShader* shader = LLGLSLShader::sCurBoundShaderPtr;                  if (shader) | 
