Bool paintOutput (CompScreen *screen, const ScreenPaintAttrib *sAttrib, const CompTransform *transform, Region region, CompOutput *output, unsigned int mask) { CompTransform sTransform = *transform; if (mask & PAINT_SCREEN_REGION_MASK) { if (mask & PAINT_SCREEN_TRANSFORMED_MASK) { if (mask & PAINT_SCREEN_FULL_MASK) { region = &output->region; (*screen->paintTransformedOutput) (screen, sAttrib, &sTransform, region, output, mask); return TRUE; } return FALSE; } /* fall through and redraw region */ } else if (mask & PAINT_SCREEN_FULL_MASK) { (*screen->paintTransformedOutput) (screen, sAttrib, &sTransform, &output->region, output, mask); return TRUE; } else return FALSE; screenLighting (screen, FALSE); transformToScreenSpace (screen, output, -DEFAULT_Z_CAMERA, &sTransform); glPushMatrix (); glLoadMatrixf (sTransform.m); paintOutputRegion (screen, &sTransform, region, output, mask); glPopMatrix (); return TRUE; }
void paintTransformedOutput (CompScreen *screen, const ScreenPaintAttrib *sAttrib, const CompTransform *transform, Region region, CompOutput *output, unsigned int mask) { CompTransform sTransform = *transform; if (mask & PAINT_SCREEN_CLEAR_MASK) clearTargetOutput (screen->display, GL_COLOR_BUFFER_BIT); screenLighting (screen, TRUE); (*screen->applyScreenTransform) (screen, sAttrib, output, &sTransform); if ((mask & CLIP_PLANE_MASK) == CLIP_PLANE_MASK) { screen->enableOutputClipping (screen, &sTransform, region, output); transformToScreenSpace (screen, output, -sAttrib->zTranslate, &sTransform); glPushMatrix (); glLoadMatrixf (sTransform.m); paintOutputRegion (screen, &sTransform, region, output, mask); glPopMatrix (); screen->disableOutputClipping (screen); } else { transformToScreenSpace (screen, output, -sAttrib->zTranslate, &sTransform); glPushMatrix (); glLoadMatrixf (sTransform.m); paintOutputRegion (screen, &sTransform, region, output, mask); glPopMatrix (); } }
static void waterDrawWindowTexture(CompWindow * w, CompTexture * texture, const FragmentAttrib * attrib, unsigned int mask) { WATER_SCREEN(w->screen); if (ws->count) { FragmentAttrib fa = *attrib; Bool lighting = w->screen->lighting; int param, function, unit; GLfloat plane[4]; WATER_DISPLAY(w->screen->display); param = allocFragmentParameters(&fa, 1); unit = allocFragmentTextureUnits(&fa, 1); function = getBumpMapFragmentFunction(w->screen, texture, unit, param); if (function) { addFragmentFunction(&fa, function); screenLighting(w->screen, TRUE); (*w->screen->activeTexture) (GL_TEXTURE0_ARB + unit); glBindTexture(ws->target, ws->texture[TINDEX(ws, 0)]); plane[1] = plane[2] = 0.0f; plane[0] = ws->tx / (GLfloat) w->screen->width; plane[3] = 0.0f; glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_EYE_LINEAR); glTexGenfv(GL_S, GL_EYE_PLANE, plane); glEnable(GL_TEXTURE_GEN_S); plane[0] = plane[2] = 0.0f; plane[1] = ws->ty / (GLfloat) w->screen->height; plane[3] = 0.0f; glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_EYE_LINEAR); glTexGenfv(GL_T, GL_EYE_PLANE, plane); glEnable(GL_TEXTURE_GEN_T); (*w->screen->activeTexture) (GL_TEXTURE0_ARB); (*w->screen-> programEnvParameter4f) (GL_FRAGMENT_PROGRAM_ARB, param, texture->matrix.yy * wd->offsetScale, -texture->matrix.xx * wd->offsetScale, 0.0f, 0.0f); } /* to get appropriate filtering of texture */ mask |= PAINT_WINDOW_ON_TRANSFORMED_SCREEN_MASK; UNWRAP(ws, w->screen, drawWindowTexture); (*w->screen->drawWindowTexture) (w, texture, &fa, mask); WRAP(ws, w->screen, drawWindowTexture, waterDrawWindowTexture); if (function) { (*w->screen->activeTexture) (GL_TEXTURE0_ARB + unit); glDisable(GL_TEXTURE_GEN_T); glDisable(GL_TEXTURE_GEN_S); glBindTexture(ws->target, 0); (*w->screen->activeTexture) (GL_TEXTURE0_ARB); screenLighting(w->screen, lighting); } } else { UNWRAP(ws, w->screen, drawWindowTexture); (*w->screen->drawWindowTexture) (w, texture, attrib, mask); WRAP(ws, w->screen, drawWindowTexture, waterDrawWindowTexture); } }