177 lines
3.5 KiB
C++
177 lines
3.5 KiB
C++
// Copyright (C) 2007 Id Software, Inc.
|
|
//
|
|
|
|
#include "precompiled.h"
|
|
#pragma hdrstop
|
|
|
|
#if defined( _DEBUG ) && !defined( ID_REDIRECT_NEWDELETE )
|
|
#define new DEBUG_NEW
|
|
#undef THIS_FILE
|
|
static char THIS_FILE[] = __FILE__;
|
|
#endif
|
|
|
|
#include "PlayerIcon.h"
|
|
#include "Player.h"
|
|
#include "misc/WorldToScreen.h"
|
|
#include "../decllib/declTypeHolder.h"
|
|
#include "rules/GameRules.h"
|
|
#include "vehicles/JetPack.h"
|
|
|
|
/*
|
|
===============
|
|
idPlayerIcon::idPlayerIcon
|
|
===============
|
|
*/
|
|
idPlayerIcon::idPlayerIcon( void ) {
|
|
activeIcon = -1;
|
|
}
|
|
|
|
/*
|
|
===============
|
|
idPlayerIcon::~idPlayerIcon
|
|
===============
|
|
*/
|
|
idPlayerIcon::~idPlayerIcon( void ) {
|
|
}
|
|
|
|
/*
|
|
===============
|
|
idPlayerIcon::Init
|
|
===============
|
|
*/
|
|
void idPlayerIcon::Init( const idDict& dict ) {
|
|
}
|
|
|
|
/*
|
|
===============
|
|
idPlayerIcon::GetPosition
|
|
===============
|
|
*/
|
|
void idPlayerIcon::GetPosition( idPlayer *player, jointHandle_t joint, float offset, idVec3& origin ) {
|
|
idEntity* entity = player->GetProxyEntity();
|
|
if ( entity != NULL && !entity->IsType( sdJetPack::Type ) ) {
|
|
jointHandle_t proxyJoint = entity->GetUsableInterface()->GetPlayerIconJoint( player );
|
|
if ( proxyJoint != INVALID_JOINT ) {
|
|
entity->GetAnimator()->GetJointTransform( proxyJoint, gameLocal.time, origin );
|
|
origin = entity->GetLastPushedOrigin() + ( origin * entity->GetLastPushedAxis() );
|
|
return;
|
|
}
|
|
}
|
|
|
|
if ( joint != INVALID_JOINT ) {
|
|
idMat3 tempAxis;
|
|
player->GetWorldOriginAxisNoUpdate( joint, origin, tempAxis );
|
|
} else {
|
|
origin = player->GetLastPushedOrigin();
|
|
origin.z += player->GetPhysics()->GetBounds().GetMaxs().z;
|
|
}
|
|
|
|
origin.z += offset;
|
|
}
|
|
|
|
/*
|
|
===============
|
|
idPlayerIcon::GetActiveIcon
|
|
===============
|
|
*/
|
|
const idMaterial* idPlayerIcon::GetActiveIcon( void ) {
|
|
UpdateIcons();
|
|
if ( activeIcon == -1 ) {
|
|
return NULL;
|
|
}
|
|
|
|
return icons[ activeIcon ].material;
|
|
}
|
|
|
|
/*
|
|
===============
|
|
idPlayerIcon::FreeIcon
|
|
===============
|
|
*/
|
|
void idPlayerIcon::FreeIcon( qhandle_t handle ) {
|
|
if ( handle < 0 || handle >= icons.Num() ) {
|
|
return;
|
|
}
|
|
|
|
icons[ handle ].material = NULL;
|
|
|
|
if ( handle == activeIcon ) {
|
|
FindActiveIcon();
|
|
}
|
|
}
|
|
|
|
/*
|
|
===============
|
|
idPlayerIcon::CreateIcon
|
|
===============
|
|
*/
|
|
qhandle_t idPlayerIcon::CreateIcon( const idMaterial* material, int priority, int timeout ) {
|
|
if ( !material ) {
|
|
return -1;
|
|
}
|
|
|
|
int i;
|
|
for ( i = 0; i < icons.Num(); i++ ) {
|
|
if ( icons[ i ].material == NULL || icons[ i ].material == material ) {
|
|
break;
|
|
}
|
|
}
|
|
if ( i >= icons.Num() ) {
|
|
i = icons.Num();
|
|
icons.Alloc();
|
|
}
|
|
|
|
icons[ i ].material = material;
|
|
icons[ i ].priority = priority;
|
|
if ( timeout <= 0 ) {
|
|
icons[ i ].timeout = 0;
|
|
} else {
|
|
icons[ i ].timeout = gameLocal.time + timeout;
|
|
}
|
|
|
|
FindActiveIcon();
|
|
|
|
return i;
|
|
}
|
|
|
|
/*
|
|
===============
|
|
idPlayerIcon::FindActiveIcon
|
|
===============
|
|
*/
|
|
void idPlayerIcon::FindActiveIcon( void ) {
|
|
int bestValue = -1;
|
|
activeIcon = -1;
|
|
|
|
for ( int i = 0; i < icons.Num(); i++ ) {
|
|
if ( !icons[ i ].material ) {
|
|
continue;
|
|
}
|
|
|
|
if ( icons[ i ].priority > bestValue ) {
|
|
activeIcon = i;
|
|
bestValue = icons[ i ].priority;
|
|
}
|
|
}
|
|
}
|
|
|
|
/*
|
|
===============
|
|
idPlayerIcon::UpdateIcons
|
|
===============
|
|
*/
|
|
void idPlayerIcon::UpdateIcons( void ) {
|
|
bool changed = false;
|
|
|
|
for ( int i = 0; i < icons.Num(); i++ ) {
|
|
if ( icons[ i ].timeout != 0 && icons[ i ].timeout < gameLocal.time ) {
|
|
icons[ i ].material = NULL;
|
|
changed = true;
|
|
}
|
|
}
|
|
|
|
if ( changed ) {
|
|
FindActiveIcon();
|
|
}
|
|
}
|