Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'intern/cycles/blender/blender_id_map.h')
-rw-r--r--intern/cycles/blender/blender_id_map.h35
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;
}
}