[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [48949] trunk/blender/source/blender: small speedup for mask rasterizer, only do single sided check for triangle intersection.

Campbell Barton ideasman42 at gmail.com
Mon Jul 16 08:39:40 CEST 2012


Revision: 48949
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=48949
Author:   campbellbarton
Date:     2012-07-16 06:39:40 +0000 (Mon, 16 Jul 2012)
Log Message:
-----------
small speedup for mask rasterizer, only do single sided check for triangle intersection.

Modified Paths:
--------------
    trunk/blender/source/blender/blenkernel/intern/mask_rasterize.c
    trunk/blender/source/blender/blenlib/BLI_math_geom.h
    trunk/blender/source/blender/blenlib/intern/math_geom.c

Modified: trunk/blender/source/blender/blenkernel/intern/mask_rasterize.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/mask_rasterize.c	2012-07-16 03:43:57 UTC (rev 48948)
+++ trunk/blender/source/blender/blenkernel/intern/mask_rasterize.c	2012-07-16 06:39:40 UTC (rev 48949)
@@ -727,9 +727,9 @@
 			/* 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->v3->tmp.u;
+				*(face++) = sf_tri->v2->tmp.u;
 				*(face++) = sf_tri->v1->tmp.u;
-				*(face++) = sf_tri->v2->tmp.u;
-				*(face++) = sf_tri->v3->tmp.u;
 				*(face++) = TRI_VERT;
 			}
 
@@ -881,7 +881,7 @@
 		    (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 @@
 #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 @@
 				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]]);
 			}

Modified: trunk/blender/source/blender/blenlib/BLI_math_geom.h
===================================================================
--- trunk/blender/source/blender/blenlib/BLI_math_geom.h	2012-07-16 03:43:57 UTC (rev 48948)
+++ trunk/blender/source/blender/blenlib/BLI_math_geom.h	2012-07-16 06:39:40 UTC (rev 48949)
@@ -154,6 +154,7 @@
 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]);
 

Modified: trunk/blender/source/blender/blenlib/intern/math_geom.c
===================================================================
--- trunk/blender/source/blender/blenlib/intern/math_geom.c	2012-07-16 03:43:57 UTC (rev 48948)
+++ trunk/blender/source/blender/blenlib/intern/math_geom.c	2012-07-16 06:39:40 UTC (rev 48949)
@@ -606,6 +606,20 @@
 
 /* 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) {




More information about the Bf-blender-cvs mailing list