diff options
Diffstat (limited to 'source/blender/editors/sculpt_paint/sculpt_intern.h')
-rw-r--r-- | source/blender/editors/sculpt_paint/sculpt_intern.h | 97 |
1 files changed, 88 insertions, 9 deletions
diff --git a/source/blender/editors/sculpt_paint/sculpt_intern.h b/source/blender/editors/sculpt_paint/sculpt_intern.h index 0e27658e848..47e6fb55d81 100644 --- a/source/blender/editors/sculpt_paint/sculpt_intern.h +++ b/source/blender/editors/sculpt_paint/sculpt_intern.h @@ -27,6 +27,7 @@ #include "DNA_brush_types.h" #include "DNA_key_types.h" #include "DNA_listBase.h" +#include "DNA_meshdata_types.h" #include "DNA_vec_types.h" #include "BLI_bitmap.h" @@ -50,12 +51,15 @@ bool SCULPT_mode_poll_view3d(struct bContext *C); bool SCULPT_poll(struct bContext *C); bool SCULPT_poll_view3d(struct bContext *C); +bool SCULPT_vertex_colors_poll(struct bContext *C); + /* Updates */ typedef enum SculptUpdateType { SCULPT_UPDATE_COORDS = 1 << 0, SCULPT_UPDATE_MASK = 1 << 1, SCULPT_UPDATE_VISIBILITY = 1 << 2, + SCULPT_UPDATE_COLOR = 1 << 3, } SculptUpdateType; void SCULPT_flush_update_step(bContext *C, SculptUpdateType update_flags); @@ -92,6 +96,10 @@ int SCULPT_vertex_count_get(struct SculptSession *ss); const float *SCULPT_vertex_co_get(struct SculptSession *ss, int index); void SCULPT_vertex_normal_get(SculptSession *ss, int index, float no[3]); float SCULPT_vertex_mask_get(struct SculptSession *ss, int index); +const float *SCULPT_vertex_color_get(SculptSession *ss, int index); + +const float *SCULPT_vertex_persistent_co_get(SculptSession *ss, int index); +void SCULPT_vertex_persistent_normal_get(SculptSession *ss, int index, float no[3]); #define SCULPT_VERTEX_NEIGHBOR_FIXED_CAPACITY 256 typedef struct SculptVertexNeighborIter { @@ -143,7 +151,19 @@ int SCULPT_active_vertex_get(SculptSession *ss); const float *SCULPT_active_vertex_co_get(SculptSession *ss); void SCULPT_active_vertex_normal_get(SculptSession *ss, float normal[3]); -bool SCULPT_vertex_is_boundary(SculptSession *ss, const int index); +/* Fake Neighbors */ + +#define FAKE_NEIGHBOR_NONE -1 + +void SCULPT_fake_neighbors_ensure(struct Sculpt *sd, Object *ob, const float max_dist); +void SCULPT_fake_neighbors_enable(Object *ob); +void SCULPT_fake_neighbors_disable(Object *ob); +void SCULPT_fake_neighbors_free(struct Object *ob); + +/* Vertex Info. */ +void SCULPT_boundary_info_ensure(Object *object); +/* Boundary Info needs to be initialized in order to use this function. */ +bool SCULPT_vertex_is_boundary(const SculptSession *ss, const int index); /* Sculpt Visibility API */ @@ -165,12 +185,16 @@ bool SCULPT_vertex_has_unique_face_set(SculptSession *ss, int index); int SCULPT_face_set_next_available_get(SculptSession *ss); void SCULPT_face_set_visibility_set(SculptSession *ss, int face_set, bool visible); -bool SCULPT_vertex_all_face_sets_visible_get(SculptSession *ss, int index); +bool SCULPT_vertex_all_face_sets_visible_get(const SculptSession *ss, int index); bool SCULPT_vertex_any_face_set_visible_get(SculptSession *ss, int index); void SCULPT_face_sets_visibility_invert(SculptSession *ss); void SCULPT_face_sets_visibility_all_set(SculptSession *ss, bool visible); +bool SCULPT_stroke_is_main_symmetry_pass(struct StrokeCache *cache); +bool SCULPT_stroke_is_first_brush_step(struct StrokeCache *cache); +bool SCULPT_stroke_is_first_brush_step_of_symmetry_pass(struct StrokeCache *cache); + /* Sculpt Original Data */ typedef struct { struct BMLog *bm_log; @@ -179,15 +203,20 @@ typedef struct { float (*coords)[3]; short (*normals)[3]; const float *vmasks; + float (*colors)[4]; /* Original coordinate, normal, and mask. */ const float *co; const short *no; float mask; + const float *col; } SculptOrigVertData; void SCULPT_orig_vert_data_init(SculptOrigVertData *data, Object *ob, PBVHNode *node); void SCULPT_orig_vert_data_update(SculptOrigVertData *orig_data, PBVHVertexIter *iter); +void SCULPT_orig_vert_data_unode_init(SculptOrigVertData *data, + Object *ob, + struct SculptUndoNode *unode); /* Utils. */ void SCULPT_calc_brush_plane(struct Sculpt *sd, @@ -305,7 +334,7 @@ float *SCULPT_boundary_automasking_init(Object *ob, float *automask_factor); /* Filters. */ -void SCULPT_filter_cache_init(Object *ob, Sculpt *sd); +void SCULPT_filter_cache_init(Object *ob, Sculpt *sd, const int undo_type); void SCULPT_filter_cache_free(SculptSession *ss); void SCULPT_mask_filter_smooth_apply( @@ -374,15 +403,21 @@ void SCULPT_multiplane_scrape_preview_draw(const uint gpuattr, /* Draw Face Sets Brush. */ void SCULPT_do_draw_face_sets_brush(Sculpt *sd, Object *ob, PBVHNode **nodes, int totnode); -/* Smooth Brush. */ +/* Paint Brush. */ +void SCULPT_do_paint_brush(Sculpt *sd, Object *ob, PBVHNode **nodes, int totnode); -void SCULPT_neighbor_average(SculptSession *ss, float avg[3], uint vert); -void SCULPT_bmesh_neighbor_average(float avg[3], struct BMVert *v); +/* Smear Brush. */ +void SCULPT_do_smear_brush(Sculpt *sd, Object *ob, PBVHNode **nodes, int totnode); +/* Smooth Brush. */ void SCULPT_bmesh_four_neighbor_average(float avg[3], float direction[3], struct BMVert *v); void SCULPT_neighbor_coords_average(SculptSession *ss, float result[3], int index); float SCULPT_neighbor_mask_average(SculptSession *ss, int index); +void SCULPT_neighbor_color_average(SculptSession *ss, float result[4], int index); + +/* Mask the mesh boundaries smoothing only the mesh surface without using automasking. */ +void SCULPT_neighbor_coords_average_interior(SculptSession *ss, float result[3], int index); void SCULPT_smooth(Sculpt *sd, Object *ob, @@ -427,6 +462,7 @@ typedef enum { SCULPT_UNDO_DYNTOPO_SYMMETRIZE, SCULPT_UNDO_GEOMETRY, SCULPT_UNDO_FACE_SETS, + SCULPT_UNDO_COLOR, } SculptUndoType; /* Storage of geometry for the undo node. @@ -457,6 +493,7 @@ typedef struct SculptUndoNode { float (*co)[3]; float (*orig_co)[3]; short (*no)[3]; + float (*col)[4]; float *mask; int totvert; @@ -556,6 +593,7 @@ typedef struct SculptThreadedTaskData { int filter_type; float filter_strength; + float *filter_fill_color; bool use_area_cos; bool use_area_nos; @@ -568,6 +606,8 @@ typedef struct SculptThreadedTaskData { bool any_vertex_sampled; + float *wet_mix_sampled_color; + float *prev_mask; float *pose_factor; @@ -600,7 +640,18 @@ typedef struct SculptThreadedTaskData { float dirty_mask_max; bool dirty_mask_dirty_only; + /* Mask By Color Tool */ + + float mask_by_color_threshold; + bool mask_by_color_invert; + bool mask_by_color_preserve_mask; + + /* Index of the vertex that is going to be used as a reference for the colors. */ + int mask_by_color_vertex; + float *mask_by_color_floodfill; + int face_set; + int filter_undo_type; ThreadMutex mutex; @@ -632,7 +683,8 @@ typedef struct { float radius_squared; const float *center; bool original; - bool ignore_fully_masked; + /* This ignores fully masked and fully hidden nodes. */ + bool ignore_fully_ineffective; } SculptSearchSphereData; typedef struct { @@ -640,7 +692,7 @@ typedef struct { struct SculptSession *ss; float radius_squared; bool original; - bool ignore_fully_masked; + bool ignore_fully_ineffective; struct DistRayAABB_Precalc *dist_ray_to_aabb_precalc; } SculptSearchCircleData; @@ -688,6 +740,12 @@ bool SCULPT_pbvh_calc_area_normal(const struct Brush *brush, #define SCULPT_CLAY_STABILIZER_LEN 10 +typedef struct AutomaskingSettings { + /* Flags from eAutomasking_flag. */ + int flags; + int initial_face_set; +} AutomaskingSettings; + typedef struct StrokeCache { /* Invariants */ float initial_radius; @@ -720,6 +778,8 @@ typedef struct StrokeCache { float bstrength; float normal_weight; /* from brush (with optional override) */ + float (*prev_colors)[4]; + /* The rest is temporary storage that isn't saved as a property */ bool first_time; /* Beginning of stroke may do some things special */ @@ -770,6 +830,15 @@ typedef struct StrokeCache { bool original; float anchored_location[3]; + /* Paint Brush. */ + struct { + float hardness; + float flow; + float wet_mix; + float wet_persistence; + float density; + } paint_brush; + /* Pose brush */ struct SculptPoseIKChain *pose_ik_chain; @@ -808,11 +877,18 @@ typedef struct StrokeCache { float true_gravity_direction[3]; float gravity_direction[3]; - float *automask; + /* Automasking. */ + AutomaskingSettings automask_settings; + /* Precomputed automask factor indexed by vertex, owned by the automasking system and initialized + * in SCULPT_automasking_init when needed. */ + float *automask_factor; float stroke_local_mat[4][4]; float multiplane_scrape_angle; + float wet_mix_prev_color[4]; + float density_seed; + rcti previous_r; /* previous redraw rectangle */ rcti current_r; /* current redraw rectangle */ @@ -901,6 +977,9 @@ void SCULPT_OT_mesh_filter(struct wmOperatorType *ot); /* Cloth Filter. */ void SCULPT_OT_cloth_filter(struct wmOperatorType *ot); +/* Color Filter. */ +void SCULPT_OT_color_filter(struct wmOperatorType *ot); + /* Mask filter and Dirty Mask. */ void SCULPT_OT_mask_filter(struct wmOperatorType *ot); void SCULPT_OT_dirty_mask(struct wmOperatorType *ot); |