fix [#28909] OpenCollada export / import sintel lite v2.1 crashes on import.
[blender.git] / source / blender / collada / AnimationImporter.cpp
index 61f1b1dfa08d7c05b89c28fd5dda60dd3a8f0e54..f3a6e2371bb8feb1fc02d93003871388d77a9e76 100644 (file)
@@ -962,30 +962,32 @@ void AnimationImporter::translate_Animations ( COLLADAFW::Node * node ,
                        for (unsigned int j = 0; j < matBinds.getCount(); j++) {
                                const COLLADAFW::UniqueId & matuid = matBinds[j].getReferencedMaterial();
                                const COLLADAFW::Effect *ef = (COLLADAFW::Effect *) (FW_object_map[matuid]);
-                               const COLLADAFW::CommonEffectPointerArray& commonEffects  =  ef->getCommonEffects();
-                               COLLADAFW::EffectCommon *efc = commonEffects[0];
-                               if((animType->material & MATERIAL_SHININESS) != 0){
-                                       const COLLADAFW::FloatOrParam *shin = &(efc->getShininess());
-                                       const COLLADAFW::UniqueId& listid =  shin->getAnimationList();
-                                       Assign_float_animations( listid, AnimCurves , "specular_hardness" );
-                               }
+                               if (ef != NULL) { /* can be NULL [#28909] */
+                                       const COLLADAFW::CommonEffectPointerArray& commonEffects  =  ef->getCommonEffects();
+                                       COLLADAFW::EffectCommon *efc = commonEffects[0];
+                                       if((animType->material & MATERIAL_SHININESS) != 0){
+                                               const COLLADAFW::FloatOrParam *shin = &(efc->getShininess());
+                                               const COLLADAFW::UniqueId& listid =  shin->getAnimationList();
+                                               Assign_float_animations( listid, AnimCurves , "specular_hardness" );
+                                       }
 
-                               if((animType->material & MATERIAL_IOR) != 0){
-                                       const COLLADAFW::FloatOrParam *ior = &(efc->getIndexOfRefraction());
-                                       const COLLADAFW::UniqueId& listid =  ior->getAnimationList();
-                                       Assign_float_animations( listid, AnimCurves , "raytrace_transparency.ior" );
-                               }
+                                       if((animType->material & MATERIAL_IOR) != 0){
+                                               const COLLADAFW::FloatOrParam *ior = &(efc->getIndexOfRefraction());
+                                               const COLLADAFW::UniqueId& listid =  ior->getAnimationList();
+                                               Assign_float_animations( listid, AnimCurves , "raytrace_transparency.ior" );
+                                       }
 
-                               if((animType->material & MATERIAL_SPEC_COLOR) != 0){
-                                       const COLLADAFW::ColorOrTexture *cot = &(efc->getSpecular());
-                                       const COLLADAFW::UniqueId& listid =  cot->getColor().getAnimationList();
-                                       Assign_color_animations( listid, AnimCurves , "specular_color" );
-                               }
+                                       if((animType->material & MATERIAL_SPEC_COLOR) != 0){
+                                               const COLLADAFW::ColorOrTexture *cot = &(efc->getSpecular());
+                                               const COLLADAFW::UniqueId& listid =  cot->getColor().getAnimationList();
+                                               Assign_color_animations( listid, AnimCurves , "specular_color" );
+                                       }
 
-                               if((animType->material & MATERIAL_DIFF_COLOR) != 0){
-                                       const COLLADAFW::ColorOrTexture *cot = &(efc->getDiffuse());
-                                       const COLLADAFW::UniqueId& listid =  cot->getColor().getAnimationList();
-                                       Assign_color_animations( listid, AnimCurves , "diffuse_color" );
+                                       if((animType->material & MATERIAL_DIFF_COLOR) != 0){
+                                               const COLLADAFW::ColorOrTexture *cot = &(efc->getDiffuse());
+                                               const COLLADAFW::UniqueId& listid =  cot->getColor().getAnimationList();
+                                               Assign_color_animations( listid, AnimCurves , "diffuse_color" );
+                                       }
                                }
                        }
                }       
@@ -1051,14 +1053,16 @@ AnimationImporter::AnimMix* AnimationImporter::get_animation_type ( const COLLAD
                for (unsigned int j = 0; j < matBinds.getCount(); j++) {
                        const COLLADAFW::UniqueId & matuid = matBinds[j].getReferencedMaterial();
                        const COLLADAFW::Effect *ef = (COLLADAFW::Effect *) (FW_object_map[matuid]);
-                       const COLLADAFW::CommonEffectPointerArray& commonEffects  =  ef->getCommonEffects();
-                       if(!commonEffects.empty()) {
-                               COLLADAFW::EffectCommon *efc = commonEffects[0];
-                               types->material =  setAnimType(&(efc->getShininess()),(types->material), MATERIAL_SHININESS);
-                               types->material =  setAnimType(&(efc->getSpecular().getColor()),(types->material), MATERIAL_SPEC_COLOR);
-                               types->material =  setAnimType(&(efc->getDiffuse().getColor()),(types->material), MATERIAL_DIFF_COLOR);
-                               // types->material =  setAnimType(&(efc->get()),(types->material), MATERIAL_TRANSPARENCY);
-                               types->material =  setAnimType(&(efc->getIndexOfRefraction()),(types->material), MATERIAL_IOR);
+                       if (ef != NULL) { /* can be NULL [#28909] */
+                               const COLLADAFW::CommonEffectPointerArray& commonEffects = ef->getCommonEffects();
+                               if(!commonEffects.empty()) {
+                                       COLLADAFW::EffectCommon *efc = commonEffects[0];
+                                       types->material =  setAnimType(&(efc->getShininess()),(types->material), MATERIAL_SHININESS);
+                                       types->material =  setAnimType(&(efc->getSpecular().getColor()),(types->material), MATERIAL_SPEC_COLOR);
+                                       types->material =  setAnimType(&(efc->getDiffuse().getColor()),(types->material), MATERIAL_DIFF_COLOR);
+                                       // types->material =  setAnimType(&(efc->get()),(types->material), MATERIAL_TRANSPARENCY);
+                                       types->material =  setAnimType(&(efc->getIndexOfRefraction()),(types->material), MATERIAL_IOR);
+                               }
                        }
                }
        }
@@ -1067,10 +1071,10 @@ AnimationImporter::AnimMix* AnimationImporter::get_animation_type ( const COLLAD
 
 int AnimationImporter::setAnimType ( const COLLADAFW::Animatable * prop , int types, int addition)
 {
-               const COLLADAFW::UniqueId& listid =  prop->getAnimationList();
-               if (animlist_map.find(listid) != animlist_map.end()) 
-                               return types|addition;
-               else return types;
+       const COLLADAFW::UniqueId& listid =  prop->getAnimationList();
+       if (animlist_map.find(listid) != animlist_map.end())
+               return types|addition;
+       else return types;
 }              
 
 // Is not used anymore.