| 25 | } // namespace xhud |
| 26 | |
| 27 | void xhud::meter_widget::set_value(F32 v) |
| 28 | { |
| 29 | F32 dvalue; |
| 30 | F32 sign; |
| 31 | |
| 32 | dvalue = v - value; |
| 33 | if (dvalue < -0.01f) |
| 34 | { |
| 35 | if (res.sound.start_decrement != 0) |
| 36 | { |
| 37 | xSndPlay(res.sound.start_decrement, 1.0f, 0.0f, 0x80, 0x0, NULL, SND_CAT_GAME, 0.0f); |
| 38 | } |
| 39 | |
| 40 | if (res.decrement_time < 0.01f) |
| 41 | { |
| 42 | set_value_immediate(v); |
| 43 | return; |
| 44 | } |
| 45 | |
| 46 | dvalue = -1.0f; |
| 47 | } |
| 48 | else if (dvalue > 0.01f) |
| 49 | { |
| 50 | if (res.sound.start_increment != 0) |
| 51 | { |
| 52 | xSndPlay(res.sound.start_increment, 1.0f, 0.0f, 0x80, 0x0, NULL, SND_CAT_GAME, 0.0f); |
| 53 | } |
| 54 | |
| 55 | if (res.increment_time < 0.01f) |
| 56 | { |
| 57 | set_value_immediate(v); |
| 58 | return; |
| 59 | } |
| 60 | |
| 61 | dvalue = 1.0f; |
| 62 | } |
| 63 | else |
| 64 | { |
| 65 | set_value_immediate(v); |
| 66 | return; |
| 67 | } |
| 68 | |
| 69 | end_value = dvalue; |
| 70 | |
| 71 | if (res.decrement_time == 0.0f) |
| 72 | { |
| 73 | printf("decrement time = 0 -- ass saved!\n"); |
| 74 | } |
| 75 | |
| 76 | dvalue = res.decrement_time > 1e-5f ? 1e-5f : dvalue / res.decrement_time; |
| 77 | value_vel = dvalue; |
| 78 | value_accel = 50.0f * res.decrement_time; |
| 79 | |
| 80 | if (xsqrt(2.0f * (v - value) / res.decrement_time) > 2.0f) |
| 81 | { |
| 82 | value_accel = 25.0f * res.decrement_time; |
| 83 | } |
| 84 | } |