Since very few things have hardcoded positions in main halls, it's not hard to add support for main halls of any resolution and aspect ratio; in fact, the patch below does just that. Just keep in mind that the size of text changes with the resolution, so think twice before you use any 4K main halls! (Maybe I should add support for definable fonts in main halls...)
(And don't forget to change the value of +Tooltip Y appropriately!)
This patch also does the same thing with the preload screen.
Index: code/freespace2/freespace.cpp
===================================================================
--- code/freespace2/freespace.cpp (revision 10550)
+++ code/freespace2/freespace.cpp (working copy)
@@ -8692,16 +8692,20 @@
int width, height;
bm_get_info(Game_title_bitmap, &width, &height);
+ gr_set_screen_scale(width, height);
+
// draw it in the center of the screen
- gr_bitmap((gr_screen.max_w_unscaled - width)/2, (gr_screen.max_h_unscaled - height)/2, GR_RESIZE_MENU);
- }
+ gr_bitmap(0, 0, GR_RESIZE_MENU);
- if (Game_title_logo != -1)
- {
- gr_set_bitmap(Game_title_logo);
+ if (Game_title_logo != -1)
+ {
+ gr_set_bitmap(Game_title_logo);
- gr_bitmap(0, 0, GR_RESIZE_MENU);
+ gr_bitmap(0, 0, GR_RESIZE_MENU);
+ }
+
+ gr_reset_screen_scale();
}
}
Index: code/graphics/2d.cpp
===================================================================
--- code/graphics/2d.cpp (revision 10550)
+++ code/graphics/2d.cpp (working copy)
@@ -88,35 +88,39 @@
static int GL_cursor_nframes = 0;
// Pre-computed screen resize vars
-static float Gr_full_resize_X = 1.0f, Gr_full_resize_Y = 1.0f;
-static float Gr_resize_X = 1.0f, Gr_resize_Y = 1.0f;
-static float Gr_menu_offset_X = 0.0f, Gr_menu_offset_Y = 0.0f;
+static screen_scale Gr_resize;
+screen_scale Gr_save_resize;
-float Gr_save_full_resize_X = 1.0f, Gr_save_full_resize_Y = 1.0f;
-float Gr_save_resize_X = 1.0f, Gr_save_resize_Y = 1.0f;
-float Gr_save_menu_offset_X = 0.0f, Gr_save_menu_offset_Y = 0.0f;
-
bool Save_custom_screen_size;
+void gr_set_screen_scale(screen_scale ss)
+{
+ Gr_resize = ss;
+
+ Save_custom_screen_size = gr_screen.custom_size;
+
+ gr_screen.custom_size = true;
+}
+
void gr_set_screen_scale(int w, int h)
{
- Gr_full_resize_X = (float)gr_screen.max_w / (float)w;
- Gr_full_resize_Y = (float)gr_screen.max_h / (float)h;
+ Gr_resize.full_resize_X = (float)gr_screen.max_w / (float)w;
+ Gr_resize.full_resize_Y = (float)gr_screen.max_h / (float)h;
if (!Cmdline_stretch_menu) {
float aspect_quotient = ((float)gr_screen.max_w / (float)gr_screen.max_h) / ((float)w / (float)h);
- Gr_resize_X = Gr_full_resize_X / ((aspect_quotient > 1.0f) ? aspect_quotient : 1.0f);
- Gr_resize_Y = Gr_full_resize_Y * ((aspect_quotient < 1.0f) ? aspect_quotient : 1.0f);
+ Gr_resize.resize_X = Gr_resize.full_resize_X / ((aspect_quotient > 1.0f) ? aspect_quotient : 1.0f);
+ Gr_resize.resize_Y = Gr_resize.full_resize_Y * ((aspect_quotient < 1.0f) ? aspect_quotient : 1.0f);
- Gr_menu_offset_X = (aspect_quotient > 1.0f) ? ((gr_screen.max_w - gr_screen.max_w / aspect_quotient) / 2.0f) : 0.0f;
- Gr_menu_offset_Y = (aspect_quotient < 1.0f) ? ((gr_screen.max_h - gr_screen.max_h * aspect_quotient) / 2.0f) : 0.0f;
+ Gr_resize.menu_offset_X = (aspect_quotient > 1.0f) ? ((gr_screen.max_w - gr_screen.max_w / aspect_quotient) / 2.0f) : 0.0f;
+ Gr_resize.menu_offset_Y = (aspect_quotient < 1.0f) ? ((gr_screen.max_h - gr_screen.max_h * aspect_quotient) / 2.0f) : 0.0f;
} else {
- Gr_resize_X = Gr_full_resize_X;
- Gr_resize_Y = Gr_full_resize_Y;
+ Gr_resize.resize_X = Gr_resize.full_resize_X;
+ Gr_resize.resize_Y = Gr_resize.full_resize_Y;
- Gr_menu_offset_X = 0.0f;
- Gr_menu_offset_Y = 0.0f;
+ Gr_resize.menu_offset_X = 0.0f;
+ Gr_resize.menu_offset_Y = 0.0f;
}
Save_custom_screen_size = gr_screen.custom_size;
@@ -126,11 +130,11 @@
void gr_set_screen_scale(int w, int h, int max_w, int max_h)
{
- Gr_resize_X = Gr_full_resize_X = (float)max_w / (float)w;
- Gr_resize_Y = Gr_full_resize_Y = (float)max_h / (float)h;
+ Gr_resize.resize_X = Gr_resize.full_resize_X = (float)max_w / (float)w;
+ Gr_resize.resize_Y = Gr_resize.full_resize_Y = (float)max_h / (float)h;
- Gr_menu_offset_X = 0.0f;
- Gr_menu_offset_Y = 0.0f;
+ Gr_resize.menu_offset_X = 0.0f;
+ Gr_resize.menu_offset_Y = 0.0f;
Save_custom_screen_size = gr_screen.custom_size;
@@ -137,16 +141,21 @@
gr_screen.custom_size = true;
}
+screen_scale gr_get_screen_scale()
+{
+ return Gr_resize;
+}
+
void gr_reset_screen_scale()
{
- Gr_full_resize_X = Gr_save_full_resize_X;
- Gr_full_resize_Y = Gr_save_full_resize_Y;
+ Gr_resize.full_resize_X = Gr_save_resize.full_resize_X;
+ Gr_resize.full_resize_Y = Gr_save_resize.full_resize_Y;
- Gr_resize_X = Gr_save_resize_X;
- Gr_resize_Y = Gr_save_resize_Y;
+ Gr_resize.resize_X = Gr_save_resize.resize_X;
+ Gr_resize.resize_Y = Gr_save_resize.resize_Y;
- Gr_menu_offset_X = Gr_save_menu_offset_X;
- Gr_menu_offset_Y = Gr_save_menu_offset_Y;
+ Gr_resize.menu_offset_X = Gr_save_resize.menu_offset_X;
+ Gr_resize.menu_offset_Y = Gr_save_resize.menu_offset_Y;
gr_screen.custom_size = Save_custom_screen_size;
}
@@ -171,22 +180,22 @@
float xy_tmp = 0.0f;
if ( x ) {
- xy_tmp = (*x) * ((resize_mode == GR_RESIZE_FULL) ? Gr_full_resize_X : Gr_resize_X) + ((resize_mode == GR_RESIZE_MENU) ? Gr_menu_offset_X : 0.0f);
+ xy_tmp = (*x) * ((resize_mode == GR_RESIZE_FULL) ? Gr_resize.full_resize_X : Gr_resize.resize_X) + ((resize_mode == GR_RESIZE_MENU) ? Gr_resize.menu_offset_X : 0.0f);
(*x) = fl2i(xy_tmp);
}
if ( y ) {
- xy_tmp = (*y) * ((resize_mode == GR_RESIZE_FULL) ? Gr_full_resize_Y : Gr_resize_Y) + ((resize_mode == GR_RESIZE_MENU) ? Gr_menu_offset_Y : 0.0f);
+ xy_tmp = (*y) * ((resize_mode == GR_RESIZE_FULL) ? Gr_resize.full_resize_Y : Gr_resize.resize_Y) + ((resize_mode == GR_RESIZE_MENU) ? Gr_resize.menu_offset_Y : 0.0f);
(*y) = fl2i(xy_tmp);
}
if ( w ) {
- xy_tmp = (*w) * ((resize_mode == GR_RESIZE_FULL) ? Gr_full_resize_X : Gr_resize_X);
+ xy_tmp = (*w) * ((resize_mode == GR_RESIZE_FULL) ? Gr_resize.full_resize_X : Gr_resize.resize_X);
(*w) = fl2i(xy_tmp);
}
if ( h ) {
- xy_tmp = (*h) * ((resize_mode == GR_RESIZE_FULL) ? Gr_full_resize_Y : Gr_resize_Y);
+ xy_tmp = (*h) * ((resize_mode == GR_RESIZE_FULL) ? Gr_resize.full_resize_Y : Gr_resize.resize_Y);
(*h) = fl2i(xy_tmp);
}
@@ -211,22 +220,22 @@
float xy_tmp = 0.0f;
if ( x ) {
- xy_tmp = ((*x) - ((resize_mode == GR_RESIZE_MENU) ? Gr_menu_offset_X : 0.0f)) / ((resize_mode == GR_RESIZE_FULL) ? Gr_full_resize_X : Gr_resize_X);
+ xy_tmp = ((*x) - ((resize_mode == GR_RESIZE_MENU) ? Gr_resize.menu_offset_X : 0.0f)) / ((resize_mode == GR_RESIZE_FULL) ? Gr_resize.full_resize_X : Gr_resize.resize_X);
(*x) = fl2i(xy_tmp);
}
if ( y ) {
- xy_tmp = ((*y) - ((resize_mode == GR_RESIZE_MENU) ? Gr_menu_offset_Y : 0.0f)) / ((resize_mode == GR_RESIZE_FULL) ? Gr_full_resize_Y : Gr_resize_Y);
+ xy_tmp = ((*y) - ((resize_mode == GR_RESIZE_MENU) ? Gr_resize.menu_offset_Y : 0.0f)) / ((resize_mode == GR_RESIZE_FULL) ? Gr_resize.full_resize_Y : Gr_resize.resize_Y);
(*y) = fl2i(xy_tmp);
}
if ( w ) {
- xy_tmp = (*w) / ((resize_mode == GR_RESIZE_FULL) ? Gr_full_resize_X : Gr_resize_X);
+ xy_tmp = (*w) / ((resize_mode == GR_RESIZE_FULL) ? Gr_resize.full_resize_X : Gr_resize.resize_X);
(*w) = fl2i(xy_tmp);
}
if ( h ) {
- xy_tmp = (*h) / ((resize_mode == GR_RESIZE_FULL) ? Gr_full_resize_Y : Gr_resize_Y);
+ xy_tmp = (*h) / ((resize_mode == GR_RESIZE_FULL) ? Gr_resize.full_resize_Y : Gr_resize.resize_Y);
(*h) = fl2i(xy_tmp);
}
@@ -253,22 +262,22 @@
float xy_tmp = 0.0f;
if ( x ) {
- xy_tmp = (*x) * ((resize_mode == GR_RESIZE_FULL) ? Gr_full_resize_X : Gr_resize_X) + ((resize_mode == GR_RESIZE_MENU) ? Gr_menu_offset_X : 0.0f);
+ xy_tmp = (*x) * ((resize_mode == GR_RESIZE_FULL) ? Gr_resize.full_resize_X : Gr_resize.resize_X) + ((resize_mode == GR_RESIZE_MENU) ? Gr_resize.menu_offset_X : 0.0f);
(*x) = xy_tmp;
}
if ( y ) {
- xy_tmp = (*y) * ((resize_mode == GR_RESIZE_FULL) ? Gr_full_resize_Y : Gr_resize_Y) + ((resize_mode == GR_RESIZE_MENU) ? Gr_menu_offset_Y : 0.0f);
+ xy_tmp = (*y) * ((resize_mode == GR_RESIZE_FULL) ? Gr_resize.full_resize_Y : Gr_resize.resize_Y) + ((resize_mode == GR_RESIZE_MENU) ? Gr_resize.menu_offset_Y : 0.0f);
(*y) = xy_tmp;
}
if ( w ) {
- xy_tmp = (*w) * ((resize_mode == GR_RESIZE_FULL) ? Gr_full_resize_X : Gr_resize_X);
+ xy_tmp = (*w) * ((resize_mode == GR_RESIZE_FULL) ? Gr_resize.full_resize_X : Gr_resize.resize_X);
(*w) = xy_tmp;
}
if ( h ) {
- xy_tmp = (*h) * ((resize_mode == GR_RESIZE_FULL) ? Gr_full_resize_Y : Gr_resize_Y);
+ xy_tmp = (*h) * ((resize_mode == GR_RESIZE_FULL) ? Gr_resize.full_resize_Y : Gr_resize.resize_Y);
(*h) = xy_tmp;
}
@@ -293,22 +302,22 @@
float xy_tmp = 0.0f;
if ( x ) {
- xy_tmp = ((*x) - ((resize_mode == GR_RESIZE_MENU) ? Gr_menu_offset_X : 0.0f)) / ((resize_mode == GR_RESIZE_FULL) ? Gr_full_resize_X : Gr_resize_X);
+ xy_tmp = ((*x) - ((resize_mode == GR_RESIZE_MENU) ? Gr_resize.menu_offset_X : 0.0f)) / ((resize_mode == GR_RESIZE_FULL) ? Gr_resize.full_resize_X : Gr_resize.resize_X);
(*x) = xy_tmp;
}
if ( y ) {
- xy_tmp = ((*y) - ((resize_mode == GR_RESIZE_MENU) ? Gr_menu_offset_Y : 0.0f)) / ((resize_mode == GR_RESIZE_FULL) ? Gr_full_resize_Y : Gr_resize_Y);
+ xy_tmp = ((*y) - ((resize_mode == GR_RESIZE_MENU) ? Gr_resize.menu_offset_Y : 0.0f)) / ((resize_mode == GR_RESIZE_FULL) ? Gr_resize.full_resize_Y : Gr_resize.resize_Y);
(*y) = xy_tmp;
}
if ( w ) {
- xy_tmp = (*w) / ((resize_mode == GR_RESIZE_FULL) ? Gr_full_resize_X : Gr_resize_X);
+ xy_tmp = (*w) / ((resize_mode == GR_RESIZE_FULL) ? Gr_resize.full_resize_X : Gr_resize.resize_X);
(*w) = xy_tmp;
}
if ( h ) {
- xy_tmp = (*h) / ((resize_mode == GR_RESIZE_FULL) ? Gr_full_resize_Y : Gr_resize_Y);
+ xy_tmp = (*h) / ((resize_mode == GR_RESIZE_FULL) ? Gr_resize.full_resize_Y : Gr_resize.resize_Y);
(*h) = xy_tmp;
}
@@ -476,23 +485,23 @@
mode = GR_OPENGL;
}
- Gr_save_full_resize_X = Gr_full_resize_X = (float)width / ((res == GR_1024) ? 1024.0f : 640.0f);
- Gr_save_full_resize_Y = Gr_full_resize_Y = (float)height / ((res == GR_1024) ? 768.0f : 480.0f);
+ Gr_save_resize.full_resize_X = Gr_resize.full_resize_X = (float)width / ((res == GR_1024) ? 1024.0f : 640.0f);
+ Gr_save_resize.full_resize_Y = Gr_resize.full_resize_Y = (float)height / ((res == GR_1024) ? 768.0f : 480.0f);
if (gr_screen.custom_size && !Cmdline_stretch_menu) {
float aspect_quotient = ((float)width / (float)height) / (4.0f / 3.0f);
- Gr_save_resize_X = Gr_resize_X = Gr_full_resize_X / ((aspect_quotient > 1.0f) ? aspect_quotient : 1.0f);
- Gr_save_resize_Y = Gr_resize_Y = Gr_full_resize_Y * ((aspect_quotient < 1.0f) ? aspect_quotient : 1.0f);
+ Gr_save_resize.resize_X = Gr_resize.resize_X = Gr_resize.full_resize_X / ((aspect_quotient > 1.0f) ? aspect_quotient : 1.0f);
+ Gr_save_resize.resize_Y = Gr_resize.resize_Y = Gr_resize.full_resize_Y * ((aspect_quotient < 1.0f) ? aspect_quotient : 1.0f);
- Gr_save_menu_offset_X = Gr_menu_offset_X = (aspect_quotient > 1.0f) ? ((width - width / aspect_quotient) / 2.0f) : 0.0f;
- Gr_save_menu_offset_Y = Gr_menu_offset_Y = (aspect_quotient < 1.0f) ? ((height - height * aspect_quotient) / 2.0f) : 0.0f;
+ Gr_save_resize.menu_offset_X = Gr_resize.menu_offset_X = (aspect_quotient > 1.0f) ? ((width - width / aspect_quotient) / 2.0f) : 0.0f;
+ Gr_save_resize.menu_offset_Y = Gr_resize.menu_offset_Y = (aspect_quotient < 1.0f) ? ((height - height * aspect_quotient) / 2.0f) : 0.0f;
} else {
- Gr_save_resize_X = Gr_resize_X = Gr_full_resize_X;
- Gr_save_resize_Y = Gr_resize_Y = Gr_full_resize_Y;
+ Gr_save_resize.resize_X = Gr_resize.resize_X = Gr_resize.full_resize_X;
+ Gr_save_resize.resize_Y = Gr_resize.resize_Y = Gr_resize.full_resize_Y;
- Gr_save_menu_offset_X = Gr_menu_offset_X = 0.0f;
- Gr_save_menu_offset_Y = Gr_menu_offset_Y = 0.0f;
+ Gr_save_resize.menu_offset_X = Gr_resize.menu_offset_X = 0.0f;
+ Gr_save_resize.menu_offset_Y = Gr_resize.menu_offset_Y = 0.0f;
}
Index: code/graphics/2d.h
===================================================================
--- code/graphics/2d.h (revision 10550)
+++ code/graphics/2d.h (working copy)
@@ -59,6 +59,12 @@
ubyte lookup[256];
} shader;
+typedef struct screen_scale {
+ float full_resize_X = 1.0f, full_resize_Y = 1.0f;
+ float resize_X = 1.0f, resize_Y = 1.0f;
+ float menu_offset_X = 0.0f, menu_offset_Y = 0.0f;
+} screen_scale;
+
#define AC_TYPE_NONE 0 // Not an alphacolor
#define AC_TYPE_HUD 1 // Doesn't change hue depending on background. Used for HUD stuff.
#define AC_TYPE_BLEND 2 // Changes hue depending on background. Used for stars, etc.
@@ -575,8 +581,10 @@
#define GR_RESIZE_MENU 2
#define GR_RESIZE_MENU_NO_OFFSET 3
+void gr_set_screen_scale(screen_scale ss);
void gr_set_screen_scale(int x, int y);
void gr_set_screen_scale(int x, int y, int max_x, int max_y);
+screen_scale gr_get_screen_scale();
void gr_reset_screen_scale();
bool gr_unsize_screen_pos(int *x, int *y, int *w = NULL, int *h = NULL, int resize_mode = GR_RESIZE_FULL);
bool gr_resize_screen_pos(int *x, int *y, int *w = NULL, int *h = NULL, int resize_mode = GR_RESIZE_FULL);
Index: code/menuui/mainhallmenu.cpp
===================================================================
--- code/menuui/mainhallmenu.cpp (revision 10550)
+++ code/menuui/mainhallmenu.cpp (working copy)
@@ -74,6 +74,10 @@
// background bitmap handle
int Main_hall_bitmap;
+// background bitmap dimensions
+int Main_hall_bitmap_w;
+int Main_hall_bitmap_h;
+
// background bitmap mask handle
int Main_hall_mask;
@@ -350,6 +354,7 @@
// blit some small color indicators to show whether ships.tbl and weapons.tbl are valid
// green == valid, red == invalid.
// ships.tbl will be on the left, weapons.tbl on the right
+/*
int Mh_ship_table_status[GR_NUM_RESOLUTIONS][2] = {
{ 1, 479 },
{ 1, 767 }
@@ -358,15 +363,16 @@
{ 3, 479 },
{ 3, 767 }
};
+*/
void main_hall_blit_table_status()
{
// blit ship table status
gr_set_color_fast(Game_ships_tbl_valid ? &Color_bright_green : &Color_bright_red);
- gr_line(Mh_ship_table_status[gr_screen.res][0], Mh_ship_table_status[gr_screen.res][1], Mh_ship_table_status[gr_screen.res][0], Mh_ship_table_status[gr_screen.res][1], GR_RESIZE_MENU);
+ gr_line(1, Main_hall_bitmap_h - 1, 1, Main_hall_bitmap_h - 1, GR_RESIZE_MENU);
// blit weapon table status
gr_set_color_fast(Game_weapons_tbl_valid ? &Color_bright_green : &Color_bright_red);
- gr_line(Mh_weapon_table_status[gr_screen.res][0], Mh_weapon_table_status[gr_screen.res][1], Mh_weapon_table_status[gr_screen.res][0], Mh_ship_table_status[gr_screen.res][1], GR_RESIZE_MENU);
+ gr_line(3, Main_hall_bitmap_h - 1, 3, Main_hall_bitmap_h - 1, GR_RESIZE_MENU);
}
/**
@@ -468,10 +474,15 @@
}
}
+ Main_hall_bitmap_w = -1;
+ Main_hall_bitmap_h = -1;
+
// load the background bitmap
Main_hall_bitmap = bm_load(Main_hall->bitmap);
if (Main_hall_bitmap < 0) {
nprintf(("General","WARNING! Couldn't load main hall background bitmap %s\n", Main_hall->bitmap.c_str()));
+ } else {
+ bm_get_info(Main_hall_bitmap, &Main_hall_bitmap_w, &Main_hall_bitmap_h);
}
bg_type = bm_get_type(Main_hall_bitmap);
@@ -620,6 +631,8 @@
{
int code, key, snazzy_action;
+ gr_set_screen_scale(Main_hall_bitmap_w, Main_hall_bitmap_h);
+
// need to ensure ambient is playing, since it may be stopped by a playing movie
main_hall_start_ambient();
@@ -834,6 +847,7 @@
#endif
gr_flip();
+ gr_reset_screen_scale();
// see if we have a missing campaign and force the player to select a new campaign if so
extern bool Campaign_room_no_campaigns;
@@ -1458,7 +1472,7 @@
gr_set_color_fast(&Color_bright);
gr_get_string_size(&w,&h,Main_hall_notify_text);
- gr_printf_menu((gr_screen.max_w_unscaled - w)/2, gr_screen.max_h_unscaled - 40, Main_hall_notify_text);
+ gr_printf_menu((Main_hall_bitmap_w - w)/2, Main_hall_bitmap_h - 40, Main_hall_notify_text);
}
}
}
@@ -1526,7 +1540,7 @@
// print the string near the lower left corner
gr_set_color_fast(&Color_bright_white);
- gr_string(5, gr_screen.max_h_unscaled - 24, version_string, GR_RESIZE_MENU);
+ gr_string(5, Main_hall_bitmap_h - 24, version_string, GR_RESIZE_MENU);
}
/**
@@ -1563,7 +1577,7 @@
gr_shade(0, shader_y, gr_screen.clip_width_unscaled, (gr_screen.clip_height_unscaled - shader_y), GR_RESIZE_MENU);
gr_set_color_fast(&Color_bright_white);
- gr_string((gr_screen.max_w_unscaled - w)/2, Main_hall->region_yval, Main_hall->region_descript.at(text_index), GR_RESIZE_MENU);
+ gr_string((Main_hall_bitmap_w - w)/2, Main_hall->region_yval, Main_hall->region_descript.at(text_index), GR_RESIZE_MENU);
}
}
@@ -1603,7 +1617,7 @@
gr_set_color_fast(&Color_bright_white);
gr_set_shader(&Main_hall_tooltip_shader);
gr_shade(0, 0, gr_screen.max_w_unscaled, (2*Main_hall_tooltip_padding[gr_screen.res]) + h - y_anim_offset, GR_RESIZE_MENU);
- gr_string((gr_screen.max_w_unscaled - w)/2, Main_hall_tooltip_padding[gr_screen.res] /*- y_anim_offset*/, str, GR_RESIZE_MENU);
+ gr_string((Main_hall_bitmap_w - w)/2, Main_hall_tooltip_padding[gr_screen.res] /*- y_anim_offset*/, str, GR_RESIZE_MENU);
}
/**
Index: code/popup/popup.cpp
===================================================================
--- code/popup/popup.cpp (revision 10550)
+++ code/popup/popup.cpp (working copy)
@@ -820,6 +820,9 @@
screen_id = gr_save_screen();
+ screen_scale old_scale = gr_get_screen_scale();
+ gr_reset_screen_scale();
+
while(!done) {
int k;
@@ -871,6 +874,8 @@
gr_flip();
}
+ gr_set_screen_scale(old_scale);
+
popup_close(pi,screen_id);
return choice;
}