Fermat
project.h
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2010-2018, NVIDIA Corporation
3  * All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions are met:
7  * * Redistributions of source code must retain the above copyright
8  * notice, this list of conditions and the following disclaimer.
9  * * Redistributions in binary form must reproduce the above copyright
10  * notice, this list of conditions and the following disclaimer in the
11  * documentation and/or other materials provided with the distribution.
12  * * Neither the name of NVIDIA Corporation nor the
13  * names of its contributors may be used to endorse or promote products
14  * derived from this software without specific prior written permission.
15  *
16  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
17  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19  * DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY
20  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26  */
27 
32 #pragma once
33 
34 #include <cugar/basic/numbers.h>
35 #include <cugar/linalg/vector.h>
37 
38 namespace cugar {
39 
52 template <typename Basis_type, typename Fun_type>
53 void project(
54  const Basis_type basis,
55  const Fun_type& fun,
56  const float a,
57  const float b,
58  const int32 n_samples,
59  float* coeffs)
60 {
61  const float w = 4.0f * M_PIf / float(n_samples);
62 
63  for (int32 s = 0; s < n_samples; ++s)
64  {
65  Vector2f uv;
66 
67  uv[0] = float(s) / float(n_samples);
68  uv[1] = radical_inverse(s);
69 
70  const Vector3f dir = uniform_square_to_sphere( uv );
71 
72  const float f = a*fun( dir ) + b;
73 
74  for (int32 i = 0; i < Basis_type::COEFFS; ++i)
75  coeffs[i] += Basis_type::eval( i, dir ) * f * w;
76  }
77 }
78 
79 } // namespace cugar
CUGAR_FORCEINLINE CUGAR_HOST_DEVICE float radical_inverse(unsigned int n)
Definition: numbers.h:782
Defines various spherical mappings.
void project(const Basis_type basis, const Fun_type &fun, const float a, const float b, const int32 n_samples, float *coeffs)
Definition: project.h:53
Definition: vector.h:54
Define a vector_view POD type and plain_view() for std::vector.
Definition: diff.h:38
CUGAR_HOST CUGAR_DEVICE Vector3f uniform_square_to_sphere(const Vector2f &uv)
Definition: mappings_inline.h:162