Sign in to follow this  
TechnoRobbo

TR's Fish Eye Plugin - Feb. 24, 2015

Recommended Posts

Technorobbo's Fish Eye 2.2

 

v2.2 adds color cast to highlight and specular control

v2.1 fixes a bug in the highlight

V2.0 adds shadow, rotation and specular highlight

 

 

It's not a Bulge Filter. 

 

It takes your image, creates a Pixel Cloud then maps it via the Pythagorean theorem. Then renders it using a standard 3D Mapping algorithm.

 

Here is a Youtube tutorial http://youtu.be/DOOwh8ul3gc

V2 Demo http://youtu.be/oqaHRlxdARs

 

Fisheye.png?raw=1

 

Here's the code:

Hidden Content:
// Submenu: Distort
// Name: TR's Fish Eye
// Title: Fish Eye - v2.2
// Author: TechnoRobbo
// URL: http://www.technorobbo.com

#region UICode
double Amount1 = 0.25; // [0.01,1] Control
Pair<double, double> Amount2 = Pair.Create( 0.0 , 0.0 ); // Rotate
Pair<double, double> Amount3 = Pair.Create( 0.0 , 0.0 ); // Light Source
double Amount4 = 0; // [0,2] Spot Light
double Amount5 = 2; // [0,5] Light Intensity
double Amount6 = 0; // [0,1.5] Highlight
double Amount7 = 1; // [0.01,10] Specularity
ColorBgra Amount8 = ColorBgra.FromBgr(0,0,0); // Color Cast
#endregion

private ColorBgra getblend(int x, ColorBgra a, ColorBgra 
{
    UserBlendOp bop = new UserBlendOps.NormalBlendOp();
    switch (x)
    {
        case 0:
            bop = new UserBlendOps.NormalBlendOp(); // Normal
            break;

        case 1:
            bop = new UserBlendOps.MultiplyBlendOp(); // Multiply
            break;

        case 2:
            bop = new UserBlendOps.AdditiveBlendOp(); // Additive
            break;
        case 3:
            bop = new UserBlendOps.ColorBurnBlendOp(); // Color Burn
            break;
        case 4:
            bop = new UserBlendOps.ColorDodgeBlendOp(); // Color Dodge
            break;
        case 5:
            bop = new UserBlendOps.ReflectBlendOp(); // Reflect
            break;
        case 6:
            bop = new UserBlendOps.GlowBlendOp(); // Glow
            break;
        case 7:
            bop = new UserBlendOps.OverlayBlendOp(); // Overlay
            break;
        case 8:
            bop = new UserBlendOps.DifferenceBlendOp(); // Difference
            break;
        case 9:
            bop = new UserBlendOps.NegationBlendOp(); // Negation
            break;
        case 10:
            bop = new UserBlendOps.LightenBlendOp(); // Lighten
            break;
        case 11:
            bop = new UserBlendOps.DarkenBlendOp(); // Darken
            break;
        case 12:
            bop = new UserBlendOps.ScreenBlendOp(); // Screen
            break;
        case 13:
            bop = new UserBlendOps.XorBlendOp(); // Xor
            break;
        default:
            bop = new UserBlendOps.NormalBlendOp();
            break;
    }
    return bop.Apply(a, ;
}


void Render(Surface dst, Surface src, Rectangle rect)
{
  
    Rectangle selection = EnvironmentParameters.GetSelection(src.Bounds).GetBoundsInt();
    double CenterX = ((selection.Right - selection.Left) / 2)+selection.Left;
    double CenterY= ((selection.Bottom - selection.Top) / 2)+selection.Top;
    double offx =0;
    double offy =0;
    double rady = (selection.Bottom - selection.Top) / 2;
    double radx = (selection.Right - selection.Left) / 2;
    double rotateX=Amount2.First * CenterX;
    double rotateY=Amount2.Second * CenterY;
    double sourceX=Amount3.First * CenterX + CenterX;
    double sourceY=Amount3.Second * CenterY + CenterY;
    double gamma = Amount5 * 255;
    double wide=Amount4;
    double hilite = Math.Pow(Amount6,Amount7);
    double tmpy =0;
    double tmpx =0;
    double z=0;
    double tmp=0;
    double zp= Math.Pow((double) Amount1,2) * radx * 8;
    ColorBgra cast = Amount8;//getblend(12,ColorBgra.White,Amount8);
        

    ColorBgra CP;

    
    for (int y = rect.Top; y < rect.Bottom; y++)
    {
        if (IsCancelRequested) return;
        tmpy=y-CenterY;
        tmpx=Math.Sqrt(rady*rady-tmpy*tmpy);
        for (int x = rect.Left; x < rect.Right; x++)
        {
            if (IsCancelRequested) return;
            double spread =  Math.Sqrt(Math.Pow(x - CenterX,2) + Math.Pow(y - CenterY,2));
            
            double Light =  Math.Sqrt(Math.Pow(x - sourceX,2) + Math.Pow(y - sourceY,2)) * wide ;
            Light=(Light>CenterY)?1:Light/CenterY;
            
            double hLight =  Math.Sqrt(Math.Pow(x - sourceX,2) + Math.Pow(y - sourceY,2));
            hLight =(hLight >CenterY)?1:hLight /CenterY;  
            
            tmp=(double)x-CenterX;            
            z = zp + Math.Sqrt(tmpx*tmpx-tmp*tmp);
            offx = tmp *  zp / z + CenterX + rotateX;
        
            tmp=(double)y-CenterY;
            
            offy= tmp *  zp / z + CenterY + rotateY;
            
            CP= src.GetBilinearSampleWrapped((float)offx,(float)offy);


            double l,lr,lg,lb;
            
            lr =(1 - Math.Pow(hLight , hilite)) * cast.R;
            lr=(lr>255)?255:(lr<0)?0:lr;
            lg =(1 - Math.Pow(hLight , hilite)) * cast.G;
            lg=(lg>255)?255:(lg<0)?0:lg;
            lb =(1 - Math.Pow(hLight , hilite)) * cast.B;
            lr=(lb>255)?255:(lb<0)?0:lb;
            ColorBgra CH = ColorBgra.FromBgr((byte)lb,(byte)lg,(byte)lr);
            CP=getblend(12,CP,CH);//was 12
            
            l= (1 - Math.Sqrt(Light)) * gamma;
            l=(l>255)?255:(l<0)?0:l;
            ColorBgra CL = ColorBgra.FromBgr((byte)l,(byte)l,(byte)l);
            CP=getblend(1,CP,CL);
            

            
            if (spread>(CenterY-1))CP.A=32;
            if (spread>(CenterY-2))CP.A=128;
            if (spread>CenterY)CP.A=0;
            
            dst[x,y]=CP;  
        }
    }
}
 

Fisheye.zip

Edited by TechnoRobbo
  • Upvote 6

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this