made undo on multiple images works

This commit is contained in:
Campbell Barton
2008-11-15 02:58:47 +00:00
parent 1462aa4bc3
commit a92969e8f1

View File

@@ -2163,25 +2163,37 @@ static void project_paint_begin( ProjectPaintState *ps, short mval[2])
}
INIT_MINMAX2(ps->viewMin2D, ps->viewMax2D);
for(a=0; a < ps->dm_totvert; a++, projScreenCo++) {
VECCOPY((*projScreenCo), ps->dm_mvert[a].co);
(*projScreenCo)[3] = 1.0;
Mat4MulVec4fl(ps->projectMat, (*projScreenCo));
if( (*projScreenCo)[3] > 0.001 ) {
if (ps->projectIsOrtho) {
for(a=0; a < ps->dm_totvert; a++, projScreenCo++) {
VECCOPY((*projScreenCo), ps->dm_mvert[a].co);
Mat4MulVecfl(ps->projectMat, (*projScreenCo));
/* screen space, not clamped */
(*projScreenCo)[0] = (float)(curarea->winx/2.0)+(curarea->winx/2.0)*(*projScreenCo)[0]/(*projScreenCo)[3];
(*projScreenCo)[1] = (float)(curarea->winy/2.0)+(curarea->winy/2.0)*(*projScreenCo)[1]/(*projScreenCo)[3];
(*projScreenCo)[2] = (*projScreenCo)[2]/(*projScreenCo)[3]; /* Use the depth for bucket point occlusion */
(*projScreenCo)[0] = (float)(curarea->winx/2.0)+(curarea->winx/2.0)*(*projScreenCo)[0];
(*projScreenCo)[1] = (float)(curarea->winy/2.0)+(curarea->winy/2.0)*(*projScreenCo)[1];
DO_MINMAX2((*projScreenCo), ps->viewMin2D, ps->viewMax2D);
} else {
/* TODO - deal with cases where 1 side of a face goes behind the view ? */
(*projScreenCo)[0] = (*projScreenCo)[1] = MAXFLOAT;
}
} else {
for(a=0; a < ps->dm_totvert; a++, projScreenCo++) {
VECCOPY((*projScreenCo), ps->dm_mvert[a].co);
(*projScreenCo)[3] = 1.0;
Mat4MulVec4fl(ps->projectMat, (*projScreenCo));
if( (*projScreenCo)[3] > 0.001 ) {
/* screen space, not clamped */
(*projScreenCo)[0] = (float)(curarea->winx/2.0)+(curarea->winx/2.0)*(*projScreenCo)[0]/(*projScreenCo)[3];
(*projScreenCo)[1] = (float)(curarea->winy/2.0)+(curarea->winy/2.0)*(*projScreenCo)[1]/(*projScreenCo)[3];
(*projScreenCo)[2] = (*projScreenCo)[2]/(*projScreenCo)[3]; /* Use the depth for bucket point occlusion */
DO_MINMAX2((*projScreenCo), ps->viewMin2D, ps->viewMax2D);
} else {
/* TODO - deal with cases where 1 side of a face goes behind the view ? */
(*projScreenCo)[0] = MAXFLOAT;
}
}
}
/* setup clone offset */
if (ps->tool == PAINT_TOOL_CLONE) {
float projCo[4];
@@ -2224,7 +2236,17 @@ static void project_paint_begin( ProjectPaintState *ps, short mval[2])
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)) {
if (!ps->projectIsOrtho) {
if ( ps->projectVertScreenCos[mf->v1][0]==MAXFLOAT ||
ps->projectVertScreenCos[mf->v2][0]==MAXFLOAT ||
ps->projectVertScreenCos[mf->v3][0]==MAXFLOAT ||
(mf->v4 && ps->projectVertScreenCos[mf->v4][0]==MAXFLOAT)
) {
continue;
}
}
if (ps->projectIsBackfaceCull) {
/* TODO - we dont really need the normal, just the direction, save a sqrt? */
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);
@@ -2361,7 +2383,7 @@ static void project_paint_end( ProjectPaintState *ps )
if (last_undo_grid[tile_index]==NULL) {
/* add the undo tile from the modified image, then write the original colors back into it */
tile = last_undo_grid[tile_index] = undo_init_tile(&last_ima->id, ibuf, &tmpibuf, x_tile, y_tile);
tile = last_undo_grid[tile_index] = undo_init_tile(&last_ima->id, last_ibuf, &tmpibuf, x_tile, y_tile);
} else {
tile = last_undo_grid[tile_index];
}