@@ -555,7 +555,7 @@ void LLModelPreview::rebuildUploadData()
555
555
{
556
556
// in case user provided a missing file later
557
557
texture->setIsMissingAsset (false );
558
- texture->setLoadedCallback (LLModelPreview::textureLoadedCallback, 0 , true , false , this , &mCallbackTextureList , false );
558
+ texture->setLoadedCallback (LLModelPreview::textureLoadedCallback, 0 , true , false , new LLHandle<LLModelPreview>( getHandle ()) , &mCallbackTextureList , false );
559
559
texture->forceToSaveRawImage (0 , F32_MAX);
560
560
texture->updateFetch ();
561
561
if (mModelLoader )
@@ -784,6 +784,10 @@ void LLModelPreview::loadModel(std::string filename, S32 lod, bool force_disable
784
784
std::map<std::string, std::string> joint_alias_map;
785
785
getJointAliases (joint_alias_map);
786
786
787
+ LLHandle<LLModelPreview> preview_handle = getHandle ();
788
+ auto load_textures_cb =
789
+ [preview_handle](LLImportMaterial& material, void * opaque) { return LLModelPreview::loadTextures (material, preview_handle); };
790
+
787
791
// three possible file extensions, .dae .gltf .glb
788
792
// check for .dae and if not then assume one of the .gl??
789
793
std::string filename_lc (filename);
@@ -795,7 +799,7 @@ void LLModelPreview::loadModel(std::string filename, S32 lod, bool force_disable
795
799
lod,
796
800
&LLModelPreview::loadedCallback,
797
801
&LLModelPreview::lookupJointByName,
798
- &LLModelPreview::loadTextures ,
802
+ load_textures_cb ,
799
803
&LLModelPreview::stateChangedCallback,
800
804
this ,
801
805
mJointTransformMap ,
@@ -812,7 +816,7 @@ void LLModelPreview::loadModel(std::string filename, S32 lod, bool force_disable
812
816
lod,
813
817
&LLModelPreview::loadedCallback,
814
818
&LLModelPreview::lookupJointByName,
815
- &LLModelPreview::loadTextures ,
819
+ load_textures_cb ,
816
820
&LLModelPreview::stateChangedCallback,
817
821
this ,
818
822
mJointTransformMap ,
@@ -3130,9 +3134,9 @@ LLJoint* LLModelPreview::lookupJointByName(const std::string& str, void* opaque)
3130
3134
return NULL ;
3131
3135
}
3132
3136
3133
- U32 LLModelPreview::loadTextures (LLImportMaterial& material, void * opaque )
3137
+ U32 LLModelPreview::loadTextures (LLImportMaterial& material, LLHandle<LLModelPreview> handle )
3134
3138
{
3135
- if (material.mDiffuseMapFilename .size ())
3139
+ if (material.mDiffuseMapFilename .size () && !handle. isDead () )
3136
3140
{
3137
3141
material.mOpaqueData = new LLPointer< LLViewerFetchedTexture >;
3138
3142
LLPointer< LLViewerFetchedTexture >& tex = (*reinterpret_cast < LLPointer< LLViewerFetchedTexture > * >(material.mOpaqueData ));
@@ -3143,10 +3147,8 @@ U32 LLModelPreview::loadTextures(LLImportMaterial& material, void* opaque)
3143
3147
// file was loaded previosly, reload image to get potential changes
3144
3148
tex->clearFetchedResults ();
3145
3149
}
3146
- // Todo: might cause a crash if preview gets closed before we get the callback.
3147
- // Use a callback list or guard callback in some way
3148
- LLModelPreview* preview = (LLModelPreview*)opaque;
3149
- tex->setLoadedCallback (LLModelPreview::textureLoadedCallback, 0 , true , false , opaque, &preview->mCallbackTextureList , false );
3150
+ LLModelPreview* preview = (LLModelPreview*)handle.get ();
3151
+ tex->setLoadedCallback (LLModelPreview::textureLoadedCallback, 0 , true , false , new LLHandle<LLModelPreview>(handle), &preview->mCallbackTextureList , false );
3150
3152
tex->forceToSaveRawImage (0 , F32_MAX);
3151
3153
material.setDiffuseMap (tex->getID ()); // record tex ID
3152
3154
return 1 ;
@@ -4003,16 +4005,29 @@ void LLModelPreview::textureLoadedCallback(
4003
4005
bool final ,
4004
4006
void * userdata)
4005
4007
{
4006
- LLModelPreview* preview = (LLModelPreview*)userdata;
4007
- preview->refresh ();
4008
+ if (!userdata)
4009
+ return ;
4010
+
4011
+ LLHandle<LLModelPreview>* handle = (LLHandle<LLModelPreview>*)userdata;
4008
4012
4009
- if (final && preview-> mModelLoader )
4013
+ if (!handle-> isDead () )
4010
4014
{
4011
- if (preview->mModelLoader ->mNumOfFetchingTextures > 0 )
4015
+ LLModelPreview* preview = static_cast <LLModelPreview*>(handle->get ());
4016
+ preview->refresh ();
4017
+
4018
+ if (final && preview->mModelLoader )
4012
4019
{
4013
- preview->mModelLoader ->mNumOfFetchingTextures --;
4020
+ if (preview->mModelLoader ->mNumOfFetchingTextures > 0 )
4021
+ {
4022
+ preview->mModelLoader ->mNumOfFetchingTextures --;
4023
+ }
4014
4024
}
4015
4025
}
4026
+
4027
+ if (final || !success)
4028
+ {
4029
+ delete handle;
4030
+ }
4016
4031
}
4017
4032
4018
4033
// static
0 commit comments