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
diff options
context:
space:
mode:
Diffstat (limited to 'extern/softbody/src/admmpd_solver.cpp')
-rw-r--r--extern/softbody/src/admmpd_solver.cpp66
1 files changed, 37 insertions, 29 deletions
diff --git a/extern/softbody/src/admmpd_solver.cpp b/extern/softbody/src/admmpd_solver.cpp
index e322970f8b5..9441ee6f78e 100644
--- a/extern/softbody/src/admmpd_solver.cpp
+++ b/extern/softbody/src/admmpd_solver.cpp
@@ -19,11 +19,6 @@
namespace admmpd {
using namespace Eigen;
-struct ThreadData {
- const Options *options;
- SolverData *data;
-};
-
bool Solver::init(
const Eigen::MatrixXd &V,
const Eigen::MatrixXi &T,
@@ -70,9 +65,6 @@ int Solver::solve(
// the variables are sized correctly.
init_solve(options,data,collision,pin);
- // Perform collision detection and linearization
- linearize_collision_constraints(options,data,collision);
-
// Begin solver loop
int iters = 0;
for (; iters < options->max_admm_iters; ++iters)
@@ -80,6 +72,9 @@ int Solver::solve(
// Update ADMM z/u
solve_local_step(options,data);
+ // Collision detection and linearization
+ update_collisions(options,data,collision);
+
// Solve Ax=b s.t. Cx=d
ConjugateGradients().solve(options,data,collision);
//GaussSeidel().solve(options,data,collision);
@@ -149,6 +144,11 @@ void Solver::init_solve(
}
}
+ if (collision)
+ {
+ collision->init_bvh(&data->x_start, &data->x);
+ }
+
// ADMM variables
data->Dx.noalias() = data->D * data->x;
data->z = data->Dx;
@@ -156,41 +156,49 @@ void Solver::init_solve(
} // end init solve
-static void parallel_zu_update(
- void *__restrict userdata,
- const int i,
- const TaskParallelTLS *__restrict UNUSED(tls))
-{
- ThreadData *td = (ThreadData*)userdata;
- Lame lame;
- lame.set_from_youngs_poisson(td->options->youngs,td->options->poisson);
- EnergyTerm().update(
- td->data->indices[i][0],
- lame,
- td->data->rest_volumes[i],
- td->data->weights[i],
- &td->data->x,
- &td->data->Dx,
- &td->data->z,
- &td->data->u );
-} // end parallel zu update
-
void Solver::solve_local_step(
const Options *options,
SolverData *data)
{
BLI_assert(data != NULL);
BLI_assert(options != NULL);
+
+ struct LocalStepThreadData {
+ const Options *options;
+ SolverData *data;
+ };
+
+ auto parallel_zu_update = [](
+ void *__restrict userdata,
+ const int i,
+ const TaskParallelTLS *__restrict tls)->void
+ {
+ (void)(tls);
+ LocalStepThreadData *td = (LocalStepThreadData*)userdata;
+ Lame lame;
+ lame.set_from_youngs_poisson(td->options->youngs,td->options->poisson);
+ EnergyTerm().update(
+ td->data->indices[i][0],
+ lame,
+ td->data->rest_volumes[i],
+ td->data->weights[i],
+ &td->data->x,
+ &td->data->Dx,
+ &td->data->z,
+ &td->data->u );
+ }; // end parallel zu update
+
data->Dx.noalias() = data->D * data->x;
int ne = data->indices.size();
BLI_assert(ne > 0);
- ThreadData thread_data = {.options=options, .data = data};
+ LocalStepThreadData thread_data = {.options=options, .data = data};
TaskParallelSettings settings;
BLI_parallel_range_settings_defaults(&settings);
BLI_task_parallel_range(0, ne, &thread_data, parallel_zu_update, &settings);
+
} // end local step
-void Solver::linearize_collision_constraints(
+void Solver::update_collisions(
const Options *options,
SolverData *data,
Collision *collision)