2023-08-13 23:20:00 +02:00
|
|
|
/*
|
|
|
|
===========================================================================
|
|
|
|
Copyright (C) 2023 the OpenMoHAA team
|
|
|
|
|
|
|
|
This file is part of OpenMoHAA source code.
|
|
|
|
|
|
|
|
OpenMoHAA source code 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.
|
|
|
|
|
|
|
|
OpenMoHAA source code 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 OpenMoHAA source code; if not, write to the Free Software
|
|
|
|
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
|
|
|
===========================================================================
|
|
|
|
*/
|
|
|
|
|
|
|
|
#include "cg_local.h"
|
|
|
|
#include "cg_archive.h"
|
2023-09-06 23:11:43 +02:00
|
|
|
#include "cg_commands.h"
|
|
|
|
#include "memarchiver.h"
|
|
|
|
#include "../qcommon/tiki.h"
|
2023-08-13 23:20:00 +02:00
|
|
|
|
|
|
|
void CG_ArchiveStuff(MemArchiver& archiver, int svsTime)
|
|
|
|
{
|
2023-09-06 23:11:43 +02:00
|
|
|
archiver.SetBaseTime(svsTime);
|
|
|
|
commandManager.ArchiveToMemory(archiver);
|
|
|
|
CG_ArchiveVSSGlobals(archiver);
|
2023-08-13 23:20:00 +02:00
|
|
|
}
|
|
|
|
|
2023-09-05 20:24:43 +02:00
|
|
|
size_t CG_SaveStateToBuffer(void** out, int svsTime)
|
2023-08-13 23:20:00 +02:00
|
|
|
{
|
2023-09-06 23:11:43 +02:00
|
|
|
MemArchiver archiver;
|
|
|
|
size_t size;
|
|
|
|
|
|
|
|
archiver.SetupForWriting(0x200000);
|
|
|
|
CG_ArchiveStuff(archiver, svsTime);
|
|
|
|
size = archiver.BufferSize();
|
|
|
|
if (size && out) {
|
|
|
|
*out = archiver.ConfiscateBuffer();
|
|
|
|
}
|
|
|
|
|
|
|
|
return size;
|
2023-08-13 23:20:00 +02:00
|
|
|
}
|
|
|
|
|
2023-09-06 23:11:43 +02:00
|
|
|
qboolean CG_LoadStateToBuffer(void* state, size_t size, int svsTime)
|
2023-08-13 23:20:00 +02:00
|
|
|
{
|
2023-09-06 23:11:43 +02:00
|
|
|
MemArchiver archiver;
|
|
|
|
|
|
|
|
archiver.SetupForReading((byte*)state, size);
|
|
|
|
CG_ArchiveStuff(archiver, svsTime);
|
|
|
|
|
|
|
|
return archiver.FinishedReading();
|
2023-08-13 23:20:00 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
void CG_ArchiveStringContainer(MemArchiver& archiver, Container<str>* container)
|
|
|
|
{
|
2023-09-06 23:11:43 +02:00
|
|
|
int num;
|
|
|
|
int i;
|
|
|
|
|
|
|
|
if (archiver.IsReading()) {
|
|
|
|
str tmp;
|
|
|
|
|
|
|
|
archiver.ArchiveInteger(&num);
|
|
|
|
container->ClearObjectList();
|
|
|
|
|
|
|
|
for (i = 0; i < num; i++) {
|
|
|
|
archiver.ArchiveString(&tmp);
|
|
|
|
container->AddObject(tmp);
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
num = container->NumObjects();
|
|
|
|
archiver.ArchiveInteger(&num);
|
|
|
|
|
|
|
|
for (i = 0; i < num; i++) {
|
2023-09-06 23:33:28 +02:00
|
|
|
str& tmp = container->ObjectAt(i + 1);
|
2023-09-06 23:11:43 +02:00
|
|
|
archiver.ArchiveString(&tmp);
|
|
|
|
}
|
|
|
|
}
|
2023-08-13 23:20:00 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
void CG_ArchiveTikiPointer(MemArchiver& archiver, dtiki_t** pTiki)
|
|
|
|
{
|
2023-09-06 23:11:43 +02:00
|
|
|
str tmp;
|
|
|
|
|
|
|
|
if (archiver.IsReading()) {
|
|
|
|
archiver.ArchiveString(&tmp);
|
|
|
|
if (tmp.length()) {
|
|
|
|
*pTiki = cgi.R_Model_GetHandle(cgi.R_RegisterModel(tmp.c_str()));
|
|
|
|
} else {
|
|
|
|
*pTiki = NULL;
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
if (*pTiki) {
|
|
|
|
tmp = (*pTiki)->name;
|
|
|
|
}
|
|
|
|
|
|
|
|
archiver.ArchiveString(&tmp);
|
|
|
|
}
|
2023-08-13 23:20:00 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
void CG_ArchiveModelHandle(MemArchiver& archiver, qhandle_t* handle)
|
|
|
|
{
|
2023-09-06 23:11:43 +02:00
|
|
|
str tmp;
|
|
|
|
|
|
|
|
if (archiver.IsReading()) {
|
|
|
|
archiver.ArchiveString(&tmp);
|
|
|
|
if (tmp.length()) {
|
|
|
|
*handle = cgi.R_RegisterModel(tmp.c_str());
|
|
|
|
} else {
|
2024-06-07 20:34:13 +02:00
|
|
|
*handle = (qhandle_t)0;
|
2023-09-06 23:11:43 +02:00
|
|
|
}
|
|
|
|
} else {
|
|
|
|
if (*handle) {
|
|
|
|
tmp = cgi.R_GetModelName(*handle);
|
|
|
|
} else {
|
|
|
|
tmp = "";
|
|
|
|
}
|
|
|
|
|
|
|
|
archiver.ArchiveString(&tmp);
|
|
|
|
}
|
2023-08-13 23:20:00 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
void CG_ArchiveShaderHandle(MemArchiver& archiver, qhandle_t* handle)
|
|
|
|
{
|
2023-09-06 23:11:43 +02:00
|
|
|
str tmp;
|
|
|
|
|
|
|
|
if (archiver.IsReading()) {
|
|
|
|
archiver.ArchiveString(&tmp);
|
|
|
|
if (tmp.length()) {
|
|
|
|
*handle = cgi.R_RegisterShader(tmp.c_str());
|
|
|
|
} else {
|
2024-06-07 20:34:13 +02:00
|
|
|
*handle = (qhandle_t)0;
|
2023-09-06 23:11:43 +02:00
|
|
|
}
|
|
|
|
} else {
|
|
|
|
if (*handle) {
|
|
|
|
tmp = cgi.R_GetShaderName(*handle);
|
|
|
|
} else {
|
|
|
|
tmp = "";
|
|
|
|
}
|
|
|
|
|
|
|
|
archiver.ArchiveString(&tmp);
|
|
|
|
}
|
2023-08-13 23:20:00 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
void CG_ArchiveRefEntity(MemArchiver& archiver, refEntity_t* ref)
|
|
|
|
{
|
2023-09-06 23:11:43 +02:00
|
|
|
archiver.ArchiveRaw(&ref->reType, sizeof(ref->reType));
|
|
|
|
archiver.ArchiveInteger(&ref->renderfx);
|
|
|
|
|
|
|
|
CG_ArchiveModelHandle(archiver, &ref->hModel);
|
|
|
|
CG_ArchiveModelHandle(archiver, &ref->hOldModel);
|
|
|
|
|
|
|
|
archiver.ArchiveVec3(ref->lightingOrigin);
|
|
|
|
archiver.ArchiveInteger(&ref->parentEntity);
|
|
|
|
archiver.ArchiveVec3(ref->axis[0]);
|
|
|
|
archiver.ArchiveVec3(ref->axis[1]);
|
|
|
|
archiver.ArchiveVec3(ref->axis[2]);
|
|
|
|
archiver.ArchiveBoolean(&ref->nonNormalizedAxes);
|
|
|
|
archiver.ArchiveVec3(ref->origin);
|
2024-07-15 23:43:37 +02:00
|
|
|
archiver.ArchiveRaw(ref->frameInfo, sizeof(ref->frameInfo));
|
2023-09-06 23:11:43 +02:00
|
|
|
archiver.ArchiveFloat(&ref->actionWeight);
|
|
|
|
archiver.ArchiveShort(&ref->wasframe);
|
|
|
|
archiver.ArchiveFloat(&ref->scale);
|
|
|
|
archiver.ArchiveVec3(ref->oldorigin);
|
|
|
|
archiver.ArchiveInteger(&ref->skinNum);
|
|
|
|
|
|
|
|
CG_ArchiveShaderHandle(archiver, &ref->customShader);
|
2024-07-15 23:43:37 +02:00
|
|
|
archiver.ArchiveRaw(ref->shaderRGBA, sizeof(ref->shaderRGBA));
|
2023-09-06 23:11:43 +02:00
|
|
|
archiver.ArchiveFloat(ref->shaderTexCoord);
|
|
|
|
archiver.ArchiveFloat(&ref->shaderTexCoord[1]);
|
|
|
|
archiver.ArchiveFloat(&ref->shaderTime);
|
|
|
|
|
|
|
|
archiver.ArchiveInteger(&ref->entityNumber);
|
|
|
|
archiver.ArchiveRaw(ref->surfaces, 32);
|
|
|
|
archiver.ArchiveFloat(ref->shader_data);
|
|
|
|
archiver.ArchiveFloat(&ref->shader_data[1]);
|
|
|
|
|
|
|
|
ref->bone_tag = NULL;
|
|
|
|
ref->bone_quat = NULL;
|
|
|
|
ref->of = NULL;
|
|
|
|
ref->nf = NULL;
|
|
|
|
|
|
|
|
CG_ArchiveTikiPointer(archiver, &ref->tiki);
|
|
|
|
|
|
|
|
archiver.ArchiveInteger(&ref->bonestart);
|
|
|
|
archiver.ArchiveInteger(&ref->morphstart);
|
|
|
|
archiver.ArchiveBoolean(&ref->hasMorph);
|
|
|
|
archiver.ArchiveFloat(&ref->radius);
|
|
|
|
archiver.ArchiveFloat(&ref->rotation);
|
2023-08-13 23:20:00 +02:00
|
|
|
}
|