post-Kernel

This commit is contained in:
James Turk 2005-03-15 19:21:51 +00:00
parent c822bbebc1
commit 0ba7535428
12 changed files with 691 additions and 211 deletions

View File

@ -5,7 +5,7 @@
# James Turk (jpt2433@rit.edu) # James Turk (jpt2433@rit.edu)
# #
# Version: # Version:
# $Id: SConstruct,v 1.4 2005/03/04 13:06:49 cozman Exp $ # $Id: SConstruct,v 1.5 2005/03/15 19:21:51 cozman Exp $
import os,os.path import os,os.path
import glob import glob
@ -88,11 +88,13 @@ class Builder:
self.namedBuild('photon', os.path.join('lib',libName), 'Library', self.namedBuild('photon', os.path.join('lib',libName), 'Library',
default=True, default=True,
source = self.srcFiles, CPPPATH = self.incDirs) source = self.srcFiles, CPPPATH = 'include',
CPPFLAGS = '-Wall -pedantic -pg')
self.namedBuild('test00', 'test00', 'Program', default=False, self.namedBuild('test00', 'test00', 'Program', default=False,
source = 'test00.cpp', CPPPATH = self.incDirs, source = 'test00.cpp', CPPPATH = self.incDirs,
LIBPATH='./lib', LIBPATH='./lib',
LIBS=['photon','openal32','glfw','opengl32','glu32','physfs']) LIBS=['photon','openal32','glfw','opengl32','glu32','physfs'],
CPPFLAGS = '-Wall -pedantic -pg', LINKFLAGS='-pg')
self.buildSuperHeader(libName) self.buildSuperHeader(libName)
ndoc = self.env.Command('docs/index.html', './include', ndoc = self.env.Command('docs/index.html', './include',
"""NaturalDocs -nag -i $SOURCES -o HTML ./docs -p ./ndoc""", """NaturalDocs -nag -i $SOURCES -o HTML ./docs -p ./ndoc""",

View File

@ -5,15 +5,15 @@
// James Turk (jpt2433@rit.edu) // James Turk (jpt2433@rit.edu)
// //
// Version: // Version:
// $Id: AppCore.hpp,v 1.4 2005/03/04 13:06:49 cozman Exp $ // $Id: AppCore.hpp,v 1.5 2005/03/15 19:22:07 cozman Exp $
#ifndef PHOTON_APPCORE_HPP #ifndef PHOTON_APPCORE_HPP
#define PHOTON_APPCORE_HPP #define PHOTON_APPCORE_HPP
#include "types.hpp" #include "types.hpp"
#include "glfw/types_glfw.hpp"
#include "util/VersionInfo.hpp" #include "util/VersionInfo.hpp"
#include "util/Singleton.hpp" #include "util/Singleton.hpp"
#include "Task.hpp"
namespace photon namespace photon
{ {
@ -30,6 +30,10 @@ namespace photon
class AppCore : public util::Singleton<AppCore> class AppCore : public util::Singleton<AppCore>
{ {
public:
AppCore();
~AppCore();
// Group: Video // Group: Video
public: public:
@ -46,11 +50,11 @@ public:
// depthBits - desired bitdepth of depth buffer // depthBits - desired bitdepth of depth buffer
// stencilBits - desired bitdepth of stencil buffer // stencilBits - desired bitdepth of stencil buffer
// fullscreen - true: fullscreen, false: windowed // fullscreen - true: fullscreen, false: windowed
// title - title of application // [title - title of application, optional]
void createDisplay(uint width, uint height, void createDisplay(uint width, uint height,
uint redBits, uint greenBits, uint blueBits, uint redBits, uint greenBits, uint blueBits,
uint alphaBits, uint depthBits, uint stencilBits, uint alphaBits, uint depthBits, uint stencilBits,
bool fullscreen, const std::string& title); bool fullscreen, const std::string& title="Photon App");
// Function: createDisplay // Function: createDisplay
// This function attempts to create a display with the given parameters. // This function attempts to create a display with the given parameters.
@ -62,10 +66,10 @@ public:
// depthBits - desired bitdepth of depth buffer // depthBits - desired bitdepth of depth buffer
// stencilBits - desired bitdepth of stencil buffer // stencilBits - desired bitdepth of stencil buffer
// fullscreen - true: fullscreen, false: windowed // fullscreen - true: fullscreen, false: windowed
// title - title of application // [title - title of application, optional]
void createDisplay(uint width, uint height, uint bpp, void createDisplay(uint width, uint height, uint bpp,
uint depthBits, uint stencilBits, bool fullscreen, uint depthBits, uint stencilBits, bool fullscreen,
const std::string& title); const std::string& title="Photon App");
// Group: Input // Group: Input
public: public:
@ -125,9 +129,6 @@ public:
// Group: General // Group: General
public: public:
// Function: update
// Updates the internals of the application, including the display.
void update();
// Function: setTitle // Function: setTitle
// Sets title of application that shows up in title bar. // Sets title of application that shows up in title bar.
@ -136,18 +137,6 @@ public:
// title - New title of application. // title - New title of application.
void setTitle(const std::string& title); void setTitle(const std::string& title);
// Function: requestQuit
// Sets the internal quit flag to true.
void requestQuit();
// Function: quitRequested
// Checks the internal quit flag, if a quit has been requested,
// the application should comply.
//
// Returns:
// State of internal quit flag, if true application should quit ASAP.
bool quitRequested();
// Function: isActive // Function: isActive
// Checks if application is active, which on most systems simply means it // Checks if application is active, which on most systems simply means it
// has focus. // has focus.
@ -187,11 +176,19 @@ public:
// Height of display in pixels. // Height of display in pixels.
uint getDisplayHeight(); uint getDisplayHeight();
// data members class UpdateTask : public Task
{
friend class AppCore;
public:
UpdateTask();
void update();
private: private:
uint dispWidth_; uint mouseX_;
uint dispHeight_; uint mouseY_;
bool quitRequested_;
bool active_; bool active_;
bool timerPaused_; bool timerPaused_;
bool unpauseOnActive_; bool unpauseOnActive_;
@ -199,18 +196,17 @@ private:
scalar pausedTime_; scalar pausedTime_;
scalar secPerFrame_; scalar secPerFrame_;
scalar lastUpdate_; scalar lastUpdate_;
};
// data members
private:
uint dispWidth_;
uint dispHeight_;
shared_ptr<UpdateTask> task_;
// API initialization // API initialization
private: private:
util::VersionInfo initGLFW(); util::VersionInfo initGLFW();
// Singleton-required code
private:
AppCore();
~AppCore();
friend class util::Singleton<AppCore>;
friend class std::auto_ptr<AppCore>;
}; };
} }

View File

@ -5,7 +5,7 @@
// James Turk (jpt2433@rit.edu) // James Turk (jpt2433@rit.edu)
// //
// Version: // Version:
// $Id: Application.hpp,v 1.6 2005/03/02 08:40:51 cozman Exp $ // $Id: Application.hpp,v 1.7 2005/03/15 19:22:07 cozman Exp $
#ifndef PHOTON_APPLICATION_HPP #ifndef PHOTON_APPLICATION_HPP
#define PHOTON_APPLICATION_HPP #define PHOTON_APPLICATION_HPP
@ -17,6 +17,7 @@
#include "types.hpp" #include "types.hpp"
#include "util/VersionInfo.hpp" #include "util/VersionInfo.hpp"
#include "Task.hpp"
namespace photon namespace photon
{ {
@ -26,7 +27,7 @@ namespace photon
// implementations of Application. // implementations of Application.
// //
// Derived classes are made entrypoint via <ENTRYPOINT>. // Derived classes are made entrypoint via <ENTRYPOINT>.
class Application : public boost::noncopyable class Application
{ {
// Group: (Con/De)structors // Group: (Con/De)structors
@ -39,6 +40,8 @@ public:
// Default destructor, shuts down dependencies. // Default destructor, shuts down dependencies.
virtual ~Application(); virtual ~Application();
// Group: Main
public:
// Function: main // Function: main
// Pure virtual, must be defined by derived class, using some preprocessor // Pure virtual, must be defined by derived class, using some preprocessor
// magic (<MAINCLASS>) on the derived class // magic (<MAINCLASS>) on the derived class
@ -52,34 +55,20 @@ public:
// //
// See Also: // See Also:
// <ENTRYPOINT> // <ENTRYPOINT>
virtual int main(StrVec args)=0; virtual int main(const StrVec& args)=0;
// Behind the scenes // behind the scenes
public: public:
// Function: setInitOptions(const char* arg0) static void setInitOptions(const char* arg0);
// Internal use function, used to set initialization options.
// (params not documented since function signature is subject to change and
// should not be relied on by user-level code)
static void setInitOptions(const char* appPath);
// Group: API Initialization // Group: API Initialization
private: private:
// Function: initPhysFS
// Initialize PhysFS for use.
//
// Parameters:
// arg0 - Path to application (argv[0])
//
// Returns:
// <VersionInfo> with PhysFS version.
util::VersionInfo initPhysFS(const char* arg0); util::VersionInfo initPhysFS(const char* arg0);
// Data Members
private: private:
// version number for photon // version number for photon
util::VersionInfo photonVer_; util::VersionInfo photonVer_;
// arg0 from command line
static std::string arg0_; static std::string arg0_;
}; };

105
include/Kernel.hpp Normal file
View File

@ -0,0 +1,105 @@
//This file is part of Photon (http://photon.sourceforge.net)
//Copyright (C) 2004-2005 James Turk
//
// Author:
// James Turk (jpt2433@rit.edu)
//
// Version:
// $Id: Kernel.hpp,v 1.1 2005/03/15 19:22:07 cozman Exp $
#ifndef PHOTON_KERNEL_HPP
#define PHOTON_KERNEL_HPP
#include <list>
#include <algorithm>
#include "util/Singleton.hpp"
#include "Task.hpp"
namespace photon
{
// Class: Kernel
// Singleton Kernel class, maintains a list of <Tasks> and manages their
// status, including adding, deleting, pausing, and unpausing tasks.
//
// To use Kernel:
// - (1) Add any tasks (should be derived from <Task>)
// - (2) call <Kernel::run>
// - (3) in order to avoid running forever, all tasks should eventually die
class Kernel : public util::Singleton<Kernel>
{
// Group: (Con/De)structors
public:
// Function: Kernel
// Kernel constructor, initializes kernel singleton.
Kernel();
// Function: ~Kernel
// Kernel destructor, destroys kernel singleton.
~Kernel();
// Group: Running
public:
// Function: run
// Runs tasks until all tasks are asleep or dead.
//
// Each 'frame' all tasks are run in order of their priorities, if two
// tasks have the same priority, they are run in the order they were added.
void run();
// Group: Task Management
public:
// Function: addTask
// Add a new <Task> to the Kernel's list. All tasks MUST have unique
// names.
//
// Parameters:
// task - <TaskPtr> representing instance of <Task> subclass to add.
void addTask(TaskPtr task);
// Function: killTask
// Kill a task in the Kernel task list.
// Dead tasks are removed in next loop through tasks.
//
// Parameters:
// taskName - Name of task to kill.
void killTask(const std::string& taskName);
// Function: pauseTask
// Pause a task in the Kernel task list.
//
// Parameters:
// taskName - Name of task to pause.
void pauseTask(const std::string& taskName);
// Function: unpauseTask
// Unpause a task in the Kernel task list.
//
// Parameters:
// taskName - Name of task to unpause.
void unpauseTask(const std::string& taskName);
// Function: killAllTasks
// Kills all tasks.
// Dead tasks are removed in next loop through tasks.
void killAllTasks();
// data members
private:
//stored list of tasks (stored in order of priority highest to lowest)
std::list<TaskPtr> tasks_;
//predicate for search
class TaskNameEq : public std::binary_function<TaskPtr, std::string, bool>
{
public:
bool operator()(const TaskPtr& lhs, const std::string& rhs) const;
};
};
}
#endif //PHOTON_KERNEL_HPP

152
include/Task.hpp Normal file
View File

@ -0,0 +1,152 @@
//This file is part of Photon (http://photon.sourceforge.net)
//Copyright (C) 2004-2005 James Turk
//
// Author:
// James Turk (jpt2433@rit.edu)
//
// Version:
// $Id: Task.hpp,v 1.1 2005/03/15 19:22:07 cozman Exp $
#ifndef PHOTON_TASK_HPP
#define PHOTON_TASK_HPP
#include <string>
#include "types.hpp"
namespace photon
{
// Title: Task
// Group: Helper Types
class Task;
class Kernel;
// Type: TaskPtr
// Pointer to a task, used since Task is abstract and will always be accessed
// via a pointer.
typedef shared_ptr<Task> TaskPtr;
// Enum: PriorityLevel
// Enumeration defining priority of a Task.
//
// Values:
// PRI_LOWEST - Lowest priority available.
// PRI_LOW - Lower-than-usual priority.
// PRI_NORMAL - Normal priority, suitable for most tasks.
// PRI_HIGH - Lower-than-usual priority.
// PRI_CORE - Priority used by the various cores, between high and highest.
// PRI_HIGHEST - Highest priority available.
enum PriorityLevel
{
PRI_LOWEST,
PRI_LOW,
PRI_NORMAL,
PRI_HIGH,
PRI_CORE,
PRI_HIGHEST
};
// Class: Task
// Abstract class for tasks, which are runnable classes for use with <Kernel>.
//
// When writing a task, only update() needs to be overloaded.
class Task
{
// Group: (Con/De)structors
public:
// Function: Task
// Constructor, every task needs a name and priority.
//
// Parameters:
// name - Name for task, must be unique!
// priority - Optional argument for desired <PriorityLevel> for the Task,
// controls order in which tasks are run by the <Kernel>.
// [default = PRI_NORMAL]
Task(const std::string& name, PriorityLevel priority=PRI_NORMAL);
// Function: ~Task
// Virtual destructor, exists simply to make inheritance safe.
virtual ~Task();
// Group: Control
public:
// Function: update
// Pure virtual, every child task must overload it's own update(), when a
// task is active this is called every 'frame.'
virtual void update()=0;
// Function: onStart
// Virtual function, overload to define behavior when the task is started.
virtual void onStart();
// Function: onKill
// Virtual function, overload to define behavior when the task is killed.
virtual void onKill();
// Function: onPause
// Virtual function, overload to define behavior every time that the
// task is paused.
//
// Note:
// Children of onPause should call Task::onPause to let the task know it's
// been paused.
virtual void onPause();
// Function: onUnpause
// Virtual function, overload to define behavior every time that the
// task is unpaused.
//
// Note:
// Children of onUnpause should call Task::onUnpause to let the task know
// it's been paused.
virtual void onUnpause();
// Function: kill
// Sets state of application to dead, dead tasks remove themselves from
// the Kernel's task pool.
void kill();
// Group: Accessors
public:
// Function: getName
// Get the name of the task.
//
// Return:
// Name of task.
std::string getName() const;
// Function: getPriority
// Get the priority of the task.
//
// Return:
// <PriorityLevel> of task.
PriorityLevel getPriority() const;
// Function: isAlive
// Check if task is alive or not.
//
// Return:
// true if task is alive, false if task has been killed
bool isAlive() const;
// Function: isPaused
// Check if task is paused or not.
//
// Return:
// true iff task is paused
bool isPaused() const;
// data members
private:
std::string name_;
PriorityLevel priority_;
bool alive_;
bool paused_;
};
}
#endif //PHOTON_TASK_HPP

View File

@ -5,7 +5,7 @@
// James Turk (jpt2433@rit.edu) // James Turk (jpt2433@rit.edu)
// //
// Version: // Version:
// $Id: entrypoint.hpp,v 1.3 2005/03/04 13:06:49 cozman Exp $ // $Id: entrypoint.hpp,v 1.4 2005/03/15 19:22:07 cozman Exp $
#ifndef PHOTON_ENTRYPOINT_HPP #ifndef PHOTON_ENTRYPOINT_HPP
@ -22,7 +22,7 @@
which implements main, in the file defining PongGame it is important to which implements main, in the file defining PongGame it is important to
include ENTRYPOINT(PongGame) so that the entry point becomes PongGame::main. include ENTRYPOINT(PongGame) so that the entry point becomes PongGame::main.
*/ */
#define ENTRYPOINT(className) int main(int argc, char *argv[]) \ #define ENTRYPOINT(className) int main(int argc, const char** argv) \
{ return photon::mainclass<className>(argc,argv); } { return photon::mainclass<className>(argc,argv); }
namespace photon namespace photon
@ -30,25 +30,28 @@ namespace photon
// function which does all the work of MAINCLASS // function which does all the work of MAINCLASS
template<class App> template<class App>
int mainclass(int argc, char *argv[]) int mainclass(int argc, const char** argv)
{ {
try try
{ {
App app;
StrVec args; StrVec args;
for(int i=0; i < argc; ++i) for(int i=0; i < argc; ++i)
{
args.push_back(argv[i]); args.push_back(argv[i]);
}
App::setInitOptions(argv[0]); App::setInitOptions(argv[0]);
App app;
return app.main(args); return app.main(args);
} }
catch(photon::Exception &e) catch(Exception &e)
{ {
photon::Log::getInstance().error() << e; Log::getInstance().error() << e;
return 0; return 0;
} }
catch(photon::Error &e) catch(Error &e)
{ {
photon::Log::getInstance().critical() << e; Log::getInstance().critical() << e;
return 1; return 1;
} }
} }

View File

@ -14,7 +14,6 @@
#include "Task.hpp" #include "Task.hpp"
#include "types.hpp" #include "types.hpp"
#include "audio/AudioCore.hpp" #include "audio/AudioCore.hpp"
#include "glfw/types_glfw.hpp"
#include "math/Circle.hpp" #include "math/Circle.hpp"
#include "math/math.hpp" #include "math/math.hpp"
#include "math/Rect.hpp" #include "math/Rect.hpp"

View File

@ -5,18 +5,35 @@
// James Turk (jpt2433@rit.edu) // James Turk (jpt2433@rit.edu)
// //
// Version: // Version:
// $Id: AppCore.cpp,v 1.4 2005/03/04 13:06:49 cozman Exp $ // $Id: AppCore.cpp,v 1.5 2005/03/15 19:22:07 cozman Exp $
#include "AppCore.hpp" #include "AppCore.hpp"
#include <boost/lexical_cast.hpp> #include <boost/lexical_cast.hpp>
#include "glfw.h" //This file depends on glfw #include "glfw.h" //This file depends on glfw
#include "Kernel.hpp"
#include "exceptions.hpp" #include "exceptions.hpp"
namespace photon namespace photon
{ {
AppCore::AppCore() :
dispWidth_(0), dispHeight_(0),
task_(new UpdateTask())
{
util::VersionInfo glfwReq(2,4,2); // requires GLFW 2.4.2
util::ensureVersion("GLFW", initGLFW(), glfwReq);
Kernel::getInstance().addTask(task_);
}
AppCore::~AppCore()
{
glfwCloseWindow(); //close GLFW window
glfwTerminate(); //shutdown GLFW
}
void AppCore::createDisplay(uint width, uint height, void AppCore::createDisplay(uint width, uint height,
uint redBits, uint greenBits, uint blueBits, uint redBits, uint greenBits, uint blueBits,
uint alphaBits, uint depthBits, uint stencilBits, uint alphaBits, uint depthBits, uint stencilBits,
@ -35,8 +52,6 @@ void AppCore::createDisplay(uint width, uint height,
dispHeight_ = height; dispHeight_ = height;
glfwSetWindowTitle(title.c_str()); // title is set separately glfwSetWindowTitle(title.c_str()); // title is set separately
quitRequested_ = false; //now that a window is open, no quit requested
} }
void AppCore::createDisplay(uint width, uint height, uint bpp, void AppCore::createDisplay(uint width, uint height, uint bpp,
@ -81,16 +96,12 @@ bool AppCore::mouseButtonPressed(MouseButton button)
int AppCore::getMouseX() int AppCore::getMouseX()
{ {
int x; return task_->mouseX_;
glfwGetMousePos(&x,0); //only get x
return x;
} }
int AppCore::getMouseY() int AppCore::getMouseY()
{ {
int y; return task_->mouseY_;
glfwGetMousePos(0,&y); //only get y
return y;
} }
int AppCore::getMouseWheelPos() int AppCore::getMouseWheelPos()
@ -100,44 +111,7 @@ int AppCore::getMouseWheelPos()
scalar AppCore::getTime() scalar AppCore::getTime()
{ {
return glfwGetTime() - pausedTime_; return glfwGetTime() - task_->pausedTime_;
}
void AppCore::update()
{
scalar curTime = getTime();
// update the display here instead of VideoCore (since it belongs to glfw)
glfwSwapBuffers();
// keep track of time between frames
secPerFrame_ = curTime-lastUpdate_;
lastUpdate_ = curTime;
// quit on window closing or Alt-F4/Alt-X
if(!glfwGetWindowParam(GLFW_OPENED) ||
( (glfwGetKey(GLFW_KEY_LALT) || glfwGetKey(GLFW_KEY_RALT)) &&
(glfwGetKey(GLFW_KEY_F4) || glfwGetKey('X')) ) )
{
quitRequested_ = true;
}
// hold active-state
active_ = (glfwGetWindowParam(GLFW_ACTIVE) == GL_TRUE);
// automatically pause/unpause app timer on focus
if(!active_ && !timerPaused_)
{
timerPaused_ = true;
lastPause_ = curTime;
unpauseOnActive_ = true;
}
else if(active_ && unpauseOnActive_)
{
timerPaused_ = true;
pausedTime_ += curTime - lastPause_;
unpauseOnActive_ = false;
}
} }
void AppCore::setTitle(const std::string& title) void AppCore::setTitle(const std::string& title)
@ -145,29 +119,19 @@ void AppCore::setTitle(const std::string& title)
glfwSetWindowTitle(title.c_str()); glfwSetWindowTitle(title.c_str());
} }
void AppCore::requestQuit()
{
quitRequested_ = true;
}
bool AppCore::quitRequested()
{
return quitRequested_;
}
bool AppCore::isActive() bool AppCore::isActive()
{ {
return active_; return task_->active_;
} }
double AppCore::getElapsedTime() double AppCore::getElapsedTime()
{ {
return secPerFrame_; return task_->secPerFrame_;
} }
double AppCore::getFramerate() double AppCore::getFramerate()
{ {
return 1/secPerFrame_; return 1/task_->secPerFrame_;
} }
uint AppCore::getDisplayWidth() uint AppCore::getDisplayWidth()
@ -191,21 +155,50 @@ util::VersionInfo AppCore::initGLFW()
return util::VersionInfo(maj,min,patch); return util::VersionInfo(maj,min,patch);
} }
AppCore::AppCore() : AppCore::UpdateTask::UpdateTask() :
dispWidth_(0), dispHeight_(0), Task("AppCore::UpdateTask", PRI_CORE),
quitRequested_(true), active_(false), timerPaused_(false), mouseX_(0), mouseY_(0),
active_(false), timerPaused_(false),
unpauseOnActive_(false), lastPause_(0), pausedTime_(0), unpauseOnActive_(false), lastPause_(0), pausedTime_(0),
secPerFrame_(0), lastUpdate_(0) secPerFrame_(0), lastUpdate_(0)
{ {
util::VersionInfo glfwReq(2,4,2); // requires GLFW 2.4.2
util::ensureVersion("GLFW", initGLFW(), glfwReq);
} }
AppCore::~AppCore() void AppCore::UpdateTask::update()
{ {
glfwCloseWindow(); //close GLFW window scalar curTime = glfwGetTime() - pausedTime_;
glfwTerminate(); //shutdown GLFW
// update the display here instead of VideoCore (since it belongs to glfw)
glfwSwapBuffers();
// keep track of time between frames
secPerFrame_ = curTime-lastUpdate_;
lastUpdate_ = curTime;
// quit on window closing or Alt-F4/Alt-X
if(!glfwGetWindowParam(GLFW_OPENED) ||
( (glfwGetKey(GLFW_KEY_LALT) || glfwGetKey(GLFW_KEY_RALT)) &&
(glfwGetKey(GLFW_KEY_F4) || glfwGetKey('X')) ) )
{
Kernel::getInstance().killAllTasks();
}
// hold active-state
active_ = (glfwGetWindowParam(GLFW_ACTIVE) == GL_TRUE);
// automatically pause/unpause app timer on focus
if(!active_ && !timerPaused_)
{
timerPaused_ = true;
lastPause_ = curTime;
unpauseOnActive_ = true;
}
else if(active_ && unpauseOnActive_)
{
timerPaused_ = true;
pausedTime_ += curTime - lastPause_;
unpauseOnActive_ = false;
}
} }
} }

View File

@ -5,15 +5,20 @@
// James Turk (jpt2433@rit.edu) // James Turk (jpt2433@rit.edu)
// //
// Version: // Version:
// $Id: Application.cpp,v 1.5 2005/02/27 07:43:37 cozman Exp $ // $Id: Application.cpp,v 1.6 2005/03/15 19:22:07 cozman Exp $
#include "Application.hpp" #include "Application.hpp"
#include "exceptions.hpp"
#include "physfs.h" #include "physfs.h"
#include "gl/gl.h"
#include <sstream> #include <boost/lexical_cast.hpp>
#include "exceptions.hpp"
#include "Log.hpp"
#include "Kernel.hpp"
#include "AppCore.hpp"
#include "video/VideoCore.hpp"
namespace photon namespace photon
{ {
@ -23,12 +28,36 @@ Application::Application() :
{ {
util::VersionInfo physfsReq(1,0,0); // requires PhysFS 1.0.0 util::VersionInfo physfsReq(1,0,0); // requires PhysFS 1.0.0
// create the singletons
new Log;
new Kernel;
new AppCore;
new video::VideoCore;
// StrVec args;
//
// for(int i=0; i < argc; ++i)
// {
// args.push_back(argv[i]);
// }
util::ensureVersion("PhysFS", initPhysFS(arg0_.c_str()), physfsReq); util::ensureVersion("PhysFS", initPhysFS(arg0_.c_str()), physfsReq);
} }
Application::~Application() Application::~Application()
{ {
PHYSFS_deinit(); //shutdown PhysFS PHYSFS_deinit(); //shutdown PhysFS
// destroy the singletons
AppCore::destroy();
video::VideoCore::destroy();
Kernel::destroy();
Log::destroy();
}
void Application::setInitOptions(const char* arg0)
{
arg0_ = arg0;
} }
util::VersionInfo Application::initPhysFS(const char* arg0) util::VersionInfo Application::initPhysFS(const char* arg0)
@ -40,11 +69,6 @@ util::VersionInfo Application::initPhysFS(const char* arg0)
return util::VersionInfo(ver.major, ver.minor, ver.patch); return util::VersionInfo(ver.major, ver.minor, ver.patch);
} }
void Application::setInitOptions(const char* appPath) std::string Application::arg0_;
{
arg0_ = appPath;
}
std::string Application::arg0_; //static initializer
} }

155
src/Kernel.cpp Normal file
View File

@ -0,0 +1,155 @@
//This file is part of Photon (http://photon.sourceforge.net)
//Copyright (C) 2004-2005 James Turk
//
// Author:
// James Turk (jpt2433@rit.edu)
//
// Version:
// $Id: Kernel.cpp,v 1.1 2005/03/15 19:22:07 cozman Exp $
#include "Kernel.hpp"
#include "exceptions.hpp"
#include "Log.hpp"
namespace photon
{
Kernel::Kernel()
{
}
Kernel::~Kernel()
{
}
void Kernel::run()
{
// loop on activeTasks
while(!tasks_.empty())
{
std::list<TaskPtr>::iterator it;
// loop through active tasks, updating each one
for(it = tasks_.begin(); it != tasks_.end(); ++it)
{
TaskPtr& task(*it);
// only update alive, non-paused tasks
if(task->isAlive() && !task->isPaused())
{
// Log::getInstance().note() << "updating task : " << task->getName();
task->update();
}
}
// loop through tasks, removing any dead tasks
for(it = tasks_.begin(); it != tasks_.end(); )
{
TaskPtr& task(*it);
// remove dead tasks
if(!task->isAlive())
{
task->onKill();
it = tasks_.erase(it);
}
else
{
++it; //advance iterator, if not deleting
}
}
}
}
void Kernel::addTask(TaskPtr task)
{
std::list<TaskPtr>::iterator it = tasks_.begin();
std::list<TaskPtr>::iterator found = std::find_if(tasks_.begin(),
tasks_.end(),
std::bind2nd(TaskNameEq(), task->getName()) );
// if found task (meaning task w/ same name exists) throw exception
if(found != tasks_.end())
{
throw PreconditionException("Attempted to add duplicate task \"" +
task->getName() + "\".");
}
task->onStart();
// find the first task in the list with a lower priority
while(it != tasks_.end() && task->getPriority() <= (*it)->getPriority())
{
++it;
}
tasks_.insert(it, task); // insert task after iterator
}
void Kernel::killTask(const std::string& taskName)
{
std::list<TaskPtr>::iterator task = std::find_if(tasks_.begin(),
tasks_.end(),
std::bind2nd(TaskNameEq(), taskName) );
if(task != tasks_.end())
{
(*task)->kill();
}
else
{
throw PreconditionException("Attempted to kill nonexistant task \"" +
taskName + "\".");
}
}
void Kernel::pauseTask(const std::string& taskName)
{
std::list<TaskPtr>::iterator task = std::find_if(tasks_.begin(),
tasks_.end(),
std::bind2nd(TaskNameEq(), taskName) );
if(task != tasks_.end())
{
(*task)->onPause();
}
else
{
throw PreconditionException("Attempted to pause nonexistant task \"" +
taskName + "\".");
}
}
void Kernel::unpauseTask(const std::string& taskName)
{
std::list<TaskPtr>::iterator task = std::find_if(tasks_.begin(),
tasks_.end(),
std::bind2nd(TaskNameEq(), taskName) );
if(task != tasks_.end())
{
(*task)->onUnpause();
}
else
{
throw PreconditionException("Attempted to unpause nonexistant task \"" +
taskName + "\".");
}
}
void Kernel::killAllTasks()
{
// set all tasks to dead
for(std::list<TaskPtr>::iterator it = tasks_.begin();
it != tasks_.end();
++it)
{
(*it)->kill();
}
}
bool Kernel::TaskNameEq::operator()(const TaskPtr& lhs,
const std::string& rhs) const
{
return lhs->getName() == rhs;
}
}

62
src/Task.cpp Normal file
View File

@ -0,0 +1,62 @@
//This file is part of Photon (http://photon.sourceforge.net)
//Copyright (C) 2004-2005 James Turk
//
// Author:
// James Turk (jpt2433@rit.edu)
//
// Version:
// $Id: Task.cpp,v 1.1 2005/03/15 19:22:07 cozman Exp $
#include "Task.hpp"
namespace photon
{
Task::Task(const std::string& name, PriorityLevel priority) :
name_(name), priority_(priority), alive_(true), paused_(false)
{
}
// do nothing (how I wish destructors were virtual by default)
Task::~Task() { }
// do nothings (non-pure since some tasks may not need special behavior)
void Task::onStart() { }
void Task::onKill() { }
void Task::onPause()
{
paused_ = true;
}
void Task::onUnpause()
{
paused_ = false;
}
void Task::kill()
{
alive_ = false;
}
std::string Task::getName() const
{
return name_;
}
PriorityLevel Task::getPriority() const
{
return priority_;
}
bool Task::isAlive() const
{
return alive_;
}
bool Task::isPaused() const
{
return paused_;
}
}

View File

@ -1,10 +1,10 @@
$Id: todo.txt,v 1.3 2005/02/27 09:05:54 cozman Exp $ $Id: todo.txt,v 1.4 2005/03/15 19:22:07 cozman Exp $
next: next:
be nova-photon-complete be nova-photon-complete
week:
-be ZEngine-feature complete
month: month:
-be ZEngine-feature complete
quarter:
-experimental python bindings -experimental python bindings
-documentation -documentation