small speedup for mask rasterizer, only do single sided check for triangle intersection.
authorCampbell Barton <ideasman42@gmail.com>
Mon, 16 Jul 2012 06:39:40 +0000 (06:39 +0000)
committerCampbell Barton <ideasman42@gmail.com>
Mon, 16 Jul 2012 06:39:40 +0000 (06:39 +0000)
source/blender/blenkernel/intern/mask_rasterize.c
source/blender/blenlib/BLI_math_geom.h
source/blender/blenlib/intern/math_geom.c

index 5c9e480..dfdcad9 100644 (file)
@@ -727,9 +727,9 @@ void BLI_maskrasterize_handle_init(MaskRasterHandle *mr_handle, struct Mask *mas
                        /* tri's */
                        face = (unsigned int *)face_array;
                        for (sf_tri = sf_ctx.fillfacebase.first, face_index = 0; sf_tri; sf_tri = sf_tri->next, face_index++) {
-                               *(face++) = sf_tri->v1->tmp.u;
-                               *(face++) = sf_tri->v2->tmp.u;
                                *(face++) = sf_tri->v3->tmp.u;
+                               *(face++) = sf_tri->v2->tmp.u;
+                               *(face++) = sf_tri->v1->tmp.u;
                                *(face++) = TRI_VERT;
                        }
 
@@ -881,7 +881,7 @@ static float maskrasterize_layer_isect(unsigned int *face, float (*cos)[3], cons
                    (cos[1][2] < dist_orig) ||
                    (cos[2][2] < dist_orig))
                {
-                       if (isect_point_tri_v2(xy, cos[face[0]], cos[face[1]], cos[face[2]])) {
+                       if (isect_point_tri_v2_cw(xy, cos[face[0]], cos[face[1]], cos[face[2]])) {
                                /* we know all tris are close for now */
                                return maskrasterize_layer_z_depth_tri(xy, cos[face[0]], cos[face[1]], cos[face[2]]);
                        }
@@ -889,7 +889,7 @@ static float maskrasterize_layer_isect(unsigned int *face, float (*cos)[3], cons
 #else
                /* we know all tris are close for now */
                if (1) {
-                       if (isect_point_tri_v2(xy, cos[face[0]], cos[face[1]], cos[face[2]])) {
+                       if (isect_point_tri_v2_cw(xy, cos[face[0]], cos[face[1]], cos[face[2]])) {
                                return 0.0f;
                        }
                }
@@ -911,6 +911,8 @@ static float maskrasterize_layer_isect(unsigned int *face, float (*cos)[3], cons
                                return maskrasterize_layer_z_depth_quad(xy, cos[face[0]], cos[face[1]], cos[face[2]], cos[face[3]]);
                        }
 #elif 1
+                       /* don't use isect_point_tri_v2_cw because we could have bowtie quads */
+
                        if (isect_point_tri_v2(xy, cos[face[0]], cos[face[1]], cos[face[2]])) {
                                return maskrasterize_layer_z_depth_tri(xy, cos[face[0]], cos[face[1]], cos[face[2]]);
                        }
index b163be4..f799b7b 100644 (file)
@@ -154,6 +154,7 @@ int isect_ray_tri_epsilon_v3(const float p1[3], const float d[3],
 int isect_point_quad_v2(const float p[2], const float a[2], const float b[2], const float c[2], const float d[2]);
 
 int isect_point_tri_v2(const float v1[2], const float v2[2], const float v3[2], const float pt[2]);
+int isect_point_tri_v2_cw(const float pt[2], const float v1[2], const float v2[2], const float v3[2]);
 int isect_point_tri_v2_int(const int x1, const int y1, const int x2, const int y2, const int a, const int b);
 int isect_point_tri_prism_v3(const float p[3], const float v1[3], const float v2[3], const float v3[3]);
 
index eb30366..661c478 100644 (file)
@@ -606,6 +606,20 @@ static short IsectLLPt2Df(const float x0, const float y0, const float x1, const
 
 /* point in tri */
 
+/* only single direction */
+int isect_point_tri_v2_cw(const float pt[2], const float v1[2], const float v2[2], const float v3[2])
+{
+       if (line_point_side_v2(v1, v2, pt) >= 0.0f) {
+               if (line_point_side_v2(v2, v3, pt) >= 0.0f) {
+                       if (line_point_side_v2(v3, v1, pt) >= 0.0f) {
+                               return 1;
+                       }
+               }
+       }
+
+       return 0;
+}
+
 int isect_point_tri_v2(const float pt[2], const float v1[2], const float v2[2], const float v3[2])
 {
        if (line_point_side_v2(v1, v2, pt) >= 0.0f) {