quake3/q3radiant/IEpairs.cpp

186 lines
4.2 KiB
C++
Executable File

/*
===========================================================================
Copyright (C) 1999-2005 Id Software, Inc.
This file is part of Quake III Arena source code.
Quake III Arena source code is free software; you can redistribute it
and/or modify it under the terms of the GNU General Public License as
published by the Free Software Foundation; either version 2 of the License,
or (at your option) any later version.
Quake III Arena source code is distributed in the hope that it will be
useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with Foobar; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
===========================================================================
*/
//-----------------------------------------------------------------------------
//
// $LogFile$
// $Revision: 1.1.1.4 $
// $Author: ttimo $
// $Date: 2000/01/18 00:17:12 $
// $Log: IEpairs.cpp,v $
// Revision 1.1.1.4 2000/01/18 00:17:12 ttimo
// merging in for RC
//
// Revision 1.3 2000/01/17 23:53:41 TBesset
// ready for merge in sourceforge (RC candidate)
//
// Revision 1.2 2000/01/07 16:40:10 TBesset
// merged from BSP frontend
// Revision 1.1.1.3 1999/12/29 18:31:26 TBesset
// Q3Radiant public version
//
//
// Revision 1.2 1999/11/22 17:46:45 Timo & Christine
// merged EARadiant into the main tree
// bug fixes for Q3Plugin / EAPlugin
// export for Robert
//
// Revision 1.1.2.1 1999/11/03 20:37:59 Timo & Christine
// MEAN plugin for Q3Radiant, alpha version
//
//
// DESCRIPTION:
// virtual class to allow plugin operations on entities epairs
//
#include "stdafx.h"
void CEpairsWrapper::GetVectorForKey( char* key, vec3_t vec )
{
::GetVectorForKey( m_pEnt, key, vec );
}
float CEpairsWrapper::FloatForKey( char *key )
{
return ::FloatForKey( m_pEnt, key );
}
char* CEpairsWrapper::ValueForKey( char *key )
{
return ::ValueForKey( m_pEnt, key );
}
void CEpairsWrapper::SetKeyValue( char *key, char *value )
{
::SetKeyValue( m_pEnt, key, value );
}
void CEpairsWrapper::GetEntityOrigin( vec3_t vec )
{
VectorCopy( m_pEnt->origin, vec );
}
// taken from Ritual's version of Q3Radiant ( Entity_CalculateRotatedBounds )
void CEpairsWrapper::CalculateRotatedBounds( vec3_t mins, vec3_t maxs )
{
entity_t *ent = m_pEnt;
int i;
float angle;
vec3_t angles;
vec3_t forward,right,up;
vec3_t rotmins, rotmaxs;
float trans[3][3];
qboolean changed;
char tempangles[ 128 ];
memset( angles, 0, sizeof(vec3_t) );
::GetVectorForKey (ent, "angles", angles);
changed = false;
while ( angles[0] < 0 )
{
changed = true;
angles[0] += 360;
}
while ( angles[0] > 359 )
{
changed = true;
angles[0] -= 360;
}
while ( angles[1] < 0 )
{
changed = true;
angles[1] += 360;
}
while ( angles[1] > 359 )
{
changed = true;
angles[1] -= 360;
}
while ( angles[2] < 0 )
{
changed = true;
angles[2] += 360;
}
while ( angles[2] > 359 )
{
changed = true;
angles[2] -= 360;
}
if ( changed )
{
sprintf( tempangles, "%d %d %d", (int)angles[0], (int)angles[1], (int)angles[2] );
::SetKeyValue ( ent, "angles", tempangles );
}
angle = ::FloatForKey (ent, "angle");
if ( fabs(angle) > 2 )
{
angles[1] = angle;
}
else if (angle == -1)
{
angles[0] = -90;
}
else if (angle == -2)
{
angles[0] = 90;
}
::AngleVectors( angles, forward, right, up );
for (i=0 ; i<3 ; i++)
{
trans[i][0] = forward[i];
trans[i][1] = -right[i];
trans[i][2] = up[i];
}
ClearBounds( rotmins, rotmaxs );
for ( i = 0; i < 8; i++ )
{
int j;
vec3_t tmp, rottemp;
if ( i & 1 )
tmp[0] = mins[0];
else
tmp[0] = maxs[0];
if ( i & 2 )
tmp[1] = mins[1];
else
tmp[1] = maxs[1];
if ( i & 4 )
tmp[2] = mins[2];
else
tmp[2] = maxs[2];
for (j=0; j<3 ; j++)
{
rottemp[j] = DotProduct( tmp, trans[j] );
}
AddPointToBounds( rottemp, rotmins, rotmaxs );
}
VectorCopy( rotmins, mins );
VectorCopy( rotmaxs, maxs );
}