48 for (
const int i :
verts.index_range()) {
95 const GSpan color_attribute,
99 const T *colors_typed =
static_cast<const T *
>(color_attribute.
data());
102 for (
const int face : vert_to_face_map[vert]) {
104 r_color +=
to_float(colors_typed[corner]);
106 return r_color /
float(vert_to_face_map[vert].
size());
108 return to_float(colors_typed[vert]);
121 for (
const int i_face : vert_to_face_map[vert]) {
127 if (face_verts[
i] == vert) {
141 const GSpan color_attribute,
147 using T = decltype(dummy);
148 color = color_vert_get<T>(
149 faces, corner_verts, vert_to_face_map, color_attribute, color_domain, vert);
163 using T = decltype(dummy);
165 faces, corner_verts, vert_to_face_map, color_attribute, color_domain, vert, color);
174 using T = decltype(dummy);
175 T *colors_typed = static_cast<T *>(color_attribute.data());
176 for (const int i : indices.index_range()) {
177 T temp = colors_typed[indices[i]];
178 from_float(r_colors[i], colors_typed[indices[i]]);
179 r_colors[i] = to_float(temp);
189 using T = decltype(dummy);
190 const T *colors_typed = static_cast<const T *>(color_attribute.data());
191 for (const int i : indices.index_range()) {
192 r_colors[i] = to_float(colors_typed[indices[i]]);
200 const GSpan color_attribute,
210 using T = decltype(dummy);
211 for (const int i : verts.index_range()) {
212 r_colors[i] = color_vert_get<T>(
213 faces, corner_verts, vert_to_face_map, color_attribute, color_domain, verts[i]);
310 for (
const int i :
verts.index_range()) {
314 color_attribute.
span,
332 color_attribute.
span,
341 for (
const int i :
verts.index_range()) {
348 color_attribute.
span);
363 const float4 wet_mix_sampled_color,
421 if (density < 1.0f) {
424 for (
const int i :
verts.index_range()) {
426 if (hash_noise > density) {
427 const float noise = density * hash_noise;
436 const std::optional<BrushColorJitterSettings> color_jitter_settings =
438 if (color_jitter_settings) {
446 float4 brush_color(brush_color_rgb, 1.0f);
472 for (
const int i :
verts.index_range()) {
476 color_attribute.
span,
481 for (
const int i :
verts.index_range()) {
494 const float4 buffer_color =
float4(color_buffer[
i]) * alpha * automasking;
502 for (
const int i :
verts.index_range()) {
509 color_attribute.
span);
524 const GSpan color_attribute,
546 for (
const int i :
verts.index_range()) {
547 if (factors[
i] > 0.0f) {
549 faces, corner_verts, vert_to_face_map, color_attribute, color_domain,
verts[
i]);
602 if (!color_attribute) {
639 ColorPaintLocalData &tls = all_tls.local();
640 node_mask.slice(range).foreach_index([&](const int i) {
641 do_sample_wet_paint_task(ob,
646 attribute_data.hide_vert,
647 color_attribute.span,
648 color_attribute.domain,
663 if (swptd.tot_samples > 0 &&
is_finite_v4(swptd.color)) {
664 wet_color =
math::clamp(swptd.color /
float(swptd.tot_samples), 0.0f, 1.0f);
677 if (ss.cache->paint_brush.mix_colors.is_empty()) {
682 node_mask.foreach_index(
GrainSize(1), [&](
const int i) {
683 ColorPaintLocalData &tls = all_tls.
local();
698 ss.cache->paint_brush.mix_colors,
701 pbvh.tag_attribute_changed(node_mask, mesh.active_color_attribute);
702 color_attribute.finish();
756 for (
const int i :
verts.index_range()) {
757 if (factors[
i] == 0.0f) {
760 const int vert =
verts[
i];
761 const float3 &no = vert_normals[vert];
766 current_disp = brush_delta;
777 current_disp += no * -
math::dot(current_disp, no);
781 current_disp = current_disp_norm * strength;
796 faces, corner_verts, vert_to_face_map, attribute_data.
hide_poly, vert, neighbors))
798 const float3 &nco = vert_positions[neighbor];
806 if (neighbor_neighbor == vert) {
810 float3 vert_disp = vert_positions[neighbor_neighbor] - vert_positions[vert];
831 vert_disp += no * -
math::dot(no, vert_disp);
834 if (
math::dot(current_disp_norm, vert_disp_norm) >= 0.0f) {
839 float color_interp = -
math::dot(current_disp_norm, vert_disp_norm);
842 w *= color_interp * color_interp;
844 accum += neighbor_color *
w;
854 faces, corner_verts, vert_to_face_map, color_attribute.
span, color_attribute.
domain, vert);
862 color_attribute.
span);
889 if (!color_attribute) {
896 for (const int vert : range) {
897 ss.cache->paint_brush.prev_colors[vert] = color_vert_get(faces,
900 color_attribute.span,
901 color_attribute.domain,
910 if (ss.cache->alt_smooth) {
912 node_mask.foreach_index(
GrainSize(1), [&](
const int i) {
913 ColorPaintLocalData &tls = all_tls.
local();
930 node_mask.foreach_index(
GrainSize(1), [&](
const int i) {
932 ss.cache->paint_brush.prev_colors[vert] = color_vert_get(
faces,
935 color_attribute.span,
936 color_attribute.domain,
940 threading::EnumerableThreadSpecific<ColorPaintLocalData> all_tls;
941 node_mask.foreach_index(
GrainSize(1), [&](
const int i) {
942 ColorPaintLocalData &tls = all_tls.local();
957 pbvh.tag_attribute_changed(node_mask, mesh.active_color_attribute);
958 color_attribute.finish();
#define ATTR_DOMAIN_MASK_COLOR
#define ATTR_DOMAIN_AS_MASK(domain)
float BKE_brush_alpha_get(const Paint *paint, const Brush *brush)
const float * BKE_brush_color_get(const Paint *paint, const Brush *brush)
const float * BKE_brush_secondary_color_get(const Paint *paint, const Brush *brush)
std::optional< BrushColorJitterSettings > BKE_brush_color_jitter_get_settings(const Paint *paint, const Brush *brush)
void BKE_brush_calc_curve_factors(eBrushCurvePreset preset, const CurveMapping *cumap, blender::Span< float > distances, float brush_radius, blender::MutableSpan< float > factors)
bool BKE_colorband_evaluate(const ColorBand *coba, float in, float out[4])
CustomData interface, see also DNA_customdata_types.h.
eCustomDataMask CD_TYPE_AS_MASK(eCustomDataType type)
blender::float3 BKE_paint_randomize_color(const BrushColorJitterSettings &color_jitter, const blender::float3 &initial_hsv_jitter, const float distance, const float pressure, const blender::float3 &color)
const Brush * BKE_paint_brush_for_read(const Paint *paint)
A BVH for high poly meshes.
BLI_INLINE float BLI_hash_int_01(unsigned int k)
void linearrgb_to_srgb_v3_v3(float srgb[3], const float linear[3])
MINLINE void rgba_float_to_uchar(unsigned char r_col[4], const float col_f[4])
MINLINE void rgba_uchar_to_float(float r_col[4], const unsigned char col_ub[4])
void srgb_to_linearrgb_v3_v3(float linear[3], const float srgb[3])
MINLINE void blend_color_mix_float(float dst[4], const float src1[4], const float src2[4])
MINLINE void blend_color_interpolate_float(float dst[4], const float src1[4], const float src2[4], float t)
bool is_zero_m4(const float mat[4][4])
MINLINE void copy_v4_v4(float r[4], const float a[4])
MINLINE bool is_finite_v4(const float v[4]) ATTR_WARN_UNUSED_RESULT
@ BRUSH_SMEAR_DEFORM_PINCH
@ BRUSH_SMEAR_DEFORM_EXPAND
@ BRUSH_SMEAR_DEFORM_DRAG
@ BRUSH_GRADIENT_SPACING_CLAMP
@ BRUSH_GRADIENT_PRESSURE
@ BRUSH_GRADIENT_SPACING_REPEAT
#define CD_MASK_COLOR_ALL
void IMB_blend_color_float(float dst[4], const float src1[4], const float src2[4], IMB_BlendMode mode)
BPy_StructRNA * depsgraph
static DBVT_INLINE btScalar size(const btDbvtVolume &a)
SIMD_FORCE_INLINE const btScalar & w() const
Return the w value.
static unsigned long seed
void resize(const int64_t new_size)
const CPPType & type() const
const CPPType & type() const
const void * data() const
const CPPType & type() const
constexpr int64_t size() const
constexpr int64_t start() const
constexpr Span< T > as_span() const
constexpr IndexRange index_range() const
constexpr Span slice(int64_t start, int64_t size) const
GAttributeReader lookup(const StringRef attribute_id) const
GSpanAttributeWriter lookup_for_write_span(StringRef attribute_id)
void tag_attribute_changed(const IndexMask &node_mask, StringRef attribute_name)
Span< NodeT > nodes() const
IndexRange index_range() const
void foreach_index(Fn &&fn) const
VecBase< float, 4 > float4
ccl_device_inline float2 fmod(const float2 a, const float b)
int face_find_corner_from_vert(const IndexRange face, const Span< int > corner_verts, const int vert)
pbvh::Tree * pbvh_get(Object &object)
Span< float3 > vert_normals_eval(const Depsgraph &depsgraph, const Object &object_orig)
Span< float3 > vert_positions_eval(const Depsgraph &depsgraph, const Object &object_orig)
eCustomDataType cpp_type_to_custom_data_type(const CPPType &type)
void calc_vert_factors(const Depsgraph &depsgraph, const Object &object, const Cache &automasking, const bke::pbvh::MeshNode &node, Span< int > verts, MutableSpan< float > factors)
static void do_paint_brush_task(const Depsgraph &depsgraph, Object &object, const Span< float3 > vert_positions, const Span< float3 > vert_normals, const OffsetIndices< int > faces, const Span< int > corner_verts, const GroupedSpan< int > vert_to_face_map, const MeshAttributeData &attribute_data, const Paint &paint, const Brush &brush, const float4x4 &mat, const float4 wet_mix_sampled_color, bke::pbvh::MeshNode &node, ColorPaintLocalData &tls, const MutableSpan< float4 > mix_colors, bke::GSpanAttributeWriter &color_attribute)
bke::GSpanAttributeWriter active_color_attribute_for_write(Mesh &mesh)
void gather_colors_vert(OffsetIndices< int > faces, Span< int > corner_verts, GroupedSpan< int > vert_to_face_map, GSpan color_attribute, bke::AttrDomain color_domain, Span< int > verts, MutableSpan< float4 > r_colors)
void do_smear_brush(const Depsgraph &depsgraph, const Sculpt &sd, Object &ob, const IndexMask &node_mask)
float4 color_vert_get(OffsetIndices< int > faces, Span< int > corner_verts, GroupedSpan< int > vert_to_face_map, GSpan color_attribute, bke::AttrDomain color_domain, int vert)
static void do_sample_wet_paint_task(const Object &object, const Span< float3 > vert_positions, const OffsetIndices< int > faces, const Span< int > corner_verts, const GroupedSpan< int > vert_to_face_map, const Span< bool > hide_vert, const GSpan color_attribute, const bke::AttrDomain color_domain, const Brush &brush, const bke::pbvh::MeshNode &node, ColorPaintLocalData &tls, SampleWetPaintData &swptd)
void gather_colors(GSpan color_attribute, Span< int > indices, MutableSpan< float4 > r_colors)
void color_vert_set(OffsetIndices< int > faces, Span< int > corner_verts, GroupedSpan< int > vert_to_face_map, bke::AttrDomain color_domain, int vert, const float4 &color, GMutableSpan color_attribute)
void swap_gathered_colors(Span< int > indices, GMutableSpan color_attribute, MutableSpan< float4 > r_colors)
void from_float(const float4 &src, T &dst)
static void do_smear_brush_task(const Depsgraph &depsgraph, Object &object, const Span< float3 > vert_positions, const Span< float3 > vert_normals, const OffsetIndices< int > faces, const Span< int > corner_verts, const GroupedSpan< int > vert_to_face_map, const MeshAttributeData &attribute_data, const Brush &brush, bke::pbvh::MeshNode &node, ColorPaintLocalData &tls, bke::GSpanAttributeWriter &color_attribute)
bke::GAttributeReader active_color_attribute(const Mesh &mesh)
void to_static_color_type(const CPPType &type, const Func &func)
static void do_color_smooth_task(const Depsgraph &depsgraph, const Object &object, const Span< float3 > vert_positions, const Span< float3 > vert_normals, const OffsetIndices< int > faces, const Span< int > corner_verts, const GroupedSpan< int > vert_to_face_map, const MeshAttributeData &attribute_data, const Brush &brush, const bke::pbvh::MeshNode &node, ColorPaintLocalData &tls, bke::GSpanAttributeWriter &color_attribute)
static void calc_local_positions(const float4x4 &mat, const Span< int > verts, const Span< float3 > positions, const MutableSpan< float3 > local_positions)
void do_paint_brush(const Depsgraph &depsgraph, PaintModeSettings &paint_mode_settings, const Sculpt &sd, Object &ob, const IndexMask &node_mask, const IndexMask &texnode_mask)
float4 to_float(const T &src)
void neighbor_color_average(const OffsetIndices< int > faces, const Span< int > corner_verts, const GroupedSpan< int > vert_to_face_map, const GSpan color_attribute, const bke::AttrDomain color_domain, const GroupedSpan< int > vert_neighbors, const MutableSpan< float4 > smooth_colors)
void fill_factor_from_hide_and_mask(Span< bool > hide_vert, Span< float > mask, Span< int > verts, MutableSpan< float > r_factors)
void calc_brush_strength_factors(const StrokeCache &cache, const Brush &brush, Span< float > distances, MutableSpan< float > factors)
void apply_hardness_to_distances(float radius, float hardness, MutableSpan< float > distances)
GroupedSpan< int > calc_vert_neighbors(OffsetIndices< int > faces, Span< int > corner_verts, GroupedSpan< int > vert_to_face, Span< bool > hide_poly, Span< int > verts, Vector< int > &r_offset_data, Vector< int > &r_data)
void filter_distances_with_radius(float radius, Span< float > distances, MutableSpan< float > factors)
void filter_region_clip_factors(const SculptSession &ss, Span< float3 > vert_positions, Span< int > verts, MutableSpan< float > factors)
void scale_factors(MutableSpan< float > factors, float strength)
void scatter_data_mesh(Span< T > src, Span< int > indices, MutableSpan< T > dst)
Span< float4 > orig_color_data_get_mesh(const Object &object, const bke::pbvh::MeshNode &node)
void calc_brush_distances(const SculptSession &ss, Span< float3 > vert_positions, Span< int > vert, eBrushFalloffShape falloff_shape, MutableSpan< float > r_distances)
void gather_data_mesh(Span< T > src, Span< int > indices, MutableSpan< T > dst)
void calc_brush_texture_factors(const SculptSession &ss, const Brush &brush, Span< float3 > vert_positions, Span< int > vert, MutableSpan< float > factors)
void calc_front_face(const float3 &view_normal, Span< float3 > normals, MutableSpan< float > factors)
void calc_brush_cube_distances(const Brush &brush, const Span< T > positions, const MutableSpan< float > r_distances)
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)
void fill_factor_from_hide(Span< bool > hide_vert, Span< int > verts, MutableSpan< float > r_factors)
T clamp(const T &a, const T &min, const T &max)
T distance(const T &a, const T &b)
T length(const VecBase< T, Size > &a)
T dot(const QuaternionBase< T > &a, const QuaternionBase< T > &b)
MatBase< T, NumCol, NumRow > normalize(const MatBase< T, NumCol, NumRow > &a)
VecBase< T, 3 > transform_point(const CartesianBasis &basis, const VecBase< T, 3 > &v)
void parallel_for(const IndexRange range, const int64_t grain_size, const Function &function, const TaskSizeHints &size_hints=detail::TaskSizeHints_Static(1))
Value parallel_reduce(IndexRange range, int64_t grain_size, const Value &identity, const Function &function, const Reduction &reduction)
MatBase< float, 4, 4 > float4x4
VecBase< float, 4 > float4
ColorSceneLinear4f< eAlpha::Premultiplied > ColorGeometry4f
VecBase< float, 3 > float3
ColorSceneLinearByteEncoded4b< eAlpha::Premultiplied > ColorGeometry4b
static void to_static_color_type(const bke::AttrType type, const Func &func)
bool SCULPT_stroke_is_first_brush_step_of_symmetry_pass(const blender::ed::sculpt_paint::StrokeCache &cache)
void SCULPT_cube_tip_init(const Sculpt &, const Object &ob, const Brush &brush, float mat[4][4])
void SCULPT_do_paint_brush_image(const Depsgraph &depsgraph, PaintModeSettings &paint_mode_settings, const Sculpt &sd, Object &ob, const blender::IndexMask &node_mask)
bool SCULPT_use_image_paint_brush(PaintModeSettings &settings, Object &ob)
struct ColorBand * gradient
float wet_paint_radius_factor
struct CurveMapping * curve_distance_falloff
char gradient_stroke_mode
int curve_distance_falloff_preset
struct SculptSession * sculpt
blender::ed::sculpt_paint::StrokeCache * cache
const c_style_mat & ptr() const
Span< int > verts() const
VArraySpan< bool > hide_poly
VArraySpan< bool > hide_vert
std::optional< float > density_seed
struct blender::ed::sculpt_paint::StrokeCache::@216032235377206062040134367360200004271263147147 paint_brush
Array< float4 > prev_colors
float4 wet_mix_prev_color
std::unique_ptr< auto_mask::Cache > automasking
float3 last_location_symm
std::optional< blender::float3 > initial_hsv_jitter
Vector< float > distances
Vector< int > neighbor_data
Vector< float > auto_mask
Vector< float4 > new_colors
Vector< float3 > positions
Vector< float4 > mix_colors
Vector< int > neighbor_offsets