From a706a41dcb9bbcf82e3097103090c259829331e5 Mon Sep 17 00:00:00 2001 From: BromBrom-Hani <190221485+brombrom-hani@users.noreply.github.com> Date: Sun, 31 May 2026 12:22:36 +0200 Subject: [PATCH 1/2] parts: impl sprite_deform for SetPartsCG --- src/parts/parts.c | 6 ++++-- src/parts/render.c | 20 +++++++++++++++++++- 2 files changed, 23 insertions(+), 3 deletions(-) diff --git a/src/parts/parts.c b/src/parts/parts.c index 5b8dd9a..22a35f6 100644 --- a/src/parts/parts.c +++ b/src/parts/parts.c @@ -1188,12 +1188,13 @@ int PE_GetDelegateIndex(int parts_no) return parts ? parts->delegate_index : -1; } -bool PE_SetPartsCG(int parts_no, struct string *cg_name, possibly_unused int sprite_deform, int state) +bool PE_SetPartsCG(int parts_no, struct string *cg_name, int sprite_deform, int state) { if (!parts_state_valid(--state)) return false; struct parts *parts = parts_get(parts_no); + parts->sprite_deform = sprite_deform; if (!cg_name || *(cg_name->text) == '\0') { parts_state_reset(&parts->states[state], PARTS_CG); parts_dirty(parts); @@ -1204,12 +1205,13 @@ bool PE_SetPartsCG(int parts_no, struct string *cg_name, possibly_unused int spr return parts_cg_set(parts, cg, cg_name); } -bool PE_SetPartsCG_by_index(int parts_no, int cg_no, possibly_unused int sprite_deform, int state) +bool PE_SetPartsCG_by_index(int parts_no, int cg_no, int sprite_deform, int state) { if (!parts_state_valid(--state)) return false; struct parts *parts = parts_get(parts_no); + parts->sprite_deform = sprite_deform; if (!cg_no) { parts_state_reset(&parts->states[state], PARTS_CG); parts_dirty(parts); diff --git a/src/parts/render.c b/src/parts/render.c index 661fd7c..82866e7 100644 --- a/src/parts/render.c +++ b/src/parts/render.c @@ -153,7 +153,25 @@ static void parts_render_cg(struct parts *parts, struct parts_common *common) glm_rotate_z(mw_transform, glm_rad(parts->local.rotation.z), mw_transform); glm_scale(mw_transform, (vec3){ parts->global.scale.x, parts->global.scale.y, 1.0 }); glm_translate(mw_transform, (vec3){ common->origin_offset.x, common->origin_offset.y, 0 }); - glm_scale(mw_transform, (vec3){ common->w, common->h, 1.0 }); + + switch (parts->sprite_deform) { + // Flip horizontally + case 1: + glm_translate(mw_transform, (vec3){ common->w, 0.0f, 0.0f }); + glm_scale(mw_transform, (vec3){ -common->w, common->h, 1.0f }); + break; + // Flip vertically + case 2: + glm_translate(mw_transform, (vec3){ 0.0f, common->h, 0.0f }); + glm_scale(mw_transform, (vec3){ common->w, -common->h, 1.0f }); + break; + default: + WARNING("Invalid sprite_deform: %d", parts->sprite_deform); + // No deform + case 0: + glm_scale(mw_transform, (vec3){ common->w, common->h, 1.0 }); + break; + } Rectangle r = common->surface_area; if (!r.w && !r.h) { From 12735d5c8c3d3aaf814b7c962d532f585ce9357e Mon Sep 17 00:00:00 2001 From: BromBrom-Hani <190221485+brombrom-hani@users.noreply.github.com> Date: Mon, 1 Jun 2026 08:32:36 +0200 Subject: [PATCH 2/2] parts: sprite_deform for SetPartsCG string index Keeps the PE_SetPartsCG_by_string_index consistent with the rest of the SetPartsCG variants --- src/parts/parts.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/parts/parts.c b/src/parts/parts.c index 22a35f6..fd8ec8f 100644 --- a/src/parts/parts.c +++ b/src/parts/parts.c @@ -1224,12 +1224,13 @@ bool PE_SetPartsCG_by_index(int parts_no, int cg_no, int sprite_deform, int stat // XXX: Rance Quest bool PE_SetPartsCG_by_string_index(int parts_no, struct string *cg_name, - possibly_unused int sprite_deform, int state) + int sprite_deform, int state) { if (!parts_state_valid(--state)) return false; struct parts *parts = parts_get(parts_no); + parts->sprite_deform = sprite_deform; if (!cg_name) { parts_state_reset(&parts->states[state], PARTS_CG); parts_dirty(parts);