Revision: 48240
          
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=48240
Author:   nazgul
Date:     2012-06-24 15:29:43 +0000 (Sun, 24 Jun 2012)
Log Message:
-----------
Optimization of keying screen node

Use AABB check before calculating barycentric coordinates.

In simple tests with FullHD image and 4-9 tracks used for gradient
gave 1.5-2x speedup.

Modified Paths:
--------------
    
trunk/blender/source/blender/compositor/operations/COM_KeyingScreenOperation.cpp
    
trunk/blender/source/blender/compositor/operations/COM_KeyingScreenOperation.h

Modified: 
trunk/blender/source/blender/compositor/operations/COM_KeyingScreenOperation.cpp
===================================================================
--- 
trunk/blender/source/blender/compositor/operations/COM_KeyingScreenOperation.cpp
    2012-06-24 14:50:03 UTC (rev 48239)
+++ 
trunk/blender/source/blender/compositor/operations/COM_KeyingScreenOperation.cpp
    2012-06-24 15:29:43 UTC (rev 48240)
@@ -65,6 +65,9 @@
                if (triangulation->triangles)
                        MEM_freeN(triangulation->triangles);
 
+               if (triangulation->triangles_AABB)
+                       MEM_freeN(triangulation->triangles_AABB);
+
                MEM_freeN(this->cachedTriangulation);
 
                this->cachedTriangulation = NULL;
@@ -155,6 +158,33 @@
        MEM_freeN(sites);
        BLI_freelistN(&edges);
 
+       if (triangulation->triangles_total) {
+               rctf *rect;
+               rect = triangulation->triangles_AABB =
+                       (rctf *) MEM_callocN(sizeof(rctf) * 
triangulation->triangles_total, "voronoi triangulation AABB");
+
+               for (i = 0; i < triangulation->triangles_total; i++, rect++) {
+                       int *triangle = triangulation->triangles[i];
+                       VoronoiTriangulationPoint *a = 
&triangulation->triangulated_points[triangle[0]],
+                                                 *b = 
&triangulation->triangulated_points[triangle[1]],
+                                                 *c = 
&triangulation->triangulated_points[triangle[2]];
+
+                       float min[2], max[2];
+
+                       INIT_MINMAX2(min, max);
+
+                       DO_MINMAX2(a->co, min, max);
+                       DO_MINMAX2(b->co, min, max);
+                       DO_MINMAX2(c->co, min, max);
+
+                       rect->xmin = min[0];
+                       rect->ymin = min[1];
+
+                       rect->xmax = max[0];
+                       rect->ymax = max[1];
+               }
+       }
+
        return triangulation;
 }
 
@@ -203,18 +233,24 @@
        if (this->movieClip && data) {
                TriangulationData *triangulation = (TriangulationData *) data;
                int i;
+               float co[2] = {(float) x, (float) y};
+
                for (i = 0; i < triangulation->triangles_total; i++) {
-                       int *triangle = triangulation->triangles[i];
-                       VoronoiTriangulationPoint *a = 
&triangulation->triangulated_points[triangle[0]],
-                       *b = &triangulation->triangulated_points[triangle[1]],
-                       *c = &triangulation->triangulated_points[triangle[2]];
-                       float co[2] = {(float) x, (float) y}, w[3];
+                       rctf *rect = &triangulation->triangles_AABB[i];
 
-                       if (barycentric_coords_v2(a->co, b->co, c->co, co, w)) {
-                               if (barycentric_inside_triangle_v2(w)) {
-                                       color[0] += a->color[0] * w[0] + 
b->color[0] * w[1] + c->color[0] * w[2];
-                                       color[1] += a->color[1] * w[0] + 
b->color[1] * w[1] + c->color[1] * w[2];
-                                       color[2] += a->color[2] * w[0] + 
b->color[2] * w[1] + c->color[2] * w[2];
+                       if (IN_RANGE_INCL(x, rect->xmin, rect->xmax) && 
IN_RANGE_INCL(y, rect->ymin, rect->ymax)) {
+                               int *triangle = triangulation->triangles[i];
+                               VoronoiTriangulationPoint *a = 
&triangulation->triangulated_points[triangle[0]],
+                                                         *b = 
&triangulation->triangulated_points[triangle[1]],
+                                                         *c = 
&triangulation->triangulated_points[triangle[2]];
+                               float w[3];
+
+                               if (barycentric_coords_v2(a->co, b->co, c->co, 
co, w)) {
+                                       if (barycentric_inside_triangle_v2(w)) {
+                                               color[0] += a->color[0] * w[0] 
+ b->color[0] * w[1] + c->color[0] * w[2];
+                                               color[1] += a->color[1] * w[0] 
+ b->color[1] * w[1] + c->color[1] * w[2];
+                                               color[2] += a->color[2] * w[0] 
+ b->color[2] * w[1] + c->color[2] * w[2];
+                                       }
                                }
                        }
                }

Modified: 
trunk/blender/source/blender/compositor/operations/COM_KeyingScreenOperation.h
===================================================================
--- 
trunk/blender/source/blender/compositor/operations/COM_KeyingScreenOperation.h  
    2012-06-24 14:50:03 UTC (rev 48239)
+++ 
trunk/blender/source/blender/compositor/operations/COM_KeyingScreenOperation.h  
    2012-06-24 15:29:43 UTC (rev 48240)
@@ -47,6 +47,7 @@
                VoronoiTriangulationPoint *triangulated_points;
                int (*triangles)[3];
                int triangulated_points_total, triangles_total;
+               rctf *triangles_AABB;
        } TriangulationData;
 
        MovieClip *movieClip;

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to