Legacy:AlphaOne/FishEyeView - Unreal Wiki

# Legacy:AlphaOne/FishEyeView

### From Unreal Wiki, The Unreal Engine Documentation Site

< Legacy:AlphaOne

Borrowed from Fish Eye Quake

First attempts http://alphaone.teaminfamy.net/pics/FishEyeTest1.png?wikihack

Thats a FOV of 170!

For compartions of normal and fisheye projection FOVs, see this:

Quake FOV comparison

## Non Code Stuff

http://alphaone.teaminfamy.net/pics/FishEyeShader.png?wikihack

http://alphaone.teaminfamy.net/pics/FishEyeMesh.png?wikihack

## Crappy Code

This code makes it barely work:

    class FishEyeScreenActor extends Actor;

    var PlayerController ownerViewer;
    var() ScriptedTexture        DestTexture;
    var() name                          CameraTag;
    var() float                         RefreshRate;
    var() float                         FOV;
    var() float                         ScreenViewDistance;

    // lots of coded ripped from CameraTextureClient...
    simulated function PostBeginPlay()
    {
            DestTexture = ScriptedTexture(Level.ObjectPool.AllocateObject(class'ScriptedTexture'));
            if(DestTexture != None)
            {
                    DestTexture.Client = Self;
                    DestTexture.SetSize(1024,1024);
                    Skins[0] = DestTexture;
                    SetTimer(1.0 / RefreshRate,true);
                    Enable('Timer');
            }
    }

    simulated function Timer()
    {
            DestTexture.Revision++;
    }

    function Tick(float DeltaTime)
    {
            local vector screenOffSet;

            super.Tick(DeltaTime);
            if(ownerViewer != none)
            {
                    SetRotation(ownerViewer.Rotation);
                    screenOffSet = vector(Rotation) * ScreenViewDistance;

                    if(ownerViewer.Pawn != none)
                    {
                            SetLocation(ownerViewer.Pawn.Location + screenOffSet + ownerViewer.Pawn.EyePosition());
                    }
                    else
                    {
                            SetLocation(ownerViewer.Location + screenOffSet);
                    }
            }
    }

    simulated event RenderTexture(ScriptedTexture Tex)
    {
            local vector screenOffSet;
            local vector fishCameraLocation;
            local rotator fishCameraRotation;
            local actor fishCameraActor;

            /*if(ownerViewer != none)
            {
                    screenOffSet = vector(ownerViewer.Rotation) * ScreenViewDistance;

                    fishCameraRotation = ownerViewer.Rotation;
                    fishCameraActor = ownerViewer;
                    fishCameraLocation = -screenOffSet;

                    if(ownerViewer.Pawn != none)
                    {
                            fishCameraLocation += ownerViewer.Pawn.Location + ownerViewer.Pawn.EyePosition();
                    }
                    else
                    {
                            fishCameraLocation += ownerViewer.Location;
                    }
            }
            else
            {*/
                    fishCameraActor = self;
                    fishCameraLocation = Location;
                    fishCameraRotation = Rotation;
            //}

            Tex.DrawPortal(0,0,Tex.USize,Tex.VSize,fishCameraActor,fishCameraLocation,fishCameraRotation,FOV);

    }

    simulated event Destroyed()
    {
            if (DestTexture != None)
            {
                    DestTexture.Client = None;
                    Level.ObjectPool.FreeObject(DestTexture);
            }

            Super.Destroyed();
    }

    defaultproperties
    {
            ScreenViewDistance =    160
            bUnlit =                                true
            bStatic =                               false
            bAlwaysRelevant =               true
            bNoDelete =                             false
            RefreshRate =                   60
            FOV =                                   170
            DrawType =                              DT_StaticMesh
            StaticMesh =                    StaticMesh'FishEyeMeshes.Sphere2'
            DestTexture =                   ScriptedTexture'FishEyeTex.Screen2'
            bHardAttach =                   true

    }

    class FishEyeInt extends interaction;

    var bool bFishEyeActive;
    var FishEyeScreenActor FishEyeScreenObject;

    function Initialize()
    {
            if(ViewportOwner.Actor != none)
            {
                    // called after being attached to the PC
                    FishEyeScreenObject = ViewportOwner.Actor.Spawn(class'FishEyeScreenActor',
                            ViewportOwner.Actor, ,
                            ViewportOwner.Actor.Location,
                            ViewportOwner.Actor.Rotation);

                    FishEyeScreenObject.ownerViewer = ViewportOwner.Actor;
                    //FishEyeScreenObject.SetBase(ViewportOwner.Actor.Pawn);
            }
    }

    // ============================================================================
    function PostRender(canvas Canvas)
    {
            Canvas.SetPos(0,100);
            Canvas.Font = Canvas.TinyFont;
            Canvas.SetDrawColor(255,255,255,255);
            if(bFishEyeActive)
            {
                    Canvas.DrawText("FishEye active");
                    Canvas.SetPos(Canvas.SizeX, Canvas.SizeY);
                    Canvas.DrawActor(FishEyeScreenObject,false,false);
            }
            else
            {
                    Canvas.DrawText("FishEye not active");
            }
    }

    // modified, from http://wiki.beyondunreal.com/wiki/Keypress_Interactions
    function bool KeyEvent(EInputKey Key, EInputAction Action, float Delta)
    {
            local string tmp;

            if (Action == IST_Release && FishEyeScreenObject != none)
            {
                    tmp = ViewportOwner.Actor.ConsoleCommand("KEYNAME"@Key);
                    tmp = ViewportOwner.Actor.ConsoleCommand("KEYBINDING"@tmp);
                    if (tmp == "use")
                    {
                            bFishEyeActive = !bFishEyeActive;
                            //FishEyeScreenObject.bHidden = !FishEyeScreenObject.bHidden;
                            return True;
                    }
            }
            // this event doesn't matter to us, so we pass it on for further processing
            return False;
    }

    defaultproperties
    {
            bVisible =                      true
            bFishEyeActive =        false
    }

##### Views

- Legacy
- Discussion
- Current revision

##### Search