150 lines
3.3 KiB
C++
150 lines
3.3 KiB
C++
//-----------------------------------------------------------------------------
|
|
//
|
|
// $Logfile:: /EF2/Code/DLLs/game/portal.cpp $
|
|
// $Revision:: 6 $
|
|
// $Author:: Singlis $
|
|
// $Date:: 9/26/03 2:36p $
|
|
//
|
|
// Copyright (C) 1998 by Ritual Entertainment, Inc.
|
|
// All rights reserved.
|
|
//
|
|
// This source may not be distributed and/or modified without
|
|
// expressly written permission by Ritual Entertainment, Inc.
|
|
//
|
|
//
|
|
// DESCRIPTION:
|
|
// Portals - surfaces that are mirrors or cameras
|
|
|
|
#include "_pch_cpp.h"
|
|
#include "portal.h"
|
|
|
|
/*QUAKED portal_surface (1 0 1) (-8 -8 -8) (8 8 8)
|
|
The portal surface nearest this entity will show a view from the targeted portal_camera, or a mirror view if untargeted.
|
|
*/
|
|
|
|
Event EV_Portal_LocateCamera
|
|
(
|
|
"locatecamera",
|
|
EV_CODEONLY,
|
|
NULL,
|
|
NULL,
|
|
"Locates the camera position."
|
|
);
|
|
|
|
CLASS_DECLARATION( Entity, PortalSurface, "portal_surface" )
|
|
{
|
|
{ &EV_Portal_LocateCamera, &PortalSurface::LocateCamera },
|
|
|
|
{ NULL, NULL }
|
|
};
|
|
|
|
void PortalSurface::LocateCamera( Event *ev )
|
|
{
|
|
Entity *owner;
|
|
Entity *target;
|
|
Vector dir;
|
|
|
|
owner = G_FindTarget( NULL, Target() );
|
|
|
|
if ( !owner )
|
|
{
|
|
// No target, just a mirror
|
|
VectorCopy( edict->s.origin, edict->s.origin2 );
|
|
return;
|
|
}
|
|
|
|
// frame holds the rotate speed
|
|
if ( owner->spawnflags & 1 )
|
|
{
|
|
edict->s.frame = 25;
|
|
}
|
|
else if ( owner->spawnflags & 2 )
|
|
{
|
|
edict->s.frame = 75;
|
|
}
|
|
|
|
// skinNum holds the rotate offset
|
|
edict->s.skinNum = owner->edict->s.skinNum;
|
|
|
|
VectorCopy( owner->origin, edict->s.origin2 );
|
|
|
|
// see if the portal_camera has a target
|
|
target = G_FindTarget( NULL, owner->Target() );
|
|
|
|
if ( target )
|
|
{
|
|
dir = target->origin - owner->origin;
|
|
dir.normalize();
|
|
setAngles( dir.toAngles() );
|
|
}
|
|
else
|
|
{
|
|
setAngles( owner->angles );
|
|
dir = owner->orientation[ 0 ];
|
|
}
|
|
}
|
|
|
|
PortalSurface::PortalSurface()
|
|
{
|
|
if ( LoadingSavegame )
|
|
{
|
|
// Archive function will setup all necessary data
|
|
return;
|
|
}
|
|
|
|
VectorClear( edict->mins );
|
|
VectorClear( edict->maxs );
|
|
|
|
gi.linkentity( edict );
|
|
|
|
edict->svflags = SVF_PORTAL | SVF_SENDPVS;
|
|
edict->s.eType = ET_PORTAL;
|
|
|
|
PostEvent( EV_Portal_LocateCamera, EV_POSTSPAWN );
|
|
}
|
|
|
|
/*QUAKED portal_camera (1 0 1) (-8 -8 -8) (8 8 8) slowrotate fastrotate
|
|
The target for a portal_surface. You can set either angles or target another entity to determine the direction of view.
|
|
"roll" an angle modifier to orient the camera around the target vector;
|
|
*/
|
|
|
|
Event EV_Portal_Roll
|
|
(
|
|
"roll",
|
|
EV_SCRIPTONLY,
|
|
"f",
|
|
"roll",
|
|
"Sets the portal camera's roll."
|
|
);
|
|
|
|
CLASS_DECLARATION( Entity, PortalCamera, "portal_camera" )
|
|
{
|
|
{ &EV_Portal_Roll, &PortalCamera::Roll },
|
|
|
|
{ NULL, NULL }
|
|
};
|
|
|
|
void PortalCamera::Roll( Event *ev )
|
|
{
|
|
float roll = ev->GetFloat( 1 );
|
|
|
|
// skinNum holds the roll
|
|
edict->s.skinNum = ( roll / 360.0f ) * 256.0f;
|
|
}
|
|
|
|
PortalCamera::PortalCamera()
|
|
{
|
|
if ( LoadingSavegame )
|
|
{
|
|
// Archive function will setup all necessary data
|
|
return;
|
|
}
|
|
|
|
VectorClear( edict->mins );
|
|
VectorClear( edict->maxs );
|
|
|
|
// No roll on the camera by default
|
|
edict->s.skinNum = 0;
|
|
|
|
gi.linkentity( edict );
|
|
}
|