engine/game/weaponBeam.cc
2024-01-07 04:36:33 +00:00

77 lines
2 KiB
C++

//-----------------------------------------------------------------------------
// V12 Engine
//
// Copyright (c) 2001 GarageGames.Com
// Portions Copyright (c) 2001 by Sierra Online, Inc.
//-----------------------------------------------------------------------------
#include "Math/mMath.h"
#include "game/weaponBeam.h"
#include "PlatformWin32/platformGL.h"
//**************************************************************************
// Weapon Beam
//**************************************************************************
WeaponBeam::WeaponBeam()
{
};
//--------------------------------------------------------------------------
void WeaponBeam::render( F32 width, F32 UVOffset, F32 numRepeat )
{
width *= 0.5;
glBegin(GL_TRIANGLE_FAN);
glTexCoord2f( UVOffset, 0.0 );
glVertex3fv( mData.startPos + mData.axis * width );
glTexCoord2f( UVOffset, 1.0 );
glVertex3fv( mData.startPos - mData.axis * width );
glTexCoord2f( numRepeat+UVOffset, 1.0 );
glVertex3fv( mData.endRenderPos - mData.axis * width );
glTexCoord2f( numRepeat+UVOffset, 0.0 );
glVertex3fv( mData.endRenderPos + mData.axis * width );
glEnd();
}
//--------------------------------------------------------------------------
void WeaponBeam::adjustEdge( BeamData &beamData )
{
beamData.onEdge = false;
beamData.endRenderPos = beamData.endPos;
if( beamData.angToCamPos < BEAM_EDGE_TOLERANCE )
{
Point3F diff = beamData.direction - (-beamData.dirFromCam);
F32 curOffset = diff.len();
if( curOffset <= BEAM_EDGE_EPSILON )
{
// beam is perfectly on edge
curOffset = 0.0;
diff.set(0.0, 0.0, 0.0 );
beamData.onEdge = true;
}
else
{
diff.normalize();
}
diff *= BEAM_EDGE_ADJUST - curOffset;
Point3F newDir = beamData.direction + diff;
newDir.normalizeSafe();
beamData.endRenderPos = beamData.startPos + newDir * beamData.length;
}
}