I love the smell of UnrealEd crashing in the morning. – tarquin

Legacy:AlphaOne/FishEyeView

From Unreal Wiki, The Unreal Engine Documentation Site
Jump to: navigation, search

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[edit]

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

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

Crappy Code[edit]

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
}