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>master
parent
0e86bebcfc
commit
da341eb2da
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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 );
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
Loading…
Reference in New Issue