Files
source/Ja2/Fade Screen.cpp
majcostaandGitHub ae55496e39 Move main executable source to its own directory (#248)
* Move main executable files to their own directory

* Adapt the build to the new file structure

... and fix some weird #include's that were relying on the project root
being an include directory.
2023-10-23 15:46:51 -03:00

697 lines
14 KiB
C++

#include "sgp.h"
#include "screenids.h"
#include "Timer Control.h"
#include "sys globals.h"
#include "fade screen.h"
#include "sysutil.h"
#include "vobject_blitters.h"
#include "cursor control.h"
#include "music control.h"
#include "Render Dirty.h"
#include "gameloop.h"
#define SQUARE_STEP 8
extern UINT32 guiExitScreen; // symbol already declared globally in laptop.cpp (jonathanl)
BOOLEAN gfFadeInitialized = FALSE;
INT8 gbFadeValue;
INT16 gsFadeLimit;
UINT32 guiTime;
UINT32 guiFadeDelay;
BOOLEAN gfFirstTimeInFade = FALSE;
INT16 gsFadeCount;
INT8 gbFadeType;
// BOOLEAN gfFadeIn; // duplicate def (jonathanl)
INT32 giX1, giX2, giY1, giY2;
INT16 gsFadeRealCount;
BOOLEAN gfFadeInVideo;
// unused
//UINT32 uiOldMusicMode;
FADE_FUNCTION gFadeFunction = NULL;
FADE_HOOK gFadeInDoneCallback = NULL;
FADE_HOOK gFadeOutDoneCallback = NULL;
void FadeFrameBufferSquare( );
void FadeFrameBufferVersionOne( );
void FadeFrameBufferVersionFaster( INT8 bFadeValue );
void FadeFrameBufferSide( );
void FadeFrameBufferRealFade( );
void FadeInBackBufferVersionOne( );
void FadeInBackBufferSquare( );
void FadeInFrameBufferRealFade( );
extern BOOLEAN ShadowVideoSurfaceRectUsingLowPercentTable( UINT32 uiDestVSurface, INT32 X1, INT32 Y1, INT32 X2, INT32 Y2);
BOOLEAN UpdateSaveBufferWithBackbuffer( void );
BOOLEAN gfFadeIn = FALSE;
BOOLEAN gfFadeOut = FALSE;
BOOLEAN gfFadeOutDone = FALSE;
BOOLEAN gfFadeInDone = FALSE;
void FadeInNextFrame( )
{
gfFadeIn = TRUE;
gfFadeInDone = FALSE;
}
void FadeOutNextFrame( )
{
gfFadeOut = TRUE;
gfFadeOutDone = FALSE;
}
BOOLEAN HandleBeginFadeIn( UINT32 uiScreenExit )
{
if ( gfFadeIn )
{
BeginFade( uiScreenExit, 35, FADE_IN_REALFADE, 5 );
gfFadeIn = FALSE;
gfFadeInDone = TRUE;
return( TRUE );
}
return( FALSE );
}
BOOLEAN HandleBeginFadeOut( UINT32 uiScreenExit )
{
if ( gfFadeOut )
{
BeginFade( uiScreenExit, 35, FADE_OUT_REALFADE, 5 );
gfFadeOut = FALSE;
gfFadeOutDone = TRUE;
return( TRUE );
}
return( FALSE );
}
BOOLEAN HandleFadeOutCallback( )
{
if ( gfFadeOutDone )
{
gfFadeOutDone = FALSE;
if ( gFadeOutDoneCallback != NULL )
{
gFadeOutDoneCallback( );
gFadeOutDoneCallback = NULL;
return( TRUE );
}
}
return( FALSE );
}
BOOLEAN HandleFadeInCallback( )
{
if ( gfFadeInDone )
{
gfFadeInDone = FALSE;
if ( gFadeInDoneCallback != NULL )
{
gFadeInDoneCallback( );
}
gFadeInDoneCallback = NULL;
return( TRUE );
}
return( FALSE );
}
void BeginFade( UINT32 uiExitScreen, INT8 bFadeValue, INT8 bType, UINT32 uiDelay )
{
//Init some paramters
guiExitScreen = uiExitScreen;
gbFadeValue = bFadeValue;
guiFadeDelay = uiDelay;
gfFadeIn = FALSE;
gfFadeInVideo = TRUE;
// unused
//uiOldMusicMode = uiMusicHandle;
// Calculate step;
switch ( bType )
{
case FADE_IN_REALFADE:
gsFadeRealCount = -1;
gsFadeLimit = 8;
gFadeFunction = (FADE_FUNCTION)FadeInFrameBufferRealFade;
gfFadeInVideo = FALSE;
// Copy backbuffer to savebuffer
UpdateSaveBufferWithBackbuffer( );
// Clear framebuffer
ColorFillVideoSurfaceArea( FRAME_BUFFER, 0, 0, SCREEN_WIDTH, SCREEN_HEIGHT, Get16BPPColor( FROMRGB( 0, 0, 0 ) ) );
break;
case FADE_OUT_REALFADE:
gsFadeRealCount = -1;
gsFadeLimit = 10;
gFadeFunction = (FADE_FUNCTION)FadeFrameBufferRealFade;
gfFadeInVideo = FALSE;
// Clear framebuffer
//ColorFillVideoSurfaceArea( FRAME_BUFFER, 0, 0, SCREEN_WIDTH, SCREEN_HEIGHT, Get16BPPColor( FROMRGB( 0, 0, 0 ) ) );
break;
case FADE_OUT_VERSION_ONE:
//gsFadeLimit = 255 / bFadeValue;
//gFadeFunction = (FADE_FUNCTION)FadeFrameBufferVersionOne;
//SetMusicFadeSpeed( 25 );
//SetMusicMode( MUSIC_NONE );
break;
case FADE_OUT_SQUARE:
gsFadeLimit = (SCREEN_WIDTH / ( SQUARE_STEP * 2 ) );
giX1 = 0;
giX2 = SCREEN_WIDTH;
giY1 = 0;
giY2 = SCREEN_HEIGHT;
gFadeFunction = (FADE_FUNCTION)FadeFrameBufferSquare;
// Zero frame buffer
ColorFillVideoSurfaceArea( FRAME_BUFFER, 0, 0, SCREEN_WIDTH, SCREEN_HEIGHT, Get16BPPColor( FROMRGB( 0, 0, 0 ) ) );
//ColorFillVideoSurfaceArea( guiSAVEBUFFER, 0, 0, SCREEN_WIDTH, SCREEN_HEIGHT, Get16BPPColor( FROMRGB( 0, 0, 0 ) ) );
// SetMusicFadeSpeed( 25 );
//SetMusicMode( MUSIC_NONE );
break;
case FADE_IN_VERSION_ONE:
gsFadeLimit = 255 / bFadeValue;
gFadeFunction = (FADE_FUNCTION)FadeInBackBufferVersionOne;
break;
case FADE_IN_SQUARE:
gFadeFunction = (FADE_FUNCTION)FadeInBackBufferSquare;
giX1 = SCREEN_WIDTH/2;
giX2 = SCREEN_WIDTH/2;
giY1 = SCREEN_HEIGHT/2;
giY2 = SCREEN_HEIGHT/2;
gsFadeLimit = (SCREEN_WIDTH / ( SQUARE_STEP * 2 ) );
gfFadeIn = TRUE;
break;
case FADE_OUT_VERSION_FASTER:
gsFadeLimit = (255 / bFadeValue) * 2;
gFadeFunction = (FADE_FUNCTION)FadeFrameBufferVersionFaster;
//SetMusicFadeSpeed( 25 );
//SetMusicMode( MUSIC_NONE );
break;
case FADE_OUT_VERSION_SIDE:
// Copy frame buffer to save buffer
gsFadeLimit = (SCREEN_WIDTH / 8 );
gFadeFunction = (FADE_FUNCTION)FadeFrameBufferSide;
//SetMusicFadeSpeed( 25 );
//SetMusicMode( MUSIC_NONE );
break;
}
gfFadeInitialized = TRUE;
gfFirstTimeInFade = TRUE;
gsFadeCount = 0;
gbFadeType = bType;
SetPendingNewScreen(FADE_SCREEN);
}
UINT32 FadeScreenInit( )
{
return( TRUE );
}
UINT32 FadeScreenHandle( )
{
UINT32 uiTime;
if ( !gfFadeInitialized )
{
SET_ERROR( "Fade Screen called but not intialized " );
return( ERROR_SCREEN );
}
// ATE: Remove cursor
SetCurrentCursorFromDatabase( VIDEO_NO_CURSOR );
if ( gfFirstTimeInFade )
{
gfFirstTimeInFade = FALSE;
// Calcuate delay
guiTime = GetJA2Clock( );
}
// Get time
uiTime = GetJA2Clock( );
MusicPoll( TRUE );
if ( ( uiTime - guiTime ) > guiFadeDelay )
{
// Fade!
if ( !gfFadeIn )
{
//gFadeFunction( );
}
InvalidateScreen();
if ( !gfFadeInVideo )
{
gFadeFunction( );
}
gsFadeCount++;
if ( gsFadeCount > gsFadeLimit )
{
switch( gbFadeType )
{
case FADE_OUT_REALFADE:
// Clear framebuffer
ColorFillVideoSurfaceArea( FRAME_BUFFER, 0, 0, SCREEN_WIDTH, SCREEN_HEIGHT, Get16BPPColor( FROMRGB( 0, 0, 0 ) ) );
break;
}
//End!
gfFadeInitialized = FALSE;
gfFadeIn = FALSE;
return( guiExitScreen );
}
}
return( FADE_SCREEN );
}
UINT32 FadeScreenShutdown( )
{
return( FALSE );
}
void FadeFrameBufferVersionOne( )
{
INT32 cX, cY;
UINT32 uiDestPitchBYTES;
UINT16 *pBuf;
INT16 bR, bG, bB;
UINT32 uiRGBColor;
UINT16 s16BPPSrc;
pBuf = (UINT16*)LockVideoSurface(FRAME_BUFFER, &uiDestPitchBYTES);
// LOCK FRAME BUFFER
for ( cX = 0; cX < SCREEN_WIDTH; cX++ )
{
for ( cY = 0; cY < SCREEN_HEIGHT; cY++ )
{
s16BPPSrc = pBuf[ ( cY * 640 ) + cX ];
uiRGBColor = GetRGBColor( s16BPPSrc );
bR = SGPGetRValue( uiRGBColor );
bG = SGPGetGValue( uiRGBColor );
bB = SGPGetBValue( uiRGBColor );
// Fade down
bR -= gbFadeValue;
if ( bR < 0 )
bR = 0;
bG -= gbFadeValue;
if ( bG < 0 )
bG = 0;
bB -= gbFadeValue;
if ( bB < 0 )
bB = 0;
// Set back info buffer
pBuf[ ( cY * SCREEN_WIDTH ) + cX ] = Get16BPPColor( FROMRGB( bR, bG, bB ) );
}
}
UnLockVideoSurface(FRAME_BUFFER);
}
void FadeInBackBufferVersionOne( )
{
INT32 cX, cY;
UINT32 uiDestPitchBYTES, uiSrcPitchBYTES;
UINT16 *pSrcBuf, *pDestBuf;
INT16 bR, bG, bB;
UINT32 uiRGBColor;
UINT16 s16BPPSrc;
INT16 bFadeVal = ( gsFadeLimit - gsFadeCount ) * gbFadeValue;
pDestBuf = (UINT16*)LockVideoSurface(BACKBUFFER, &uiDestPitchBYTES);
pSrcBuf = (UINT16*)LockVideoSurface(FRAME_BUFFER, &uiSrcPitchBYTES);
// LOCK FRAME BUFFER
for ( cX = 0; cX < SCREEN_WIDTH; cX++ )
{
for ( cY = 0; cY < SCREEN_HEIGHT; cY++ )
{
s16BPPSrc = pSrcBuf[ ( cY * SCREEN_WIDTH ) + cX ];
uiRGBColor = GetRGBColor( s16BPPSrc );
bR = SGPGetRValue( uiRGBColor );
bG = SGPGetGValue( uiRGBColor );
bB = SGPGetBValue( uiRGBColor );
// Fade down
bR -= bFadeVal;
if ( bR < 0 )
bR = 0;
bG -= bFadeVal;
if ( bG < 0 )
bG = 0;
bB -= bFadeVal;
if ( bB < 0 )
bB = 0;
// Set back info dest buffer
pDestBuf[ ( cY * SCREEN_WIDTH ) + cX ] = Get16BPPColor( FROMRGB( bR, bG, bB ) );
}
}
UnLockVideoSurface(FRAME_BUFFER);
UnLockVideoSurface(BACKBUFFER);
}
void FadeFrameBufferVersionFaster( INT8 bFadeValue )
{
INT32 cX, cY, iStartX, iStartY;
UINT32 uiDestPitchBYTES;
UINT16 *pBuf;
INT16 bR, bG, bB;
UINT32 uiRGBColor;
UINT16 s16BPPSrc;
pBuf = (UINT16*)LockVideoSurface(FRAME_BUFFER, &uiDestPitchBYTES);
iStartX = gsFadeCount % 2;
iStartY = 0;
// LOCK FRAME BUFFER
for ( cX = iStartX; cX < SCREEN_WIDTH; cX+= 2 )
{
if ( iStartX == 1 )
{
iStartX = 0;
}
else
{
iStartX = 1;
}
for ( cY = iStartY; cY < SCREEN_HEIGHT; cY++ )
{
s16BPPSrc = pBuf[ ( cY * SCREEN_WIDTH ) + cX ];
uiRGBColor = GetRGBColor( s16BPPSrc );
bR = SGPGetRValue( uiRGBColor );
bG = SGPGetGValue( uiRGBColor );
bB = SGPGetBValue( uiRGBColor );
// Fade down
bR -= bFadeValue;
if ( bR < 0 )
bR = 0;
bG -= bFadeValue;
if ( bG < 0 )
bG = 0;
bB -= bFadeValue;
if ( bB < 0 )
bB = 0;
// Set back info buffer
pBuf[ ( cY * SCREEN_WIDTH ) + cX ] = Get16BPPColor( FROMRGB( bR, bG, bB ) );
}
}
UnLockVideoSurface(FRAME_BUFFER);
}
void FadeFrameBufferSide( )
{
INT32 iX1, iX2;
INT16 sFadeMove;
sFadeMove = gsFadeCount * 4;
iX1 = 0;
iX2 = sFadeMove;
ColorFillVideoSurfaceArea( FRAME_BUFFER, iX1, 0, iX2, SCREEN_HEIGHT, Get16BPPColor( FROMRGB( 0, 0, 0 ) ) );
iX1 = 640 - sFadeMove;
iX2 = 640;
ColorFillVideoSurfaceArea( FRAME_BUFFER, iX1, 0, iX2, SCREEN_HEIGHT, Get16BPPColor( FROMRGB( 0, 0, 0 ) ) );
}
void FadeFrameBufferSquare( )
{
INT32 iX1, iX2, iY1, iY2;
INT16 sFadeXMove, sFadeYMove;
sFadeXMove = SQUARE_STEP;
sFadeYMove = (INT16)(sFadeXMove * .75);
iX1 = giX1;
iX2 = giX1 + sFadeXMove;
iY1 = giY1;
iY2 = giY1 + sFadeYMove;
ColorFillVideoSurfaceArea( BACKBUFFER, iX1, 0, iX2, SCREEN_HEIGHT, Get16BPPColor( FROMRGB( 0, 0, 0 ) ) );
ColorFillVideoSurfaceArea( BACKBUFFER, 0, iY1, SCREEN_WIDTH, iY2, Get16BPPColor( FROMRGB( 0, 0, 0 ) ) );
iX1 = giX2 - sFadeXMove;
iX2 = giX2;
iY1 = giY2 - sFadeYMove;
iY2 = giY2;
ColorFillVideoSurfaceArea( BACKBUFFER, iX1, 0, iX2, SCREEN_HEIGHT, Get16BPPColor( FROMRGB( 0, 0, 0 ) ) );
ColorFillVideoSurfaceArea( BACKBUFFER, 0, iY1, SCREEN_WIDTH, iY2, Get16BPPColor( FROMRGB( 0, 0, 0 ) ) );
giX1 += sFadeXMove;
giX2 -= sFadeXMove;
giY1 += sFadeYMove;
giY2 -= sFadeYMove;
}
void FadeInBackBufferSquare( )
{
INT32 iX1, iX2, iY1, iY2;
INT16 sFadeXMove, sFadeYMove;
blt_vs_fx BltFx;
sFadeXMove = SQUARE_STEP;
sFadeYMove = (INT16)(sFadeXMove * .75);
if ( gsFadeCount == 0 )
{
ColorFillVideoSurfaceArea( BACKBUFFER, 0, 0, SCREEN_WIDTH, SCREEN_HEIGHT, Get16BPPColor( FROMRGB( 0, 0, 0 ) ) );
}
iX1 = giX1 - sFadeXMove;
iX2 = giX1;
iY1 = giY1 - sFadeYMove;
iY2 = giY2 + sFadeYMove;
BltFx.SrcRect.iLeft = iX1;
BltFx.SrcRect.iTop = iY1;
BltFx.SrcRect.iRight = iX2;
BltFx.SrcRect.iBottom = iY2;
if ( BltFx.SrcRect.iRight != BltFx.SrcRect.iLeft )
{
BltVideoSurface( BACKBUFFER, FRAME_BUFFER, 0,
iX1, iY1,
VS_BLT_SRCSUBRECT, &BltFx );
}
iX1 = giX2;
iX2 = giX2 + sFadeXMove;
iY1 = giY1 - sFadeYMove;
iY2 = giY2 + sFadeYMove;
BltFx.SrcRect.iLeft = iX1;
BltFx.SrcRect.iTop = iY1;
BltFx.SrcRect.iRight = iX2;
BltFx.SrcRect.iBottom = iY2;
if ( BltFx.SrcRect.iRight != BltFx.SrcRect.iLeft )
{
BltVideoSurface( BACKBUFFER, FRAME_BUFFER, 0,
iX1, iY1,
VS_BLT_SRCSUBRECT, &BltFx );
}
iX1 = giX1;
iX2 = giX2;
iY1 = giY1 - sFadeYMove;
iY2 = giY1;
BltFx.SrcRect.iLeft = iX1;
BltFx.SrcRect.iTop = iY1;
BltFx.SrcRect.iRight = iX2;
BltFx.SrcRect.iBottom = iY2;
if ( BltFx.SrcRect.iBottom != BltFx.SrcRect.iTop )
{
BltVideoSurface( BACKBUFFER, FRAME_BUFFER, 0,
iX1, iY1,
VS_BLT_SRCSUBRECT, &BltFx );
}
iX1 = giX1;
iX2 = giX2;
iY1 = giY2;
iY2 = giY2 + sFadeYMove;
BltFx.SrcRect.iLeft = iX1;
BltFx.SrcRect.iTop = iY1;
BltFx.SrcRect.iRight = iX2;
BltFx.SrcRect.iBottom = iY2;
if ( BltFx.SrcRect.iBottom != BltFx.SrcRect.iTop )
{
BltVideoSurface( BACKBUFFER, FRAME_BUFFER, 0,
iX1, iY1,
VS_BLT_SRCSUBRECT, &BltFx );
}
giX1 -= sFadeXMove;
giX2 += sFadeXMove;
giY1 -= sFadeYMove;
giY2 += sFadeYMove;
}
void FadeFrameBufferRealFade( )
{
if ( gsFadeRealCount != gsFadeCount )
{
ShadowVideoSurfaceRectUsingLowPercentTable( FRAME_BUFFER, 0, 0, SCREEN_WIDTH, SCREEN_HEIGHT );
gsFadeRealCount = gsFadeCount;
}
}
void FadeInFrameBufferRealFade( )
{
INT32 cnt;
if ( gsFadeRealCount != gsFadeCount )
{
for ( cnt = 0; cnt < ( gsFadeLimit - gsFadeCount ); cnt++ )
{
ShadowVideoSurfaceRectUsingLowPercentTable( FRAME_BUFFER, 0, 0, SCREEN_WIDTH, SCREEN_HEIGHT );
}
// Refresh Screen
RefreshScreen( NULL );
// Copy save buffer back
RestoreExternBackgroundRect( 0, 0, SCREEN_WIDTH, SCREEN_HEIGHT );
gsFadeRealCount = gsFadeCount;
}
}
BOOLEAN UpdateSaveBufferWithBackbuffer(void)
{
UINT32 uiDestPitchBYTES, uiSrcPitchBYTES;
UINT8 *pDestBuf, *pSrcBuf;
UINT16 usWidth, usHeight;
UINT8 ubBitDepth;
// Update saved buffer - do for the viewport size ony!
GetCurrentVideoSettings( &usWidth, &usHeight, &ubBitDepth );
pSrcBuf = LockVideoSurface(FRAME_BUFFER, &uiSrcPitchBYTES);
pDestBuf = LockVideoSurface(guiSAVEBUFFER, &uiDestPitchBYTES);
if(gbPixelDepth==16)
{
// BLIT HERE
Blt16BPPTo16BPP((UINT16 *)pDestBuf, uiDestPitchBYTES,
(UINT16 *)pSrcBuf, uiSrcPitchBYTES,
0, 0, 0, 0, SCREEN_WIDTH, SCREEN_HEIGHT );
}
UnLockVideoSurface(FRAME_BUFFER);
UnLockVideoSurface(guiSAVEBUFFER);
return(TRUE);
}