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 }