⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 laserbeamfx.cpp

📁 Blood 2全套源码
💻 CPP
字号:
// ----------------------------------------------------------------------- //
//
// MODULE  : LaserBeamFX.cpp
//
// PURPOSE : Special FX class for general laser beam FX using models
//
// CREATED : 8/10/98
//
// ----------------------------------------------------------------------- //

#include "LaserBeamFX.h"
#include "cpp_client_de.h"
#include "ClientUtilities.h"
#include "ClientServerShared.h"
#include "BloodClientShell.h"
#include "SFXMsgIds.h"
#include "ExplosionFX.h"

// ----------------------------------------------------------------------- //
//
//	ROUTINE:	CLaserBeamFX::Init
//
//	PURPOSE:	Init the stream
//
// ----------------------------------------------------------------------- //

DBOOL CLaserBeamFX::Init(SFXCREATESTRUCT* psfxCreateStruct)
{
	if (!CSpecialFX::Init(psfxCreateStruct)) return DFALSE;

	LASERBEAMCREATESTRUCT	*pLS = (LASERBEAMCREATESTRUCT*)psfxCreateStruct;

	VEC_COPY(m_vSource, pLS->vSource);
	VEC_COPY(m_vDest, pLS->vDest);
	m_nType = pLS->nType;

	m_fStartTime = 0.0f;
	m_bFirstUpdate = 1;
	SetupBeam();
	return DTRUE;
}


// ----------------------------------------------------------------------- //
//
//	ROUTINE:	CLaserBeamFX::CreateObject
//
//	PURPOSE:	Create object associated the model
//
// ----------------------------------------------------------------------- //

DBOOL CLaserBeamFX::CreateObject(CClientDE *pClientDE)
{
	if (!pClientDE ) return DFALSE;
	m_pClientDE = pClientDE;

	ObjectCreateStruct	ocStruct;
	INIT_OBJECTCREATESTRUCT(ocStruct);

	ocStruct.m_ObjectType = OT_MODEL;
	ocStruct.m_Flags = FLAG_VISIBLE;

	if(m_hstrModel)		_mbscpy((unsigned char*)ocStruct.m_Filename, (const unsigned char*)m_hstrModel);
		else			_mbscpy((unsigned char*)ocStruct.m_Filename, (const unsigned char*)"Models\\Ammo\\beam.abc");

	if(m_hstrTexture)	_mbscpy((unsigned char*)ocStruct.m_SkinName, (const unsigned char*)m_hstrTexture);
		else			_mbscpy((unsigned char*)ocStruct.m_SkinName, (const unsigned char*)"Skins\\Ammo\\beamred.dtx");

	m_hObject = pClientDE->CreateObject(&ocStruct);

	// Gouraud shade and make full bright...
	DDWORD dwFlags = pClientDE->GetObjectFlags(m_hObject);
	pClientDE->SetObjectFlags(m_hObject, dwFlags | FLAG_MODELGOURAUDSHADE | FLAG_NOLIGHT);

	DFLOAT	r, g, b, a;
	pClientDE->GetObjectColor(m_hObject, &r, &g, &b, &a);
	m_pClientDE->SetObjectColor(m_hObject, r, g, b, m_fAlpha);

	return DTRUE;
}


// ----------------------------------------------------------------------- //
//
//	ROUTINE:	CLaserBeamFX::Update
//
//	PURPOSE:	Update the particles
//
// ----------------------------------------------------------------------- //

DBOOL CLaserBeamFX::Update()
{
	if(!m_pClientDE)	return DFALSE;

	DFLOAT	fTime = m_pClientDE->GetTime() - m_fStartTime;

	// All lasers are now burst beams... no constant beams anymore
	if(m_bFirstUpdate)
	{
		m_fStartTime = m_pClientDE->GetTime();
		fTime = 0.0f;
		m_bFirstUpdate = 0;
		UpdateBeam();
	}

	// Scale the beam to the proper width (the length will not change in this type
	if(fTime <= m_fScaleTime)
	{
		DFLOAT	scale = m_fMinScale + ((m_fMaxScale - m_fMinScale) * (fTime / m_fScaleTime));
		VEC_SET(m_vScale, scale, scale, m_vScale.z);
	}
	else
		{ VEC_SET(m_vScale, m_fMaxScale, m_fMaxScale, m_vScale.z); }

	m_pClientDE->SetObjectScale(m_hObject, &m_vScale);

	// Set the alpha for the object
	DFLOAT	r, g, b, curAlpha;
	m_pClientDE->GetObjectColor(m_hObject, &r, &g, &b, &curAlpha);

	if(fTime >= m_fDuration - m_fFadeTime)
	{
		DFLOAT	timeRatio = (fTime - (m_fDuration - m_fFadeTime)) / m_fFadeTime;
		curAlpha = m_fAlpha - (m_fAlpha * timeRatio);
	}
	else
	{
		curAlpha = m_fAlpha;
	}

	m_pClientDE->SetObjectColor(m_hObject, r, g, b, curAlpha);

	return (fTime < m_fDuration);
}


// ----------------------------------------------------------------------- //
//
//	ROUTINE:	CLaserBeamFX::SetupBeam()
//
//	PURPOSE:	Update the beam model
//
// ----------------------------------------------------------------------- //

void CLaserBeamFX::SetupBeam()
{
	// Set the parameters of the laser and the model to use
	switch(m_nType)
	{
		case	LASER_RED_SMALL:
		case	LASER_GREEN_SMALL:
		case	LASER_BLUE_SMALL:
		case	LASER_WHITE_SMALL:
		case	LASER_YELLOW_SMALL:
		case	LASER_ORANGE_SMALL:
		case	LASER_PURPLE_SMALL:
			m_fMinScale			= 0.05f;
			m_fMaxScale			= 1.0f;
			m_fDuration			= 0.5f;
			m_fScaleTime		= 0.25f;
			m_fFadeTime			= 0.25f;
			m_fAlpha			= 0.5f;
			m_bWaveForm			= 0;
			m_hstrModel			= "Models\\Ammo\\beam.abc";
			break;

		case	LASER_RED_LARGE:
		case	LASER_GREEN_LARGE:
		case	LASER_BLUE_LARGE:
		case	LASER_WHITE_LARGE:
		case	LASER_YELLOW_LARGE:
		case	LASER_ORANGE_LARGE:
		case	LASER_PURPLE_LARGE:
			m_fMinScale			= 0.1f;
			m_fMaxScale			= 2.5f;
			m_fDuration			= 1.0f;
			m_fScaleTime		= 0.35f;
			m_fFadeTime			= 0.35f;
			m_fAlpha			= 0.5f;
			m_bWaveForm			= 0;
			m_hstrModel			= "Models\\Ammo\\beam.abc";
			break;

		default:
			m_fMinScale			= 0.0f;
			m_fMaxScale			= 1.0f;
			m_fDuration			= 0.5f;
			m_fScaleTime		= 0.25f;
			m_fFadeTime			= 0.25f;
			m_fAlpha			= 0.5f;
			m_bWaveForm			= 0;
			m_hstrModel			= "Models\\Ammo\\beam.abc";
			break;
	}

	// Set the texture to use
	switch(m_nType)
	{
		case	LASER_RED_SMALL:
		case	LASER_RED_LARGE:
			m_hstrTexture		= "Skins\\Ammo\\beamred.dtx";
			break;
		case	LASER_GREEN_SMALL:
		case	LASER_GREEN_LARGE:
			m_hstrTexture		= "Skins\\Ammo\\beamgreen.dtx";
			break;
		case	LASER_BLUE_SMALL:
		case	LASER_BLUE_LARGE:
			m_hstrTexture		= "Skins\\Ammo\\beamblue.dtx";
			break;
		case	LASER_WHITE_SMALL:
		case	LASER_WHITE_LARGE:
			m_hstrTexture		= "Skins\\Ammo\\beamwhite.dtx";
			break;
		case	LASER_YELLOW_SMALL:
		case	LASER_YELLOW_LARGE:
			m_hstrTexture		= "Skins\\Ammo\\beamyellow.dtx";
			break;
		case	LASER_ORANGE_SMALL:
		case	LASER_ORANGE_LARGE:
			m_hstrTexture		= "Skins\\Ammo\\beamorange.dtx";
			break;
		case	LASER_PURPLE_SMALL:
		case	LASER_PURPLE_LARGE:
			m_hstrTexture		= "Skins\\Ammo\\beampurple.dtx";
			break;
		default:
			m_hstrTexture		= "Skins\\Ammo\\beamred.dtx";
			break;
	}
}

// ----------------------------------------------------------------------- //
//
//	ROUTINE:	CLaserBeamFX::UpdateBeam()
//
//	PURPOSE:	Update the beam model
//
// ----------------------------------------------------------------------- //

DBOOL CLaserBeamFX::UpdateBeam()
{
	if(!m_pClientDE)	return DFALSE;

	DVector		vDist, vUp;
	DRotation	rRot;

	VEC_SET(vUp, 0.0f, 1.0f, 0.0f);
	VEC_SUB(vDist, m_vDest, m_vSource);

	m_pClientDE->AlignRotation(&rRot, &vDist, &vUp);
	m_pClientDE->SetObjectPos(m_hObject, &m_vSource);
	m_pClientDE->SetObjectRotation(m_hObject, &rRot);

	VEC_SET(m_vScale, m_fMinScale, m_fMinScale, VEC_MAG(vDist));
	return	DTRUE;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -