Unit/Frame: made submerge handling more readable

This commit is contained in:
Charles Dang 2024-09-02 15:05:18 -04:00
parent cbd7f0d309
commit cd21c4f26b

View file

@ -522,6 +522,7 @@ void render_unit_image(
disp->drawing_buffer_add(drawing_layer, loc, [=](const rect&) mutable {
tex.set_alpha_mod(alpha);
if(submerge > 0.0) {
// set clip for dry part
// smooth_shaded doesn't use the clip information so it's fine to set it up front
@ -529,19 +530,28 @@ void render_unit_image(
// draw underwater part
draw::smooth_shaded(tex, data.alpha_verts);
// draw dry part
draw::flipped(tex, data.unsub_dest, hreverse, vreverse);
} else {
// draw whole texture
draw::flipped(tex, dest, hreverse, vreverse);
}
// draw dry part
draw::flipped(tex, submerge > 0.0 ? data.unsub_dest : dest, hreverse, vreverse);
if(uint8_t hl = float_to_color(highlight); hl > 0) {
tex.set_blend_mode(SDL_BLENDMODE_ADD);
tex.set_alpha_mod(hl);
if(submerge > 0.0) {
// draw underwater part
draw::smooth_shaded(tex, data.alpha_verts);
// draw dry part
draw::flipped(tex, data.unsub_dest, hreverse, vreverse);
} else {
// draw whole texture
draw::flipped(tex, dest, hreverse, vreverse);
}
// draw dry part
draw::flipped(tex, submerge > 0.0 ? data.unsub_dest : dest, hreverse, vreverse);
}
tex.set_blend_mode(SDL_BLENDMODE_BLEND);
@ -561,7 +571,10 @@ void render_unit_image(
);
disp->drawing_buffer_add(drawing_layer, loc, [=, tex = image::get_texture(whiteout_locator)](const rect&) mutable {
if (submerge > 0.0) {
tex.set_alpha_mod(alpha * blend_ratio);
tex.set_color_mod(blendto);
if(submerge > 0.0) {
// also draw submerged portion
// alpha_mod and color_mod are ignored,
// so we have to put them in the smooth shaded vertex data.
@ -569,6 +582,7 @@ void render_unit_image(
blendto.a = uint8_t(data.alpha_verts[0].color.a * blend_ratio);
data.alpha_verts[0].color = blendto;
data.alpha_verts[1].color = blendto;
blendto.a = uint8_t(data.alpha_verts[2].color.a * blend_ratio);
data.alpha_verts[2].color = blendto;
data.alpha_verts[3].color = blendto;
@ -579,23 +593,28 @@ void render_unit_image(
// draw underwater part
draw::smooth_shaded(tex, data.alpha_verts);
// draw dry part
draw::flipped(tex, data.unsub_dest, hreverse, vreverse);
} else {
// draw whole texture
draw::flipped(tex, dest, hreverse, vreverse);
}
tex.set_alpha_mod(alpha * blend_ratio);
tex.set_color_mod(blendto);
// draw dry part
draw::flipped(tex, submerge > 0.0 ? data.unsub_dest : dest, hreverse, vreverse);
if(uint8_t hl = float_to_color(highlight); hl > 0) {
tex.set_blend_mode(SDL_BLENDMODE_ADD);
tex.set_alpha_mod(hl);
if (submerge > 0.0) {
if(submerge > 0.0) {
// draw underwater part
draw::smooth_shaded(tex, data.alpha_verts);
// draw dry part
draw::flipped(tex, data.unsub_dest, hreverse, vreverse);
} else {
// draw whole texture
draw::flipped(tex, dest, hreverse, vreverse);
}
// draw dry part
draw::flipped(tex, submerge > 0.0 ? data.unsub_dest : dest, hreverse, vreverse);
}
tex.set_color_mod(255, 255, 255);