[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [17548] branches/projection-paint/source/ blender/src/imagepaint.c: painting onto faces was broken when the UV' s or faces were flipped, reversing the order that LSCM and many other tools give.
Campbell Barton
ideasman42 at gmail.com
Mon Nov 24 06:58:01 CET 2008
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 */
/*
More information about the Bf-blender-cvs
mailing list