def add_points_as_object_with_particle_system( points, reconstruction_collection, mesh_type="CUBE", point_extent=0.01, add_particle_color_emission=True, particle_overwrite_color=None, op=None, ): """Add a point cloud as particle system.""" log_report("INFO", "Adding Points as Particle System: ...", op) stop_watch = StopWatch() # The particle systems in Blender do not work for large particle numbers # (see https://developer.blender.org/T81103). Thus, we represent large # point clouds with multiple smaller particle systems. max_number_particles = 10000 particle_system_collection = add_collection("Particle System", reconstruction_collection) point_cloud_obj_list = [] for i in range(0, len(points), max_number_particles): particle_obj_name = f"Particle Shape {i}" particle_material_name = f"Point Cloud Material {i}" point_cloud_obj_name = f"Particle Point Cloud {i}" points_subset = points[i:i + max_number_particles] coords, colors = Point.split_points(points_subset, normalize_colors=True) particle_obj = _add_particle_obj( colors, particle_obj_name, particle_material_name, particle_overwrite_color, add_particle_color_emission, mesh_type, point_extent, particle_system_collection, ) point_cloud_obj = _add_particle_system_obj( coords, particle_obj, point_cloud_obj_name, particle_system_collection, ) point_cloud_obj_list.append(point_cloud_obj) bpy.context.view_layer.update() log_report("INFO", "Duration: " + str(stop_watch.get_elapsed_time()), op) log_report("INFO", "Adding Points as Particle System: Done", op) return point_cloud_obj_list
def draw_points( points, add_points_to_point_cloud_handle, reconstruction_collection=None, object_anchor_handle_name="OpenGL Point Cloud", op=None, ): """Draw points using OpenGL.""" log_report("INFO", "Add particle draw handlers", op) coords, colors = Point.split_points(points, normalize_colors=True) object_anchor_handle = _draw_coords_with_color( coords, colors, add_points_to_point_cloud_handle, reconstruction_collection, object_anchor_handle_name, op=op, ) return object_anchor_handle
def draw_points( op, points, add_points_to_point_cloud_handle, reconstruction_collection=None, object_anchor_handle_name="OpenGL Point Cloud", ): log_report("INFO", "Add particle draw handlers", op) coords, colors = Point.split_points(points) object_anchor_handle = draw_coords_with_color( op, coords, colors, add_points_to_point_cloud_handle, reconstruction_collection, object_anchor_handle_name, ) return object_anchor_handle
def add_points_as_mesh_vertices( points, reconstruction_collection, add_color_as_custom_property=True, op=None, ): """Add a point cloud as mesh.""" log_report("INFO", "Adding Points as Mesh: ...", op) stop_watch = StopWatch() point_cloud_obj_name = "Mesh Point Cloud" point_cloud_mesh = bpy.data.meshes.new(point_cloud_obj_name) point_cloud_mesh.update() point_cloud_mesh.validate() coords, colors = Point.split_points(points, normalize_colors=False) point_cloud_mesh.from_pydata(coords, [], []) point_cloud_obj = add_obj(point_cloud_mesh, point_cloud_obj_name, reconstruction_collection) if add_color_as_custom_property: point_cloud_obj["colors"] = colors log_report("INFO", "Duration: " + str(stop_watch.get_elapsed_time()), op) log_report("INFO", "Adding Points as Mesh: Done", op) return point_cloud_obj