void CGameStudioModelRenderer::CalculateYawBlend(entity_state_t *pplayer) { float dt; float flYaw; dt = (m_clTime - m_clOldTime); dt = max(0.0, dt); dt = min(1.0, dt); StudioEstimateGait(pplayer); flYaw = m_pCurrentEntity->angles[YAW] - m_pPlayerInfo->gaityaw; flYaw = fmod(flYaw, 360.0f); if (flYaw < -180) flYaw = flYaw + 360; else if (flYaw > 180) flYaw = flYaw - 360; float maxyaw = 120.0; if (flYaw > maxyaw) { m_pPlayerInfo->gaityaw = m_pPlayerInfo->gaityaw - 180; m_flGaitMovement = -m_flGaitMovement; flYaw = flYaw - 180; } else if (flYaw < -maxyaw) { m_pPlayerInfo->gaityaw = m_pPlayerInfo->gaityaw + 180; m_flGaitMovement = -m_flGaitMovement; flYaw = flYaw + 180; } float blend_yaw = (flYaw / 90.0) * 128.0 + 127.0; blend_yaw = min(255.0, blend_yaw); blend_yaw = max(0.0, blend_yaw); blend_yaw = 255.0 - blend_yaw; m_pCurrentEntity->curstate.blending[0] = (int)(blend_yaw); m_pCurrentEntity->latched.prevblending[0] = m_pCurrentEntity->curstate.blending[0]; m_pCurrentEntity->latched.prevseqblending[0] = m_pCurrentEntity->curstate.blending[0]; m_pCurrentEntity->angles[YAW] = m_pPlayerInfo->gaityaw; if (m_pCurrentEntity->angles[YAW] < -0) m_pCurrentEntity->angles[YAW] += 360; m_pCurrentEntity->latched.prevangles[YAW] = m_pCurrentEntity->angles[YAW]; }
/* ==================== StudioProcessGait ==================== */ void CGameStudioModelRenderer::StudioProcessGait(entity_state_t *pplayer) { mstudioseqdesc_t *pseqdesc; float dt; float flYaw; // view direction relative to movement pseqdesc = (mstudioseqdesc_t *)((byte *)m_pStudioHeader + m_pStudioHeader->seqindex) + m_pCurrentEntity->curstate.sequence; m_pCurrentEntity->angles[PITCH] = 0; m_pCurrentEntity->latched.prevangles[PITCH] = m_pCurrentEntity->angles[PITCH]; dt = (m_clTime - m_clOldTime); dt = max(0.0, dt); dt = min(1.0, dt); StudioEstimateGait(pplayer); // calc side to side turning flYaw = m_pCurrentEntity->angles[YAW] - m_pPlayerInfo->gaityaw; flYaw = fmod(flYaw, 360.0); if(flYaw < -180) { flYaw = flYaw + 360; } else if(flYaw > 180) { flYaw = flYaw - 360; } float maxyaw = 120.0; if(flYaw > maxyaw) { m_pPlayerInfo->gaityaw = m_pPlayerInfo->gaityaw - 180; m_flGaitMovement = -m_flGaitMovement; flYaw = flYaw - 180; } else if(flYaw < -maxyaw) { m_pPlayerInfo->gaityaw = m_pPlayerInfo->gaityaw + 180; m_flGaitMovement = -m_flGaitMovement; flYaw = flYaw + 180; } float blend_yaw = (flYaw / 90.0) * 128.0 + 127.0; blend_yaw = min(255.0, blend_yaw); blend_yaw = max(0.0, blend_yaw); blend_yaw = 255.0 - blend_yaw; m_pCurrentEntity->curstate.blending[0] = (int)(blend_yaw); m_pCurrentEntity->latched.prevblending[0] = m_pCurrentEntity->curstate.blending[0]; m_pCurrentEntity->latched.prevseqblending[0] = m_pCurrentEntity->curstate.blending[0]; m_pCurrentEntity->angles[YAW] = m_pPlayerInfo->gaityaw; if(m_pCurrentEntity->angles[YAW] < -0) { m_pCurrentEntity->angles[YAW] += 360; } m_pCurrentEntity->latched.prevangles[YAW] = m_pCurrentEntity->angles[YAW]; pseqdesc = (mstudioseqdesc_t *)((byte *)m_pStudioHeader + m_pStudioHeader->seqindex) + pplayer->gaitsequence; // Calc gait frame if(pseqdesc->linearmovement[0] > 0) { m_pPlayerInfo->gaitframe += (m_flGaitMovement / pseqdesc->linearmovement[0]) * pseqdesc->numframes; } else { m_pPlayerInfo->gaitframe += pseqdesc->fps * dt * m_pCurrentEntity->curstate.framerate; } // Do modulo m_pPlayerInfo->gaitframe = m_pPlayerInfo->gaitframe - (int)(m_pPlayerInfo->gaitframe / pseqdesc->numframes) * pseqdesc->numframes; if(m_pPlayerInfo->gaitframe < 0) { m_pPlayerInfo->gaitframe += pseqdesc->numframes; } }