def _atomic_add(self, other): """Return the new expression of computing atomic add between self and a given operand. Args: other (Any): Given operand. Returns: :class:`~taichi.lang.expr.Expr`: The computing expression of atomic add.""" return ops.atomic_add(self, other)
def gen_normals_kernel_indexed(vertices: template(), indices: template(), normals: template(), weights: template()): num_triangles = indices.shape[0] / 3 num_vertices = vertices.shape[0] for i in range(num_vertices): normals[i] = Vector([0.0, 0.0, 0.0]) weights[i] = 0.0 for i in range(num_triangles): i_a = indices[i * 3] i_b = indices[i * 3 + 1] i_c = indices[i * 3 + 2] a = vertices[i_a] b = vertices[i_b] c = vertices[i_c] n = (a - b).cross(a - c).normalized() atomic_add(normals[i_a], n) atomic_add(normals[i_b], n) atomic_add(normals[i_c], n) atomic_add(weights[i_a], 1.0) atomic_add(weights[i_b], 1.0) atomic_add(weights[i_c], 1.0) for i in range(num_vertices): if weights[i] > 0.0: normals[i] = normals[i] / weights[i]