absence_thelab
annotate src/demosystem/demosys.cpp @ 0:1cffe3409164
initial commit
author | John Tsiombikas <nuclear@member.fsf.org> |
---|---|
date | Thu, 23 Oct 2014 01:46:07 +0300 |
parents | |
children |
rev | line source |
---|---|
nuclear@0 | 1 #include "demosys.h" |
nuclear@0 | 2 |
nuclear@0 | 3 /////////////// Part base class implementation /////////////// |
nuclear@0 | 4 |
nuclear@0 | 5 Part::Part() { |
nuclear@0 | 6 gc = 0; |
nuclear@0 | 7 |
nuclear@0 | 8 rmode = RenderModeNormal; |
nuclear@0 | 9 RenderTexture = 0; |
nuclear@0 | 10 |
nuclear@0 | 11 SetTimingAbs(0, 0); |
nuclear@0 | 12 paused = false; |
nuclear@0 | 13 } |
nuclear@0 | 14 |
nuclear@0 | 15 void Part::SetGraphicsContext(GraphicsContext *gc) { |
nuclear@0 | 16 this->gc = gc; |
nuclear@0 | 17 } |
nuclear@0 | 18 |
nuclear@0 | 19 GraphicsContext *Part::GetGraphicsContext() { |
nuclear@0 | 20 return gc; |
nuclear@0 | 21 } |
nuclear@0 | 22 |
nuclear@0 | 23 void Part::SetTimingAbs(dword start, dword end) { |
nuclear@0 | 24 StartTime = start; |
nuclear@0 | 25 EndTime = end; |
nuclear@0 | 26 Duration = EndTime - StartTime; |
nuclear@0 | 27 } |
nuclear@0 | 28 |
nuclear@0 | 29 void Part::SetTimingRel(dword start, dword dur) { |
nuclear@0 | 30 StartTime = start; |
nuclear@0 | 31 Duration = dur; |
nuclear@0 | 32 EndTime = StartTime + Duration; |
nuclear@0 | 33 } |
nuclear@0 | 34 |
nuclear@0 | 35 void Part::Pause() { |
nuclear@0 | 36 if(paused) return; |
nuclear@0 | 37 timer.Stop(); |
nuclear@0 | 38 paused = true; |
nuclear@0 | 39 } |
nuclear@0 | 40 |
nuclear@0 | 41 void Part::Resume() { |
nuclear@0 | 42 if(!paused) return; |
nuclear@0 | 43 timer.Resume(); |
nuclear@0 | 44 paused = false; |
nuclear@0 | 45 } |
nuclear@0 | 46 |
nuclear@0 | 47 dword Part::GetStartTime() const { |
nuclear@0 | 48 return StartTime; |
nuclear@0 | 49 } |
nuclear@0 | 50 |
nuclear@0 | 51 dword Part::GetEndTime() const { |
nuclear@0 | 52 return EndTime; |
nuclear@0 | 53 } |
nuclear@0 | 54 |
nuclear@0 | 55 dword Part::GetDuration() const { |
nuclear@0 | 56 return Duration; |
nuclear@0 | 57 } |
nuclear@0 | 58 |
nuclear@0 | 59 dword Part::GetTimePosition() const { |
nuclear@0 | 60 return timer.GetMilliSec(); |
nuclear@0 | 61 } |
nuclear@0 | 62 |
nuclear@0 | 63 float Part::GetParametricPosition() const { |
nuclear@0 | 64 return (float)timer.GetMilliSec() / (float)Duration; |
nuclear@0 | 65 } |
nuclear@0 | 66 |
nuclear@0 | 67 void Part::SetRenderMode(RenderMode rmode) { |
nuclear@0 | 68 this->rmode = rmode; |
nuclear@0 | 69 } |
nuclear@0 | 70 |
nuclear@0 | 71 void Part::SetRenderTexture(Texture *tex) { |
nuclear@0 | 72 RenderTexture = tex; |
nuclear@0 | 73 } |
nuclear@0 | 74 |
nuclear@0 | 75 RenderMode Part::GetRenderMode() const { |
nuclear@0 | 76 return rmode; |
nuclear@0 | 77 } |
nuclear@0 | 78 |
nuclear@0 | 79 Texture *Part::GetRenderTexture() const { |
nuclear@0 | 80 return RenderTexture; |
nuclear@0 | 81 } |
nuclear@0 | 82 |
nuclear@0 | 83 |
nuclear@0 | 84 void Part::Launch() { |
nuclear@0 | 85 timer.Start(); |
nuclear@0 | 86 } |
nuclear@0 | 87 |
nuclear@0 | 88 void Part::ShutDown() { |
nuclear@0 | 89 // do nothing |
nuclear@0 | 90 } |
nuclear@0 | 91 |
nuclear@0 | 92 Scene *Part::GetScene() { |
nuclear@0 | 93 return scene; |
nuclear@0 | 94 } |
nuclear@0 | 95 |
nuclear@0 | 96 |
nuclear@0 | 97 /////////////// main Demo System class implementation /////////////// |
nuclear@0 | 98 |
nuclear@0 | 99 DemoSystem::DemoSystem(GraphicsContext *gc) { |
nuclear@0 | 100 this->gc = gc; |
nuclear@0 | 101 state = DemoStateStopped; |
nuclear@0 | 102 } |
nuclear@0 | 103 |
nuclear@0 | 104 void DemoSystem::AddPart(Part *part) { |
nuclear@0 | 105 |
nuclear@0 | 106 if(state != DemoStateStopped) return; |
nuclear@0 | 107 |
nuclear@0 | 108 if(!part->GetGraphicsContext()) part->SetGraphicsContext(gc); |
nuclear@0 | 109 |
nuclear@0 | 110 parts.push_back(part); |
nuclear@0 | 111 inactive.push_back(part); |
nuclear@0 | 112 } |
nuclear@0 | 113 |
nuclear@0 | 114 Part *DemoSystem::GetActivePart() { |
nuclear@0 | 115 return *active.begin(); |
nuclear@0 | 116 } |
nuclear@0 | 117 |
nuclear@0 | 118 //// demo flow control //// |
nuclear@0 | 119 |
nuclear@0 | 120 // Run demo from the beggining |
nuclear@0 | 121 void DemoSystem::Run() { |
nuclear@0 | 122 |
nuclear@0 | 123 if(state != DemoStateStopped) return; |
nuclear@0 | 124 |
nuclear@0 | 125 state = DemoStateRunning; |
nuclear@0 | 126 timer.Start(); |
nuclear@0 | 127 } |
nuclear@0 | 128 |
nuclear@0 | 129 // Stop the execution of the demo, discard any sequencing information |
nuclear@0 | 130 void DemoSystem::Stop() { |
nuclear@0 | 131 |
nuclear@0 | 132 if(state == DemoStateStopped) return; |
nuclear@0 | 133 |
nuclear@0 | 134 while(active.size()) { |
nuclear@0 | 135 active.erase(active.begin()); |
nuclear@0 | 136 } |
nuclear@0 | 137 |
nuclear@0 | 138 inactive = parts; |
nuclear@0 | 139 |
nuclear@0 | 140 state = DemoStateStopped; |
nuclear@0 | 141 } |
nuclear@0 | 142 |
nuclear@0 | 143 // Pause the demo (freeze the timers) |
nuclear@0 | 144 void DemoSystem::Pause() { |
nuclear@0 | 145 |
nuclear@0 | 146 if(state != DemoStateRunning) return; |
nuclear@0 | 147 |
nuclear@0 | 148 std::list<Part*>::iterator iter = active.begin(); |
nuclear@0 | 149 while(iter != active.end()) { |
nuclear@0 | 150 (*iter++)->Pause(); |
nuclear@0 | 151 } |
nuclear@0 | 152 timer.Stop(); |
nuclear@0 | 153 |
nuclear@0 | 154 state = DemoStatePaused; |
nuclear@0 | 155 } |
nuclear@0 | 156 |
nuclear@0 | 157 void DemoSystem::Resume() { |
nuclear@0 | 158 |
nuclear@0 | 159 if(state != DemoStatePaused) return; |
nuclear@0 | 160 |
nuclear@0 | 161 std::list<Part*>::iterator iter = active.begin(); |
nuclear@0 | 162 while(iter != active.end()) { |
nuclear@0 | 163 (*iter++)->Resume(); |
nuclear@0 | 164 } |
nuclear@0 | 165 timer.Resume(); |
nuclear@0 | 166 |
nuclear@0 | 167 state = DemoStateRunning; |
nuclear@0 | 168 } |
nuclear@0 | 169 |
nuclear@0 | 170 |
nuclear@0 | 171 void DemoSystem::Update() { |
nuclear@0 | 172 |
nuclear@0 | 173 if(state != DemoStateRunning) return; |
nuclear@0 | 174 |
nuclear@0 | 175 dword time = timer.GetMilliSec(); |
nuclear@0 | 176 |
nuclear@0 | 177 // Check if there are any inactive parts to launch |
nuclear@0 | 178 std::list<Part*>::iterator iter = inactive.begin(); |
nuclear@0 | 179 while(iter != inactive.end()) { |
nuclear@0 | 180 if(time >= (*iter)->GetStartTime()) { |
nuclear@0 | 181 (*iter)->Launch(); |
nuclear@0 | 182 active.push_back(*iter); |
nuclear@0 | 183 iter = inactive.erase(iter); |
nuclear@0 | 184 } else { |
nuclear@0 | 185 iter++; |
nuclear@0 | 186 } |
nuclear@0 | 187 } |
nuclear@0 | 188 |
nuclear@0 | 189 // check if there are any parts to close and close them, and run the valid ones |
nuclear@0 | 190 iter = active.begin(); |
nuclear@0 | 191 while(iter != active.end()) { |
nuclear@0 | 192 if(time >= (*iter)->GetEndTime()) { |
nuclear@0 | 193 (*iter)->ShutDown(); |
nuclear@0 | 194 iter = active.erase(iter); |
nuclear@0 | 195 } else { |
nuclear@0 | 196 // run the part |
nuclear@0 | 197 if((*iter)->GetRenderMode() == RenderModeTexture) { |
nuclear@0 | 198 gc->SetRenderTarget((*iter)->GetRenderTexture(), (Texture*)0); |
nuclear@0 | 199 gc->Clear(0); |
nuclear@0 | 200 gc->ClearZBufferStencil(1.0f, 0); |
nuclear@0 | 201 } |
nuclear@0 | 202 |
nuclear@0 | 203 (*iter)->MainLoop(); |
nuclear@0 | 204 |
nuclear@0 | 205 if((*iter)->GetRenderMode() == RenderModeTexture) { |
nuclear@0 | 206 gc->ResetRenderTarget(); |
nuclear@0 | 207 } |
nuclear@0 | 208 |
nuclear@0 | 209 iter++; |
nuclear@0 | 210 } |
nuclear@0 | 211 } |
nuclear@0 | 212 } |