kernel NewKernel < namespace: "com.kevingoldsmith"; vendor: "Kevin Goldsmith"; version: 1; description: "A simple waveshaper effect based on the one written by Joa Ebert and Andre Michelle in the popforge project http://code.google.com/p/popforge/"; > { input image4 src; output pixel4 dst; parameter float amount < minValue: 0.0; maxValue: 10.0; defaultValue: 1.0; >; parameter float mixAmount < minValue: 0.0; maxValue: 1.0; defaultValue: 0.5; >; void evaluatePixel() { dst = sampleNearest(src, outCoord()); float4 temp = dst; if ( dst[0] > 0.0 ) { dst[0] = dst[0] * ( dst[0] + amount ) / ( pow(dst[0],2.0) + ( amount - 1.0 ) * dst[0] + 1.0 ); } else { dst[0] = -dst[0] * ( amount - dst[0] ) / ( pow(dst[0],2.0) - ( amount - 1.0 ) * dst[0] + 1.0 ); } if ( dst[1] > 0.0 ) { dst[1] = dst[1] * ( dst[1] + amount ) / ( pow(dst[1],2.0) + ( amount - 1.0 ) * dst[1] + 1.0 ); } else { dst[1] = -dst[1] * ( amount - dst[1] ) / ( pow(dst[1],2.0) - ( amount - 1.0 ) * dst[1] + 1.0 ); } if ( dst[2] > 0.0 ) { dst[2] = dst[2] * ( dst[2] + amount ) / ( pow(dst[2],2.0) + ( amount - 1.0 ) * dst[2] + 1.0 ); } else { dst[2] = -dst[2] * ( amount - dst[2] ) / ( pow(dst[2],2.0) - ( amount - 1.0 ) * dst[2] + 1.0 ); } if ( dst[3] > 0.0 ) { dst[3] = dst[3] * ( dst[3] + amount ) / ( pow(dst[3],2.0) + ( amount - 1.0 ) * dst[3] + 1.0 ); } else { dst[3] = -dst[3] * ( amount - dst[3] ) / ( pow(dst[3],2.0) - ( amount - 1.0 ) * dst[3] + 1.0 ); } dst = mix( dst, temp, mixAmount ); } }