Update plane/window dirty flags when deserializing save states in libretro builds

This commit is contained in:
刘皓 2025-05-29 21:54:11 -04:00
parent 56c711f1c1
commit 6ddc8c6ce4
No known key found for this signature in database
GPG key ID: 7901753DB465B711
5 changed files with 175 additions and 26 deletions

View file

@ -474,10 +474,34 @@ template <> bool mkxp_sandbox::sandbox_serialize(const Quad &value, void *&data,
}
template <> bool mkxp_sandbox::sandbox_deserialize(Quad &value, const void *&data, wasm_size_t &max_size) {
if (!sandbox_deserialize(value.vert[0], data, max_size)) return false;
if (!sandbox_deserialize(value.vert[1], data, max_size)) return false;
if (!sandbox_deserialize(value.vert[2], data, max_size)) return false;
if (!sandbox_deserialize(value.vert[3], data, max_size)) return false;
{
Vertex old_vert = value.vert[0];
if (!sandbox_deserialize(value.vert[0], data, max_size)) return false;
if (value.vert[0].pos != old_vert.pos || value.vert[0].texPos != old_vert.texPos || value.vert[0].color != old_vert.color) {
value.vboDirty = true;
}
}
{
Vertex old_vert = value.vert[1];
if (!sandbox_deserialize(value.vert[1], data, max_size)) return false;
if (value.vert[1].pos != old_vert.pos || value.vert[1].texPos != old_vert.texPos || value.vert[1].color != old_vert.color) {
value.vboDirty = true;
}
}
{
Vertex old_vert = value.vert[2];
if (!sandbox_deserialize(value.vert[2], data, max_size)) return false;
if (value.vert[2].pos != old_vert.pos || value.vert[2].texPos != old_vert.texPos || value.vert[2].color != old_vert.color) {
value.vboDirty = true;
}
}
{
Vertex old_vert = value.vert[3];
if (!sandbox_deserialize(value.vert[3], data, max_size)) return false;
if (value.vert[3].pos != old_vert.pos || value.vert[3].texPos != old_vert.texPos || value.vert[3].color != old_vert.color) {
value.vboDirty = true;
}
}
return true;
}

View file

@ -360,7 +360,6 @@ bool Plane::sandbox_serialize(void *&data, mkxp_sandbox::wasm_size_t &max_size)
if (!mkxp_sandbox::sandbox_serialize(p->zoomX, data, max_size)) return false;
if (!mkxp_sandbox::sandbox_serialize(p->zoomY, data, max_size)) return false;
if (!mkxp_sandbox::sandbox_serialize(p->sceneGeo, data, max_size)) return false;
if (!mkxp_sandbox::sandbox_serialize(p->quadSourceDirty, data, max_size)) return false;
if (!mkxp_sandbox::sandbox_serialize(p->qArray, data, max_size)) return false;
if (!sandbox_serialize_viewport_element(data, max_size)) return false;
if (!mkxp_sandbox::sandbox_serialize(p->bitmap, data, max_size)) return false;
@ -374,12 +373,41 @@ bool Plane::sandbox_deserialize(const void *&data, mkxp_sandbox::wasm_size_t &ma
{
if (!mkxp_sandbox::sandbox_deserialize(p->opacity, data, max_size)) return false;
if (!mkxp_sandbox::sandbox_deserialize(p->blendType, data, max_size)) return false;
if (!mkxp_sandbox::sandbox_deserialize((int32_t &)p->ox, data, max_size)) return false;
if (!mkxp_sandbox::sandbox_deserialize((int32_t &)p->oy, data, max_size)) return false;
if (!mkxp_sandbox::sandbox_deserialize(p->zoomX, data, max_size)) return false;
if (!mkxp_sandbox::sandbox_deserialize(p->zoomY, data, max_size)) return false;
if (!mkxp_sandbox::sandbox_deserialize(p->sceneGeo, data, max_size)) return false;
if (!mkxp_sandbox::sandbox_deserialize(p->quadSourceDirty, data, max_size)) return false;
{
int32_t value = (int32_t)p->ox;
if (!mkxp_sandbox::sandbox_deserialize((int32_t &)p->ox, data, max_size)) return false;
if ((int32_t)p->ox != value) {
p->quadSourceDirty = true;
}
}
{
int32_t value = (int32_t)p->oy;
if (!mkxp_sandbox::sandbox_deserialize((int32_t &)p->oy, data, max_size)) return false;
if ((int32_t)p->oy != value) {
p->quadSourceDirty = true;
}
}
{
int32_t value = (int32_t)p->zoomX;
if (!mkxp_sandbox::sandbox_deserialize((int32_t &)p->zoomX, data, max_size)) return false;
if ((int32_t)p->zoomX != value) {
p->quadSourceDirty = true;
}
}
{
int32_t value = (int32_t)p->zoomY;
if (!mkxp_sandbox::sandbox_deserialize((int32_t &)p->zoomY, data, max_size)) return false;
if ((int32_t)p->zoomY != value) {
p->quadSourceDirty = true;
}
}
{
Scene::Geometry old_geo = p->sceneGeo;
if (!mkxp_sandbox::sandbox_deserialize(p->sceneGeo, data, max_size)) return false;
if (p->sceneGeo != old_geo) {
p->quadSourceDirty = true;
}
}
if (!mkxp_sandbox::sandbox_deserialize(p->qArray, data, max_size)) return false;
if (!sandbox_deserialize_viewport_element(data, max_size)) return false;
if (!mkxp_sandbox::sandbox_deserialize(p->bitmap, data, max_size)) return false;

View file

@ -985,15 +985,45 @@ bool Window::sandbox_serialize(void *&data, mkxp_sandbox::wasm_size_t &max_size)
bool Window::sandbox_deserialize(const void *&data, mkxp_sandbox::wasm_size_t &max_size)
{
if (!mkxp_sandbox::sandbox_deserialize(p->bgStretch, data, max_size)) return false;
{
bool value = p->bgStretch;
if (!mkxp_sandbox::sandbox_deserialize(p->bgStretch, data, max_size)) return false;
if (p->bgStretch != value) {
p->baseVertDirty = true;
}
}
if (!mkxp_sandbox::sandbox_deserialize(p->active, data, max_size)) return false;
if (!mkxp_sandbox::sandbox_deserialize(p->pause, data, max_size)) return false;
if (!mkxp_sandbox::sandbox_deserialize(p->sceneOffset, data, max_size)) return false;
if (!mkxp_sandbox::sandbox_deserialize(p->position, data, max_size)) return false;
if (!mkxp_sandbox::sandbox_deserialize(p->size, data, max_size)) return false;
if (!mkxp_sandbox::sandbox_deserialize(p->contentsOffset, data, max_size)) return false;
if (!mkxp_sandbox::sandbox_deserialize(p->opacity, data, max_size)) return false;
if (!mkxp_sandbox::sandbox_deserialize(p->backOpacity, data, max_size)) return false;
{
Vec2i value = p->size;
if (!mkxp_sandbox::sandbox_deserialize(p->size, data, max_size)) return false;
if (p->size != value) {
p->baseVertDirty = true;
}
}
{
Vec2i value = p->contentsOffset;
if (!mkxp_sandbox::sandbox_deserialize(p->contentsOffset, data, max_size)) return false;
if (p->contentsOffset != value) {
p->controlsVertDirty = true;
}
}
{
bool value = p->opacity;
if (!mkxp_sandbox::sandbox_deserialize(p->opacity, data, max_size)) return false;
if (p->opacity != value) {
p->opacityDirty = true;
}
}
{
bool value = p->backOpacity;
if (!mkxp_sandbox::sandbox_deserialize(p->backOpacity, data, max_size)) return false;
if (p->backOpacity != value) {
p->opacityDirty = true;
}
}
if (!mkxp_sandbox::sandbox_deserialize(p->contentsOpacity, data, max_size)) return false;
if (!mkxp_sandbox::sandbox_deserialize(p->baseQuadArray, data, max_size)) return false;
if (!mkxp_sandbox::sandbox_deserialize(p->useBaseTex, data, max_size)) return false;

View file

@ -189,6 +189,10 @@ struct WindowVXPrivate
NormValue openness;
Tone *tone;
#ifdef MKXPZ_RETRO
uint64_t deserSavedWindowskinId;
uint64_t deserSavedContentsId;
#endif // MKXPZ_RETRO
sigslot::connection cursorRectCon;
#ifdef MKXPZ_RETRO
Rect deserSavedCursorRect;
@ -1175,8 +1179,6 @@ bool WindowVX::sandbox_serialize(void *&data, mkxp_sandbox::wasm_size_t &max_siz
if (!mkxp_sandbox::sandbox_serialize(p->active, data, max_size)) return false;
if (!mkxp_sandbox::sandbox_serialize(p->arrowsVisible, data, max_size)) return false;
if (!mkxp_sandbox::sandbox_serialize(p->pause, data, max_size)) return false;
if (!mkxp_sandbox::sandbox_serialize((int32_t)p->width, data, max_size)) return false;
if (!mkxp_sandbox::sandbox_serialize((int32_t)p->height, data, max_size)) return false;
if (!mkxp_sandbox::sandbox_serialize(p->geo, data, max_size)) return false;
if (!mkxp_sandbox::sandbox_serialize(p->contentsOff, data, max_size)) return false;
if (!mkxp_sandbox::sandbox_serialize((int32_t)p->padding, data, max_size)) return false;
@ -1206,16 +1208,57 @@ bool WindowVX::sandbox_serialize(void *&data, mkxp_sandbox::wasm_size_t &max_siz
bool WindowVX::sandbox_deserialize(const void *&data, mkxp_sandbox::wasm_size_t &max_size)
{
if (!mkxp_sandbox::sandbox_deserialize(p->active, data, max_size)) return false;
if (!mkxp_sandbox::sandbox_deserialize(p->arrowsVisible, data, max_size)) return false;
if (!mkxp_sandbox::sandbox_deserialize(p->pause, data, max_size)) return false;
if (!mkxp_sandbox::sandbox_deserialize((int32_t &)p->width, data, max_size)) return false;
if (!mkxp_sandbox::sandbox_deserialize((int32_t &)p->height, data, max_size)) return false;
if (!mkxp_sandbox::sandbox_deserialize(p->geo, data, max_size)) return false;
{
bool value = p->arrowsVisible;
if (!mkxp_sandbox::sandbox_deserialize(p->arrowsVisible, data, max_size)) return false;
if (p->arrowsVisible != value) {
p->ctrlVertDirty = true;
}
}
{
bool value = p->pause;
if (!mkxp_sandbox::sandbox_deserialize(p->pause, data, max_size)) return false;
if (p->pause != value) {
p->ctrlVertDirty = true;
}
}
{
IntRect value = p->geo;
if (!mkxp_sandbox::sandbox_deserialize(p->geo, data, max_size)) return false;
if (p->geo.size() != value.size()) {
p->base.vertDirty = true;
p->base.texSizeDirty = true;
p->clipRectDirty = true;
p->ctrlVertDirty = true;
} else if (p->geo.pos() != value.pos()) {
p->ctrlVertDirty = true;
}
p->width = p->geo.w;
p->height = p->geo.h;
}
if (!mkxp_sandbox::sandbox_deserialize(p->contentsOff, data, max_size)) return false;
if (!mkxp_sandbox::sandbox_deserialize((int32_t &)p->padding, data, max_size)) return false;
if (!mkxp_sandbox::sandbox_deserialize((int32_t &)p->paddingBottom, data, max_size)) return false;
{
int32_t value = (int32_t)p->padding;
if (!mkxp_sandbox::sandbox_deserialize((int32_t &)p->padding, data, max_size)) return false;
if ((int32_t)p->padding != value) {
p->clipRectDirty = true;
}
}
{
int32_t value = (int32_t)p->paddingBottom;
if (!mkxp_sandbox::sandbox_deserialize((int32_t &)p->paddingBottom, data, max_size)) return false;
if ((int32_t)p->paddingBottom != value) {
p->clipRectDirty = true;
}
}
if (!mkxp_sandbox::sandbox_deserialize(p->opacity, data, max_size)) return false;
if (!mkxp_sandbox::sandbox_deserialize(p->backOpacity, data, max_size)) return false;
{
NormValue value = p->backOpacity;
if (!mkxp_sandbox::sandbox_deserialize(p->backOpacity, data, max_size)) return false;
if (p->backOpacity != value) {
p->base.texDirty = true;
}
}
if (!mkxp_sandbox::sandbox_deserialize(p->contentsOpacity, data, max_size)) return false;
if (!mkxp_sandbox::sandbox_deserialize(p->openness, data, max_size)) return false;
if (!mkxp_sandbox::sandbox_deserialize(p->ctrlVert, data, max_size)) return false;
@ -1246,6 +1289,10 @@ void WindowVX::sandbox_deserialize_begin()
p->contentsDispCon.disconnect();
p->deserSavedContentsId = p->contents == nullptr ? 0 : p->contents->id;
p->deserSavedWindowskinId = p->windowskin == nullptr ? 0 : p->windowskin->id;
p->cursorRectCon.disconnect();
if (p->cursorRect != nullptr) {
p->deserSavedCursorRect = *p->cursorRect;
@ -1281,6 +1328,16 @@ void WindowVX::sandbox_deserialize_end()
}
}
if (isDisposed()) return;
if (p->windowskin != nullptr && (p->windowskin->deserModified || p->windowskin->id != p->deserSavedWindowskinId)) {
p->invalidateBaseTex();
}
if (isDisposed()) return;
if (p->contents != nullptr && (p->contents->deserModified || p->contents->id != p->deserSavedContentsId)) {
p->ctrlVertDirty = true;
}
if (isDisposed()) return;
if (p->cursorRect != nullptr) {
p->cursorRectCon = p->cursorRect->valueChanged.connect(&WindowVXPrivate::invalidateCursorVert, p);

View file

@ -54,6 +54,11 @@ struct Vec2
{
return (x == other.x && y == other.y);
}
bool operator!=(const Vec2 &other) const
{
return !(*this == other);
}
};
struct Vec4
@ -73,6 +78,11 @@ struct Vec4
return (x == other.x && y == other.y && z == other.z && w == other.w);
}
bool operator!=(const Vec4 &other) const
{
return !(*this == other);
}
bool xyzNotNull() const
{
return (x != 0.0f || y != 0.0f || z != 0.0f);