diff options
author | over0219 <over0219@umn.edu> | 2020-06-23 06:58:33 +0300 |
---|---|---|
committer | over0219 <over0219@umn.edu> | 2020-06-23 06:58:33 +0300 |
commit | fc110d41b7078a40aeaabc92c496eb88985a42c5 (patch) | |
tree | 0d8df6171ece8809480ce81ae20777a7571e7927 /intern | |
parent | 0d317dddc9c3a9277fc559f18f28d958cff72a30 (diff) |
working on nearest-face traversal
Diffstat (limited to 'intern')
-rw-r--r-- | intern/softbody/admmpd_api.cpp | 41 | ||||
-rw-r--r-- | intern/softbody/admmpd_api.h | 9 |
2 files changed, 43 insertions, 7 deletions
diff --git a/intern/softbody/admmpd_api.cpp b/intern/softbody/admmpd_api.cpp index 4fa549211d3..302f066ef5b 100644 --- a/intern/softbody/admmpd_api.cpp +++ b/intern/softbody/admmpd_api.cpp @@ -25,6 +25,8 @@ #include "admmpd_types.h" #include "admmpd_solver.h" #include "admmpd_embeddedmesh.h" +#include "admmpd_collision.h" + #include "tetgen_api.h" #include "DNA_mesh_types.h" // Mesh #include "DNA_meshdata_types.h" // MVert @@ -40,6 +42,7 @@ struct ADMMPDInternalData { admmpd::Options *options; admmpd::SolverData *data; admmpd::EmbeddedMeshData *embmesh; + admmpd::Collision *collision; int in_totverts; // number of input verts }; @@ -52,12 +55,14 @@ void admmpd_dealloc(ADMMPDInterfaceData *iface) if (iface->idata) { - if(iface->idata->options) - delete iface->idata->options; - if(iface->idata->data) - delete iface->idata->data; - if(iface->idata->embmesh) - delete iface->idata->embmesh; + if (iface->idata->options) + delete iface->idata->options; + if (iface->idata->data) + delete iface->idata->data; + if (iface->idata->embmesh) + delete iface->idata->embmesh; + if (iface->idata->collision) + delete iface->idata->collision; delete iface->idata; } @@ -163,6 +168,7 @@ int admmpd_init(ADMMPDInterfaceData *iface, float *in_verts, unsigned int *in_fa iface->idata->data = new admmpd::SolverData(); admmpd::SolverData *data = iface->idata->data; iface->idata->embmesh = new admmpd::EmbeddedMeshData(); + iface->idata->collision = NULL; // Generate tets and vertices Eigen::MatrixXd V; @@ -173,9 +179,11 @@ int admmpd_init(ADMMPDInterfaceData *iface, float *in_verts, unsigned int *in_fa default: case 0: gen_success = admmpd_init_with_tetgen(iface,in_verts,in_faces,&V,&T); + //iface->idata->collision = new admmpd::EmbeddedMeshData(); break; case 1: gen_success = admmpd_init_with_lattice(iface,in_verts,in_faces,&V,&T); + iface->idata->collision = new admmpd::EmbeddedMeshCollision(iface->idata->embmesh); break; } if (!gen_success || iface->totverts==0) @@ -220,6 +228,25 @@ void admmpd_copy_from_bodypoint(ADMMPDInterfaceData *iface, const BodyPoint *pts } } +void admmpd_update_obstacles( + ADMMPDInterfaceData *iface, + float *in_verts_0, + float *in_verts_1, + int nv, + unsigned int *in_faces, + int nf) +{ + if (iface==NULL || in_verts_0==NULL || in_verts_1==NULL || in_faces==NULL) + return; + if (iface->idata==NULL) + return; + if (iface->idata->collision==NULL) + return; + + iface->idata->collision->set_obstacles( + in_verts_0, in_verts_1, nv, in_faces, nf); +} + void admmpd_copy_to_bodypoint_and_object(ADMMPDInterfaceData *iface, BodyPoint *pts, float (*vertexCos)[3]) { @@ -276,7 +303,7 @@ void admmpd_solve(ADMMPDInterfaceData *iface) try { - admmpd::Solver().solve(iface->idata->options,iface->idata->data,NULL); + admmpd::Solver().solve(iface->idata->options,iface->idata->data,iface->idata->collision); } catch(const std::exception &e) { diff --git a/intern/softbody/admmpd_api.h b/intern/softbody/admmpd_api.h index bd4ff9a3a1f..f29a3bbdc7d 100644 --- a/intern/softbody/admmpd_api.h +++ b/intern/softbody/admmpd_api.h @@ -54,6 +54,15 @@ int admmpd_init(ADMMPDInterfaceData*, float *in_verts, unsigned int *in_faces); // to internal vertex position and velocity void admmpd_copy_from_bodypoint(ADMMPDInterfaceData*, const BodyPoint *pts); +// Sets the obstacle data for collisions +void admmpd_update_obstacles( + ADMMPDInterfaceData*, + float *in_verts_0, + float *in_verts_1, + int nv, + unsigned int *in_faces, + int nf); + // Copies internal vertex position and velocity data // to BodyPoints (from SoftBody) AND surface mesh vertices. // If pts or vertexCos is null, its skipped |