diff options
author | Campbell Barton <ideasman42@gmail.com> | 2008-11-24 08:58:00 +0300 |
---|---|---|
committer | Campbell Barton <ideasman42@gmail.com> | 2008-11-24 08:58:00 +0300 |
commit | a51f17bc305bcf4f01db9c330a1ec58ca8e3ef67 (patch) | |
tree | 8b8fd7e18e8f0d8e5f44f45fb70534ee80dfd969 | |
parent | 5a87cfe4f8e2277c3aaf7d84c2cdeff4185a0035 (diff) |
painting onto faces was broken when the UV's or faces were flipped, reversing the order that LSCM and many other tools give.
-rw-r--r-- | source/blender/src/imagepaint.c | 45 |
1 files changed, 27 insertions, 18 deletions
diff --git a/source/blender/src/imagepaint.c b/source/blender/src/imagepaint.c index a9770e1707d..5f88bd9b5b7 100644 --- a/source/blender/src/imagepaint.c +++ b/source/blender/src/imagepaint.c @@ -1745,7 +1745,8 @@ static void rect_to_uvspace_ortho( 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 @@ static void rect_to_uvspace_ortho( 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 @@ static void rect_to_uvspace_persp( 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 @@ static void rect_to_uvspace_persp( 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 @@ static void project_bucket_clip_face( ) { 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 @@ static void project_bucket_clip_face( 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? */ - VECCOPY2D(bucket_bounds_uv[0], uv1co); - VECCOPY2D(bucket_bounds_uv[1], uv2co); - VECCOPY2D(bucket_bounds_uv[2], uv3co); - } else { + 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); } + *tot = 3; return; } @@ -1881,8 +1885,10 @@ static void project_bucket_clip_face( 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 @@ static void project_bucket_clip_face( 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 @@ static void project_paint_face_init(ProjPaintState *ps, int thread_index, int bu 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 */ /* |