50#include "RNA_prototypes.hh"
118 if (nodes.is_empty()) {
131 const float max_edge_len = 1.0f /
172 ot->
name =
"Detail Flood Fill";
173 ot->
idname =
"SCULPT_OT_detail_flood_fill";
174 ot->
description =
"Flood fill the mesh with the selected detail setting";
197 {0,
nullptr, 0,
nullptr,
nullptr},
208 const Span<int> corner_verts = mesh.corner_verts();
216 const float mval_fl[2] = {
float(mval[0]),
float(mval[1])};
223 const int active_vert = std::get<int>(ss.
active_vert());
224 const float3 active_vert_position = positions[active_vert];
225 float edge_length = 0.0f;
228 faces, corner_verts, vert_to_face_map, hide_poly, active_vert, neighbors))
230 edge_length +=
math::distance(active_vert_position, positions[neighbor]);
232 mesh.remesh_voxel_size = edge_length /
float(neighbors.
size());
258 const float mval_fl[2] = {
float(mval[0]),
float(mval[1])};
259 float ray_start[3], ray_end[3], ray_normal[3];
292 if (region ==
nullptr) {
321 const int mval[2] = {
322 event_xy[0] - region->winrct.xmin,
323 event_xy[1] - region->winrct.ymin,
373 switch (event->
type) {
402 ot->
name =
"Sample Detail Size";
403 ot->
idname =
"SCULPT_OT_sample_detail_size";
422 "Screen coordinates of sampling",
431 "Target sculpting workflow that is going to use the sampled size");
442#define DETAIL_SIZE_DELTA_SPEED 0.08f
443#define DETAIL_SIZE_DELTA_ACCURATE_SPEED 0.004f
484 const float start_co[3],
485 const float end_co[3],
489 float object_space_constant_detail;
508 object_space_constant_detail *= 0.7f;
511 const int tot_lines =
int(total_len / object_space_constant_detail) + 1;
512 const float tot_lines_fl = total_len / object_space_constant_detail;
513 float spacing_disp[3];
519 mul_v3_fl(spacing_disp, total_len / tot_lines_fl);
522 for (
int i = 0; i < tot_lines; i++) {
525 line_length = total_len * (
float(i) /
float(tot_lines_fl));
528 line_length = total_len * (1.0f - (
float(i) /
float(tot_lines_fl)));
628 len_accum +=
len_v3v3(active_vertex->
co, neighbor->co);
630 const int num_neighbors = neighbors.
size();
632 if (num_neighbors > 0) {
633 const float avg_edge_len = len_accum / num_neighbors;
635 const float detail_size = 0.7f / (avg_edge_len *
639 sampled_value = detail_size;
658 float detail_size_delta;
666 detail_size_delta = mval[0] - cd->
init_mval[0];
688 Sculpt *sd = scene->toolsettings->sculpt;
692 const char *format_string;
693 const char *property_name;
695 property_name =
"constant_detail_resolution";
696 format_string =
"%s: %0.4f";
699 property_name =
"detail_percent";
700 format_string =
"%s: %3.1f%%";
703 property_name =
"detail_size";
704 format_string =
"%s: %0.4f";
713 status.
item(
IFACE_(
"Confirm"), ICON_EVENT_RETURN, ICON_MOUSE_LMB);
714 status.
item(
IFACE_(
"Cancel"), ICON_EVENT_ESC, ICON_MOUSE_RMB);
715 status.
item(
IFACE_(
"Change Size"), ICON_MOUSE_MOVE);
847 float cursor_trans[4][4], cursor_rot[4][4];
848 const float z_axis[4] = {0.0f, 0.0f, 1.0f, 0.0f};
850 copy_m4_m4(cursor_trans, active_object.object_to_world().ptr());
853 float cursor_normal[3];
867 const float y_axis[3] = {0.0f, cd->
radius, 0.0f};
868 for (
int i = 0; i < 3; i++) {
880 const char *status_str =
IFACE_(
881 "Move the mouse to change the dyntopo detail size. LMB: confirm size, ESC/RMB: cancel, "
882 "SHIFT: precision mode, CTRL: sample detail size");
893 ot->
name =
"Edit Dyntopo Detail Size";
894 ot->
description =
"Modify the detail size of dyntopo interactively";
895 ot->
idname =
"SCULPT_OT_dyntopo_detail_size_edit";
912 return 1.0f / (constant_detail *
mat4_to_scale(ob.object_to_world().ptr()));
917 return brush_radius * brush_percent / 100.0f;
921 const float brush_radius,
922 const float pixel_radius,
923 const float pixel_size)
929 const float brush_radius,
932 const float object_scale =
mat4_to_scale(ob.object_to_world().ptr());
934 return 100.0f / (constant_detail * brush_radius * object_scale);
938 const float brush_radius,
939 const float pixel_radius,
940 const float pixel_size,
943 const float object_scale =
mat4_to_scale(ob.object_to_world().ptr());
946 (1.0f / (constant_detail * object_scale));
int BKE_brush_size_get(const Scene *scene, 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)
General operations, lookup, etc. for blender objects.
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])
MINLINE bool is_zero_v3(const float v[3]) ATTR_WARN_UNUSED_RESULT
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(dst, format,...)
Platform independent time functions.
double BLI_time_now_seconds(void)
#define CLOG_INFO(clg_ref, level,...)
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_blend(eGPUBlend blend)
void GPU_line_width(float width)
void GPU_line_smooth(bool enable)
Read Guarded memory(de)allocation.
void item_bool(std::string text, bool inverted, int icon1, int icon2=0)
void item(std::string text, int icon1, int icon2=0)
Span< NodeT > nodes() const
void foreach_index(Fn &&fn) const
const Depsgraph * depsgraph
draw_view in_light_buf[] float
draw_view push_constant(Type::INT, "radiance_src") .push_constant(Type capture_info_buf storage_buf(1, Qualifier::READ, "ObjectBounds", "bounds_buf[]") .push_constant(Type draw_view int
CCL_NAMESPACE_BEGIN ccl_device float invert(float color, float factor)
void MEM_freeN(void *vmemh)
pbvh::Tree * pbvh_get(Object &object)
bool raycast_node_detail_bmesh(BMeshNode &node, const float3 &ray_start, IsectRayPrecalc *isect_precalc, float *depth, float *r_edge_length)
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 float center[3], const float view_normal[3], float radius, bool use_frontface, bool use_projected)
Span< float3 > vert_positions_eval(const Depsgraph &depsgraph, const Object &object_orig)
void raycast(Tree &pbvh, FunctionRef< void(Node &node, float *tmin)> cb, const float3 &ray_start, const float3 &ray_normal, bool original)
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 int sample_detail(bContext *C, const int event_xy[2], const SampleDetailModeType mode)
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 void dyntopo_detail_size_update_header(bContext *C, const DyntopoDetailSizeEditCustomData *cd)
static int sculpt_sample_detail_size_modal(bContext *C, wmOperator *op, const wmEvent *event)
static int sculpt_sample_detail_size_exec(bContext *C, wmOperator *op)
static int sculpt_sample_detail_size_invoke(bContext *C, wmOperator *op, const wmEvent *)
void SCULPT_OT_sample_detail_size(wmOperatorType *ot)
static int dyntopo_detail_size_edit_modal(bContext *C, wmOperator *op, const wmEvent *event)
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 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 void dyntopo_detail_size_bounds(DyntopoDetailSizeEditCustomData *cd)
static void sculpt_raycast_detail_cb(bke::pbvh::BMeshNode &node, SculptDetailRaycastData &srd, float *tmin)
static int dyntopo_detail_size_edit_invoke(bContext *C, wmOperator *op, const wmEvent *event)
@ DETAILING_MODE_BRUSH_PERCENT
@ DETAILING_MODE_DETAIL_SIZE
@ DETAILING_MODE_RESOLUTION
static int sculpt_detail_flood_fill_exec(bContext *C, wmOperator *op)
static bool sculpt_and_dynamic_topology_poll(bContext *C)
static bool sculpt_and_constant_or_manual_detail_poll(bContext *C)
void push_end(Object &ob)
void push_node(const Depsgraph &depsgraph, const Object &object, const bke::pbvh::Node *node, Type type)
void push_begin(const Scene &scene, Object &ob, const wmOperator *op)
Span< BMVert * > vert_neighbors_get_bmesh(BMVert &vert, Vector< BMVert *, 64 > &r_neighbors)
float sculpt_calc_radius(const ViewContext &vc, const Brush &brush, const Scene &scene, const float3 location)
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)
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)
PointerRNA RNA_pointer_create(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)
bool SCULPT_cursor_geometry_info_update(bContext *C, SculptCursorGeometryInfo *out, const float mval[2], bool use_sampled_normal)
void SCULPT_vertex_random_access_ensure(Object &object)
void SCULPT_stroke_modifiers_check(const bContext *C, Object &ob, const Brush &brush)
float SCULPT_raycast_init(ViewContext *vc, const float mval[2], float ray_start[3], float ray_end[3], float ray_normal[3], bool original)
bool SCULPT_mode_poll(bContext *C)
#define DETAIL_SIZE_DELTA_ACCURATE_SPEED
#define DETAIL_SIZE_DELTA_SPEED
struct SculptSession * sculpt
blender::float3 cursor_normal
ActiveVert active_vert() const
blender::float3 cursor_location
blender::float3 cursor_sampled_normal
eDyntopoDetailingMode mode
IsectRayPrecalc isect_precalc
bool(* poll)(bContext *C) ATTR_WARN_UNUSED_RESULT
int(* modal)(bContext *C, wmOperator *op, const wmEvent *event) ATTR_WARN_UNUSED_RESULT
int(* invoke)(bContext *C, wmOperator *op, const wmEvent *event) ATTR_WARN_UNUSED_RESULT
int(* exec)(bContext *C, wmOperator *op) ATTR_WARN_UNUSED_RESULT
void(* cancel)(bContext *C, wmOperator *op)
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)