Commit: e0c8d0913b96922844912d6c07aba099b42edd79 Author: Jacques Lucke Date: Wed Apr 13 09:27:54 2022 +0200 Branches: master https://developer.blender.org/rBe0c8d0913b96922844912d6c07aba099b42edd79
Curves: remove Test1 brush This was one of multiple placeholder brushes to simplify development. Having it is not necessary anymore. It was a brush that could add new curves according to a specific density. This functionality will be brought back as a new brush later. Ref T97255. =================================================================== M source/blender/editors/sculpt_paint/curves_sculpt_ops.cc M source/blender/makesdna/DNA_brush_enums.h M source/blender/makesrna/intern/rna_brush.c =================================================================== diff --git a/source/blender/editors/sculpt_paint/curves_sculpt_ops.cc b/source/blender/editors/sculpt_paint/curves_sculpt_ops.cc index dcfda658bbd..992ac77803a 100644 --- a/source/blender/editors/sculpt_paint/curves_sculpt_ops.cc +++ b/source/blender/editors/sculpt_paint/curves_sculpt_ops.cc @@ -74,431 +74,6 @@ using blender::bke::CurvesGeometry; /** \name * SCULPT_CURVES_OT_brush_stroke * \{ */ -class DensityAddOperation : public CurvesSculptStrokeOperation { - private: - /** Contains the root points of the curves that existed before this operation started. */ - KDTree_3d *old_kdtree_ = nullptr; - /** Number of points in the kdtree above. */ - int old_kdtree_size_ = 0; - - /** - * Indicates that the corresponding curve has already been created and can't be changed by this - * operation anymore. - */ - static constexpr int ExistsAlreadyIndex = INT32_MAX; - - struct NewPointsData { - Vector<float3> bary_coords; - Vector<int> looptri_indices; - Vector<float3> positions; - Vector<float3> normals; - }; - - public: - ~DensityAddOperation() override - { - if (old_kdtree_ != nullptr) { - BLI_kdtree_3d_free(old_kdtree_); - } - } - - void on_stroke_extended(bContext *C, const StrokeExtension &stroke_extension) override - { - Depsgraph &depsgraph = *CTX_data_depsgraph_pointer(C); - Scene &scene = *CTX_data_scene(C); - Object &object = *CTX_data_active_object(C); - ARegion *region = CTX_wm_region(C); - View3D *v3d = CTX_wm_view3d(C); - - Curves &curves_id = *static_cast<Curves *>(object.data); - CurvesGeometry &curves = CurvesGeometry::wrap(curves_id.geometry); - - if (curves_id.surface == nullptr || curves_id.surface->type != OB_MESH) { - return; - } - - const Object &surface_ob = *curves_id.surface; - const Mesh &surface = *static_cast<const Mesh *>(surface_ob.data); - const float4x4 surface_ob_mat = surface_ob.obmat; - const float4x4 surface_ob_imat = surface_ob_mat.inverted(); - - ToolSettings &tool_settings = *scene.toolsettings; - CurvesSculpt &curves_sculpt = *tool_settings.curves_sculpt; - Brush &brush = *BKE_paint_brush(&curves_sculpt.paint); - const float brush_radius_screen = BKE_brush_size_get(&scene, &brush); - const float strength = BKE_brush_alpha_get(&scene, &brush); - const float minimum_distance = curves_sculpt.distance; - - /* This is the main ray that is used to determine the brush position in 3D space. */ - float3 ray_start, ray_end; - ED_view3d_win_to_segment_clipped( - &depsgraph, region, v3d, stroke_extension.mouse_position, ray_start, ray_end, true); - ray_start = surface_ob_imat * ray_start; - ray_end = surface_ob_imat * ray_end; - const float3 ray_direction = math::normalize(ray_end - ray_start); - - /* This ray is used to determine the brush radius in 3d space. */ - float3 offset_ray_start, offset_ray_end; - ED_view3d_win_to_segment_clipped(&depsgraph, - region, - v3d, - stroke_extension.mouse_position + - float2(0, brush_radius_screen), - offset_ray_start, - offset_ray_end, - true); - offset_ray_start = surface_ob_imat * offset_ray_start; - offset_ray_end = surface_ob_imat * offset_ray_end; - - float4x4 ob_imat; - invert_m4_m4(ob_imat.values, object.obmat); - - const float4x4 transform = ob_imat * surface_ob_mat; - - BVHTreeFromMesh bvhtree; - BKE_bvhtree_from_mesh_get(&bvhtree, &surface, BVHTREE_FROM_LOOPTRI, 2); - - /* Do a raycast against the surface object to find the brush position. */ - BVHTreeRayHit ray_hit; - ray_hit.dist = FLT_MAX; - ray_hit.index = -1; - BLI_bvhtree_ray_cast(bvhtree.tree, - ray_start, - ray_direction, - 0.0f, - &ray_hit, - bvhtree.raycast_callback, - &bvhtree); - - if (ray_hit.index == -1) { - /* The ray did not hit the surface. */ - free_bvhtree_from_mesh(&bvhtree); - return; - } - /* Brush position in the space of the surface object. */ - const float3 brush_pos_3d_surface = ray_hit.co; - const float brush_radius_3d_surface = dist_to_line_v3( - brush_pos_3d_surface, offset_ray_start, offset_ray_end); - - /* Brush position in the space of the curves object. */ - const float3 brush_pos_3d_curves = transform * brush_pos_3d_surface; - const float brush_radius_3d_curves = dist_to_line_v3( - brush_pos_3d_curves, transform * offset_ray_start, transform * offset_ray_end); - - Vector<int> looptri_indices = this->find_looptri_indices_to_consider( - bvhtree, brush_pos_3d_surface, brush_radius_3d_surface); - - free_bvhtree_from_mesh(&bvhtree); - - if (old_kdtree_ == nullptr && minimum_distance > 0.0f) { - old_kdtree_ = this->kdtree_from_curve_roots_and_positions(curves, curves.curves_range(), {}); - old_kdtree_size_ = curves.curves_num(); - } - - float density; - if (minimum_distance > 0.0f) { - /* Estimate the sampling density based on the target minimum distance. */ - density = strength * pow2f(1.0f / minimum_distance); - } - else { - /* Sample a somewhat constant amount of points based on the strength. */ - const float brush_circle_area_3d = M_PI * pow2f(brush_radius_3d_curves); - density = strength * 100.0f / brush_circle_area_3d; - } - - NewPointsData new_points = this->sample_new_points(density, - minimum_distance, - brush_radius_3d_curves, - brush_pos_3d_curves, - looptri_indices, - transform, - surface); - if (minimum_distance > 0.0f) { - this->eliminate_too_close_points(new_points, curves, minimum_distance); - } - this->insert_new_curves(new_points, curves); - - DEG_id_tag_update(&curves_id.id, ID_RECALC_GEOMETRY); - ED_region_tag_redraw(region); - } - - private: - Vector<int> find_looptri_indices_to_consider(BVHTreeFromMesh &bvhtree, - const float3 &brush_pos, - const float brush_radius_3d) - { - Vector<int> looptri_indices; - - struct RangeQueryUserData { - Vector<int> &indices; - } range_query_user_data = {looptri_indices}; - - BLI_bvhtree_range_query( - bvhtree.tree, - brush_pos, - brush_radius_3d, - [](void *userdata, int index, const float co[3], float dist_sq) { - UNUSED_VARS(co, dist_sq); - RangeQueryUserData &data = *static_cast<RangeQueryUserData *>(userdata); - data.indices.append(index); - }, - &range_query_user_data); - - return looptri_indices; - } - - KDTree_3d *kdtree_from_curve_roots_and_positions(const CurvesGeometry &curves, - const IndexRange curves_range, - Span<float3> extra_positions) - { - const int tot_points = curves_range.size() + extra_positions.size(); - KDTree_3d *kdtree = BLI_kdtree_3d_new(tot_points); - for (const int curve_i : curves_range) { - const int first_point_i = curves.offsets()[curve_i]; - const float3 root_position = curves.positions()[first_point_i]; - BLI_kdtree_3d_insert(kdtree, ExistsAlreadyIndex, root_position); - } - for (const int i : extra_positions.index_range()) { - BLI_kdtree_3d_insert(kdtree, i, extra_positions[i]); - } - BLI_kdtree_3d_balance(kdtree); - return kdtree; - } - - bool is_too_close_to_existing_point(const float3 position, const float minimum_distance) const - { - if (old_kdtree_ == nullptr) { - return false; - } - KDTreeNearest_3d nearest; - nearest.index = -1; - BLI_kdtree_3d_find_nearest(old_kdtree_, position, &nearest); - if (nearest.index >= 0 && nearest.dist < minimum_distance) { - return true; - } - return false; - } - - NewPointsData sample_new_points(const float density, - const float minimum_distance, - const float brush_radius_3d, - const float3 &brush_pos, - const Span<int> looptri_indices, - const float4x4 &transform, - const Mesh &surface) - { - const float brush_radius_3d_sq = brush_radius_3d * brush_radius_3d; - const float area_threshold = M_PI * brush_radius_3d_sq; - - const Span<MLoopTri> looptris{BKE_mesh_runtime_looptri_ensure(&surface), - BKE_mesh_runtime_looptri_len(&surface)}; - - threading::EnumerableThreadSpecific<NewPointsData> new_points_per_thread; - - const double time = PIL_check_seconds_timer(); - const uint64_t time_as_int = *reinterpret_cast<const uint64_t *>(&time); - const uint32_t rng_base_seed = time_as_int ^ (time_as_int >> 32); - - RandomNumberGenerator rng{rng_base_seed}; - - threading::parallel_for(looptri_indices.index_range(), 512, [&](const IndexRange range) { - RandomNumberGenerator looptri_rng{rng_base_seed + (uint32_t)range.start()}; - - for (const int looptri_index : looptri_indices.slice(range)) { - const MLoopTri &looptri = looptris[looptri_index]; - const float3 &v0 = transform * float3(surface.mvert[surface.mloop[looptri.tri[0]].v].co); - const float3 &v1 = transform * float3(surface.mvert[surface.mloop[looptri.tri[1]].v].co); - const float3 &v2 = transform * float3(surface.mvert[surface.mloop[looptri.tri[2]].v].co); - const float looptri_area = area_tri_v3(v0, v1, v2); - - float3 normal; @@ Diff output truncated at 10240 characters. @@ _______________________________________________ Bf-blender-cvs mailing list Bf-blender-cvs@blender.org List details, subscription details or unsubscribe: https://lists.blender.org/mailman/listinfo/bf-blender-cvs