diff --git a/3d.c b/3d.c index 9c339b4..261c19c 100644 --- a/3d.c +++ b/3d.c @@ -81,6 +81,7 @@ typedef struct _tdScreen PaintOutputProc paintOutput; DonePaintScreenProc donePaintScreen; InitWindowWalkerProc initWindowWalker; + ApplyScreenTransformProc applyScreenTransform; CubePaintTopProc paintTop; CubePaintBottomProc paintBottom; @@ -107,6 +108,8 @@ typedef struct _tdScreen CompWindow *first; CompWindow *last; + + Bool test; } tdScreen; #define GET_TD_DISPLAY(d) \ @@ -293,7 +296,7 @@ tdPaintWindow(CompWindow * w, TD_SCREEN(w->screen); TD_WINDOW(w); - +#if 0 if (tdw->currentZ != 0.0f) { Bool wasCulled; @@ -556,6 +559,7 @@ tdPaintWindow(CompWindow * w, WRAP(tds, w->screen, paintWindow, tdPaintWindow); } else +#endif { UNWRAP(tds, w->screen, paintWindow); status = (*w->screen->paintWindow) (w, attrib, transform, region, mask); @@ -565,6 +569,26 @@ tdPaintWindow(CompWindow * w, return status; } + +static void +tdApplyScreenTransform (CompScreen *s, + const ScreenPaintAttrib *sAttrib, + CompOutput *output, + CompTransform *transform) +{ + TD_SCREEN (s); + + UNWRAP (tds, s, applyScreenTransform); + (*s->applyScreenTransform) (s, sAttrib, output, transform); + WRAP (tds, s, applyScreenTransform, tdApplyScreenTransform); + + if (!tds->test) + { + matrixScale(transform, 0.5, 0.5, 0.5); + } + +} + static void tdAddWindow(CompScreen *s, CompWindow *w) { TD_SCREEN(s); @@ -590,7 +614,7 @@ tdPaintTransformedOutput(CompScreen * s, { TD_SCREEN(s); CUBE_SCREEN(s); - +#if 0 CompWindow* w; CompWindow* firstFTB = NULL; @@ -652,10 +676,63 @@ tdPaintTransformedOutput(CompScreen * s, } } } - +#endif + UNWRAP(tds, s, paintTransformedOutput); (*s->paintTransformedOutput) (s, sAttrib, transform, region, output, mask); WRAP(tds, s, paintTransformedOutput, tdPaintTransformedOutput); + tds->test = TRUE; + + { + CompTransform sTransform = *transform; + screenLighting (s, TRUE); + + (*s->applyScreenTransform) (s, sAttrib, output, &sTransform); + + + s->enableOutputClipping (s, &sTransform, region, output); + + transformToScreenSpace (s, output, -sAttrib->zTranslate, + &sTransform); + + glPushMatrix (); + glLoadMatrixf (sTransform.m); + + CompWindow *w; + CompWalker walk; + + + + + (*s->initWindowWalker) (s, &walk); + + + /* paint all windows from bottom to top */ + for (w = (*walk.first) (s); w; w = (*walk.next) (w)) + { + TD_WINDOW (w); + if (w->destroyed) + continue; + + if (!w->shaded) + { + if (w->attrib.map_state != IsViewable || !w->damaged) + continue; + } + if (tdw->currentZ != 0.0f) + (*s->paintWindow) (w, &w->paint, &sTransform, w->clip, PAINT_WINDOW_ON_TRANSFORMED_SCREEN_MASK); + } + + + glPopMatrix (); + + s->disableOutputClipping (s); + } +tds->test = FALSE; + /* + UNWRAP(tds, s, paintTransformedOutput); + (*s->paintTransformedOutput) (s, sAttrib, transform, region, output, mask); + WRAP(tds, s, paintTransformedOutput, tdPaintTransformedOutput);*/ } static Bool @@ -806,7 +883,7 @@ tdInitWindowWalker (CompScreen *s, CompWalker* walker) UNWRAP (tds, s, initWindowWalker); (*s->initWindowWalker) (s, walker); WRAP (tds, s, initWindowWalker, tdInitWindowWalker); - +/* if ((tds->active || tds->tdWindowExists) && cs->paintOrder == BTF) { @@ -815,6 +892,7 @@ tdInitWindowWalker (CompScreen *s, CompWalker* walker) walker->next = tdWalkNext; walker->prev = tdWalkPrev; } +*/ } @@ -864,6 +942,8 @@ static Bool tdInitPluginForDisplay (CompPlugin *p, CompDisplay *d) WRAP(tds, s, donePaintScreen, tdDonePaintScreen); WRAP(tds, s, preparePaintScreen, tdPreparePaintScreen); WRAP(tds, s, initWindowWalker, tdInitWindowWalker); + + WRAP (tds, s, applyScreenTransform, tdApplyScreenTransform); } } } @@ -895,6 +975,9 @@ static void tdFiniPluginForDisplay (CompPlugin *p, CompDisplay *d) UNWRAP(tds, s, donePaintScreen); UNWRAP(tds, s, preparePaintScreen); UNWRAP(tds, s, initWindowWalker); + + UNWRAP (tds, s, applyScreenTransform); + } cubeDisplayPrivateIndex = -1;