The CurtainKernel is a componentwise kernel which shifts rows of its input horizontally according to a sine wave, to produce a rippling, curtain-like effect.

The amplitude, phase and period of the wave can be controlled.

kernel CurtainKernel : ImageComputationKernel<eComponentWise>
  Image<eRead, eAccessRanged1D, eEdgeConstant> src;
  Image<eWrite, eAccessPoint> dst;

  float amplitudePixels;
  float phaseRadians;
  float periodPixels;

  float angularFrequency;

  void define() {
    defineParam(amplitudePixels, "amplitude", 100.0f);
    defineParam(phaseRadians, "phase", PI);
    defineParam(periodPixels, "period", 500.0f);

  void init() {
     src.setRange(-amplitudePixels, amplitudePixels);
     angularFrequency = 2.0f*PI/periodPixels;

  void process(int3 pos) {
    int offset = amplitudePixels * sin( pos.y * angularFrequency + phaseRadians );
    dst() = src(offset);