Win32: Use the nicer looking blender-drawn confirmation message box when
[blender.git] / source / blender / physics / intern / implicit.h
1 /*
2  * ***** BEGIN GPL LICENSE BLOCK *****
3  *
4  * This program is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU General Public License
6  * as published by the Free Software Foundation; either version 2
7  * of the License, or (at your option) any later version.
8  *
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with this program; if not, write to the Free Software Foundation,
16  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17  *
18  * The Original Code is Copyright (C) Blender Foundation
19  * All rights reserved.
20  *
21  * The Original Code is: all of this file.
22  *
23  * Contributor(s): Lukas Toenne
24  *
25  * ***** END GPL LICENSE BLOCK *****
26  */
27
28 #ifndef __IMPLICIT_H__
29 #define __IMPLICIT_H__
30
31 /** \file implicit.h
32  *  \ingroup bph
33  */
34
35 #include "stdio.h"
36
37 #include "BLI_utildefines.h"
38
39 #include "BKE_collision.h"
40
41 #ifdef __cplusplus
42 extern "C" {
43 #endif
44
45 //#define IMPLICIT_SOLVER_EIGEN
46 #define IMPLICIT_SOLVER_BLENDER
47
48 #define CLOTH_ROOT_FRAME /* enable use of root frame coordinate transform */
49
50 #define CLOTH_FORCE_GRAVITY
51 #define CLOTH_FORCE_DRAG
52 #define CLOTH_FORCE_SPRING_STRUCTURAL
53 #define CLOTH_FORCE_SPRING_SHEAR
54 #define CLOTH_FORCE_SPRING_BEND
55 #define CLOTH_FORCE_SPRING_GOAL
56 #define CLOTH_FORCE_EFFECTORS
57
58 //#define IMPLICIT_PRINT_SOLVER_INPUT_OUTPUT
59
60 //#define IMPLICIT_ENABLE_EIGEN_DEBUG
61
62 struct Implicit_Data;
63
64 typedef struct ImplicitSolverResult {
65         int status;
66
67         int iterations;
68         float error;
69 } ImplicitSolverResult;
70
71 BLI_INLINE void implicit_print_matrix_elem(float v)
72 {
73     printf("%-8.3f", v);
74 }
75
76 void BPH_mass_spring_set_vertex_mass(struct Implicit_Data *data, int index, float mass);
77 void BPH_mass_spring_set_rest_transform(struct Implicit_Data *data, int index, float rot[3][3]);
78
79 void BPH_mass_spring_set_motion_state(struct Implicit_Data *data, int index, const float x[3], const float v[3]);
80 void BPH_mass_spring_set_position(struct Implicit_Data *data, int index, const float x[3]);
81 void BPH_mass_spring_set_velocity(struct Implicit_Data *data, int index, const float v[3]);
82 void BPH_mass_spring_get_motion_state(struct Implicit_Data *data, int index, float x[3], float v[3]);
83 void BPH_mass_spring_get_position(struct Implicit_Data *data, int index, float x[3]);
84
85 /* access to modified motion state during solver step */
86 void BPH_mass_spring_get_new_position(struct Implicit_Data *data, int index, float x[3]);
87 void BPH_mass_spring_set_new_position(struct Implicit_Data *data, int index, const float x[3]);
88 void BPH_mass_spring_get_new_velocity(struct Implicit_Data *data, int index, float v[3]);
89 void BPH_mass_spring_set_new_velocity(struct Implicit_Data *data, int index, const float v[3]);
90
91 void BPH_mass_spring_clear_constraints(struct Implicit_Data *data);
92 void BPH_mass_spring_add_constraint_ndof0(struct Implicit_Data *data, int index, const float dV[3]);
93 void BPH_mass_spring_add_constraint_ndof1(struct Implicit_Data *data, int index, const float c1[3], const float c2[3], const float dV[3]);
94 void BPH_mass_spring_add_constraint_ndof2(struct Implicit_Data *data, int index, const float c1[3], const float dV[3]);
95
96 bool BPH_mass_spring_solve_velocities(struct Implicit_Data *data, float dt, struct ImplicitSolverResult *result);
97 bool BPH_mass_spring_solve_positions(struct Implicit_Data *data, float dt);
98 void BPH_mass_spring_apply_result(struct Implicit_Data *data);
99
100 /* Clear the force vector at the beginning of the time step */
101 void BPH_mass_spring_clear_forces(struct Implicit_Data *data);
102 /* Fictitious forces introduced by moving coordinate systems */
103 void BPH_mass_spring_force_reference_frame(struct Implicit_Data *data, int index, const float acceleration[3], const float omega[3], const float domega_dt[3], float mass);
104 /* Simple uniform gravity force */
105 void BPH_mass_spring_force_gravity(struct Implicit_Data *data, int index, float mass, const float g[3]);
106 /* Global drag force (velocity damping) */
107 void BPH_mass_spring_force_drag(struct Implicit_Data *data, float drag);
108 /* Custom external force */
109 void BPH_mass_spring_force_extern(struct Implicit_Data *data, int i, const float f[3], float dfdx[3][3], float dfdv[3][3]);
110 /* Wind force, acting on a face */
111 void BPH_mass_spring_force_face_wind(struct Implicit_Data *data, int v1, int v2, int v3, const float (*winvec)[3]);
112 /* Wind force, acting on an edge */
113 void BPH_mass_spring_force_edge_wind(struct Implicit_Data *data, int v1, int v2, float radius1, float radius2, const float (*winvec)[3]);
114 /* Wind force, acting on a vertex */
115 void BPH_mass_spring_force_vertex_wind(struct Implicit_Data *data, int v, float radius, const float (*winvec)[3]);
116 /* Linear spring force between two points */
117 bool BPH_mass_spring_force_spring_linear(struct Implicit_Data *data, int i, int j, float restlen,
118                                          float stiffness_tension, float damping_tension,
119                                          float stiffness_compression, float damping_compression,
120                                          bool resist_compress, bool new_compress, float clamp_force);
121 /* Angular spring force between two polygons */
122 bool BPH_mass_spring_force_spring_angular(struct Implicit_Data *data, int i, int j, int *i_a, int *i_b, int len_a, int len_b,
123                                           float restang, float stiffness, float damping);
124 /* Bending force, forming a triangle at the base of two structural springs */
125 bool BPH_mass_spring_force_spring_bending(struct Implicit_Data *data, int i, int j, float restlen, float kb, float cb);
126 /* Angular bending force based on local target vectors */
127 bool BPH_mass_spring_force_spring_bending_hair(struct Implicit_Data *data, int i, int j, int k,
128                                                   const float target[3], float stiffness, float damping);
129 /* Global goal spring */
130 bool BPH_mass_spring_force_spring_goal(struct Implicit_Data *data, int i, const float goal_x[3], const float goal_v[3],
131                                        float stiffness, float damping);
132
133 /* ======== Hair Volumetric Forces ======== */
134
135 struct HairGrid;
136
137 struct VoxelData;
138
139 #define MAX_HAIR_GRID_RES 256
140
141 struct HairGrid *BPH_hair_volume_create_vertex_grid(float cellsize, const float gmin[3], const float gmax[3]);
142 void BPH_hair_volume_free_vertex_grid(struct HairGrid *grid);
143 void BPH_hair_volume_grid_geometry(struct HairGrid *grid, float *cellsize, int res[3], float gmin[3], float gmax[3]);
144
145 void BPH_hair_volume_grid_clear(struct HairGrid *grid);
146 void BPH_hair_volume_add_vertex(struct HairGrid *grid, const float x[3], const float v[3]);
147 void BPH_hair_volume_add_segment(struct HairGrid *grid,
148                                  const float x1[3], const float v1[3], const float x2[3], const float v2[3],
149                                  const float x3[3], const float v3[3], const float x4[3], const float v4[3],
150                                  const float dir1[3], const float dir2[3], const float dir3[3]);
151
152 void BPH_hair_volume_normalize_vertex_grid(struct HairGrid *grid);
153
154 bool BPH_hair_volume_solve_divergence(struct HairGrid *grid, float dt, float target_density, float target_strength);
155 #if 0 /* XXX weighting is incorrect, disabled for now */
156 void BPH_hair_volume_vertex_grid_filter_box(struct HairVertexGrid *grid, int kernel_size);
157 #endif
158
159 void BPH_hair_volume_grid_interpolate(struct HairGrid *grid, const float x[3],
160                                       float *density, float velocity[3], float velocity_smooth[3],
161                                       float density_gradient[3], float velocity_gradient[3][3]);
162
163 /* Effect of fluid simulation grid on velocities.
164  * fluid_factor controls blending between PIC (Particle-in-Cell)
165  *     and FLIP (Fluid-Implicit-Particle) methods (0 = only PIC, 1 = only FLIP)
166  */
167 void BPH_hair_volume_grid_velocity(struct HairGrid *grid, const float x[3], const float v[3],
168                                    float fluid_factor,
169                                    float r_v[3]);
170 /* XXX Warning: expressing grid effects on velocity as a force is not very stable,
171  * due to discontinuities in interpolated values!
172  * Better use hybrid approaches such as described in
173  * "Detail Preserving Continuum Simulation of Straight Hair"
174  * (McAdams, Selle 2009)
175  */
176 void BPH_hair_volume_vertex_grid_forces(struct HairGrid *grid, const float x[3], const float v[3],
177                                         float smoothfac, float pressurefac, float minpressure,
178                                         float f[3], float dfdx[3][3], float dfdv[3][3]);
179
180 #ifdef __cplusplus
181 }
182 #endif
183
184 #endif