diff options
author | Brecht Van Lommel <brechtvanlommel@pandora.be> | 2011-09-02 18:55:06 +0400 |
---|---|---|
committer | Brecht Van Lommel <brechtvanlommel@pandora.be> | 2011-09-02 18:55:06 +0400 |
commit | 1135875ab1501ff38184b91dc541aa8a2fe89c92 (patch) | |
tree | e6436f000e2621cefb6fbe7e9b96b900adddffcf /intern/cycles/bvh | |
parent | f10a5c9dc7f864b50c6bec3bf814fbd5e3056ba8 (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.cpp | 29 |
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++; } |