1
0
mirror of https://github.com/blupi-games/planetblupi synced 2024-12-30 10:15:36 +01:00

Merge branch 'wip/fullscreen' into wip/landscape

This commit is contained in:
Mathieu Schroeter 2018-06-13 23:42:55 +02:00
commit c79961e803
7 changed files with 156 additions and 43 deletions

View File

@ -779,8 +779,16 @@ DoInit (int argc, char * argv[], bool & exit)
info.max_texture_height);
}
// Create the event manager.
g_pEvent = new CEvent;
if (g_pEvent == nullptr)
{
InitFail ("New event");
return EXIT_FAILURE;
}
// Create the main pixmap.
g_pPixmap = new CPixmap;
g_pPixmap = new CPixmap (g_pEvent);
if (g_pPixmap == nullptr)
{
InitFail ("New pixmap");
@ -994,27 +1002,18 @@ DoInit (int argc, char * argv[], bool & exit)
g_pDecor->Create (g_pSound, g_pPixmap);
g_pDecor->MapInitColors ();
// Create the event manager.
g_pEvent = new CEvent;
if (g_pEvent == nullptr)
{
InitFail ("New event");
return EXIT_FAILURE;
}
const bool zoom = g_zoom;
g_pEvent->Create (g_pPixmap, g_pDecor, g_pSound, g_pMovie);
// Load all cursors
g_pPixmap->LoadCursors (g_zoom);
g_pPixmap->LoadCursors ();
g_pPixmap->ChangeSprite (SPRITE_WAIT);
g_updateThread = new std::thread (CheckForUpdates);
if (g_bFullScreen)
g_pEvent->SetFullScreen (true);
if (!g_bFullScreen && zoom != g_zoom)
if (zoom != g_zoom)
g_pEvent->SetWindowSize (g_zoom);
g_pEvent->SetFullScreen (g_bFullScreen);
g_pEvent->ChangePhase (EV_PHASE_INTRO1);
g_bTermInit = true;

View File

@ -25,7 +25,9 @@
// clang-format off
#define _INTRO true // true for init screen
#define SCRFACTOR 16 / 9
#define SCRNUM 16
#define SCRDEN 9
#define SCRFACTOR SCRNUM / SCRDEN
#define LXLOGIC 640
#define LYLOGIC 480
#define LXIMAGE (LYLOGIC * SCRFACTOR + (LYLOGIC * SCRFACTOR) % 2) // window size

View File

@ -1697,6 +1697,12 @@ CEvent::~CEvent ()
WriteInfo (); // lit le fichier "info.blp"
}
bool
CEvent::IsDemoPlaying ()
{
return this->m_bDemoPlay;
}
// Retourne la position de la souris.
Point
@ -1717,14 +1723,6 @@ CEvent::GetMousePos ()
void
CEvent::SetFullScreen (bool bFullScreen)
{
int x, y;
SDL_GetMouseState (&x, &y);
x /= g_zoom;
y /= g_zoom;
g_zoom = 1;
SDL_SetWindowSize (g_window, LXIMAGE, LYIMAGE);
g_bFullScreen = bFullScreen;
int displayIndex = 0;
@ -1732,7 +1730,7 @@ CEvent::SetFullScreen (bool bFullScreen)
displayIndex = SDL_GetWindowDisplayIndex (g_window);
#endif /* _WIN32 */
if (g_bFullScreen)
if (g_bFullScreen && g_zoom == 2)
{
int displays = SDL_GetNumVideoDisplays ();
@ -1750,7 +1748,10 @@ CEvent::SetFullScreen (bool bFullScreen)
g_window, displayBounds[displayIndex].x, displayBounds[displayIndex].y);
}
SDL_SetWindowFullscreen (g_window, bFullScreen ? SDL_WINDOW_FULLSCREEN : 0);
SDL_SetWindowFullscreen (
g_window, bFullScreen ? (g_zoom == 1 ? SDL_WINDOW_FULLSCREEN_DESKTOP
: SDL_WINDOW_FULLSCREEN)
: 0);
SDL_SetWindowBordered (g_window, bFullScreen ? SDL_FALSE : SDL_TRUE);
SDL_SetWindowGrab (g_window, bFullScreen ? SDL_TRUE : SDL_FALSE);
@ -1759,17 +1760,14 @@ CEvent::SetFullScreen (bool bFullScreen)
g_window, SDL_WINDOWPOS_CENTERED_DISPLAY (displayIndex),
SDL_WINDOWPOS_CENTERED_DISPLAY (displayIndex));
m_pPixmap->LoadCursors (g_zoom);
m_pPixmap->LoadCursors ();
/* Force this update before otherwise the coordinates retrieved with
* the Warp SDL function are corresponding to the previous size.
*/
CEvent::PushUserEvent (EV_UPDATE);
auto coord = new SDL_Point; // Released by the event handler.
coord->x = x;
coord->y = y;
CEvent::PushUserEvent (EV_WARPMOUSE, coord);
if (g_bFullScreen)
{
Sint32 w, h;
SDL_GetWindowSize (g_window, &w, &h);
SDL_WarpMouseGlobal (w / 2, h / 2);
}
}
/**
@ -1810,6 +1808,9 @@ CEvent::SetWindowSize (Uint8 prevScale, Uint8 newScale)
int x, y;
SDL_GetMouseState (&x, &y);
if (g_bFullScreen && newScale == 2)
newScale = 1;
SDL_SetWindowSize (g_window, LXIMAGE * newScale, LYIMAGE * newScale);
int displayIndex = SDL_GetWindowDisplayIndex (g_window);
@ -1817,7 +1818,10 @@ CEvent::SetWindowSize (Uint8 prevScale, Uint8 newScale)
g_window, SDL_WINDOWPOS_CENTERED_DISPLAY (displayIndex),
SDL_WINDOWPOS_CENTERED_DISPLAY (displayIndex));
m_pPixmap->LoadCursors (newScale);
m_pPixmap->LoadCursors ();
if (prevScale == newScale)
return;
/* Force this update before otherwise the coordinates retrieved with
* the Warp SDL function are corresponding to the previous size.
@ -2178,8 +2182,8 @@ CEvent::DrawButtons ()
SetEnable (EV_BUTTON3, !g_bFullScreen);
SetEnable (EV_BUTTON4, g_bFullScreen);
SetEnable (EV_BUTTON5, !g_bFullScreen && g_zoom > 1);
SetEnable (EV_BUTTON6, !g_bFullScreen && g_zoom < 2);
SetEnable (EV_BUTTON5, g_zoom > 1);
SetEnable (EV_BUTTON6, g_zoom < 2);
SetEnable (EV_BUTTON7, g_restoreMidi && mid && ogg);
SetEnable (EV_BUTTON8, !g_restoreMidi && mid && ogg);
@ -4233,10 +4237,16 @@ CEvent::ChangeButtons (Sint32 message)
SetLanguage ();
break;
case EV_BUTTON3:
{
auto zoom = g_zoom;
g_zoom = 1;
SetFullScreen (true);
SetWindowSize (zoom, 1);
break;
}
case EV_BUTTON4:
SetFullScreen (false);
SetWindowSize (g_zoom, g_zoom);
break;
case EV_BUTTON5:
{
@ -4244,6 +4254,7 @@ CEvent::ChangeButtons (Sint32 message)
if (g_zoom > 1)
--g_zoom;
SetWindowSize (scale, g_zoom);
SetFullScreen (g_bFullScreen);
break;
}
case EV_BUTTON6:
@ -4252,6 +4263,7 @@ CEvent::ChangeButtons (Sint32 message)
if (g_zoom < 2)
++g_zoom;
SetWindowSize (scale, g_zoom);
SetFullScreen (g_bFullScreen);
break;
}
case EV_BUTTON7:
@ -5282,7 +5294,8 @@ CEvent::DemoStep ()
pos.y = event.motion.y;
}
SDL_WarpMouseInWindow (g_window, pos.x * g_zoom, pos.y * g_zoom);
this->m_pPixmap->FromGameToDisplay (pos.x, pos.y);
SDL_WarpMouseInWindow (g_window, pos.x, pos.y);
}
if (m_pDemoBuffer)
@ -5334,6 +5347,7 @@ CEvent::DemoRecEvent (const SDL_Event & event)
demoEvent.button = event.button.button;
demoEvent.x = event.button.x;
demoEvent.y = event.button.y;
this->m_pPixmap->FromDisplayToGame (demoEvent.x, demoEvent.y);
break;
case SDL_MOUSEMOTION:
@ -5341,6 +5355,7 @@ CEvent::DemoRecEvent (const SDL_Event & event)
demoEvent.time = m_demoTime;
demoEvent.x = event.motion.x;
demoEvent.y = event.motion.y;
this->m_pPixmap->FromDisplayToGame (demoEvent.x, demoEvent.y);
break;
default:

View File

@ -94,6 +94,7 @@ public:
CEvent ();
~CEvent ();
bool IsDemoPlaying ();
Point GetMousePos ();
void
Create (CPixmap * pPixmap, CDecor * pDecor, CSound * pSound, CMovie * pMovie);

View File

@ -185,7 +185,9 @@ CMenu::Create (
pos = m_pos;
pos.x += DIMBUTTONX / 2;
pos.y += DIMBUTTONY / 2;
SDL_WarpMouseInWindow (g_window, pos.x * g_zoom, pos.y * g_zoom);
this->m_pPixmap->FromGameToDisplay (pos.x, pos.y);
SDL_WarpMouseInWindow (g_window, pos.x, pos.y);
}
m_selRank = Detect (pos);

View File

@ -33,6 +33,7 @@
#include "blupi.h"
#include "def.h"
#include "event.h"
#include "misc.h"
#include "pixmap.h"
@ -40,7 +41,7 @@
// Constructeur.
CPixmap::CPixmap ()
CPixmap::CPixmap (CEvent * event)
{
Sint32 i;
@ -56,6 +57,8 @@ CPixmap::CPixmap ()
m_lpSDLCursors[i] = nullptr;
m_lpCurrentCursor = nullptr;
this->mainTexture = nullptr;
this->event = event;
}
// Destructeur.
@ -83,6 +86,9 @@ CPixmap::~CPixmap ()
if (m_lpSDLBlupi)
SDL_FreeSurface (m_lpSDLBlupi);
if (this->mainTexture)
SDL_DestroyTexture (this->mainTexture);
}
// Cr�e l'objet DirectDraw principal.
@ -118,8 +124,25 @@ CPixmap::BltFast (Sint32 dstCh, size_t srcCh, Rect dstR, Rect srcR)
if (dstCh < 0)
{
if (!this->mainTexture && g_bFullScreen && g_zoom == 1)
{
SDL_SetHint (SDL_HINT_RENDER_SCALE_QUALITY, "best");
this->mainTexture = SDL_CreateTexture (
g_renderer, SDL_PIXELFORMAT_RGBA32, SDL_TEXTUREACCESS_TARGET, LXIMAGE,
LYIMAGE);
SDL_SetHint (SDL_HINT_RENDER_SCALE_QUALITY, "nearest");
}
else if (this->mainTexture && !(g_bFullScreen && g_zoom == 1))
{
SDL_DestroyTexture (this->mainTexture);
this->mainTexture = nullptr;
}
SDL_SetRenderTarget (g_renderer, this->mainTexture);
res = SDL_RenderCopy (
g_renderer, m_SDLTextureInfo[srcCh].texture, &srcRect, &dstRect);
SDL_SetRenderTarget (g_renderer, nullptr);
}
else
{
@ -711,6 +734,10 @@ bool
CPixmap::Display ()
{
m_bBackDisplayed = true;
if (this->mainTexture)
SDL_RenderCopy (g_renderer, this->mainTexture, nullptr, nullptr);
SDL_RenderPresent (g_renderer);
return true;
}
@ -881,7 +908,7 @@ CPixmap::GetCursorRect (MouseSprites sprite)
}
void
CPixmap::LoadCursors (Uint8 scale)
CPixmap::LoadCursors ()
{
Uint32 rmask, gmask, bmask, amask;
@ -899,6 +926,8 @@ on the endianness (byte order) of the machine */
amask = 0xff000000;
#endif
auto scale = this->GetDisplayScale ();
for (int i = SPRITE_BEGIN; i <= SPRITE_END; ++i)
{
MouseSprites sprite = static_cast<MouseSprites> (i);
@ -929,3 +958,58 @@ CPixmap::ChangeSprite (MouseSprites sprite)
SDL_SetCursor (m_lpSDLCursors[sprite - 1]);
m_lpCurrentCursor = m_lpSDLCursors[sprite - 1];
}
double
CPixmap::GetDisplayScale ()
{
// SDL_DisplayMode displayMode;
// SDL_GetWindowDisplayMode (g_window, &displayMode);
Sint32 w, h;
SDL_GetWindowSize (g_window, &w, &h);
return static_cast<double> (h / LYIMAGE);
}
void
CPixmap::FromDisplayToGame (Sint32 & x, Sint32 & y)
{
if (this->event->IsDemoPlaying ())
return;
SDL_DisplayMode displayMode;
SDL_GetWindowDisplayMode (g_window, &displayMode);
if (
static_cast<double> (displayMode.w) / displayMode.h ==
static_cast<double> (SCRNUM) / SCRDEN)
return;
double w = displayMode.w, h = displayMode.h;
double ratio = w * SCRDEN / SCRNUM;
x = (x - (w - ratio) / 2) / (ratio / LXIMAGE);
y = y / (h / LYIMAGE);
}
void
CPixmap::FromGameToDisplay (Sint32 & x, Sint32 & y)
{
Sint32 w, h;
SDL_GetWindowSize (g_window, &w, &h);
double factor = 1;
if (!g_bFullScreen)
factor = g_zoom;
x *= factor;
y *= factor;
if (static_cast<double> (w) / h == static_cast<double> (SCRNUM) / SCRDEN)
return;
double _w = w, _h = h;
double ratio = w * SCRDEN / SCRNUM;
x = x * ratio / LXIMAGE + (_w - ratio) / 2;
y = y * _h / LYIMAGE;
}

View File

@ -47,6 +47,8 @@ struct TextureInfo {
}
};
class CEvent;
class CPixmap
{
public:
@ -55,7 +57,7 @@ public:
EXPAND,
};
CPixmap ();
CPixmap (CEvent * event);
~CPixmap ();
bool Create (Point dim);
@ -88,9 +90,14 @@ public:
void SetMouseSprite (MouseSprites sprite);
void MouseShow (bool bShow);
void LoadCursors (Uint8 scale);
void LoadCursors ();
void ChangeSprite (MouseSprites sprite);
public:
double GetDisplayScale ();
void FromDisplayToGame (Sint32 & x, Sint32 & y);
void FromGameToDisplay (Sint32 & x, Sint32 & y);
protected:
Sint32 BltFast (Sint32 dstCh, size_t srcCh, Rect dstR, Rect srcR);
Sint32 BltFast (Sint32 chDst, size_t channel, Point dst, Rect rcRect);
@ -111,8 +118,11 @@ protected:
MouseSprites m_mouseSprite;
bool m_bBackDisplayed;
CEvent * event;
SDL_Cursor * m_lpCurrentCursor;
SDL_Cursor * m_lpSDLCursors[MAXCURSORS];
SDL_Surface * m_lpSDLBlupi;
SDL_Texture * mainTexture;
std::unordered_map<size_t, TextureInfo> m_SDLTextureInfo;
};