Beispiel #1
0
static void G_AdjustSingleClientPosition( gentity_t* ent, int time ) {
	int i, j;

	if ( time > level.time ) {
		time = level.time;
	} // no lerping forward....

	// find a pair of markers which bound the requested time
	i = j = ent->client->topMarker;
	do {
		if ( ent->client->clientMarkers[i].time <= time ) {
			break;
		}

		j = i;
		i--;
		if ( i < 0 ) {
			i = MAX_CLIENT_MARKERS - 1;
		}
	} while ( i != ent->client->topMarker );

	if ( i == j ) { // oops, no valid stored markers
		return;
	}

	// save current position to backup
	if ( ent->client->backupMarker.time != level.time ) {
		VectorCopy( ent->r.currentOrigin, ent->client->backupMarker.origin );
		VectorCopy( ent->r.mins, ent->client->backupMarker.mins );
		VectorCopy( ent->r.maxs, ent->client->backupMarker.maxs );
		ent->client->backupMarker.time = level.time;
	}

	if ( i != ent->client->topMarker ) {
		float frac = (float)( time - ent->client->clientMarkers[i].time ) /
					 (float)( ent->client->clientMarkers[j].time - ent->client->clientMarkers[i].time );

		LerpPosition( ent->client->clientMarkers[i].origin, ent->client->clientMarkers[j].origin, frac, ent->r.currentOrigin );
		LerpPosition( ent->client->clientMarkers[i].mins, ent->client->clientMarkers[j].mins, frac, ent->r.mins );
		LerpPosition( ent->client->clientMarkers[i].maxs, ent->client->clientMarkers[j].maxs, frac, ent->r.maxs );
	} else {
		VectorCopy( ent->client->clientMarkers[j].origin, ent->r.currentOrigin );
		VectorCopy( ent->client->clientMarkers[j].mins, ent->r.mins );
		VectorCopy( ent->client->clientMarkers[j].maxs, ent->r.maxs );
	}

	trap_LinkEntity( ent );
}
Beispiel #2
0
static void G_AdjustSingleClientPosition(gentity_t *ent, int time) {
	int i, j;

	if (time > level.time) {
		time = level.time;
	} // no lerping forward....

	i = j = ent->client->topMarker;

	do {
		if (ent->client->clientMarkers[i].time <= time) {
			break;
		}

		j = i;
		i = (i > 0) ? i - 1 : MAX_CLIENT_MARKERS;
	} while (i != ent->client->topMarker);

	if (i == j) { // oops, no valid stored markers
		return;
	}
	// OSP - I don't trust this caching, as the "warped" player's position updates potentially
	//       wont be counted after his think until the next server frame, which will result
	//       in a bad backupMarker
// if (ent->client->backupMarker.time != level.time) {
// 	ent->client->backupMarker.time = level.time;
	VectorCopy(ent->r.currentOrigin, ent->client->backupMarker.origin);
	VectorCopy(ent->r.mins, ent->client->backupMarker.mins);
	VectorCopy(ent->r.maxs, ent->client->backupMarker.maxs);
//}

	if (i != ent->client->topMarker) {
		float frac = ((float)(ent->client->clientMarkers[j].time - time)) / (ent->client->clientMarkers[j].time - ent->client->clientMarkers[i].time);

		LerpPosition(ent->client->clientMarkers[j].origin, ent->client->clientMarkers[i].origin, frac, ent->r.currentOrigin);
		LerpPosition(ent->client->clientMarkers[j].mins, ent->client->clientMarkers[i].mins, frac, ent->r.mins);
		LerpPosition(ent->client->clientMarkers[j].maxs, ent->client->clientMarkers[i].maxs, frac, ent->r.maxs);
	} else {
		VectorCopy(ent->client->clientMarkers[j].origin, ent->r.currentOrigin);
		VectorCopy(ent->client->clientMarkers[j].mins, ent->r.mins);
		VectorCopy(ent->client->clientMarkers[j].maxs, ent->r.maxs);
	}

	trap_LinkEntity(ent);
}
static void G_AdjustSingleClientPosition( gentity_t* ent, int time ) {
	int i, j;

	if( time > level.time) {
		time = level.time;
	} // no lerping forward....

	i = j = ent->client->topMarker;
	do {
		if(ent->client->clientMarkers[i].time <= time) {
			break;
		}

		j = i;
		i = (i > 0) ? i - 1 : MAX_CLIENT_MARKERS - 1;
	} while(i != ent->client->topMarker);

	if(i == j) { // oops, no valid stored markers
		return;
	}

	VectorCopy(ent->r.currentOrigin,	ent->client->backupMarker.origin);
	VectorCopy(ent->r.mins,				ent->client->backupMarker.mins);
	VectorCopy(ent->r.maxs,				ent->client->backupMarker.maxs);

	if(i != ent->client->topMarker) {
		float frac = ((float)(ent->client->clientMarkers[j].time - time)) / (ent->client->clientMarkers[j].time - ent->client->clientMarkers[i].time);

		LerpPosition(ent->client->clientMarkers[j].origin,		ent->client->clientMarkers[i].origin,	frac,	ent->r.currentOrigin);
		LerpPosition(ent->client->clientMarkers[j].mins,		ent->client->clientMarkers[i].mins,		frac,	ent->r.mins);
		LerpPosition(ent->client->clientMarkers[j].maxs,		ent->client->clientMarkers[i].maxs,		frac,	ent->r.maxs);
	} else {
		VectorCopy( ent->client->clientMarkers[j].origin,		ent->r.currentOrigin );
		VectorCopy( ent->client->clientMarkers[j].mins,			ent->r.mins );
		VectorCopy( ent->client->clientMarkers[j].maxs,			ent->r.maxs );
	}

	trap_LinkEntity( ent );
}
Beispiel #4
0
void CMinotaurSpawn::Update()
{
	//CAABB* leftCollider = ((CAABB*)(m_pvColliders[LEFT_COLLIDER_INDEX]->GetBounds()));
	//CAABB* rightCollider = ((CAABB*)(m_pvColliders[RIGHT_COLLIDER_INDEX]->GetBounds()));

	//DEBUG_UTIL::DrawAABBCollider(leftCollider->Min(), leftCollider->Max());
	//DEBUG_UTIL::DrawAABBCollider(rightCollider->Min(), rightCollider->Max(), XMFLOAT3(1.0f, 1.0f, 0.0f));

	if (m_pDayNight->IsNight())
	{
		if (isDay == true)
		{
			isDay = false;
			LerpRatio = 0.0f;
			isMoving = true;
			std::swap(startLeftPos, endLeftPos);
			std::swap(startRightPos, endRightPos);

		}

	}
	else
	{
		if (isDay == false)
		{
			LerpRatio = 0.0f;

			isDay = true;
			isMoving = true;
			std::swap(startLeftPos, endLeftPos);
			std::swap(startRightPos, endRightPos);
		}
	}


	if (isMoving == true)
	{
		LerpRatio += DELTA_TIME();
		if (LerpRatio > MAX_OPEN_TIME)
		{
			LerpRatio = MAX_OPEN_TIME;
			isMoving = false;
		}
		float R = (LerpRatio / MAX_OPEN_TIME);

		XMFLOAT3 finalLeftPos = LerpPosition(startLeftPos, endLeftPos, R);
		XMFLOAT3 finalRightPos = LerpPosition(startRightPos, endRightPos, R);

		m_vRenderMeshes[LEFT_MESH_INDEX]->SetPosition(finalLeftPos);
		m_vRenderMeshes[RIGHT_MESH_INDEX]->SetPosition(finalRightPos);

		CAABB* leftCollider = ((CAABB*)(m_pvColliders[LEFT_COLLIDER_INDEX]->GetBounds()));
		CAABB* rightCollider = ((CAABB*)(m_pvColliders[RIGHT_COLLIDER_INDEX]->GetBounds()));

		XMFLOAT3 leftCenter = leftCollider->GetCenter();
		leftCenter.x = finalLeftPos.x;
		leftCenter.z = finalLeftPos.z;

		XMFLOAT3 rightCenter = rightCollider->GetCenter();
		rightCenter.x = finalRightPos.x;
		rightCenter.z = finalRightPos.z;


		leftCollider->SetCenter(leftCenter);
		rightCollider->SetCenter(rightCenter);
	}

	
}