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.
This commit is contained in:
kichikuou
2026-09-16 12:47:59 +09:00
parent 6ea8af95ba
commit 461eca1a85
5 changed files with 25 additions and 16 deletions
+1 -1
View File
@@ -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(&params->add_color, verbose));
cJSON_AddItemToObjectCS(obj, "mul_color", color_to_json(&params->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;
+6 -2
View File
@@ -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);
}
+1 -1
View File
@@ -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;
+8 -5
View File
@@ -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)
+9 -7
View File
@@ -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, &params->add_color);
iarray_write_color(w, &params->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, &params->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, &params->add_color);
iarray_read_color(r, &params->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);