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

📄 modelobject.cpp

📁 Blood 2全套源码
💻 CPP
字号:
// ----------------------------------------------------------------------- //
//
// MODULE  : ModelObject.cpp
//
// PURPOSE : ModelObject class - implementation
//
// CREATED : 12/31/97
//
// ----------------------------------------------------------------------- //

#include "ModelObject.h"
#include "cpp_server_de.h"
#include "ObjectUtilities.h"
#include "SharedDefs.h"


BEGIN_CLASS(CModelObject)
END_CLASS_DEFAULT_FLAGS(CModelObject, BaseClass, NULL, NULL, CF_HIDDEN)


// ----------------------------------------------------------------------- //
//
//	ROUTINE:	CModelObject::CModelObject
//
//	PURPOSE:	Initialize
//
// ----------------------------------------------------------------------- //

CModelObject::CModelObject() : BaseClass(OT_MODEL)
{
	m_bFirstUpdate = DTRUE;

	m_bRotate = DFALSE;
	m_bStopRotateOnGround = DTRUE;
	m_fXRotVel = 0.0;
	m_fYRotVel = 0.0;
	m_fZRotVel = 0.0;
	m_fLastTime = 0.0f;
	m_fPitch = 0.0f;
	m_fYaw = 0.0f;
	m_fRoll = 0.0f;

	VEC_INIT(m_vBaseDims);
}


// ----------------------------------------------------------------------- //
//
//	ROUTINE:	CModelObject::~CModelObject
//
//	PURPOSE:	Destructor
//
// ----------------------------------------------------------------------- //

CModelObject::~CModelObject()
{
}


// ----------------------------------------------------------------------- //
//
//	ROUTINE:	CModelObject::EngineMessageFn
//
//	PURPOSE:	Handle engine messages
//
// ----------------------------------------------------------------------- //

DDWORD CModelObject::EngineMessageFn(DDWORD messageID, void *pData, DFLOAT lData)
{
	switch(messageID)
	{
		case MID_UPDATE:
		{
			if( !Update(( DVector * )pData))
			{
				g_pServerDE->RemoveObject(m_hObject);
			}
			break;
		}

		case MID_PRECREATE:
		{
			ObjectCreateStruct* pStruct = ( ObjectCreateStruct * )pData;
			break;
		}

		case MID_INITIALUPDATE:
		{
			InitialUpdate(( DVector * )pData );
			break;
		}

		default : break;
	}


	return BaseClass::EngineMessageFn(messageID, pData, lData);
}


// ----------------------------------------------------------------------- //
//
//	ROUTINE:	CModelObject::Setup
//
//	PURPOSE:	Set up a ModelObject with the information needed
//
// ----------------------------------------------------------------------- //

void CModelObject::Setup( DFLOAT fLifeTime, DVector *pvRotationPeriods,
						 DBOOL bStopRotateOnGround, DBOOL bRandomizeRotation)
{
	DFLOAT fUpdateTime;

	// Set the life of the object...
	// Numbers less than and equal to zero means it lasts forever...
	m_fLifeTime = fLifeTime;

	if (bRandomizeRotation)
	{
		m_fPitch	= g_pServerDE->Random(0.0f, PIx2);
		m_fYaw		= g_pServerDE->Random(0.0f, PIx2);
		m_fRoll		= g_pServerDE->Random(0.0f, PIx2);
	}

	if( pvRotationPeriods )
	{
		float mag;
		mag = VEC_MAGSQR( *pvRotationPeriods );
		if( mag > 0.001 )
		{
			m_bRotate = DTRUE;
			m_bStopRotateOnGround = bStopRotateOnGround;
			
			if( pvRotationPeriods->x < -0.001 || 0.001f < pvRotationPeriods->x )
				m_fXRotVel = MATH_CIRCLE / pvRotationPeriods->x;
			if( pvRotationPeriods->y < -0.001 || 0.001f < pvRotationPeriods->y )
				m_fYRotVel = MATH_CIRCLE / pvRotationPeriods->y;
			if( pvRotationPeriods->z < -0.001 || 0.001f < pvRotationPeriods->z )
				m_fZRotVel = MATH_CIRCLE / pvRotationPeriods->z;

		}
	}

	// Only update if we need to...
	if( m_bRotate )
		fUpdateTime = 0.01f;
	else if( m_fLifeTime > 0.0f )
		fUpdateTime = m_fLifeTime;
	else
		fUpdateTime = 0.0f;

	g_pServerDE->SetNextUpdate( m_hObject, fUpdateTime );
}



// ----------------------------------------------------------------------- //
//
//	ROUTINE:	CModelObject::UpdateRotation
//
//	PURPOSE:	Update sprite scaling
//
// ----------------------------------------------------------------------- //

void CModelObject::UpdateRotation()
{
	DFLOAT fTime = g_pServerDE->GetTime();
	DFLOAT fDeltaTime = fTime - m_fLastTime;

	DRotation rRot;
	g_pServerDE->GetObjectRotation( m_hObject, &rRot );

	if( m_fXRotVel < 0.0f || 0.0f < m_fXRotVel )
		m_fPitch += m_fXRotVel * fDeltaTime;
	if( m_fYRotVel < 0.0f || 0.0f < m_fYRotVel )
		m_fYaw += m_fYRotVel * fDeltaTime;
	if( m_fZRotVel < 0.0f || 0.0f < m_fZRotVel )
		m_fRoll += m_fZRotVel * fDeltaTime;

	g_pServerDE->SetupEuler(&rRot, m_fPitch, m_fYaw, m_fRoll);
	g_pServerDE->SetObjectRotation(m_hObject, &rRot);	

	m_fLastTime = fTime;
}


// ----------------------------------------------------------------------- //
//
//	ROUTINE:	CModelObject::InitialUpdate
//
//	PURPOSE:	Do initial updating
//
// ----------------------------------------------------------------------- //

DBOOL CModelObject::InitialUpdate(DVector*)
{
	g_pServerDE->GetObjectDims(m_hObject, &m_vBaseDims);

	g_pServerDE->SetNextUpdate(m_hObject, (DFLOAT)0.01);

	return DTRUE;
}


// ----------------------------------------------------------------------- //
//
//	ROUTINE:	CModelObject::FirstUpdate
//
//	PURPOSE:	Do First updating
//
// ----------------------------------------------------------------------- //

void CModelObject::FirstUpdate()
{
	m_fStartTime = g_pServerDE->GetTime();
}

// ----------------------------------------------------------------------- //
//
//	ROUTINE:	CModelObject::Update
//
//	PURPOSE:	Update the ModelObject
//
// ----------------------------------------------------------------------- //

DBOOL CModelObject::Update(DVector* pMovement)
{
	CollisionInfo collisionInfo;

	if( m_bFirstUpdate )
	{
		FirstUpdate();
		m_bFirstUpdate = DFALSE;
	}

	if( m_bRotate ) 
	{
		if( m_bStopRotateOnGround )
		{
			g_pServerDE->GetStandingOn( m_hObject, &collisionInfo );
			
			if( collisionInfo.m_hObject) 
				m_bRotate = DFALSE;
			else
				UpdateRotation();
		}
		else
			UpdateRotation();
	}

	DFLOAT fTime = g_pServerDE->GetTime();

	// Only update if we need to...
	if( m_bRotate )
		g_pServerDE->SetNextUpdate( m_hObject, 0.01f );
	else
		g_pServerDE->SetNextUpdate( m_hObject, m_fLifeTime - ( fTime - m_fStartTime ));

	if( m_fLifeTime > 0.0f )
		return (fTime < m_fStartTime + m_fLifeTime );
	else
		return DTRUE;
}


⌨️ 快捷键说明

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