2010-03-19 00:31:15 +00:00
|
|
|
/* ZZ Open GL graphics plugin
|
|
|
|
* Copyright (c)2009 zeydlitz@gmail.com
|
|
|
|
* Based on Zerofrog's ZeroGS KOSMOS (c)2005-2006
|
|
|
|
*
|
|
|
|
* This program is free software; you can redistribute it and/or modify
|
|
|
|
* it under the terms of the GNU General Public License as published by
|
|
|
|
* the Free Software Foundation; either version 2 of the License, or
|
|
|
|
* (at your option) any later version.
|
|
|
|
*
|
|
|
|
* This program is distributed in the hope that it will be useful,
|
|
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
* GNU General Public License for more details.
|
|
|
|
*
|
|
|
|
* You should have received a copy of the GNU General Public License
|
|
|
|
* along with this program; if not, write to the Free Software
|
|
|
|
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
|
|
|
*/
|
|
|
|
|
|
|
|
// Save and Load.
|
|
|
|
|
|
|
|
//------------------ Includes
|
|
|
|
#include "zerogs.h"
|
|
|
|
#include "targets.h"
|
|
|
|
|
2010-04-25 00:31:27 +00:00
|
|
|
//----------------------- Defines
|
2010-03-19 00:31:15 +00:00
|
|
|
|
|
|
|
#define VBSAVELIMIT ((u32)((u8*)&vb[0].nNextFrameHeight-(u8*)&vb[0]))
|
|
|
|
#define ZEROGS_SAVEVER 0xaa000005
|
|
|
|
|
|
|
|
//------------------ Variables
|
|
|
|
|
|
|
|
// Hack for save game compatible!
|
|
|
|
#ifdef _DEBUG
|
|
|
|
char *libraryNameX = "ZeroGS-Pg OpenGL (Debug) ";
|
2010-04-25 09:02:36 +00:00
|
|
|
#elif defined(ZEROGS_DEVBUILD)
|
2010-03-19 00:31:15 +00:00
|
|
|
char *libraryNameX = "ZeroGS-Pg OpenGL (Dev) ";
|
2010-04-25 09:02:36 +00:00
|
|
|
#else
|
|
|
|
char *libraryNameX = "ZeroGS Playground OpenGL ";
|
2010-03-19 00:31:15 +00:00
|
|
|
#endif
|
|
|
|
|
|
|
|
//------------------ Code
|
|
|
|
|
|
|
|
extern char *libraryName;
|
|
|
|
extern u32 s_uTex1Data[2][2], s_uClampData[2];
|
|
|
|
|
|
|
|
int ZeroGS::Save(s8* pbydata)
|
|
|
|
{
|
|
|
|
if( pbydata == NULL )
|
|
|
|
return 40 + 0x00400000 + sizeof(gs) + 2*VBSAVELIMIT + 2*sizeof(frameInfo) + 4 + 256*4;
|
|
|
|
|
|
|
|
s_RTs.ResolveAll();
|
|
|
|
s_DepthRTs.ResolveAll();
|
2010-04-25 00:31:27 +00:00
|
|
|
|
2010-03-19 00:31:15 +00:00
|
|
|
strcpy((char*)pbydata, libraryNameX);
|
|
|
|
*(u32*)(pbydata+16) = ZEROGS_SAVEVER;
|
|
|
|
pbydata += 32;
|
|
|
|
|
|
|
|
*(int*)pbydata = icurctx; pbydata += 4;
|
|
|
|
*(int*)pbydata = VBSAVELIMIT; pbydata += 4;
|
|
|
|
|
|
|
|
memcpy(pbydata, g_pbyGSMemory, 0x00400000);
|
|
|
|
pbydata += 0x00400000;
|
|
|
|
|
|
|
|
memcpy(pbydata, g_pbyGSClut, 256*4);
|
|
|
|
pbydata += 256*4;
|
|
|
|
|
|
|
|
*(int*)pbydata = sizeof(gs);
|
|
|
|
pbydata += 4;
|
|
|
|
memcpy(pbydata, &gs, sizeof(gs));
|
|
|
|
pbydata += sizeof(gs);
|
|
|
|
|
|
|
|
for(int i = 0; i < 2; ++i) {
|
|
|
|
memcpy(pbydata, &vb[i], VBSAVELIMIT);
|
|
|
|
pbydata += VBSAVELIMIT;
|
|
|
|
}
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
bool ZeroGS::Load(s8* pbydata)
|
|
|
|
{
|
|
|
|
memset(s_uTex1Data, 0, sizeof(s_uTex1Data));
|
|
|
|
memset(s_uClampData, 0, sizeof(s_uClampData));
|
|
|
|
|
|
|
|
g_nCurVBOIndex = 0;
|
|
|
|
|
|
|
|
// first 32 bytes are the id
|
|
|
|
u32 savever = *(u32*)(pbydata+16);
|
|
|
|
|
|
|
|
if( strncmp((char*)pbydata, libraryNameX, 6) == 0 && (savever == ZEROGS_SAVEVER || savever == 0xaa000004) ) {
|
|
|
|
|
|
|
|
g_MemTargs.Destroy();
|
|
|
|
|
|
|
|
GSStateReset();
|
|
|
|
pbydata += 32;
|
|
|
|
|
2010-04-25 00:31:27 +00:00
|
|
|
//int context = *(int*)pbydata;
|
2010-03-19 06:38:44 +00:00
|
|
|
pbydata += 4;
|
2010-03-19 00:31:15 +00:00
|
|
|
u32 savelimit = VBSAVELIMIT;
|
2010-04-25 00:31:27 +00:00
|
|
|
|
2010-03-19 00:31:15 +00:00
|
|
|
savelimit = *(u32*)pbydata; pbydata += 4;
|
|
|
|
|
|
|
|
memcpy(g_pbyGSMemory, pbydata, 0x00400000);
|
|
|
|
pbydata += 0x00400000;
|
|
|
|
|
|
|
|
memcpy(g_pbyGSClut, pbydata, 256*4);
|
|
|
|
pbydata += 256*4;
|
|
|
|
|
|
|
|
memset(&gs, 0, sizeof(gs));
|
|
|
|
|
|
|
|
int savedgssize;
|
|
|
|
if( savever == 0xaa000004 )
|
|
|
|
savedgssize = 0x1d0;
|
|
|
|
else {
|
|
|
|
savedgssize = *(int*)pbydata;
|
|
|
|
pbydata += 4;
|
|
|
|
}
|
|
|
|
|
|
|
|
memcpy(&gs, pbydata, savedgssize);
|
|
|
|
pbydata += savedgssize;
|
|
|
|
prim = &gs._prim[gs.prac];
|
|
|
|
|
|
|
|
vb[0].Destroy();
|
|
|
|
memcpy(&vb[0], pbydata, min(savelimit, VBSAVELIMIT));
|
|
|
|
pbydata += savelimit;
|
|
|
|
vb[0].pBufferData = NULL;
|
|
|
|
|
|
|
|
vb[1].Destroy();
|
|
|
|
memcpy(&vb[1], pbydata, min(savelimit, VBSAVELIMIT));
|
|
|
|
pbydata += savelimit;
|
|
|
|
vb[1].pBufferData = NULL;
|
|
|
|
|
|
|
|
for(int i = 0; i < 2; ++i) {
|
|
|
|
vb[i].Init(VB_BUFFERSIZE);
|
|
|
|
vb[i].bNeedZCheck = vb[i].bNeedFrameCheck = 1;
|
2010-04-25 00:31:27 +00:00
|
|
|
|
2010-03-19 00:31:15 +00:00
|
|
|
vb[i].bSyncVars = 0; vb[i].bNeedTexCheck = 1;
|
|
|
|
memset(vb[i].uCurTex0Data, 0, sizeof(vb[i].uCurTex0Data));
|
|
|
|
}
|
|
|
|
|
|
|
|
icurctx = -1;
|
2010-04-25 00:31:27 +00:00
|
|
|
|
2010-03-19 00:31:15 +00:00
|
|
|
glBindFramebufferEXT( GL_FRAMEBUFFER_EXT, s_uFramebuffer ); // switch to the backbuffer
|
|
|
|
SetFogColor(gs.fogcol);
|
|
|
|
|
|
|
|
GL_REPORT_ERRORD();
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|