This repository has been archived on 2025-03-20. You can view files and clone it, but cannot push or open issues or pull requests.
The-Powder-Toy/src/gui/interface/Engine.cpp
jacob1 9048a3c50e new lua API: platform
you can get current OS / build information, exe name, restart tpt, open a link in the web browser, and use clipboard copy/paste functions

Also remove some older Platform.h file which wasn't really needed or used
2015-08-31 23:33:40 -04:00

289 lines
4.7 KiB
C++

#include <iostream>
#include <stack>
#include <cstdio>
#include <cmath>
#include "Config.h"
#include "Platform.h"
#include "gui/interface/Window.h"
#include "gui/interface/Engine.h"
#include "graphics/Graphics.h"
using namespace ui;
using namespace std;
Engine::Engine():
FpsLimit(60.0f),
Scale(1),
Fullscreen(false),
FrameIndex(0),
lastBuffer(NULL),
prevBuffers(stack<pixel*>()),
windows(stack<Window*>()),
mousePositions(stack<Point>()),
state_(NULL),
windowTargetPosition(0, 0),
break_(false),
FastQuit(1),
lastTick(0),
mouseb_(0),
mousex_(0),
mousey_(0),
mousexp_(0),
mouseyp_(0),
maxWidth(0),
maxHeight(0)
{
}
Engine::~Engine()
{
delete state_;
//Dispose of any Windows.
while(!windows.empty())
{
delete windows.top();
windows.pop();
}
free(lastBuffer);
}
void Engine::Begin(int width, int height)
{
//engine is now ready
running_ = true;
width_ = width;
height_ = height;
}
void Engine::Break()
{
break_ = true;
}
void Engine::UnBreak()
{
break_ = false;
}
void Engine::Exit()
{
running_ = false;
}
void Engine::ShowWindow(Window * window)
{
windowOpenState = 0;
if(window->Position.X==-1)
{
window->Position.X = (width_-window->Size.X)/2;
}
if(window->Position.Y==-1)
{
window->Position.Y = (height_-window->Size.Y)/2;
}
/*if(window->Position.Y > 0)
{
windowTargetPosition = window->Position;
window->Position = Point(windowTargetPosition.X, height_);
}*/
if(state_)
{
if(lastBuffer)
{
prevBuffers.push(lastBuffer);
}
lastBuffer = (pixel*)malloc((width_ * height_) * PIXELSIZE);
#ifndef OGLI
memcpy(lastBuffer, g->vid, (width_ * height_) * PIXELSIZE);
#endif
windows.push(state_);
mousePositions.push(ui::Point(mousex_, mousey_));
}
if(state_)
state_->DoBlur();
state_ = window;
}
int Engine::CloseWindow()
{
if(!windows.empty())
{
if (lastBuffer)
{
free(lastBuffer);
lastBuffer = NULL;
}
if(!prevBuffers.empty())
{
lastBuffer = prevBuffers.top();
prevBuffers.pop();
}
state_ = windows.top();
windows.pop();
if(state_)
state_->DoFocus();
ui::Point mouseState = mousePositions.top();
mousePositions.pop();
if(state_)
{
mousexp_ = mouseState.X;
mouseyp_ = mouseState.Y;
state_->DoMouseMove(mousex_, mousey_, mousex_ - mousexp_, mousey_ - mouseyp_);
mousexp_ = mousex_;
mouseyp_ = mousey_;
}
return 0;
}
else
{
state_ = NULL;
return 1;
}
}
/*void Engine::SetState(State * state)
{
if(state_) //queue if currently in a state
statequeued_ = state;
else
{
state_ = state;
if(state_)
state_->DoInitialized();
}
}*/
void Engine::SetSize(int width, int height)
{
width_ = width;
height_ = height;
}
void Engine::SetMaxSize(int width, int height)
{
maxWidth = width;
maxHeight = height;
}
void Engine::Tick()
{
if(state_ != NULL)
state_->DoTick(dt);
lastTick = Platform::GetTime();
/*if(statequeued_ != NULL)
{
if(state_ != NULL)
{
state_->DoExit();
delete state_;
state_ = NULL;
}
state_ = statequeued_;
statequeued_ = NULL;
if(state_ != NULL)
state_->DoInitialized();
}*/
}
void Engine::Draw()
{
if(lastBuffer && !(state_ && state_->Position.X == 0 && state_->Position.Y == 0 && state_->Size.X == width_ && state_->Size.Y == height_))
{
g->Acquire();
g->Clear();
#ifndef OGLI
memcpy(g->vid, lastBuffer, (width_ * height_) * PIXELSIZE);
if(windowOpenState < 20)
windowOpenState++;
g->fillrect(0, 0, width_, height_, 0, 0, 0, 255-std::pow(.98, windowOpenState)*255);
#endif
}
else
{
g->Clear();
}
if(state_)
state_->DoDraw();
g->Finalise();
g->Release();
FrameIndex++;
FrameIndex %= 7200;
}
void Engine::SetFps(float fps)
{
this->fps = fps;
if(FpsLimit > 2.0f)
this->dt = 60/fps;
else
this->dt = 1.0f;
}
void Engine::onKeyPress(int key, Uint16 character, bool shift, bool ctrl, bool alt)
{
if(state_)
state_->DoKeyPress(key, character, shift, ctrl, alt);
}
void Engine::onKeyRelease(int key, Uint16 character, bool shift, bool ctrl, bool alt)
{
if(state_)
state_->DoKeyRelease(key, character, shift, ctrl, alt);
}
void Engine::onMouseClick(int x, int y, unsigned button)
{
mouseb_ |= button;
if(state_)
state_->DoMouseDown(x, y, button);
}
void Engine::onMouseUnclick(int x, int y, unsigned button)
{
mouseb_ &= ~button;
if(state_)
state_->DoMouseUp(x, y, button);
}
void Engine::onMouseMove(int x, int y)
{
mousex_ = x;
mousey_ = y;
if(state_)
{
state_->DoMouseMove(x, y, mousex_ - mousexp_, mousey_ - mouseyp_);
}
mousexp_ = x;
mouseyp_ = y;
}
void Engine::onMouseWheel(int x, int y, int delta)
{
if(state_)
state_->DoMouseWheel(x, y, delta);
}
void Engine::onResize(int newWidth, int newHeight)
{
SetSize(newWidth, newHeight);
}
void Engine::onClose()
{
if(state_)
state_->DoExit();
}