Revision: 17548
          
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=17548
Author:   campbellbarton
Date:     2008-11-24 06:58:00 +0100 (Mon, 24 Nov 2008)

Log Message:
-----------
painting onto faces was broken when the UV's or faces were flipped, reversing 
the order that LSCM and many other tools give.

Modified Paths:
--------------
    branches/projection-paint/source/blender/src/imagepaint.c

Modified: branches/projection-paint/source/blender/src/imagepaint.c
===================================================================
--- branches/projection-paint/source/blender/src/imagepaint.c   2008-11-24 
03:26:26 UTC (rev 17547)
+++ branches/projection-paint/source/blender/src/imagepaint.c   2008-11-24 
05:58:00 UTC (rev 17548)
@@ -1745,7 +1745,8 @@
                float bucket_bounds[4],
                float *v1coSS, float *v2coSS, float *v3coSS,
                float *uv1co, float *uv2co, float *uv3co,
-               float bucket_bounds_uv[4][2]
+               float bucket_bounds_uv[4][2],
+               int flip
        )
 {
        float uv[2];
@@ -1755,22 +1756,22 @@
        uv[0] = bucket_bounds[PROJ_BUCKET_RIGHT];
        uv[1] = bucket_bounds[PROJ_BUCKET_BOTTOM];
        BarycentricWeightsSimple2f(v1coSS, v2coSS, v3coSS, uv, w);      
-       Vec2Weightf(bucket_bounds_uv[0], uv1co, uv2co, uv3co, w);
+       Vec2Weightf(bucket_bounds_uv[flip?3:0], uv1co, uv2co, uv3co, w);
 
        //uv[0] = bucket_bounds[PROJ_BUCKET_RIGHT]; // set above
        uv[1] = bucket_bounds[PROJ_BUCKET_TOP];
        BarycentricWeightsSimple2f(v1coSS, v2coSS, v3coSS, uv, w);
-       Vec2Weightf(bucket_bounds_uv[1], uv1co, uv2co, uv3co, w);
+       Vec2Weightf(bucket_bounds_uv[flip?2:1], uv1co, uv2co, uv3co, w);
 
        uv[0] = bucket_bounds[PROJ_BUCKET_LEFT];
        //uv[1] = bucket_bounds[PROJ_BUCKET_TOP]; // set above
        BarycentricWeightsSimple2f(v1coSS, v2coSS, v3coSS, uv, w);
-       Vec2Weightf(bucket_bounds_uv[2], uv1co, uv2co, uv3co, w);
+       Vec2Weightf(bucket_bounds_uv[flip?1:2], uv1co, uv2co, uv3co, w);
 
        //uv[0] = bucket_bounds[PROJ_BUCKET_LEFT]; // set above
        uv[1] = bucket_bounds[PROJ_BUCKET_BOTTOM];
        BarycentricWeightsSimple2f(v1coSS, v2coSS, v3coSS, uv, w);
-       Vec2Weightf(bucket_bounds_uv[3], uv1co, uv2co, uv3co, w);
+       Vec2Weightf(bucket_bounds_uv[flip?0:3], uv1co, uv2co, uv3co, w);
 }
 
 /* same as above but use BarycentricWeightsPersp2f */
@@ -1778,7 +1779,8 @@
                float bucket_bounds[4],
                float *v1coSS, float *v2coSS, float *v3coSS,
                float *uv1co, float *uv2co, float *uv3co,
-               float bucket_bounds_uv[4][2]
+               float bucket_bounds_uv[4][2],
+               int flip
        )
 {
        float uv[2];
@@ -1788,22 +1790,22 @@
        uv[0] = bucket_bounds[PROJ_BUCKET_RIGHT];
        uv[1] = bucket_bounds[PROJ_BUCKET_BOTTOM];
        BarycentricWeightsSimplePersp2f(v1coSS, v2coSS, v3coSS, uv, w); 
-       Vec2Weightf(bucket_bounds_uv[0], uv1co, uv2co, uv3co, w);
+       Vec2Weightf(bucket_bounds_uv[flip?3:0], uv1co, uv2co, uv3co, w);
 
        //uv[0] = bucket_bounds[PROJ_BUCKET_RIGHT]; // set above
        uv[1] = bucket_bounds[PROJ_BUCKET_TOP];
        BarycentricWeightsSimplePersp2f(v1coSS, v2coSS, v3coSS, uv, w);
-       Vec2Weightf(bucket_bounds_uv[1], uv1co, uv2co, uv3co, w);
+       Vec2Weightf(bucket_bounds_uv[flip?2:1], uv1co, uv2co, uv3co, w);
 
        uv[0] = bucket_bounds[PROJ_BUCKET_LEFT];
        //uv[1] = bucket_bounds[PROJ_BUCKET_TOP]; // set above
        BarycentricWeightsSimplePersp2f(v1coSS, v2coSS, v3coSS, uv, w);
-       Vec2Weightf(bucket_bounds_uv[2], uv1co, uv2co, uv3co, w);
+       Vec2Weightf(bucket_bounds_uv[flip?1:2], uv1co, uv2co, uv3co, w);
 
        //uv[0] = bucket_bounds[PROJ_BUCKET_LEFT]; // set above
        uv[1] = bucket_bounds[PROJ_BUCKET_BOTTOM];
        BarycentricWeightsSimplePersp2f(v1coSS, v2coSS, v3coSS, uv, w);
-       Vec2Weightf(bucket_bounds_uv[3], uv1co, uv2co, uv3co, w);
+       Vec2Weightf(bucket_bounds_uv[flip?0:3], uv1co, uv2co, uv3co, w);
 }
 
 /* This works as we need it to but we can save a few steps and not use it */
@@ -1829,6 +1831,7 @@
 ) {
        int inside_bucket_flag = 0;
        int inside_face_flag = 0;
+       int flip = ((SIDE_OF_LINE(v1coSS, v2coSS, v3coSS) > 0.0f) != 
(SIDE_OF_LINE(uv1co, uv2co, uv3co) > 0.0f));
        
        float uv[2];
        float bucket_bounds_ss[4][2];
@@ -1849,15 +1852,16 @@
        
        if (inside_bucket_flag == ISECT_ALL3) {
                /* all screenspace points are inside the bucket bounding box, 
this means we dont need to clip and can simply return the UVs */
-               if (SIDE_OF_LINE(v1coSS, v2coSS, v3coSS) > 0.0f) { /* facing 
the back? */ 
+               if (flip) { /* facing the back? */
+                       VECCOPY2D(bucket_bounds_uv[0], uv3co);
+                       VECCOPY2D(bucket_bounds_uv[1], uv2co);
+                       VECCOPY2D(bucket_bounds_uv[2], uv1co);
+               } else {
                        VECCOPY2D(bucket_bounds_uv[0], uv1co);
                        VECCOPY2D(bucket_bounds_uv[1], uv2co);
                        VECCOPY2D(bucket_bounds_uv[2], uv3co);
-               } else {
-                       VECCOPY2D(bucket_bounds_uv[0], uv3co);
-                       VECCOPY2D(bucket_bounds_uv[1], uv2co);
-                       VECCOPY2D(bucket_bounds_uv[2], uv1co);
                }
+               
                *tot = 3; 
                return;
        }
@@ -1881,8 +1885,10 @@
        
        if ( inside_face_flag == ISECT_ALL4 ) {
                /* bucket is totally inside the screenspace face, we can safely 
use weights */
-               if (is_ortho)   rect_to_uvspace_ortho(bucket_bounds, v1coSS, 
v2coSS, v3coSS, uv1co, uv2co, uv3co, bucket_bounds_uv);
-               else                    rect_to_uvspace_persp(bucket_bounds, 
v1coSS, v2coSS, v3coSS, uv1co, uv2co, uv3co, bucket_bounds_uv);
+               
+               if (is_ortho)   rect_to_uvspace_ortho(bucket_bounds, v1coSS, 
v2coSS, v3coSS, uv1co, uv2co, uv3co, bucket_bounds_uv, flip);
+               else                    rect_to_uvspace_persp(bucket_bounds, 
v1coSS, v2coSS, v3coSS, uv1co, uv2co, uv3co, bucket_bounds_uv, flip);
+               
                *tot = 4;
                return;
        } else {
@@ -1973,6 +1979,8 @@
                        vClipSS_B[0] = isectVCosSS[i][0] - cent[0];
                        vClipSS_B[1] = isectVCosSS[i][1] - cent[1];
                        isectVAngles[i] = -atan2(vClipSS_A[0]*vClipSS_B[1] - 
vClipSS_A[1]*vClipSS_B[0], vClipSS_A[0]*vClipSS_B[0]+vClipSS_A[1]*vClipSS_B[1]);
+                       if (flip)
+                               isectVAngles[i] = -isectVAngles[i];
                } 
 #endif /* end abuse */
                
@@ -2203,7 +2211,8 @@
                                v1coSS, v2coSS, v3coSS,
                                uv1co, uv2co, uv3co,
                                uv_clip, &uv_clip_tot
-               ); 
+               );
+
                
                /* sometimes this happens, better just allow for 8 
intersectiosn even though there should be max 6 */
                /*


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

Reply via email to