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/scene/sobol.cpp')
-rw-r--r--intern/cycles/scene/sobol.cpp94
1 files changed, 94 insertions, 0 deletions
diff --git a/intern/cycles/scene/sobol.cpp b/intern/cycles/scene/sobol.cpp
new file mode 100644
index 00000000000..09d10c3660e
--- /dev/null
+++ b/intern/cycles/scene/sobol.cpp
@@ -0,0 +1,94 @@
+/*
+ * Sobol sequence direction vectors.
+ *
+ * This file contains code to create direction vectors for generating sobol
+ * sequences in high dimensions. It is adapted from code on this webpage:
+ *
+ * http://web.maths.unsw.edu.au/~fkuo/sobol/
+ *
+ * From these papers:
+ *
+ * S. Joe and F. Y. Kuo, Remark on Algorithm 659: Implementing Sobol's quasirandom
+ * sequence generator, ACM Trans. Math. Softw. 29, 49-57 (2003)
+ *
+ * S. Joe and F. Y. Kuo, Constructing Sobol sequences with better two-dimensional
+ * projections, SIAM J. Sci. Comput. 30, 2635-2654 (2008)
+ */
+
+/* Copyright (c) 2008, Frances Y. Kuo and Stephen Joe
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * * Neither the names of the copyright holders nor the names of the
+ * University of New South Wales and the University of Waikato
+ * and its contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "util/types.h"
+
+#include "scene/sobol.h"
+
+CCL_NAMESPACE_BEGIN
+
+#include "scene/sobol.tables"
+
+void sobol_generate_direction_vectors(uint vectors[][SOBOL_BITS], int dimensions)
+{
+ assert(dimensions <= SOBOL_MAX_DIMENSIONS);
+
+ const uint L = SOBOL_BITS;
+
+ /* first dimension is exception */
+ uint *v = vectors[0];
+
+ for (uint i = 0; i < L; i++)
+ v[i] = 1 << (31 - i); // all m's = 1
+
+ for (int dim = 1; dim < dimensions; dim++) {
+ const SobolDirectionNumbers *numbers = &SOBOL_NUMBERS[dim - 1];
+ const uint s = numbers->s;
+ const uint a = numbers->a;
+ const uint *m = numbers->m;
+
+ v = vectors[dim];
+
+ if (L <= s) {
+ for (uint i = 0; i < L; i++)
+ v[i] = m[i] << (31 - i);
+ }
+ else {
+ for (uint i = 0; i < s; i++)
+ v[i] = m[i] << (31 - i);
+
+ for (uint i = s; i < L; i++) {
+ v[i] = v[i - s] ^ (v[i - s] >> s);
+
+ for (uint k = 1; k < s; k++)
+ v[i] ^= (((a >> (s - 1 - k)) & 1) * v[i - k]);
+ }
+ }
+ }
+}
+
+CCL_NAMESPACE_END