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:
authorBrecht Van Lommel <brechtvanlommel@pandora.be>2011-09-02 18:55:06 +0400
committerBrecht Van Lommel <brechtvanlommel@pandora.be>2011-09-02 18:55:06 +0400
commit1135875ab1501ff38184b91dc541aa8a2fe89c92 (patch)
treee6436f000e2621cefb6fbe7e9b96b900adddffcf /intern/cycles/bvh
parentf10a5c9dc7f864b50c6bec3bf814fbd5e3056ba8 (diff)
Cycles:
* Fix crash in light path node * Fix struct alignment issue for cuda * Fix issue with instances taking up too much memory * Fix issue with ray visibility working incorrect on some objects * Enable OpenCL always and remove option, it has no dependencies so may as well * Refuse to load kernel if OpenCL version < 1.1, recent drivers are needed * Better error handling for OpenCL device * 3D views with rendered draw mode will now revert to wireframe on file load
Diffstat (limited to 'intern/cycles/bvh')
-rw-r--r--intern/cycles/bvh/bvh.cpp29
1 files changed, 25 insertions, 4 deletions
diff --git a/intern/cycles/bvh/bvh.cpp b/intern/cycles/bvh/bvh.cpp
index 9bd748157bf..3be1f822ed7 100644
--- a/intern/cycles/bvh/bvh.cpp
+++ b/intern/cycles/bvh/bvh.cpp
@@ -27,6 +27,7 @@
#include "util_cache.h"
#include "util_debug.h"
#include "util_foreach.h"
+#include "util_map.h"
#include "util_progress.h"
#include "util_types.h"
@@ -287,17 +288,25 @@ void BVH::pack_instances(size_t nodes_size)
size_t pack_nodes_offset = nodes_size;
size_t object_offset = 0;
+ map<Mesh*, int> mesh_map;
+
foreach(Object *ob, objects) {
Mesh *mesh = ob->mesh;
BVH *bvh = mesh->bvh;
if(!mesh->transform_applied) {
- prim_index_size += bvh->pack.prim_index.size();
- tri_woop_size += bvh->pack.tri_woop.size();
- nodes_size += bvh->pack.nodes.size()*nsize;
+ if(mesh_map.find(mesh) == mesh_map.end()) {
+ prim_index_size += bvh->pack.prim_index.size();
+ tri_woop_size += bvh->pack.tri_woop.size();
+ nodes_size += bvh->pack.nodes.size()*nsize;
+
+ mesh_map[mesh] = 1;
+ }
}
}
+ mesh_map.clear();
+
pack.prim_index.resize(prim_index_size);
pack.prim_object.resize(prim_index_size);
pack.prim_visibility.resize(prim_index_size);
@@ -322,6 +331,16 @@ void BVH::pack_instances(size_t nodes_size)
continue;
}
+ /* if mesh already added once, don't add it again, but used set
+ node offset for this object */
+ map<Mesh*, int>::iterator it = mesh_map.find(mesh);
+
+ if(mesh_map.find(mesh) != mesh_map.end()) {
+ int noffset = it->second;
+ pack.object_node[object_offset++] = noffset;
+ continue;
+ }
+
BVH *bvh = mesh->bvh;
int noffset = nodes_offset/nsize;
@@ -333,6 +352,8 @@ void BVH::pack_instances(size_t nodes_size)
else
pack.object_node[object_offset++] = noffset;
+ mesh_map[mesh] = pack.object_node[object_offset-1];
+
/* merge primitive and object indexes */
{
size_t bvh_prim_index_size = bvh->pack.prim_index.size();
@@ -341,7 +362,7 @@ void BVH::pack_instances(size_t nodes_size)
for(size_t i = 0; i < bvh_prim_index_size; i++) {
pack_prim_index[pack_prim_index_offset] = bvh_prim_index[i] + mesh_tri_offset;
- pack_prim_visibility[pack_prim_index_offset] = bvh_prim_visibility[i] + mesh_tri_offset;
+ pack_prim_visibility[pack_prim_index_offset] = bvh_prim_visibility[i];
pack_prim_object[pack_prim_index_offset] = 0; // unused for instances
pack_prim_index_offset++;
}