Revision: 49573
          
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=49573
Author:   gaiaclary
Date:     2012-08-05 10:23:34 +0000 (Sun, 05 Aug 2012)
Log Message:
-----------
COLLADA: #29058 Fixed crash when illegal reference to non existing camera 
object is found. And report a warning to the console)

Modified Paths:
--------------
    trunk/blender/source/blender/collada/AnimationImporter.cpp
    trunk/blender/source/blender/collada/DocumentImporter.cpp

Modified: trunk/blender/source/blender/collada/AnimationImporter.cpp
===================================================================
--- trunk/blender/source/blender/collada/AnimationImporter.cpp  2012-08-05 
09:31:48 UTC (rev 49572)
+++ trunk/blender/source/blender/collada/AnimationImporter.cpp  2012-08-05 
10:23:34 UTC (rev 49573)
@@ -804,8 +804,15 @@
        AnimationImporter::AnimMix *animType = get_animation_type(node, 
FW_object_map);
 
        bool is_joint = node->getType() == COLLADAFW::Node::JOINT;
-       COLLADAFW::Node *root = root_map.find(node->getUniqueId()) == 
root_map.end() ? node : root_map[node->getUniqueId()];
-       Object *ob = is_joint ? armature_importer->get_armature_for_joint(root) 
: object_map.find(node->getUniqueId())->second;
+       COLLADAFW::UniqueId uid = node->getUniqueId();
+       COLLADAFW::Node *root = root_map.find(uid) == root_map.end() ? node : 
root_map[uid];
+
+       Object *ob;
+       if(is_joint)
+               ob = armature_importer->get_armature_for_joint(root);
+       else
+               ob = object_map.find(uid) == object_map.end() ? NULL : 
object_map.find(uid)->second;
+
        if (!ob) {
                fprintf(stderr, "cannot find Object for Node with id=\"%s\"\n", 
node->getOriginalId().c_str());
                return;
@@ -1179,6 +1186,11 @@
        const COLLADAFW::InstanceCameraPointerArray& nodeCameras = 
node->getInstanceCameras();
        for (unsigned int i = 0; i < nodeCameras.getCount(); i++) {
                const COLLADAFW::Camera *camera  = (COLLADAFW::Camera *) 
FW_object_map[nodeCameras[i]->getInstanciatedObjectId()];
+               if ( camera == NULL ) {
+                       // Can happen if the node refers to an unknown camera.
+                       continue;
+               }
+
                const bool is_perspective_type   = camera->getCameraType() == 
COLLADAFW::Camera::PERSPECTIVE;
 
                int addition;

Modified: trunk/blender/source/blender/collada/DocumentImporter.cpp
===================================================================
--- trunk/blender/source/blender/collada/DocumentImporter.cpp   2012-08-05 
09:31:48 UTC (rev 49572)
+++ trunk/blender/source/blender/collada/DocumentImporter.cpp   2012-08-05 
10:23:34 UTC (rev 49573)
@@ -308,7 +308,7 @@
 {
        const COLLADAFW::UniqueId& cam_uid = camera->getInstanciatedObjectId();
        if (uid_camera_map.find(cam_uid) == uid_camera_map.end()) {     
-               fprintf(stderr, "Couldn't find camera by UID.\n");
+               // fprintf(stderr, "Couldn't find camera by UID.\n");
                return NULL;
        }
 
@@ -443,7 +443,13 @@
                }
                while (camera_done < camera.getCount()) {
                        ob = create_camera_object(camera[camera_done], sce);
-                       objects_done->push_back(ob);
+                       if (ob == NULL) {
+                               std::string id = node->getOriginalId();
+                               std::string name = node->getName();
+                               fprintf(stderr, "<node id=\"%s\", name=\"%s\" 
>...contains a reference to an unknown instance_camera.\n", id.c_str(), 
name.c_str());
+                       }
+                       else
+                               objects_done->push_back(ob);
                        ++camera_done;
                }
                while (lamp_done < lamp.getCount()) {

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to