2015-07-13 17:48:13 +02:00
|
|
|
/*
|
|
|
|
* This program is free software; you can redistribute it and/or
|
|
|
|
* modify it under the terms of the GNU General Public License
|
|
|
|
* as published by the Free Software Foundation; either version 2
|
|
|
|
* of the License, or (at your option) any later version.
|
|
|
|
*
|
|
|
|
* This program is distributed in the hope that it will be useful,
|
|
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
* GNU General Public License for more details.
|
|
|
|
*
|
|
|
|
* You should have received a copy of the GNU General Public License
|
|
|
|
* along with this program; if not, write to the Free Software Foundation,
|
|
|
|
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
|
|
|
*
|
|
|
|
* The Original Code is Copyright (C) 2015 by Blender Foundation
|
|
|
|
* All rights reserved.
|
2021-01-20 15:15:38 +11:00
|
|
|
*/
|
2015-07-13 17:48:13 +02:00
|
|
|
|
|
|
|
#pragma once
|
|
|
|
|
2019-02-18 08:08:12 +11:00
|
|
|
/** \file
|
|
|
|
* \ingroup bli
|
2015-07-13 17:48:13 +02:00
|
|
|
*/
|
|
|
|
|
2020-05-08 18:16:39 +02:00
|
|
|
#include "BLI_compiler_attrs.h"
|
|
|
|
#include "BLI_math_inline.h"
|
|
|
|
|
2015-07-13 17:48:13 +02:00
|
|
|
#ifdef __cplusplus
|
|
|
|
extern "C" {
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#ifdef BLI_MATH_GCC_WARN_PRAGMA
|
|
|
|
# pragma GCC diagnostic push
|
|
|
|
# pragma GCC diagnostic ignored "-Wredundant-decls"
|
|
|
|
#endif
|
|
|
|
|
|
|
|
/********************************** Eigen Solvers *********************************/
|
|
|
|
|
|
|
|
bool BLI_eigen_solve_selfadjoint_m3(const float m3[3][3],
|
|
|
|
float r_eigen_values[3],
|
|
|
|
float r_eigen_vectors[3][3]);
|
|
|
|
|
2021-04-29 21:25:34 -05:00
|
|
|
void BLI_svd_m3(const float m3[3][3], float r_U[3][3], float r_S[3], float r_V[3][3]);
|
2015-07-13 17:48:13 +02:00
|
|
|
|
2017-11-01 21:34:30 +03:00
|
|
|
/***************************** Simple Solvers ************************************/
|
|
|
|
|
|
|
|
bool BLI_tridiagonal_solve(
|
|
|
|
const float *a, const float *b, const float *c, const float *d, float *r_x, const int count);
|
|
|
|
bool BLI_tridiagonal_solve_cyclic(
|
|
|
|
const float *a, const float *b, const float *c, const float *d, float *r_x, const int count);
|
|
|
|
|
Shrinkwrap: new mode that projects along the target normal.
The Nearest Surface Point shrink method, while fast, is neither
smooth nor continuous: as the source point moves, the projected
point can both stop and jump. This causes distortions in the
deformation of the shrinkwrap modifier, and the motion of an
animated object with a shrinkwrap constraint.
This patch implements a new mode, which, instead of using the simple
nearest point search, iteratively solves an equation for each triangle
to find a point which has its interpolated normal point to or from the
original vertex. Non-manifold boundary edges are treated as infinitely
thin cylinders that cast normals in all perpendicular directions.
Since this is useful for the constraint, and having multiple
objects with constraints targeting the same guide mesh is a quite
reasonable use case, rather than calculating the mesh boundary edge
data over and over again, it is precomputed and cached in the mesh.
Reviewers: mont29
Differential Revision: https://developer.blender.org/D3836
2018-11-06 21:04:53 +03:00
|
|
|
/* Generic 3 variable Newton's method solver. */
|
|
|
|
typedef void (*Newton3D_DeltaFunc)(void *userdata, const float x[3], float r_delta[3]);
|
|
|
|
typedef void (*Newton3D_JacobianFunc)(void *userdata, const float x[3], float r_jacobian[3][3]);
|
|
|
|
typedef bool (*Newton3D_CorrectionFunc)(void *userdata,
|
|
|
|
const float x[3],
|
|
|
|
float step[3],
|
|
|
|
float x_next[3]);
|
|
|
|
|
|
|
|
bool BLI_newton3d_solve(Newton3D_DeltaFunc func_delta,
|
|
|
|
Newton3D_JacobianFunc func_jacobian,
|
|
|
|
Newton3D_CorrectionFunc func_correction,
|
|
|
|
void *userdata,
|
|
|
|
float epsilon,
|
|
|
|
int max_iterations,
|
|
|
|
bool trace,
|
|
|
|
const float x_init[3],
|
|
|
|
float result[3]);
|
|
|
|
|
2015-07-13 17:48:13 +02:00
|
|
|
#ifdef BLI_MATH_GCC_WARN_PRAGMA
|
|
|
|
# pragma GCC diagnostic pop
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#ifdef __cplusplus
|
|
|
|
}
|
|
|
|
#endif
|