2 * Copyright (c) 2016, Blender Foundation.
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 the <organization> 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.
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.
29 /** \file curve_fit_inline.h
33 /** \name Simple Vector Math Lib
37 # define MINLINE static __forceinline
39 # define MINLINE static inline
42 MINLINE double sq(const double d)
48 MINLINE double min(const double a, const double b)
53 MINLINE double max(const double a, const double b)
60 double v0[], const uint dims)
62 for (uint j = 0; j < dims; j++) {
67 MINLINE void flip_vn_vnvn(
68 double v_out[], const double v0[], const double v1[], const uint dims)
70 for (uint j = 0; j < dims; j++) {
71 v_out[j] = v0[j] + (v0[j] - v1[j]);
75 MINLINE void copy_vnvn(
76 double v0[], const double v1[], const uint dims)
78 for (uint j = 0; j < dims; j++) {
83 MINLINE void copy_vnfl_vndb(
84 float v0[], const double v1[], const uint dims)
86 for (uint j = 0; j < dims; j++) {
91 MINLINE void copy_vndb_vnfl(
92 double v0[], const float v1[], const uint dims)
94 for (uint j = 0; j < dims; j++) {
95 v0[j] = (double)v1[j];
99 MINLINE double dot_vnvn(
100 const double v0[], const double v1[], const uint dims)
103 for (uint j = 0; j < dims; j++) {
109 MINLINE void add_vn_vnvn(
110 double v_out[], const double v0[], const double v1[], const uint dims)
112 for (uint j = 0; j < dims; j++) {
113 v_out[j] = v0[j] + v1[j];
117 MINLINE void sub_vn_vnvn(
118 double v_out[], const double v0[], const double v1[], const uint dims)
120 for (uint j = 0; j < dims; j++) {
121 v_out[j] = v0[j] - v1[j];
125 MINLINE void iadd_vnvn(
126 double v0[], const double v1[], const uint dims)
128 for (uint j = 0; j < dims; j++) {
133 MINLINE void isub_vnvn(
134 double v0[], const double v1[], const uint dims)
136 for (uint j = 0; j < dims; j++) {
141 MINLINE void madd_vn_vnvn_fl(
143 const double v0[], const double v1[],
144 const double f, const uint dims)
146 for (uint j = 0; j < dims; j++) {
147 v_out[j] = v0[j] + v1[j] * f;
151 MINLINE void msub_vn_vnvn_fl(
153 const double v0[], const double v1[],
154 const double f, const uint dims)
156 for (uint j = 0; j < dims; j++) {
157 v_out[j] = v0[j] - v1[j] * f;
161 MINLINE void miadd_vn_vn_fl(
162 double v_out[], const double v0[], double f, const uint dims)
164 for (uint j = 0; j < dims; j++) {
165 v_out[j] += v0[j] * f;
170 MINLINE void misub_vn_vn_fl(
171 double v_out[], const double v0[], double f, const uint dims)
173 for (uint j = 0; j < dims; j++) {
174 v_out[j] -= v0[j] * f;
179 MINLINE void mul_vnvn_fl(
181 const double v0[], const double f, const uint dims)
183 for (uint j = 0; j < dims; j++) {
184 v_out[j] = v0[j] * f;
188 MINLINE void imul_vn_fl(double v0[], const double f, const uint dims)
190 for (uint j = 0; j < dims; j++) {
196 MINLINE double len_squared_vnvn(
197 const double v0[], const double v1[], const uint dims)
200 for (uint j = 0; j < dims; j++) {
201 d += sq(v0[j] - v1[j]);
206 MINLINE double len_squared_vn(
207 const double v0[], const uint dims)
210 for (uint j = 0; j < dims; j++) {
216 MINLINE double len_vnvn(
217 const double v0[], const double v1[], const uint dims)
219 return sqrt(len_squared_vnvn(v0, v1, dims));
222 MINLINE double len_vn(
223 const double v0[], const uint dims)
225 return sqrt(len_squared_vn(v0, dims));
228 /* special case, save us negating a copy, then getting the length */
229 MINLINE double len_squared_negated_vnvn(
230 const double v0[], const double v1[], const uint dims)
233 for (uint j = 0; j < dims; j++) {
234 d += sq(v0[j] + v1[j]);
239 MINLINE double len_negated_vnvn(
240 const double v0[], const double v1[], const uint dims)
242 return sqrt(len_squared_negated_vnvn(v0, v1, dims));
245 MINLINE double normalize_vn(
246 double v0[], const uint dims)
248 double d = len_squared_vn(v0, dims);
249 if (d != 0.0 && ((d = sqrt(d)) != 0.0)) {
250 imul_vn_fl(v0, 1.0 / d, dims);
255 /* v_out = (v0 - v1).normalized() */
256 MINLINE double normalize_vn_vnvn(
258 const double v0[], const double v1[], const uint dims)
261 for (uint j = 0; j < dims; j++) {
262 double a = v0[j] - v1[j];
266 if (d != 0.0 && ((d = sqrt(d)) != 0.0)) {
267 imul_vn_fl(v_out, 1.0 / d, dims);
272 MINLINE bool is_almost_zero_ex(double val, double eps)
274 return (-eps < val) && (val < eps);
277 MINLINE bool is_almost_zero(double val)
279 return is_almost_zero_ex(val, 1e-8);
282 MINLINE bool equals_vnvn(
283 const double v0[], const double v1[], const uint dims)
285 for (uint j = 0; j < dims; j++) {
286 if (v0[j] != v1[j]) {