aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/base/UTime.pas210
-rw-r--r--src/base/time.cpp130
-rw-r--r--src/base/time.hpp63
3 files changed, 193 insertions, 210 deletions
diff --git a/src/base/UTime.pas b/src/base/UTime.pas
deleted file mode 100644
index 83844cb5..00000000
--- a/src/base/UTime.pas
+++ /dev/null
@@ -1,210 +0,0 @@
-{* UltraStar Deluxe - Karaoke Game
- *
- * UltraStar Deluxe is the legal property of its developers, whose names
- * are too numerous to list here. Please refer to the COPYRIGHT
- * file distributed with this source distribution.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; see the file COPYING. If not, write to
- * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA 02110-1301, USA.
- *
- * $URL$
- * $Id$
- *}
-
-unit UTime;
-
-interface
-
-{$IFDEF FPC}
- {$MODE Delphi}
-{$ENDIF}
-
-{$I switches.inc}
-
-type
- TTime = class
- public
- constructor Create;
- function GetTime(): real;
- end;
-
- TRelativeTimer = class
- private
- AbsoluteTime: int64; // system-clock reference time for calculation of CurrentTime
- RelativeTimeOffset: real;
- Paused: boolean;
- TriggerMode: boolean;
- public
- constructor Create(TriggerMode: boolean = false);
- procedure Pause();
- procedure Resume();
- function GetTime(): real;
- function GetAndResetTime(): real;
- procedure SetTime(Time: real; Trigger: boolean = true);
- procedure Reset();
- end;
-
-procedure CountSkipTimeSet;
-procedure CountSkipTime;
-procedure CountMidTime;
-
-var
- USTime: TTime;
- VideoBGTimer: TRelativeTimer;
-
- TimeNew: int64;
- TimeOld: int64;
- TimeSkip: real;
- TimeMid: real;
- TimeMidTemp: int64;
-
-implementation
-
-uses
- sdl,
- UCommon;
-
-const
- cSDLCorrectionRatio = 1000;
-
-(*
-BEST Option now ( after discussion with whiteshark ) seems to be to use SDL
-timer functions...
-
-SDL_delay
-SDL_GetTicks
-http://www.gamedev.net/community/forums/topic.asp?topic_id=466145&whichpage=1%EE%8D%B7
-*)
-
-
-procedure CountSkipTimeSet;
-begin
- TimeNew := SDL_GetTicks();
-end;
-
-procedure CountSkipTime;
-begin
- TimeOld := TimeNew;
- TimeNew := SDL_GetTicks();
- TimeSkip := (TimeNew-TimeOld) / cSDLCorrectionRatio;
-end;
-
-procedure CountMidTime;
-begin
- TimeMidTemp := SDL_GetTicks();
- TimeMid := (TimeMidTemp - TimeNew) / cSDLCorrectionRatio;
-end;
-
-{**
- * TTime
- **}
-
-constructor TTime.Create;
-begin
- inherited;
- CountSkipTimeSet;
-end;
-
-function TTime.GetTime: real;
-begin
- Result := SDL_GetTicks() / cSDLCorrectionRatio;
-end;
-
-{**
- * TRelativeTimer
- **}
-
-(*
- * creates a new timer.
- * if triggermode is false (default), the timer
- * will immediately begin with counting.
- * if triggermode is true, it will wait until get/settime() or pause() is called
- * for the first time.
- *)
-constructor TRelativeTimer.Create(TriggerMode: boolean);
-begin
- inherited Create();
- Self.TriggerMode := TriggerMode;
- Reset();
- Paused := false;
-end;
-
-procedure TRelativeTimer.Pause();
-begin
- RelativeTimeOffset := GetTime();
- Paused := true;
-end;
-
-procedure TRelativeTimer.Resume();
-begin
- AbsoluteTime := SDL_GetTicks();
- Paused := false;
-end;
-
-(*
- * Returns the counter of the timer.
- * If in TriggerMode it will return 0 and start the counter on the first call.
- *)
-function TRelativeTimer.GetTime: real;
-begin
- // initialize absolute time on first call in triggered mode
- if (TriggerMode and (AbsoluteTime = 0)) then
- begin
- AbsoluteTime := SDL_GetTicks();
- Result := RelativeTimeOffset;
- Exit;
- end;
-
- if Paused then
- Result := RelativeTimeOffset
- else
- Result := RelativeTimeOffset + (SDL_GetTicks() - AbsoluteTime) / cSDLCorrectionRatio;
-end;
-
-(*
- * Returns the counter of the timer and resets the counter to 0 afterwards.
- * Note: In TriggerMode the counter will not be stopped as with Reset().
- *)
-function TRelativeTimer.GetAndResetTime(): real;
-begin
- Result := GetTime();
- SetTime(0);
-end;
-
-(*
- * Sets the timer to the given time. This will trigger in TriggerMode if
- * Trigger is set to true. Otherwise the counter's state will not change.
- *)
-procedure TRelativeTimer.SetTime(Time: real; Trigger: boolean);
-begin
- RelativeTimeOffset := Time;
- if ((not TriggerMode) or Trigger) then
- AbsoluteTime := SDL_GetTicks();
-end;
-
-(*
- * Resets the counter of the timer to 0.
- * If in TriggerMode the timer will not start counting until it is triggered again.
- *)
-procedure TRelativeTimer.Reset();
-begin
- RelativeTimeOffset := 0;
- if (TriggerMode) then
- AbsoluteTime := 0
- else
- AbsoluteTime := SDL_GetTicks();
-end;
-
-end.
diff --git a/src/base/time.cpp b/src/base/time.cpp
new file mode 100644
index 00000000..9a63270d
--- /dev/null
+++ b/src/base/time.cpp
@@ -0,0 +1,130 @@
+/*
+ * UltraStar Deluxe - Karaoke Game
+ *
+ * UltraStar Deluxe is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; see the file COPYING. If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ *
+ * $URL$
+ * $Id$
+ */
+
+#include "time.hpp"
+#include <SDL/SDL.h>
+
+#define SDL_CORRECTION_RATIO 1000
+
+namespace usdx
+{
+
+ Time::Time(void)
+ {
+ }
+
+ float Time::get_time()
+ {
+ return SDL_GetTicks() / SDL_CORRECTION_RATIO;
+ }
+
+
+ /*
+ * RelativeTimer
+ */
+
+ /*
+ * creates a new timer.
+ * if triggermode is false (default), the timer
+ * will immediately begin with counting.
+ * if triggermode is true, it will wait until get/settime() or pause() is called
+ * for the first time.
+ */
+ RelativeTimer::RelativeTimer(bool trigger_mode)
+ {
+ this->trigger_mode = trigger_mode;
+ reset();
+ this->paused = false;
+ }
+
+ void RelativeTimer::pause(void)
+ {
+ relative_time_offset = get_time();
+ paused = true;
+ }
+
+ void RelativeTimer::resume(void)
+ {
+ absolute_time = SDL_GetTicks();
+ paused = false;
+ }
+
+ /*
+ * Returns the counter of the timer.
+ * If in TriggerMode it will return 0 and start the counter on the first call.
+ */
+ float RelativeTimer::get_time(void)
+ {
+ // initialize absolute time on first call in triggered mode
+ if (trigger_mode && (absolute_time == 0))
+ {
+ absolute_time = SDL_GetTicks();
+ return relative_time_offset;
+ }
+
+ if (paused)
+ return relative_time_offset;
+
+ return relative_time_offset + (SDL_GetTicks() - absolute_time) / SDL_CORRECTION_RATIO;
+ }
+
+ /*
+ * Returns the counter of the timer and resets the counter to 0 afterwards.
+ * Note: In TriggerMode the counter will not be stopped as with Reset().
+ */
+ float RelativeTimer::get_and_reset_time(void)
+ {
+ float result = get_time();
+ set_time(0);
+ return result;
+ }
+
+ /*
+ * Sets the timer to the given time. This will trigger in TriggerMode if
+ * Trigger is set to true. Otherwise the counter's state will not change.
+ */
+ void RelativeTimer::set_time(float time, bool trigger)
+ {
+ relative_time_offset = time;
+
+ if (!trigger_mode || trigger)
+ absolute_time = SDL_GetTicks();
+ }
+
+ /*
+ * Resets the counter of the timer to 0.
+ * If in TriggerMode the timer will not start counting until it is triggered again.
+ */
+ void RelativeTimer::reset(void)
+ {
+ relative_time_offset = 0;
+
+ if (trigger_mode)
+ absolute_time = 0;
+ else
+ absolute_time = SDL_GetTicks();
+ }
+}
diff --git a/src/base/time.hpp b/src/base/time.hpp
new file mode 100644
index 00000000..64bf49c1
--- /dev/null
+++ b/src/base/time.hpp
@@ -0,0 +1,63 @@
+/*
+ * UltraStar Deluxe - Karaoke Game
+ *
+ * UltraStar Deluxe is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; see the file COPYING. If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ *
+ * $URL$
+ * $Id$
+ */
+
+#ifndef TIME_HPP
+#define TIME_HPP
+
+#include <stdint.h>
+
+namespace usdx
+{
+ class Time
+ {
+ public:
+ Time(void);
+ float get_time();
+ };
+
+
+ class RelativeTimer
+ {
+ private:
+ // system-clock reference time for calculation of CurrentTime
+ uint64_t absolute_time;
+ float relative_time_offset;
+ bool paused;
+ bool trigger_mode;
+
+ public:
+ RelativeTimer(bool trigger_mode = false);
+ void pause(void);
+ void resume(void);
+ float get_time(void);
+ float get_and_reset_time(void);
+ void set_time(float time, bool trigger = true);
+ void reset(void);
+ };
+
+};
+
+#endif