Revision: 17379
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=17379
Author: campbellbarton
Date: 2008-11-09 15:34:32 +0100 (Sun, 09 Nov 2008)
Log Message:
-----------
* clone tool didnt work when objects center was not 0,0,0
* made backface culling work as expected in perspective view.
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-09
13:14:41 UTC (rev 17378)
+++ branches/projection-paint/source/blender/src/imagepaint.c 2008-11-09
14:34:32 UTC (rev 17379)
@@ -1811,6 +1811,7 @@
/* Viewport vars */
float mat[3][3];
float f_no[3];
+ float viewPos[3]; /* for projection only - view location */
float (*projScreenCo)[4]; /* Note, we could have 4D vectors are only
needed for */
float projMargin;
@@ -1941,8 +1942,9 @@
if (ps->tool == PAINT_TOOL_CLONE) {
float projCo[4];
float *curs= give_cursor();
- VECCOPY(projCo, curs); /* TODO - what if were in local view? -
get some better way */
+ VECCOPY(projCo, curs);
Mat4MulVec4fl(ps->ob->imat, projCo);
+ VecSubf(projCo, projCo, ps->ob->obmat[3]);
projCo[3] = 1.0;
Mat4MulVec4fl(ps->projectMat, projCo);
ps->cloneOfs[0] = mval[0] -
((float)(curarea->winx/2.0)+(curarea->winx/2.0)*projCo[0]/projCo[3]);
@@ -1967,6 +1969,15 @@
ps->viewWidth = ps->viewMax2D[0] - ps->viewMin2D[0];
ps->viewHeight = ps->viewMax2D[1] - ps->viewMin2D[1];
+ if (!ps->projectIsOrtho) {
+ /* get the view direction relative to the objects matrix */
+ float imat[3][3];
+ VECCOPY(viewPos, G.vd->viewinv[3]);
+ Mat3CpyMat4(imat, ps->ob->imat);
+ Mat3MulVecfl(imat, viewPos);
+ VecAddf(viewPos, viewPos, ps->ob->imat[3]);
+ }
+
for( a = 0, tf = ps->dm_mtface, mf = ps->dm_mface; a < ps->dm_totface;
mf++, tf++, a++ ) {
if (tf->tpage && ((G.f & G_FACESELECT)==0 || mf->flag &
ME_FACE_SEL)) {
@@ -1975,8 +1986,30 @@
if (mf->v4)
CalcNormFloat4(ps->dm_mvert[mf->v1].co, ps->dm_mvert[mf->v2].co,
ps->dm_mvert[mf->v3].co, ps->dm_mvert[mf->v4].co, f_no);
else
CalcNormFloat(ps->dm_mvert[mf->v1].co, ps->dm_mvert[mf->v2].co,
ps->dm_mvert[mf->v3].co, f_no);
- if (Inpf(f_no, ps->viewDir) < 0) {
- continue;
+ if (ps->projectIsOrtho) {
+ if (Inpf(f_no, ps->viewDir) < 0) {
+ continue;
+ }
+ } else {
+ float faceDir[3] = {0,0,0};
+ if (mf->v4) {
+ VecAddf(faceDir, faceDir,
ps->dm_mvert[mf->v1].co);
+ VecAddf(faceDir, faceDir,
ps->dm_mvert[mf->v2].co);
+ VecAddf(faceDir, faceDir,
ps->dm_mvert[mf->v3].co);
+ VecAddf(faceDir, faceDir,
ps->dm_mvert[mf->v4].co);
+ VecMulf(faceDir, 1.0/4.0);
+ } else {
+ VecAddf(faceDir, faceDir,
ps->dm_mvert[mf->v1].co);
+ VecAddf(faceDir, faceDir,
ps->dm_mvert[mf->v2].co);
+ VecAddf(faceDir, faceDir,
ps->dm_mvert[mf->v3].co);
+ VecMulf(faceDir, 1.0/3.0);
+ }
+
+ VecSubf(faceDir, viewPos, faceDir);
+
+ if (Inpf(f_no, faceDir) < 0) {
+ continue;
+ }
}
}
_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs