diff options
Diffstat (limited to 'intern/cycles/blender/blender_id_map.h')
-rw-r--r-- | intern/cycles/blender/blender_id_map.h | 35 |
1 files changed, 24 insertions, 11 deletions
diff --git a/intern/cycles/blender/blender_id_map.h b/intern/cycles/blender/blender_id_map.h index f9f201c2e4e..198cfb4b29a 100644 --- a/intern/cycles/blender/blender_id_map.h +++ b/intern/cycles/blender/blender_id_map.h @@ -19,6 +19,7 @@ #include <string.h> +#include "render/geometry.h" #include "render/scene.h" #include "util/util_map.h" @@ -34,10 +35,22 @@ CCL_NAMESPACE_BEGIN template<typename K, typename T> class id_map { public: - id_map() + id_map(Scene *scene_) : scene(scene_) { } + ~id_map() + { + set<T *> nodes; + + typename map<K, T *>::iterator jt; + for (jt = b_map.begin(); jt != b_map.end(); jt++) { + nodes.insert(jt->second); + } + + scene->delete_nodes(nodes); + } + T *find(const BL::ID &id) { return find(id.ptr.owner_id); @@ -97,16 +110,15 @@ template<typename K, typename T> class id_map { } /* Combined add and update as needed. */ - bool add_or_update(Scene *scene, T **r_data, const BL::ID &id) + bool add_or_update(T **r_data, const BL::ID &id) { - return add_or_update(scene, r_data, id, id, id.ptr.owner_id); + return add_or_update(r_data, id, id, id.ptr.owner_id); } - bool add_or_update(Scene *scene, T **r_data, const BL::ID &id, const K &key) + bool add_or_update(T **r_data, const BL::ID &id, const K &key) { - return add_or_update(scene, r_data, id, id, key); + return add_or_update(r_data, id, id, key); } - bool add_or_update( - Scene *scene, T **r_data, const BL::ID &id, const BL::ID &parent, const K &key) + bool add_or_update(T **r_data, const BL::ID &id, const BL::ID &parent, const K &key) { T *data = find(key); bool recalc; @@ -145,7 +157,7 @@ template<typename K, typename T> class id_map { b_map[NULL] = data; } - void post_sync(Scene *scene, bool do_delete = true) + void post_sync(bool do_delete = true) { map<K, T *> new_map; typedef pair<const K, T *> TMapPair; @@ -176,6 +188,7 @@ template<typename K, typename T> class id_map { map<K, T *> b_map; set<T *> used_set; set<void *> b_recalc; + Scene *scene; }; /* Object Key @@ -230,9 +243,9 @@ struct ObjectKey { struct GeometryKey { void *id; - bool use_particle_hair; + Geometry::Type geometry_type; - GeometryKey(void *id, bool use_particle_hair) : id(id), use_particle_hair(use_particle_hair) + GeometryKey(void *id, Geometry::Type geometry_type) : id(id), geometry_type(geometry_type) { } @@ -242,7 +255,7 @@ struct GeometryKey { return true; } else if (id == k.id) { - if (use_particle_hair < k.use_particle_hair) { + if (geometry_type < k.geometry_type) { return true; } } |