14#define DNA_DEPRECATED_ALLOW
68 std::optional<Library *> ,
73 Brush *brush_dst =
reinterpret_cast<Brush *
>(id_dst);
74 const Brush *brush_src =
reinterpret_cast<const Brush *
>(id_src);
173 bool force_local, force_copy;
183 else if (force_copy) {
408 brush->
size = std::max(brush->
size / 2, 1);
439 constexpr std::array mode_map{
440 std::tuple{
"use_paint_sculpt",
OB_MODE_SCULPT,
"sculpt_brush_type"},
445 std::tuple{
"use_paint_uv_sculpt",
OB_MODE_EDIT,
"image_brush_type"},
456 for (
const auto &[prop_name, mode, tool_prop_name] : mode_map) {
458 if (!(
brush->ob_mode & mode)) {
532#define FROM_DEFAULT(member) \
533 memcpy((void *)&brush->member, (void *)&brush_def->member, sizeof(brush->member))
534#define FROM_DEFAULT_PTR(member) memcpy(brush->member, brush_def->member, sizeof(brush->member))
578#undef FROM_DEFAULT_PTR
587 brush->ob_mode = ob_mode;
592 else if (
ELEM(ob_mode,
606 if (
brush->gpencil_settings ==
nullptr) {
610 brush->gpencil_settings->draw_smoothlvl = 1;
611 brush->gpencil_settings->flag = 0;
613 brush->gpencil_settings->draw_strength = 1.0f;
614 brush->gpencil_settings->draw_jitter = 0.0f;
649 uint duplicate_options)
656 if (!is_subprocess) {
684 if (!is_subprocess) {
706 if (
brush->curves_sculpt_settings ==
nullptr) {
723 brush->has_unsaved_changes =
true;
730 if (
brush->ob_mode & ob_mode) {
740 Brush def = blender::dna::shallow_zero_initialize();
743#define BR_TEST(field, t) \
744 if (br->field != def.field) { \
745 printf("br->" #field " = %" #t ";\n", br->field); \
749#define BR_TEST_FLAG(_f) \
750 if ((br->flag & _f) && !(def.flag & _f)) { \
751 printf("br->flag |= " #_f ";\n"); \
753 else if (!(br->flag & _f) && (def.flag & _f)) { \
754 printf("br->flag &= ~" #_f ";\n"); \
758#define BR_TEST_FLAG_OVERLAY(_f) \
759 if ((br->overlay_flags & _f) && !(def.overlay_flags & _f)) { \
760 printf("br->overlay_flags |= " #_f ";\n"); \
762 else if (!(br->overlay_flags & _f) && (def.overlay_flags & _f)) { \
763 printf("br->overlay_flags &= ~" #_f ";\n"); \
807 BR_TEST(smooth_stroke_radius, d);
808 BR_TEST(smooth_stroke_factor, f);
819 BR_TEST(topology_rake_factor, f);
821 BR_TEST(crease_pinch_factor, f);
825 BR_TEST(texture_sample_bias, f);
826 BR_TEST(texture_overlay_alpha, d);
866 return &
brush->mask_mtex;
872 return &
brush->mask_mtex;
880 const float point[3],
886 float intensity = 1.0;
889 if (mtex ==
nullptr || mtex->
tex ==
nullptr) {
898 float rotation = -mtex->
rot;
899 const float point_2d[2] = {point[0], point[1]};
906 if (rotation > 0.001f || rotation < -0.001f) {
928 float rotation = -mtex->
rot;
929 const float point_2d[2] = {point[0], point[1]};
930 float x = 0.0f,
y = 0.0f;
931 float invradius = 1.0f;
969 if (rotation > 0.001f || rotation < -0.001f) {
1005 float rgba[4], intensity;
1011 float rotation = -mtex->
rot;
1012 const float point_2d[2] = {point[0], point[1]};
1019 if (rotation > 0.001f || rotation < -0.001f) {
1021 const float flen =
sqrtf(
x *
x +
y *
y);
1041 float rotation = -mtex->
rot;
1042 const float point_2d[2] = {point[0], point[1]};
1043 float x = 0.0f,
y = 0.0f;
1044 float invradius = 1.0f;
1082 if (rotation > 0.001f || rotation < -0.001f) {
1084 const float flen =
sqrtf(
x *
x +
y *
y);
1097 CLAMP(intensity, 0.0f, 1.0f);
1142 return std::nullopt;
1158 return std::nullopt;
1162 brush->color_jitter_flag,
1163 brush->hsv_jitter[0],
1164 brush->hsv_jitter[1],
1165 brush->hsv_jitter[2],
1166 brush->curve_rand_hue,
1167 brush->curve_rand_saturation,
1168 brush->curve_rand_value,
1179 return brush->secondary_rgb;
1244 brush->unprojected_radius = unprojected_radius;
1264 brush->alpha = alpha;
1291 brush->weight = value;
1311 brush->input_samples = value;
1320 float scale = new_brush_size;
1322 if (old_brush_size != 0) {
1323 scale /= float(old_brush_size);
1325 (*unprojected_radius) *= scale;
1329 float new_unprojected_radius,
1330 float old_unprojected_radius)
1332 float scale = new_unprojected_radius;
1334 if (old_unprojected_radius != 0) {
1335 scale /= new_unprojected_radius;
1337 (*r_brush_size) = int(
float(*r_brush_size) * scale);
1355 diameter = 2 *
brush.jitter_absolute;
1360 spread =
brush.jitter;
1363 jitterpos[0] =
pos[0] + 2 * rand_pos[0] * diameter * spread;
1364 jitterpos[1] =
pos[1] + 2 * rand_pos[1] * diameter * spread;
1384 const float brush_radius,
1409 const float factor = 1.0f -
distance * radius_rcp;
1410 factors[
i] *= factor * factor;
1421 const float factor = 1.0f -
distance * radius_rcp;
1422 factors[
i] *= 3.0f * factor * factor - 2.0f * factor * factor * factor;
1433 const float factor = 1.0f -
distance * radius_rcp;
1434 factors[
i] *=
pow3f(factor) * (factor * (factor * 6.0f - 15.0f) + 10.0f);
1445 const float factor = 1.0f -
distance * radius_rcp;
1446 factors[
i] *=
sqrtf(factor);
1457 const float factor = 1.0f -
distance * radius_rcp;
1458 factors[
i] *= factor;
1478 const float factor = 1.0f -
distance * radius_rcp;
1479 factors[
i] *=
sqrtf(2 * factor - factor * factor);
1490 const float factor = 1.0f -
distance * radius_rcp;
1491 factors[
i] *= factor * factor * factor * factor;
1502 const float factor = 1.0f -
distance * radius_rcp;
1503 factors[
i] *= factor * (2.0f - factor);
1513 const float brush_radius)
1516 float strength = 1.0f;
1518 if (p >= brush_radius) {
1522 p = p / brush_radius;
1533 strength = 3.0f * p * p - 2.0f * p * p * p;
1536 strength =
pow3f(p) * (p * (p * 6.0f - 15.0f) + 10.0f);
1539 strength =
sqrtf(p);
1548 strength =
sqrtf(2 * p - p * p);
1551 strength = p * p * p * p;
1554 strength = p * (2.0f - p);
1570 CLAMP(strength, 0.0f, 1.0f);
1578 const bool use_secondary,
1582 if (mtex->
tex ==
nullptr) {
1586 const float step = 2.0 / side;
1591 for (
y = -1.0, iy = 0; iy < side; iy++,
y +=
step) {
1592 for (
x = -1.0, ix = 0; ix < side; ix++,
x +=
step) {
1593 const float co[3] = {
x,
y, 0.0f};
1596 float rgba_dummy[4];
1599 rect[iy * side + ix] = intensity;
1610 int half = side / 2;
1617 im->
x = im->
y = side;
1621 if (display_gradient || have_texture) {
1622 for (
int i = 0;
i < side;
i++) {
1623 for (
int j = 0; j < side; j++) {
1638 switch (paint_mode) {
1645 (
brush->tip_roundness < 1.0f ||
brush->tip_scale_x != 1.0f))
void BKE_asset_metadata_idprop_ensure(AssetMetaData *asset_data, IDProperty *prop)
bool BKE_bpath_foreach_path_fixed_process(BPathForeachPathData *bpath_data, char *path, size_t path_maxncpy)
Low-level operations for grease pencil.
@ IDTYPE_FLAGS_NO_ANIMDATA
@ IDTYPE_FLAGS_NO_MEMFILE_UNDO
ID * BKE_id_copy_for_duplicate(Main *bmain, ID *id, eDupli_ID_Flags duplicate_flags, int copy_flags)
void BKE_id_delete(Main *bmain, void *idv) ATTR_NONNULL()
void BKE_lib_id_expand_local(Main *bmain, ID *id, int flags)
void id_fake_user_set(ID *id)
@ LIB_ID_MAKELOCAL_FULL_LIBRARY
void BKE_main_id_newptr_and_tag_clear(Main *bmain)
void BKE_lib_id_make_local_generic_action_define(Main *bmain, ID *id, int flags, bool *r_force_local, bool *r_force_copy)
ID * BKE_id_copy(Main *bmain, const ID *id)
void * BKE_id_new(Main *bmain, short type, const char *name)
void BKE_lib_id_clear_library_data(Main *bmain, ID *id, int flags)
@ LIB_ID_DUPLICATE_IS_ROOT_ID
@ LIB_ID_DUPLICATE_IS_SUBPROCESS
void BKE_id_blend_write(BlendWriter *writer, ID *id)
#define BKE_LIB_FOREACHID_PROCESS_FUNCTION_CALL(data_, func_call_)
#define BKE_LIB_FOREACHID_PROCESS_IDSUPER(data_, id_super_, cb_flag_)
bool BKE_library_ID_is_indirectly_used(Main *bmain, void *idv)
@ IDWALK_CB_EMBEDDED_NOT_OWNING
void BKE_library_foreach_ID_link(Main *bmain, ID *id, blender::FunctionRef< LibraryIDLinkCallback > callback, void *user_data, LibraryForeachIDFlag flag)
void BKE_libblock_relink_to_newid(Main *bmain, ID *id, int remap_flag) ATTR_NONNULL()
@ ID_REMAP_SKIP_INDIRECT_USAGE
void void BKE_libblock_remap(Main *bmain, void *old_idv, void *new_idv, int remap_flags) ATTR_NONNULL(1
#define FOREACH_MAIN_ID_END
#define FOREACH_MAIN_ID_BEGIN(_bmain, _id)
General operations, lookup, etc. for materials.
bool BKE_paint_use_unified_color(const ToolSettings *tool_settings, const Paint *paint)
CurveMapping * BKE_sculpt_default_cavity_curve()
CurveMapping * BKE_paint_default_curve()
std::optional< int > BKE_paint_get_brush_type_from_obmode(const Brush *brush, eObjectMode ob_mode)
void BKE_previewimg_blend_write(BlendWriter *writer, const PreviewImage *prv)
void BKE_previewimg_free(PreviewImage **prv)
void BKE_previewimg_blend_read(BlendDataReader *reader, PreviewImage *prv)
void BKE_previewimg_id_copy(ID *new_id, const ID *old_id)
void BKE_texture_mtex_foreach_id(struct LibraryForeachIDData *data, struct MTex *mtex)
#define BLI_assert_unreachable()
#define LISTBASE_FOREACH(type, var, list)
MINLINE float pow2f(float x)
MINLINE float square_f(float a)
MINLINE float pow3f(float x)
MINLINE float len_squared_v2(const float v[2]) ATTR_WARN_UNUSED_RESULT
MINLINE void copy_v3_v3(float r[3], const float a[3])
MINLINE void zero_v4(float r[4])
struct RNG * BLI_rng_new(unsigned int seed)
void BLI_rng_srandom(struct RNG *rng, unsigned int seed) ATTR_NONNULL(1)
void BLI_rng_free(struct RNG *rng) ATTR_NONNULL(1)
float BLI_rng_get_float(struct RNG *rng) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
#define MEMCMP_STRUCT_AFTER_IS_ZERO(struct_var, member)
#define MEMCPY_STRUCT_AFTER(struct_dst, struct_src, member)
int BLO_read_fileversion_get(BlendDataReader *reader)
#define BLO_write_id_struct(writer, struct_name, id_address, id)
#define BLO_write_struct(writer, struct_name, data_ptr)
#define BLO_read_struct(reader, struct_name, ptr_p)
#define BLT_I18NCONTEXT_ID_BRUSH
ID and Library types, which are fundamental for SDNA.
@ SCULPT_BRUSH_TYPE_DRAW_SHARP
@ SCULPT_BRUSH_TYPE_THUMB
@ SCULPT_BRUSH_TYPE_BOUNDARY
@ SCULPT_BRUSH_TYPE_DISPLACEMENT_SMEAR
@ SCULPT_BRUSH_TYPE_DRAW_FACE_SETS
@ SCULPT_BRUSH_TYPE_CLOTH
@ SCULPT_BRUSH_TYPE_PINCH
@ SCULPT_BRUSH_TYPE_SMEAR
@ SCULPT_BRUSH_TYPE_CLAY_THUMB
@ SCULPT_BRUSH_TYPE_MULTIPLANE_SCRAPE
@ SCULPT_BRUSH_TYPE_SIMPLIFY
@ SCULPT_BRUSH_TYPE_SNAKE_HOOK
@ SCULPT_BRUSH_TYPE_CREASE
@ SCULPT_BRUSH_TYPE_LAYER
@ SCULPT_BRUSH_TYPE_SLIDE_RELAX
@ SCULPT_BRUSH_TYPE_ELASTIC_DEFORM
@ SCULPT_BRUSH_TYPE_SMOOTH
@ SCULPT_BRUSH_TYPE_PAINT
@ SCULPT_BRUSH_TYPE_DISPLACEMENT_ERASER
@ SCULPT_BRUSH_TYPE_PLANE
@ SCULPT_BRUSH_TYPE_INFLATE
@ SCULPT_BRUSH_TYPE_ROTATE
@ SCULPT_BRUSH_TYPE_CLAY_STRIPS
@ GP_BRUSH_MATERIAL_PINNED
@ GP_BRUSH_USE_JITTER_PRESSURE
@ BRUSH_INVERSE_SMOOTH_PRESSURE
@ BRUSH_MASK_PRESSURE_RAMP
@ BRUSH_MASK_PRESSURE_CUTOFF
@ BRUSH_CURVES_SCULPT_FLAG_INTERPOLATE_RADIUS
@ BRUSH_OVERLAY_SECONDARY_OVERRIDE_ON_STROKE
@ BRUSH_OVERLAY_PRIMARY_OVERRIDE_ON_STROKE
@ BRUSH_OVERLAY_SECONDARY
@ BRUSH_OVERLAY_CURSOR_OVERRIDE_ON_STROKE
#define MAX_BRUSH_PIXEL_RADIUS
@ CUMA_EXTEND_EXTRAPOLATE
#define DNA_struct_default_get(struct_name)
@ OB_MODE_VERTEX_GREASE_PENCIL
@ OB_MODE_PAINT_GREASE_PENCIL
@ OB_MODE_SCULPT_GREASE_PENCIL
@ OB_MODE_WEIGHT_GREASE_PENCIL
@ UNIFIED_PAINT_COLOR_JITTER
@ UNIFIED_PAINT_BRUSH_LOCK_SIZE
@ UNIFIED_PAINT_INPUT_SAMPLES
static double angle(const Eigen::Vector3d &v1, const Eigen::Vector3d &v2)
void IMB_colormanagement_colorspace_to_scene_linear_v3(float pixel[3], const ColorSpace *colorspace)
ImBuf * IMB_dupImBuf(const ImBuf *ibuf1)
void IMB_assign_float_buffer(ImBuf *ibuf, float *buffer_data, ImBufOwnership ownership)
void IMB_freeImBuf(ImBuf *ibuf)
@ IB_DO_NOT_TAKE_OWNERSHIP
Read Guarded memory(de)allocation.
BMesh const char void * data
void BKE_brush_jitter_pos(const Scene &scene, const Brush &brush, const float pos[2], float jitterpos[2])
void BKE_brush_weight_set(const Scene *scene, Brush *brush, float value)
const MTex * BKE_brush_mask_texture_get(const Brush *brush, const eObjectMode object_mode)
float BKE_brush_curve_strength_clamped(const Brush *br, float p, const float len)
static void brush_defaults(Brush *brush)
bool BKE_brush_use_alpha_pressure(const Brush *brush)
void BKE_brush_randomize_texture_coords(UnifiedPaintSettings *ups, bool mask)
float BKE_brush_weight_get(const Scene *scene, const Brush *brush)
float BKE_brush_curve_strength(const eBrushCurvePreset preset, const CurveMapping *cumap, const float distance, const float brush_radius)
float BKE_brush_unprojected_radius_get(const Scene *scene, const Brush *brush)
static void brush_blend_write(BlendWriter *writer, ID *id, const void *id_address)
#define BR_TEST(field, t)
int BKE_brush_size_get(const Scene *scene, const Brush *brush)
static void brush_free_data(ID *id)
static AssetTypeInfo AssetType_BR
static void brush_blend_read_after_liblink(BlendLibReader *, ID *id)
const MTex * BKE_brush_color_texture_get(const Brush *brush, const eObjectMode object_mode)
void BKE_brush_unprojected_radius_set(Scene *scene, Brush *brush, float unprojected_radius)
Brush * BKE_brush_first_search(Main *bmain, const eObjectMode ob_mode)
void BKE_brush_size_set(Scene *scene, Brush *brush, int size)
static void brush_foreach_id(ID *id, LibraryForeachIDData *data)
#define FROM_DEFAULT(member)
#define BR_TEST_FLAG_OVERLAY(_f)
const float * BKE_brush_secondary_color_get(const Scene *scene, const Paint *paint, const Brush *brush)
void BKE_brush_alpha_set(Scene *scene, Brush *brush, float alpha)
bool BKE_brush_use_size_pressure(const Brush *brush)
void BKE_brush_input_samples_set(const Scene *scene, Brush *brush, int value)
static void brush_init_data(ID *id)
bool BKE_brush_has_cube_tip(const Brush *brush, PaintMode paint_mode)
static void brush_make_local(Main *bmain, ID *id, const int flags)
static void brush_copy_data(Main *, std::optional< Library * >, ID *id_dst, const ID *id_src, const int flag)
void BKE_brush_init_curves_sculpt_settings(Brush *brush)
Brush * BKE_brush_add(Main *bmain, const char *name, const eObjectMode ob_mode)
void BKE_brush_system_init()
#define FROM_DEFAULT_PTR(member)
ImBuf * BKE_brush_gen_radial_control_imbuf(Brush *br, bool secondary, bool display_gradient)
static bool brush_gen_texture(const Brush *br, const int side, const bool use_secondary, float *rect)
void BKE_brush_color_set(Scene *scene, const Paint *paint, Brush *brush, const float color[3])
void BKE_brush_curve_preset(Brush *b, eCurveMappingPreset preset)
static void brush_blend_read_data(BlendDataReader *reader, ID *id)
void BKE_brush_calc_curve_factors(const eBrushCurvePreset preset, const CurveMapping *cumap, const blender::Span< float > distances, const float brush_radius, const blender::MutableSpan< float > factors)
const std::optional< BrushColorJitterSettings > BKE_brush_color_jitter_get_settings(const Scene *scene, const Paint *paint, const Brush *brush)
void BKE_brush_init_gpencil_settings(Brush *brush)
Brush * BKE_brush_duplicate(Main *bmain, Brush *brush, eDupli_ID_Flags, uint duplicate_options)
float BKE_brush_sample_masktex(const Scene *scene, Brush *br, const float point[2], const int thread, ImagePool *pool)
static void brush_foreach_path(ID *id, BPathForeachPathData *bpath_data)
void BKE_brush_scale_size(int *r_brush_size, float new_unprojected_radius, float old_unprojected_radius)
float BKE_brush_alpha_get(const Scene *scene, const Brush *brush)
const float * BKE_brush_color_get(const Scene *scene, const Paint *paint, const Brush *brush)
void BKE_brush_debug_print_state(Brush *br)
bool BKE_brush_delete(Main *bmain, Brush *brush)
bool BKE_brush_use_locked_size(const Scene *scene, const Brush *brush)
void BKE_brush_scale_unprojected_radius(float *unprojected_radius, int new_brush_size, int old_brush_size)
static void brush_asset_metadata_ensure(void *asset_ptr, AssetMetaData *asset_data)
void BKE_brush_tag_unsaved_changes(Brush *brush)
void BKE_brush_system_exit()
int BKE_brush_input_samples_get(const Scene *scene, const Brush *brush)
float BKE_brush_sample_tex_3d(const Scene *scene, const Brush *br, const MTex *mtex, const float point[3], float rgba[4], const int thread, ImagePool *pool)
static DBVT_INLINE btScalar size(const btDbvtVolume &a)
constexpr int64_t size() const
constexpr int64_t size() const
constexpr IndexRange index_range() const
VecBase< float, D > step(VecOp< float, D >, VecOp< float, D >) RET
float distance(VecOp< float, D >, VecOp< float, D >) RET
#define ID_EXTRA_USERS(id)
#define ID_IS_LINKED(_id)
#define ID_REAL_USERS(id)
#define ID_NEW_SET(_id, _idn)
void * MEM_calloc_arrayN(size_t len, size_t size, const char *str)
void * MEM_callocN(size_t len, const char *str)
void * MEM_dupallocN(const void *vmemh)
void MEM_freeN(void *vmemh)
ccl_device_inline float2 mask(const MaskType mask, const float2 a)
bool supports_sculpt_plane(const Brush &brush)
bool supports_secondary_cursor_color(const Brush &brush)
bool supports_auto_smooth(const Brush &brush)
bool supports_jitter(const Brush &brush)
bool supports_space_attenuation(const Brush &brush)
bool supports_persistence(const Brush &brush)
bool supports_tilt(const Brush &brush)
bool supports_inverted_direction(const Brush &brush)
bool supports_rake_factor(const Brush &brush)
bool supports_plane_depth(const Brush &brush)
bool supports_accumulate(const Brush &brush)
bool supports_gravity(const Brush &brush)
bool supports_smooth_stroke(const Brush &brush)
bool supports_plane_offset(const Brush &brush)
bool supports_pinch_factor(const Brush &brush)
bool supports_color(const Brush &brush)
bool supports_random_texture_angle(const Brush &brush)
bool supports_strength_pressure(const Brush &brush)
bool supports_dyntopo(const Brush &brush)
bool supports_height(const Brush &brush)
bool supports_topology_rake(const Brush &brush)
bool supports_plane_height(const Brush &brush)
bool supports_normal_weight(const Brush &brush)
std::unique_ptr< IDProperty, IDPropertyDeleter > create_bool(StringRef prop_name, bool value, eIDPropertyFlag flags={})
Allocate a new IDProperty of type IDP_BOOLEAN, set its name and value.
std::unique_ptr< IDProperty, IDPropertyDeleter > create(StringRef prop_name, int32_t value, eIDPropertyFlag flags={})
Allocate a new IDProperty of type IDP_INT, set its name and value.
static ePaintOverlayControlFlags overlay_flags
struct CurveMapping * curve_parameter_falloff
struct CurveMapping * curve_sensitivity
struct CurveMapping * curve_strength
struct CurveMapping * curve_jitter
struct CurveMapping * curve_rand_pressure
struct CurveMapping * curve_rand_strength
struct CurveMapping * curve_rand_saturation
struct CurveMapping * curve_rand_hue
struct CurveMapping * curve_rand_uv
struct Material * material
struct Material * material_alt
struct CurveMapping * curve_rand_value
struct ImBuf * icon_imbuf
struct ColorBand * gradient
struct CurveMapping * curve_rand_saturation
struct CurveMapping * curve_rand_hue
float stencil_dimension[2]
struct CurveMapping * curve
float texture_sample_bias
struct CurveMapping * curve_rand_value
float mask_stencil_pos[2]
struct BrushGpencilSettings * gpencil_settings
struct CurveMapping * automasking_cavity_curve
struct BrushCurvesSculptSettings * curves_sculpt_settings
float mask_stencil_dimension[2]
struct PaintCurve * paint_curve
ImBufFloatBuffer float_buffer
struct ToolSettings * toolsettings
char do_linear_conversion
struct CurveMapping * curve_rand_value
struct CurveMapping * curve_rand_saturation
float size_pressure_value
struct CurveMapping * curve_rand_hue
const ColorSpaceHandle * colorspace
bool RE_texture_evaluate(const MTex *mtex, const float vec[3], const int thread, ImagePool *pool, const bool skip_load_image, const bool texnode_preview, float *r_intensity, float r_rgba[4])
static int blend(const Tex *tex, const float texvec[3], TexResult *texres)