Mostly Harmless
Legacy:AlphaOne/FishEyeView
From Unreal Wiki, The Unreal Engine Documentation Site
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:
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
}
