[Bf-blender-cvs] [145edbe4e03] temp-3d-texturing-brush-b: Rename members + adding operators.
Jeroen Bakker
noreply at git.blender.org
Wed Mar 16 14:10:47 CET 2022
Commit: 145edbe4e036805b5a1f469202f23e701e2a91f4
Author: Jeroen Bakker
Date: Wed Mar 16 08:14:54 2022 +0100
Branches: temp-3d-texturing-brush-b
https://developer.blender.org/rB145edbe4e036805b5a1f469202f23e701e2a91f4
Rename members + adding operators.
===================================================================
M release/scripts/addons
M source/blender/editors/sculpt_paint/sculpt_texture_paint_d.cc
M source/blender/editors/sculpt_paint/sculpt_texture_paint_intern.hh
M source/blender/editors/sculpt_paint/sculpt_texture_paint_pixel_extraction_d.cc
M source/tools
===================================================================
diff --git a/release/scripts/addons b/release/scripts/addons
index c34f0b90d49..1cf57247c7c 160000
--- a/release/scripts/addons
+++ b/release/scripts/addons
@@ -1 +1 @@
-Subproject commit c34f0b90d49938eccf9c1a9ae59b055155e00f9b
+Subproject commit 1cf57247c7ca13c5dc185baae2201f554f85df50
diff --git a/source/blender/editors/sculpt_paint/sculpt_texture_paint_d.cc b/source/blender/editors/sculpt_paint/sculpt_texture_paint_d.cc
index f4dc3f74504..6232ca7c7dd 100644
--- a/source/blender/editors/sculpt_paint/sculpt_texture_paint_d.cc
+++ b/source/blender/editors/sculpt_paint/sculpt_texture_paint_d.cc
@@ -64,7 +64,7 @@ static Pixel get_start_pixel(const PixelsPackage &encoded_pixels,
const MVert *mvert,
const MLoopUV *ldata_uv)
{
- return init_pixel(triangle, encoded_pixels.start_edge_coord, mvert, ldata_uv);
+ return init_pixel(triangle, encoded_pixels.start_barycentric_coord, mvert, ldata_uv);
}
static Pixel get_delta_pixel(const PixelsPackage &encoded_pixels,
@@ -76,16 +76,8 @@ static Pixel get_delta_pixel(const PixelsPackage &encoded_pixels,
)
{
Pixel result = init_pixel(
- triangle, encoded_pixels.start_edge_coord + triangle.add_edge_coord_x, mvert, ldata_uv);
- result.pos -= start_pixel.pos;
- result.uv -= start_pixel.uv;
- return result;
-}
-
-static void add(Pixel &dst, const Pixel &lh)
-{
- dst.pos += lh.pos;
- dst.uv += lh.uv;
+ triangle, encoded_pixels.start_barycentric_coord + triangle.add_barycentric_coord_x, mvert, ldata_uv);
+ return result - start_pixel;
}
static void do_vertex_brush_test(void *__restrict userdata,
@@ -184,13 +176,13 @@ static void do_task_cb_ex(void *__restrict userdata,
Triangle &triangle = node_data->triangles[encoded_pixels.triangle_index];
int pixel_offset = encoded_pixels.start_image_coordinate.y * image_buffer->x +
encoded_pixels.start_image_coordinate.x;
- float3 edge_coord = encoded_pixels.start_edge_coord;
+ float3 edge_coord = encoded_pixels.start_barycentric_coord;
Pixel pixel = get_start_pixel(encoded_pixels, triangle, mvert, ldata_uv);
const Pixel add_pixel = get_delta_pixel(encoded_pixels, triangle, pixel, mvert, ldata_uv);
bool pixels_painted = false;
for (int x = 0; x < encoded_pixels.num_pixels; x++) {
if (!sculpt_brush_test_sq_fn(&test, pixel.pos)) {
- add(pixel, add_pixel);
+ pixel += add_pixel;
pixel_offset += 1;
continue;
}
@@ -213,8 +205,8 @@ static void do_task_cb_ex(void *__restrict userdata,
blend_color_interpolate_float(color, color, brush_linear, falloff_strength * brush_strength);
pixels_painted = true;
- edge_coord += triangle.add_edge_coord_x;
- add(pixel, add_pixel);
+ edge_coord += triangle.add_barycentric_coord_x;
+ pixel += add_pixel;
pixel_offset++;
}
diff --git a/source/blender/editors/sculpt_paint/sculpt_texture_paint_intern.hh b/source/blender/editors/sculpt_paint/sculpt_texture_paint_intern.hh
index e287d04b676..eba2c1aeff6 100644
--- a/source/blender/editors/sculpt_paint/sculpt_texture_paint_intern.hh
+++ b/source/blender/editors/sculpt_paint/sculpt_texture_paint_intern.hh
@@ -7,20 +7,52 @@ struct Triangle {
int3 loop_indices;
int3 vert_indices;
int poly_index;
- float3 add_edge_coord_x;
+ float3 add_barycentric_coord_x;
float automasking_factor;
};
+/**
+ * Encode multiple sequential pixels to reduce memory footprint.
+ *
+ * Memory footprint can be reduced more.
+ * - Only store 2 barycentric coordinates. the third one can be extracted
+ * from the 2 known ones.
+ * - start_image_coordinate can be a delta encoded with the previous package.
+ * initial coordinate could be at the triangle level or pbvh.
+ * - num_pixels could be delta encoded or at least be a short.
+ * - triangle index could be delta encoded.
+ * - encode everything in using variable bits per structure.
+ * first byte would indicate the number of bytes used per element.
+ */
struct PixelsPackage {
+ /** Image coordinate starting of the first encoded pixel. */
int2 start_image_coordinate;
- float3 start_edge_coord;
+ /** Barycentric coordinate of the first encoded pixel. */
+ float3 start_barycentric_coord;
+ /** Number of sequetial pixels encoded in this package. */
int num_pixels;
+ /** Reference to the pbvh triangle index. */
int triangle_index;
};
struct Pixel {
float3 pos;
float2 uv;
+
+ Pixel &operator+=(const Pixel &other)
+ {
+ pos += other.pos;
+ uv += other.uv;
+ return *this;
+ }
+
+ Pixel operator-(const Pixel &other)
+ {
+ Pixel result;
+ result.pos = pos - other.pos;
+ result.uv = uv - other.uv;
+ return result;
+ }
};
struct PixelData {
diff --git a/source/blender/editors/sculpt_paint/sculpt_texture_paint_pixel_extraction_d.cc b/source/blender/editors/sculpt_paint/sculpt_texture_paint_pixel_extraction_d.cc
index 389650d6472..87b1cb5708a 100644
--- a/source/blender/editors/sculpt_paint/sculpt_texture_paint_pixel_extraction_d.cc
+++ b/source/blender/editors/sculpt_paint/sculpt_texture_paint_pixel_extraction_d.cc
@@ -80,18 +80,18 @@ static void extract_barycentric_edges(NodeData *node_data,
const float add_v = 1.0 / image_buffer->y;
float2 min_uv(minu, minv);
- float3 start_edge_coord = barycentric_weights(uvs[0], uvs[1], uvs[2], min_uv);
- float3 add_edge_coord_x = barycentric_weights(
+ float3 start_barycentric_coord = barycentric_weights(uvs[0], uvs[1], uvs[2], min_uv);
+ float3 add_barycentric_coord_x = barycentric_weights(
uvs[0], uvs[1], uvs[2], min_uv + float2(add_u, 0.0)) -
- start_edge_coord;
+ start_barycentric_coord;
float3 add_edge_coord_y = barycentric_weights(
uvs[0], uvs[1], uvs[2], min_uv + float2(0.0, add_v)) -
- start_edge_coord;
+ start_barycentric_coord;
- triangle.add_edge_coord_x = add_edge_coord_x;
+ triangle.add_barycentric_coord_x = add_barycentric_coord_x;
for (int y = miny; y < maxy; y++) {
- float3 start_y_edge_coord = start_edge_coord + add_edge_coord_y * (y - miny);
+ float3 start_y_edge_coord = start_barycentric_coord + add_edge_coord_y * (y - miny);
float3 edge_coord = start_y_edge_coord;
int start_x = -1;
@@ -102,15 +102,15 @@ static void extract_barycentric_edges(NodeData *node_data,
start_x = x;
break;
}
- edge_coord += add_edge_coord_x;
+ edge_coord += add_barycentric_coord_x;
}
- edge_coord += add_edge_coord_x;
+ edge_coord += add_barycentric_coord_x;
x += 1;
for (; x < maxx; x++) {
if (!is_inside_triangle(edge_coord)) {
break;
}
- edge_coord += add_edge_coord_x;
+ edge_coord += add_barycentric_coord_x;
}
end_x = x;
@@ -122,7 +122,7 @@ static void extract_barycentric_edges(NodeData *node_data,
PixelsPackage package;
package.start_image_coordinate = int2(start_x, y);
- package.start_edge_coord = start_y_edge_coord + add_edge_coord_x * (start_x - minx);
+ package.start_barycentric_coord = start_y_edge_coord + add_barycentric_coord_x * (start_x - minx);
package.triangle_index = triangle_index;
package.num_pixels = num_pixels;
node_data->encoded_pixels.append(package);
@@ -155,7 +155,7 @@ static void extract_barycentric_pixels(NodeData *node_data,
if (!start_detected && is_inside) {
start_detected = true;
package.start_image_coordinate = int2(x, y);
- package.start_edge_coord = barycentric;
+ package.start_barycentric_coord = barycentric;
}
else if (start_detected && !is_inside) {
break;
@@ -167,7 +167,7 @@ static void extract_barycentric_pixels(NodeData *node_data,
}
package.num_pixels = x - package.start_image_coordinate.x;
if (package.num_pixels > best_num_pixels) {
- triangle.add_edge_coord_x = (barycentric - package.start_edge_coord) / package.num_pixels;
+ triangle.add_barycentric_coord_x = (barycentric - package.start_barycentric_coord) / package.num_pixels;
best_num_pixels = package.num_pixels;
}
node_data->encoded_pixels.append(package);
diff --git a/source/tools b/source/tools
index 91c5bc34c0a..5715a567950 160000
--- a/source/tools
+++ b/source/tools
@@ -1 +1 @@
-Subproject commit 91c5bc34c0a49f89f19e1c656c195968617cff61
+Subproject commit 5715a567950258c17089c9b9cb175a6ef8c602ce
More information about the Bf-blender-cvs
mailing list