diff --git a/CHANGELOG.txt b/CHANGELOG.txt index 5261c7e..92ac0f2 100644 --- a/CHANGELOG.txt +++ b/CHANGELOG.txt @@ -1,5 +1,5 @@ Changelog for Photon -$Id: CHANGELOG.txt,v 1.1 2005/07/17 22:41:03 cozman Exp $ +$Id: CHANGELOG.txt,v 1.2 2005/07/19 18:35:20 cozman Exp $ 0.1.0 (Massachusetts) - Initial Release @@ -11,6 +11,8 @@ $Id: CHANGELOG.txt,v 1.1 2005/07/17 22:41:03 cozman Exp $ * A wide variety of helper utilities for tasks such as filesystem navigation, FileBuffer capable of reading from archives, random number generation, versioning, and timing + * Powerful input system allowing for direct access to keyboard/mouse status + or passive listeners which are notified of events when they occur. * Resource Management system including the ability to load resources from specified directories or archives. * Variety of math classes including Circle, Rectangle, and Vector classes @@ -31,5 +33,5 @@ $Id: CHANGELOG.txt,v 1.1 2005/07/17 22:41:03 cozman Exp $ * Entire library is built in a highly-modular fashion with extensibility in mind. Use of modern programming techniques like templates and exceptions contributes to ease of use and ease of development. - * 13 demo programs showing features and ease of use + * 13 demo programs showing features and ease of use of various components. diff --git a/CREDITS.txt b/CREDITS.txt index 881c482..b928353 100644 --- a/CREDITS.txt +++ b/CREDITS.txt @@ -3,6 +3,7 @@ The following people have contributed code to photon: ..yeah this list is too short right now, so help out ;) In addition, I'd like to thank: + * Sourceforge.net - Providing hosting for the project and CVS. * Sean and Gamer Tazar from the old CoZ team, where ZEngine was born * Everyone who contributed to, used, or downloaded ZEngine * Sam Lantinga and the rest of the SDL crew (without SDL, no ZEngine, @@ -13,5 +14,8 @@ In addition, I'd like to thank: * Jesse Maurais and DevMaster.net for the OpenAL tutorials * Everyone responsible for FreeMind (http://freemind.sf.net) * The Ubuntu Team (http://ubuntulinux.com) + * Makoto Matsumoto and Takuji Nishimura for authoring the Mersenne Twister + algorithm, and making it freely available. + http://www.math.keio.ac.jp/~matumoto/emt.html -$Id: CREDITS.txt,v 1.1 2005/07/17 22:41:03 cozman Exp $ +$Id: CREDITS.txt,v 1.2 2005/07/19 18:35:20 cozman Exp $ diff --git a/photon.mm b/photon.mm index ba3d38c..5a3c3ef 100644 --- a/photon.mm +++ b/photon.mm @@ -5,45 +5,126 @@ <font BOLD="true" NAME="SansSerif" SIZE="12"/> <node ID="Freemind_Link_682620075" POSITION="right" TEXT="0.1 Release"> <font BOLD="true" NAME="SansSerif" SIZE="12"/> -<node ID="Freemind_Link_1479941799" TEXT="Clean up source"> -<node ID="Freemind_Link_1271859141" TEXT="math::"/> -<node ID="Freemind_Link_510494143" TEXT="util::"/> -<node ID="Freemind_Link_1243282886" TEXT="video::"/> -<node ID="Freemind_Link_327905180" TEXT="photon:: (general)"/> -<node ID="Freemind_Link_1716705807" TEXT="clean up naturaldocs"/> +<node ID="Freemind_Link_1746871436" TEXT="remaining features"> +<node ID="Freemind_Link_40954797" TEXT="improved input handling "> +<icon BUILTIN="button_ok"/> +<node ID="_" TEXT="amph listener system"> +<icon BUILTIN="button_ok"/> </node> -<node ID="Freemind_Link_1153941464" TEXT="test compilation on fresh systems"> -<node ID="Freemind_Link_1403005191" TEXT="test compilation on clean linux system"/> -<node ID="Freemind_Link_617919930" TEXT="test compilation on windows system"/> -<node ID="Freemind_Link_510637" TEXT="OSX tester?"/> -</node> -<node ID="Freemind_Link_1010220321" TEXT="test all tests"/> -<node ID="Freemind_Link_1870184326" TEXT="example game"> -<node ID="Freemind_Link_714736465" TEXT="Let's Draw"/> -<node COLOR="#000000" ID="Freemind_Link_597173063" TEXT="Asteroids"/> -</node> -<node ID="Freemind_Link_1746871436" TEXT="possible features"> -<node ID="Freemind_Link_40954797" TEXT="Decide on callbacks (push to 0.1.x possibly)"/> -<node ID="Freemind_Link_547285954" TEXT="Decide on Kernel/Appcore Test"/> -<node ID="Freemind_Link_1825420810" TEXT="Music"/> +<node ID="Freemind_Link_1092577706" TEXT="keysPressed list"> +<icon BUILTIN="button_ok"/> </node> </node> -<node FOLDED="true" ID="Freemind_Link_486829238" POSITION="right" TEXT="0.2 Release"> -<node ID="Freemind_Link_1298931281" TEXT="XML resource files"/> -<node ID="Freemind_Link_216021234" TEXT="Sprite System"> +<node ID="Freemind_Link_1825420810" TEXT="Music"> +<node ID="Freemind_Link_105493282" TEXT="maybe at least WAV queueing"/> +<node ID="Freemind_Link_211899568" TEXT="delay development into 0.1.x"> <font NAME="SansSerif" SIZE="12"/> -</node> -<node ID="Freemind_Link_1497432478" TEXT="Particle System"/> -<node ID="Freemind_Link_1339011485" TEXT="Tilemap System"/> -<node ID="Freemind_Link_1070201117" TEXT="Transitions"/> -<node ID="Freemind_Link_654490435" TEXT="Second Example Game"> -<node ID="Freemind_Link_1191623789" TEXT="Public Project?"/> -</node> -<node COLOR="#000000" ID="Freemind_Link_420721466" TEXT="XML/XSLT sink"> <icon BUILTIN="help"/> </node> </node> -<node COLOR="#147f1e" ID="Freemind_Link_438641521" POSITION="left" TEXT="Version: $Id: photon.mm,v 1.20 2005/07/18 05:14:18 cozman Exp $"> +<node ID="Freemind_Link_547285954" TEXT="Kernel Test"> +<node ID="Freemind_Link_1976399424" TEXT="make call to keep/remove Kernel system"> +<icon BUILTIN="messagebox_warning"/> +</node> +</node> +<node ID="Freemind_Link_261923672" TEXT="change way Audio is enabled"> +<icon BUILTIN="button_ok"/> +<node ID="Freemind_Link_1100203457" TEXT="fixed ~AudioCore"/> +</node> +</node> +<node ID="Freemind_Link_1716705807" TEXT="clean up naturaldocs"/> +<node ID="Freemind_Link_1010220321" TEXT="clean/test all tests"> +<node ID="Freemind_Link_129725390" TEXT="Audio"> +<icon BUILTIN="button_ok"/> +</node> +<node ID="Freemind_Link_543532536" TEXT="ConfigFile"/> +<node ID="Freemind_Link_1037234161" TEXT="Font"/> +<node ID="Freemind_Link_1574983928" TEXT="Image"/> +<node ID="Freemind_Link_83171017" TEXT="Input"/> +<node ID="Freemind_Link_714170273" TEXT="Log"/> +<node ID="Freemind_Link_1336661607" TEXT="Pen"/> +<node ID="Freemind_Link_26290657" TEXT="RandGen"/> +<node ID="Freemind_Link_1563035547" TEXT="Texture"/> +<node ID="Freemind_Link_226187774" TEXT="exception"/> +<node ID="Freemind_Link_120826083" TEXT="filesys"/> +<node ID="Freemind_Link_1985120655" TEXT="math"/> +</node> +<node ID="Freemind_Link_1153941464" TEXT="test compilation on fresh systems"> +<node ID="Freemind_Link_1403005191" TEXT="test compilation on clean linux system"/> +<node ID="Freemind_Link_617919930" TEXT="test compilation on windows system"> +<node ID="Freemind_Link_962964571" TEXT="MingW"/> +<node ID="Freemind_Link_601778960" TEXT="visual c++"/> +</node> +<node ID="Freemind_Link_510637" TEXT="OSX tester?"> +<node ID="Freemind_Link_1837644449" TEXT="gamedev"/> +<node ID="Freemind_Link_867673431" TEXT="OSX dev community"/> +<node ID="Freemind_Link_1722199385" TEXT="sourceforge"> +<node ID="Freemind_Link_518828740" TEXT="job posting"/> +<node ID="Freemind_Link_997339944" TEXT="compile farm"> +<icon BUILTIN="button_cancel"/> +</node> +</node> +</node> +</node> +<node ID="Freemind_Link_1870184326" TEXT="example game"> +<node COLOR="#000000" ID="Freemind_Link_597173063" TEXT="Asteroids"/> +<node ID="Freemind_Link_719722821" TEXT="Lunar Lander"/> +<node ID="Freemind_Link_173048174" TEXT="Missile Command"/> +</node> +</node> +<node FOLDED="true" ID="Freemind_Link_486829238" POSITION="right" TEXT="0.2 Release"> +<font BOLD="true" NAME="SansSerif" SIZE="12"/> +<node FOLDED="true" ID="Freemind_Link_103747781" TEXT="New Features"> +<font NAME="SansSerif" SIZE="12"/> +<node COLOR="#000000" ID="Freemind_Link_420721466" TEXT="XML/XSLT sink"/> +<node ID="Freemind_Link_1298931281" TEXT="XML resource files"/> +<node ID="Freemind_Link_1070201117" TEXT="Transitions"> +<node ID="Freemind_Link_664044389" TEXT="investigate what other libs do"/> +<node ID="Freemind_Link_1667343634" TEXT="render to texture?"/> +</node> +<node ID="Freemind_Link_1339011485" TEXT="Tilemap System"/> +<node ID="Freemind_Link_1497432478" TEXT="Particle System"/> +<node ID="Freemind_Link_216021234" TEXT="Sprite System"> +<font NAME="SansSerif" SIZE="12"/> +</node> +</node> +<node FOLDED="true" ID="Freemind_Link_654490435" TEXT="Second Example Game"> +<node ID="Freemind_Link_1191623789" TEXT="Public Project?"/> +</node> +<node FOLDED="true" ID="Freemind_Link_903043501" TEXT="Improvements"> +<node ID="Freemind_Link_878549222" TEXT="drop alut dependency"/> +<node ID="Freemind_Link_1362733907" TEXT="investigate dropping Corona"/> +</node> +</node> +<node FOLDED="true" ID="Freemind_Link_1111954089" POSITION="right" TEXT="Long Term"> +<font BOLD="true" NAME="SansSerif" SIZE="12"/> +<node FOLDED="true" ID="Freemind_Link_1066996987" TEXT="New Features"> +<font NAME="SansSerif" SIZE="12"/> +<node ID="Freemind_Link_539015028" TEXT="physics:: (similar to math::)"/> +<node FOLDED="true" ID="Freemind_Link_1107695046" TEXT="gui::"> +<node ID="Freemind_Link_548983970" TEXT="skinnable XML based"/> +</node> +<node FOLDED="true" ID="Freemind_Link_304523376" TEXT="network::"> +<node ID="Freemind_Link_717482997" TEXT="wrap enet?"/> +</node> +<node ID="Freemind_Link_21483700" TEXT="python interface"> +<icon BUILTIN="help"/> +</node> +<node ID="Freemind_Link_1045478290" TEXT="lua integration"> +<icon BUILTIN="help"/> +</node> +<node ID="Freemind_Link_1083759822" TEXT="java interface"> +<icon BUILTIN="help"/> +</node> +</node> +<node FOLDED="true" ID="Freemind_Link_1067043723" TEXT="allow for alternate backends "> +<node ID="Freemind_Link_1997175841" TEXT="audiere for audio"/> +<node ID="Freemind_Link_961284194" TEXT="SDL backend"> +<icon BUILTIN="help"/> +</node> +</node> +</node> +<node COLOR="#147f1e" ID="Freemind_Link_438641521" POSITION="left" TEXT="Version: $Id: photon.mm,v 1.21 2005/07/19 18:35:20 cozman Exp $"> <font ITALIC="true" NAME="SansSerif" SIZE="12"/> </node> </node> diff --git a/src/AppCore.cpp b/src/AppCore.cpp index ff3b28d..3321662 100644 --- a/src/AppCore.cpp +++ b/src/AppCore.cpp @@ -5,7 +5,7 @@ // James Turk (jpt2433@rit.edu) // // Version: -// $Id: AppCore.cpp,v 1.11 2005/07/19 05:45:23 cozman Exp $ +// $Id: AppCore.cpp,v 1.12 2005/07/19 18:35:20 cozman Exp $ #include "AppCore.hpp" @@ -35,8 +35,13 @@ AppCore::AppCore() : AppCore::~AppCore() { - video::VideoCore::destroy(); // destroy videocore - glfwCloseWindow(); //close GLFW window + + if(dispWidth_ && dispHeight_) + { + video::VideoCore::destroy(); // destroy videocore + glfwCloseWindow(); //close GLFW window + } + glfwTerminate(); //shutdown GLFW } @@ -136,7 +141,7 @@ void AppCore::addInputListener(InputListener *listener) { throw ArgumentException("Null pointer in AppCore::addInputListener"); } - + // add the listener listeners_.push_back(listener); } diff --git a/src/Application.cpp b/src/Application.cpp index a55e467..2d29f3c 100644 --- a/src/Application.cpp +++ b/src/Application.cpp @@ -5,7 +5,7 @@ // James Turk (jpt2433@rit.edu) // // Version: -// $Id: Application.cpp,v 1.12 2005/07/19 01:31:38 cozman Exp $ +// $Id: Application.cpp,v 1.13 2005/07/19 18:35:20 cozman Exp $ #include "Application.hpp" @@ -43,7 +43,6 @@ Application::~Application() // destroy the singletons AppCore::destroy(); - //audio::AudioCore::destroy(); Kernel::destroy(); } diff --git a/src/audio/AudioCore.cpp b/src/audio/AudioCore.cpp index aade8b0..2576b21 100644 --- a/src/audio/AudioCore.cpp +++ b/src/audio/AudioCore.cpp @@ -5,7 +5,7 @@ // James Turk (jpt2433@rit.edu) // // Version: -// $Id: AudioCore.cpp,v 1.9 2005/07/19 05:56:08 cozman Exp $ +// $Id: AudioCore.cpp,v 1.10 2005/07/19 18:35:20 cozman Exp $ #ifdef PHOTON_USE_OPENAL @@ -33,12 +33,12 @@ AudioCore::~AudioCore() ALCcontext* context( alcGetCurrentContext() ); ALCdevice* device( alcGetContextsDevice(context) ); - // set current context to null - alcMakeContextCurrent(0); - // destroy context & device alcDestroyContext(context); alcCloseDevice(device); + + // set current context to null + alcMakeContextCurrent(0); } std::string AudioCore::getAudioDeviceName() const @@ -139,6 +139,8 @@ util::VersionInfo AudioCore::initOpenAL(const std::string& deviceName) #else #warning OpenAL only built on Windows/Linux, find out version on OSX #endif + + throwOpenALError("AudioCore::initOpenAL"); return util::VersionInfo(major,minor,patch); } diff --git a/test/Audio_test.cpp b/test/Audio_test.cpp index a60a198..8a1ac93 100644 --- a/test/Audio_test.cpp +++ b/test/Audio_test.cpp @@ -5,17 +5,19 @@ // James Turk (jpt2433@rit.edu) // // Version: -// $Id: Audio_test.cpp,v 1.4 2005/07/19 05:57:58 cozman Exp $ +// $Id: Audio_test.cpp,v 1.5 2005/07/19 18:35:20 cozman Exp $ #include "photon.hpp" using namespace photon; #include <boost/lexical_cast.hpp> +// actual test is only compiled if OpenAL is in use #ifdef PHOTON_USE_OPENAL using namespace photon::audio; -class MainTask : public Task +// sole task of AudioTest +class MainTask : public Task , public InputListener { public: @@ -24,14 +26,13 @@ public: app(AppCore::getInstance()), video(video::VideoCore::getInstance()) { - LogSinkPtr csp( new ConsoleSink("console") ); - log.addSink(csp); - - video.setOrthoView(800,600); + video.setOrthoView(800,600); // setup view + // load a font video::Font::addResource("font","data/FreeMono.ttf",20); font.open("font"); + // load the 6 sound effects Sample::addResource("chimes","data/chimes.wav"); Sample::addResource("ocean","data/ocean.wav"); Sample::addResource("rain","data/rain.wav"); @@ -39,6 +40,7 @@ public: Sample::addResource("thunder","data/thunder.wav"); Sample::addResource("waterdrop","data/waterdrop.wav"); + // open the sounds chimes.open("chimes"); ocean.open("ocean"); rain.open("rain"); @@ -46,115 +48,120 @@ public: thunder.open("thunder"); waterdrop.open("waterdrop"); + // make all sounds looping chimes.setLooping(true); ocean.setLooping(true); rain.setLooping(true); stream.setLooping(true); thunder.setLooping(true); + // test Sample::isLooping via assertions assert(!waterdrop.isLooping()); waterdrop.setLooping(true); assert(waterdrop.isLooping()); + // status holds strings describing playing status for nice output for(int i=0; i < 6; ++i) status[i] = "NOT "; } - void checkKeys() + // executes the checking of the keys, when a key is pressed + // the state is toggled + void onKeyPress(int key) { static const std::string NOT_PLAYING = "NOT "; - static scalar lastCheck = 0; - if(app.getTime() - lastCheck > 0.1) + switch(key) { - lastCheck = app.getTime(); + + case KEY_C: + if(!chimes.isPlaying()) + { + chimes.play(); + status[0] = ""; + } + else + { + chimes.stop(); + status[0] = NOT_PLAYING; + } + break; - if(app.keyPressed(KEY_C)) + case KEY_O: + if(!ocean.isPlaying()) { - if(!chimes.isPlaying()) - { - chimes.play(); - status[0] = ""; - } - else - { - chimes.stop(); - status[0] = NOT_PLAYING; - } + ocean.play(); + status[1] = ""; } - if(app.keyPressed(KEY_O)) + else { - if(!ocean.isPlaying()) - { - ocean.play(); - status[1] = ""; - } - else - { - ocean.stop(); - status[1] = NOT_PLAYING; - } + ocean.stop(); + status[1] = NOT_PLAYING; } - if(app.keyPressed(KEY_R)) + break; + + case KEY_R: + if(!rain.isPlaying()) { - if(!rain.isPlaying()) - { - rain.play(); - status[2] = ""; - } - else - { - rain.stop(); - status[2] = NOT_PLAYING; - } + rain.play(); + status[2] = ""; } - if(app.keyPressed(KEY_S)) + else { - if(!stream.isPlaying()) - { - stream.play(); - status[3] = ""; - } - else - { - stream.stop(); - status[3] = NOT_PLAYING; - } + rain.stop(); + status[2] = NOT_PLAYING; } - if(app.keyPressed(KEY_T)) + break; + + case KEY_S: + if(!stream.isPlaying()) { - if(!thunder.isPlaying()) - { - thunder.play(); - status[4] = ""; - } - else - { - thunder.stop(); - status[4] = NOT_PLAYING; - } + stream.play(); + status[3] = ""; } - if(app.keyPressed(KEY_W)) + else { - if(!waterdrop.isPlaying()) - { - waterdrop.play(); - status[5] = ""; - } - else - { - waterdrop.stop(); - status[5] = NOT_PLAYING; - } + stream.stop(); + status[3] = NOT_PLAYING; } + break; + + case KEY_T: + if(!thunder.isPlaying()) + { + thunder.play(); + status[4] = ""; + } + else + { + thunder.stop(); + status[4] = NOT_PLAYING; + } + break; + + case KEY_W: + if(!waterdrop.isPlaying()) + { + waterdrop.play(); + status[5] = ""; + } + else + { + waterdrop.stop(); + status[5] = NOT_PLAYING; + } + break; + + default: + break; } } + // called once per frame void update() { - static const photon::uint fontHeight(font.getHeight()); + // used to measure FPS and display it in the title bar static double t=0; - if(app.getTime() - t > 1.0) { app.setTitle("FPS: " + @@ -162,10 +169,12 @@ public: t = app.getTime(); } - checkKeys(); + // used for calculating draw position + static const photon::uint fontHeight(font.getHeight()); - video.clear(); + video.clear(); // clear display before drawing + // draw the status of all 6 sounds font.beginDraw(0, 0*fontHeight) << "(C)himes is " << status[0] << "playing" << font.endDraw(); font.beginDraw(0, 1*fontHeight) << "(O)cean is " << status[1] << @@ -185,8 +194,8 @@ private: video::Font font; audio::Sample chimes, ocean, rain, stream, thunder, waterdrop; std::string status[6]; - - Log log; + + // references to singleton cores AppCore& app; video::VideoCore& video; }; @@ -197,23 +206,29 @@ public: int main(const StrVec& args) { + // create window AppCore::getInstance().createDisplay(800,600,32,0,0,false); - - AudioCore::initAudioDevice("OSS"); - + // create sound device + AudioCore::initAudioDevice("OSS"); + + // add the task to the Kernel Kernel::getInstance().addTask(TaskPtr(new MainTask())); - - Kernel::getInstance().run(); + // run Kernel until task finishes + Kernel::getInstance().run(); + + // destroy AudioCore, shuts down audio system + AudioCore::destroy(); return 0; } }; -ENTRYPOINT(AudioTest) +ENTRYPOINT(AudioTest) // make AudioTest the entrypoint class #else -#include <iostream> +// alternate application if OpenAL was not available +#include <iostream> int main() { std::cerr << "Photon compiled without OpenAL support.\n";