View Issue Details
ID | Project | Category | View Status | Date Submitted | Last Update |
---|---|---|---|---|---|
0003102 | FSSCP | SEXPs | public | 2014-09-03 00:47 | 2014-10-07 01:55 |
Reporter | Parias | Assigned To | Parias | ||
Priority | normal | Severity | major | Reproducibility | always |
Status | resolved | Resolution | fixed | ||
Product Version | 3.7.1 | ||||
Target Version | 3.7.2 | Fixed in Version | 3.7.2 | ||
Summary | 0003102: Fix to make show-subtitle-text positioning consistent on MP clients (code included) | ||||
Description | Right now, show-subtitle-text has a bit of a quirk where it will send the raw x_pos and y_pos (and width) values *AFTER* the host has already calculated them (based on x_pct and y_pct, which are passed as SEXP arguments from the mission). This leads to issues if: 1) The host is running a different screen resolution than client systems (text will appear offset / misaligned from what the host sees) 2) The host is a dedicated / standalone server (text will just get all jumbled up in a corner because the values used for screen resolution percentage processing will come up null, or zero or something) In either case, it's a bit problematic if you're expecting the text to line up in a certain way for all players. The attached .patch is a code fix to resolve this. | ||||
Additional Information | As always, I'm pretty new to modifying the code and so I'm not sure if there's a better way to do this - treat this change with all due skepticism. But anyways, the logic is that instead of having sexp_show_subtitle_text do all of the grunt work and then send the results (work out x_pos, y_pos, and width and send those), it'll instead send the original x_pct, y_pct, and width_pct values as received from the SEXP via the multiplayer SEXP packet system; the multi_sexp_show_subtitle_text void will then receive the percent values and do it's own calculation on the client end based on the client's own screen resolution. Tested this with a few configs just this last weekend and this appears to lead to much better results. | ||||
Tags | No tags attached. | ||||
|
sexp.cpp-subtitleclientposition.patch (1,913 bytes)
Index: code/parse/sexp.cpp =================================================================== --- code/parse/sexp.cpp (revision 10990) +++ code/parse/sexp.cpp (working copy) @@ -21079,8 +21108,8 @@ Subtitles.push_back(new_subtitle); multi_start_callback(); - multi_send_int(x_pos); - multi_send_int(y_pos); + multi_send_int(x_pct); + multi_send_int(y_pct); multi_send_string(text); multi_send_float(display_time); multi_send_float(fade_time); @@ -21090,23 +21119,23 @@ multi_send_int(fontnum); multi_send_bool(center_x); multi_send_bool(center_y); - multi_send_int(width); + multi_send_int(width_pct); multi_send_bool(post_shaded); multi_end_callback(); } void multi_sexp_show_subtitle_text() { - int x_pos, y_pos, width=0, fontnum; - char text[TOKEN_LENGTH]; + int x_pct, y_pct, width_pct, fontnum; + char text[256]; float display_time, fade_time=0.0f; int red=255, green=255, blue=255; bool center_x=false, center_y=false; bool post_shaded = false; color new_color; - multi_get_int(x_pos); - multi_get_int(y_pos); + multi_get_int(x_pct); + multi_get_int(y_pct); multi_get_string(text); multi_get_float(display_time); multi_get_float(fade_time); @@ -21116,11 +21145,16 @@ multi_get_int(fontnum); multi_get_bool(center_x); multi_get_bool(center_y); - multi_get_int(width); + multi_get_int(width_pct); multi_get_bool(post_shaded); gr_init_alphacolor(&new_color, red, green, blue, 255); + // calculate pixel positions + int x_pos = (int)(gr_screen.max_w * (x_pct / 100.0f)); + int y_pos = (int)(gr_screen.max_h * (y_pct / 100.0f)); + int width = (int)(gr_screen.max_w * (width_pct / 100.0f)); + // add the subtitle subtitle new_subtitle(x_pos, y_pos, text, NULL, display_time, fade_time, &new_color, fontnum, center_x, center_y, width, 0, post_shaded); Subtitles.push_back(new_subtitle); |
|
Doh - I just realized the .patch also has the change for char text[TOKEN_LENGTH] in multi_sexp_show_subtitle_text() rolled in (changed from TOKEN_LENGTH to 256 as per 0003077) so just an FYI as I think that just got committed to trunk. I'll upload a fresh .patch without it if desired. |
|
The patch looks good, but it gets rejected on current trunk. Could you upload a patch against the most recent revision? |
|
sexp.cpp-subtitleclientposition-new.patch (1,947 bytes)
Index: code/parse/sexp.cpp =================================================================== --- code/parse/sexp.cpp (revision 11099) +++ code/parse/sexp.cpp (working copy) @@ -21078,8 +21078,8 @@ Subtitles.push_back(new_subtitle); multi_start_callback(); - multi_send_int(x_pos); - multi_send_int(y_pos); + multi_send_int(x_pct); + multi_send_int(y_pct); multi_send_int (message_index); // only send the text if it is not a message. If it is a message, we've already sent the index anyway. if (message_index == -1) { @@ -21093,14 +21093,14 @@ multi_send_int(fontnum); multi_send_bool(center_x); multi_send_bool(center_y); - multi_send_int(width); + multi_send_int(width_pct); multi_send_bool(post_shaded); multi_end_callback(); } void multi_sexp_show_subtitle_text() { - int x_pos, y_pos, width=0, fontnum, message_index = -1; + int x_pct, y_pct, width_pct, fontnum, message_index = -1; char text[MESSAGE_LENGTH]; float display_time, fade_time=0.0f; int red=255, green=255, blue=255; @@ -21108,8 +21108,8 @@ bool post_shaded = false; color new_color; - multi_get_int(x_pos); - multi_get_int(y_pos); + multi_get_int(x_pct); + multi_get_int(y_pct); multi_get_int(message_index); if (message_index == -1) { multi_get_string(text); @@ -21126,11 +21126,16 @@ multi_get_int(fontnum); multi_get_bool(center_x); multi_get_bool(center_y); - multi_get_int(width); + multi_get_int(width_pct); multi_get_bool(post_shaded); gr_init_alphacolor(&new_color, red, green, blue, 255); + // calculate pixel positions + int x_pos = (int)(gr_screen.max_w * (x_pct / 100.0f)); + int y_pos = (int)(gr_screen.max_h * (y_pct / 100.0f)); + int width = (int)(gr_screen.max_w * (width_pct / 100.0f)); + // add the subtitle subtitle new_subtitle(x_pos, y_pos, text, NULL, display_time, fade_time, &new_color, fontnum, center_x, center_y, width, 0, post_shaded); Subtitles.push_back(new_subtitle); |
|
Sorry for the delay Goob - I've fired over an updated .patch (and re-tested against the latest base trunk revision to ensure it goes in). Let me know if there are any more problems. |
|
Patch committed. Marking as fixed. |
Date Modified | Username | Field | Change |
---|---|---|---|
2014-09-03 00:47 | Parias | New Issue | |
2014-09-03 00:47 | Parias | File Added: sexp.cpp-subtitleclientposition.patch | |
2014-09-03 01:00 | Parias | Note Added: 0016267 | |
2014-09-16 21:22 | Echelon9 | Status | new => code review |
2014-09-25 02:10 | Goober5000 | Note Added: 0016298 | |
2014-10-06 00:42 | Parias | File Added: sexp.cpp-subtitleclientposition-new.patch | |
2014-10-06 00:43 | Parias | Note Added: 0016327 | |
2014-10-07 01:54 | Goober5000 | Changeset attached | => fs2open trunk r11108 |
2014-10-07 01:55 | Goober5000 | Note Added: 0016328 | |
2014-10-07 01:55 | Goober5000 | Assigned To | => Parias |
2014-10-07 01:55 | Goober5000 | Resolution | open => fixed |
2014-10-07 01:55 | Goober5000 | Fixed in Version | => 3.7.2 |
2014-10-07 01:55 | Goober5000 | Target Version | => 3.7.2 |
2014-10-07 01:55 | Goober5000 | Status | code review => resolved |