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 ); }
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 ); }
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); } }