license import { GPGPUProgram } from './gpgpu_math' ; import { UniformType } from './shader_compiler' ; export class RotateProgram implements GPGPUProgram { variableNames = [ 'Image' ] ; outputShape : number [ ] = [ ] ; userCode : string ; customUniforms = [ { name : 'params' , type : 'vec4' as UniformType } ] ; constructor ( imageShape , fillValue ) { const imageHeight = imageShape [ 1 ] ; const imageWidth = imageShape [ 2 ] ; this . outputShape = imageShape ; let fillSnippet = '' ; if ( typeof fillValue === 'number' ) { fillSnippet = `float outputValue = ${ fillValue . toFixed ( 2 ) };` ; } else { fillSnippet = `
        vec3 fill = vec3(${ fillValue . join ( ',' ) });
        float outputValue = fill[coords[3]];` ; } this . userCode = `
        void main() {
          ivec4 coords = getOutputCoords();
          int x = coords[2];
          int y = coords[1];
          float coordXFloat = (float(x) - params[0]) * params[3] -
            (float(y) - params[1]) * params[2];
          float coordYFloat = (float(x) - params[0]) * params[2] +
            (float(y) - params[1]) * params[3];
          int coordX = int(round(coordXFloat + params[0]));
          int coordY = int(round(coordYFloat + params[1]));
          ${ fillSnippet }
          if(coordX >= 0 && coordX < ${ imageWidth } && coordY >= 0 && coordY < ${ imageHeight }) {
            outputValue = getImage(coords[0], coordY, coordX, coords[3]);
          }
          setOutput(outputValue);
        }
    ` ; } }