Skip to content

Commit 47f7d56

Browse files
committed
add simulation start button in xpbd
1 parent 9358a8e commit 47f7d56

File tree

2 files changed

+121
-104
lines changed

2 files changed

+121
-104
lines changed

apps/MCF/mcf.cu

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@ int main(int argc, char** argv)
7575
" -perm: Permutation method for Cholesky factorization. Default is {}\n"
7676
" -max_cg_iter: Conjugate gradient maximum number of iterations. Default is {}\n"
7777
" -device_id: GPU device ID. Default is {}",
78-
Arg.obj_file_name, Arg.output_folder, (Arg.use_uniform_laplace? "true" : "false"), Arg.solver, Arg.time_step, Arg.cg_tolerance, Arg.perm_method, Arg.max_num_cg_iter, Arg.device_id);
78+
Arg.obj_file_name, Arg.output_folder, (Arg.use_uniform_laplace? "true" : "false"), Arg.time_step, Arg.solver, Arg.cg_tolerance, Arg.perm_method, Arg.max_num_cg_iter, Arg.device_id);
7979
// clang-format on
8080
exit(EXIT_SUCCESS);
8181
}

apps/XPBD/xpbd.cu

Lines changed: 120 additions & 103 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,10 @@
44
#include "rxmesh/query.cuh"
55
#include "rxmesh/rxmesh_static.h"
66

7+
#include "imgui.h"
8+
#include "polyscope/polyscope.h"
9+
10+
711
using namespace rxmesh;
812

913
template <uint32_t blockThreads>
@@ -100,7 +104,7 @@ void __global__ solve_bending(const Context context,
100104
const float bending_compliance,
101105
const float bending_relaxation,
102106
const float dt2)
103-
{
107+
{
104108
auto solve = [&](const EdgeHandle& eh, const VertexIterator& iter) {
105109
// iter[0] and iter[2] are the edge two vertices
106110
// iter[1] and iter[3] are the two opposite vertices
@@ -272,119 +276,132 @@ int main(int argc, char** argv)
272276
float mean(0.f);
273277
float mean2(0.f);
274278

279+
275280
// solve
281+
bool started = false;
282+
276283
auto polyscope_callback = [&]() mutable {
277-
GPUTimer timer;
278-
timer.start();
279-
float frame_time_left = frame_dt;
280-
while (frame_time_left > 0.0) {
281-
float dt0 = std::min(dt, frame_time_left);
282-
frame_time_left -= dt0;
283-
284-
// applyExtForce
285-
rx.for_each_vertex(DEVICE,
286-
[dt0,
287-
gravity,
288-
invM = *invM,
289-
v = *v,
290-
new_x = *new_x,
291-
x = *x] __device__(VertexHandle vh) {
292-
if (invM(vh, 0) > 0.0) {
293-
v(vh, 0) += gravity[0] * dt0;
294-
v(vh, 1) += gravity[1] * dt0;
295-
v(vh, 2) += gravity[2] * dt0;
296-
}
297-
new_x(vh, 0) = x(vh, 0) + v(vh, 0) * dt0;
298-
new_x(vh, 1) = x(vh, 1) + v(vh, 1) * dt0;
299-
new_x(vh, 2) = x(vh, 2) + v(vh, 2) * dt0;
300-
});
284+
if (ImGui::Button("Start Simulation") || started) {
285+
started = true;
286+
287+
GPUTimer timer;
288+
timer.start();
289+
float frame_time_left = frame_dt;
290+
while (frame_time_left > 0.0) {
291+
float dt0 = std::min(dt, frame_time_left);
292+
frame_time_left -= dt0;
293+
294+
// applyExtForce
295+
rx.for_each_vertex(DEVICE,
296+
[dt0,
297+
gravity,
298+
invM = *invM,
299+
v = *v,
300+
new_x = *new_x,
301+
x = *x] __device__(VertexHandle vh) {
302+
if (invM(vh, 0) > 0.0) {
303+
v(vh, 0) += gravity[0] * dt0;
304+
v(vh, 1) += gravity[1] * dt0;
305+
v(vh, 2) += gravity[2] * dt0;
306+
}
307+
new_x(vh, 0) = x(vh, 0) + v(vh, 0) * dt0;
308+
new_x(vh, 1) = x(vh, 1) + v(vh, 1) * dt0;
309+
new_x(vh, 2) = x(vh, 2) + v(vh, 2) * dt0;
310+
});
301311

302-
if (XPBD) {
303-
la_s->reset(0.0, DEVICE);
304-
la_b->reset(0.0, DEVICE);
305-
}
312+
if (XPBD) {
313+
la_s->reset(0.0, DEVICE);
314+
la_b->reset(0.0, DEVICE);
315+
}
316+
317+
for (uint32_t iter = 0; iter < rest_iter; ++iter) {
318+
// preSolve
319+
dp->reset(0, DEVICE);
320+
321+
// solveStretch
322+
solve_stretch<blockThreads>
323+
<<<solve_stretch_lb.blocks,
324+
solve_stretch_lb.num_threads,
325+
solve_stretch_lb.smem_bytes_dyn>>>(
326+
rx.get_context(),
327+
*dp,
328+
*la_s,
329+
*invM,
330+
*new_x,
331+
*rest_len,
332+
XPBD,
333+
stretch_compliance,
334+
stretch_relaxation,
335+
dt0 * dt0);
336+
337+
// solveBending
338+
solve_bending<blockThreads>
339+
<<<solve_bending_lb.blocks,
340+
solve_bending_lb.num_threads,
341+
solve_bending_lb.smem_bytes_dyn>>>(
342+
rx.get_context(),
343+
*dp,
344+
*la_b,
345+
*invM,
346+
*new_x,
347+
XPBD,
348+
bending_compliance,
349+
bending_relaxation,
350+
dt0 * dt0);
351+
352+
// postSolve
353+
rx.for_each_vertex(
354+
DEVICE,
355+
[dp = *dp, new_x = *new_x] __device__(VertexHandle vh) {
356+
new_x(vh, 0) += dp(vh, 0);
357+
new_x(vh, 1) += dp(vh, 1);
358+
new_x(vh, 2) += dp(vh, 2);
359+
});
360+
}
306361

307-
for (uint32_t iter = 0; iter < rest_iter; ++iter) {
308-
// preSolve
309-
dp->reset(0, DEVICE);
310-
311-
// solveStretch
312-
solve_stretch<blockThreads>
313-
<<<solve_stretch_lb.blocks,
314-
solve_stretch_lb.num_threads,
315-
solve_stretch_lb.smem_bytes_dyn>>>(rx.get_context(),
316-
*dp,
317-
*la_s,
318-
*invM,
319-
*new_x,
320-
*rest_len,
321-
XPBD,
322-
stretch_compliance,
323-
stretch_relaxation,
324-
dt0 * dt0);
325-
326-
// solveBending
327-
solve_bending<blockThreads>
328-
<<<solve_bending_lb.blocks,
329-
solve_bending_lb.num_threads,
330-
solve_bending_lb.smem_bytes_dyn>>>(rx.get_context(),
331-
*dp,
332-
*la_b,
333-
*invM,
334-
*new_x,
335-
XPBD,
336-
bending_compliance,
337-
bending_relaxation,
338-
dt0 * dt0);
339-
340-
// postSolve
362+
// update;
341363
rx.for_each_vertex(
342364
DEVICE,
343-
[dp = *dp, new_x = *new_x] __device__(VertexHandle vh) {
344-
new_x(vh, 0) += dp(vh, 0);
345-
new_x(vh, 1) += dp(vh, 1);
346-
new_x(vh, 2) += dp(vh, 2);
365+
[dt0,
366+
invM = *invM,
367+
v = *v,
368+
new_x = *new_x,
369+
x = *x] __device__(VertexHandle vh) {
370+
if (invM(vh, 0) <= 0.0) {
371+
new_x(vh, 0) = x(vh, 0);
372+
new_x(vh, 1) = x(vh, 1);
373+
new_x(vh, 2) = x(vh, 2);
374+
} else {
375+
v(vh, 0) = (new_x(vh, 0) - x(vh, 0)) / dt0;
376+
v(vh, 1) = (new_x(vh, 1) - x(vh, 1)) / dt0;
377+
v(vh, 2) = (new_x(vh, 2) - x(vh, 2)) / dt0;
378+
379+
x(vh, 0) = new_x(vh, 0);
380+
x(vh, 1) = new_x(vh, 1);
381+
x(vh, 2) = new_x(vh, 2);
382+
}
347383
});
348384
}
349385

350-
// update;
351-
rx.for_each_vertex(
352-
DEVICE,
353-
[dt0, invM = *invM, v = *v, new_x = *new_x, x = *x] __device__(
354-
VertexHandle vh) {
355-
if (invM(vh, 0) <= 0.0) {
356-
new_x(vh, 0) = x(vh, 0);
357-
new_x(vh, 1) = x(vh, 1);
358-
new_x(vh, 2) = x(vh, 2);
359-
} else {
360-
v(vh, 0) = (new_x(vh, 0) - x(vh, 0)) / dt0;
361-
v(vh, 1) = (new_x(vh, 1) - x(vh, 1)) / dt0;
362-
v(vh, 2) = (new_x(vh, 2) - x(vh, 2)) / dt0;
363-
364-
x(vh, 0) = new_x(vh, 0);
365-
x(vh, 1) = new_x(vh, 1);
366-
x(vh, 2) = new_x(vh, 2);
367-
}
368-
});
369-
}
370-
371-
timer.stop();
372-
RXMESH_INFO("Frame {}, time= {}(ms)", frame, timer.elapsed_millis());
386+
timer.stop();
387+
RXMESH_INFO(
388+
"Frame {}, time= {}(ms)", frame, timer.elapsed_millis());
373389
#if USE_POLYSCOPE
374-
x->move(DEVICE, HOST);
375-
rx.get_polyscope_mesh()->updateVertexPositions(*x);
390+
x->move(DEVICE, HOST);
391+
rx.get_polyscope_mesh()->updateVertexPositions(*x);
376392
#endif
377-
frame++;
378-
if (test) {
379-
if (frame == 99) {
380-
rx.for_each_vertex(HOST, [&](VertexHandle vh) {
381-
for (int i = 0; i < 3; ++i) {
382-
mean += (*x)(vh, i);
383-
mean2 += (*x)(vh, i) * (*x)(vh, i);
384-
}
385-
});
386-
mean /= (3.f * rx.get_num_vertices());
387-
mean2 /= (3.f * rx.get_num_vertices());
393+
frame++;
394+
if (test) {
395+
if (frame == 99) {
396+
rx.for_each_vertex(HOST, [&](VertexHandle vh) {
397+
for (int i = 0; i < 3; ++i) {
398+
mean += (*x)(vh, i);
399+
mean2 += (*x)(vh, i) * (*x)(vh, i);
400+
}
401+
});
402+
mean /= (3.f * rx.get_num_vertices());
403+
mean2 /= (3.f * rx.get_num_vertices());
404+
}
388405
}
389406
}
390407
};

0 commit comments

Comments
 (0)