timeline.cpp
上传用户:center1979
上传日期:2022-07-26
资源大小:50633k
文件大小:3k
源码类别:

OpenGL

开发平台:

Visual C++

  1. // timeline.cpp
  2. //
  3. // Object timelines.
  4. //
  5. // Copyright (C) 2008, the Celestia Development Team
  6. // Initial version by Chris Laurel, claurel@gmail.com
  7. //
  8. // This program is free software; you can redistribute it and/or
  9. // modify it under the terms of the GNU General Public License
  10. // as published by the Free Software Foundation; either version 2
  11. // of the License, or (at your option) any later version.
  12. #include "celengine/timeline.h"
  13. #include "celengine/timelinephase.h"
  14. #include "celengine/frametree.h"
  15. #include "celengine/frame.h"
  16. using namespace std;
  17. /*! A Timeline is a list of TimelinePhases that covers a continuous 
  18.  *  interval of time.
  19.  */
  20. Timeline::Timeline()
  21. {
  22. }
  23. Timeline::~Timeline()
  24. {
  25.     for (vector<TimelinePhase*>::iterator iter = phases.begin(); iter != phases.end(); iter++)
  26.     {
  27.         // Remove the phase from whatever phase tree contains it.
  28.         TimelinePhase* phase = *iter;
  29.         phase->getFrameTree()->removeChild(phase);
  30.         phase->release();
  31.     }
  32. }
  33. bool
  34. Timeline::appendPhase(TimelinePhase* phase)
  35. {
  36.     // Validate start and end times. If there are existing phases in the timeline,
  37.     // startTime must be equal to endTime of the previous phases so that there are
  38.     // no gaps and no overlaps.
  39.     if (!phases.empty())
  40.     {
  41.         if (phase->startTime() != phases.back()->endTime())
  42.             return false;
  43.     }
  44.     phase->addRef();
  45.     phases.push_back(phase);
  46.     return true;
  47. }
  48.                       
  49. const TimelinePhase*
  50. Timeline::findPhase(double t) const
  51. {
  52.     // Find the phase containing time t. The overwhelming common case is
  53.     // nPhases = 1, so we special case that. Otherwise, we do a simple linear search,
  54.     // as the number of phases in a timeline should always be quite small.
  55.     if (phases.size() == 1)
  56.     {
  57.         return phases[0];
  58.     }
  59.     else
  60.     {
  61.         for (vector<TimelinePhase*>::const_iterator iter = phases.begin(); iter != phases.end(); iter++)
  62.         {
  63.             if (t < (*iter)->endTime())
  64.                 return *iter;
  65.         }
  66.         // Time is greater than the end time of the final phase. Just return the final phase.
  67.         return phases.back();
  68.     }
  69. }
  70. /*! Get the phase at the specified index.
  71.  */
  72. const TimelinePhase*
  73. Timeline::getPhase(unsigned int n) const
  74. {
  75.     return phases.at(n);
  76. }
  77. /*! Get the number of phases in this timeline.
  78.  */
  79. unsigned int
  80. Timeline::phaseCount() const
  81. {
  82.     return phases.size();
  83. }
  84. double
  85. Timeline::startTime() const
  86. {
  87.     return phases.front()->startTime();
  88. }
  89. double
  90. Timeline::endTime() const
  91. {
  92.     return phases.back()->endTime();
  93. }
  94. /*! Check whether the timeline covers the specified time t. True if
  95.  *  startTime <= t <= endTime. Note that this is deliberately different
  96.  *  than the TimelinePhase::includes function, which is only true if
  97.  *  t is strictly less than the end time.
  98.  */
  99. bool
  100. Timeline::includes(double t) const
  101. {
  102.     return phases.front()->startTime() <= t && t <= phases.back()->endTime();
  103. }
  104. void
  105. Timeline::markChanged()
  106. {
  107.     if (phases.size() == 1)
  108.     {
  109.         phases[0]->getFrameTree()->markChanged();
  110.     }
  111.     else
  112.     {
  113.         for (vector<TimelinePhase*>::iterator iter = phases.begin(); iter != phases.end(); iter++)
  114.             (*iter)->getFrameTree()->markChanged();
  115.     }
  116. }