2008-12-17 23:49:35 +00:00
|
|
|
#ifndef _GLWINDOW_H
|
|
|
|
#define _GLWINDOW_H
|
|
|
|
|
2009-01-06 20:54:47 +00:00
|
|
|
#include <vector>
|
2008-12-17 23:49:35 +00:00
|
|
|
#include "Common.h"
|
2009-01-05 22:51:35 +00:00
|
|
|
#include "EventHandler.h"
|
2008-12-17 23:49:35 +00:00
|
|
|
#include "Globals.h"
|
|
|
|
#include "Config.h"
|
|
|
|
#include "pluginspecs_video.h"
|
|
|
|
|
2009-01-15 11:46:09 +00:00
|
|
|
#ifdef _WIN32
|
2009-01-15 06:48:15 +00:00
|
|
|
#include <GLew/glew.h>
|
2009-01-15 11:46:09 +00:00
|
|
|
#else
|
|
|
|
#include <GL/glew.h>
|
|
|
|
#endif
|
2008-12-18 21:40:50 +00:00
|
|
|
|
2009-01-15 06:48:15 +00:00
|
|
|
#if defined(__APPLE__)
|
2008-12-18 21:40:50 +00:00
|
|
|
#include <OpenGL/gl.h>
|
|
|
|
#else
|
|
|
|
#include <GL/gl.h>
|
|
|
|
#endif
|
2009-01-06 08:30:31 +00:00
|
|
|
enum OGL_Props {
|
|
|
|
OGL_FULLSCREEN,
|
|
|
|
OGL_STRETCHTOFIT,
|
|
|
|
OGL_KEEPRATIO,
|
|
|
|
OGL_PROP_COUNT
|
|
|
|
};
|
2008-12-18 21:40:50 +00:00
|
|
|
|
2009-01-06 20:54:47 +00:00
|
|
|
struct res {
|
|
|
|
u32 x;
|
|
|
|
u32 y;
|
|
|
|
};
|
|
|
|
|
2008-12-17 23:49:35 +00:00
|
|
|
class GLWindow {
|
|
|
|
private:
|
2009-01-06 20:54:47 +00:00
|
|
|
u32 xWin, yWin; // windows size
|
|
|
|
int xOffset, yOffset; // offset in window
|
|
|
|
float xMax, yMax; // ???
|
|
|
|
u32 xRender, yRender; // render area
|
|
|
|
|
2009-01-06 08:30:31 +00:00
|
|
|
bool properties[OGL_PROP_COUNT];
|
2009-01-06 20:54:47 +00:00
|
|
|
|
|
|
|
protected:
|
|
|
|
|
2009-01-15 06:48:15 +00:00
|
|
|
EventHandler* eventHandler;
|
|
|
|
res origRes, currFullRes, currWinRes;
|
2009-01-06 20:54:47 +00:00
|
|
|
std::vector<res> fullResolutions;
|
|
|
|
std::vector<res> winResolutions;
|
|
|
|
virtual void SetRender(u32 x, u32 y) {
|
|
|
|
xRender = x;
|
|
|
|
yRender = y;
|
|
|
|
}
|
2009-01-15 06:48:15 +00:00
|
|
|
|
2009-01-06 08:30:31 +00:00
|
|
|
public:
|
2009-01-15 06:48:15 +00:00
|
|
|
|
2008-12-20 19:40:20 +00:00
|
|
|
virtual void SwapBuffers() {};
|
|
|
|
virtual void SetWindowText(const char *text) {};
|
|
|
|
virtual bool PeekMessages() {return false;};
|
2009-01-06 20:54:47 +00:00
|
|
|
virtual void Update() {};
|
2008-12-20 19:40:20 +00:00
|
|
|
virtual bool MakeCurrent() {return false;};
|
2008-12-21 21:02:43 +00:00
|
|
|
|
2009-01-06 20:54:47 +00:00
|
|
|
virtual void updateDim() {
|
2009-01-15 06:48:15 +00:00
|
|
|
if (GetProperty(OGL_FULLSCREEN))
|
2009-01-06 20:54:47 +00:00
|
|
|
SetWinSize(currFullRes.x, currFullRes.y);
|
|
|
|
else
|
|
|
|
SetWinSize(currWinRes.x, currWinRes.y);
|
2009-01-15 06:48:15 +00:00
|
|
|
|
2009-01-06 20:54:47 +00:00
|
|
|
float FactorX = 640.0f / (float)GetXwin();
|
|
|
|
float FactorY = 480.0f / (float)GetYwin();
|
|
|
|
float Max = (FactorX < FactorY) ? FactorX : FactorY;
|
2009-01-15 06:48:15 +00:00
|
|
|
|
2009-01-06 20:54:47 +00:00
|
|
|
if(GetProperty(OGL_STRETCHTOFIT)) {
|
|
|
|
SetMax(1.0f / FactorX, 1.0f / FactorY);
|
|
|
|
SetOffset(0,0);
|
|
|
|
} else {
|
|
|
|
SetMax(1.0f / Max, 1.0f / Max);
|
|
|
|
SetOffset((int)((GetXwin() - (640 * GetXmax())) / 2),
|
|
|
|
(int)((GetYwin() - (480 * GetYmax())) / 2));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2009-01-15 06:48:15 +00:00
|
|
|
void SetEventHandler(EventHandler *eh) { eventHandler = eh;}
|
|
|
|
bool GetProperty(OGL_Props prop) {return properties[prop];}
|
|
|
|
virtual bool SetProperty(OGL_Props prop, bool value)
|
2009-01-06 08:30:31 +00:00
|
|
|
{return properties[prop] = value;}
|
2009-01-06 20:54:47 +00:00
|
|
|
|
|
|
|
u32 GetXrender() {return xRender;}
|
|
|
|
u32 GetYrender() {return yRender;}
|
|
|
|
|
|
|
|
u32 GetXwin() {return xWin;}
|
|
|
|
u32 GetYwin() {return yWin;}
|
|
|
|
void SetWinSize(u32 x, u32 y) {
|
2009-01-15 06:48:15 +00:00
|
|
|
xWin = x;
|
|
|
|
yWin = y;
|
2008-12-19 13:56:53 +00:00
|
|
|
}
|
|
|
|
|
2008-12-21 21:02:43 +00:00
|
|
|
int GetYoff() {return yOffset;}
|
|
|
|
int GetXoff() {return xOffset;}
|
2008-12-19 13:56:53 +00:00
|
|
|
void SetOffset(int x, int y) {
|
|
|
|
yOffset = y;
|
|
|
|
xOffset = x;
|
|
|
|
}
|
|
|
|
|
2008-12-21 21:02:43 +00:00
|
|
|
void SetMax(float x, float y) {
|
|
|
|
yMax = y;
|
|
|
|
xMax = x;
|
|
|
|
}
|
2009-01-06 20:54:47 +00:00
|
|
|
|
2008-12-21 21:02:43 +00:00
|
|
|
float GetXmax() {return xMax;}
|
|
|
|
float GetYmax() {return yMax;}
|
2009-01-15 06:48:15 +00:00
|
|
|
|
2009-01-06 20:54:47 +00:00
|
|
|
static bool valid() { return false;}
|
|
|
|
|
|
|
|
GLWindow() {
|
2009-01-15 06:48:15 +00:00
|
|
|
|
2009-01-06 20:54:47 +00:00
|
|
|
// Load defaults
|
2009-01-15 06:48:15 +00:00
|
|
|
sscanf(g_Config.iFSResolution, "%dx%d",
|
2009-01-06 20:54:47 +00:00
|
|
|
&currFullRes.x, &currFullRes.y);
|
2009-01-15 06:48:15 +00:00
|
|
|
|
|
|
|
sscanf(g_Config.iWindowedRes, "%dx%d",
|
2009-01-06 20:54:47 +00:00
|
|
|
&currWinRes.x, &currWinRes.y);
|
|
|
|
|
|
|
|
SetProperty(OGL_FULLSCREEN, g_Config.bFullscreen);
|
|
|
|
SetProperty(OGL_STRETCHTOFIT, g_Config.bFullscreen);
|
|
|
|
SetProperty(OGL_KEEPRATIO, g_Config.bFullscreen);
|
|
|
|
|
|
|
|
updateDim();
|
|
|
|
}
|
|
|
|
|
2008-12-17 23:49:35 +00:00
|
|
|
// setResolution
|
|
|
|
// resolution iter
|
|
|
|
};
|
|
|
|
|
|
|
|
#endif
|