diff options
-rw-r--r-- | source/blender/physics/BPH_mass_spring.h | 11 | ||||
-rw-r--r-- | source/blender/physics/intern/BPH_mass_spring.cpp | 61 | ||||
-rw-r--r-- | source/blender/physics/intern/implicit.h | 13 | ||||
-rw-r--r-- | source/blender/physics/intern/implicit_blender.c | 45 |
4 files changed, 111 insertions, 19 deletions
diff --git a/source/blender/physics/BPH_mass_spring.h b/source/blender/physics/BPH_mass_spring.h index 8382d0befe7..14c03d8e2b0 100644 --- a/source/blender/physics/BPH_mass_spring.h +++ b/source/blender/physics/BPH_mass_spring.h @@ -28,7 +28,12 @@ #ifndef __BPH_MASS_SPRING_H__ #define __BPH_MASS_SPRING_H__ +#ifdef __cplusplus +extern "C" { +#endif + struct Implicit_Data; +struct ClothModifierData; struct Implicit_Data *BPH_mass_spring_solver_create(int numverts, int numsprings); void BPH_mass_spring_solver_free(struct Implicit_Data *id); @@ -36,8 +41,12 @@ void BPH_mass_spring_solver_free(struct Implicit_Data *id); int BPH_cloth_solver_init(struct Object *ob, struct ClothModifierData *clmd); void BPH_cloth_solver_free(struct ClothModifierData *clmd); int BPH_cloth_solve(struct Object *ob, float frame, struct ClothModifierData *clmd, struct ListBase *effectors); -void BKE_cloth_solver_set_positions (struct ClothModifierData *clmd ); +void BKE_cloth_solver_set_positions(struct ClothModifierData *clmd); bool implicit_hair_volume_get_texture_data(struct Object *UNUSED(ob), struct ClothModifierData *clmd, struct ListBase *UNUSED(effectors), struct VoxelData *vd); +#ifdef __cplusplus +} +#endif + #endif diff --git a/source/blender/physics/intern/BPH_mass_spring.cpp b/source/blender/physics/intern/BPH_mass_spring.cpp index e69de29bb2d..4c8c5a39138 100644 --- a/source/blender/physics/intern/BPH_mass_spring.cpp +++ b/source/blender/physics/intern/BPH_mass_spring.cpp @@ -0,0 +1,61 @@ +/* + * ***** BEGIN GPL LICENSE BLOCK ***** + * + * 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) Blender Foundation + * All rights reserved. + * + * The Original Code is: all of this file. + * + * Contributor(s): Lukas Toenne + * + * ***** END GPL LICENSE BLOCK ***** + */ + +/** \file blender/blenkernel/intern/BPH_mass_spring.c + * \ingroup bph + */ + +#include "DNA_scene_types.h" +#include "DNA_object_types.h" +#include "DNA_meshdata_types.h" +#include "DNA_modifier_types.h" + +#include "BLI_math.h" +#include "BLI_linklist.h" +#include "BLI_utildefines.h" + +#include "BKE_cloth.h" + +#include "BPH_mass_spring.h" +#include "implicit.h" + +void BKE_cloth_solver_set_positions(ClothModifierData *clmd) +{ + Cloth *cloth = clmd->clothObject; + ClothVertex *verts = cloth->verts; + unsigned int numverts = cloth->numverts, i; + ClothHairRoot *cloth_roots = clmd->roots; + Implicit_Data *id = cloth->implicit; + const float ZERO[3] = {0.0f, 0.0f, 0.0f}; + + for (i = 0; i < numverts; i++) { + ClothHairRoot *root = &cloth_roots[i]; + + BPH_mass_spring_set_root_motion(id, i, root->loc, ZERO, root->rot, ZERO); + BPH_mass_spring_set_motion_state(id, i, verts[i].x, verts[i].v); + } +} diff --git a/source/blender/physics/intern/implicit.h b/source/blender/physics/intern/implicit.h index edddd1b0486..66d91d7bb48 100644 --- a/source/blender/physics/intern/implicit.h +++ b/source/blender/physics/intern/implicit.h @@ -36,6 +36,10 @@ #include "BLI_utildefines.h" +#ifdef __cplusplus +extern "C" { +#endif + //#define IMPLICIT_SOLVER_EIGEN #define IMPLICIT_SOLVER_BLENDER @@ -52,9 +56,18 @@ //#define IMPLICIT_ENABLE_EIGEN_DEBUG +struct Implicit_Data; + BLI_INLINE void implicit_print_matrix_elem(float v) { printf("%-8.3f", v); } +void BPH_mass_spring_set_root_motion(struct Implicit_Data *data, int index, const float loc[3], const float vel[3], float rot[3][3], const float angvel[3]); +void BPH_mass_spring_set_motion_state(struct Implicit_Data *data, int index, const float x[3], const float v[3]); + +#ifdef __cplusplus +} +#endif + #endif diff --git a/source/blender/physics/intern/implicit_blender.c b/source/blender/physics/intern/implicit_blender.c index 2dbb1eb325a..20b85cdf5c3 100644 --- a/source/blender/physics/intern/implicit_blender.c +++ b/source/blender/physics/intern/implicit_blender.c @@ -2714,29 +2714,38 @@ int BPH_cloth_solve(Object *ob, float frame, ClothModifierData *clmd, ListBase * return 1; } -void BKE_cloth_solver_set_positions(ClothModifierData *clmd) +void BPH_mass_spring_set_root_motion(Implicit_Data *data, int index, const float loc[3], const float vel[3], float rot[3][3], const float angvel[3]) { - Cloth *cloth = clmd->clothObject; - ClothVertex *verts = cloth->verts; - unsigned int numverts = cloth->numverts, i; - ClothHairRoot *cloth_roots = clmd->roots; - Implicit_Data *id = cloth->implicit; + RootTransform *root = &data->root[index]; - for (i = 0; i < numverts; i++) { #ifdef CLOTH_ROOT_FRAME - copy_v3_v3(id->root[i].loc, cloth_roots[i].loc); - copy_m3_m3(id->root[i].rot, cloth_roots[i].rot); + copy_v3_v3(root->loc, loc); + copy_v3_v3(root->vel, vel); + copy_m3_m3(root->rot, rot); + copy_v3_v3(root->omega, angvel); + /* XXX root frame acceleration ignored for now */ + zero_v3(root->acc); + zero_v3(root->domega_dt); #else - zero_v3(id->root[i].loc); - unit_m3(id->root[i].rot); - (void)cloth_roots; + zero_v3(root->loc); + zero_v3(root->vel); + unit_m3(root->rot); + zero_v3(root->omega); + zero_v3(root->acc); + zero_v3(root->domega_dt); + (void)loc; + (void)vel; + (void)rot; + (void)angvel; #endif - - loc_world_to_root(id->X[i], verts[i].x, &id->root[i]); - vel_world_to_root(id->V[i], id->X[i], verts[i].v, &id->root[i]); - } - if (G.debug_value > 0) - printf("implicit_set_positions\n"); +} + +void BPH_mass_spring_set_motion_state(Implicit_Data *data, int index, const float x[3], const float v[3]) +{ + RootTransform *root = &data->root[index]; + + loc_world_to_root(data->X[index], x, root); + vel_world_to_root(data->V[index], data->X[index], v, root); } #endif /* IMPLICIT_SOLVER_BLENDER */ |