[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [48918] trunk/blender/source/blender/ blenkernel/intern/mask_rasterize.c: add dynamic bucket xy resolution based on pixel size, also remove some redundant copying.
Campbell Barton
ideasman42 at gmail.com
Sat Jul 14 18:54:10 CEST 2012
Revision: 48918
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=48918
Author: campbellbarton
Date: 2012-07-14 16:54:10 +0000 (Sat, 14 Jul 2012)
Log Message:
-----------
add dynamic bucket xy resolution based on pixel size, also remove some redundant copying.
Modified Paths:
--------------
trunk/blender/source/blender/blenkernel/intern/mask_rasterize.c
Modified: trunk/blender/source/blender/blenkernel/intern/mask_rasterize.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/mask_rasterize.c 2012-07-14 16:03:03 UTC (rev 48917)
+++ trunk/blender/source/blender/blenkernel/intern/mask_rasterize.c 2012-07-14 16:54:10 UTC (rev 48918)
@@ -47,6 +47,7 @@
#ifndef USE_RASKTER
#define SPLINE_RESOL 32
+#define BUCKET_PIXELS_PER_CELL 8
#define SF_EDGE_IS_BOUNDARY 0xff
#define SF_KEYINDEX_TEMP_ID ((unsigned int) -1)
@@ -62,7 +63,8 @@
/**
* A single #MaskRasterHandle contains multile #MaskRasterLayer's,
* each #MaskRasterLayer does its own lookup which contributes to
- * the final pixel with its own blending mode and the final pixel is blended between these.
+ * the final pixel with its own blending mode and the final pixel
+ * is blended between these.
*/
/* internal use only */
@@ -122,30 +124,30 @@
{
const unsigned int layers_tot = mr_handle->layers_tot;
unsigned int i;
- MaskRasterLayer *raslayers = mr_handle->layers;
+ MaskRasterLayer *layer = mr_handle->layers;
/* raycast vars */
- for (i = 0; i < layers_tot; i++, raslayers++) {
+ for (i = 0; i < layers_tot; i++, layer++) {
- if (raslayers->face_array) {
- MEM_freeN(raslayers->face_array);
+ if (layer->face_array) {
+ MEM_freeN(layer->face_array);
}
- if (raslayers->face_coords) {
- MEM_freeN(raslayers->face_coords);
+ if (layer->face_coords) {
+ MEM_freeN(layer->face_coords);
}
- if (raslayers->buckets_face) {
- const unsigned int bucket_tot = raslayers->buckets_x * raslayers->buckets_y;
+ if (layer->buckets_face) {
+ const unsigned int bucket_tot = layer->buckets_x * layer->buckets_y;
unsigned int bucket_index;
for (bucket_index = 0; bucket_index < bucket_tot; bucket_index++) {
- unsigned int *face_index = raslayers->buckets_face[bucket_index];
+ unsigned int *face_index = layer->buckets_face[bucket_index];
if (face_index) {
MEM_freeN(face_index);
}
}
- MEM_freeN(raslayers->buckets_face);
+ MEM_freeN(layer->buckets_face);
}
}
@@ -154,9 +156,9 @@
}
-void maskrasterize_spline_differentiate_point_inset(float (*diff_feather_points)[2], float (*diff_points)[2],
- const unsigned int tot_diff_point, const float ofs,
- const short do_test)
+void maskrasterize_spline_differentiate_point_outset(float (*diff_feather_points)[2], float (*diff_points)[2],
+ const unsigned int tot_diff_point, const float ofs,
+ const short do_test)
{
unsigned int k_prev = tot_diff_point - 2;
unsigned int k_curr = tot_diff_point - 1;
@@ -184,7 +186,7 @@
for (k = 0; k < tot_diff_point; k++) {
- co_prev = diff_points[k_prev];
+ /* co_prev = diff_points[k_prev]; */ /* precalc */
co_curr = diff_points[k_curr];
co_next = diff_points[k_next];
@@ -209,24 +211,33 @@
/* use next iter */
copy_v2_v2(d_prev, d_next);
- k_prev = k_curr;
+ /* k_prev = k_curr; */ /* precalc */
k_curr = k_next;
k_next++;
}
}
-static void layer_bucket_init(MaskRasterLayer *layer)
+static void layer_bucket_init(MaskRasterLayer *layer, const float pixel_size)
{
MemArena *arena = BLI_memarena_new(1 << 16, __func__);
- /* TODO - calculate best bucket size */
- layer->buckets_x = 256;
- layer->buckets_y = 256;
+ {
+ const float dims[2] = {layer->bounds.xmax - layer->bounds.xmin,
+ layer->bounds.ymax - layer->bounds.ymin};
- layer->buckets_xy_scalar[0] = (1.0f / ((layer->bounds.xmax - layer->bounds.xmin) + FLT_EPSILON)) * layer->buckets_x;
- layer->buckets_xy_scalar[1] = (1.0f / ((layer->bounds.ymax - layer->bounds.ymin) + FLT_EPSILON)) * layer->buckets_y;
+ layer->buckets_x = (dims[0] / pixel_size) / (float)BUCKET_PIXELS_PER_CELL;
+ layer->buckets_y = (dims[1] / pixel_size) / (float)BUCKET_PIXELS_PER_CELL;
+// printf("bucket size %ux%u\n", layer->buckets_x, layer->buckets_y);
+
+ CLAMP(layer->buckets_x, 8, 512);
+ CLAMP(layer->buckets_y, 8, 512);
+
+ layer->buckets_xy_scalar[0] = (1.0f / (dims[0] + FLT_EPSILON)) * layer->buckets_x;
+ layer->buckets_xy_scalar[1] = (1.0f / (dims[1] + FLT_EPSILON)) * layer->buckets_y;
+ }
+
{
unsigned int *face = &layer->face_array[0][0];
float (*cos)[3] = layer->face_coords;
@@ -428,12 +439,12 @@
diff_feather_points = MEM_mallocN(sizeof(*diff_feather_points) * tot_diff_feather_points,
__func__);
/* add single pixel feather */
- maskrasterize_spline_differentiate_point_inset(diff_feather_points, diff_points,
+ maskrasterize_spline_differentiate_point_outset(diff_feather_points, diff_points,
tot_diff_point, pixel_size, FALSE);
}
else {
/* ensure single pixel feather, on any zero feather areas */
- maskrasterize_spline_differentiate_point_inset(diff_feather_points, diff_points,
+ maskrasterize_spline_differentiate_point_outset(diff_feather_points, diff_points,
tot_diff_point, pixel_size, TRUE);
}
}
@@ -505,8 +516,6 @@
rctf bounds;
int face_index;
- float bvhcos[4][3];
-
/* now we have all the splines */
face_coords = MEM_mallocN((sizeof(float) * 3) * sf_vert_tot, "maskrast_face_coords");
@@ -559,11 +568,6 @@
*(face++) = sf_edge->v2->keyindex;
*(face++) = sf_edge->v1->keyindex;
- copy_v3_v3(bvhcos[0], face_coords[*(face - 4)]);
- copy_v3_v3(bvhcos[1], face_coords[*(face - 3)]);
- copy_v3_v3(bvhcos[2], face_coords[*(face - 2)]);
- copy_v3_v3(bvhcos[3], face_coords[*(face - 1)]);
-
face_index++;
}
}
@@ -574,19 +578,19 @@
BLI_assert(face_index == sf_tri_tot + tot_feather_quads);
{
- MaskRasterLayer *raslayer = &mr_handle->layers[masklay_index];
+ MaskRasterLayer *layer = &mr_handle->layers[masklay_index];
- raslayer->face_tot = sf_tri_tot + tot_feather_quads;
- raslayer->face_coords = face_coords;
- raslayer->face_array = face_array;
- raslayer->bounds = bounds;
+ layer->face_tot = sf_tri_tot + tot_feather_quads;
+ layer->face_coords = face_coords;
+ layer->face_array = face_array;
+ layer->bounds = bounds;
/* copy as-is */
- raslayer->alpha = masklay->alpha;
- raslayer->blend = masklay->blend;
- raslayer->blend_flag = masklay->blend_flag;
+ layer->alpha = masklay->alpha;
+ layer->blend = masklay->blend;
+ layer->blend_flag = masklay->blend_flag;
- layer_bucket_init(raslayer);
+ layer_bucket_init(layer, pixel_size);
BLI_union_rctf(&mr_handle->bounds, &bounds);
}
More information about the Bf-blender-cvs
mailing list