| Home Page | Recent Changes

AlphaOne/FishEyeView

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
}

The Unreal Engine Documentation Site

Wiki Community

Topic Categories

Recent Changes

Offline Wiki

Unreal Engine

Console Commands

Terminology

FAQs

Help Desk

Mapping Topics

Mapping Lessons

UnrealEd Interface

UnrealScript Topics

UnrealScript Lessons

Making Mods

Class Tree

Modeling Topics

Chongqing Page

Log In