23 namespace trianglemesh {
29 #if defined(__CUDACC__)
30 void NormalizeNormalsCUDA
36 const int64_t n =
normals.GetLength();
39 scalar_t* ptr =
normals.GetDataPtr<scalar_t>();
43 int64_t idx = 3 * workload_idx;
44 scalar_t x = ptr[idx];
45 scalar_t y = ptr[idx + 1];
46 scalar_t z = ptr[idx + 2];
52 scalar_t norm = sqrt(x * x + y * y + z * z);
66 #if defined(__CUDACC__)
67 void ComputeTriangleNormalsCUDA
75 const int64_t n =
normals.GetLength();
79 scalar_t* normal_ptr =
normals.GetDataPtr<scalar_t>();
80 const int64_t* triangle_ptr = triangles_d.
GetDataPtr<int64_t>();
81 const scalar_t* vertex_ptr = vertices.GetDataPtr<scalar_t>();
85 int64_t idx = 3 * workload_idx;
87 int64_t triangle_id1 = triangle_ptr[idx];
88 int64_t triangle_id2 = triangle_ptr[idx + 1];
89 int64_t triangle_id3 = triangle_ptr[idx + 2];
91 scalar_t v01[3], v02[3];
92 v01[0] = vertex_ptr[3 * triangle_id2] -
93 vertex_ptr[3 * triangle_id1];
94 v01[1] = vertex_ptr[3 * triangle_id2 + 1] -
95 vertex_ptr[3 * triangle_id1 + 1];
96 v01[2] = vertex_ptr[3 * triangle_id2 + 2] -
97 vertex_ptr[3 * triangle_id1 + 2];
98 v02[0] = vertex_ptr[3 * triangle_id3] -
99 vertex_ptr[3 * triangle_id1];
100 v02[1] = vertex_ptr[3 * triangle_id3 + 1] -
101 vertex_ptr[3 * triangle_id1 + 1];
102 v02[2] = vertex_ptr[3 * triangle_id3 + 2] -
103 vertex_ptr[3 * triangle_id1 + 2];
111 #if defined(__CUDACC__)
112 void ComputeTriangleAreasCUDA
119 const int64_t n = triangle_areas.GetLength();
120 const core::Dtype dtype = triangle_areas.GetDtype();
124 scalar_t* area_ptr = triangle_areas.GetDataPtr<scalar_t>();
125 const int64_t* triangle_ptr = triangles_d.
GetDataPtr<int64_t>();
126 const scalar_t* vertex_ptr = vertices.GetDataPtr<scalar_t>();
130 int64_t idx = 3 * workload_idx;
132 int64_t triangle_id1 = triangle_ptr[idx];
133 int64_t triangle_id2 = triangle_ptr[idx + 1];
134 int64_t triangle_id3 = triangle_ptr[idx + 2];
136 scalar_t v01[3], v02[3];
137 v01[0] = vertex_ptr[3 * triangle_id2] -
138 vertex_ptr[3 * triangle_id1];
139 v01[1] = vertex_ptr[3 * triangle_id2 + 1] -
140 vertex_ptr[3 * triangle_id1 + 1];
141 v01[2] = vertex_ptr[3 * triangle_id2 + 2] -
142 vertex_ptr[3 * triangle_id1 + 2];
143 v02[0] = vertex_ptr[3 * triangle_id3] -
144 vertex_ptr[3 * triangle_id1];
145 v02[1] = vertex_ptr[3 * triangle_id3 + 1] -
146 vertex_ptr[3 * triangle_id1 + 1];
147 v02[2] = vertex_ptr[3 * triangle_id3 + 2] -
148 vertex_ptr[3 * triangle_id1 + 2];
150 area_ptr[workload_idx] =
#define CLOUDVIEWER_DEVICE
#define DISPATCH_FLOAT_DTYPE_TO_TEMPLATE(DTYPE,...)
Tensor To(Dtype dtype, bool copy=false) const
CLOUDVIEWER_HOST_DEVICE CLOUDVIEWER_FORCE_INLINE void cross_3x1(const scalar_t *A_3x1_input, const scalar_t *B_3x1_input, scalar_t *C_3x1_output)
CLOUDVIEWER_HOST_DEVICE CLOUDVIEWER_FORCE_INLINE scalar_t cross_mag_3x1(const scalar_t *A_3x1_input, const scalar_t *B_3x1_input)
void ParallelFor(const Device &device, int64_t n, const func_t &func)
void ComputeTriangleNormalsCPU(const core::Tensor &vertices, const core::Tensor &triangles, core::Tensor &normals)
void NormalizeNormalsCPU(core::Tensor &normals)
void ComputeTriangleAreasCPU(const core::Tensor &vertices, const core::Tensor &triangles, core::Tensor &triangle_areas)
Generic file read and write utility for python interface.