52#include "RNA_prototypes.hh"
121 if (
nodes.is_empty()) {
134 const float max_edge_len = 1.0f /
175 ot->name =
"Detail Flood Fill";
176 ot->idname =
"SCULPT_OT_detail_flood_fill";
177 ot->description =
"Flood fill the mesh with the selected detail setting";
200 {0,
nullptr, 0,
nullptr,
nullptr},
219 const float mval_fl[2] = {
float(mval[0]),
float(mval[1])};
226 const int active_vert = std::get<int>(ss.
active_vert());
227 const float3 active_vert_position = positions[active_vert];
228 float edge_length = 0.0f;
231 faces, corner_verts, vert_to_face_map, hide_poly, active_vert, neighbors))
233 edge_length +=
math::distance(active_vert_position, positions[neighbor]);
235 mesh.remesh_voxel_size = edge_length /
float(neighbors.
size());
265 float depth =
raycast_init(vc, mval_fl, ray_start, ray_end, ray_normal,
false);
292 const int event_xy[2],
299 if (region ==
nullptr) {
328 const int mval[2] = {
384 switch (event->
type) {
416 ot->name =
"Sample Detail Size";
417 ot->idname =
"SCULPT_OT_sample_detail_size";
418 ot->description =
"Sample the mesh detail on clicked point";
436 "Screen coordinates of sampling",
445 "Target sculpting workflow that is going to use the sampled size");
456#define DETAIL_SIZE_DELTA_SPEED 0.08f
457#define DETAIL_SIZE_DELTA_ACCURATE_SPEED 0.004f
498 const float start_co[3],
499 const float end_co[3],
503 float object_space_constant_detail;
522 object_space_constant_detail *= 0.7f;
525 const int tot_lines = int(total_len / object_space_constant_detail) + 1;
526 const float tot_lines_fl = total_len / object_space_constant_detail;
527 float spacing_disp[3];
534 mul_v3_fl(spacing_disp, total_len / tot_lines_fl);
537 for (
int i = 0;
i < tot_lines;
i++) {
540 line_length = total_len * (
float(
i) /
float(tot_lines_fl));
543 line_length = total_len * (1.0f - (
float(
i) /
float(tot_lines_fl)));
563 immVertexFormat(),
"pos", blender::gpu::VertAttrType::SFLOAT_32_32_32);
641 if (std::holds_alternative<std::monostate>(active_vert)) {
644 BMVert *active_vertex = std::get<BMVert *>(active_vert);
649 len_accum +=
len_v3v3(active_vertex->
co, neighbor->co);
651 const int num_neighbors = neighbors.
size();
653 if (num_neighbors > 0) {
654 const float avg_edge_len = len_accum / num_neighbors;
679 float detail_size_delta;
687 detail_size_delta = mval[0] - cd->
init_mval[0];
713 const char *format_string;
714 const char *property_name;
716 property_name =
"constant_detail_resolution";
717 format_string =
"%s: %0.4f";
720 property_name =
"detail_percent";
721 format_string =
"%s: %3.1f%%";
724 property_name =
"detail_size";
725 format_string =
"%s: %0.4f";
734 status.item(
IFACE_(
"Confirm"), ICON_EVENT_RETURN, ICON_MOUSE_LMB);
735 status.item(
IFACE_(
"Cancel"), ICON_EVENT_ESC, ICON_MOUSE_RMB);
869 float cursor_trans[4][4], cursor_rot[4][4];
870 const float z_axis[4] = {0.0f, 0.0f, 1.0f, 0.0f};
872 copy_m4_m4(cursor_trans, active_object.object_to_world().ptr());
875 float cursor_normal[3];
889 const float y_axis[3] = {0.0f, cd->
radius, 0.0f};
890 for (
int i = 0;
i < 3;
i++) {
902 const char *status_str =
IFACE_(
903 "Move the mouse to change the dyntopo detail size. LMB: confirm size, ESC/RMB: cancel, "
904 "SHIFT: precision mode, CTRL: sample detail size");
915 ot->name =
"Edit Dyntopo Detail Size";
916 ot->description =
"Modify the detail size of dyntopo interactively";
917 ot->idname =
"SCULPT_OT_dyntopo_detail_size_edit";
934 return 1.0f / (constant_detail *
mat4_to_scale(ob.object_to_world().ptr()));
939 return brush_radius * brush_percent / 100.0f;
943 const float brush_radius,
944 const float pixel_radius,
945 const float pixel_size)
951 const float brush_radius,
954 const float object_scale =
mat4_to_scale(ob.object_to_world().ptr());
956 return 100.0f / (constant_detail * brush_radius * object_scale);
960 const float brush_radius,
961 const float pixel_radius,
962 const float pixel_size,
965 const float object_scale =
mat4_to_scale(ob.object_to_world().ptr());
968 (1.0f / (constant_detail * object_scale));
float BKE_brush_radius_get(const Paint *paint, const Brush *brush)
bScreen * CTX_wm_screen(const bContext *C)
Depsgraph * CTX_data_ensure_evaluated_depsgraph(const bContext *C)
ScrArea * CTX_wm_area(const bContext *C)
wmWindow * CTX_wm_window(const bContext *C)
Depsgraph * CTX_data_depsgraph_pointer(const bContext *C)
Object * CTX_data_active_object(const bContext *C)
Scene * CTX_data_scene(const bContext *C)
Base * CTX_data_active_base(const bContext *C)
ToolSettings * CTX_data_tool_settings(const bContext *C)
void CTX_wm_area_set(bContext *C, ScrArea *area)
void CTX_wm_region_set(bContext *C, ARegion *region)
ARegion * CTX_wm_region(const bContext *C)
View3D * CTX_wm_view3d(const bContext *C)
bool BKE_base_is_visible(const View3D *v3d, const Base *base)
std::variant< std::monostate, int, BMVert * > ActiveVert
const Brush * BKE_paint_brush_for_read(const Paint *paint)
void BKE_sculpt_update_object_for_edit(Depsgraph *depsgraph, Object *ob_orig, bool is_paint_tool)
void BKE_sculptsession_free_pbvh(Object &object)
Brush * BKE_paint_brush(Paint *paint)
A BVH for high poly meshes.
void BKE_pbvh_node_mark_topology_update(blender::bke::pbvh::Node &node)
float BKE_pbvh_node_get_tmin(const blender::bke::pbvh::Node *node)
ARegion * BKE_area_find_region_xy(const ScrArea *area, int regiontype, const int xy[2]) ATTR_NONNULL(3)
ScrArea ScrArea * BKE_screen_find_area_xy(const bScreen *screen, int spacetype, const int xy[2]) ATTR_NONNULL(1
MINLINE float clamp_f(float value, float min, float max)
void isect_ray_tri_watertight_v3_precalc(struct IsectRayPrecalc *isect_precalc, const float ray_direction[3])
float mat4_to_scale(const float mat[4][4])
void translate_m4(float mat[4][4], float Tx, float Ty, float Tz)
void copy_m4_m4(float m1[4][4], const float m2[4][4])
void mul_m4_m4_post(float R[4][4], const float B[4][4])
void rotation_between_vecs_to_quat(float q[4], const float v1[3], const float v2[3])
void quat_to_mat4(float m[4][4], const float q[4])
MINLINE void copy_v4_v4(float r[4], const float a[4])
MINLINE float len_v3v3(const float a[3], const float b[3]) ATTR_WARN_UNUSED_RESULT
MINLINE void sub_v3_v3v3(float r[3], const float a[3], const float b[3])
MINLINE void copy_v2_v2(float r[2], const float a[2])
MINLINE void mul_v3_fl(float r[3], float f)
MINLINE void copy_v3_v3(float r[3], const float a[3])
void rotate_v2_v2fl(float r[2], const float p[2], float angle)
MINLINE void madd_v3_v3v3fl(float r[3], const float a[3], const float b[3], float f)
MINLINE void zero_v3(float r[3])
MINLINE float normalize_v3(float n[3])
#define SNPRINTF_UTF8(dst, format,...)
Platform independent time functions.
double BLI_time_now_seconds(void)
#define CLOG_DEBUG(clg_ref,...)
void DEG_id_tag_update(ID *id, unsigned int flags)
@ SCULPT_DYNTOPO_DETAIL_MANUAL
@ SCULPT_DYNTOPO_DETAIL_CONSTANT
@ SCULPT_DYNTOPO_DETAIL_BRUSH
void ED_area_status_text(ScrArea *area, const char *str)
void ED_workspace_status_text(bContext *C, const char *str)
void ED_region_tag_redraw(ARegion *region)
void * ED_region_draw_cb_activate(ARegionType *art, void(*draw)(const bContext *, ARegion *, void *), void *customdata, int type)
#define REGION_DRAW_POST_VIEW
bool ED_region_draw_cb_exit(ARegionType *art, void *handle)
ViewContext ED_view3d_viewcontext_init(bContext *C, Depsgraph *depsgraph)
#define GPU_matrix_mul(x)
@ GPU_SHADER_3D_UNIFORM_COLOR
void GPU_line_width(float width)
void GPU_line_smooth(bool enable)
void GPU_blend(GPUBlend blend)
static double angle(const Eigen::Vector3d &v1, const Eigen::Vector3d &v2)
Read Guarded memory(de)allocation.
BPy_StructRNA * depsgraph
static DBVT_INLINE btScalar size(const btDbvtVolume &a)
GAttributeReader lookup(const StringRef attribute_id) const
Span< NodeT > nodes() const
void foreach_index(Fn &&fn) const
CCL_NAMESPACE_BEGIN ccl_device float invert(const float color, const float factor)
void * MEM_callocN(size_t len, const char *str)
void MEM_freeN(void *vmemh)
pbvh::Tree * pbvh_get(Object &object)
void raycast(Tree &pbvh, FunctionRef< void(Node &node, float *tmin)> hit_fn, const float3 &ray_start, const float3 &ray_normal, bool original)
IndexMask all_leaf_nodes(const Tree &pbvh, IndexMaskMemory &memory)
Bounds< float3 > bounds_get(const Tree &pbvh)
bool bmesh_update_topology(BMesh &bm, Tree &pbvh, BMLog &bm_log, PBVHTopologyUpdateMode mode, float min_edge_len, float max_edge_len, const float3 ¢er, const std::optional< float3 > &view_normal, float radius, bool use_frontface, bool use_projected)
bool raycast_node_detail_bmesh(const BMeshNode &node, const float3 &ray_start, const IsectRayPrecalc *isect_precalc, float *depth, float *r_edge_length)
Span< float3 > vert_positions_eval(const Depsgraph &depsgraph, const Object &object_orig)
float relative_to_detail_size(const float relative_detail, const float brush_radius, const float pixel_radius, const float pixel_size)
float constant_to_detail_size(const float constant_detail, const Object &ob)
float constant_to_relative_detail(const float constant_detail, const float brush_radius, const float pixel_radius, const float pixel_size, const Object &ob)
float constant_to_brush_detail(const float constant_detail, const float brush_radius, const Object &ob)
float brush_to_detail_size(const float brush_percent, const float brush_radius)
constexpr float RELATIVE_SCALE_FACTOR
constexpr float EDGE_LENGTH_MIN_FACTOR
void SCULPT_OT_detail_flood_fill(wmOperatorType *ot)
static EnumPropertyItem prop_sculpt_sample_detail_mode_types[]
static void dyntopo_detail_size_edit_cancel(bContext *C, wmOperator *op)
static float dyntopo_detail_size_initial_value(const Sculpt *sd, const eDyntopoDetailingMode mode)
static wmOperatorStatus sculpt_sample_detail_size_exec(bContext *C, wmOperator *op)
static void dyntopo_detail_size_update_header(bContext *C, const DyntopoDetailSizeEditCustomData *cd)
static wmOperatorStatus dyntopo_detail_size_edit_modal(bContext *C, wmOperator *op, const wmEvent *event)
void SCULPT_OT_sample_detail_size(wmOperatorType *ot)
static void sample_detail_dyntopo(bContext *C, ViewContext *vc, const int mval[2])
static void dyntopo_detail_size_parallel_lines_draw(uint pos3d, DyntopoDetailSizeEditCustomData *cd, const float start_co[3], const float end_co[3], bool flip, const float angle)
static wmOperatorStatus dyntopo_detail_size_edit_invoke(bContext *C, wmOperator *op, const wmEvent *event)
static void dyntopo_detail_size_update_from_mouse_delta(DyntopoDetailSizeEditCustomData *cd, const wmEvent *event)
static void dyntopo_detail_size_sample_from_surface(Object &ob, DyntopoDetailSizeEditCustomData *cd)
static void dyntopo_detail_size_edit_draw(const bContext *, ARegion *, void *arg)
static bool sample_detail_voxel(bContext *C, ViewContext *vc, const int mval[2])
void SCULPT_OT_dyntopo_detail_size_edit(wmOperatorType *ot)
static wmOperatorStatus sculpt_sample_detail_size_modal(bContext *C, wmOperator *op, const wmEvent *event)
static void dyntopo_detail_size_bounds(DyntopoDetailSizeEditCustomData *cd)
static wmOperatorStatus sample_detail(bContext *C, const int event_xy[2], const SampleDetailModeType mode)
static void sculpt_raycast_detail_cb(bke::pbvh::BMeshNode &node, SculptDetailRaycastData &srd, float *tmin)
static wmOperatorStatus sculpt_sample_detail_size_invoke(bContext *C, wmOperator *op, const wmEvent *)
@ DETAILING_MODE_BRUSH_PERCENT
@ DETAILING_MODE_DETAIL_SIZE
@ DETAILING_MODE_RESOLUTION
static bool sculpt_and_dynamic_topology_poll(bContext *C)
static bool sculpt_and_constant_or_manual_detail_poll(bContext *C)
static wmOperatorStatus sculpt_detail_flood_fill_exec(bContext *C, wmOperator *op)
void push_end(Object &ob)
void push_node(const Depsgraph &depsgraph, const Object &object, const bke::pbvh::Node *node, const Type type)
void push_begin(const Scene &scene, Object &ob, const wmOperator *op)
void vert_random_access_ensure(Object &object)
Vector< BMVert *, 64 > BMeshNeighborVerts
float raycast_init(ViewContext *vc, const float2 &mval, float3 &r_ray_start, float3 &r_ray_end, float3 &r_ray_normal, bool original)
bool cursor_geometry_info_update(bContext *C, CursorGeometryInfo *out, const float2 &mval, const bool use_sampled_normal)
Span< BMVert * > vert_neighbors_get_bmesh(BMVert &vert, BMeshNeighborVerts &r_neighbors)
float object_space_radius_get(const ViewContext &vc, const Paint &paint, const Brush &brush, const float3 &location, const float scale_factor)
Span< int > vert_neighbors_get_mesh(const OffsetIndices< int > faces, const Span< int > corner_verts, const GroupedSpan< int > vert_to_face, const Span< bool > hide_poly, const int vert, Vector< int > &r_neighbors)
T reduce_max(const VecBase< T, Size > &a)
T distance(const T &a, const T &b)
T midpoint(const T &a, const T &b)
VecBase< float, 2 > float2
VecBase< float, 3 > float3
void RNA_int_set_array(PointerRNA *ptr, const char *name, const int *values)
void RNA_int_get_array(PointerRNA *ptr, const char *name, int *values)
PropertyRNA * RNA_struct_find_property(PointerRNA *ptr, const char *identifier)
const char * RNA_property_ui_name(const PropertyRNA *prop, const PointerRNA *ptr)
PointerRNA RNA_pointer_create_discrete(ID *id, StructRNA *type, void *data)
int RNA_enum_get(PointerRNA *ptr, const char *name)
PropertyRNA * RNA_def_int_array(StructOrFunctionRNA *cont_, const char *identifier, const int len, const int *default_value, const int hardmin, const int hardmax, const char *ui_name, const char *ui_description, const int softmin, const int softmax)
PropertyRNA * RNA_def_enum(StructOrFunctionRNA *cont_, const char *identifier, const EnumPropertyItem *items, const int default_value, const char *ui_name, const char *ui_description)
void RNA_def_property_flag(PropertyRNA *prop, PropertyFlag flag)
void SCULPT_stroke_modifiers_check(const bContext *C, Object &ob, const Brush &brush)
bool SCULPT_mode_poll(bContext *C)
#define DETAIL_SIZE_DELTA_ACCURATE_SPEED
#define DETAIL_SIZE_DELTA_SPEED
ARegionRuntimeHandle * runtime
struct SculptSession * sculpt
struct ToolSettings * toolsettings
blender::float3 cursor_normal
ActiveVert active_vert() const
blender::float3 cursor_location
std::optional< blender::float3 > cursor_sampled_normal
eDyntopoDetailingMode mode
IsectRayPrecalc isect_precalc
void WM_cursor_modal_set(wmWindow *win, int val)
void WM_cursor_modal_restore(wmWindow *win)
void WM_main_add_notifier(uint type, void *reference)
wmEventHandler_Op * WM_event_add_modal_handler(bContext *C, wmOperator *op)
void WM_event_add_notifier(const bContext *C, uint type, void *reference)