// // R_EndInterpolation // // Restores the saved height of all moving planes and position of scrolling // textures. This should be called at the end of every frame rendered. // void R_EndInterpolation() { if (gamestate == GS_LEVEL) { for (std::vector<fixed_uint_pair>::const_iterator ceiling_it = saved_ceilingheight.begin(); ceiling_it != saved_ceilingheight.end(); ++ceiling_it) { sector_t* sector = §ors[ceiling_it->second]; P_SetCeilingHeight(sector, ceiling_it->first); } for (std::vector<fixed_uint_pair>::const_iterator floor_it = saved_floorheight.begin(); floor_it != saved_floorheight.end(); ++floor_it) { sector_t* sector = §ors[floor_it->second]; P_SetFloorHeight(sector, floor_it->first); } } }
// // R_BeginInterpolation // // Saves the current height of all moving planes and position of scrolling // textures, which will be restored by R_EndInterpolation. The height of a // moving plane will be interpolated between the previous height and this // current height. This should be called every time a frame is rendered. // void R_BeginInterpolation(fixed_t amount) { saved_ceilingheight.clear(); saved_floorheight.clear(); if (gamestate == GS_LEVEL) { for (std::vector<fixed_uint_pair>::const_iterator ceiling_it = prev_ceilingheight.begin(); ceiling_it != prev_ceilingheight.end(); ++ceiling_it) { unsigned int secnum = ceiling_it->second; sector_t* sector = §ors[secnum]; fixed_t old_value = ceiling_it->first; fixed_t cur_value = P_CeilingHeight(sector); saved_ceilingheight.push_back(std::make_pair(cur_value, secnum)); fixed_t new_value = old_value + FixedMul(cur_value - old_value, amount); P_SetCeilingHeight(sector, new_value); } for (std::vector<fixed_uint_pair>::const_iterator floor_it = prev_floorheight.begin(); floor_it != prev_floorheight.end(); ++floor_it) { unsigned int secnum = floor_it->second; sector_t* sector = §ors[secnum]; fixed_t old_value = floor_it->first; fixed_t cur_value = P_FloorHeight(sector); saved_floorheight.push_back(std::make_pair(cur_value, secnum)); fixed_t new_value = old_value + FixedMul(cur_value - old_value, amount); P_SetFloorHeight(sector, new_value); } } }
// // Move a plane (floor or ceiling) and check for crushing // [RH] Crush specifies the actual amount of crushing damage inflictable. // (Use -1 to prevent it from trying to crush) // DMover::EResult DMover::MovePlane (fixed_t speed, fixed_t dest, bool crush, int floorOrCeiling, int direction) { bool flag; fixed_t lastpos; switch (floorOrCeiling) { case 0: // FLOOR switch (direction) { case -1: // DOWN lastpos = P_FloorHeight(m_Sector); if (lastpos - speed < dest) { P_ChangeFloorHeight(m_Sector, dest - lastpos); flag = P_ChangeSector (m_Sector, crush); if (flag == true) { P_ChangeFloorHeight(m_Sector, lastpos - dest); P_ChangeSector (m_Sector, crush); //return crushed; } return pastdest; } else { P_ChangeFloorHeight(m_Sector, -speed); flag = P_ChangeSector (m_Sector, crush); if (flag == true) { P_ChangeFloorHeight(m_Sector, speed); // should be lastpos P_ChangeSector (m_Sector, crush); return crushed; } } break; case 1: // UP lastpos = P_FloorHeight(m_Sector); if (lastpos + speed > dest) { P_ChangeFloorHeight(m_Sector, dest - lastpos); flag = P_ChangeSector (m_Sector, crush); if (flag == true) { P_ChangeFloorHeight(m_Sector, lastpos - dest); P_ChangeSector (m_Sector, crush); } return pastdest; } else { // COULD GET CRUSHED P_ChangeFloorHeight(m_Sector, speed); flag = P_ChangeSector (m_Sector, crush); if (flag == true) { if (crush) return crushed; P_ChangeFloorHeight(m_Sector, -speed); P_ChangeSector (m_Sector, crush); return crushed; } } break; } break; case 1: // CEILING switch(direction) { case -1: // DOWN lastpos = P_CeilingHeight(m_Sector); if (lastpos - speed < dest) { P_SetCeilingHeight(m_Sector, dest); flag = P_ChangeSector (m_Sector, crush); if (flag == true) { P_SetCeilingHeight(m_Sector, lastpos); P_ChangeSector (m_Sector, crush); } return pastdest; } else { // COULD GET CRUSHED P_SetCeilingHeight(m_Sector, lastpos - speed); flag = P_ChangeSector (m_Sector, crush); if (flag == true) { if (crush) return crushed; P_SetCeilingHeight(m_Sector, lastpos); P_ChangeSector (m_Sector, crush); return crushed; } } break; case 1: // UP lastpos = P_CeilingHeight(m_Sector); if (lastpos + speed > dest) { P_SetCeilingHeight(m_Sector, dest); flag = P_ChangeSector (m_Sector, crush); if (flag == true) { P_SetCeilingHeight(m_Sector, lastpos); P_ChangeSector (m_Sector, crush); } return pastdest; } else { P_SetCeilingHeight(m_Sector, lastpos + speed); flag = P_ChangeSector (m_Sector, crush); // UNUSED #if 0 if (flag == true) { P_ChangeCeilingHeight(m_Sector, -speed); P_ChangeSector (m_Sector, crush); return crushed; } #endif } break; } break; } return ok; }