Beispiel #1
0
void GetAttachment(CBaseEntity *pEntity, int iBone, Vector *pVecOrigin, Vector *pVecAngles)
{
	Vector vecOrigin, vecAngles;
	edict_t *pEdict = pEntity->edict();

	// force to update frame
	StudioFrameAdvanceEnt(pEdict);

	GET_ATTACHMENT(pEdict, iBone, vecOrigin, vecAngles);

	if (!pEntity->IsPlayer()) {
		FixupAngles(pEdict, vecOrigin);
	}

	if (pVecOrigin) {
		*pVecOrigin = vecOrigin;
	}

	if (pVecAngles) {
		*pVecAngles = vecAngles;
	}
}
Beispiel #2
0
/* <10984> ../cstrike/dlls/animating.cpp:208 */
NOXREF void CBaseAnimating::GetAttachment(int iAttachment, Vector &origin, Vector &angles)
{
	GET_ATTACHMENT(ENT(pev), iAttachment, origin, angles);
}
Beispiel #3
0
bool ParticleSystem::UpdateParticle( particle *part, float frametime )
{
	if( frametime == 0 ) return true;
	part->age += frametime;

	edict_t *source = GetEntityByIndex( m_iEntIndex );
	if( !source ) return false;	// total paranoia :)

	// is this particle bound to an entity?
	if( part->m_iEntIndex )
	{
		if ( enable )
		{
			if( m_iEntAttachment )
			{
				Vector	pos = Vector( 0, 0, 0 );

				GET_ATTACHMENT( source, m_iEntAttachment, pos, NULL );
				if( pos == Vector( 0, 0, 0 )) pos = source->v.origin; // missed attachment
				part->velocity = (pos - part->origin ) / frametime;
				part->origin = pos;
			}
			else
			{
				part->velocity = ( source->v.origin - part->origin ) / frametime;
				part->origin = source->v.origin;
			}
		}
		else
		{
			// entity is switched off, die
			return false;
		}
	}
	else
	{
		// not tied to an entity, check whether it's time to die
		if( part->age_death >= 0 && part->age > part->age_death )
			return false;

		// apply acceleration and velocity
		Vector vecOldPos = part->origin;

		if ( part->m_fDrag )
			part->velocity = part->velocity + (-part->m_fDrag * frametime) * ( part->velocity - part->m_vecWind );
		part->velocity = part->velocity + frametime * part->accel;
		part->origin = part->origin + frametime * part->velocity;

		if( part->pType->m_bBouncing )
		{
			Vector vecTarget = part->origin + frametime * part->velocity;
			TraceResult tr;
			TRACE_LINE( part->origin, vecTarget, true, source, &tr );

			if( tr.flFraction < 1.0f )
			{
				part->origin = tr.vecEndPos;
				float bounceforce = DotProduct( tr.vecPlaneNormal, part->velocity );
				float newspeed = (1.0f - part->pType->m_BounceFriction.GetInstance());
				part->velocity = part->velocity * newspeed;
				part->velocity = part->velocity + (-bounceforce * ( newspeed + part->pType->m_Bounce.GetInstance())) * tr.vecPlaneNormal;
			}
		}
	}


	// spray children
	if ( part->age_spray && part->age > part->age_spray )
	{
		part->age_spray = part->age + 1/part->pType->m_SprayRate.GetInstance();

		// particle *pChild = ActivateParticle();
		if (part->pType->m_pSprayType)
		{
			particle *pChild = part->pType->m_pSprayType->CreateParticle(this);
			if (pChild)
			{
				pChild->origin = part->origin;
				float fSprayForce = part->pType->m_SprayForce.GetInstance();
				pChild->velocity = part->velocity;
				if (fSprayForce)
				{
					float fSprayPitch = part->pType->m_SprayPitch.GetInstance() - source->v.angles.x;
					float fSprayYaw = part->pType->m_SprayYaw.GetInstance() - source->v.angles.y;
					float fSprayRoll = source->v.angles.z;
					float fForceCosPitch = fSprayForce*CosLookup(fSprayPitch);
					pChild->velocity.x += CosLookup(fSprayYaw) * fForceCosPitch;
					pChild->velocity.y += SinLookup(fSprayYaw) * fForceCosPitch + SinLookup(fSprayYaw) * fSprayForce * SinLookup(fSprayRoll);
					pChild->velocity.z -= SinLookup(fSprayPitch) * fSprayForce * CosLookup(fSprayRoll);
				}
			}
		}
	}

	part->m_fSize += part->m_fSizeStep * frametime;
	part->m_fAlpha += part->m_fAlphaStep * frametime;
	part->m_fRed += part->m_fRedStep * frametime;
	part->m_fGreen += part->m_fGreenStep * frametime;
	part->m_fBlue += part->m_fBlueStep * frametime;
	part->frame += part->m_fFrameStep * frametime;
	if ( part->m_fAngleStep )
	{
		part->m_fAngle += part->m_fAngleStep * frametime;
		while ( part->m_fAngle < 0 ) part->m_fAngle += 360;
		while ( part->m_fAngle > 360 ) part->m_fAngle -= 360;
	}
	return true;
}
//=========================================================
//=========================================================
void CBaseAnimating :: GetAttachment ( int iAttachment, Vector &origin )
{
	Vector vecTemp;

	GET_ATTACHMENT( ENT(pev), iAttachment, origin, vecTemp );
}