rendered paste body--- 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);