static Bool cubeCheckFTB (CompScreen *s, const ScreenPaintAttrib *sAttrib, const CompTransform *transform int output) { float mvp[16]; MULTM(w->screen->projection, transform->m, mvp); float pntA[4] = { w->screen->outputDev[output].region.extents.x1, w->screen->outputDev[output].region.extents.y1, tdw->currentZ, 1}; float pntB[4] = { w->screen->outputDev[output].region.extents.x2, w->screen->outputDev[output].region.extents.y1, tdw->currentZ, 1}; float pntC[4] = { w->screen->outputDev[output].region.extents.x1 + w->screen->outputDev[output].width / 2.0f, w->screen->outputDev[output].region.extents.y1 + w->screen->outputDev[output].height / 2.0f, tdw->currentZ, 1}; MULTMV(mvp, pntA); DIVV(pntA); MULTMV(mvp, pntB); DIVV(pntB); MULTMV(mvp, pntC); DIVV(pntC); float vecA[3] = { pntC[0] - pntA[0], pntC[1] - pntA[1], pntC[2] - pntA[2]}; float vecB[3] = { pntC[0] - pntB[0], pntC[1] - pntB[1], pntC[2] - pntB[2]}; float ortho[3] = { vecA[1] * vecB[2] - vecA[2] * vecB[1], vecA[2] * vecB[0] - vecA[0] * vecB[2], vecA[0] * vecB[1] - vecA[1] * vecB[0]}; if (ortho[2] > 0.0f) //The window is reversed, should be painted front to back. { return TRUE; } return FALSE; }