32 cerr <<
"Creating scene manager..." << flush;
35 cerr <<
"Creating template manager..." << flush;
38 if (SceneManager::getSingleton() == 0)
39 throw Exception(
"Singleton null after SceneManager instantiation");
46 cerr <<
" Clearing Scene" << endl;
49 for (SharedPtr<SceneManager::SceneIterator> it = sm->
getSceneIterator(); !it->eos();) {
50 string sceneName = it->get()->getName();
51 cerr <<
" destroying \"" << sceneName.c_str() <<
"\"" << flush;
53 cerr <<
"..." << flush;
55 cerr <<
"done" << endl;
59 throw Exception(
"WTF: SceneManager has scenes after clearing them all?");
66 SceneManager::getSingleton()->commit();
72 SceneManager::getSingleton()->commit();
84 cerr <<
" Creating empty inactive scene" << endl;
90 cerr <<
" Creating empty active scene" << endl;
100 cerr <<
" Simple scene (low level services only)" << endl;
109 SharedPtr<Scene> scene = sm->
createScene(
"testScene");
118 cerr <<
" Creating resources" << endl;
119 cerr <<
" creating sounds..." << flush;
122 cerr <<
" ok" << endl;
123 cerr <<
" loading sounds..." << flush;
126 cerr <<
" ok" << endl;
128 cerr <<
" setting up listener..." << flush;
129 scene->getListener().setOrientation(
Vector3(0,0,1),
Vector3(0,1,0) );
130 scene->getListener().setPosition(
LVector3(0,0,0) );
131 cerr <<
" ok" << endl;
133 cerr <<
" creating sources..." << flush;
134 SharedPtr<Source> absource = sm->
createSource(absound,
true);
135 SharedPtr<Source> beamsource1 = sm->
createSource(beamsound);
136 SharedPtr<Source> beamsource2 = sm->
createSource(beamsound);
137 absource->setPosition(
Vector3(0,0,-1));
138 beamsource1->setPosition(
Vector3(-1,0,0));
139 beamsource2->setPosition(
Vector3(+1,0,0));
140 beamsource1->setGain(0.5
f);
141 beamsource2->setGain(0.5
f);
142 scene->add(absource);
143 scene->add(beamsource1);
144 scene->add(beamsource2);
145 cerr <<
" ok" << endl;
147 cerr <<
" playing out scene..." << flush;
149 absource->startPlaying();
153 beamsource1->startPlaying();
157 beamsource2->startPlaying();
161 absource->stopPlaying();
165 cerr <<
" ok" << endl;
177 SharedPtr<Scene> scene = sm->
createScene(
"testScene");
186 cerr <<
" Creating resources" << endl;
187 cerr <<
" looking up templates..." << flush;
188 SharedPtr<SourceTemplate> abtpl = TemplateManager::getSingleton()->getSourceTemplate(abtplName);
189 SharedPtr<SourceTemplate> beamtpl = TemplateManager::getSingleton()->getSourceTemplate(beamtplName);
190 cerr <<
" ok" << endl;
192 cerr <<
" setting up listener..." << flush;
193 scene->getListener().setOrientation(
Vector3(0,0,1),
Vector3(0,1,0) );
194 scene->getListener().setPosition(
LVector3(0,0,0) );
195 cerr <<
" ok" << endl;
197 cerr <<
" creating looping sources..." << flush;
199 absource->setPosition(
Vector3(0,0,-1));
200 scene->add(absource);
201 cerr <<
" ok" << endl;
203 cerr <<
" playing out scene..." << flush;
205 absource->startPlaying();
223 absource->stopPlaying();
227 cerr <<
" ok" << endl;
232 cerr <<
" Simple scene (dynamic templates)" << endl;
234 SharedPtr<SourceTemplate> abtpl(
236 SharedPtr<SourceTemplate> beamtpl(
238 beamtpl->setGain(0.5
f);
240 TemplateManager::getSingleton()->addSourceTemplate(
"afterburner",abtpl,
false);
241 TemplateManager::getSingleton()->addSourceTemplate(
"beam",beamtpl,
false);
248 cerr <<
" Simple scene (persistent templates)" << endl;
254 const vector<LVector3> &engPaths;
267 assert(which >= 0 && which < (
long)engPaths.size());
269 double phase = engPaths[which].
x + phaseOffset;
270 double speed = engPaths[which].y;
271 double radii = engPaths[which].z;
274 cos(phase + time * speed) * radii,
275 -
sin(phase + time * speed) * radii,
284 assert(which >= 0 && which < (
long)engPaths.size());
286 double phase = engPaths[which].
x + phaseOffset;
287 double speed = engPaths[which].y;
288 double radii = engPaths[which].z;
291 -
sin(phase + time * speed) * radii * speed,
292 -
cos(phase + time * speed) * radii * speed,
308 if (updateFlags & RenderableSource::UPDATE_LOCATION) {
312 source.
setDirection(computeVelocity(which).normalized());
320 cerr <<
" Complex scene" << endl;
330 SharedPtr<Scene> cpscene = sm->
createScene(
"testSceneCP");
334 SharedPtr<Scene> spcscene = sm->
createScene(
"testSceneSPC");
352 const size_t nengs = 100;
353 const double worldsize = 500.0;
358 sm->
getRenderer()->setDopplerFactor(doppler ? 0.25 : 0.0);
362 cerr <<
" Creating resources" << endl;
363 cerr <<
" looking up templates..." << flush;
364 SharedPtr<SourceTemplate> abtpl = TemplateManager::getSingleton()->getSourceTemplate(
365 "test.sources:afterburner");
366 SharedPtr<SourceTemplate> engtpl = TemplateManager::getSingleton()->getSourceTemplate(
367 "test.sources:engine");
368 SharedPtr<SourceTemplate> engexpl = TemplateManager::getSingleton()->getSourceTemplate(
369 "test.sources:explosion");
370 cerr <<
" ok" << endl;
372 cerr <<
" setting up CP listener..." << flush;
373 cpscene->getListener().setOrientation(
Vector3(0,0,1),
Vector3(0,1,0) );
374 cpscene->getListener().setPosition(
LVector3(0,0,0) );
375 cerr <<
" ok" << endl;
377 cerr <<
" setting up SPC listener..." << flush;
378 spcscene->getListener().setOrientation(
Vector3(0,0,1),
Vector3(0,1,0) );
379 spcscene->getListener().setPosition(
LVector3(0,0,0) );
380 cerr <<
" ok" << endl;
382 cerr <<
" creating looping sources..." << flush;
385 absource->setPosition(
Vector3(0,0,-1));
386 cpscene->add(absource);
388 vector<SharedPtr<Source> > engsources;
389 vector<LVector3> engpaths;
392 SharedPtr<SourceListener> englistener(
397 const double phase_step = 2.0 *
M_PI / nengs;
398 for (
size_t i = 0; i < nengs; ++i) {
399 double phase = i * phase_step;
400 double speed = 2.0 * phase_step * ( double(rand() + RAND_MAX/2) / RAND_MAX );
401 double radii = worldsize * ( 1.0 + 0.25 * double(rand() - RAND_MAX/2) / RAND_MAX );
403 engpaths.push_back(
LVector3(phase, speed, radii));
406 src->setUserDataLong(i);
407 src->setSourceListener(englistener);
408 engsources.push_back(src);
415 cerr <<
" ok" << endl;
417 cerr <<
" playing out scene..." << flush;
419 absource->setGain(0.01);
420 absource->startPlaying();
423 for (vector<SharedPtr<Source> >::iterator i = engsources.begin(); i != engsources.end(); ++i)
424 (*i)->startPlaying();
428 const double phase_step = 2.0 *
M_PI / 20;
430 double speed = phase_step;
433 cos(phase) * worldsize,
434 -
sin(phase) * worldsize,
439 -
sin(phase) * worldsize * speed,
440 -
cos(phase) * worldsize * speed,
444 spcscene->getListener().setOrientation( dpos,
Vector3(0,1,0) );
445 spcscene->getListener().setPosition( pos );
452 absource->stopPlaying();
453 {
for (vector<SharedPtr<Source> >::iterator i = engsources.begin(); i != engsources.end(); ++i)
454 (*i)->stopPlaying(); }
459 cerr <<
" ok" << endl;
464 cerr <<
" Simple streaming (stream a music track)" << endl;
469 double timeDelta = 0.0;
474 SharedPtr<Scene> scene = sm->
createScene(
"testScene");
480 cerr <<
" Creating resources" << endl;
481 cerr <<
" creating sounds..." << flush;
482 SharedPtr<Sound> music = sm->
getRenderer()->getSound(
484 cerr <<
" ok" << endl;
485 cerr <<
" loading sounds..." << flush;
487 cerr <<
" ok" << endl;
489 cerr <<
" setting up listener..." << flush;
490 scene->getListener().setOrientation(
Vector3(0,0,1),
Vector3(0,1,0) );
491 scene->getListener().setPosition(
LVector3(0,0,0) );
492 cerr <<
" ok" << endl;
494 cerr <<
" creating sources..." << flush;
495 SharedPtr<Source> musicsource = sm->
createSource(music);
496 musicsource->setPosition(
Vector3(0,0,0));
497 musicsource->setGain(1.0
f);
498 musicsource->setAttenuated(
false);
499 musicsource->setRelative(
true);
500 scene->add(musicsource);
501 cerr <<
" ok" << endl;
503 cerr <<
" playing out scene..." << flush;
506 musicsource->startPlaying();
507 for (i=0; i<200; ++i) {
512 double curPlayingTime = musicsource->getPlayingTime();
513 double shouldPlayingTime = realTime - startPlayingTime;
514 double delta = fabs(curPlayingTime - shouldPlayingTime);
515 if (delta > timeDelta)
520 startPlayingTime = realTime - curPlayingTime;
522 cerr <<
"Time delta: " <<
int(delta * 1000) <<
"ms (max " <<
int(timeDelta * 1000) <<
"ms)\t\r" << flush;
525 musicsource->stopPlaying();
529 if (timeDelta > (1.0 / 30.0))
530 cerr <<
"\nWARNING: Poor time tracking resolution\n";
531 cerr <<
" Time drift at " <<
int(timeDelta*1000) <<
"ms" << endl;
533 cerr <<
" ok" << endl;
538 cerr <<
" Multiple streaming (stream two music tracks)" << endl;
543 double timeDelta = 0.0;
548 SharedPtr<Scene> scene = sm->
createScene(
"testScene");
554 cerr <<
" Creating resources" << endl;
555 cerr <<
" creating sounds..." << flush;
556 SharedPtr<Sound> music = sm->
getRenderer()->getSound(
558 SharedPtr<Sound> music2 = sm->
getRenderer()->getSound(
560 cerr <<
" ok" << endl;
561 cerr <<
" loading sounds..." << flush;
564 cerr <<
" ok" << endl;
566 cerr <<
" setting up listener..." << flush;
567 scene->getListener().setOrientation(
Vector3(0,0,1),
Vector3(0,1,0) );
568 scene->getListener().setPosition(
LVector3(0,0,0) );
569 cerr <<
" ok" << endl;
571 cerr <<
" creating sources..." << flush;
573 SharedPtr<Source> musicsource = sm->
createSource(music);
574 musicsource->setPosition(
Vector3(0,0,0));
575 musicsource->setGain(1.0
f);
576 musicsource->setAttenuated(
false);
577 musicsource->setRelative(
true);
579 SharedPtr<Source> musicsource2 = sm->
createSource(music2);
580 musicsource2->setPosition(
Vector3(0,0,0));
581 musicsource2->setGain(1.0
f);
582 musicsource2->setAttenuated(
false);
583 musicsource2->setRelative(
true);
585 scene->add(musicsource);
586 scene->add(musicsource2);
588 cerr <<
" ok" << endl;
590 cerr <<
" playing out scene..." << flush;
593 musicsource->startPlaying();
594 musicsource2->startPlaying();
595 for (i=0; i<200; ++i) {
600 double curPlayingTime = musicsource->getPlayingTime();
601 double shouldPlayingTime = realTime - startPlayingTime;
602 double delta = fabs(curPlayingTime - shouldPlayingTime);
603 if (delta > timeDelta)
608 startPlayingTime = realTime - curPlayingTime;
610 cerr <<
"Time delta: " <<
int(delta * 1000) <<
"ms (max " <<
int(timeDelta * 1000) <<
"ms)\t\r" << flush;
613 musicsource->stopPlaying();
617 musicsource2->stopPlaying();
621 if (timeDelta > (1.0 / 30.0))
622 cerr <<
"\nWARNING: Poor time tracking resolution\n";
623 cerr <<
" Time drift at " <<
int(timeDelta*1000) <<
"ms" << endl;
625 cerr <<
" ok" << endl;
630 cerr <<
" Multiple streaming (stream one music track - twice - from different positions)" << endl;
635 double timeDelta = 0.0;
640 SharedPtr<Scene> scene = sm->
createScene(
"testScene");
646 cerr <<
" Creating resources" << endl;
647 cerr <<
" creating sounds..." << flush;
648 SharedPtr<Sound> music = sm->
getRenderer()->getSound(
650 SharedPtr<Sound> music2 = sm->
getRenderer()->getSound(
652 cerr <<
" ok" << endl;
653 cerr <<
" loading sounds..." << flush;
656 cerr <<
" ok" << endl;
658 cerr <<
" setting up listener..." << flush;
659 scene->getListener().setOrientation(
Vector3(0,0,1),
Vector3(0,1,0) );
660 scene->getListener().setPosition(
LVector3(0,0,0) );
661 cerr <<
" ok" << endl;
663 cerr <<
" creating sources..." << flush;
665 SharedPtr<Source> musicsource = sm->
createSource(music);
666 musicsource->setPosition(
Vector3(0,0,0));
667 musicsource->setGain(1.0
f);
668 musicsource->setAttenuated(
false);
669 musicsource->setRelative(
true);
671 SharedPtr<Source> musicsource2 = sm->
createSource(music2);
672 musicsource2->setPosition(
Vector3(0,0,0));
673 musicsource2->setGain(1.0
f);
674 musicsource2->setAttenuated(
false);
675 musicsource2->setRelative(
true);
677 scene->add(musicsource);
678 scene->add(musicsource2);
680 cerr <<
" ok" << endl;
682 cerr <<
" playing out scene..." << flush;
685 musicsource->startPlaying();
686 musicsource2->startPlaying(60.0);
687 for (i=0; i<200; ++i) {
692 double curPlayingTime = musicsource->getPlayingTime();
693 double shouldPlayingTime = realTime - startPlayingTime;
694 double delta = fabs(curPlayingTime - shouldPlayingTime);
695 if (delta > timeDelta)
700 startPlayingTime = realTime - curPlayingTime;
702 cerr <<
"Time delta: " <<
int(delta * 1000) <<
"ms (max " <<
int(timeDelta * 1000) <<
"ms)\t\r" << flush;
705 musicsource->stopPlaying();
709 musicsource2->stopPlaying();
713 if (timeDelta > (1.0 / 30.0))
714 cerr <<
"\nWARNING: Poor time tracking resolution\n";
715 cerr <<
" Time drift at " <<
int(timeDelta*1000) <<
"ms" << endl;
717 cerr <<
" ok" << endl;
723 cerr <<
" Initializing renderer..." << endl;
727 renderer->setOutputFormat(
Format(44100,16,2) );
734 cerr <<
"Shutting down renderer..." << endl;
735 SceneManager::getSingleton()->setRenderer( SharedPtr<Renderer>() );
738 int main(
int argc,
char **argv)
745 cerr <<
"Running rendererless tests..." << endl;
749 cerr <<
"Running rendererful tests..." << endl;
771 cerr <<
"Uncaught exception: "
777 cout <<
"FAILED" << endl;