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:
authorSergey Sharybin <sergey.vfx@gmail.com>2016-02-22 18:25:33 +0300
committerSergey Sharybin <sergey.vfx@gmail.com>2016-03-31 11:06:21 +0300
commitd9b729e342b72bfe31e7932723a149db3b7aa77c (patch)
treecc1de21b2999dea8ad4be41752e030758f280b09 /intern/cycles/bvh/bvh_sort.cpp
parentbbbbe68473e02567a902a6405ca09de216674615 (diff)
Cycles: Only sort indices when finding a best dimension to split
This reduces amount of data being moved back and forth, which should have positive effect on the performance.
Diffstat (limited to 'intern/cycles/bvh/bvh_sort.cpp')
-rw-r--r--intern/cycles/bvh/bvh_sort.cpp51
1 files changed, 50 insertions, 1 deletions
diff --git a/intern/cycles/bvh/bvh_sort.cpp b/intern/cycles/bvh/bvh_sort.cpp
index 3140bf23376..8088dccbc07 100644
--- a/intern/cycles/bvh/bvh_sort.cpp
+++ b/intern/cycles/bvh/bvh_sort.cpp
@@ -65,5 +65,54 @@ void bvh_reference_sort(int start, int end, BVHReference *data, int dim)
sort(data+start, data+end, compare);
}
-CCL_NAMESPACE_END
+struct BVHReferenceCompareIndexed {
+public:
+ BVHReferenceCompareIndexed(int dim, const BVHReference *data, int start)
+ : dim_(dim),
+ start_(start),
+ data_(data)
+ {}
+
+ bool operator()(const int a, const int b)
+ {
+ const BVHReference& ra = data_[start_ + a];
+ const BVHReference& rb = data_[start_ + b];
+ NO_EXTENDED_PRECISION float ca = ra.bounds().min[dim_] + ra.bounds().max[dim_];
+ NO_EXTENDED_PRECISION float cb = rb.bounds().min[dim_] + rb.bounds().max[dim_];
+
+ if(ca < cb) return true;
+ else if(ca > cb) return false;
+ else if(ra.prim_object() < rb.prim_object()) return true;
+ else if(ra.prim_object() > rb.prim_object()) return false;
+ else if(ra.prim_index() < rb.prim_index()) return true;
+ else if(ra.prim_index() > rb.prim_index()) return false;
+ else if(ra.prim_type() < rb.prim_type()) return true;
+ else if(ra.prim_type() > rb.prim_type()) return false;
+
+ return false;
+ }
+
+private:
+ int dim_, start_;
+ const BVHReference *data_;
+};
+/* NOTE: indices are always from 0 to count, even in the cases when start is not
+ * zero. This is to simplify indexing in the object splitter. Index array is also
+ * always zero-based index.
+ */
+void bvh_reference_sort_indices(int start,
+ int end,
+ const BVHReference *data,
+ int *indices,
+ int dim)
+{
+ const int count = end - start;
+ for(int i = 0; i < count; ++i) {
+ indices[i] = i;
+ }
+ BVHReferenceCompareIndexed compare(dim, data, start);
+ sort(indices, indices+count, compare);
+}
+
+CCL_NAMESPACE_END