def store(self, index, value): args_group = () if self.num_dims == 1: args_group = impl.make_expr_group(index.x, value.r, value.g, value.b, value.a) elif self.num_dims == 2: args_group = impl.make_expr_group(index.x, index.y, value.r, value.g, value.b, value.a) elif self.num_dims == 3: args_group = impl.make_expr_group(index.x, index.y, index.z, value.r, value.g, value.b, value.a) impl.expr_init( _ti_core.make_texture_op_expr(_ti_core.TextureOpType.kStore, self.ptr_expr, args_group))
def __init__(self, mesh: MeshInstance, element_type: MeshElementType, entry_expr: impl.Expr): self.mesh = mesh self.element_type = element_type self.entry_expr = entry_expr element_field = self.mesh.fields[self.element_type] for key, attr in element_field.field_dict.items(): global_entry_expr = impl.Expr( _ti_core.get_index_conversion( self.mesh.mesh_ptr, element_type, entry_expr, ConvType.l2r if element_field.attr_dict[key].reorder else ConvType.l2g)) # transform index space global_entry_expr_group = impl.make_expr_group( *tuple([global_entry_expr])) if isinstance(attr, MatrixField): setattr( self, key, _IntermediateMatrix(attr.n, attr.m, [ impl.Expr( _ti_core.subscript(e.ptr, global_entry_expr_group)) for e in attr.get_field_members() ])) elif isinstance(attr, StructField): raise RuntimeError('ti.Mesh has not support StructField yet') else: # isinstance(attr, Field) var = attr.get_field_members()[0].ptr setattr( self, key, impl.Expr(_ti_core.subscript(var, global_entry_expr_group))) for element_type in self.mesh._type.elements: setattr(self, element_type_name(element_type), impl.mesh_relation_access(self.mesh, self, element_type))
def func_call_rvalue(self, key, args): # Skip the template args, e.g., |self| assert impl.get_runtime().experimental_real_function non_template_args = [] for i in range(len(self.argument_annotations)): if not isinstance(self.argument_annotations[i], template): non_template_args.append(args[i]) non_template_args = impl.make_expr_group(non_template_args) return ti.Expr( _ti_core.make_func_call_expr( self.taichi_functions[key.instance_id], non_template_args))
def func_call_rvalue(self, key, args): # Skip the template args, e.g., |self| assert self.is_real_function non_template_args = [] for i, anno in enumerate(self.argument_annotations): if not isinstance(anno, template): if id(anno) in primitive_types.type_ids: non_template_args.append(ops.cast(args[i], anno)) else: non_template_args.append(args[i]) non_template_args = impl.make_expr_group(non_template_args) return Expr( _ti_core.make_func_call_expr( self.taichi_functions[key.instance_id], non_template_args))
def fetch(self, index, lod): args_group = () if self.num_dims == 1: args_group = impl.make_expr_group(index.x, lod) elif self.num_dims == 2: args_group = impl.make_expr_group(index.x, index.y, lod) elif self.num_dims == 3: args_group = impl.make_expr_group(index.x, index.y, index.z, lod) v = _ti_core.make_texture_op_expr(_ti_core.TextureOpType.fetch_texel, self.ptr_expr, args_group) r = impl.call_internal("composite_extract_0", v, with_runtime_context=False) g = impl.call_internal("composite_extract_1", v, with_runtime_context=False) b = impl.call_internal("composite_extract_2", v, with_runtime_context=False) a = impl.call_internal("composite_extract_3", v, with_runtime_context=False) return ti.Vector([r, g, b, a])
def sample_lod(self, uv, lod): args_group = () if self.num_dims == 1: args_group = (uv.x, lod) elif self.num_dims == 2: args_group = impl.make_expr_group(uv.x, uv.y, lod) elif self.num_dims == 3: args_group = impl.make_expr_group(uv.x, uv.y, uv.z, lod) v = _ti_core.make_texture_op_expr(_ti_core.TextureOpType.sample_lod, self.ptr_expr, args_group) r = impl.call_internal("composite_extract_0", v, with_runtime_context=False) g = impl.call_internal("composite_extract_1", v, with_runtime_context=False) b = impl.call_internal("composite_extract_2", v, with_runtime_context=False) a = impl.call_internal("composite_extract_3", v, with_runtime_context=False) return ti.Vector([r, g, b, a])