topical media & game development

talk show tell print

graphic-player-10-pixel-filter-shaders-TubeView.pbk / pbk



  
*************************************************************************** Petri Leskinen, Espoo, Finland, Jan 2008 Tube-View 'James Bond-like effect leskinen.petri@luukku.com - please send me a note if you use the code for anything cool ! ***************************************************************************

  
  <languageVersion: 1.0;> // The languageVersion is required in PixelBender files. This was added in the 2nd pre-release, and MUST be declared on the first line (comments excluded)
  kernel TubeView
  // Added namespace, vendor, version, and description information. A namespace value is required (pre-release 2 and up) and was not supplied.
  <   
      namespace : "by Petri Leskinen, Espoo, Finland, Jan 2008"; // namespace was changed from nameSpace in the 2nd pre-release
      vendor : "";
      version : 1;
      description : "Tube-View 'James Bond-like effect";
  >
  
  {
     
     input image4 src;
     output float4 pxl;
     
      parameter float radius 
      <       
          minValue:float(40.0);
          maxValue:float(300.0); 
          defaultValue:float(200.0);
      >;
  
      parameter float turbulence
       <       
          minValue:float(-3.14);
          maxValue:float(3.14); 
          defaultValue:float(1.0);
          description: "Turbulence";
      >;    
      parameter float fade1
       <       
          minValue:float(-1.0);
          maxValue:float(1.0); 
          defaultValue:float(0.2);
          description: "Fading on the edge of the tube";
      >;
      parameter float fade2
       <       
          minValue:float(0.0);
          maxValue:float(2.0); 
          defaultValue:float(0.4);
          description: "Fading by distance";
      >;
      
      parameter float2 center
      <
          minValue:float2(100.0, 0.0);
          maxValue:float2(400.0, 400.0);
          defaultValue:float2(275.0, 200.0);
          description: "Center point";
      >;
      parameter float4 bgColor
      <
          minValue:float4(0.0, 0.0, 0.0, 0.0);
          maxValue:float4(1.0, 1.0,1.0,1.0);
          defaultValue:float4(0.0, 0.0, 0.0, 1.0);
          description: "Background color";
      >;
      
      
      void evaluatePixel()
      {
          // point relative to center
          float2 p = outCoord() -center;
          
          // relative distance from center, rel<0.0 if inside the circle
          float rel = length(p) /radius;
          float tmp = rel*rel;
          rel -= 1.0;
          
          // if outside, modify point location, new coordinates inside circle
          p /= (rel < 0.0) ? 1.0 : tmp ;
          
          // 'turbulence'-rotation
          float rotAngle =  turbulence *( rel < 0.0 ? 0.0 : rel ) ;
          p = float2(p.x*cos(rotAngle)-p.y*sin(rotAngle),
              p.x*sin(rotAngle)+p.y*cos(rotAngle) );
          
          // sample pixel from new location
          pxl= sample(src, center+p);
          
          // mix with bgColor according to distance
          float mx = fade1+ rel*fade2;
          pxl= mix(pxl, bgColor, rel < 0.0 ? 0.0 : mx );
          
     }
  }
  


(C) Æliens 20/2/2008

You may not copy or print any of this material without explicit permission of the author or the publisher. In case of other copyright issues, contact the author.