コード例 #1
0
//------------------------------------------------------------------------
int CTracerManager::EmitTracer(const STracerParams &params, const EntityId bulletId)
{
	if(!gEnv->IsClient())
		return -1;

	CRecordingSystem* pRecordingSystem = g_pGame->GetRecordingSystem();
	if (pRecordingSystem)
	{
		if (!pRecordingSystem->OnEmitTracer(params))
		{
			return -1;
		}
	}

	int idx = 0;

	if(m_numActiveTracers < kMaxNumTracers)
	{
		//Add to end of array
		idx = m_numActiveTracers;
		m_tracerPool[idx].CreateEntity();
		m_tracerPool[idx].Reset(params.position, params.destination);
		m_numActiveTracers++;
	}
	else
	{
		//Find the oldest existing tracer and remove
		assert(!"Too many tracers in existence! Removing oldest");

		float oldest = 0.0f;

		for(int i = 0; i < kMaxNumTracers; i++)
		{
			CryPrefetchUnsafe(&m_tracerPool[i+4]);
			if(m_tracerPool[i].m_age > oldest)
			{
				oldest = m_tracerPool[i].m_age;
				idx = i;
			}
		}

		m_tracerPool[idx].Reset(params.position, params.destination);
	}

	CTracer& tracer = m_tracerPool[idx];

	tracer.m_boundToBulletId = bulletId;
	tracer.m_tracerFlags = kTracerFlag_active;
	tracer.m_effectSlot = -1;
	tracer.m_geometryOpacity = params.geometryOpacity;
	if (params.geometry && params.geometry[0])
	{
		tracer.SetGeometry(params.geometry, params.scale);
		tracer.m_tracerFlags |= kTracerFlag_useGeometry;
	}

	tracer.SetLifeTime(params.lifetime);

	tracer.m_speed = params.speed;
	tracer.m_pos = params.position;
	tracer.m_startingPos = params.position;
	tracer.m_dest = params.destination;
	tracer.m_fadeOutTime = params.delayBeforeDestroy;
	
	if(params.scaleToDistance)
	{
		tracer.m_tracerFlags |= kTracerFlag_scaleToDistance;
	}

  if(params.dontTranslate)
  {
    tracer.m_tracerFlags |= kTracerFlag_dontTranslate;
  }

	if(params.updateDestPosFromBullet)
	{
		tracer.m_tracerFlags |= kTracerFlag_updateDestFromBullet;
	}
	
	tracer.m_startFadeOutTime = params.startFadeOutTime;
	tracer.m_scale = params.scale;
	tracer.m_slideFrac = params.slideFraction;

	if (IEntity *pEntity=gEnv->pEntitySystem->GetEntity(tracer.m_entityId))
	{
		pEntity->Hide(0);
	}

	// set effect after unhiding the entity, or else the particle emitter is created hidden
	if (params.effect && params.effect[0])
		tracer.SetEffect(params.effect, params.scale);

	return idx;
}