mirror of
https://github.com/nunuhara/xsystem4.git
synced 2026-09-22 23:18:01 +03:00
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:
+1
-1
@@ -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;
|
||||
|
||||
+6
-2
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
@@ -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
@@ -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
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user