|
4 | 4 | #include "rxmesh/query.cuh" |
5 | 5 | #include "rxmesh/rxmesh_static.h" |
6 | 6 |
|
| 7 | +#include "imgui.h" |
| 8 | +#include "polyscope/polyscope.h" |
| 9 | + |
| 10 | + |
7 | 11 | using namespace rxmesh; |
8 | 12 |
|
9 | 13 | template <uint32_t blockThreads> |
@@ -100,7 +104,7 @@ void __global__ solve_bending(const Context context, |
100 | 104 | const float bending_compliance, |
101 | 105 | const float bending_relaxation, |
102 | 106 | const float dt2) |
103 | | -{ |
| 107 | +{ |
104 | 108 | auto solve = [&](const EdgeHandle& eh, const VertexIterator& iter) { |
105 | 109 | // iter[0] and iter[2] are the edge two vertices |
106 | 110 | // iter[1] and iter[3] are the two opposite vertices |
@@ -272,119 +276,132 @@ int main(int argc, char** argv) |
272 | 276 | float mean(0.f); |
273 | 277 | float mean2(0.f); |
274 | 278 |
|
| 279 | + |
275 | 280 | // solve |
| 281 | + bool started = false; |
| 282 | + |
276 | 283 | 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 | + }); |
301 | 311 |
|
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 | + } |
306 | 361 |
|
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; |
341 | 363 | rx.for_each_vertex( |
342 | 364 | 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 | + } |
347 | 383 | }); |
348 | 384 | } |
349 | 385 |
|
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()); |
373 | 389 | #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); |
376 | 392 | #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 | + } |
388 | 405 | } |
389 | 406 | } |
390 | 407 | }; |
|
0 commit comments