diff options
Diffstat (limited to 'intern/cycles/bvh/bvh.cpp')
-rw-r--r-- | intern/cycles/bvh/bvh.cpp | 187 |
1 files changed, 26 insertions, 161 deletions
diff --git a/intern/cycles/bvh/bvh.cpp b/intern/cycles/bvh/bvh.cpp index 350ca16f6e2..9e63485c04e 100644 --- a/intern/cycles/bvh/bvh.cpp +++ b/intern/cycles/bvh/bvh.cpp @@ -25,7 +25,6 @@ #include "bvh_node.h" #include "bvh_params.h" -#include "util_cache.h" #include "util_debug.h" #include "util_foreach.h" #include "util_logging.h" @@ -70,125 +69,12 @@ BVH *BVH::create(const BVHParams& params, const vector<Object*>& objects) return new RegularBVH(params, objects); } -/* Cache */ - -bool BVH::cache_read(CacheData& key) -{ - key.add(system_cpu_bits()); - key.add(¶ms, sizeof(params)); - - foreach(Object *ob, objects) { - Mesh *mesh = ob->mesh; - - key.add(mesh->verts); - key.add(mesh->triangles); - key.add(mesh->curve_keys); - key.add(mesh->curves); - key.add(&ob->bounds, sizeof(ob->bounds)); - key.add(&ob->visibility, sizeof(ob->visibility)); - key.add(&mesh->transform_applied, sizeof(bool)); - - if(mesh->use_motion_blur) { - Attribute *attr = mesh->attributes.find(ATTR_STD_MOTION_VERTEX_POSITION); - if(attr) - key.add(attr->buffer); - - attr = mesh->curve_attributes.find(ATTR_STD_MOTION_VERTEX_POSITION); - if(attr) - key.add(attr->buffer); - } - } - - CacheData value; - - if(Cache::global.lookup(key, value)) { - cache_filename = key.get_filename(); - - if(!(value.read(pack.root_index) && - value.read(pack.SAH) && - value.read(pack.nodes) && - value.read(pack.leaf_nodes) && - value.read(pack.object_node) && - value.read(pack.tri_woop) && - value.read(pack.prim_type) && - value.read(pack.prim_visibility) && - value.read(pack.prim_index) && - value.read(pack.prim_object))) - { - /* Clear the pack if load failed. */ - pack.root_index = 0; - pack.SAH = 0.0f; - pack.nodes.clear(); - pack.leaf_nodes.clear(); - pack.object_node.clear(); - pack.tri_woop.clear(); - pack.prim_type.clear(); - pack.prim_visibility.clear(); - pack.prim_index.clear(); - pack.prim_object.clear(); - return false; - } - return true; - } - - return false; -} - -void BVH::cache_write(CacheData& key) -{ - CacheData value; - - value.add(pack.root_index); - value.add(pack.SAH); - - value.add(pack.nodes); - value.add(pack.leaf_nodes); - value.add(pack.object_node); - value.add(pack.tri_woop); - value.add(pack.prim_type); - value.add(pack.prim_visibility); - value.add(pack.prim_index); - value.add(pack.prim_object); - - Cache::global.insert(key, value); - - cache_filename = key.get_filename(); -} - -void BVH::clear_cache_except() -{ - set<string> except; - - if(!cache_filename.empty()) - except.insert(cache_filename); - - foreach(Object *ob, objects) { - Mesh *mesh = ob->mesh; - BVH *bvh = mesh->bvh; - - if(bvh && !bvh->cache_filename.empty()) - except.insert(bvh->cache_filename); - } - - Cache::global.clear_except("bvh", except); -} - /* Building */ void BVH::build(Progress& progress) { progress.set_substatus("Building BVH"); - /* cache read */ - CacheData key("bvh"); - - if(params.use_cache) { - progress.set_substatus("Looking in BVH cache"); - - if(cache_read(key)) - return; - } - /* build nodes */ BVHBuild bvh_build(objects, pack.prim_type, @@ -203,15 +89,6 @@ void BVH::build(Progress& progress) return; } - /* compute SAH */ - if(!params.top_level) - pack.SAH = root->computeSubtreeSAHCost(params); - - if(progress.get_cancel()) { - root->deleteSubtree(); - return; - } - /* pack triangles */ progress.set_substatus("Packing BVH triangles and strands"); pack_primitives(); @@ -227,18 +104,6 @@ void BVH::build(Progress& progress) /* free build nodes */ root->deleteSubtree(); - - if(progress.get_cancel()) return; - - /* cache write */ - if(params.use_cache) { - progress.set_substatus("Writing BVH cache"); - cache_write(key); - - /* clear other bvh files from cache */ - if(params.top_level) - clear_cache_except(); - } } /* Refitting */ @@ -256,7 +121,7 @@ void BVH::refit(Progress& progress) /* Triangles */ -void BVH::pack_triangle(int idx, float4 woop[3]) +void BVH::pack_triangle(int idx, float4 storage[3]) { int tob = pack.prim_object[idx]; assert(tob >= 0 && tob < objects.size()); @@ -269,36 +134,34 @@ void BVH::pack_triangle(int idx, float4 woop[3]) float3 v1 = vpos[vidx[1]]; float3 v2 = vpos[vidx[2]]; - woop[0] = float3_to_float4(v0); - woop[1] = float3_to_float4(v1); - woop[2] = float3_to_float4(v2); + storage[0] = float3_to_float4(v0); + storage[1] = float3_to_float4(v1); + storage[2] = float3_to_float4(v2); } -/* Curves*/ - void BVH::pack_primitives() { int nsize = TRI_NODE_SIZE; size_t tidx_size = pack.prim_index.size(); - pack.tri_woop.clear(); - pack.tri_woop.resize(tidx_size * nsize); + pack.tri_storage.clear(); + pack.tri_storage.resize(tidx_size * nsize); pack.prim_visibility.clear(); pack.prim_visibility.resize(tidx_size); for(unsigned int i = 0; i < tidx_size; i++) { if(pack.prim_index[i] != -1) { - float4 woop[3]; + float4 storage[3]; if(pack.prim_type[i] & PRIMITIVE_TRIANGLE) { - pack_triangle(i, woop); + pack_triangle(i, storage); } else { /* Avoid use of uninitialized memory. */ - memset(&woop, 0, sizeof(woop)); + memset(&storage, 0, sizeof(storage)); } - memcpy(&pack.tri_woop[i * nsize], woop, sizeof(float4)*3); + memcpy(&pack.tri_storage[i * nsize], storage, sizeof(float4)*3); int tob = pack.prim_object[i]; Object *ob = objects[tob]; @@ -308,7 +171,7 @@ void BVH::pack_primitives() pack.prim_visibility[i] |= PATH_RAY_CURVE; } else { - memset(&pack.tri_woop[i * nsize], 0, sizeof(float4)*3); + memset(&pack.tri_storage[i * nsize], 0, sizeof(float4)*3); pack.prim_visibility[i] = 0; } } @@ -345,10 +208,10 @@ void BVH::pack_instances(size_t nodes_size, size_t leaf_nodes_size) /* reserve */ size_t prim_index_size = pack.prim_index.size(); - size_t tri_woop_size = pack.tri_woop.size(); + size_t tri_storage_size = pack.tri_storage.size(); size_t pack_prim_index_offset = prim_index_size; - size_t pack_tri_woop_offset = tri_woop_size; + size_t pack_tri_storage_offset = tri_storage_size; size_t pack_nodes_offset = nodes_size; size_t pack_leaf_nodes_offset = leaf_nodes_size; size_t object_offset = 0; @@ -359,10 +222,10 @@ void BVH::pack_instances(size_t nodes_size, size_t leaf_nodes_size) Mesh *mesh = ob->mesh; BVH *bvh = mesh->bvh; - if(!mesh->transform_applied) { + if(mesh->need_build_bvh()) { if(mesh_map.find(mesh) == mesh_map.end()) { prim_index_size += bvh->pack.prim_index.size(); - tri_woop_size += bvh->pack.tri_woop.size(); + tri_storage_size += bvh->pack.tri_storage.size(); nodes_size += bvh->pack.nodes.size(); leaf_nodes_size += bvh->pack.leaf_nodes.size(); @@ -377,7 +240,7 @@ void BVH::pack_instances(size_t nodes_size, size_t leaf_nodes_size) pack.prim_type.resize(prim_index_size); pack.prim_object.resize(prim_index_size); pack.prim_visibility.resize(prim_index_size); - pack.tri_woop.resize(tri_woop_size); + pack.tri_storage.resize(tri_storage_size); pack.nodes.resize(nodes_size); pack.leaf_nodes.resize(leaf_nodes_size); pack.object_node.resize(objects.size()); @@ -386,7 +249,7 @@ void BVH::pack_instances(size_t nodes_size, size_t leaf_nodes_size) int *pack_prim_type = (pack.prim_type.size())? &pack.prim_type[0]: NULL; int *pack_prim_object = (pack.prim_object.size())? &pack.prim_object[0]: NULL; uint *pack_prim_visibility = (pack.prim_visibility.size())? &pack.prim_visibility[0]: NULL; - float4 *pack_tri_woop = (pack.tri_woop.size())? &pack.tri_woop[0]: NULL; + float4 *pack_tri_storage = (pack.tri_storage.size())? &pack.tri_storage[0]: NULL; int4 *pack_nodes = (pack.nodes.size())? &pack.nodes[0]: NULL; int4 *pack_leaf_nodes = (pack.leaf_nodes.size())? &pack.leaf_nodes[0]: NULL; @@ -394,9 +257,10 @@ void BVH::pack_instances(size_t nodes_size, size_t leaf_nodes_size) foreach(Object *ob, objects) { Mesh *mesh = ob->mesh; - /* if mesh transform is applied, that means it's already in the top - * level BVH, and we don't need to merge it in */ - if(mesh->transform_applied) { + /* We assume that if mesh doesn't need own BVH it was already included + * into a top-level BVH and no packing here is needed. + */ + if(!mesh->need_build_bvh()) { pack.object_node[object_offset++] = 0; continue; } @@ -447,10 +311,11 @@ void BVH::pack_instances(size_t nodes_size, size_t leaf_nodes_size) } /* merge triangle intersection data */ - if(bvh->pack.tri_woop.size()) { - memcpy(pack_tri_woop + pack_tri_woop_offset, &bvh->pack.tri_woop[0], - bvh->pack.tri_woop.size()*sizeof(float4)); - pack_tri_woop_offset += bvh->pack.tri_woop.size(); + if(bvh->pack.tri_storage.size()) { + memcpy(pack_tri_storage + pack_tri_storage_offset, + &bvh->pack.tri_storage[0], + bvh->pack.tri_storage.size()*sizeof(float4)); + pack_tri_storage_offset += bvh->pack.tri_storage.size(); } /* merge nodes */ |