State system reimplemented, overhaul of much of Core/Kernel/Task arch
This commit is contained in:
parent
84e61a622d
commit
0b64a143b4
@ -1,37 +1,38 @@
|
|||||||
Changelog for Photon
|
Changelog for Photon
|
||||||
$Id: CHANGELOG.txt,v 1.2 2005/07/19 18:35:20 cozman Exp $
|
$Id: CHANGELOG.txt,v 1.3 2005/08/07 07:12:46 cozman Exp $
|
||||||
|
|
||||||
|
|
||||||
0.1.0 (Massachusetts) - Initial Release
|
0.0.1
|
||||||
* Kernel/Task design that allows easy creation of graphical
|
+ State-based design that allows easy creation of applications by simply
|
||||||
games/applications without sacrificing control
|
deriving from a basic 'State' class.
|
||||||
* Extensive Log system that allows full control over logging including
|
+ Kernel/Task system allowing full control over game loop.
|
||||||
|
+ Extensive Log system that allows full control over logging including
|
||||||
various log levels and three built in forms of output, with the ability
|
various log levels and three built in forms of output, with the ability
|
||||||
to add custom output formats.
|
to add custom output formats.
|
||||||
* A wide variety of helper utilities for tasks such as filesystem
|
+ A wide variety of helper utilities for tasks such as filesystem
|
||||||
navigation, FileBuffer capable of reading from archives, random number
|
navigation, FileBuffer capable of reading from archives, random number
|
||||||
generation, versioning, and timing
|
generation, versioning, and timing
|
||||||
* Powerful input system allowing for direct access to keyboard/mouse status
|
+ Powerful input system allowing for direct access to keyboard/mouse status
|
||||||
or passive listeners which are notified of events when they occur.
|
or passive listeners which are notified of events when they occur.
|
||||||
* Resource Management system including the ability to load resources from
|
+ Resource Management system including the ability to load resources from
|
||||||
specified directories or archives.
|
specified directories or archives.
|
||||||
* Variety of math classes including Circle, Rectangle, and Vector classes
|
+ Variety of math classes including Circle, Rectangle, and Vector classes
|
||||||
convinient for game use
|
convinient for game use
|
||||||
* ConfigFile class for reading/writing INI-style files for game settings
|
+ ConfigFile class for reading/writing INI-style files for game settings
|
||||||
* OpenGL management including ability to set video mode, and easy management
|
+ OpenGL management including ability to set video mode, and easy management
|
||||||
of multiple viewports
|
of multiple viewports
|
||||||
* Resource-managed Texture class allowing for loading of textures for use in
|
+ Resource-managed Texture class allowing for loading of textures for use in
|
||||||
OpenGL
|
OpenGL
|
||||||
* Image class that extends Texture class, allowing for hardware accellerated
|
+ Image class that extends Texture class, allowing for hardware accellerated
|
||||||
drawing, rotation, scaling, and blending of images for use in 2D
|
drawing, rotation, scaling, and blending of images for use in 2D
|
||||||
environments
|
environments
|
||||||
* Resource-managed Font class allowing for the rendering of text using
|
+ Resource-managed Font class allowing for the rendering of text using
|
||||||
TrueType fonts
|
TrueType fonts
|
||||||
* Primitive-drawing ‘Pen’ class allowing for drawing of various geometric
|
+ Primitive-drawing ‘Pen’ class allowing for drawing of various geometric
|
||||||
shapes, lines, and vectors.
|
shapes, lines, and vectors.
|
||||||
* OpenAL based sound system*
|
+ OpenAL based sound system*
|
||||||
* Entire library is built in a highly-modular fashion with extensibility in
|
+ Entire library is built in a highly-modular fashion with extensibility in
|
||||||
mind. Use of modern programming techniques like templates and exceptions
|
mind. Use of modern programming techniques like templates and exceptions
|
||||||
contributes to ease of use and ease of development.
|
contributes to ease of use and ease of development.
|
||||||
* 13 demo programs showing features and ease of use of various components.
|
+ 12 demo programs showing features and ease of use of various components.
|
||||||
|
|
||||||
|
8
IFAQ.txt
8
IFAQ.txt
@ -1,5 +1,5 @@
|
|||||||
IfAQ (Infrequently Asked Questions)
|
IfAQ (Infrequently Asked Questions)
|
||||||
$Id: IFAQ.txt,v 1.1 2005/07/17 22:41:03 cozman Exp $
|
$Id: IFAQ.txt,v 1.2 2005/08/07 07:12:46 cozman Exp $
|
||||||
|
|
||||||
--basic questions--
|
--basic questions--
|
||||||
|
|
||||||
@ -70,6 +70,12 @@ Q. Does Photon use proprietary libraries like DirectX?
|
|||||||
A. Photon only uses free open source libraries, so that by using Photon you are
|
A. Photon only uses free open source libraries, so that by using Photon you are
|
||||||
not subjected to any proprietary licensing terms.
|
not subjected to any proprietary licensing terms.
|
||||||
|
|
||||||
|
Q. When will features X, Y, and Z be completed?
|
||||||
|
A. When I get to them, I can only work on Photon in my spare time, if you have a
|
||||||
|
specific request let me know and I can give you an estimate of when I plan
|
||||||
|
on getting to it. There's always the option that you help out and then the
|
||||||
|
feature will be added sooner rather than later.
|
||||||
|
|
||||||
Q. What if I have something to add?
|
Q. What if I have something to add?
|
||||||
A. Feel free to contribute to Photon, bugfixes are greatly appreciated. Not
|
A. Feel free to contribute to Photon, bugfixes are greatly appreciated. Not
|
||||||
all submitted features can be accepted, but I'll usually at least add a
|
all submitted features can be accepted, but I'll usually at least add a
|
||||||
|
@ -1,256 +1 @@
|
|||||||
//This file is part of Photon (http://photon.sourceforge.net)
|
|
||||||
//Copyright (C) 2004-2005 James Turk
|
|
||||||
//
|
|
||||||
// Author:
|
|
||||||
// James Turk (jpt2433@rit.edu)
|
|
||||||
//
|
|
||||||
// Version:
|
|
||||||
// $Id: AppCore.hpp,v 1.9 2005/08/02 23:07:51 cozman Exp $
|
|
||||||
|
|
||||||
#ifndef PHOTON_APPCORE_HPP
|
|
||||||
#define PHOTON_APPCORE_HPP
|
|
||||||
|
|
||||||
#include "types.hpp"
|
|
||||||
#include "util/VersionInfo.hpp"
|
|
||||||
#include "Task.hpp"
|
|
||||||
#include "InputListener.hpp"
|
|
||||||
|
|
||||||
#include <vector>
|
|
||||||
|
|
||||||
namespace photon
|
|
||||||
{
|
|
||||||
|
|
||||||
// Class: AppCore
|
|
||||||
// Photon's core for application behavior. Defines the interface through which
|
|
||||||
// all "application" related functions are performed. This means input,
|
|
||||||
// display creation, etc.
|
|
||||||
//
|
|
||||||
// AppCore is the Core that essentially represents the window management,
|
|
||||||
// input, and timing systems.
|
|
||||||
class AppCore
|
|
||||||
{
|
|
||||||
|
|
||||||
public:
|
|
||||||
AppCore();
|
|
||||||
~AppCore();
|
|
||||||
|
|
||||||
void init();
|
|
||||||
void shutdown();
|
|
||||||
|
|
||||||
// Group: Video
|
|
||||||
public:
|
|
||||||
|
|
||||||
// Function: createDisplay
|
|
||||||
// This function attempts to create a display with the given parameters.
|
|
||||||
//
|
|
||||||
// Parameters:
|
|
||||||
// width - desired width of display
|
|
||||||
// height - desired height of display
|
|
||||||
// redBits - desired bits per pixel for red value
|
|
||||||
// greenBits - desired bits per pixel for green value
|
|
||||||
// blueBits - desired bits per pixel for blue value
|
|
||||||
// alphaBits - desired bits per pixel for alpha value
|
|
||||||
// depthBits - desired bitdepth of depth buffer
|
|
||||||
// stencilBits - desired bitdepth of stencil buffer
|
|
||||||
// fullscreen - true: fullscreen, false: windowed
|
|
||||||
// [title - title of application, optional]
|
|
||||||
void createDisplay(uint width, uint height,
|
|
||||||
uint redBits, uint greenBits, uint blueBits,
|
|
||||||
uint alphaBits, uint depthBits, uint stencilBits,
|
|
||||||
bool fullscreen, const std::string& title="Photon App");
|
|
||||||
|
|
||||||
// Function: createDisplay
|
|
||||||
// This function attempts to create a display with the given parameters.
|
|
||||||
//
|
|
||||||
// Parameters:
|
|
||||||
// width - desired width of display
|
|
||||||
// height - desired height of display
|
|
||||||
// bpp - desired bits per pixel (aka bitdepth) of display
|
|
||||||
// depthBits - desired bitdepth of depth buffer
|
|
||||||
// stencilBits - desired bitdepth of stencil buffer
|
|
||||||
// fullscreen - true: fullscreen, false: windowed
|
|
||||||
// [title - title of application, optional]
|
|
||||||
void createDisplay(uint width, uint height, uint bpp,
|
|
||||||
uint depthBits, uint stencilBits, bool fullscreen,
|
|
||||||
const std::string& title="Photon App");
|
|
||||||
|
|
||||||
// Group: Input
|
|
||||||
public:
|
|
||||||
|
|
||||||
// Function: keyPressed
|
|
||||||
// Check if a given key is currently pressed.
|
|
||||||
//
|
|
||||||
// Parameters:
|
|
||||||
// key - <KeyCode> of key to determine status of.
|
|
||||||
//
|
|
||||||
// Returns:
|
|
||||||
// true: key is pressed, false: key isn't pressed
|
|
||||||
bool keyPressed(KeyCode key);
|
|
||||||
|
|
||||||
// Function: getPressedKeys
|
|
||||||
// Obtain a list of all keys which are currently pressed.
|
|
||||||
//
|
|
||||||
// Returns:
|
|
||||||
// std::vector of <KeyCodes> of any pressed keys.
|
|
||||||
std::vector<KeyCode> getPressedKeys();
|
|
||||||
|
|
||||||
// Function: mouseButtonPressed
|
|
||||||
// Check if a given mouse button is currently pressed.
|
|
||||||
//
|
|
||||||
// Parameters:
|
|
||||||
// button - <MouseButton> to determine status of.
|
|
||||||
//
|
|
||||||
// Returns:
|
|
||||||
// true: button is pressed, false: button isn't pressed
|
|
||||||
bool mouseButtonPressed(MouseButton button);
|
|
||||||
|
|
||||||
// Function: getMouseX
|
|
||||||
// Gets current x location of mouse with respect to screen coordinates.
|
|
||||||
//
|
|
||||||
// Returns:
|
|
||||||
// Mouse x-coordinate, with respect to screen coordinates.
|
|
||||||
int getMouseX();
|
|
||||||
|
|
||||||
// Function: getMouseY
|
|
||||||
// Gets current y location of mouse with respect to screen coordinates.
|
|
||||||
//
|
|
||||||
// Returns:
|
|
||||||
// Mouse y-coordinate, with respect to screen coordinates.
|
|
||||||
int getMouseY();
|
|
||||||
|
|
||||||
// Function: getMouseWheelPos
|
|
||||||
// Gets current location of mouse wheel, treated as if wheel describes a
|
|
||||||
// third axis of movement for the mouse.
|
|
||||||
//
|
|
||||||
// Returns:
|
|
||||||
// Mouse wheel position, zero assumed to be starting position.
|
|
||||||
int getMouseWheelPos();
|
|
||||||
|
|
||||||
// Group: Input Listeners
|
|
||||||
public:
|
|
||||||
|
|
||||||
// Function: addInputListener
|
|
||||||
// Registers an <InputListener> to listen for any input events so that it
|
|
||||||
// is notified when they occur.
|
|
||||||
//
|
|
||||||
// Parameters:
|
|
||||||
// listener - Pointer to <InputListener> to add.
|
|
||||||
static void addInputListener(InputListener *listener);
|
|
||||||
|
|
||||||
// Function: removeInputListener
|
|
||||||
// Removes an <InputListener> from the list of active listeners.
|
|
||||||
//
|
|
||||||
// Parameters:
|
|
||||||
// listener - Pointer to <InputListener> to remove.
|
|
||||||
static void removeInputListener(InputListener *listener);
|
|
||||||
|
|
||||||
static void GLFWCALL keyCallback(int key, int action);
|
|
||||||
//static void GLFWCALL charCallback(int character, int action);
|
|
||||||
static void GLFWCALL mouseButtonCallback(int button, int action);
|
|
||||||
static void GLFWCALL mouseMoveCallback(int x, int y);
|
|
||||||
//static void GLFWCALL mouseWheelCallback(int pos);
|
|
||||||
|
|
||||||
// Group: Timing
|
|
||||||
public:
|
|
||||||
|
|
||||||
// Function: getTime
|
|
||||||
// Get time, in seconds, that application has been running.
|
|
||||||
//
|
|
||||||
// Returns:
|
|
||||||
// Time, represented as a floating-point number in seconds, application has
|
|
||||||
// been running.
|
|
||||||
scalar getTime();
|
|
||||||
|
|
||||||
// Group: General
|
|
||||||
public:
|
|
||||||
|
|
||||||
// Function: setTitle
|
|
||||||
// Sets title of application that shows up in title bar.
|
|
||||||
//
|
|
||||||
// Parameters:
|
|
||||||
// title - New title of application.
|
|
||||||
void setTitle(const std::string& title);
|
|
||||||
|
|
||||||
// Function: isActive
|
|
||||||
// Checks if application is active, which on most systems simply means it
|
|
||||||
// has focus.
|
|
||||||
//
|
|
||||||
// Returns:
|
|
||||||
// True if application is active, false otherwise.
|
|
||||||
bool isActive();
|
|
||||||
|
|
||||||
// Function: getElapsedTime
|
|
||||||
// Finds the amount of time passed between frames, useful for time-based
|
|
||||||
// movement.
|
|
||||||
//
|
|
||||||
// Returns:
|
|
||||||
// Time between current frame and last frame. (1/<getFramerate>())
|
|
||||||
double getElapsedTime();
|
|
||||||
|
|
||||||
// Function: getFramerate
|
|
||||||
// Gets number of frames per second the application is currently processing
|
|
||||||
//
|
|
||||||
// Returns:
|
|
||||||
// Current frames per second.
|
|
||||||
double getFramerate();
|
|
||||||
|
|
||||||
// Group: Accessors
|
|
||||||
public:
|
|
||||||
// Function: getDisplayWidth
|
|
||||||
// Get the width of the display.
|
|
||||||
//
|
|
||||||
// Returns:
|
|
||||||
// Width of display in pixels.
|
|
||||||
uint getDisplayWidth();
|
|
||||||
|
|
||||||
// Function: getDisplayHeight
|
|
||||||
// Get the height of the display.
|
|
||||||
//
|
|
||||||
// Returns:
|
|
||||||
// Height of display in pixels.
|
|
||||||
uint getDisplayHeight();
|
|
||||||
|
|
||||||
|
|
||||||
// UpdateTask, does the updating work of AppCore, registered as a Task
|
|
||||||
// so that user need not call something akin to AppCore::update() every
|
|
||||||
// frame
|
|
||||||
class UpdateTask : public Task
|
|
||||||
{
|
|
||||||
|
|
||||||
friend class AppCore;
|
|
||||||
|
|
||||||
public:
|
|
||||||
UpdateTask();
|
|
||||||
|
|
||||||
void update();
|
|
||||||
|
|
||||||
private:
|
|
||||||
int mouseX_;
|
|
||||||
int mouseY_;
|
|
||||||
bool active_;
|
|
||||||
bool timerPaused_;
|
|
||||||
bool unpauseOnActive_;
|
|
||||||
scalar lastPause_;
|
|
||||||
scalar pausedTime_;
|
|
||||||
scalar secPerFrame_;
|
|
||||||
scalar lastUpdate_;
|
|
||||||
};
|
|
||||||
|
|
||||||
// data members
|
|
||||||
private:
|
|
||||||
uint dispWidth_;
|
|
||||||
uint dispHeight_;
|
|
||||||
shared_ptr<UpdateTask> task_;
|
|
||||||
|
|
||||||
// input monitoring variables
|
|
||||||
static std::vector<InputListener*> listeners_;
|
|
||||||
static std::vector<KeyCode> pressedKeys_;
|
|
||||||
|
|
||||||
// API initialization
|
|
||||||
private:
|
|
||||||
util::VersionInfo initGLFW();
|
|
||||||
};
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif //PHOTON_APPCORE_HPP
|
|
||||||
|
@ -5,12 +5,13 @@
|
|||||||
// James Turk (jpt2433@rit.edu)
|
// James Turk (jpt2433@rit.edu)
|
||||||
//
|
//
|
||||||
// Version:
|
// Version:
|
||||||
// $Id: Application.hpp,v 1.10 2005/08/02 23:07:51 cozman Exp $
|
// $Id: Application.hpp,v 1.11 2005/08/07 07:12:46 cozman Exp $
|
||||||
|
|
||||||
#ifndef PHOTON_APPLICATION_HPP
|
#ifndef PHOTON_APPLICATION_HPP
|
||||||
#define PHOTON_APPLICATION_HPP
|
#define PHOTON_APPLICATION_HPP
|
||||||
|
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
#include <map>
|
||||||
#include <string>
|
#include <string>
|
||||||
|
|
||||||
#include <boost/utility.hpp>
|
#include <boost/utility.hpp>
|
||||||
@ -19,77 +20,368 @@
|
|||||||
#include "util/VersionInfo.hpp"
|
#include "util/VersionInfo.hpp"
|
||||||
#include "Task.hpp"
|
#include "Task.hpp"
|
||||||
#include "Kernel.hpp"
|
#include "Kernel.hpp"
|
||||||
#include "AppCore.hpp"
|
#include "InputListener.hpp"
|
||||||
#include "video/VideoCore.hpp"
|
#include "video/VideoCore.hpp"
|
||||||
#include "audio/AudioCore.hpp"
|
#include "audio/AudioCore.hpp"
|
||||||
|
#include "util/Singleton.hpp"
|
||||||
|
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
namespace photon
|
namespace photon
|
||||||
{
|
{
|
||||||
|
|
||||||
|
class State
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
State() { };
|
||||||
|
virtual ~State() { };
|
||||||
|
|
||||||
|
public:
|
||||||
|
virtual void enterState() { };
|
||||||
|
virtual void exitState() { };
|
||||||
|
|
||||||
|
public:
|
||||||
|
virtual void update()=0;
|
||||||
|
virtual void render()=0;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// Class: Application
|
// Class: Application
|
||||||
// Abstract main class, all photon applications should derive from Application.
|
// Abstract main class, all photon applications should derive from Application.
|
||||||
//
|
//
|
||||||
// Derived classes are made entrypoint via <ENTRYPOINT>.
|
// Derived classes are made entrypoint via <ENTRYPOINT>.
|
||||||
class Application
|
class Application : public util::Singleton<Application>
|
||||||
{
|
{
|
||||||
|
|
||||||
// Group: (Con/De)structors
|
// Group: (Con/De)structors
|
||||||
public:
|
public:
|
||||||
// Function: Application
|
// Function: Application
|
||||||
// Default constructor, initializes the internal state & dependencies.
|
// Default constructor, initializes the internal state & dependencies.
|
||||||
Application();
|
Application(const std::string& arg0);
|
||||||
|
|
||||||
// Function: ~Application
|
// Function: ~Application
|
||||||
// Default destructor, shuts down dependencies.
|
// Default destructor, shuts down dependencies.
|
||||||
virtual ~Application();
|
virtual ~Application();
|
||||||
|
|
||||||
// Group: Main
|
// Group: Video
|
||||||
public:
|
public:
|
||||||
// Function: main
|
|
||||||
// Pure virtual, must be defined by derived class, using some preprocessor
|
// Function: createDisplay
|
||||||
// magic (<MAINCLASS>) on the derived class
|
// This function attempts to create a display with the given parameters.
|
||||||
// this becomes the entry point for a Photon application.
|
|
||||||
//
|
//
|
||||||
// Parameters:
|
// Parameters:
|
||||||
// args - <ArgList> containing arguments passed to program.
|
// width - desired width of display
|
||||||
|
// height - desired height of display
|
||||||
|
// redBits - desired bits per pixel for red value
|
||||||
|
// greenBits - desired bits per pixel for green value
|
||||||
|
// blueBits - desired bits per pixel for blue value
|
||||||
|
// alphaBits - desired bits per pixel for alpha value
|
||||||
|
// depthBits - desired bitdepth of depth buffer
|
||||||
|
// stencilBits - desired bitdepth of stencil buffer
|
||||||
|
// fullscreen - true: fullscreen, false: windowed
|
||||||
|
// [title - title of application, optional]
|
||||||
|
void createDisplay(uint width, uint height,
|
||||||
|
uint redBits, uint greenBits, uint blueBits,
|
||||||
|
uint alphaBits, uint depthBits, uint stencilBits,
|
||||||
|
bool fullscreen, const std::string& title="Photon App");
|
||||||
|
|
||||||
|
// Function: createDisplay
|
||||||
|
// This function attempts to create a display with the given parameters.
|
||||||
//
|
//
|
||||||
// Returns: 0 upon success, other upon failure.
|
// Parameters:
|
||||||
// (Same as main in Standard C/C++).
|
// width - desired width of display
|
||||||
|
// height - desired height of display
|
||||||
|
// bpp - desired bits per pixel (aka bitdepth) of display
|
||||||
|
// depthBits - desired bitdepth of depth buffer
|
||||||
|
// stencilBits - desired bitdepth of stencil buffer
|
||||||
|
// fullscreen - true: fullscreen, false: windowed
|
||||||
|
// [title - title of application, optional]
|
||||||
|
void createDisplay(uint width, uint height, uint bpp,
|
||||||
|
uint depthBits, uint stencilBits, bool fullscreen,
|
||||||
|
const std::string& title="Photon App");
|
||||||
|
|
||||||
|
// Group: Input
|
||||||
|
public:
|
||||||
|
|
||||||
|
// Function: keyPressed
|
||||||
|
// Check if a given key is currently pressed.
|
||||||
//
|
//
|
||||||
// See Also:
|
// Parameters:
|
||||||
// <ENTRYPOINT>
|
// key - <KeyCode> of key to determine status of.
|
||||||
virtual int main(const StrVec& args)=0;
|
//
|
||||||
|
// Returns:
|
||||||
|
// true: key is pressed, false: key isn't pressed
|
||||||
|
bool keyPressed(KeyCode key);
|
||||||
|
|
||||||
|
// Function: getPressedKeys
|
||||||
|
// Obtain a list of all keys which are currently pressed.
|
||||||
|
//
|
||||||
|
// Returns:
|
||||||
|
// std::vector of <KeyCodes> of any pressed keys.
|
||||||
|
std::vector<KeyCode> getPressedKeys();
|
||||||
|
|
||||||
|
// Function: mouseButtonPressed
|
||||||
|
// Check if a given mouse button is currently pressed.
|
||||||
|
//
|
||||||
|
// Parameters:
|
||||||
|
// button - <MouseButton> to determine status of.
|
||||||
|
//
|
||||||
|
// Returns:
|
||||||
|
// true: button is pressed, false: button isn't pressed
|
||||||
|
bool mouseButtonPressed(MouseButton button);
|
||||||
|
|
||||||
|
// Function: getMouseX
|
||||||
|
// Gets current x location of mouse with respect to screen coordinates.
|
||||||
|
//
|
||||||
|
// Returns:
|
||||||
|
// Mouse x-coordinate, with respect to screen coordinates.
|
||||||
|
int getMouseX();
|
||||||
|
|
||||||
|
// Function: getMouseY
|
||||||
|
// Gets current y location of mouse with respect to screen coordinates.
|
||||||
|
//
|
||||||
|
// Returns:
|
||||||
|
// Mouse y-coordinate, with respect to screen coordinates.
|
||||||
|
int getMouseY();
|
||||||
|
|
||||||
|
// Function: getMouseWheelPos
|
||||||
|
// Gets current location of mouse wheel, treated as if wheel describes a
|
||||||
|
// third axis of movement for the mouse.
|
||||||
|
//
|
||||||
|
// Returns:
|
||||||
|
// Mouse wheel position, zero assumed to be starting position.
|
||||||
|
int getMouseWheelPos();
|
||||||
|
|
||||||
|
// Group: Input Listeners
|
||||||
|
public:
|
||||||
|
|
||||||
|
// Function: addInputListener
|
||||||
|
// Registers an <InputListener> to listen for any input events so that it
|
||||||
|
// is notified when they occur.
|
||||||
|
//
|
||||||
|
// Parameters:
|
||||||
|
// listener - Pointer to <InputListener> to add.
|
||||||
|
static void addInputListener(InputListener *listener);
|
||||||
|
|
||||||
|
// Function: removeInputListener
|
||||||
|
// Removes an <InputListener> from the list of active listeners.
|
||||||
|
//
|
||||||
|
// Parameters:
|
||||||
|
// listener - Pointer to <InputListener> to remove.
|
||||||
|
static void removeInputListener(InputListener *listener);
|
||||||
|
|
||||||
|
static void GLFWCALL keyCallback(int key, int action);
|
||||||
|
//static void GLFWCALL charCallback(int character, int action);
|
||||||
|
static void GLFWCALL mouseButtonCallback(int button, int action);
|
||||||
|
static void GLFWCALL mouseMoveCallback(int x, int y);
|
||||||
|
//static void GLFWCALL mouseWheelCallback(int pos);
|
||||||
|
|
||||||
|
// Group: Timing
|
||||||
|
public:
|
||||||
|
|
||||||
|
// Function: getTime
|
||||||
|
// Get time, in seconds, that application has been running.
|
||||||
|
//
|
||||||
|
// Returns:
|
||||||
|
// Time, represented as a floating-point number in seconds, application has
|
||||||
|
// been running.
|
||||||
|
scalar getTime();
|
||||||
|
|
||||||
|
// Group: General
|
||||||
|
public:
|
||||||
|
|
||||||
|
// Function: setTitle
|
||||||
|
// Sets title of application that shows up in title bar.
|
||||||
|
//
|
||||||
|
// Parameters:
|
||||||
|
// title - New title of application.
|
||||||
|
void setTitle(const std::string& title);
|
||||||
|
|
||||||
|
// Function: isActive
|
||||||
|
// Checks if application is active, which on most systems simply means it
|
||||||
|
// has focus.
|
||||||
|
//
|
||||||
|
// Returns:
|
||||||
|
// True if application is active, false otherwise.
|
||||||
|
bool isActive();
|
||||||
|
|
||||||
|
// Function: isRunning
|
||||||
|
// Checks if application is running, which means that no quit has been
|
||||||
|
// requested.
|
||||||
|
//
|
||||||
|
// Returns:
|
||||||
|
// True if application is running, false otherwise.
|
||||||
|
bool isRunning();
|
||||||
|
|
||||||
|
// Function: getElapsedTime
|
||||||
|
// Finds the amount of time passed between frames, useful for time-based
|
||||||
|
// movement.
|
||||||
|
//
|
||||||
|
// Returns:
|
||||||
|
// Time between current frame and last frame. (1/<getFramerate>())
|
||||||
|
double getElapsedTime();
|
||||||
|
|
||||||
|
// Function: getFramerate
|
||||||
|
// Gets number of frames per second the application is currently processing
|
||||||
|
//
|
||||||
|
// Returns:
|
||||||
|
// Current frames per second.
|
||||||
|
double getFramerate();
|
||||||
|
|
||||||
|
// Group: State Management
|
||||||
|
public:
|
||||||
|
// Function: registerState
|
||||||
|
// Register a new <State> type.
|
||||||
|
//
|
||||||
|
// Arguments:
|
||||||
|
// stateName - Name of new <State>.
|
||||||
|
//
|
||||||
|
// Template Parameters:
|
||||||
|
// StateT - Class derived from <State> to register.
|
||||||
|
template<class StateT>
|
||||||
|
void registerState(const std::string& stateName);
|
||||||
|
|
||||||
|
// TODO: why would someone want to unregister a state?
|
||||||
|
|
||||||
|
// Function: unregisterState
|
||||||
|
// Unregister a registered <State> type.
|
||||||
|
//
|
||||||
|
// Arguments:
|
||||||
|
// stateName - Name of <State> to unregister.
|
||||||
|
void unregisterState(const std::string& stateName);
|
||||||
|
|
||||||
|
// Function: setCurrentState
|
||||||
|
// Set the current Application <State>.
|
||||||
|
//
|
||||||
|
// Arguments:
|
||||||
|
// stateName - Name of <State> to make active
|
||||||
|
void setCurrentState(const std::string& stateName);
|
||||||
|
|
||||||
// Group: Core Access
|
// Group: Core Access
|
||||||
public:
|
public:
|
||||||
static Kernel& getKernel();
|
video::VideoCore& getVideoCore();
|
||||||
static AppCore& getAppCore();
|
audio::AudioCore& getAudioCore();
|
||||||
static video::VideoCore& getVideoCore();
|
void initVideoCore(uint width, uint height);
|
||||||
static audio::AudioCore& getAudioCore();
|
void initAudioCore(const std::string& deviceName);
|
||||||
static void initVideoCore(uint width, uint height);
|
|
||||||
static void initAudioCore(const std::string& deviceName);
|
|
||||||
|
|
||||||
// behind the scenes
|
// Group: Accessors
|
||||||
public:
|
public:
|
||||||
static void setInitOptions(const char* arg0);
|
// Function: getDisplayWidth
|
||||||
|
// Get the width of the display.
|
||||||
|
//
|
||||||
|
// Returns:
|
||||||
|
// Width of display in pixels.
|
||||||
|
uint getDisplayWidth();
|
||||||
|
|
||||||
|
// Function: getDisplayHeight
|
||||||
|
// Get the height of the display.
|
||||||
|
//
|
||||||
|
// Returns:
|
||||||
|
// Height of display in pixels.
|
||||||
|
uint getDisplayHeight();
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// Group: API Initialization
|
// Group: API Initialization
|
||||||
private:
|
private:
|
||||||
util::VersionInfo initPhysFS();
|
util::VersionInfo initPhysFS(const std::string& arg0);
|
||||||
|
util::VersionInfo initGLFW();
|
||||||
|
|
||||||
|
// UpdateTask, does the updating work of AppCore, registered as a Task
|
||||||
|
// so that user need not call something akin to AppCore::update() every
|
||||||
|
// frame
|
||||||
|
class UpdateTask : public Task
|
||||||
|
{
|
||||||
|
|
||||||
|
friend class Application;
|
||||||
|
|
||||||
|
public:
|
||||||
|
UpdateTask();
|
||||||
|
|
||||||
|
void update();
|
||||||
|
|
||||||
|
private:
|
||||||
|
int mouseX_;
|
||||||
|
int mouseY_;
|
||||||
|
bool active_;
|
||||||
|
bool timerPaused_;
|
||||||
|
bool unpauseOnActive_;
|
||||||
|
scalar lastPause_;
|
||||||
|
scalar pausedTime_;
|
||||||
|
scalar secPerFrame_;
|
||||||
|
scalar lastUpdate_;
|
||||||
|
bool quitRequested_;
|
||||||
|
};
|
||||||
|
|
||||||
|
// State system
|
||||||
|
typedef shared_ptr<State> StatePtr;
|
||||||
|
typedef std::map<std::string, StatePtr> StateMap;
|
||||||
|
|
||||||
|
// StateUpdate
|
||||||
|
class StateUpdate : public Task
|
||||||
|
{
|
||||||
|
|
||||||
|
friend class Application;
|
||||||
|
|
||||||
|
public:
|
||||||
|
StateUpdate();
|
||||||
|
void update();
|
||||||
|
|
||||||
|
private:
|
||||||
|
StatePtr state_;
|
||||||
|
};
|
||||||
|
|
||||||
|
// StateRender
|
||||||
|
class StateRender : public Task
|
||||||
|
{
|
||||||
|
|
||||||
|
friend class Application;
|
||||||
|
|
||||||
|
public:
|
||||||
|
StateRender();
|
||||||
|
void update();
|
||||||
|
|
||||||
|
private:
|
||||||
|
StatePtr state_;
|
||||||
|
};
|
||||||
|
|
||||||
private:
|
private:
|
||||||
// version number for photon
|
// version number for photon
|
||||||
util::VersionInfo photonVer_;
|
util::VersionInfo photonVer_;
|
||||||
|
|
||||||
// Cores and Kernel
|
uint dispWidth_;
|
||||||
static Kernel kernel_;
|
uint dispHeight_;
|
||||||
static AppCore appCore_;
|
shared_ptr<UpdateTask> updateTask_;
|
||||||
static std::auto_ptr<video::VideoCore> videoCore_;
|
shared_ptr<StateUpdate> stateUpdate_;
|
||||||
static std::auto_ptr<audio::AudioCore> audioCore_;
|
shared_ptr<StateRender> stateRender_;
|
||||||
|
|
||||||
static std::string arg0_;
|
// State system
|
||||||
|
StateMap stateMap_;
|
||||||
|
|
||||||
|
// input monitoring variables
|
||||||
|
static std::vector<InputListener*> listeners_;
|
||||||
|
static std::vector<KeyCode> pressedKeys_;
|
||||||
|
|
||||||
|
// Cores and Kernel
|
||||||
|
std::auto_ptr<video::VideoCore> videoCore_;
|
||||||
|
std::auto_ptr<audio::AudioCore> audioCore_;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
template<class StateT>
|
||||||
|
void Application::registerState(const std::string& stateName)
|
||||||
|
{
|
||||||
|
StateMap::iterator it( stateMap_.find(stateName) );
|
||||||
|
|
||||||
|
if(it != stateMap_.end())
|
||||||
|
{
|
||||||
|
throw PreconditionException("Application::registerState called twice "
|
||||||
|
"with same name: \"" + stateName + "\"");
|
||||||
|
}
|
||||||
|
|
||||||
|
stateMap_[stateName] = StatePtr(new StateT);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif //PHOTON_APPLICATION_HPP
|
#endif //PHOTON_APPLICATION_HPP
|
||||||
|
@ -5,7 +5,7 @@
|
|||||||
// James Turk (jpt2433@rit.edu)
|
// James Turk (jpt2433@rit.edu)
|
||||||
//
|
//
|
||||||
// Version:
|
// Version:
|
||||||
// $Id: Kernel.hpp,v 1.2 2005/08/02 23:07:52 cozman Exp $
|
// $Id: Kernel.hpp,v 1.3 2005/08/07 07:12:46 cozman Exp $
|
||||||
|
|
||||||
#ifndef PHOTON_KERNEL_HPP
|
#ifndef PHOTON_KERNEL_HPP
|
||||||
#define PHOTON_KERNEL_HPP
|
#define PHOTON_KERNEL_HPP
|
||||||
@ -13,6 +13,7 @@
|
|||||||
#include <list>
|
#include <list>
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
|
|
||||||
|
#include "util/Singleton.hpp"
|
||||||
#include "Task.hpp"
|
#include "Task.hpp"
|
||||||
|
|
||||||
namespace photon
|
namespace photon
|
||||||
@ -26,7 +27,7 @@ namespace photon
|
|||||||
// - (1) Add any tasks (should be derived from <Task>)
|
// - (1) Add any tasks (should be derived from <Task>)
|
||||||
// - (2) call <Kernel::run>
|
// - (2) call <Kernel::run>
|
||||||
// - (3) in order to avoid running forever, all tasks should eventually die
|
// - (3) in order to avoid running forever, all tasks should eventually die
|
||||||
class Kernel
|
class Kernel : public util::Singleton<Kernel>
|
||||||
{
|
{
|
||||||
|
|
||||||
// Group: (Con/De)structors
|
// Group: (Con/De)structors
|
||||||
@ -41,11 +42,18 @@ public:
|
|||||||
|
|
||||||
// Group: Running
|
// Group: Running
|
||||||
public:
|
public:
|
||||||
|
// Function: step
|
||||||
|
// Steps the kernel, calling each active task once.
|
||||||
|
//
|
||||||
|
// Each 'step' 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 step();
|
||||||
|
|
||||||
// Function: run
|
// Function: run
|
||||||
// Runs tasks until all tasks are asleep or dead.
|
// Runs tasks until all tasks are asleep or dead.
|
||||||
//
|
//
|
||||||
// Each 'frame' all tasks are run in order of their priorities, if two
|
// See Also:
|
||||||
// tasks have the same priority, they are run in the order they were added.
|
// <step>
|
||||||
void run();
|
void run();
|
||||||
|
|
||||||
// Group: Task Management
|
// Group: Task Management
|
||||||
|
@ -5,7 +5,7 @@
|
|||||||
// James Turk (jpt2433@rit.edu)
|
// James Turk (jpt2433@rit.edu)
|
||||||
//
|
//
|
||||||
// Version:
|
// Version:
|
||||||
// $Id: Task.hpp,v 1.3 2005/07/20 06:12:54 cozman Exp $
|
// $Id: Task.hpp,v 1.4 2005/08/07 07:12:46 cozman Exp $
|
||||||
|
|
||||||
#ifndef PHOTON_TASK_HPP
|
#ifndef PHOTON_TASK_HPP
|
||||||
#define PHOTON_TASK_HPP
|
#define PHOTON_TASK_HPP
|
||||||
@ -17,17 +17,29 @@
|
|||||||
namespace photon
|
namespace photon
|
||||||
{
|
{
|
||||||
|
|
||||||
// Title: Task
|
// Type: TaskPriority
|
||||||
|
enum PriorityLevel
|
||||||
|
{
|
||||||
|
PRI_APP_UPDATE, // special priority for Application updating (first)
|
||||||
|
|
||||||
// Group: Helper Types
|
// user-level priorities all lie in logic area
|
||||||
|
PRI_HIGHEST,
|
||||||
|
PRI_HIGH,
|
||||||
|
PRI_NORMAL,
|
||||||
|
PRI_LOW,
|
||||||
|
PRI_LOWEST,
|
||||||
|
|
||||||
class Task;
|
PRI_VIDEO_UPDATE, // special priority for clearing screen/video buffers
|
||||||
class Kernel;
|
PRI_RENDER // special priority for rendering (right after clear)
|
||||||
|
|
||||||
// Type: TaskPtr
|
// It is also important that no priorities fall between render/app update
|
||||||
// Pointer to a task, used since Task is abstract and will always be accessed
|
// so that flow of applications is:
|
||||||
// via a pointer.
|
// 1) Update & SwapBuffers
|
||||||
typedef shared_ptr<Task> TaskPtr;
|
// 2) Logic & User Level tasks
|
||||||
|
// 3) Clear screen/buffers
|
||||||
|
// 4) Render
|
||||||
|
// 5) SwapBuffers again (see step 1)
|
||||||
|
};
|
||||||
|
|
||||||
// Class: Task
|
// Class: Task
|
||||||
// Abstract class for tasks, which are runnable classes for use with <Kernel>.
|
// Abstract class for tasks, which are runnable classes for use with <Kernel>.
|
||||||
@ -44,10 +56,8 @@ public:
|
|||||||
// name - Name for task, must be unique!
|
// name - Name for task, must be unique!
|
||||||
// priority - Optional argument for desired priority for the Task,
|
// priority - Optional argument for desired priority for the Task,
|
||||||
// controls order in which tasks are run by the <Kernel>.
|
// controls order in which tasks are run by the <Kernel>.
|
||||||
// Tasks are executed starting with the lowest number for
|
// Default Priority is PRI_NORMAL
|
||||||
// priority, meaning a task with priority=0 will execute first.
|
Task(const std::string& name, PriorityLevel priority=PRI_NORMAL);
|
||||||
// Default priority is 5000.
|
|
||||||
Task(const std::string& name, uint priority=5000);
|
|
||||||
|
|
||||||
// Function: ~Task
|
// Function: ~Task
|
||||||
// Virtual destructor, exists simply to make inheritance safe.
|
// Virtual destructor, exists simply to make inheritance safe.
|
||||||
@ -124,11 +134,16 @@ public:
|
|||||||
// data members
|
// data members
|
||||||
private:
|
private:
|
||||||
std::string name_; // all tasks need a unique name
|
std::string name_; // all tasks need a unique name
|
||||||
uint priority_; // priority determines ordering of tasks
|
PriorityLevel priority_; // priority determines ordering of tasks
|
||||||
bool alive_; // if false, task will be pruned
|
bool alive_; // if false, task will be pruned
|
||||||
bool paused_; // if false task won't be executed
|
bool paused_; // if false task won't be executed
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// Type: TaskPtr
|
||||||
|
// Pointer to a task, used since Task is abstract and will always be accessed
|
||||||
|
// via a pointer.
|
||||||
|
typedef shared_ptr<Task> TaskPtr;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif //PHOTON_TASK_HPP
|
#endif //PHOTON_TASK_HPP
|
||||||
|
@ -5,7 +5,7 @@
|
|||||||
// James Turk (jpt2433@rit.edu)
|
// James Turk (jpt2433@rit.edu)
|
||||||
//
|
//
|
||||||
// Version:
|
// Version:
|
||||||
// $Id: AudioCore.hpp,v 1.10 2005/08/02 23:07:52 cozman Exp $
|
// $Id: AudioCore.hpp,v 1.11 2005/08/07 07:12:47 cozman Exp $
|
||||||
|
|
||||||
#ifdef PHOTON_USE_OPENAL
|
#ifdef PHOTON_USE_OPENAL
|
||||||
|
|
||||||
@ -15,7 +15,6 @@
|
|||||||
#include "AL/al.h"
|
#include "AL/al.h"
|
||||||
#include "AL/alc.h"
|
#include "AL/alc.h"
|
||||||
|
|
||||||
#include "util/Singleton.hpp"
|
|
||||||
#include "util/VersionInfo.hpp"
|
#include "util/VersionInfo.hpp"
|
||||||
|
|
||||||
namespace photon
|
namespace photon
|
||||||
|
@ -5,7 +5,7 @@
|
|||||||
// James Turk (jpt2433@rit.edu)
|
// James Turk (jpt2433@rit.edu)
|
||||||
//
|
//
|
||||||
// Version:
|
// Version:
|
||||||
// $Id: entrypoint.hpp,v 1.6 2005/07/19 01:31:37 cozman Exp $
|
// $Id: entrypoint.hpp,v 1.7 2005/08/07 07:12:46 cozman Exp $
|
||||||
|
|
||||||
|
|
||||||
#ifndef PHOTON_ENTRYPOINT_HPP
|
#ifndef PHOTON_ENTRYPOINT_HPP
|
||||||
@ -15,54 +15,41 @@
|
|||||||
|
|
||||||
// Title: Entrypoint
|
// Title: Entrypoint
|
||||||
|
|
||||||
// Macro: ENTRYPOINT
|
int PhotonMain(const photon::StrVec& args);
|
||||||
// A macro which is used to specify the class containing the entrypoint.
|
|
||||||
// For example, if the class PongGame is the class derived from <Application>
|
|
||||||
// which implements main, in the file defining PongGame it is important to
|
|
||||||
// include ENTRYPOINT(PongGame) so that the entry point becomes PongGame::main.
|
|
||||||
|
|
||||||
#define ENTRYPOINT(className) int main(int argc, const char** argv) \
|
int main(int argc, const char** argv)
|
||||||
{ return photon::mainclass<className>(argc,argv); }
|
|
||||||
|
|
||||||
namespace photon
|
|
||||||
{
|
|
||||||
|
|
||||||
// function which does all the work of ENTRYPOINT
|
|
||||||
template<class App>
|
|
||||||
int mainclass(int argc, const char** argv)
|
|
||||||
{
|
{
|
||||||
// logging of uncaught exceptions to console
|
// logging of uncaught exceptions to console
|
||||||
Log log;
|
photon::Log log;
|
||||||
log.addSink(LogSinkPtr(new photon::ConsoleSink("out")));
|
log.addSink(photon::LogSinkPtr(new photon::ConsoleSink("out")));
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
App::setInitOptions(argv[0]);
|
new photon::Application(argv[0]);
|
||||||
|
|
||||||
App app;
|
|
||||||
|
|
||||||
// push arguments into StrVec
|
// push arguments into StrVec
|
||||||
StrVec args;
|
photon::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]);
|
||||||
}
|
}
|
||||||
|
|
||||||
// hand arguments to Application::main and return what main returns
|
int retVal = PhotonMain(args);
|
||||||
return app.main(args);
|
|
||||||
|
photon::Application::destroy();
|
||||||
|
|
||||||
|
return retVal;
|
||||||
}
|
}
|
||||||
catch(Exception &e) // log exceptions as errors (wow that's confusing)
|
catch(photon::Exception &e) // log exceptions as errors (confusing?)
|
||||||
{
|
{
|
||||||
log.error() << e;
|
log.error() << e;
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
catch(Error &e) // log errors as critical errors
|
catch(photon::Error &e) // log errors as critical errors
|
||||||
{
|
{
|
||||||
log.critical() << e;
|
log.critical() << e;
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif //PHOTON_ENTRYPOINT_HPP
|
#endif //PHOTON_ENTRYPOINT_HPP
|
||||||
|
@ -5,7 +5,7 @@
|
|||||||
// James Turk (jpt2433@rit.edu)
|
// James Turk (jpt2433@rit.edu)
|
||||||
//
|
//
|
||||||
// Version:
|
// Version:
|
||||||
// $Id: Timer.hpp,v 1.2 2005/07/18 06:18:51 cozman Exp $
|
// $Id: Timer.hpp,v 1.3 2005/08/07 07:12:47 cozman Exp $
|
||||||
|
|
||||||
#ifndef PHOTON_UTIL_TIMER_HPP
|
#ifndef PHOTON_UTIL_TIMER_HPP
|
||||||
#define PHOTON_UTIL_TIMER_HPP
|
#define PHOTON_UTIL_TIMER_HPP
|
||||||
@ -76,7 +76,6 @@ private:
|
|||||||
|
|
||||||
// data members
|
// data members
|
||||||
private:
|
private:
|
||||||
AppCore& appCore_;
|
|
||||||
bool appTimeLinked_;
|
bool appTimeLinked_;
|
||||||
bool paused_;
|
bool paused_;
|
||||||
double pausedTime_;
|
double pausedTime_;
|
||||||
|
193
photon.mm
193
photon.mm
@ -3,9 +3,40 @@
|
|||||||
<node ID="Freemind_Link_1676542623" TEXT="Photon">
|
<node ID="Freemind_Link_1676542623" TEXT="Photon">
|
||||||
<cloud/>
|
<cloud/>
|
||||||
<font BOLD="true" NAME="SansSerif" SIZE="12"/>
|
<font BOLD="true" NAME="SansSerif" SIZE="12"/>
|
||||||
<node ID="Freemind_Link_682620075" POSITION="right" TEXT="0.1 Release">
|
<node ID="Freemind_Link_682620075" POSITION="right" TEXT="0.1 Series">
|
||||||
<font BOLD="true" NAME="SansSerif" SIZE="12"/>
|
<font BOLD="true" NAME="SansSerif" SIZE="12"/>
|
||||||
<node ID="Freemind_Link_1746871436" TEXT="remaining features">
|
<node ID="Freemind_Link_1125660603" TEXT="0.0.1">
|
||||||
|
<font BOLD="true" NAME="SansSerif" SIZE="12"/>
|
||||||
|
<node ID="Freemind_Link_700471537" TEXT="dependencies / licensing clarification">
|
||||||
|
<icon BUILTIN="button_ok"/>
|
||||||
|
</node>
|
||||||
|
<node ID="Freemind_Link_1010220321" TEXT="0.0.1 final tests">
|
||||||
|
<node ID="Freemind_Link_674240959" TEXT="convert">
|
||||||
|
<icon BUILTIN="pencil"/>
|
||||||
|
</node>
|
||||||
|
<node ID="Freemind_Link_885668051" TEXT="test"/>
|
||||||
|
</node>
|
||||||
|
<node ID="Freemind_Link_1939341405" TEXT="evaluate status of Cores"/>
|
||||||
|
<node FOLDED="true" 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 COLOR="#ff0300" ID="Freemind_Link_1465392887" TEXT="delay until 0.1.x">
|
||||||
|
<font ITALIC="true" NAME="SansSerif" SIZE="12"/>
|
||||||
|
<icon BUILTIN="help"/>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
<node ID="Freemind_Link_115594103" TEXT="0.1">
|
||||||
|
<font BOLD="true" NAME="SansSerif" SIZE="12"/>
|
||||||
|
<node FOLDED="true" ID="Freemind_Link_1746871436" TEXT="features">
|
||||||
|
<icon BUILTIN="button_ok"/>
|
||||||
<node FOLDED="true" ID="Freemind_Link_40954797" TEXT="improved input handling ">
|
<node FOLDED="true" ID="Freemind_Link_40954797" TEXT="improved input handling ">
|
||||||
<icon BUILTIN="button_ok"/>
|
<icon BUILTIN="button_ok"/>
|
||||||
<node ID="_" TEXT="amph listener system">
|
<node ID="_" TEXT="amph listener system">
|
||||||
@ -15,104 +46,42 @@
|
|||||||
<icon BUILTIN="button_ok"/>
|
<icon BUILTIN="button_ok"/>
|
||||||
</node>
|
</node>
|
||||||
</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 COLOR="#010101" ID="Freemind_Link_1806925741" TEXT="resource finalization">
|
||||||
|
<icon BUILTIN="button_ok"/>
|
||||||
|
</node>
|
||||||
|
<node ID="Freemind_Link_1166438127" TEXT="test release candidate"/>
|
||||||
|
<node FOLDED="true" 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 COLOR="#010101" ID="Freemind_Link_1447936394" TEXT="Frogger"/>
|
||||||
|
</node>
|
||||||
|
<node ID="Freemind_Link_1716705807" TEXT="clean up naturaldocs"/>
|
||||||
|
</node>
|
||||||
|
<node FOLDED="true" ID="Freemind_Link_1151493849" TEXT="0.1.x">
|
||||||
|
<font BOLD="true" NAME="SansSerif" SIZE="12"/>
|
||||||
|
<node ID="Freemind_Link_540349165" TEXT="static-LGPL Free OpenAL on Windows">
|
||||||
|
<font NAME="SansSerif" SIZE="12"/>
|
||||||
|
<node ID="Freemind_Link_968837931" TEXT="drop alut"/>
|
||||||
|
<node ID="Freemind_Link_831588763" TEXT="write own wav-loader"/>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
<node FOLDED="true" ID="Freemind_Link_486829238" POSITION="right" TEXT="0.2 Release">
|
||||||
|
<font BOLD="true" NAME="SansSerif" SIZE="12"/>
|
||||||
|
<node ID="Freemind_Link_103747781" TEXT="New Features">
|
||||||
|
<font NAME="SansSerif" SIZE="12"/>
|
||||||
<node ID="Freemind_Link_1825420810" TEXT="Music">
|
<node ID="Freemind_Link_1825420810" TEXT="Music">
|
||||||
<icon BUILTIN="stop"/>
|
<icon BUILTIN="stop"/>
|
||||||
<node COLOR="#ff0300" ID="Freemind_Link_1961333678" TEXT="delay until 0.1.x">
|
<node COLOR="#ff0300" ID="Freemind_Link_1961333678" TEXT="delay until 0.1.x">
|
||||||
<font ITALIC="true" NAME="SansSerif" SIZE="12"/>
|
<font ITALIC="true" NAME="SansSerif" SIZE="12"/>
|
||||||
</node>
|
</node>
|
||||||
</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 ID="Freemind_Link_1694084951" TEXT="work on making Task more user friendly">
|
|
||||||
<font NAME="SansSerif" SIZE="12"/>
|
|
||||||
<node ID="Freemind_Link_1066242768" TEXT=""State" system">
|
|
||||||
<font NAME="SansSerif" SIZE="12"/>
|
|
||||||
</node>
|
|
||||||
<node ID="Freemind_Link_854288636" TEXT="hide Kernel">
|
|
||||||
<font NAME="SansSerif" SIZE="12"/>
|
|
||||||
</node>
|
|
||||||
</node>
|
|
||||||
</node>
|
|
||||||
<node ID="Freemind_Link_700471537" TEXT="dependencies / licensing clarification">
|
|
||||||
<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_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 COLOR="#ff0300" ID="Freemind_Link_1465392887" TEXT="delay until 0.1.x">
|
|
||||||
<font ITALIC="true" NAME="SansSerif" SIZE="12"/>
|
|
||||||
<icon BUILTIN="help"/>
|
|
||||||
</node>
|
|
||||||
</node>
|
|
||||||
</node>
|
|
||||||
<node ID="Freemind_Link_1716705807" TEXT="clean up naturaldocs"/>
|
|
||||||
<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 COLOR="#010101" ID="Freemind_Link_1447936394" TEXT="Frogger"/>
|
|
||||||
<node COLOR="#010101" ID="Freemind_Link_1789291917" TEXT="LaserGame">
|
|
||||||
<font NAME="SansSerif" SIZE="12"/>
|
|
||||||
</node>
|
|
||||||
</node>
|
|
||||||
<node FOLDED="true" ID="Freemind_Link_1010220321" TEXT="clean/test all tests">
|
|
||||||
<icon BUILTIN="button_ok"/>
|
|
||||||
<node ID="Freemind_Link_129725390" TEXT="Audio">
|
|
||||||
<icon BUILTIN="button_ok"/>
|
|
||||||
</node>
|
|
||||||
<node ID="Freemind_Link_543532536" TEXT="ConfigFile">
|
|
||||||
<icon BUILTIN="button_ok"/>
|
|
||||||
</node>
|
|
||||||
<node ID="Freemind_Link_1037234161" TEXT="Font">
|
|
||||||
<icon BUILTIN="button_ok"/>
|
|
||||||
</node>
|
|
||||||
<node ID="Freemind_Link_1574983928" TEXT="Image">
|
|
||||||
<icon BUILTIN="button_ok"/>
|
|
||||||
</node>
|
|
||||||
<node ID="Freemind_Link_83171017" TEXT="Input">
|
|
||||||
<icon BUILTIN="button_ok"/>
|
|
||||||
</node>
|
|
||||||
<node ID="Freemind_Link_714170273" TEXT="Log">
|
|
||||||
<icon BUILTIN="button_ok"/>
|
|
||||||
</node>
|
|
||||||
<node ID="Freemind_Link_1336661607" TEXT="Pen">
|
|
||||||
<icon BUILTIN="button_ok"/>
|
|
||||||
</node>
|
|
||||||
<node ID="Freemind_Link_26290657" TEXT="RandGen">
|
|
||||||
<icon BUILTIN="button_ok"/>
|
|
||||||
</node>
|
|
||||||
<node ID="Freemind_Link_1563035547" TEXT="Texture">
|
|
||||||
<icon BUILTIN="button_ok"/>
|
|
||||||
</node>
|
|
||||||
<node ID="Freemind_Link_120826083" TEXT="filesys">
|
|
||||||
<icon BUILTIN="button_ok"/>
|
|
||||||
</node>
|
|
||||||
<node ID="Freemind_Link_1985120655" TEXT="math">
|
|
||||||
<icon BUILTIN="button_ok"/>
|
|
||||||
</node>
|
|
||||||
</node>
|
|
||||||
<node COLOR="#010101" ID="Freemind_Link_1806925741" TEXT="resource finalization">
|
|
||||||
<icon BUILTIN="button_ok"/>
|
|
||||||
</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 COLOR="#000000" ID="Freemind_Link_420721466" TEXT="XML/XSLT sink"/>
|
||||||
<node ID="Freemind_Link_1298931281" TEXT="XML resource files"/>
|
<node ID="Freemind_Link_1298931281" TEXT="XML resource files"/>
|
||||||
<node ID="Freemind_Link_1070201117" TEXT="Transitions">
|
<node ID="Freemind_Link_1070201117" TEXT="Transitions">
|
||||||
@ -133,7 +102,7 @@
|
|||||||
<node ID="Freemind_Link_1362733907" TEXT="investigate dropping Corona"/>
|
<node ID="Freemind_Link_1362733907" TEXT="investigate dropping Corona"/>
|
||||||
</node>
|
</node>
|
||||||
</node>
|
</node>
|
||||||
<node FOLDED="true" ID="Freemind_Link_1111954089" POSITION="right" TEXT="Long Term">
|
<node ID="Freemind_Link_1111954089" POSITION="right" TEXT="Long Term">
|
||||||
<font BOLD="true" NAME="SansSerif" SIZE="12"/>
|
<font BOLD="true" NAME="SansSerif" SIZE="12"/>
|
||||||
<node FOLDED="true" ID="Freemind_Link_1066996987" TEXT="New Features">
|
<node FOLDED="true" ID="Freemind_Link_1066996987" TEXT="New Features">
|
||||||
<font NAME="SansSerif" SIZE="12"/>
|
<font NAME="SansSerif" SIZE="12"/>
|
||||||
@ -144,25 +113,41 @@
|
|||||||
<node FOLDED="true" ID="Freemind_Link_304523376" TEXT="network::">
|
<node FOLDED="true" ID="Freemind_Link_304523376" TEXT="network::">
|
||||||
<node ID="Freemind_Link_717482997" TEXT="wrap enet?"/>
|
<node ID="Freemind_Link_717482997" TEXT="wrap enet?"/>
|
||||||
</node>
|
</node>
|
||||||
<node ID="Freemind_Link_21483700" TEXT="python interface">
|
<node FOLDED="true" ID="Freemind_Link_1766405270" TEXT="scripting">
|
||||||
|
<node ID="Freemind_Link_918658782" TEXT="lua"/>
|
||||||
|
<node ID="Freemind_Link_1079584283" TEXT="python"/>
|
||||||
|
<node ID="Freemind_Link_512949260" TEXT="angelscript"/>
|
||||||
|
<node ID="Freemind_Link_1813241804" TEXT="custom"/>
|
||||||
|
<node ID="Freemind_Link_1220379011" TEXT="other"/>
|
||||||
|
</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_1142976123" TEXT="is there a point?">
|
||||||
|
<node ID="Freemind_Link_396200365" TEXT="compatibility?"/>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
<node ID="Freemind_Link_961284194" TEXT="SDL backend">
|
||||||
<icon BUILTIN="help"/>
|
<icon BUILTIN="help"/>
|
||||||
</node>
|
</node>
|
||||||
<node ID="Freemind_Link_1045478290" TEXT="lua integration">
|
</node>
|
||||||
|
<node FOLDED="true" ID="Freemind_Link_1036629371" TEXT="other languages">
|
||||||
|
<node ID="Freemind_Link_21483700" TEXT="python interface">
|
||||||
<icon BUILTIN="help"/>
|
<icon BUILTIN="help"/>
|
||||||
</node>
|
</node>
|
||||||
<node ID="Freemind_Link_1083759822" TEXT="java interface">
|
<node ID="Freemind_Link_1083759822" TEXT="java interface">
|
||||||
<icon BUILTIN="help"/>
|
<icon BUILTIN="help"/>
|
||||||
</node>
|
</node>
|
||||||
</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.24 2005/08/07 07:12:46 cozman Exp $">
|
||||||
</node>
|
|
||||||
<node COLOR="#147f1e" ID="Freemind_Link_438641521" POSITION="left" TEXT="Version: $Id: photon.mm,v 1.23 2005/08/02 23:07:51 cozman Exp $">
|
|
||||||
<font ITALIC="true" NAME="SansSerif" SIZE="12"/>
|
<font ITALIC="true" NAME="SansSerif" SIZE="12"/>
|
||||||
</node>
|
</node>
|
||||||
|
<node ID="Freemind_Link_853483912" POSITION="left" TEXT="Current Problems">
|
||||||
|
<font BOLD="true" NAME="SansSerif" SIZE="12"/>
|
||||||
|
<node ID="Freemind_Link_3809219" TEXT="check if fullscreen works in Windows">
|
||||||
|
<font NAME="SansSerif" SIZE="12"/>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
</node>
|
</node>
|
||||||
</map>
|
</map>
|
||||||
|
342
src/AppCore.cpp
342
src/AppCore.cpp
@ -1,343 +1 @@
|
|||||||
//This file is part of Photon (http://photon.sourceforge.net)
|
|
||||||
//Copyright (C) 2004-2005 James Turk
|
|
||||||
//
|
|
||||||
// Author:
|
|
||||||
// James Turk (jpt2433@rit.edu)
|
|
||||||
//
|
|
||||||
// Version:
|
|
||||||
// $Id: AppCore.cpp,v 1.14 2005/08/02 23:07:52 cozman Exp $
|
|
||||||
|
|
||||||
#include "AppCore.hpp"
|
|
||||||
|
|
||||||
#include <boost/lexical_cast.hpp>
|
|
||||||
#include "GL/glfw.h" //This file depends on glfw
|
|
||||||
|
|
||||||
#include "Application.hpp"
|
|
||||||
#include "Kernel.hpp"
|
|
||||||
#include "exceptions.hpp"
|
|
||||||
#include "video/VideoCore.hpp"
|
|
||||||
|
|
||||||
namespace photon
|
|
||||||
{
|
|
||||||
|
|
||||||
// static initializer
|
|
||||||
std::vector<InputListener*> AppCore::listeners_;
|
|
||||||
std::vector<KeyCode> AppCore::pressedKeys_;
|
|
||||||
|
|
||||||
AppCore::AppCore() :
|
|
||||||
dispWidth_(0), dispHeight_(0),
|
|
||||||
task_(new UpdateTask())
|
|
||||||
{ }
|
|
||||||
|
|
||||||
AppCore::~AppCore()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
void AppCore::init()
|
|
||||||
{
|
|
||||||
util::VersionInfo glfwReq(2,4,2); // requires GLFW 2.4.2
|
|
||||||
util::ensureVersion("GLFW", initGLFW(), glfwReq);
|
|
||||||
|
|
||||||
Application::getKernel().addTask(task_); // add updater task
|
|
||||||
}
|
|
||||||
|
|
||||||
void AppCore::shutdown()
|
|
||||||
{
|
|
||||||
if(dispWidth_ && dispHeight_)
|
|
||||||
{
|
|
||||||
glfwCloseWindow(); //close GLFW window
|
|
||||||
}
|
|
||||||
|
|
||||||
glfwTerminate(); //shutdown GLFW
|
|
||||||
}
|
|
||||||
|
|
||||||
void AppCore::createDisplay(uint width, uint height,
|
|
||||||
uint redBits, uint greenBits, uint blueBits,
|
|
||||||
uint alphaBits, uint depthBits, uint stencilBits,
|
|
||||||
bool fullscreen, const std::string &title)
|
|
||||||
{
|
|
||||||
GLboolean status;
|
|
||||||
status = glfwOpenWindow(width, height, redBits, greenBits,
|
|
||||||
blueBits, alphaBits, depthBits, stencilBits,
|
|
||||||
fullscreen ? GLFW_FULLSCREEN : GLFW_WINDOW);
|
|
||||||
if(status == GL_FALSE)
|
|
||||||
{
|
|
||||||
throw APIError("Failed to create display.");
|
|
||||||
}
|
|
||||||
|
|
||||||
// register the callbacks (after a window is open)
|
|
||||||
glfwSetKeyCallback(AppCore::keyCallback);
|
|
||||||
//glfwSetCharCallback(AppCore::charCallback);
|
|
||||||
glfwSetMouseButtonCallback(AppCore::mouseButtonCallback);
|
|
||||||
glfwSetMousePosCallback(AppCore::mouseMoveCallback);
|
|
||||||
//glfwSetMouseWheelCallback(AppCore::mouseWheelCallback);
|
|
||||||
|
|
||||||
Application::initVideoCore(width, height);
|
|
||||||
dispWidth_ = width;
|
|
||||||
dispHeight_ = height;
|
|
||||||
|
|
||||||
glfwSetWindowTitle(title.c_str()); // title is set separately
|
|
||||||
}
|
|
||||||
|
|
||||||
void AppCore::createDisplay(uint width, uint height, uint bpp,
|
|
||||||
uint depthBits, uint stencilBits, bool fullscreen,
|
|
||||||
const std::string &title)
|
|
||||||
{
|
|
||||||
// call main version of createDisplay with individual values for rgba bits
|
|
||||||
switch(bpp)
|
|
||||||
{
|
|
||||||
case 8:
|
|
||||||
createDisplay(width, height, 3, 3, 2, 0, depthBits, stencilBits,
|
|
||||||
fullscreen, title);
|
|
||||||
break;
|
|
||||||
case 16:
|
|
||||||
createDisplay(width, height, 5, 6, 5, 0, depthBits, stencilBits,
|
|
||||||
fullscreen, title);
|
|
||||||
break;
|
|
||||||
case 24:
|
|
||||||
createDisplay(width, height, 8, 8, 8, 0, depthBits, stencilBits,
|
|
||||||
fullscreen, title);
|
|
||||||
break;
|
|
||||||
case 32:
|
|
||||||
createDisplay(width, height, 8, 8, 8, 8, depthBits, stencilBits,
|
|
||||||
fullscreen, title);
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
throw ArgumentException("bpp argument of createDisplay must be "
|
|
||||||
"8,16,24, or 32, passed " +
|
|
||||||
boost::lexical_cast<std::string>(bpp) );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
bool AppCore::keyPressed(KeyCode key)
|
|
||||||
{
|
|
||||||
return glfwGetKey(key) == GLFW_PRESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
std::vector<KeyCode> AppCore::getPressedKeys()
|
|
||||||
{
|
|
||||||
return pressedKeys_;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool AppCore::mouseButtonPressed(MouseButton button)
|
|
||||||
{
|
|
||||||
return glfwGetMouseButton(button) == GLFW_PRESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
int AppCore::getMouseX()
|
|
||||||
{
|
|
||||||
return task_->mouseX_;
|
|
||||||
}
|
|
||||||
|
|
||||||
int AppCore::getMouseY()
|
|
||||||
{
|
|
||||||
return task_->mouseY_;
|
|
||||||
}
|
|
||||||
|
|
||||||
int AppCore::getMouseWheelPos()
|
|
||||||
{
|
|
||||||
return glfwGetMouseWheel();
|
|
||||||
}
|
|
||||||
|
|
||||||
void AppCore::addInputListener(InputListener *listener)
|
|
||||||
{
|
|
||||||
// should never happen since listeners add themselves with a this pointer
|
|
||||||
if(!listener)
|
|
||||||
{
|
|
||||||
throw ArgumentException("Null pointer in AppCore::addInputListener");
|
|
||||||
}
|
|
||||||
|
|
||||||
// add the listener
|
|
||||||
listeners_.push_back(listener);
|
|
||||||
}
|
|
||||||
|
|
||||||
void AppCore::removeInputListener(InputListener *listener)
|
|
||||||
{
|
|
||||||
// should never happen since listeners remove themselves with a this pointer
|
|
||||||
if(!listener)
|
|
||||||
{
|
|
||||||
throw ArgumentException("Null pointer in AppCore::removeInputListener");
|
|
||||||
}
|
|
||||||
|
|
||||||
// find and erase the listener
|
|
||||||
std::vector<InputListener*>::iterator it;
|
|
||||||
it = std::find(listeners_.begin(), listeners_.end(), listener);
|
|
||||||
|
|
||||||
if(it != listeners_.end())
|
|
||||||
{
|
|
||||||
listeners_.erase(it);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void GLFWCALL AppCore::keyCallback(int key, int action)
|
|
||||||
{
|
|
||||||
// notify all listeners
|
|
||||||
for(std::vector<InputListener*>::iterator listener = listeners_.begin();
|
|
||||||
listener != listeners_.end();
|
|
||||||
++listener)
|
|
||||||
{
|
|
||||||
// only active listeners get messages
|
|
||||||
if((*listener)->isActive())
|
|
||||||
{
|
|
||||||
if(action == GLFW_PRESS)
|
|
||||||
{
|
|
||||||
(*listener)->onKeyPress(key);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
(*listener)->onKeyRelease(key);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// maintain a list of pressed keys
|
|
||||||
if(action == GLFW_PRESS)
|
|
||||||
{
|
|
||||||
pressedKeys_.push_back(static_cast<KeyCode>(key));
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// delete a key from the vector
|
|
||||||
std::vector<KeyCode>::iterator it;
|
|
||||||
it = std::find(pressedKeys_.begin(), pressedKeys_.end(), key);
|
|
||||||
|
|
||||||
if(it != pressedKeys_.end())
|
|
||||||
{
|
|
||||||
pressedKeys_.erase(it);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void GLFWCALL AppCore::mouseButtonCallback(int button, int action)
|
|
||||||
{
|
|
||||||
// notify all listeners
|
|
||||||
for(std::vector<InputListener*>::iterator listener = listeners_.begin();
|
|
||||||
listener != listeners_.end();
|
|
||||||
++listener)
|
|
||||||
{
|
|
||||||
// only active listeners get messages
|
|
||||||
if((*listener)->isActive())
|
|
||||||
{
|
|
||||||
if(action == GLFW_PRESS)
|
|
||||||
{
|
|
||||||
(*listener)->onMouseButtonPress(button);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
(*listener)->onMouseButtonRelease(button);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void GLFWCALL AppCore::mouseMoveCallback(int x, int y)
|
|
||||||
{
|
|
||||||
// notify all listeners
|
|
||||||
for(std::vector<InputListener*>::iterator listener = listeners_.begin();
|
|
||||||
listener != listeners_.end();
|
|
||||||
++listener)
|
|
||||||
{
|
|
||||||
// only active listeners get messages
|
|
||||||
if((*listener)->isActive())
|
|
||||||
{
|
|
||||||
(*listener)->onMouseMove(math::Vector2(static_cast<scalar>(x),
|
|
||||||
static_cast<scalar>(y)));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
scalar AppCore::getTime()
|
|
||||||
{
|
|
||||||
return glfwGetTime() - task_->pausedTime_;
|
|
||||||
}
|
|
||||||
|
|
||||||
void AppCore::setTitle(const std::string& title)
|
|
||||||
{
|
|
||||||
glfwSetWindowTitle(title.c_str());
|
|
||||||
}
|
|
||||||
|
|
||||||
bool AppCore::isActive()
|
|
||||||
{
|
|
||||||
return task_->active_;
|
|
||||||
}
|
|
||||||
|
|
||||||
double AppCore::getElapsedTime()
|
|
||||||
{
|
|
||||||
return task_->secPerFrame_;
|
|
||||||
}
|
|
||||||
|
|
||||||
double AppCore::getFramerate()
|
|
||||||
{
|
|
||||||
return 1/task_->secPerFrame_;
|
|
||||||
}
|
|
||||||
|
|
||||||
uint AppCore::getDisplayWidth()
|
|
||||||
{
|
|
||||||
return dispWidth_;
|
|
||||||
}
|
|
||||||
|
|
||||||
uint AppCore::getDisplayHeight()
|
|
||||||
{
|
|
||||||
return dispHeight_;
|
|
||||||
}
|
|
||||||
|
|
||||||
util::VersionInfo AppCore::initGLFW()
|
|
||||||
{
|
|
||||||
int maj,min,patch;
|
|
||||||
if(glfwInit() == GL_FALSE)
|
|
||||||
{
|
|
||||||
throw APIError("Initialization of GLFW failed!");
|
|
||||||
}
|
|
||||||
glfwGetVersion(&maj,&min,&patch);
|
|
||||||
return util::VersionInfo(maj,min,patch);
|
|
||||||
}
|
|
||||||
|
|
||||||
AppCore::UpdateTask::UpdateTask() :
|
|
||||||
Task("AppCore::UpdateTask", 10),
|
|
||||||
mouseX_(0), mouseY_(0),
|
|
||||||
active_(false), timerPaused_(false),
|
|
||||||
unpauseOnActive_(false), lastPause_(0), pausedTime_(0),
|
|
||||||
secPerFrame_(0), lastUpdate_(0)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
void AppCore::UpdateTask::update()
|
|
||||||
{
|
|
||||||
scalar curTime = glfwGetTime() - pausedTime_;
|
|
||||||
|
|
||||||
// update the display here instead of VideoCore (since it belongs to glfw)
|
|
||||||
glfwSwapBuffers();
|
|
||||||
|
|
||||||
glfwGetMousePos(&mouseX_, &mouseY_);
|
|
||||||
|
|
||||||
// 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')) ) )
|
|
||||||
{
|
|
||||||
Application::getKernel().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;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
@ -5,18 +5,19 @@
|
|||||||
// James Turk (jpt2433@rit.edu)
|
// James Turk (jpt2433@rit.edu)
|
||||||
//
|
//
|
||||||
// Version:
|
// Version:
|
||||||
// $Id: Application.cpp,v 1.14 2005/08/02 23:07:52 cozman Exp $
|
// $Id: Application.cpp,v 1.15 2005/08/07 07:12:47 cozman Exp $
|
||||||
|
|
||||||
#include "Application.hpp"
|
#include "Application.hpp"
|
||||||
|
|
||||||
#include "physfs.h"
|
#include "physfs.h"
|
||||||
#include "GL/gl.h"
|
#include "GL/gl.h"
|
||||||
|
#include "GL/glfw.h" //This file depends on glfw
|
||||||
|
|
||||||
#include <boost/lexical_cast.hpp>
|
#include <boost/lexical_cast.hpp>
|
||||||
#include "exceptions.hpp"
|
#include "exceptions.hpp"
|
||||||
#include "Log.hpp"
|
#include "Log.hpp"
|
||||||
#include "Kernel.hpp"
|
#include "Kernel.hpp"
|
||||||
#include "AppCore.hpp"
|
#include "Application.hpp"
|
||||||
#include "video/VideoCore.hpp"
|
#include "video/VideoCore.hpp"
|
||||||
#include "audio/AudioCore.hpp"
|
#include "audio/AudioCore.hpp"
|
||||||
#include "util/filesys/filesys.hpp"
|
#include "util/filesys/filesys.hpp"
|
||||||
@ -25,36 +26,248 @@
|
|||||||
namespace photon
|
namespace photon
|
||||||
{
|
{
|
||||||
|
|
||||||
Kernel Application::kernel_;
|
std::vector<InputListener*> Application::listeners_;
|
||||||
AppCore Application::appCore_;
|
std::vector<KeyCode> Application::pressedKeys_;
|
||||||
std::auto_ptr<video::VideoCore> Application::videoCore_;
|
|
||||||
std::auto_ptr<audio::AudioCore> Application::audioCore_;
|
|
||||||
std::string Application::arg0_;
|
|
||||||
|
|
||||||
Application::Application() :
|
Application::Application(const std::string& arg0) :
|
||||||
photonVer_(0,0,1) // this is the current version
|
photonVer_(0,0,1), // this is the current version
|
||||||
|
dispWidth_(0), dispHeight_(0),
|
||||||
|
updateTask_(new UpdateTask()),
|
||||||
|
stateUpdate_(new StateUpdate()),
|
||||||
|
stateRender_(new StateRender())
|
||||||
{
|
{
|
||||||
util::VersionInfo physfsReq(1,0,0); // requires PhysFS 1.0.0
|
util::VersionInfo physfsReq(1,0,0); // requires PhysFS 1.0.0
|
||||||
util::ensureVersion("PhysFS", initPhysFS(), physfsReq);
|
util::ensureVersion("PhysFS", initPhysFS(arg0), physfsReq);
|
||||||
|
|
||||||
appCore_.init(); // init appcore
|
util::VersionInfo glfwReq(2,4,2); // requires GLFW 2.4.2
|
||||||
|
util::ensureVersion("GLFW", initGLFW(), glfwReq);
|
||||||
|
|
||||||
|
new Kernel; // create Kernel before it is used
|
||||||
|
|
||||||
|
Kernel::getInstance().addTask(updateTask_); // add updater task
|
||||||
|
Kernel::getInstance().addTask(stateUpdate_); // add state updater task
|
||||||
|
Kernel::getInstance().addTask(stateRender_); // add state renderer task
|
||||||
}
|
}
|
||||||
|
|
||||||
Application::~Application()
|
Application::~Application()
|
||||||
{
|
{
|
||||||
appCore_.shutdown(); // shutdown appcore
|
if(dispWidth_ && dispHeight_)
|
||||||
|
{
|
||||||
|
glfwCloseWindow(); //close GLFW window
|
||||||
|
}
|
||||||
|
|
||||||
|
glfwTerminate(); //shutdown GLFW
|
||||||
|
|
||||||
PHYSFS_deinit(); // shutdown PhysFS
|
PHYSFS_deinit(); // shutdown PhysFS
|
||||||
|
|
||||||
|
Kernel::destroy();
|
||||||
}
|
}
|
||||||
|
|
||||||
Kernel& Application::getKernel()
|
void Application::createDisplay(uint width, uint height,
|
||||||
|
uint redBits, uint greenBits, uint blueBits,
|
||||||
|
uint alphaBits, uint depthBits, uint stencilBits,
|
||||||
|
bool fullscreen, const std::string &title)
|
||||||
{
|
{
|
||||||
return kernel_;
|
GLboolean status;
|
||||||
|
status = glfwOpenWindow(width, height, redBits, greenBits,
|
||||||
|
blueBits, alphaBits, depthBits, stencilBits,
|
||||||
|
fullscreen ? GLFW_FULLSCREEN : GLFW_WINDOW);
|
||||||
|
if(status == GL_FALSE)
|
||||||
|
{
|
||||||
|
throw APIError("Failed to create display.");
|
||||||
|
}
|
||||||
|
|
||||||
|
// register the callbacks (after a window is open)
|
||||||
|
glfwSetKeyCallback(Application::keyCallback);
|
||||||
|
//glfwSetCharCallback(Application::charCallback);
|
||||||
|
glfwSetMouseButtonCallback(Application::mouseButtonCallback);
|
||||||
|
glfwSetMousePosCallback(Application::mouseMoveCallback);
|
||||||
|
//glfwSetMouseWheelCallback(Application::mouseWheelCallback);
|
||||||
|
|
||||||
|
Application::initVideoCore(width, height);
|
||||||
|
dispWidth_ = width;
|
||||||
|
dispHeight_ = height;
|
||||||
|
|
||||||
|
glfwSetWindowTitle(title.c_str()); // title is set separately
|
||||||
}
|
}
|
||||||
|
|
||||||
AppCore& Application::getAppCore()
|
void Application::createDisplay(uint width, uint height, uint bpp,
|
||||||
|
uint depthBits, uint stencilBits, bool fullscreen,
|
||||||
|
const std::string &title)
|
||||||
{
|
{
|
||||||
return appCore_;
|
// call main version of createDisplay with individual values for rgba bits
|
||||||
|
switch(bpp)
|
||||||
|
{
|
||||||
|
case 8:
|
||||||
|
createDisplay(width, height, 3, 3, 2, 0, depthBits, stencilBits,
|
||||||
|
fullscreen, title);
|
||||||
|
break;
|
||||||
|
case 16:
|
||||||
|
createDisplay(width, height, 5, 6, 5, 0, depthBits, stencilBits,
|
||||||
|
fullscreen, title);
|
||||||
|
break;
|
||||||
|
case 24:
|
||||||
|
createDisplay(width, height, 8, 8, 8, 0, depthBits, stencilBits,
|
||||||
|
fullscreen, title);
|
||||||
|
break;
|
||||||
|
case 32:
|
||||||
|
createDisplay(width, height, 8, 8, 8, 8, depthBits, stencilBits,
|
||||||
|
fullscreen, title);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
throw ArgumentException("bpp argument of createDisplay must be "
|
||||||
|
"8,16,24, or 32, passed " +
|
||||||
|
boost::lexical_cast<std::string>(bpp) );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
bool Application::keyPressed(KeyCode key)
|
||||||
|
{
|
||||||
|
return glfwGetKey(key) == GLFW_PRESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::vector<KeyCode> Application::getPressedKeys()
|
||||||
|
{
|
||||||
|
return pressedKeys_;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool Application::mouseButtonPressed(MouseButton button)
|
||||||
|
{
|
||||||
|
return glfwGetMouseButton(button) == GLFW_PRESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
int Application::getMouseX()
|
||||||
|
{
|
||||||
|
return updateTask_->mouseX_;
|
||||||
|
}
|
||||||
|
|
||||||
|
int Application::getMouseY()
|
||||||
|
{
|
||||||
|
return updateTask_->mouseY_;
|
||||||
|
}
|
||||||
|
|
||||||
|
int Application::getMouseWheelPos()
|
||||||
|
{
|
||||||
|
return glfwGetMouseWheel();
|
||||||
|
}
|
||||||
|
|
||||||
|
void Application::addInputListener(InputListener *listener)
|
||||||
|
{
|
||||||
|
// should never happen since listeners add themselves with a this pointer
|
||||||
|
if(!listener)
|
||||||
|
{
|
||||||
|
throw ArgumentException("Null pointer in "
|
||||||
|
"Application::addInputListener");
|
||||||
|
}
|
||||||
|
|
||||||
|
// add the listener
|
||||||
|
listeners_.push_back(listener);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Application::removeInputListener(InputListener *listener)
|
||||||
|
{
|
||||||
|
// should never happen since listeners remove themselves with a this pointer
|
||||||
|
if(!listener)
|
||||||
|
{
|
||||||
|
throw ArgumentException("Null pointer in "
|
||||||
|
"Application::removeInputListener");
|
||||||
|
}
|
||||||
|
|
||||||
|
// find and erase the listener
|
||||||
|
std::vector<InputListener*>::iterator it;
|
||||||
|
it = std::find(listeners_.begin(), listeners_.end(), listener);
|
||||||
|
|
||||||
|
if(it != listeners_.end())
|
||||||
|
{
|
||||||
|
listeners_.erase(it);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void GLFWCALL Application::keyCallback(int key, int action)
|
||||||
|
{
|
||||||
|
// notify all listeners
|
||||||
|
for(std::vector<InputListener*>::iterator listener = listeners_.begin();
|
||||||
|
listener != listeners_.end();
|
||||||
|
++listener)
|
||||||
|
{
|
||||||
|
// only active listeners get messages
|
||||||
|
if((*listener)->isActive())
|
||||||
|
{
|
||||||
|
if(action == GLFW_PRESS)
|
||||||
|
{
|
||||||
|
(*listener)->onKeyPress(key);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
(*listener)->onKeyRelease(key);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// maintain a list of pressed keys
|
||||||
|
if(action == GLFW_PRESS)
|
||||||
|
{
|
||||||
|
pressedKeys_.push_back(static_cast<KeyCode>(key));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// delete a key from the vector
|
||||||
|
std::vector<KeyCode>::iterator it;
|
||||||
|
it = std::find(pressedKeys_.begin(), pressedKeys_.end(), key);
|
||||||
|
|
||||||
|
if(it != pressedKeys_.end())
|
||||||
|
{
|
||||||
|
pressedKeys_.erase(it);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void GLFWCALL Application::mouseButtonCallback(int button, int action)
|
||||||
|
{
|
||||||
|
// notify all listeners
|
||||||
|
for(std::vector<InputListener*>::iterator listener = listeners_.begin();
|
||||||
|
listener != listeners_.end();
|
||||||
|
++listener)
|
||||||
|
{
|
||||||
|
// only active listeners get messages
|
||||||
|
if((*listener)->isActive())
|
||||||
|
{
|
||||||
|
if(action == GLFW_PRESS)
|
||||||
|
{
|
||||||
|
(*listener)->onMouseButtonPress(button);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
(*listener)->onMouseButtonRelease(button);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void GLFWCALL Application::mouseMoveCallback(int x, int y)
|
||||||
|
{
|
||||||
|
// notify all listeners
|
||||||
|
for(std::vector<InputListener*>::iterator listener = listeners_.begin();
|
||||||
|
listener != listeners_.end();
|
||||||
|
++listener)
|
||||||
|
{
|
||||||
|
// only active listeners get messages
|
||||||
|
if((*listener)->isActive())
|
||||||
|
{
|
||||||
|
(*listener)->onMouseMove(math::Vector2(static_cast<scalar>(x),
|
||||||
|
static_cast<scalar>(y)));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
scalar Application::getTime()
|
||||||
|
{
|
||||||
|
return glfwGetTime() - updateTask_->pausedTime_;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Application::setTitle(const std::string& title)
|
||||||
|
{
|
||||||
|
glfwSetWindowTitle(title.c_str());
|
||||||
}
|
}
|
||||||
|
|
||||||
video::VideoCore& Application::getVideoCore()
|
video::VideoCore& Application::getVideoCore()
|
||||||
@ -105,18 +318,155 @@ void Application::initAudioCore(const std::string& deviceName)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void Application::setInitOptions(const char* arg0)
|
bool Application::isActive()
|
||||||
{
|
{
|
||||||
arg0_ = arg0;
|
return updateTask_->active_;
|
||||||
}
|
}
|
||||||
|
|
||||||
util::VersionInfo Application::initPhysFS()
|
bool Application::isRunning()
|
||||||
|
{
|
||||||
|
return !updateTask_->quitRequested_;
|
||||||
|
}
|
||||||
|
|
||||||
|
double Application::getElapsedTime()
|
||||||
|
{
|
||||||
|
return updateTask_->secPerFrame_;
|
||||||
|
}
|
||||||
|
|
||||||
|
double Application::getFramerate()
|
||||||
|
{
|
||||||
|
return 1/updateTask_->secPerFrame_;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Application::unregisterState(const std::string& stateName)
|
||||||
|
{
|
||||||
|
StateMap::iterator it( stateMap_.find(stateName) );
|
||||||
|
|
||||||
|
if(it == stateMap_.end())
|
||||||
|
{
|
||||||
|
throw PreconditionException("Application::unregisterState called with "
|
||||||
|
"non-existant state name: \"" + stateName + "\"");
|
||||||
|
}
|
||||||
|
|
||||||
|
stateMap_.erase(stateName);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Application::setCurrentState(const std::string& stateName)
|
||||||
|
{
|
||||||
|
StateMap::iterator it( stateMap_.find(stateName) );
|
||||||
|
|
||||||
|
if(it == stateMap_.end())
|
||||||
|
{
|
||||||
|
throw PreconditionException("Application::setCurrentState called with "
|
||||||
|
"non-existant state name: \"" + stateName + "\"");
|
||||||
|
}
|
||||||
|
|
||||||
|
if(stateUpdate_->state_.get() != 0)
|
||||||
|
{
|
||||||
|
stateUpdate_->state_->exitState();
|
||||||
|
}
|
||||||
|
|
||||||
|
stateRender_->state_ = stateUpdate_->state_ = stateMap_[stateName];
|
||||||
|
stateUpdate_->state_->enterState();
|
||||||
|
}
|
||||||
|
|
||||||
|
uint Application::getDisplayWidth()
|
||||||
|
{
|
||||||
|
return dispWidth_;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint Application::getDisplayHeight()
|
||||||
|
{
|
||||||
|
return dispHeight_;
|
||||||
|
}
|
||||||
|
|
||||||
|
util::VersionInfo Application::initPhysFS(const std::string& arg0)
|
||||||
{
|
{
|
||||||
PHYSFS_Version ver;
|
PHYSFS_Version ver;
|
||||||
PHYSFS_init(arg0_.c_str());
|
PHYSFS_init(arg0.c_str());
|
||||||
PHYSFS_addToSearchPath(PHYSFS_getBaseDir(),0);
|
PHYSFS_addToSearchPath(PHYSFS_getBaseDir(),0);
|
||||||
PHYSFS_getLinkedVersion(&ver);
|
PHYSFS_getLinkedVersion(&ver);
|
||||||
return util::VersionInfo(ver.major, ver.minor, ver.patch);
|
return util::VersionInfo(ver.major, ver.minor, ver.patch);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
util::VersionInfo Application::initGLFW()
|
||||||
|
{
|
||||||
|
int maj,min,patch;
|
||||||
|
if(glfwInit() == GL_FALSE)
|
||||||
|
{
|
||||||
|
throw APIError("Initialization of GLFW failed!");
|
||||||
|
}
|
||||||
|
glfwGetVersion(&maj,&min,&patch);
|
||||||
|
return util::VersionInfo(maj,min,patch);
|
||||||
|
}
|
||||||
|
|
||||||
|
Application::UpdateTask::UpdateTask() :
|
||||||
|
Task("Application::UpdateTask", PRI_APP_UPDATE),
|
||||||
|
mouseX_(0), mouseY_(0),
|
||||||
|
active_(false), timerPaused_(false),
|
||||||
|
unpauseOnActive_(false), lastPause_(0), pausedTime_(0),
|
||||||
|
secPerFrame_(0), lastUpdate_(0),
|
||||||
|
quitRequested_(false)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
void Application::UpdateTask::update()
|
||||||
|
{
|
||||||
|
scalar curTime = glfwGetTime() - pausedTime_;
|
||||||
|
|
||||||
|
// update the display here instead of VideoCore (since it belongs to glfw)
|
||||||
|
glfwSwapBuffers();
|
||||||
|
|
||||||
|
glfwGetMousePos(&mouseX_, &mouseY_);
|
||||||
|
|
||||||
|
// 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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Application::StateUpdate::StateUpdate() :
|
||||||
|
Task("StateUpdate", PRI_NORMAL)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
void Application::StateUpdate::update()
|
||||||
|
{
|
||||||
|
state_->update();
|
||||||
|
}
|
||||||
|
|
||||||
|
Application::StateRender::StateRender() :
|
||||||
|
Task("StateRender", PRI_RENDER)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
void Application::StateRender::update()
|
||||||
|
{
|
||||||
|
state_->render();
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -5,11 +5,11 @@
|
|||||||
// James Turk (jpt2433@rit.edu)
|
// James Turk (jpt2433@rit.edu)
|
||||||
//
|
//
|
||||||
// Version:
|
// Version:
|
||||||
// $Id: InputListener.cpp,v 1.1 2005/07/19 05:45:24 cozman Exp $
|
// $Id: InputListener.cpp,v 1.2 2005/08/07 07:12:47 cozman Exp $
|
||||||
|
|
||||||
#include "InputListener.hpp"
|
#include "InputListener.hpp"
|
||||||
|
|
||||||
#include "AppCore.hpp"
|
#include "Application.hpp"
|
||||||
|
|
||||||
namespace photon
|
namespace photon
|
||||||
{
|
{
|
||||||
@ -17,12 +17,12 @@ namespace photon
|
|||||||
InputListener::InputListener() :
|
InputListener::InputListener() :
|
||||||
active_(true)
|
active_(true)
|
||||||
{
|
{
|
||||||
AppCore::addInputListener(this);
|
Application::addInputListener(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
InputListener::~InputListener()
|
InputListener::~InputListener()
|
||||||
{
|
{
|
||||||
AppCore::removeInputListener(this);
|
Application::removeInputListener(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
void InputListener::setActive(bool active)
|
void InputListener::setActive(bool active)
|
||||||
|
@ -5,7 +5,7 @@
|
|||||||
// James Turk (jpt2433@rit.edu)
|
// James Turk (jpt2433@rit.edu)
|
||||||
//
|
//
|
||||||
// Version:
|
// Version:
|
||||||
// $Id: Kernel.cpp,v 1.3 2005/07/20 06:12:54 cozman Exp $
|
// $Id: Kernel.cpp,v 1.4 2005/08/07 07:12:47 cozman Exp $
|
||||||
|
|
||||||
#include "Kernel.hpp"
|
#include "Kernel.hpp"
|
||||||
|
|
||||||
@ -22,13 +22,11 @@ Kernel::Kernel()
|
|||||||
|
|
||||||
Kernel::~Kernel()
|
Kernel::~Kernel()
|
||||||
{
|
{
|
||||||
|
killAllTasks();
|
||||||
}
|
}
|
||||||
|
|
||||||
void Kernel::run()
|
void Kernel::step()
|
||||||
{
|
{
|
||||||
// loop on activeTasks
|
|
||||||
while(!tasks_.empty())
|
|
||||||
{
|
|
||||||
std::list<TaskPtr>::iterator it;
|
std::list<TaskPtr>::iterator it;
|
||||||
|
|
||||||
// loop through active tasks, updating each one
|
// loop through active tasks, updating each one
|
||||||
@ -59,6 +57,14 @@ void Kernel::run()
|
|||||||
++it; //advance iterator, if not deleting
|
++it; //advance iterator, if not deleting
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void Kernel::run()
|
||||||
|
{
|
||||||
|
// loop on activeTasks
|
||||||
|
while(!tasks_.empty())
|
||||||
|
{
|
||||||
|
step();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -5,14 +5,14 @@
|
|||||||
// James Turk (jpt2433@rit.edu)
|
// James Turk (jpt2433@rit.edu)
|
||||||
//
|
//
|
||||||
// Version:
|
// Version:
|
||||||
// $Id: Task.cpp,v 1.3 2005/07/20 06:12:54 cozman Exp $
|
// $Id: Task.cpp,v 1.4 2005/08/07 07:12:47 cozman Exp $
|
||||||
|
|
||||||
#include "Task.hpp"
|
#include "Task.hpp"
|
||||||
|
|
||||||
namespace photon
|
namespace photon
|
||||||
{
|
{
|
||||||
|
|
||||||
Task::Task(const std::string& name, uint priority) :
|
Task::Task(const std::string& name, PriorityLevel priority) :
|
||||||
name_(name), priority_(priority), alive_(true), paused_(false)
|
name_(name), priority_(priority), alive_(true), paused_(false)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
@ -5,7 +5,7 @@
|
|||||||
// James Turk (jpt2433@rit.edu)
|
// James Turk (jpt2433@rit.edu)
|
||||||
//
|
//
|
||||||
// Version:
|
// Version:
|
||||||
// $Id: Timer.cpp,v 1.4 2005/08/02 23:07:52 cozman Exp $
|
// $Id: Timer.cpp,v 1.5 2005/08/07 07:12:48 cozman Exp $
|
||||||
|
|
||||||
#include "util/Timer.hpp"
|
#include "util/Timer.hpp"
|
||||||
#include "Application.hpp"
|
#include "Application.hpp"
|
||||||
@ -16,7 +16,6 @@ namespace util
|
|||||||
{
|
{
|
||||||
|
|
||||||
Timer::Timer(bool appTimeLinked) :
|
Timer::Timer(bool appTimeLinked) :
|
||||||
appCore_(Application::getAppCore()),
|
|
||||||
appTimeLinked_(appTimeLinked)
|
appTimeLinked_(appTimeLinked)
|
||||||
{
|
{
|
||||||
reset(); //initializes other members
|
reset(); //initializes other members
|
||||||
@ -74,7 +73,8 @@ double Timer::getTimeInternal() const
|
|||||||
{
|
{
|
||||||
if(appTimeLinked_)
|
if(appTimeLinked_)
|
||||||
{
|
{
|
||||||
return appCore_.getTime(); // get from AppCore timer if linked
|
// get from Application timer if linked
|
||||||
|
return Application::getInstance().getTime();
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -5,7 +5,7 @@
|
|||||||
// James Turk (jpt2433@rit.edu)
|
// James Turk (jpt2433@rit.edu)
|
||||||
//
|
//
|
||||||
// Version:
|
// Version:
|
||||||
// $Id: VideoCore.cpp,v 1.9 2005/08/02 23:07:53 cozman Exp $
|
// $Id: VideoCore.cpp,v 1.10 2005/08/07 07:12:48 cozman Exp $
|
||||||
|
|
||||||
#include "video/VideoCore.hpp"
|
#include "video/VideoCore.hpp"
|
||||||
|
|
||||||
@ -29,7 +29,7 @@ VideoCore::VideoCore(uint width, uint height) :
|
|||||||
setOrthoView();
|
setOrthoView();
|
||||||
|
|
||||||
//add updater task
|
//add updater task
|
||||||
Application::getKernel().addTask(shared_ptr<Task>(new UpdateTask()));
|
Kernel::getInstance().addTask(shared_ptr<Task>(new UpdateTask()));
|
||||||
}
|
}
|
||||||
|
|
||||||
VideoCore::~VideoCore()
|
VideoCore::~VideoCore()
|
||||||
@ -114,8 +114,8 @@ void VideoCore::initOpenGL()
|
|||||||
glShadeModel(GL_SMOOTH);
|
glShadeModel(GL_SMOOTH);
|
||||||
|
|
||||||
// Setup depth checking.
|
// Setup depth checking.
|
||||||
glDepthFunc(GL_LEQUAL);
|
//glDepthFunc(GL_LEQUAL);
|
||||||
glEnable(GL_DEPTH_TEST);
|
//glEnable(GL_DEPTH_TEST);
|
||||||
|
|
||||||
//setup hints
|
//setup hints
|
||||||
glHint(GL_PERSPECTIVE_CORRECTION_HINT,GL_NICEST);
|
glHint(GL_PERSPECTIVE_CORRECTION_HINT,GL_NICEST);
|
||||||
@ -148,7 +148,7 @@ uint VideoCore::getDisplayHeight()
|
|||||||
}
|
}
|
||||||
|
|
||||||
VideoCore::UpdateTask::UpdateTask() :
|
VideoCore::UpdateTask::UpdateTask() :
|
||||||
Task("VideoCore::UpdateTask", 20)
|
Task("VideoCore::UpdateTask", PRI_VIDEO_UPDATE)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -5,7 +5,7 @@
|
|||||||
// James Turk (jpt2433@rit.edu)
|
// James Turk (jpt2433@rit.edu)
|
||||||
//
|
//
|
||||||
// Version:
|
// Version:
|
||||||
// $Id: Audio_test.cpp,v 1.8 2005/08/02 23:07:53 cozman Exp $
|
// $Id: Audio_test.cpp,v 1.9 2005/08/07 07:12:48 cozman Exp $
|
||||||
|
|
||||||
#include "photon.hpp"
|
#include "photon.hpp"
|
||||||
using namespace photon;
|
using namespace photon;
|
||||||
|
@ -11,8 +11,8 @@ class FPSDisplayTask : public photon::Task
|
|||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
FPSDisplayTask() :
|
FPSDisplayTask() :
|
||||||
Task("FPSDisplayTask", 1000000), // extremely low priority
|
Task("FPSDisplayTask"),
|
||||||
app(photon::Application::getAppCore()),
|
app(Application::getInstance()),
|
||||||
lastUpdate(0)
|
lastUpdate(0)
|
||||||
{ }
|
{ }
|
||||||
|
|
||||||
@ -28,7 +28,7 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
photon::AppCore& app;
|
Application& app;
|
||||||
double lastUpdate;
|
double lastUpdate;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -5,23 +5,24 @@
|
|||||||
// James Turk (jpt2433@rit.edu)
|
// James Turk (jpt2433@rit.edu)
|
||||||
//
|
//
|
||||||
// Version:
|
// Version:
|
||||||
// $Id: Image_test.cpp,v 1.8 2005/08/02 23:07:53 cozman Exp $
|
// $Id: Image_test.cpp,v 1.9 2005/08/07 07:12:48 cozman Exp $
|
||||||
|
|
||||||
#include "photon.hpp"
|
#include "photon.hpp"
|
||||||
using namespace photon;
|
using namespace photon;
|
||||||
#include "FPSDisplayTask.hpp" // used to display FPS in title bar
|
#include "FPSDisplayTask.hpp" // used to display FPS in title bar
|
||||||
|
|
||||||
class MainTask : public Task
|
|
||||||
|
|
||||||
|
class MainState : public State
|
||||||
{
|
{
|
||||||
|
|
||||||
public:
|
public:
|
||||||
MainTask() :
|
MainState() :
|
||||||
Task("MainTask"),
|
app(Application::getInstance())
|
||||||
app(Application::getAppCore()),
|
{ }
|
||||||
video(Application::getVideoCore())
|
|
||||||
{
|
|
||||||
video.setOrthoView(800,600);
|
|
||||||
|
|
||||||
|
void enterState()
|
||||||
|
{
|
||||||
// load the images
|
// load the images
|
||||||
video::Image::addResource("data/icon.png");
|
video::Image::addResource("data/icon.png");
|
||||||
video::Texture::addResource("robo","data/robo.png");
|
video::Texture::addResource("robo","data/robo.png");
|
||||||
@ -40,6 +41,10 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
void update()
|
void update()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
void render()
|
||||||
{
|
{
|
||||||
// draw in top left corner
|
// draw in top left corner
|
||||||
img[0].draw(0,0);
|
img[0].draw(0,0);
|
||||||
@ -57,27 +62,21 @@ public:
|
|||||||
private:
|
private:
|
||||||
video::Image img[3];
|
video::Image img[3];
|
||||||
|
|
||||||
AppCore& app;
|
Application& app;
|
||||||
video::VideoCore& video;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
// standard application, creates window, registers task and runs
|
int PhotonMain(const StrVec& args)
|
||||||
class ImageTest : public Application
|
|
||||||
{
|
{
|
||||||
public:
|
Application::getInstance().createDisplay(800,600,32,0,0,true);
|
||||||
|
|
||||||
int main(const StrVec& args)
|
|
||||||
{
|
|
||||||
Application::getAppCore().createDisplay(800,600,32,0,0,false);
|
|
||||||
|
|
||||||
// be sure to add FPSDisplayTask
|
// be sure to add FPSDisplayTask
|
||||||
Application::getKernel().addTask(TaskPtr(new FPSDisplayTask()));
|
Kernel::getInstance().addTask(TaskPtr(new FPSDisplayTask()));
|
||||||
Application::getKernel().addTask(TaskPtr(new MainTask()));
|
|
||||||
|
|
||||||
Application::getKernel().run();
|
Application::getInstance().registerState<MainState>("main");
|
||||||
|
Application::getInstance().setCurrentState("main");
|
||||||
|
|
||||||
|
Kernel::getInstance().run();
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
};
|
|
||||||
|
|
||||||
ENTRYPOINT(ImageTest)
|
|
||||||
|
Loading…
Reference in New Issue
Block a user