--- src-3d.c 2007-04-05 16:01:10.000000000 +0300 +++ 3d.c 2007-04-05 16:03:00.000000000 +0300 @@ -494,6 +494,7 @@ const CompTransform *transform, Region region, unsigned int mask) { + Bool occlusionDetection = mask & PAINT_WINDOW_OCCLUSION_DETECTION_MASK; Bool status; Bool wasCulled = glIsEnabled(GL_CULL_FACE); @@ -501,9 +502,7 @@ TD_WINDOW(w); int output = tds->tmpOutput; - int width; - - width = w->screen->width; + int width = w->screen->width; if (DO_3D && tds->reorderWindowPainting) { @@ -562,11 +561,11 @@ if (ortho[2] > 0.0f) //The window is reversed, should be painted front to back. { if (mask & PAINT_WINDOW_BACK_TO_FRONT_MASK) - return TRUE; + return (occlusionDetection)? FALSE: TRUE; } else if (mask & PAINT_WINDOW_FRONT_TO_BACK_MASK) - return TRUE; + return (occlusionDetection)? FALSE: TRUE; } CompTransform wTransform = *transform; @@ -586,34 +585,9 @@ matrixTranslate(&wTransform, 0.0f, 0.0f, tdw->currentZ); - if (wasCulled && DISABLE_BACKFACE_CULLING) + if (wasCulled) glDisable(GL_CULL_FACE); - /* - if (!IS_IN_VIEWPORT(w, 0)) - { - float angle = 360 / tds->currentViewportNum; - - matrixScale(&wTransform, 1.0f, 1.0f, 1.0f / width); - - if (RIGHT_VIEWPORT(w) == w->screen->hsize - 1) - { - matrixTranslate(&wTransform, -width * tdw->currentZ * tds->xMove, 0.0f, 0.0f); - matrixRotate(&wTransform, -angle, 0.0f, 1.0f, 0.0f); - matrixTranslate(&wTransform, -width * tdw->currentZ * tds->xMove, 0.0f, 0.0f); - } - - else if (LEFT_VIEWPORT(w) == 1) - { - matrixTranslate(&wTransform, width + - width * tdw->currentZ * tds->xMove, 0.0f, 0.0f); - matrixRotate(&wTransform, angle, 0.0f, 1.0f, 0.0f); - matrixTranslate(&wTransform, width * tdw->currentZ * - tds->xMove - width, 0.0f, 0.0f); - } - } - */ - if ((LEFT_VIEWPORT(w) != RIGHT_VIEWPORT(w)) && tds->cubeUnfolded) { if (LEFT_VIEWPORT(w) == 0) @@ -622,216 +596,6 @@ if (RIGHT_VIEWPORT(w) == 0) matrixTranslate(&wTransform, -width * tdw->currentZ * tds->xMove, 0.0f, 0.0f); } - - int wx, wy, wx2, wy2, ww, wh; - - wx = MAX(0, MIN(w->screen->width, w->attrib.x - w->input.left)); - wx2 = MAX(0, MIN(w->screen->width, w->attrib.x + w->attrib.width + w->input.right)); - - wy = MAX(0, MIN(w->screen->height, w->attrib.y - w->input.top)); - wy2 = MAX(0, MIN(w->screen->height, w->attrib.y + w->attrib.height + w->input.bottom)); - - ww = wx2 - wx; - wh = wy2 - wy; - - float wwidth = -(tds->opt[TD_SCREEN_OPTION_WIDTH].value.f) / 30; - int bevel = tds->opt[TD_SCREEN_OPTION_BEVEL].value.i; - - - if (tds->opt[TD_SCREEN_OPTION_DEPTH].value.b - && ww && wh && !w->shaded) - { - if (mask & PAINT_WINDOW_BACK_TO_FRONT_MASK) - { - glEnable(GL_CULL_FACE); // Make sure culling is on. - glCullFace(GL_FRONT); - - matrixTranslate(&wTransform, 0.0f, 0.0f, wwidth); - - UNWRAP(tds, w->screen, paintWindow); - status = (*w->screen->paintWindow) (w, attrib, &wTransform, region, mask); - WRAP(tds, w->screen, paintWindow, tdPaintWindow); - - matrixTranslate(&wTransform, 0.0f, 0.0f, -wwidth); - } - - else - { - glEnable(GL_CULL_FACE); // Make sure culling is on. - glCullFace(GL_BACK); - - UNWRAP(tds, w->screen, paintWindow); - status = (*w->screen->paintWindow) (w, attrib, &wTransform, region, mask); - WRAP(tds, w->screen, paintWindow, tdPaintWindow); - } - - /* Paint window depth. */ - - glPushMatrix(); - glLoadMatrixf(wTransform.m); - - glDisable(GL_CULL_FACE); - glEnable(GL_BLEND); - - glBegin(GL_QUADS); - glColor4f(0.90f, 0.90f, 0.90f, w->paint.opacity/OPAQUE); - - #define DOBEVEL(corner) (GETBEVEL(corner) ? bevel : 0) - - /* Top */ - glVertex3f(wx + DOBEVEL(TOPLEFT), wy, 0); - glVertex3f(wx + ww - DOBEVEL(TOPRIGHT), wy, 0); - glVertex3f(wx + ww - DOBEVEL(TOPRIGHT), wy, (wwidth)); - glVertex3f(wx + DOBEVEL(TOPLEFT), wy, (wwidth)); - - /* Bottom */ - glVertex3f(wx + DOBEVEL(BOTTOMLEFT), wy + wh, 0); - glVertex3f(wx + ww - DOBEVEL(BOTTOMRIGHT), wy + wh, 0); - glVertex3f(wx + ww - DOBEVEL(BOTTOMRIGHT), wy + wh, wwidth); - glVertex3f(wx + DOBEVEL(BOTTOMLEFT), wy + wh, wwidth); - - - glColor4f(0.70f, 0.70f, 0.70f, w->paint.opacity/OPAQUE); - - /* Left */ - if (!(w->attrib.x < w->screen->workArea.x)) - { - glVertex3f(wx, wy + DOBEVEL(TOPLEFT), 0); - glVertex3f(wx, wy + wh - DOBEVEL(BOTTOMLEFT), 0); - glVertex3f(wx, wy + wh - DOBEVEL(BOTTOMLEFT), wwidth); - glVertex3f(wx, wy + DOBEVEL(TOPLEFT), wwidth); - } - - - /* Right */ - if (!((w->attrib.x + w->attrib.width + w->input.left + - w->input.right) > w->screen->workArea.width)) - { - glVertex3f(wx + ww, wy + DOBEVEL(TOPRIGHT), 0); - glVertex3f(wx + ww, wy + wh - DOBEVEL(BOTTOMRIGHT), 0); - glVertex3f(wx + ww, wy + wh - DOBEVEL(BOTTOMRIGHT), wwidth); - glVertex3f(wx + ww, wy + DOBEVEL(TOPRIGHT), wwidth); - } - - glColor4f(0.95f, 0.95f, 0.95f, w->paint.opacity / OPAQUE); - - if (!(w->attrib.x < w->screen->workArea.x)) - { - /* Top left bevel */ - if (GETBEVEL(TOPLEFT)) - { - glVertex3f(wx, wy + bevel, wwidth); - glVertex3f(wx, wy + bevel, 0); - glVertex3f(wx + bevel / 2.0f, wy + bevel - bevel / 1.2f, 0); - glVertex3f(wx + bevel / 2.0f, wy + bevel - bevel / 1.2f, wwidth); - - glColor4f(1.0f, 1.0f, 1.0f, w->paint.opacity/OPAQUE); - - glVertex3f(wx + bevel / 2.0f, wy + bevel - bevel / 1.2f, 0); - glVertex3f(wx + bevel / 2.0f, wy + bevel - bevel / 1.2f, wwidth); - glVertex3f(wx + bevel, wy, wwidth); - glVertex3f(wx + bevel, wy, 0); - - glColor4f(0.95f, 0.95f, 0.95f, w->paint.opacity / OPAQUE); - } - /* Bottom left bevel */ - if (GETBEVEL(BOTTOMLEFT)) - { - glVertex3f(wx, wy + wh - bevel, 0); - glVertex3f(wx, wy + wh - bevel, wwidth); - glVertex3f(wx + bevel / 2.0f, wy + wh - bevel + bevel / 1.2f, wwidth); - glVertex3f(wx + bevel / 2.0f, wy + wh - bevel + bevel / 1.2f, 0); - - glColor4f(1.0f, 1.0f, 1.0f, w->paint.opacity / OPAQUE); - - glVertex3f(wx + bevel / 2.0f, wy + wh - bevel + bevel / 1.2f, wwidth); - glVertex3f(wx + bevel / 2.0f, wy + wh - bevel + bevel / 1.2f, 0); - glVertex3f(wx + bevel, wy + wh, 0); - glVertex3f(wx + bevel, wy + wh, wwidth); - } - } - - glColor4f(0.95f, 0.95f, 0.95f, w->paint.opacity / OPAQUE); - - - if (!((w->attrib.x + w->attrib.width + w->input.left + - w->input.right) > w->screen->workArea.width)) - { - - /* Bottom right bevel */ - if (GETBEVEL(BOTTOMRIGHT)) - { - glVertex3f(wx + ww - bevel, wy + wh, 0); - glVertex3f(wx + ww - bevel, wy + wh, wwidth); - glVertex3f(wx + ww - bevel / 2.0f, wy + wh - bevel + bevel / 1.2f, wwidth); - glVertex3f(wx + ww - bevel / 2.0f, wy + wh - bevel + bevel / 1.2f, 0); - - glColor4f(1.0f, 1.0f, 1.0f, w->paint.opacity/OPAQUE); - - glVertex3f(wx + ww - bevel / 2.0f, - wy + wh - bevel + bevel / 1.2f, wwidth); - glVertex3f(wx + ww - bevel / 2.0f, - wy + wh - bevel + bevel / 1.2f, 0); - glVertex3f(wx + ww, wy + wh - bevel, 0); - glVertex3f(wx + ww, wy + wh - bevel, wwidth); - - glColor4f(0.95f, 0.95f, 0.95f, w->paint.opacity / OPAQUE); - } - /* Top right bevel */ - if (GETBEVEL(TOPRIGHT)) - { - glVertex3f(wx + ww - bevel, wy, 0); - glVertex3f(wx + ww - bevel, wy, wwidth); - glVertex3f(wx + ww - bevel / 2.0f, wy + bevel - bevel / 1.2f, wwidth); - glVertex3f(wx + ww - bevel / 2.0f, wy + bevel - bevel / 1.2f, 0); - - glColor4f(1.0f, 1.0f, 1.0f, w->paint.opacity/OPAQUE); - - glVertex3f(wx + ww - bevel / 2.0f, wy + bevel - bevel / 1.2f, wwidth); - glVertex3f(wx + ww - bevel / 2.0f, wy + bevel - bevel / 1.2f, 0); - glVertex3f(wx + ww, wy + bevel, 0); - glVertex3f(wx + ww, wy + bevel, wwidth); - } - } - - glEnd(); - glPopMatrix(); - - if (mask & PAINT_WINDOW_FRONT_TO_BACK_MASK) - { - glEnable(GL_CULL_FACE); // Re-enable culling. - glCullFace(GL_FRONT); - - - - matrixTranslate(&wTransform, 0.0f, 0.0f, wwidth); - - UNWRAP(tds, w->screen, paintWindow); - status = (*w->screen->paintWindow) (w, attrib, &wTransform, region, mask); - WRAP(tds, w->screen, paintWindow, tdPaintWindow); - - matrixTranslate(&wTransform, 0.0f, 0.0f, -wwidth); - } - - else - { - glEnable(GL_CULL_FACE); // Re-enable culling. - glCullFace(GL_BACK); - - UNWRAP(tds, w->screen, paintWindow); - status = (*w->screen->paintWindow) (w, attrib, &wTransform, region, mask); - WRAP(tds, w->screen, paintWindow, tdPaintWindow); - } - - glCullFace(GL_BACK); - - if (!wasCulled) - glDisable(GL_CULL_FACE); - - glNormal3f(0.0, 0.0, -1.0); - - return status; - } } UNWRAP(tds, w->screen, paintWindow); @@ -889,15 +653,8 @@ if (CREATE_MIPMAPS) s->display->textureFilter = GL_LINEAR_MIPMAP_LINEAR; - /*Front to back should always be done. - If FTB is already in mask, then the viewport is reversed, and all windows should be reversed. - If BTF is in mask, the viewport isn't reversed, but some of the windows there might be, so we set FTB in addition to BTF, and check for each window what mode it should use... */ - - if ((mask & PAINT_SCREEN_ORDER_BACK_TO_FRONT_MASK) && !tds->insideCube) - { - tds->reorderWindowPainting = TRUE; - mask |= PAINT_SCREEN_ORDER_FRONT_TO_BACK_MASK; - } + mask |= PAINT_SCREEN_ORDER_BACK_TO_FRONT_MASK | PAINT_SCREEN_ORDER_FRONT_TO_BACK_MASK; + tds->reorderWindowPainting = TRUE; } UNWRAP(tds, s, paintTransformedScreen);