* Split render/ into scene/ and session/. The scene/ folder now contains the scene and its nodes. The session/ folder contains the render session and associated data structures like drivers and render buffers. * Move top level kernel headers into new folders kernel/camera/, kernel/film/, kernel/light/, kernel/sample/, kernel/util/ * Move integrator related kernel headers into kernel/integrator/ * Move OSL shaders from kernel/shaders/ to kernel/osl/shaders/ For patches and branches, git merge and rebase should be able to detect the renames and move over code to the right file.
95 lines
3.2 KiB
C++
95 lines
3.2 KiB
C++
/*
|
|
* 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/util_types.h"
|
|
|
|
#include "scene/sobol.h"
|
|
|
|
CCL_NAMESPACE_BEGIN
|
|
|
|
#include "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
|