Dennis Kasprzyk
2007-Jun-12 19:10 UTC
[PATCH] Combined checkFTB and capDirection into one checkOrientation function.
--- include/cube.h | 18 +++------ plugins/cube.c | 120 +++++++++++++++++-------------------------------------- 2 files changed, 43 insertions(+), 95 deletions(-) diff --git a/include/cube.h b/include/cube.h index 0a87626..293bad1 100644 --- a/include/cube.h +++ b/include/cube.h @@ -87,16 +87,11 @@ typedef void (*CubePaintInsideProc) (CompScreen *s, CompOutput *output, int size); -typedef Bool (*CubeCheckFTBProc) (CompScreen *s, - const ScreenPaintAttrib *sAttrib, - const CompTransform *transform, - CompOutput *output); - -typedef Bool (*CubeCapDirectionProc) (CompScreen *s, - const ScreenPaintAttrib *sAttrib, - const CompTransform *transform, - CompOutput *output, - float y); +typedef Bool (*CubeCheckOrientationProc) (CompScreen *s, + const ScreenPaintAttrib *sAttrib, + const CompTransform *transform, + CompOutput *output, + const float points[3][3]); typedef enum _PaintOrder { @@ -128,8 +123,7 @@ typedef struct _CubeScreen { CubePaintTopProc paintTop; CubePaintBottomProc paintBottom; CubePaintInsideProc paintInside; - CubeCheckFTBProc checkFTB; - CubeCapDirectionProc capDirection; + CubeCheckOrientationProc checkOrientation; CompOption opt[CUBE_SCREEN_OPTION_NUM]; diff --git a/plugins/cube.c b/plugins/cube.c index dda6ea8..7d29ede 100644 --- a/plugins/cube.c +++ b/plugins/cube.c @@ -921,10 +921,11 @@ cubeDonePaintScreen (CompScreen *s) } static Bool -cubeCheckFTB (CompScreen *s, - const ScreenPaintAttrib *sAttrib, - const CompTransform *transform, - CompOutput *outputPtr) +cubeCheckOrientation (CompScreen *s, + const ScreenPaintAttrib *sAttrib, + const CompTransform *transform, + CompOutput *outputPtr, + const float points[3][3]) { CompTransform sTransform = *transform; float mvp[16]; @@ -932,90 +933,27 @@ cubeCheckFTB (CompScreen *s, float vecA[3], vecB[3]; float ortho[3]; - (*s->applyScreenTransform) (s, sAttrib, outputPtr, &sTransform); - transformToScreenSpace (s, outputPtr, -sAttrib->zTranslate, &sTransform); - - MULTM (s->projection, sTransform.m, mvp); - - pntA[0] = outputPtr->region.extents.x1; - pntA[1] = outputPtr->region.extents.y1, - pntA[2] = 0.0f; - pntA[3] = 1.0f; - - pntB[0] = outputPtr->region.extents.x2; - pntB[1] = outputPtr->region.extents.y1; - pntB[2] = 0.0f; - pntB[3] = 1.0f; - - pntC[0] = outputPtr->region.extents.x1 + outputPtr->width / 2.0f; - pntC[1] = outputPtr->region.extents.y1 + outputPtr->height / 2.0f; - pntC[2] = 0.0f; - pntC[3] = 1.0f; - - MULTMV (mvp, pntA); - DIVV (pntA); - - MULTMV (mvp, pntB); - DIVV (pntB); - - MULTMV (mvp, pntC); - DIVV (pntC); - - vecA[0] = pntC[0] - pntA[0]; - vecA[1] = pntC[1] - pntA[1]; - vecA[2] = pntC[2] - pntA[2]; - - vecB[0] = pntC[0] - pntB[0]; - vecB[1] = pntC[1] - pntB[1]; - vecB[2] = pntC[2] - pntB[2]; - - ortho[0] = vecA[1] * vecB[2] - vecA[2] * vecB[1]; - ortho[1] = vecA[2] * vecB[0] - vecA[0] * vecB[2]; - ortho[2] = vecA[0] * vecB[1] - vecA[1] * vecB[0]; - - if (ortho[2] > 0.0f && pntC[2] > DEFAULT_Z_CAMERA) - { - /* The viewport is reversed, should be painted front to back. */ - return TRUE; - } - - return FALSE; -} - -static Bool -cubeCapDirection (CompScreen *s, - const ScreenPaintAttrib *sAttrib, - const CompTransform *transform, - CompOutput *outputPtr, - float y) -{ - CompTransform sTransform = *transform; - float mvp[16]; - float pntA[4], pntB[4], pntC[4]; - float vecA[3], vecB[3]; - float ortho[3]; + CUBE_SCREEN (s); - CUBE_SCREEN (s); - (*s->applyScreenTransform) (s, sAttrib, outputPtr, &sTransform); matrixTranslate (&sTransform, cs->outputXOffset, -cs->outputYOffset, 0.0f); matrixScale (&sTransform, cs->outputXScale, cs->outputYScale, 1.0f); MULTM (s->projection, sTransform.m, mvp); - pntA[0] = -0.5f; - pntA[1] = y, - pntA[2] = 0.0f; + pntA[0] = points[0][0]; + pntA[1] = points[0][1]; + pntA[2] = points[0][2]; pntA[3] = 1.0f; - pntB[0] = 0.0f; - pntB[1] = y; - pntB[2] = 0.5f; + pntB[0] = points[1][0]; + pntB[1] = points[1][1]; + pntB[2] = points[1][2]; pntB[3] = 1.0f; - pntC[0] = 0.0f; - pntC[1] = y; - pntC[2] = 0.0f; + pntC[0] = points[2][0]; + pntC[1] = points[2][1]; + pntC[2] = points[2][2]; pntC[3] = 1.0f; MULTMV (mvp, pntA); @@ -1039,9 +977,10 @@ cubeCapDirection (CompScreen *s, ortho[1] = vecA[2] * vecB[0] - vecA[0] * vecB[2]; ortho[2] = vecA[0] * vecB[1] - vecA[1] * vecB[0]; + if (ortho[2] > 0.0f) { - /* We see the top face of the cap */ + /* The viewport is reversed, should be painted front to back. */ return TRUE; } @@ -1062,7 +1001,17 @@ cubeMoveViewportAndPaint (CompScreen *s, CUBE_SCREEN (s); - ftb = cs->checkFTB (s, sAttrib, transform, outputPtr); + float vPoints[3][3] = { { -0.5, 0.0, cs->distance}, + { 0.0, 0.5, cs->distance}, + { 0.0, 0.0, cs->distance}}; + + /* Special handling for inside cube mode. Orientation calculation + doesn't work right because some points are transformed outside + the visible range. */ + if (cs->invert == 1) + ftb = cs->checkOrientation (s, sAttrib, transform, outputPtr, vPoints); + else + ftb = FALSE; if ((paintOrder == FTB && !ftb) || (paintOrder == BTF && ftb)) @@ -1508,8 +1457,14 @@ cubePaintTransformedOutput (CompScreen *s, (cs->invert != 1 || cs->desktopOpacity != OPAQUE || sa.vRotate != 0.0f || sa.yTranslate != 0.0f)) { - topDir = cs->capDirection(s, &sa, transform, outputPtr, 0.5f); - bottomDir = cs->capDirection(s, &sa, transform, outputPtr, -0.5f); + static float top[3][3] = { { 0.5, 0.5, 0.0}, + { 0.0, 0.5, -0.5}, + { 0.0, 0.5, 0.0}}; + static float bottom[3][3] = { { 0.5, 0.5, 0.0}, + { 0.0, 0.5, -0.5}, + { 0.0, 0.5, 0.0}}; + topDir = cs->checkOrientation(s, &sa, transform, outputPtr, top); + bottomDir = cs->checkOrientation(s, &sa, transform, outputPtr, bottom); if (topDir && bottomDir) { @@ -2128,8 +2083,7 @@ cubeInitScreen (CompPlugin *p, cs->paintTop = cubePaintTop; cs->paintBottom = cubePaintBottom; cs->paintInside = cubePaintInside; - cs->checkFTB = cubeCheckFTB; - cs->capDirection = cubeCapDirection; + cs->checkOrientation = cubeCheckOrientation; s->privates[cd->screenPrivateIndex].ptr = cs; -- 1.5.0.5-dirty --Boundary_(ID_FAwKtFeGgzCvfCdiZH6s1g)--
Maybe Matching Threads
- Computation of contour values - Speeding up computation
- binding rows from different matrices
- [PATCH] Made checkFTB wrapable (needed by cubereflex plugin).
- [PATCH 13/13] nv50: add support for point sprites
- [PATCH 2/2] nv30/draw: switch varying hookup logic to know about texcoords