Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/intern
diff options
context:
space:
mode:
authorover0219 <over0219@umn.edu>2020-06-23 06:58:33 +0300
committerover0219 <over0219@umn.edu>2020-06-23 06:58:33 +0300
commitfc110d41b7078a40aeaabc92c496eb88985a42c5 (patch)
tree0d8df6171ece8809480ce81ae20777a7571e7927 /intern
parent0d317dddc9c3a9277fc559f18f28d958cff72a30 (diff)
working on nearest-face traversal
Diffstat (limited to 'intern')
-rw-r--r--intern/softbody/admmpd_api.cpp41
-rw-r--r--intern/softbody/admmpd_api.h9
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