warp-lang 1.0.1__py3-none-macosx_10_13_universal2.whl → 1.1.0__py3-none-macosx_10_13_universal2.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of warp-lang might be problematic. Click here for more details.
- warp/__init__.py +108 -97
- warp/__init__.pyi +1 -1
- warp/bin/libwarp-clang.dylib +0 -0
- warp/bin/libwarp.dylib +0 -0
- warp/build.py +115 -113
- warp/build_dll.py +383 -375
- warp/builtins.py +3425 -3354
- warp/codegen.py +2878 -2792
- warp/config.py +40 -36
- warp/constants.py +45 -45
- warp/context.py +5194 -5102
- warp/dlpack.py +442 -442
- warp/examples/__init__.py +16 -16
- warp/examples/assets/bear.usd +0 -0
- warp/examples/assets/bunny.usd +0 -0
- warp/examples/assets/cartpole.urdf +110 -110
- warp/examples/assets/crazyflie.usd +0 -0
- warp/examples/assets/cube.usd +0 -0
- warp/examples/assets/nv_ant.xml +92 -92
- warp/examples/assets/nv_humanoid.xml +183 -183
- warp/examples/assets/quadruped.urdf +267 -267
- warp/examples/assets/rocks.nvdb +0 -0
- warp/examples/assets/rocks.usd +0 -0
- warp/examples/assets/sphere.usd +0 -0
- warp/examples/benchmarks/benchmark_api.py +383 -383
- warp/examples/benchmarks/benchmark_cloth.py +278 -279
- warp/examples/benchmarks/benchmark_cloth_cupy.py +88 -88
- warp/examples/benchmarks/benchmark_cloth_jax.py +97 -100
- warp/examples/benchmarks/benchmark_cloth_numba.py +146 -142
- warp/examples/benchmarks/benchmark_cloth_numpy.py +77 -77
- warp/examples/benchmarks/benchmark_cloth_pytorch.py +86 -86
- warp/examples/benchmarks/benchmark_cloth_taichi.py +112 -112
- warp/examples/benchmarks/benchmark_cloth_warp.py +146 -146
- warp/examples/benchmarks/benchmark_launches.py +295 -295
- warp/examples/browse.py +29 -28
- warp/examples/core/example_dem.py +234 -221
- warp/examples/core/example_fluid.py +293 -267
- warp/examples/core/example_graph_capture.py +144 -129
- warp/examples/core/example_marching_cubes.py +188 -176
- warp/examples/core/example_mesh.py +174 -154
- warp/examples/core/example_mesh_intersect.py +205 -193
- warp/examples/core/example_nvdb.py +176 -169
- warp/examples/core/example_raycast.py +105 -89
- warp/examples/core/example_raymarch.py +199 -178
- warp/examples/core/example_render_opengl.py +185 -141
- warp/examples/core/example_sph.py +405 -389
- warp/examples/core/example_torch.py +222 -181
- warp/examples/core/example_wave.py +263 -249
- warp/examples/fem/bsr_utils.py +378 -380
- warp/examples/fem/example_apic_fluid.py +407 -391
- warp/examples/fem/example_convection_diffusion.py +182 -168
- warp/examples/fem/example_convection_diffusion_dg.py +219 -209
- warp/examples/fem/example_convection_diffusion_dg0.py +204 -194
- warp/examples/fem/example_deformed_geometry.py +177 -159
- warp/examples/fem/example_diffusion.py +201 -173
- warp/examples/fem/example_diffusion_3d.py +177 -152
- warp/examples/fem/example_diffusion_mgpu.py +221 -214
- warp/examples/fem/example_mixed_elasticity.py +244 -222
- warp/examples/fem/example_navier_stokes.py +259 -243
- warp/examples/fem/example_stokes.py +220 -192
- warp/examples/fem/example_stokes_transfer.py +265 -249
- warp/examples/fem/mesh_utils.py +133 -109
- warp/examples/fem/plot_utils.py +292 -287
- warp/examples/optim/example_bounce.py +260 -248
- warp/examples/optim/example_cloth_throw.py +222 -210
- warp/examples/optim/example_diffray.py +566 -535
- warp/examples/optim/example_drone.py +864 -835
- warp/examples/optim/example_inverse_kinematics.py +176 -169
- warp/examples/optim/example_inverse_kinematics_torch.py +185 -170
- warp/examples/optim/example_spring_cage.py +239 -234
- warp/examples/optim/example_trajectory.py +223 -201
- warp/examples/optim/example_walker.py +306 -292
- warp/examples/sim/example_cartpole.py +139 -128
- warp/examples/sim/example_cloth.py +196 -184
- warp/examples/sim/example_granular.py +124 -113
- warp/examples/sim/example_granular_collision_sdf.py +197 -185
- warp/examples/sim/example_jacobian_ik.py +236 -213
- warp/examples/sim/example_particle_chain.py +118 -106
- warp/examples/sim/example_quadruped.py +193 -179
- warp/examples/sim/example_rigid_chain.py +197 -189
- warp/examples/sim/example_rigid_contact.py +189 -176
- warp/examples/sim/example_rigid_force.py +127 -126
- warp/examples/sim/example_rigid_gyroscopic.py +109 -97
- warp/examples/sim/example_rigid_soft_contact.py +134 -124
- warp/examples/sim/example_soft_body.py +190 -178
- warp/fabric.py +337 -335
- warp/fem/__init__.py +60 -27
- warp/fem/cache.py +401 -388
- warp/fem/dirichlet.py +178 -179
- warp/fem/domain.py +262 -263
- warp/fem/field/__init__.py +100 -101
- warp/fem/field/field.py +148 -149
- warp/fem/field/nodal_field.py +298 -299
- warp/fem/field/restriction.py +22 -21
- warp/fem/field/test.py +180 -181
- warp/fem/field/trial.py +183 -183
- warp/fem/geometry/__init__.py +15 -19
- warp/fem/geometry/closest_point.py +69 -70
- warp/fem/geometry/deformed_geometry.py +270 -271
- warp/fem/geometry/element.py +744 -744
- warp/fem/geometry/geometry.py +184 -186
- warp/fem/geometry/grid_2d.py +380 -373
- warp/fem/geometry/grid_3d.py +441 -435
- warp/fem/geometry/hexmesh.py +953 -953
- warp/fem/geometry/partition.py +374 -376
- warp/fem/geometry/quadmesh_2d.py +532 -532
- warp/fem/geometry/tetmesh.py +840 -840
- warp/fem/geometry/trimesh_2d.py +577 -577
- warp/fem/integrate.py +1630 -1615
- warp/fem/operator.py +190 -191
- warp/fem/polynomial.py +214 -213
- warp/fem/quadrature/__init__.py +2 -2
- warp/fem/quadrature/pic_quadrature.py +243 -245
- warp/fem/quadrature/quadrature.py +295 -294
- warp/fem/space/__init__.py +294 -292
- warp/fem/space/basis_space.py +488 -489
- warp/fem/space/collocated_function_space.py +100 -105
- warp/fem/space/dof_mapper.py +236 -236
- warp/fem/space/function_space.py +148 -145
- warp/fem/space/grid_2d_function_space.py +267 -267
- warp/fem/space/grid_3d_function_space.py +305 -306
- warp/fem/space/hexmesh_function_space.py +350 -352
- warp/fem/space/partition.py +350 -350
- warp/fem/space/quadmesh_2d_function_space.py +368 -369
- warp/fem/space/restriction.py +158 -160
- warp/fem/space/shape/__init__.py +13 -15
- warp/fem/space/shape/cube_shape_function.py +738 -738
- warp/fem/space/shape/shape_function.py +102 -103
- warp/fem/space/shape/square_shape_function.py +611 -611
- warp/fem/space/shape/tet_shape_function.py +565 -567
- warp/fem/space/shape/triangle_shape_function.py +429 -429
- warp/fem/space/tetmesh_function_space.py +294 -292
- warp/fem/space/topology.py +297 -295
- warp/fem/space/trimesh_2d_function_space.py +223 -221
- warp/fem/types.py +77 -77
- warp/fem/utils.py +495 -495
- warp/jax.py +166 -141
- warp/jax_experimental.py +341 -339
- warp/native/array.h +1072 -1025
- warp/native/builtin.h +1560 -1560
- warp/native/bvh.cpp +398 -398
- warp/native/bvh.cu +525 -525
- warp/native/bvh.h +429 -429
- warp/native/clang/clang.cpp +495 -464
- warp/native/crt.cpp +31 -31
- warp/native/crt.h +334 -334
- warp/native/cuda_crt.h +1049 -1049
- warp/native/cuda_util.cpp +549 -540
- warp/native/cuda_util.h +288 -203
- warp/native/cutlass_gemm.cpp +34 -34
- warp/native/cutlass_gemm.cu +372 -372
- warp/native/error.cpp +66 -66
- warp/native/error.h +27 -27
- warp/native/fabric.h +228 -228
- warp/native/hashgrid.cpp +301 -278
- warp/native/hashgrid.cu +78 -77
- warp/native/hashgrid.h +227 -227
- warp/native/initializer_array.h +32 -32
- warp/native/intersect.h +1204 -1204
- warp/native/intersect_adj.h +365 -365
- warp/native/intersect_tri.h +322 -322
- warp/native/marching.cpp +2 -2
- warp/native/marching.cu +497 -497
- warp/native/marching.h +2 -2
- warp/native/mat.h +1498 -1498
- warp/native/matnn.h +333 -333
- warp/native/mesh.cpp +203 -203
- warp/native/mesh.cu +293 -293
- warp/native/mesh.h +1887 -1887
- warp/native/nanovdb/NanoVDB.h +4782 -4782
- warp/native/nanovdb/PNanoVDB.h +2553 -2553
- warp/native/nanovdb/PNanoVDBWrite.h +294 -294
- warp/native/noise.h +850 -850
- warp/native/quat.h +1084 -1084
- warp/native/rand.h +299 -299
- warp/native/range.h +108 -108
- warp/native/reduce.cpp +156 -156
- warp/native/reduce.cu +348 -348
- warp/native/runlength_encode.cpp +61 -61
- warp/native/runlength_encode.cu +46 -46
- warp/native/scan.cpp +30 -30
- warp/native/scan.cu +36 -36
- warp/native/scan.h +7 -7
- warp/native/solid_angle.h +442 -442
- warp/native/sort.cpp +94 -94
- warp/native/sort.cu +97 -97
- warp/native/sort.h +14 -14
- warp/native/sparse.cpp +337 -337
- warp/native/sparse.cu +544 -544
- warp/native/spatial.h +630 -630
- warp/native/svd.h +562 -562
- warp/native/temp_buffer.h +30 -30
- warp/native/vec.h +1132 -1132
- warp/native/volume.cpp +297 -297
- warp/native/volume.cu +32 -32
- warp/native/volume.h +538 -538
- warp/native/volume_builder.cu +425 -425
- warp/native/volume_builder.h +19 -19
- warp/native/warp.cpp +1057 -1052
- warp/native/warp.cu +2943 -2828
- warp/native/warp.h +313 -305
- warp/optim/__init__.py +9 -9
- warp/optim/adam.py +120 -120
- warp/optim/linear.py +1104 -939
- warp/optim/sgd.py +104 -92
- warp/render/__init__.py +10 -10
- warp/render/render_opengl.py +3217 -3204
- warp/render/render_usd.py +768 -749
- warp/render/utils.py +152 -150
- warp/sim/__init__.py +52 -59
- warp/sim/articulation.py +685 -685
- warp/sim/collide.py +1594 -1590
- warp/sim/import_mjcf.py +489 -481
- warp/sim/import_snu.py +220 -221
- warp/sim/import_urdf.py +536 -516
- warp/sim/import_usd.py +887 -881
- warp/sim/inertia.py +316 -317
- warp/sim/integrator.py +234 -233
- warp/sim/integrator_euler.py +1956 -1956
- warp/sim/integrator_featherstone.py +1910 -1991
- warp/sim/integrator_xpbd.py +3294 -3312
- warp/sim/model.py +4473 -4314
- warp/sim/particles.py +113 -112
- warp/sim/render.py +417 -403
- warp/sim/utils.py +413 -410
- warp/sparse.py +1227 -1227
- warp/stubs.py +2109 -2469
- warp/tape.py +1162 -225
- warp/tests/__init__.py +1 -1
- warp/tests/__main__.py +4 -4
- warp/tests/assets/torus.usda +105 -105
- warp/tests/aux_test_class_kernel.py +26 -26
- warp/tests/aux_test_compile_consts_dummy.py +10 -10
- warp/tests/aux_test_conditional_unequal_types_kernels.py +21 -21
- warp/tests/aux_test_dependent.py +22 -22
- warp/tests/aux_test_grad_customs.py +23 -23
- warp/tests/aux_test_reference.py +11 -11
- warp/tests/aux_test_reference_reference.py +10 -10
- warp/tests/aux_test_square.py +17 -17
- warp/tests/aux_test_unresolved_func.py +14 -14
- warp/tests/aux_test_unresolved_symbol.py +14 -14
- warp/tests/disabled_kinematics.py +239 -239
- warp/tests/run_coverage_serial.py +31 -31
- warp/tests/test_adam.py +157 -157
- warp/tests/test_arithmetic.py +1124 -1124
- warp/tests/test_array.py +2417 -2326
- warp/tests/test_array_reduce.py +150 -150
- warp/tests/test_async.py +668 -656
- warp/tests/test_atomic.py +141 -141
- warp/tests/test_bool.py +204 -149
- warp/tests/test_builtins_resolution.py +1292 -1292
- warp/tests/test_bvh.py +164 -171
- warp/tests/test_closest_point_edge_edge.py +228 -228
- warp/tests/test_codegen.py +566 -553
- warp/tests/test_compile_consts.py +97 -101
- warp/tests/test_conditional.py +246 -246
- warp/tests/test_copy.py +232 -215
- warp/tests/test_ctypes.py +632 -632
- warp/tests/test_dense.py +67 -67
- warp/tests/test_devices.py +91 -98
- warp/tests/test_dlpack.py +530 -529
- warp/tests/test_examples.py +400 -378
- warp/tests/test_fabricarray.py +955 -955
- warp/tests/test_fast_math.py +62 -54
- warp/tests/test_fem.py +1277 -1278
- warp/tests/test_fp16.py +130 -130
- warp/tests/test_func.py +338 -337
- warp/tests/test_generics.py +571 -571
- warp/tests/test_grad.py +746 -640
- warp/tests/test_grad_customs.py +333 -336
- warp/tests/test_hash_grid.py +210 -164
- warp/tests/test_import.py +39 -39
- warp/tests/test_indexedarray.py +1134 -1134
- warp/tests/test_intersect.py +67 -67
- warp/tests/test_jax.py +307 -307
- warp/tests/test_large.py +167 -164
- warp/tests/test_launch.py +354 -354
- warp/tests/test_lerp.py +261 -261
- warp/tests/test_linear_solvers.py +191 -171
- warp/tests/test_lvalue.py +421 -493
- warp/tests/test_marching_cubes.py +65 -65
- warp/tests/test_mat.py +1801 -1827
- warp/tests/test_mat_lite.py +115 -115
- warp/tests/test_mat_scalar_ops.py +2907 -2889
- warp/tests/test_math.py +126 -193
- warp/tests/test_matmul.py +500 -499
- warp/tests/test_matmul_lite.py +410 -410
- warp/tests/test_mempool.py +188 -190
- warp/tests/test_mesh.py +284 -324
- warp/tests/test_mesh_query_aabb.py +228 -241
- warp/tests/test_mesh_query_point.py +692 -702
- warp/tests/test_mesh_query_ray.py +292 -303
- warp/tests/test_mlp.py +276 -276
- warp/tests/test_model.py +110 -110
- warp/tests/test_modules_lite.py +39 -39
- warp/tests/test_multigpu.py +163 -163
- warp/tests/test_noise.py +248 -248
- warp/tests/test_operators.py +250 -250
- warp/tests/test_options.py +123 -125
- warp/tests/test_peer.py +133 -137
- warp/tests/test_pinned.py +78 -78
- warp/tests/test_print.py +54 -54
- warp/tests/test_quat.py +2086 -2086
- warp/tests/test_rand.py +288 -288
- warp/tests/test_reload.py +217 -217
- warp/tests/test_rounding.py +179 -179
- warp/tests/test_runlength_encode.py +190 -190
- warp/tests/test_sim_grad.py +243 -0
- warp/tests/test_sim_kinematics.py +91 -97
- warp/tests/test_smoothstep.py +168 -168
- warp/tests/test_snippet.py +305 -266
- warp/tests/test_sparse.py +468 -460
- warp/tests/test_spatial.py +2148 -2148
- warp/tests/test_streams.py +486 -473
- warp/tests/test_struct.py +710 -675
- warp/tests/test_tape.py +173 -148
- warp/tests/test_torch.py +743 -743
- warp/tests/test_transient_module.py +87 -87
- warp/tests/test_types.py +556 -659
- warp/tests/test_utils.py +490 -499
- warp/tests/test_vec.py +1264 -1268
- warp/tests/test_vec_lite.py +73 -73
- warp/tests/test_vec_scalar_ops.py +2099 -2099
- warp/tests/test_verify_fp.py +94 -94
- warp/tests/test_volume.py +737 -736
- warp/tests/test_volume_write.py +255 -265
- warp/tests/unittest_serial.py +37 -37
- warp/tests/unittest_suites.py +363 -359
- warp/tests/unittest_utils.py +603 -578
- warp/tests/unused_test_misc.py +71 -71
- warp/tests/walkthrough_debug.py +85 -85
- warp/thirdparty/appdirs.py +598 -598
- warp/thirdparty/dlpack.py +143 -143
- warp/thirdparty/unittest_parallel.py +566 -561
- warp/torch.py +321 -295
- warp/types.py +4504 -4450
- warp/utils.py +1008 -821
- {warp_lang-1.0.1.dist-info → warp_lang-1.1.0.dist-info}/LICENSE.md +126 -126
- {warp_lang-1.0.1.dist-info → warp_lang-1.1.0.dist-info}/METADATA +338 -400
- warp_lang-1.1.0.dist-info/RECORD +352 -0
- warp/examples/assets/cube.usda +0 -42
- warp/examples/assets/sphere.usda +0 -56
- warp/examples/assets/torus.usda +0 -105
- warp_lang-1.0.1.dist-info/RECORD +0 -352
- {warp_lang-1.0.1.dist-info → warp_lang-1.1.0.dist-info}/WHEEL +0 -0
- {warp_lang-1.0.1.dist-info → warp_lang-1.1.0.dist-info}/top_level.txt +0 -0
warp/native/mesh.cu
CHANGED
|
@@ -1,293 +1,293 @@
|
|
|
1
|
-
/** Copyright (c) 2022 NVIDIA CORPORATION. All rights reserved.
|
|
2
|
-
* NVIDIA CORPORATION and its licensors retain all intellectual property
|
|
3
|
-
* and proprietary rights in and to this software, related documentation
|
|
4
|
-
* and any modifications thereto. Any use, reproduction, disclosure or
|
|
5
|
-
* distribution of this software and related documentation without an express
|
|
6
|
-
* license agreement from NVIDIA CORPORATION is strictly prohibited.
|
|
7
|
-
*/
|
|
8
|
-
|
|
9
|
-
#include "warp.h"
|
|
10
|
-
#include "cuda_util.h"
|
|
11
|
-
#include "mesh.h"
|
|
12
|
-
#include "bvh.h"
|
|
13
|
-
#include "scan.h"
|
|
14
|
-
|
|
15
|
-
namespace wp
|
|
16
|
-
{
|
|
17
|
-
|
|
18
|
-
__global__ void compute_triangle_bounds(int n, const vec3* points, const int* indices, vec3* lowers, vec3* uppers)
|
|
19
|
-
{
|
|
20
|
-
const int tid = blockIdx.x*blockDim.x + threadIdx.x;
|
|
21
|
-
|
|
22
|
-
if (tid < n)
|
|
23
|
-
{
|
|
24
|
-
// if leaf then update bounds
|
|
25
|
-
int i = indices[tid*3+0];
|
|
26
|
-
int j = indices[tid*3+1];
|
|
27
|
-
int k = indices[tid*3+2];
|
|
28
|
-
|
|
29
|
-
vec3 p = points[i];
|
|
30
|
-
vec3 q = points[j];
|
|
31
|
-
vec3 r = points[k];
|
|
32
|
-
|
|
33
|
-
vec3 lower = min(min(p, q), r);
|
|
34
|
-
vec3 upper = max(max(p, q), r);
|
|
35
|
-
|
|
36
|
-
lowers[tid] = lower;
|
|
37
|
-
uppers[tid] = upper;
|
|
38
|
-
}
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
__global__ void compute_mesh_edge_lengths(int n, const vec3* points, const int* indices, float* edge_lengths)
|
|
42
|
-
{
|
|
43
|
-
const int tid = blockIdx.x*blockDim.x + threadIdx.x;
|
|
44
|
-
|
|
45
|
-
if (tid < n)
|
|
46
|
-
{
|
|
47
|
-
// if leaf then update bounds
|
|
48
|
-
int i = indices[tid*3+0];
|
|
49
|
-
int j = indices[tid*3+1];
|
|
50
|
-
int k = indices[tid*3+2];
|
|
51
|
-
|
|
52
|
-
vec3 p = points[i];
|
|
53
|
-
vec3 q = points[j];
|
|
54
|
-
vec3 r = points[k];
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
edge_lengths[tid] = length(p-q) + length(p-r) + length(q-r);
|
|
58
|
-
}
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
__global__ void compute_average_mesh_edge_length(int n, float* sum_edge_lengths, Mesh* m)
|
|
62
|
-
{
|
|
63
|
-
m->average_edge_length = sum_edge_lengths[n - 1] / (3*n);
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
__global__ void bvh_refit_with_solid_angle_kernel(int n, const int* __restrict__ parents, int* __restrict__ child_count, BVHPackedNodeHalf* __restrict__ lowers, BVHPackedNodeHalf* __restrict__ uppers, const vec3* points, const int* indices, SolidAngleProps* solid_angle_props)
|
|
67
|
-
{
|
|
68
|
-
int index = blockDim.x*blockIdx.x + threadIdx.x;
|
|
69
|
-
|
|
70
|
-
if (index < n)
|
|
71
|
-
{
|
|
72
|
-
bool leaf = lowers[index].b;
|
|
73
|
-
|
|
74
|
-
if (leaf)
|
|
75
|
-
{
|
|
76
|
-
// update the leaf node
|
|
77
|
-
const int leaf_index = lowers[index].i;
|
|
78
|
-
precompute_triangle_solid_angle_props(points[indices[leaf_index*3+0]], points[indices[leaf_index*3+1]], points[indices[leaf_index*3+2]], solid_angle_props[index]);
|
|
79
|
-
|
|
80
|
-
make_node(lowers+index, solid_angle_props[index].box.lower, leaf_index, true);
|
|
81
|
-
make_node(uppers+index, solid_angle_props[index].box.upper, 0, false);
|
|
82
|
-
}
|
|
83
|
-
else
|
|
84
|
-
{
|
|
85
|
-
// only keep leaf threads
|
|
86
|
-
return;
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
// update hierarchy
|
|
90
|
-
for (;;)
|
|
91
|
-
{
|
|
92
|
-
int parent = parents[index];
|
|
93
|
-
|
|
94
|
-
// reached root
|
|
95
|
-
if (parent == -1)
|
|
96
|
-
return;
|
|
97
|
-
|
|
98
|
-
// ensure all writes are visible
|
|
99
|
-
__threadfence();
|
|
100
|
-
|
|
101
|
-
int finished = atomicAdd(&child_count[parent], 1);
|
|
102
|
-
|
|
103
|
-
// if we have are the last thread (such that the parent node is now complete)
|
|
104
|
-
// then update its bounds and move onto the the next parent in the hierarchy
|
|
105
|
-
if (finished == 1)
|
|
106
|
-
{
|
|
107
|
-
//printf("Compute non-leaf at %d\n", index);
|
|
108
|
-
const int left_child = lowers[parent].i;
|
|
109
|
-
const int right_child = uppers[parent].i;
|
|
110
|
-
|
|
111
|
-
vec3 left_lower = vec3(lowers[left_child].x,
|
|
112
|
-
lowers[left_child].y,
|
|
113
|
-
lowers[left_child].z);
|
|
114
|
-
|
|
115
|
-
vec3 left_upper = vec3(uppers[left_child].x,
|
|
116
|
-
uppers[left_child].y,
|
|
117
|
-
uppers[left_child].z);
|
|
118
|
-
|
|
119
|
-
vec3 right_lower = vec3(lowers[right_child].x,
|
|
120
|
-
lowers[right_child].y,
|
|
121
|
-
lowers[right_child].z);
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
vec3 right_upper = vec3(uppers[right_child].x,
|
|
125
|
-
uppers[right_child].y,
|
|
126
|
-
uppers[right_child].z);
|
|
127
|
-
|
|
128
|
-
// union of child bounds
|
|
129
|
-
vec3 lower = min(left_lower, right_lower);
|
|
130
|
-
vec3 upper = max(left_upper, right_upper);
|
|
131
|
-
|
|
132
|
-
// write new BVH nodes
|
|
133
|
-
make_node(lowers+parent, lower, left_child, false);
|
|
134
|
-
make_node(uppers+parent, upper, right_child, false);
|
|
135
|
-
|
|
136
|
-
// combine
|
|
137
|
-
SolidAngleProps* left_child_data = &solid_angle_props[left_child];
|
|
138
|
-
SolidAngleProps* right_child_data = (left_child != right_child) ? &solid_angle_props[right_child] : NULL;
|
|
139
|
-
|
|
140
|
-
combine_precomputed_solid_angle_props(solid_angle_props[parent], left_child_data, right_child_data);
|
|
141
|
-
|
|
142
|
-
// move onto processing the parent
|
|
143
|
-
index = parent;
|
|
144
|
-
}
|
|
145
|
-
else
|
|
146
|
-
{
|
|
147
|
-
// parent not ready (we are the first child), terminate thread
|
|
148
|
-
break;
|
|
149
|
-
}
|
|
150
|
-
}
|
|
151
|
-
}
|
|
152
|
-
}
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
void bvh_refit_with_solid_angle_device(BVH& bvh, Mesh& mesh)
|
|
156
|
-
{
|
|
157
|
-
ContextGuard guard(bvh.context);
|
|
158
|
-
|
|
159
|
-
// clear child counters
|
|
160
|
-
memset_device(WP_CURRENT_CONTEXT, bvh.node_counts, 0, sizeof(int)*bvh.max_nodes);
|
|
161
|
-
|
|
162
|
-
wp_launch_device(WP_CURRENT_CONTEXT, bvh_refit_with_solid_angle_kernel, bvh.num_items, (bvh.num_items, bvh.node_parents, bvh.node_counts, bvh.node_lowers, bvh.node_uppers, mesh.points, mesh.indices, mesh.solid_angle_props));
|
|
163
|
-
}
|
|
164
|
-
|
|
165
|
-
} // namespace wp
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
uint64_t mesh_create_device(void* context, wp::array_t<wp::vec3> points, wp::array_t<wp::vec3> velocities, wp::array_t<int> indices, int num_points, int num_tris, int support_winding_number)
|
|
169
|
-
{
|
|
170
|
-
ContextGuard guard(context);
|
|
171
|
-
|
|
172
|
-
wp::Mesh mesh(points, velocities, indices, num_points, num_tris);
|
|
173
|
-
|
|
174
|
-
mesh.context = context ? context : cuda_context_get_current();
|
|
175
|
-
|
|
176
|
-
{
|
|
177
|
-
// // todo: BVH creation only on CPU at the moment so temporarily bring all the data back to host
|
|
178
|
-
// vec3* points_host = (vec3*)alloc_host(sizeof(vec3)*num_points);
|
|
179
|
-
// int* indices_host = (int*)alloc_host(sizeof(int)*num_tris*3);
|
|
180
|
-
// bounds3* bounds_host = (bounds3*)alloc_host(sizeof(bounds3)*num_tris);
|
|
181
|
-
|
|
182
|
-
// memcpy_d2h(WP_CURRENT_CONTEXT, points_host, points, sizeof(vec3)*num_points);
|
|
183
|
-
// memcpy_d2h(WP_CURRENT_CONTEXT, indices_host, indices, sizeof(int)*num_tris*3);
|
|
184
|
-
// cuda_context_synchronize(WP_CURRENT_CONTEXT);
|
|
185
|
-
|
|
186
|
-
// float sum = 0.0;
|
|
187
|
-
// for (int i=0; i < num_tris; ++i)
|
|
188
|
-
// {
|
|
189
|
-
// bounds_host[i] = bounds3();
|
|
190
|
-
// wp::vec3 p0 = points_host[indices_host[i*3+0]];
|
|
191
|
-
// wp::vec3 p1 = points_host[indices_host[i*3+1]];
|
|
192
|
-
// wp::vec3 p2 = points_host[indices_host[i*3+2]];
|
|
193
|
-
// bounds_host[i].add_point(p0);
|
|
194
|
-
// bounds_host[i].add_point(p1);
|
|
195
|
-
// bounds_host[i].add_point(p2);
|
|
196
|
-
// sum += length(p0-p1) + length(p0-p2) + length(p2-p1);
|
|
197
|
-
// }
|
|
198
|
-
// mesh.average_edge_length = sum / (num_tris*3);
|
|
199
|
-
|
|
200
|
-
// BVH bvh_host = bvh_create(bounds_host, num_tris);
|
|
201
|
-
// BVH bvh_device = bvh_clone(WP_CURRENT_CONTEXT, bvh_host);
|
|
202
|
-
|
|
203
|
-
// bvh_destroy_host(bvh_host);
|
|
204
|
-
|
|
205
|
-
// create lower upper arrays expected by GPU BVH builder
|
|
206
|
-
mesh.lowers = (wp::vec3*)alloc_device(WP_CURRENT_CONTEXT, sizeof(wp::vec3)*num_tris);
|
|
207
|
-
mesh.uppers = (wp::vec3*)alloc_device(WP_CURRENT_CONTEXT, sizeof(wp::vec3)*num_tris);
|
|
208
|
-
|
|
209
|
-
wp_launch_device(WP_CURRENT_CONTEXT, wp::compute_triangle_bounds, num_tris, (num_tris, points.data, indices.data, mesh.lowers, mesh.uppers));
|
|
210
|
-
|
|
211
|
-
uint64_t bvh_id = bvh_create_device(mesh.context, mesh.lowers, mesh.uppers, num_tris);
|
|
212
|
-
wp::bvh_get_descriptor(bvh_id, mesh.bvh);
|
|
213
|
-
|
|
214
|
-
if (support_winding_number)
|
|
215
|
-
{
|
|
216
|
-
int num_bvh_nodes = 2*num_tris;
|
|
217
|
-
mesh.solid_angle_props = (wp::SolidAngleProps*)alloc_device(WP_CURRENT_CONTEXT, sizeof(wp::SolidAngleProps)*num_bvh_nodes);
|
|
218
|
-
}
|
|
219
|
-
}
|
|
220
|
-
|
|
221
|
-
wp::Mesh* mesh_device = (wp::Mesh*)alloc_device(WP_CURRENT_CONTEXT, sizeof(wp::Mesh));
|
|
222
|
-
memcpy_h2d(WP_CURRENT_CONTEXT, mesh_device, &mesh, sizeof(wp::Mesh));
|
|
223
|
-
|
|
224
|
-
// save descriptor
|
|
225
|
-
uint64_t mesh_id = (uint64_t)mesh_device;
|
|
226
|
-
mesh_add_descriptor(mesh_id, mesh);
|
|
227
|
-
|
|
228
|
-
if (support_winding_number)
|
|
229
|
-
mesh_refit_device(mesh_id);
|
|
230
|
-
|
|
231
|
-
return mesh_id;
|
|
232
|
-
}
|
|
233
|
-
|
|
234
|
-
void mesh_destroy_device(uint64_t id)
|
|
235
|
-
{
|
|
236
|
-
wp::Mesh mesh;
|
|
237
|
-
if (wp::mesh_get_descriptor(id, mesh))
|
|
238
|
-
{
|
|
239
|
-
ContextGuard guard(mesh.context);
|
|
240
|
-
|
|
241
|
-
wp::bvh_destroy_device(mesh.bvh);
|
|
242
|
-
|
|
243
|
-
free_device(WP_CURRENT_CONTEXT, mesh.lowers);
|
|
244
|
-
free_device(WP_CURRENT_CONTEXT, mesh.uppers);
|
|
245
|
-
free_device(WP_CURRENT_CONTEXT, (wp::Mesh*)id);
|
|
246
|
-
|
|
247
|
-
if (mesh.solid_angle_props) {
|
|
248
|
-
free_device(WP_CURRENT_CONTEXT, mesh.solid_angle_props);
|
|
249
|
-
}
|
|
250
|
-
wp::mesh_rem_descriptor(id);
|
|
251
|
-
}
|
|
252
|
-
}
|
|
253
|
-
|
|
254
|
-
void mesh_update_stats(uint64_t id)
|
|
255
|
-
{
|
|
256
|
-
|
|
257
|
-
}
|
|
258
|
-
|
|
259
|
-
void mesh_refit_device(uint64_t id)
|
|
260
|
-
{
|
|
261
|
-
// recompute triangle bounds
|
|
262
|
-
wp::Mesh m;
|
|
263
|
-
if (mesh_get_descriptor(id, m))
|
|
264
|
-
{
|
|
265
|
-
ContextGuard guard(m.context);
|
|
266
|
-
|
|
267
|
-
wp_launch_device(WP_CURRENT_CONTEXT, wp::compute_triangle_bounds, m.num_tris, (m.num_tris, m.points, m.indices, m.lowers, m.uppers));
|
|
268
|
-
|
|
269
|
-
if (m.solid_angle_props)
|
|
270
|
-
{
|
|
271
|
-
// we compute mesh the average edge length
|
|
272
|
-
// for use in mesh_query_point_sign_normal()
|
|
273
|
-
// since it relies on an epsilon for welding
|
|
274
|
-
|
|
275
|
-
// reuse bounds memory temporarily for computing edge lengths
|
|
276
|
-
float* length_tmp_ptr = (float*)m.lowers;
|
|
277
|
-
wp_launch_device(WP_CURRENT_CONTEXT, wp::compute_mesh_edge_lengths, m.num_tris, (m.num_tris, m.points, m.indices, length_tmp_ptr));
|
|
278
|
-
|
|
279
|
-
scan_device(length_tmp_ptr, length_tmp_ptr, m.num_tris, true);
|
|
280
|
-
|
|
281
|
-
wp_launch_device(WP_CURRENT_CONTEXT, wp::compute_average_mesh_edge_length, 1, (m.num_tris, length_tmp_ptr, (wp::Mesh*)id));
|
|
282
|
-
wp_launch_device(WP_CURRENT_CONTEXT, wp::compute_triangle_bounds, m.num_tris, (m.num_tris, m.points, m.indices, m.lowers, m.uppers));
|
|
283
|
-
|
|
284
|
-
// update solid angle data
|
|
285
|
-
bvh_refit_with_solid_angle_device(m.bvh, m);
|
|
286
|
-
}
|
|
287
|
-
else
|
|
288
|
-
{
|
|
289
|
-
bvh_refit_device(m.bvh);
|
|
290
|
-
}
|
|
291
|
-
}
|
|
292
|
-
}
|
|
293
|
-
|
|
1
|
+
/** Copyright (c) 2022 NVIDIA CORPORATION. All rights reserved.
|
|
2
|
+
* NVIDIA CORPORATION and its licensors retain all intellectual property
|
|
3
|
+
* and proprietary rights in and to this software, related documentation
|
|
4
|
+
* and any modifications thereto. Any use, reproduction, disclosure or
|
|
5
|
+
* distribution of this software and related documentation without an express
|
|
6
|
+
* license agreement from NVIDIA CORPORATION is strictly prohibited.
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
#include "warp.h"
|
|
10
|
+
#include "cuda_util.h"
|
|
11
|
+
#include "mesh.h"
|
|
12
|
+
#include "bvh.h"
|
|
13
|
+
#include "scan.h"
|
|
14
|
+
|
|
15
|
+
namespace wp
|
|
16
|
+
{
|
|
17
|
+
|
|
18
|
+
__global__ void compute_triangle_bounds(int n, const vec3* points, const int* indices, vec3* lowers, vec3* uppers)
|
|
19
|
+
{
|
|
20
|
+
const int tid = blockIdx.x*blockDim.x + threadIdx.x;
|
|
21
|
+
|
|
22
|
+
if (tid < n)
|
|
23
|
+
{
|
|
24
|
+
// if leaf then update bounds
|
|
25
|
+
int i = indices[tid*3+0];
|
|
26
|
+
int j = indices[tid*3+1];
|
|
27
|
+
int k = indices[tid*3+2];
|
|
28
|
+
|
|
29
|
+
vec3 p = points[i];
|
|
30
|
+
vec3 q = points[j];
|
|
31
|
+
vec3 r = points[k];
|
|
32
|
+
|
|
33
|
+
vec3 lower = min(min(p, q), r);
|
|
34
|
+
vec3 upper = max(max(p, q), r);
|
|
35
|
+
|
|
36
|
+
lowers[tid] = lower;
|
|
37
|
+
uppers[tid] = upper;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
__global__ void compute_mesh_edge_lengths(int n, const vec3* points, const int* indices, float* edge_lengths)
|
|
42
|
+
{
|
|
43
|
+
const int tid = blockIdx.x*blockDim.x + threadIdx.x;
|
|
44
|
+
|
|
45
|
+
if (tid < n)
|
|
46
|
+
{
|
|
47
|
+
// if leaf then update bounds
|
|
48
|
+
int i = indices[tid*3+0];
|
|
49
|
+
int j = indices[tid*3+1];
|
|
50
|
+
int k = indices[tid*3+2];
|
|
51
|
+
|
|
52
|
+
vec3 p = points[i];
|
|
53
|
+
vec3 q = points[j];
|
|
54
|
+
vec3 r = points[k];
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
edge_lengths[tid] = length(p-q) + length(p-r) + length(q-r);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
__global__ void compute_average_mesh_edge_length(int n, float* sum_edge_lengths, Mesh* m)
|
|
62
|
+
{
|
|
63
|
+
m->average_edge_length = sum_edge_lengths[n - 1] / (3*n);
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
__global__ void bvh_refit_with_solid_angle_kernel(int n, const int* __restrict__ parents, int* __restrict__ child_count, BVHPackedNodeHalf* __restrict__ lowers, BVHPackedNodeHalf* __restrict__ uppers, const vec3* points, const int* indices, SolidAngleProps* solid_angle_props)
|
|
67
|
+
{
|
|
68
|
+
int index = blockDim.x*blockIdx.x + threadIdx.x;
|
|
69
|
+
|
|
70
|
+
if (index < n)
|
|
71
|
+
{
|
|
72
|
+
bool leaf = lowers[index].b;
|
|
73
|
+
|
|
74
|
+
if (leaf)
|
|
75
|
+
{
|
|
76
|
+
// update the leaf node
|
|
77
|
+
const int leaf_index = lowers[index].i;
|
|
78
|
+
precompute_triangle_solid_angle_props(points[indices[leaf_index*3+0]], points[indices[leaf_index*3+1]], points[indices[leaf_index*3+2]], solid_angle_props[index]);
|
|
79
|
+
|
|
80
|
+
make_node(lowers+index, solid_angle_props[index].box.lower, leaf_index, true);
|
|
81
|
+
make_node(uppers+index, solid_angle_props[index].box.upper, 0, false);
|
|
82
|
+
}
|
|
83
|
+
else
|
|
84
|
+
{
|
|
85
|
+
// only keep leaf threads
|
|
86
|
+
return;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
// update hierarchy
|
|
90
|
+
for (;;)
|
|
91
|
+
{
|
|
92
|
+
int parent = parents[index];
|
|
93
|
+
|
|
94
|
+
// reached root
|
|
95
|
+
if (parent == -1)
|
|
96
|
+
return;
|
|
97
|
+
|
|
98
|
+
// ensure all writes are visible
|
|
99
|
+
__threadfence();
|
|
100
|
+
|
|
101
|
+
int finished = atomicAdd(&child_count[parent], 1);
|
|
102
|
+
|
|
103
|
+
// if we have are the last thread (such that the parent node is now complete)
|
|
104
|
+
// then update its bounds and move onto the the next parent in the hierarchy
|
|
105
|
+
if (finished == 1)
|
|
106
|
+
{
|
|
107
|
+
//printf("Compute non-leaf at %d\n", index);
|
|
108
|
+
const int left_child = lowers[parent].i;
|
|
109
|
+
const int right_child = uppers[parent].i;
|
|
110
|
+
|
|
111
|
+
vec3 left_lower = vec3(lowers[left_child].x,
|
|
112
|
+
lowers[left_child].y,
|
|
113
|
+
lowers[left_child].z);
|
|
114
|
+
|
|
115
|
+
vec3 left_upper = vec3(uppers[left_child].x,
|
|
116
|
+
uppers[left_child].y,
|
|
117
|
+
uppers[left_child].z);
|
|
118
|
+
|
|
119
|
+
vec3 right_lower = vec3(lowers[right_child].x,
|
|
120
|
+
lowers[right_child].y,
|
|
121
|
+
lowers[right_child].z);
|
|
122
|
+
|
|
123
|
+
|
|
124
|
+
vec3 right_upper = vec3(uppers[right_child].x,
|
|
125
|
+
uppers[right_child].y,
|
|
126
|
+
uppers[right_child].z);
|
|
127
|
+
|
|
128
|
+
// union of child bounds
|
|
129
|
+
vec3 lower = min(left_lower, right_lower);
|
|
130
|
+
vec3 upper = max(left_upper, right_upper);
|
|
131
|
+
|
|
132
|
+
// write new BVH nodes
|
|
133
|
+
make_node(lowers+parent, lower, left_child, false);
|
|
134
|
+
make_node(uppers+parent, upper, right_child, false);
|
|
135
|
+
|
|
136
|
+
// combine
|
|
137
|
+
SolidAngleProps* left_child_data = &solid_angle_props[left_child];
|
|
138
|
+
SolidAngleProps* right_child_data = (left_child != right_child) ? &solid_angle_props[right_child] : NULL;
|
|
139
|
+
|
|
140
|
+
combine_precomputed_solid_angle_props(solid_angle_props[parent], left_child_data, right_child_data);
|
|
141
|
+
|
|
142
|
+
// move onto processing the parent
|
|
143
|
+
index = parent;
|
|
144
|
+
}
|
|
145
|
+
else
|
|
146
|
+
{
|
|
147
|
+
// parent not ready (we are the first child), terminate thread
|
|
148
|
+
break;
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
|
|
155
|
+
void bvh_refit_with_solid_angle_device(BVH& bvh, Mesh& mesh)
|
|
156
|
+
{
|
|
157
|
+
ContextGuard guard(bvh.context);
|
|
158
|
+
|
|
159
|
+
// clear child counters
|
|
160
|
+
memset_device(WP_CURRENT_CONTEXT, bvh.node_counts, 0, sizeof(int)*bvh.max_nodes);
|
|
161
|
+
|
|
162
|
+
wp_launch_device(WP_CURRENT_CONTEXT, bvh_refit_with_solid_angle_kernel, bvh.num_items, (bvh.num_items, bvh.node_parents, bvh.node_counts, bvh.node_lowers, bvh.node_uppers, mesh.points, mesh.indices, mesh.solid_angle_props));
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
} // namespace wp
|
|
166
|
+
|
|
167
|
+
|
|
168
|
+
uint64_t mesh_create_device(void* context, wp::array_t<wp::vec3> points, wp::array_t<wp::vec3> velocities, wp::array_t<int> indices, int num_points, int num_tris, int support_winding_number)
|
|
169
|
+
{
|
|
170
|
+
ContextGuard guard(context);
|
|
171
|
+
|
|
172
|
+
wp::Mesh mesh(points, velocities, indices, num_points, num_tris);
|
|
173
|
+
|
|
174
|
+
mesh.context = context ? context : cuda_context_get_current();
|
|
175
|
+
|
|
176
|
+
{
|
|
177
|
+
// // todo: BVH creation only on CPU at the moment so temporarily bring all the data back to host
|
|
178
|
+
// vec3* points_host = (vec3*)alloc_host(sizeof(vec3)*num_points);
|
|
179
|
+
// int* indices_host = (int*)alloc_host(sizeof(int)*num_tris*3);
|
|
180
|
+
// bounds3* bounds_host = (bounds3*)alloc_host(sizeof(bounds3)*num_tris);
|
|
181
|
+
|
|
182
|
+
// memcpy_d2h(WP_CURRENT_CONTEXT, points_host, points, sizeof(vec3)*num_points);
|
|
183
|
+
// memcpy_d2h(WP_CURRENT_CONTEXT, indices_host, indices, sizeof(int)*num_tris*3);
|
|
184
|
+
// cuda_context_synchronize(WP_CURRENT_CONTEXT);
|
|
185
|
+
|
|
186
|
+
// float sum = 0.0;
|
|
187
|
+
// for (int i=0; i < num_tris; ++i)
|
|
188
|
+
// {
|
|
189
|
+
// bounds_host[i] = bounds3();
|
|
190
|
+
// wp::vec3 p0 = points_host[indices_host[i*3+0]];
|
|
191
|
+
// wp::vec3 p1 = points_host[indices_host[i*3+1]];
|
|
192
|
+
// wp::vec3 p2 = points_host[indices_host[i*3+2]];
|
|
193
|
+
// bounds_host[i].add_point(p0);
|
|
194
|
+
// bounds_host[i].add_point(p1);
|
|
195
|
+
// bounds_host[i].add_point(p2);
|
|
196
|
+
// sum += length(p0-p1) + length(p0-p2) + length(p2-p1);
|
|
197
|
+
// }
|
|
198
|
+
// mesh.average_edge_length = sum / (num_tris*3);
|
|
199
|
+
|
|
200
|
+
// BVH bvh_host = bvh_create(bounds_host, num_tris);
|
|
201
|
+
// BVH bvh_device = bvh_clone(WP_CURRENT_CONTEXT, bvh_host);
|
|
202
|
+
|
|
203
|
+
// bvh_destroy_host(bvh_host);
|
|
204
|
+
|
|
205
|
+
// create lower upper arrays expected by GPU BVH builder
|
|
206
|
+
mesh.lowers = (wp::vec3*)alloc_device(WP_CURRENT_CONTEXT, sizeof(wp::vec3)*num_tris);
|
|
207
|
+
mesh.uppers = (wp::vec3*)alloc_device(WP_CURRENT_CONTEXT, sizeof(wp::vec3)*num_tris);
|
|
208
|
+
|
|
209
|
+
wp_launch_device(WP_CURRENT_CONTEXT, wp::compute_triangle_bounds, num_tris, (num_tris, points.data, indices.data, mesh.lowers, mesh.uppers));
|
|
210
|
+
|
|
211
|
+
uint64_t bvh_id = bvh_create_device(mesh.context, mesh.lowers, mesh.uppers, num_tris);
|
|
212
|
+
wp::bvh_get_descriptor(bvh_id, mesh.bvh);
|
|
213
|
+
|
|
214
|
+
if (support_winding_number)
|
|
215
|
+
{
|
|
216
|
+
int num_bvh_nodes = 2*num_tris;
|
|
217
|
+
mesh.solid_angle_props = (wp::SolidAngleProps*)alloc_device(WP_CURRENT_CONTEXT, sizeof(wp::SolidAngleProps)*num_bvh_nodes);
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
wp::Mesh* mesh_device = (wp::Mesh*)alloc_device(WP_CURRENT_CONTEXT, sizeof(wp::Mesh));
|
|
222
|
+
memcpy_h2d(WP_CURRENT_CONTEXT, mesh_device, &mesh, sizeof(wp::Mesh));
|
|
223
|
+
|
|
224
|
+
// save descriptor
|
|
225
|
+
uint64_t mesh_id = (uint64_t)mesh_device;
|
|
226
|
+
mesh_add_descriptor(mesh_id, mesh);
|
|
227
|
+
|
|
228
|
+
if (support_winding_number)
|
|
229
|
+
mesh_refit_device(mesh_id);
|
|
230
|
+
|
|
231
|
+
return mesh_id;
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
void mesh_destroy_device(uint64_t id)
|
|
235
|
+
{
|
|
236
|
+
wp::Mesh mesh;
|
|
237
|
+
if (wp::mesh_get_descriptor(id, mesh))
|
|
238
|
+
{
|
|
239
|
+
ContextGuard guard(mesh.context);
|
|
240
|
+
|
|
241
|
+
wp::bvh_destroy_device(mesh.bvh);
|
|
242
|
+
|
|
243
|
+
free_device(WP_CURRENT_CONTEXT, mesh.lowers);
|
|
244
|
+
free_device(WP_CURRENT_CONTEXT, mesh.uppers);
|
|
245
|
+
free_device(WP_CURRENT_CONTEXT, (wp::Mesh*)id);
|
|
246
|
+
|
|
247
|
+
if (mesh.solid_angle_props) {
|
|
248
|
+
free_device(WP_CURRENT_CONTEXT, mesh.solid_angle_props);
|
|
249
|
+
}
|
|
250
|
+
wp::mesh_rem_descriptor(id);
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
void mesh_update_stats(uint64_t id)
|
|
255
|
+
{
|
|
256
|
+
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
void mesh_refit_device(uint64_t id)
|
|
260
|
+
{
|
|
261
|
+
// recompute triangle bounds
|
|
262
|
+
wp::Mesh m;
|
|
263
|
+
if (mesh_get_descriptor(id, m))
|
|
264
|
+
{
|
|
265
|
+
ContextGuard guard(m.context);
|
|
266
|
+
|
|
267
|
+
wp_launch_device(WP_CURRENT_CONTEXT, wp::compute_triangle_bounds, m.num_tris, (m.num_tris, m.points, m.indices, m.lowers, m.uppers));
|
|
268
|
+
|
|
269
|
+
if (m.solid_angle_props)
|
|
270
|
+
{
|
|
271
|
+
// we compute mesh the average edge length
|
|
272
|
+
// for use in mesh_query_point_sign_normal()
|
|
273
|
+
// since it relies on an epsilon for welding
|
|
274
|
+
|
|
275
|
+
// reuse bounds memory temporarily for computing edge lengths
|
|
276
|
+
float* length_tmp_ptr = (float*)m.lowers;
|
|
277
|
+
wp_launch_device(WP_CURRENT_CONTEXT, wp::compute_mesh_edge_lengths, m.num_tris, (m.num_tris, m.points, m.indices, length_tmp_ptr));
|
|
278
|
+
|
|
279
|
+
scan_device(length_tmp_ptr, length_tmp_ptr, m.num_tris, true);
|
|
280
|
+
|
|
281
|
+
wp_launch_device(WP_CURRENT_CONTEXT, wp::compute_average_mesh_edge_length, 1, (m.num_tris, length_tmp_ptr, (wp::Mesh*)id));
|
|
282
|
+
wp_launch_device(WP_CURRENT_CONTEXT, wp::compute_triangle_bounds, m.num_tris, (m.num_tris, m.points, m.indices, m.lowers, m.uppers));
|
|
283
|
+
|
|
284
|
+
// update solid angle data
|
|
285
|
+
bvh_refit_with_solid_angle_device(m.bvh, m);
|
|
286
|
+
}
|
|
287
|
+
else
|
|
288
|
+
{
|
|
289
|
+
bvh_refit_device(m.bvh);
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
|