[Bf-blender-cvs] [b164806606b] temp-3d-texturing-brush-b: texture painting.
Jeroen Bakker
noreply at git.blender.org
Fri Mar 4 14:14:29 CET 2022
Commit: b164806606bccfa87fe8fb55bd0d3919b3d1d16d
Author: Jeroen Bakker
Date: Fri Mar 4 14:14:14 2022 +0100
Branches: temp-3d-texturing-brush-b
https://developer.blender.org/rBb164806606bccfa87fe8fb55bd0d3919b3d1d16d
texture painting.
===================================================================
M source/blender/editors/sculpt_paint/sculpt_texture_paint.cc
M source/blender/imbuf/intern/rasterizer_blending.hh
M source/blender/makesrna/intern/rna_brush.c
===================================================================
diff --git a/source/blender/editors/sculpt_paint/sculpt_texture_paint.cc b/source/blender/editors/sculpt_paint/sculpt_texture_paint.cc
index ada1cc1dd43..25e668fd100 100644
--- a/source/blender/editors/sculpt_paint/sculpt_texture_paint.cc
+++ b/source/blender/editors/sculpt_paint/sculpt_texture_paint.cc
@@ -6,15 +6,19 @@
*/
#include "DNA_material_types.h"
+#include "DNA_mesh_types.h"
#include "DNA_meshdata_types.h"
#include "DNA_scene_types.h"
#include "DNA_windowmanager_types.h"
+#include "BKE_brush.h"
#include "BKE_context.h"
+#include "BKE_customdata.h"
#include "BKE_image.h"
#include "BKE_material.h"
#include "BKE_mesh.h"
#include "BKE_mesh_mapping.h"
+#include "BKE_pbvh.h"
#include "BLI_task.h"
@@ -34,45 +38,58 @@ using namespace imbuf::rasterizer;
struct VertexInput {
float2 uv;
+ float strength;
- VertexInput(float2 uv) : uv(uv)
+ VertexInput(float2 uv, float strength) : uv(uv), strength(strength)
{
}
};
-class VertexShader : public AbstractVertexShader<VertexInput, int> {
+class VertexShader : public AbstractVertexShader<VertexInput, float> {
public:
float2 image_size;
void vertex(const VertexInputType &input, VertexOutputType *r_output) override
{
r_output->coord = input.uv * image_size;
+ r_output->data = input.strength;
}
};
-class FragmentShader : public AbstractFragmentShader<int, float4> {
+class FragmentShader : public AbstractFragmentShader<float, float4> {
public:
float4 color;
- void fragment(const FragmentInputType &UNUSED(input), FragmentOutputType *r_output) override
+ void fragment(const FragmentInputType &input, FragmentOutputType *r_output) override
{
copy_v4_v4(*r_output, color);
+ (*r_output)[3] = input;
}
};
-using RasterizerType = Rasterizer<VertexShader, FragmentShader>;
+using RasterizerType = Rasterizer<VertexShader, FragmentShader, AlphaBlendMode>;
static void do_task_cb_ex(void *__restrict userdata,
const int n,
const TaskParallelTLS *__restrict UNUSED(tls))
{
SculptThreadedTaskData *data = static_cast<SculptThreadedTaskData *>(userdata);
- SculptSession *ss = data->ob->sculpt;
- // const Brush *brush = data->brush;
+ Object *ob = data->ob;
+ SculptSession *ss = ob->sculpt;
+ StrokeCache *cache = ss->cache;
+ const Brush *brush = data->brush;
// ss->cache->bstrength;
ImBuf *drawing_target = ss->mode.texture_paint.drawing_target;
RasterizerType rasterizer;
+
+ Mesh *mesh = static_cast<Mesh *>(ob->data);
+ MLoopUV *ldata_uv = static_cast<MLoopUV *>(CustomData_get_layer(&mesh->ldata, CD_MLOOPUV));
+ if (ldata_uv == nullptr) {
+ return;
+ }
+
rasterizer.activate_drawing_target(drawing_target);
rasterizer.vertex_shader().image_size = float2(drawing_target->x, drawing_target->y);
- rasterizer.fragment_shader().color = float4(1.0f, 1.0f, 1.0f, 1.0f);
+ srgb_to_linearrgb_v3_v3(rasterizer.fragment_shader().color, brush->rgb);
+ rasterizer.fragment_shader().color[3] = 1.0;
PBVHVertexIter vd;
@@ -86,6 +103,9 @@ static void do_task_cb_ex(void *__restrict userdata,
MeshElemMap *vert_map = &ss->pmap[vd.index];
for (int j = 0; j < ss->pmap[vd.index].count; j++) {
const MPoly *p = &ss->mpoly[vert_map->indices[j]];
+ if (p->totloop < 3) {
+ continue;
+ }
float poly_center[3];
const MLoop *loopstart = &ss->mloop[p->loopstart];
@@ -94,14 +114,17 @@ static void do_task_cb_ex(void *__restrict userdata,
if (!sculpt_brush_test_sq_fn(&test, poly_center)) {
continue;
}
- if (p->totloop < 3) {
- continue;
+ const float strength = BKE_brush_curve_strength(brush, sqrtf(test.dist), cache->radius);
+
+ for (int triangle = 0; triangle < p->totloop - 2; triangle++) {
+ const int v1_index = p->loopstart; // loopstart[0].v;
+ const int v2_index = p->loopstart + triangle + 1; // loopstart[triangle + 1].v;
+ const int v3_index = p->loopstart + triangle + 2; // loopstart[triangle + 2].v;
+ VertexInput v1(ldata_uv[v1_index].uv, strength);
+ VertexInput v2(ldata_uv[v2_index].uv, strength);
+ VertexInput v3(ldata_uv[v3_index].uv, strength);
+ rasterizer.draw_triangle(v1, v2, v3);
}
-
- VertexInput v1(mvert[loopstart[0].v].co);
- VertexInput v2(mvert[loopstart[1].v].co);
- VertexInput v3(mvert[loopstart[2].v].co);
- rasterizer.draw_triangle(v1, v2, v3);
}
}
BKE_pbvh_vertex_iter_end;
@@ -136,10 +159,12 @@ void SCULPT_do_texture_paint_brush(Sculpt *sd, Object *ob, PBVHNode **nodes, int
data.nodes = nodes;
TaskParallelSettings settings;
- BKE_pbvh_parallel_range_settings(&settings, false, totnode);
+ BKE_pbvh_parallel_range_settings(&settings, true, totnode);
BLI_task_parallel_range(0, totnode, &data, do_task_cb_ex, &settings);
BKE_image_release_ibuf(image, image_buffer, lock);
+ // TODO(do partial update
+ BKE_image_partial_update_mark_full_update(image);
ss->mode.texture_paint.drawing_target = nullptr;
}
}
diff --git a/source/blender/imbuf/intern/rasterizer_blending.hh b/source/blender/imbuf/intern/rasterizer_blending.hh
index 14dbaadfc95..7278d917d8f 100644
--- a/source/blender/imbuf/intern/rasterizer_blending.hh
+++ b/source/blender/imbuf/intern/rasterizer_blending.hh
@@ -29,4 +29,13 @@ class CopyBlendMode : public AbstractBlendMode<float4, float> {
}
};
+class AlphaBlendMode : public AbstractBlendMode<float4, float> {
+ public:
+ void blend(float *dest, const float4 &source) const override
+ {
+ interp_v3_v3v3(dest, dest, source, source[3]);
+ dest[3] = 1.0;
+ }
+};
+
} // namespace blender::imbuf::rasterizer
diff --git a/source/blender/makesrna/intern/rna_brush.c b/source/blender/makesrna/intern/rna_brush.c
index b9666469eaf..1ba688d7c30 100644
--- a/source/blender/makesrna/intern/rna_brush.c
+++ b/source/blender/makesrna/intern/rna_brush.c
@@ -467,7 +467,7 @@ static bool rna_BrushCapabilitiesSculpt_has_sculpt_plane_get(PointerRNA *ptr)
static bool rna_BrushCapabilitiesSculpt_has_color_get(PointerRNA *ptr)
{
Brush *br = (Brush *)ptr->data;
- return ELEM(br->sculpt_tool, SCULPT_TOOL_PAINT);
+ return ELEM(br->sculpt_tool, SCULPT_TOOL_PAINT, SCULPT_TOOL_TEXTURE_PAINT);
}
static bool rna_BrushCapabilitiesSculpt_has_secondary_color_get(PointerRNA *ptr)
More information about the Bf-blender-cvs
mailing list