49 for (
const int i :
verts.index_range()) {
96 const GSpan color_attribute,
100 const T *colors_typed =
static_cast<const T *
>(color_attribute.
data());
103 for (
const int face : vert_to_face_map[vert]) {
105 r_color +=
to_float(colors_typed[corner]);
107 return r_color / float(vert_to_face_map[vert].
size());
109 return to_float(colors_typed[vert]);
122 for (
const int i_face : vert_to_face_map[vert]) {
128 if (face_verts[
i] == vert) {
142 const GSpan color_attribute,
148 using T = decltype(dummy);
149 color = color_vert_get<T>(
150 faces, corner_verts, vert_to_face_map, color_attribute, color_domain, vert);
164 using T = decltype(dummy);
166 faces, corner_verts, vert_to_face_map, color_attribute, color_domain, vert, color);
175 using T = decltype(dummy);
176 T *colors_typed = static_cast<T *>(color_attribute.data());
177 for (const int i : indices.index_range()) {
178 T temp = colors_typed[indices[i]];
179 from_float(r_colors[i], colors_typed[indices[i]]);
180 r_colors[i] = to_float(temp);
190 using T = decltype(dummy);
191 const T *colors_typed = static_cast<const T *>(color_attribute.data());
192 for (const int i : indices.index_range()) {
193 r_colors[i] = to_float(colors_typed[indices[i]]);
201 const GSpan color_attribute,
211 using T = decltype(dummy);
212 for (const int i : verts.index_range()) {
213 r_colors[i] = color_vert_get<T>(
214 faces, corner_verts, vert_to_face_map, color_attribute, color_domain, verts[i]);
311 for (
const int i :
verts.index_range()) {
315 color_attribute.
span,
333 color_attribute.
span,
342 for (
const int i :
verts.index_range()) {
349 color_attribute.
span);
365 const float4 wet_mix_sampled_color,
420 if (density < 1.0f) {
423 for (
const int i :
verts.index_range()) {
425 if (hash_noise > density) {
426 const float noise = density * hash_noise;
438 const std::optional<BrushColorJitterSettings> color_jitter_settings =
440 if (color_jitter_settings) {
448 float4 brush_color(brush_color_rgb, 1.0f);
474 for (
const int i :
verts.index_range()) {
478 color_attribute.
span,
483 for (
const int i :
verts.index_range()) {
496 const float4 buffer_color =
float4(color_buffer[
i]) * alpha * automasking;
504 for (
const int i :
verts.index_range()) {
511 color_attribute.
span);
526 const GSpan color_attribute,
548 for (
const int i :
verts.index_range()) {
549 if (factors[
i] > 0.0f) {
551 faces, corner_verts, vert_to_face_map, color_attribute, color_domain,
verts[
i]);
605 if (!color_attribute) {
642 ColorPaintLocalData &tls = all_tls.local();
643 node_mask.slice(range).foreach_index([&](const int i) {
644 do_sample_wet_paint_task(ob,
649 attribute_data.hide_vert,
650 color_attribute.span,
651 color_attribute.domain,
666 if (swptd.tot_samples > 0 &&
is_finite_v4(swptd.color)) {
667 wet_color =
math::clamp(swptd.color /
float(swptd.tot_samples), 0.0f, 1.0f);
680 if (ss.cache->paint_brush.mix_colors.is_empty()) {
685 node_mask.foreach_index(
GrainSize(1), [&](
const int i) {
686 ColorPaintLocalData &tls = all_tls.
local();
687 do_paint_brush_task(scene,
702 ss.cache->paint_brush.mix_colors,
705 pbvh.tag_attribute_changed(node_mask, mesh.active_color_attribute);
706 color_attribute.finish();
760 for (
const int i :
verts.index_range()) {
761 if (factors[
i] == 0.0f) {
764 const int vert =
verts[
i];
765 const float3 &no = vert_normals[vert];
770 current_disp = brush_delta;
781 current_disp += no * -
math::dot(current_disp, no);
785 current_disp = current_disp_norm * strength;
800 faces, corner_verts, vert_to_face_map, attribute_data.
hide_poly, vert, neighbors))
802 const float3 &nco = vert_positions[neighbor];
810 if (neighbor_neighbor == vert) {
814 float3 vert_disp = vert_positions[neighbor_neighbor] - vert_positions[vert];
835 vert_disp += no * -
math::dot(no, vert_disp);
838 if (
math::dot(current_disp_norm, vert_disp_norm) >= 0.0f) {
843 float color_interp = -
math::dot(current_disp_norm, vert_disp_norm);
846 w *= color_interp * color_interp;
848 accum += neighbor_color *
w;
858 faces, corner_verts, vert_to_face_map, color_attribute.
span, color_attribute.
domain, vert);
866 color_attribute.
span);
893 if (!color_attribute) {
900 for (const int vert : range) {
901 ss.cache->paint_brush.prev_colors[vert] = color_vert_get(faces,
904 color_attribute.span,
905 color_attribute.domain,
914 if (ss.cache->alt_smooth) {
916 node_mask.foreach_index(
GrainSize(1), [&](
const int i) {
917 ColorPaintLocalData &tls = all_tls.
local();
934 node_mask.foreach_index(
GrainSize(1), [&](
const int i) {
936 ss.cache->paint_brush.prev_colors[vert] = color_vert_get(
faces,
939 color_attribute.span,
940 color_attribute.domain,
944 threading::EnumerableThreadSpecific<ColorPaintLocalData> all_tls;
945 node_mask.foreach_index(
GrainSize(1), [&](
const int i) {
946 ColorPaintLocalData &tls = all_tls.local();
961 pbvh.tag_attribute_changed(node_mask, mesh.active_color_attribute);
962 color_attribute.finish();
#define ATTR_DOMAIN_MASK_COLOR
#define ATTR_DOMAIN_AS_MASK(domain)
const float * BKE_brush_secondary_color_get(const Scene *scene, const Paint *paint, const Brush *brush)
const std::optional< BrushColorJitterSettings > BKE_brush_color_jitter_get_settings(const Scene *scene, const Paint *paint, const Brush *brush)
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_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.
#define CD_TYPE_AS_MASK(_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])
void rgba_uchar_to_float(float r_col[4], const unsigned char col_ub[4])
void rgba_float_to_uchar(unsigned char r_col[4], const float col_f[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
BLI_INLINE void IMB_colormanagement_srgb_to_scene_linear_v3(float scene_linear[3], const float srgb[3])
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
#define CD_MASK_COLOR_ALL
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)
bke::GSpanAttributeWriter active_color_attribute_for_write(Mesh &mesh)
static void do_paint_brush_task(const Scene &scene, 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)
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 do_paint_brush(const Scene &scene, const Depsgraph &depsgraph, PaintModeSettings &paint_mode_settings, const Sculpt &sd, Object &ob, const IndexMask &node_mask, const IndexMask &texnode_mask)
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)
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 eCustomDataType 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 Scene &scene, 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
char gradient_stroke_mode
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
Array< float4 > prev_colors
float4 wet_mix_prev_color
std::unique_ptr< auto_mask::Cache > automasking
struct blender::ed::sculpt_paint::StrokeCache::@140233062077157027106001372232256125135050036057 paint_brush
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