mirror of
https://github.com/mkxp-z/mkxp-z.git
synced 2025-09-10 12:02:53 +02:00
Update plane/window dirty flags when deserializing save states in libretro builds
This commit is contained in:
parent
56c711f1c1
commit
6ddc8c6ce4
5 changed files with 175 additions and 26 deletions
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Add table
Reference in a new issue