From 461eca1a850d91b92ba7691ecf78ba04c275de47 Mon Sep 17 00:00:00 2001 From: kichikuou Date: Mon, 14 Sep 2026 07:47:59 +0900 Subject: [PATCH] parts: Inherit alpha clipper from parent parts Move alpha_clipper_parts_no into inherited part parameters so child parts use their parent's clipper unless they explicitly override it. Bump the save version to 7. --- src/parts/debug.c | 2 +- src/parts/parts.c | 8 ++++++-- src/parts/parts_internal.h | 2 +- src/parts/render.c | 13 ++++++++----- src/parts/save.c | 16 +++++++++------- 5 files changed, 25 insertions(+), 16 deletions(-) diff --git a/src/parts/debug.c b/src/parts/debug.c index cd343c9..96e0927 100644 --- a/src/parts/debug.c +++ b/src/parts/debug.c @@ -303,6 +303,7 @@ static cJSON *parts_params_to_json(struct parts_params *params, bool verbose) cJSON_AddNumberToObject(tmp, "z", params->rotation.z); cJSON_AddItemToObjectCS(obj, "add_color", color_to_json(¶ms->add_color, verbose)); cJSON_AddItemToObjectCS(obj, "mul_color", color_to_json(¶ms->multiply_color, verbose)); + cJSON_AddNumberToObject(obj, "alpha_clipper_parts_no", params->alpha_clipper_parts_no); return obj; } @@ -411,7 +412,6 @@ cJSON *parts_to_json(struct parts *parts, bool recursive, bool verbose) cJSON_AddNumberToObject(obj, "linked_from", parts->linked_from); cJSON_AddNumberToObject(obj, "draw_filter", parts->draw_filter); cJSON_AddBoolToObject(obj, "message_window", parts->message_window); - cJSON_AddNumberToObject(obj, "alpha_clipper_parts_no", parts->alpha_clipper_parts_no); cJSON_AddItemToObjectCS(obj, "motions", motions = cJSON_CreateArray()); struct parts_motion *motion; diff --git a/src/parts/parts.c b/src/parts/parts.c index 9f0ed55..5735c9f 100644 --- a/src/parts/parts.c +++ b/src/parts/parts.c @@ -43,7 +43,8 @@ static struct hash_table *parts_table = NULL; .scale = { 1.0f, 1.0f }, \ .rotation = { 0.0f, 0.0f, 0.0f }, \ .add_color = { 0, 0, 0, 0 }, \ - .multiply_color = { 255, 255, 255, 255 } \ + .multiply_color = { 255, 255, 255, 255 }, \ + .alpha_clipper_parts_no = 0 \ } static struct parts_params root_params = PARTS_PARAMS_INITIALIZER(0); @@ -1096,6 +1097,8 @@ static void parts_combine_params(struct parts_params *parent, struct parts_param out->multiply_color.r = parent->multiply_color.r * (child->multiply_color.r / 255.0f); out->multiply_color.g = parent->multiply_color.g * (child->multiply_color.g / 255.0f); out->multiply_color.b = parent->multiply_color.b * (child->multiply_color.b / 255.0f); + out->alpha_clipper_parts_no = child->alpha_clipper_parts_no + ? child->alpha_clipper_parts_no : parent->alpha_clipper_parts_no; } static void parts_update_component(struct parts *parts) @@ -1939,7 +1942,8 @@ float PE_GetPartsRotateZ(int parts_no) void PE_SetPartsAlphaClipperPartsNumber(int parts_no, int alpha_clipper_parts_no) { struct parts *parts = parts_get(parts_no); - parts->alpha_clipper_parts_no = alpha_clipper_parts_no; + parts->local.alpha_clipper_parts_no = alpha_clipper_parts_no; + parts_component_dirty(parts); parts_dirty(parts); } diff --git a/src/parts/parts_internal.h b/src/parts/parts_internal.h index 4774f05..4d5448b 100644 --- a/src/parts/parts_internal.h +++ b/src/parts/parts_internal.h @@ -396,6 +396,7 @@ struct parts_params { struct { float x, y, z; } rotation; SDL_Color add_color; SDL_Color multiply_color; + int alpha_clipper_parts_no; }; struct parts { @@ -428,7 +429,6 @@ struct parts { int hover_time; int draw_filter; bool message_window; - int alpha_clipper_parts_no; int margin_top; int margin_bottom; int margin_left; diff --git a/src/parts/render.c b/src/parts/render.c index 44d86f3..051edb2 100644 --- a/src/parts/render.c +++ b/src/parts/render.c @@ -134,7 +134,7 @@ static void parts_render_text(struct parts *parts, struct parts_text *t) mat4 mw_transform = WORLD_TRANSFORM(ch->t.w, ch->t.h, x, y); Rectangle r = { 0, 0, ch->t.w, ch->t.h }; parts_render_texture(&ch->t, mw_transform, &r, blend_rate, add_color, - multiply_color, 0, parts->alpha_clipper_parts_no); + multiply_color, 0, parts->global.alpha_clipper_parts_no); x += ch->advance; } x = parts->global.pos.x + t->common.origin_offset.x; @@ -189,7 +189,9 @@ static void parts_render_cg(struct parts *parts, struct parts_common *common) parts->global.multiply_color.g / 255.0f, parts->global.multiply_color.b / 255.0f, }; - parts_render_texture(&common->texture, mw_transform, &r, parts->global.alpha / 255.0, add_color, multiply_color, parts->draw_filter, parts->alpha_clipper_parts_no); + parts_render_texture(&common->texture, mw_transform, &r, parts->global.alpha / 255.0, + add_color, multiply_color, parts->draw_filter, + parts->global.alpha_clipper_parts_no); glBlendFuncSeparate(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_ONE, GL_ZERO); } @@ -292,7 +294,7 @@ static void render_flat_emitter(struct parts *parts, struct parts_flat *f, struct emitter_render_ud ud = { .f = f, .parent_alpha = eff.alpha, - .alpha_clipper = parts->alpha_clipper_parts_no, + .alpha_clipper = parts->global.alpha_clipper_parts_no, .draw_filter = eff.draw_filter, }; glm_vec2_copy(align, ud.align); @@ -351,7 +353,7 @@ static void render_flat_cg(struct parts *parts, Texture *tex, glm_scale(render_m, (vec3){ tex->w, tex->h, 1.0f }); parts_render_texture(tex, render_m, &rect, ctx->alpha, ctx->add_color, ctx->mul_color, - ctx->draw_filter, parts->alpha_clipper_parts_no); + ctx->draw_filter, parts->global.alpha_clipper_parts_no); if (ctx->draw_filter != PARTS_DRAW_FILTER_NORMAL) glBlendFuncSeparate(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_ONE, GL_ZERO); @@ -520,7 +522,8 @@ static void parts_render_flash_shape(struct parts *parts, struct parts_flash *f, (parts->global.multiply_color.g / 255.0f) * fixed16_to_float(obj->color_transform.mult_terms[1]), (parts->global.multiply_color.b / 255.0f) * fixed16_to_float(obj->color_transform.mult_terms[2]) }; - parts_render_texture(src, mw_transform, &r, blend_rate, add_color, multiply_color, 0, parts->alpha_clipper_parts_no); + parts_render_texture(src, mw_transform, &r, blend_rate, add_color, multiply_color, + 0, parts->global.alpha_clipper_parts_no); } static void parts_render_flash_sprite(struct parts *parts, struct parts_flash *f, struct parts_flash_object *obj, struct swf_tag_define_sprite *tag) diff --git a/src/parts/save.c b/src/parts/save.c index 41de27a..728b06c 100644 --- a/src/parts/save.c +++ b/src/parts/save.c @@ -25,7 +25,7 @@ #include "parts_internal.h" #include "../hll/iarray.h" -#define CURRENT_SAVE_VERSION 6 +#define CURRENT_SAVE_VERSION 7 static void save_parts_params(struct iarray_writer *w, struct parts_params *params) { @@ -40,9 +40,10 @@ static void save_parts_params(struct iarray_writer *w, struct parts_params *para iarray_write_float(w, params->rotation.z); iarray_write_color(w, ¶ms->add_color); iarray_write_color(w, ¶ms->multiply_color); + iarray_write(w, params->alpha_clipper_parts_no); } -static void load_parts_params(struct iarray_reader *r, struct parts_params *params) +static void load_parts_params(struct iarray_reader *r, struct parts_params *params, int version) { params->z = iarray_read(r); iarray_read_point(r, ¶ms->pos); @@ -55,6 +56,8 @@ static void load_parts_params(struct iarray_reader *r, struct parts_params *para params->rotation.z = iarray_read_float(r); iarray_read_color(r, ¶ms->add_color); iarray_read_color(r, ¶ms->multiply_color); + if (version >= 7) + params->alpha_clipper_parts_no = iarray_read(r); } static void save_parts_cg(struct iarray_writer *w, struct parts_cg *cg) @@ -611,7 +614,6 @@ static void save_parts(struct iarray_writer *w, struct parts *parts) iarray_write(w, parts->linked_from); iarray_write(w, parts->draw_filter); iarray_write(w, parts->message_window); - iarray_write(w, parts->alpha_clipper_parts_no); iarray_write(w, parts->controller_no); iarray_write(w, parts->pass_cursor); iarray_write(w, parts->lock_input_state); @@ -643,8 +645,8 @@ static void load_parts(struct iarray_reader *r, int version) load_parts_state(r, parts, &parts->states[i], version); } - load_parts_params(r, &parts->local); - load_parts_params(r, &parts->global); + load_parts_params(r, &parts->local, version); + load_parts_params(r, &parts->global, version); parts->pending_parent = iarray_read(r); parts->delegate_index = iarray_read(r); parts->sprite_deform = iarray_read(r); @@ -657,8 +659,8 @@ static void load_parts(struct iarray_reader *r, int version) parts->draw_filter = iarray_read(r); if (version > 0) parts->message_window = iarray_read(r); - if (version > 2) - parts->alpha_clipper_parts_no = iarray_read(r); + if (version > 2 && version < 7) + parts->local.alpha_clipper_parts_no = iarray_read(r); if (version > 3 || (version == 3 && parts_multi_controller)) { parts->controller_no = iarray_read(r); parts->pass_cursor = iarray_read(r);