Skip to content

Commit c882213

Browse files
authored
Merge pull request #295 from HunterZ/glfilter
Add bilinear texture filtering support for OpenGL renderer
2 parents 2ab662f + a604ec0 commit c882213

File tree

5 files changed

+103
-44
lines changed

5 files changed

+103
-44
lines changed

Diff for: src/GameSrc/Headers/wrapper.h

+16-12
Original file line numberDiff line numberDiff line change
@@ -82,23 +82,27 @@ extern char comments[NUM_SAVE_SLOTS][SAVE_COMMENT_LEN];
8282
}
8383

8484
enum TEMP_STR_ {
85-
REF_STR_Renderer = 0x10000000,
86-
REF_STR_Software,
87-
REF_STR_OpenGL,
85+
REF_STR_Renderer = 0x10000000,
86+
REF_STR_Software,
87+
REF_STR_OpenGL,
8888

89-
REF_STR_MousLook = 0x11000000,
90-
REF_STR_MousNorm,
91-
REF_STR_MousInv,
89+
REF_STR_TextFilt = 0x10000010,
90+
REF_STR_TFUnfil, // unfiltered
91+
REF_STR_TFBilin, // bilinear
9292

93-
REF_STR_Seqer = 0x20000000,
94-
REF_STR_ADLMIDI,
95-
REF_STR_NativeMI,
93+
REF_STR_MousLook = 0x11000000,
94+
REF_STR_MousNorm,
95+
REF_STR_MousInv,
96+
97+
REF_STR_Seqer = 0x20000000,
98+
REF_STR_ADLMIDI,
99+
REF_STR_NativeMI,
96100
#ifdef USE_FLUIDSYNTH
97-
REF_STR_FluidSyn,
101+
REF_STR_FluidSyn,
98102
#endif // USE_FLUIDSYNTH
99-
REF_STR_MidiOut = 0x2fffffff,
103+
REF_STR_MidiOut = 0x2fffffff,
100104

101-
REF_STR_MidiOutX = 0x30000000 // 0x30000000-0x3fffffff are MIDI outputs
105+
REF_STR_MidiOutX = 0x30000000 // 0x30000000-0x3fffffff are MIDI outputs
102106
};
103107

104108
#endif // __WRAPPER_H

Diff for: src/GameSrc/wrapper.c

+27-9
Original file line numberDiff line numberDiff line change
@@ -367,6 +367,10 @@ static char *_get_temp_string(int num) {
367367
case REF_STR_Software: return "Software";
368368
case REF_STR_OpenGL: return "OpenGL";
369369

370+
case REF_STR_TextFilt: return "Tex Filter";
371+
case REF_STR_TFUnfil: return "Unfiltered";
372+
case REF_STR_TFBilin: return "Bilinear";
373+
370374
case REF_STR_MousLook: return "Mouselook";
371375
case REF_STR_MousNorm: return "Normal";
372376
case REF_STR_MousInv: return "Inverted";
@@ -1685,7 +1689,7 @@ void center_joy_pushbutton_func(uchar butid) {
16851689
}
16861690
}
16871691

1688-
static void renderer_dealfunc(bool use_opengl) {
1692+
static void renderer_dealfunc(bool unused) {
16891693
uiHideMouse(NULL);
16901694
render_run();
16911695
if (full_game_3d) {
@@ -1694,6 +1698,10 @@ static void renderer_dealfunc(bool use_opengl) {
16941698
opanel_redraw(FALSE);
16951699
}
16961700
uiShowMouse(NULL);
1701+
// recalculate menu in case a button needs to be added or removed
1702+
video_screen_init();
1703+
// suppress compiler warning
1704+
(void)unused;
16971705
}
16981706

16991707
void detail_dealfunc(uchar det) {
@@ -1881,50 +1889,60 @@ void video_screen_init(void) {
18811889
#endif
18821890

18831891
keys = get_temp_string(REF_STR_KeyEquivs3);
1884-
18851892
clear_obuttons();
1886-
18871893
i = 0;
18881894

18891895
#ifdef USE_OPENGL
1896+
// renderer
18901897
if(can_use_opengl()) {
18911898
standard_button_rect(&r, i, 2, 2, 2);
18921899
multi_init(i, 'g', REF_STR_Renderer, REF_STR_Software, ID_NULL,
18931900
sizeof(gShockPrefs.doUseOpenGL), &gShockPrefs.doUseOpenGL, 2, renderer_dealfunc, &r);
1894-
18951901
i++;
18961902
}
18971903
#endif
18981904

18991905
#ifdef SVGA_SUPPORT
1906+
// video mode
19001907
standard_button_rect(&r, i, 2, 2, 2);
19011908
pushbutton_init(SCREENMODE_BUTTON, keys[0], REF_STR_VideoText, wrapper_pushbutton_func, &r);
1902-
#endif
1903-
19041909
i++;
1910+
#endif
19051911

1912+
// detail level
19061913
standard_button_rect(&r, i, 2, 2, 2);
19071914
r.lr.x += 2;
19081915
multi_init(i, keys[1], REF_STR_OptionsText + 4, REF_STR_DetailLvl, REF_STR_DetailLvlFeedback,
19091916
sizeof(_fr_global_detail), &_fr_global_detail, 4, detail_dealfunc, &r);
1910-
19111917
i++;
19121918

1919+
// gamma
19131920
standard_slider_rect(&r, i, 2, 2);
19141921
r.ul.x = r.ul.x + 1;
19151922
sliderbase = ((r.lr.x - r.ul.x - 1) * 29 / 100);
19161923
slider_init(i, REF_STR_OptionsText + 3, sizeof(ushort), TRUE, &(gShockPrefs.doGamma), 100,
19171924
sliderbase, gamma_slider_dealfunc, &r);
1925+
i++;
19181926

19191927
#if defined(VFX1_SUPPORT) || defined(CTM_SUPPORT)
1920-
i++;
19211928
standard_button_rect(&r, i, 2, 2, 2);
19221929
pushbutton_init(HEADSET_BUTTON, keys[2], REF_STR_HeadsetText, wrapper_pushbutton_func, &r);
19231930
if (!inp6d_headset)
19241931
dim_pushbutton(HEADSET_BUTTON);
1932+
i++;
19251933
#endif
19261934

1927-
i++;
1935+
#ifdef USE_OPENGL
1936+
// textre filter
1937+
if(can_use_opengl() && gShockPrefs.doUseOpenGL) {
1938+
standard_button_rect(&r, i, 2, 2, 2);
1939+
multi_init(i, 't', REF_STR_TextFilt, REF_STR_TFUnfil, ID_NULL,
1940+
sizeof(gShockPrefs.doTextureFilter), &gShockPrefs.doTextureFilter, 2, renderer_dealfunc, &r);
1941+
i++;
1942+
}
1943+
#endif
1944+
1945+
// return (fixed at position 5)
19281946
standard_button_rect(&r, 5, 2, 2, 2);
19291947
pushbutton_init(RETURN_BUTTON, keys[3], REF_STR_OptionsText + 5, wrapper_pushbutton_func, &r);
19301948

Diff for: src/MacSrc/OpenGL.cc

+49-17
Original file line numberDiff line numberDiff line change
@@ -127,6 +127,32 @@ static const float IdentityMatrix[] = {
127127
0.0, 0.0, 0.0, 1.0
128128
};
129129

130+
static inline GLint get_texture_min_func() {
131+
// convert prefs texture filtering mode to GL min func value
132+
switch (gShockPrefs.doTextureFilter) {
133+
case 0: return GL_NEAREST;
134+
case 1: return GL_LINEAR;
135+
// case 2: return GL_LINEAR_MIPMAP_LINEAR;
136+
}
137+
138+
WARN("gShockPrefs.doTextureFilter=%d is invalid; resetting to zero (unflitered)", gShockPrefs.doTextureFilter);
139+
gShockPrefs.doTextureFilter = 0;
140+
return GL_NEAREST;
141+
}
142+
143+
static inline GLint get_texture_mag_func() {
144+
// convert prefs texture filtering mode to GL mag func value
145+
switch (gShockPrefs.doTextureFilter) {
146+
case 0: return GL_NEAREST;
147+
case 1: return GL_LINEAR;
148+
case 2: return GL_LINEAR;
149+
}
150+
151+
WARN("gShockPrefs.doTextureFilter=%d is invalid; resetting to zero (unflitered)", gShockPrefs.doTextureFilter);
152+
gShockPrefs.doTextureFilter = 0;
153+
return GL_NEAREST;
154+
}
155+
130156
static void set_blend_mode(bool enabled) {
131157
// change the blend mode, if not set already
132158
if(blend_enabled != enabled) {
@@ -475,16 +501,22 @@ void opengl_swap_and_restore() {
475501
}
476502

477503
void toggle_opengl() {
478-
if (!gShockPrefs.doUseOpenGL) {
479-
message_info("OpenGL rendering, no texture filter");
480-
gShockPrefs.doUseOpenGL = true;
481-
gShockPrefs.doLinearScaling = false;
482-
} else if (!gShockPrefs.doLinearScaling) {
483-
message_info("OpenGL rendering, linear texture filter");
484-
gShockPrefs.doLinearScaling = true;
504+
if (gShockPrefs.doUseOpenGL) {
505+
switch (gShockPrefs.doTextureFilter) {
506+
case 0: {
507+
message_info("Switching to OpenGL bilinear rendering");
508+
gShockPrefs.doTextureFilter = 1;
509+
} break;
510+
case 1: {
511+
message_info("Switching to sofware rendering");
512+
gShockPrefs.doUseOpenGL = false;
513+
gShockPrefs.doTextureFilter = 0;
514+
} break;
515+
}
485516
} else {
486-
message_info("Software rendering");
487-
gShockPrefs.doUseOpenGL = false;
517+
message_info("Switching to OpenGL unfiltered");
518+
gShockPrefs.doUseOpenGL = true;
519+
gShockPrefs.doTextureFilter = 0;
488520
}
489521
SavePrefs();
490522
}
@@ -695,8 +727,8 @@ int opengl_light_tmap(int n, g3s_phandle *vp, grs_bitmap *bm) {
695727
glUseProgram(textureShaderProgram.shaderProgram);
696728

697729
set_texture(bm);
698-
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, gShockPrefs.doLinearScaling ? GL_LINEAR : GL_NEAREST);
699-
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, gShockPrefs.doLinearScaling ? GL_LINEAR : GL_NEAREST);
730+
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, get_texture_min_func());
731+
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, get_texture_mag_func());
700732

701733
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
702734
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
@@ -743,8 +775,8 @@ int opengl_bitmap(grs_bitmap *bm, int n, grs_vertex **vpl, grs_tmap_info *ti) {
743775
glUniformMatrix4fv(textureShaderProgram.uniProj, 1, false, IdentityMatrix);
744776

745777
set_texture(bm);
746-
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, gShockPrefs.doLinearScaling ? GL_LINEAR : GL_NEAREST);
747-
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, gShockPrefs.doLinearScaling ? GL_LINEAR : GL_NEAREST);
778+
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, get_texture_min_func());
779+
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, get_texture_mag_func());
748780

749781
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_BORDER);
750782
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_BORDER);
@@ -819,8 +851,8 @@ int opengl_draw_poly(long c, int n_verts, g3s_phandle *p, char gour_flag) {
819851
set_color(color.r, color.g, color.b, 255);
820852
}
821853

822-
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, gShockPrefs.doLinearScaling ? GL_LINEAR : GL_NEAREST);
823-
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, gShockPrefs.doLinearScaling ? GL_LINEAR : GL_NEAREST);
854+
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, get_texture_min_func());
855+
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, get_texture_mag_func());
824856

825857
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
826858
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
@@ -861,8 +893,8 @@ void opengl_begin_stars() {
861893

862894
set_blend_mode(true);
863895

864-
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, gShockPrefs.doLinearScaling ? GL_LINEAR : GL_NEAREST);
865-
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, gShockPrefs.doLinearScaling ? GL_LINEAR : GL_NEAREST);
896+
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, get_texture_mag_func());
897+
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, get_texture_mag_func());
866898

867899
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
868900
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);

Diff for: src/MacSrc/Prefs.c

+7-5
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@ static const char *PREF_VIDEOMODE = "video-mode";
7575
static const char *PREF_HALFRES = "half-resolution";
7676
static const char *PREF_DETAIL = "detail";
7777
static const char *PREF_USE_OPENGL = "use-opengl";
78-
static const char *PREF_LIN_SCALING = "linear-scaling";
78+
static const char *PREF_TEX_FILTER = "texture-filter";
7979
static const char *PREF_ONSCR_HELP = "onscreen-help";
8080
static const char *PREF_GAMMA = "gamma";
8181
static const char *PREF_MSG_LENGTH = "message-length";
@@ -115,7 +115,7 @@ void SetDefaultPrefs(void) {
115115
gShockPrefs.doResolution = 0; // High-res.
116116
gShockPrefs.doDetail = 3; // Max detail.
117117
gShockPrefs.doUseOpenGL = false;
118-
gShockPrefs.doLinearScaling = false;
118+
gShockPrefs.doTextureFilter = 0; // unfiltered
119119
gShockPrefs.goOnScreenHelp = true;
120120
gShockPrefs.doGamma = 29; // Default gamma (29 out of 100).
121121
gShockPrefs.goMsgLength = 0; // Normal
@@ -212,8 +212,10 @@ OSErr LoadPrefs(void) {
212212
gShockPrefs.doDetail = detail;
213213
} else if (strcasecmp(key, PREF_USE_OPENGL) == 0) {
214214
gShockPrefs.doUseOpenGL = is_true(value);
215-
} else if (strcasecmp(key, PREF_LIN_SCALING) == 0) {
216-
gShockPrefs.doLinearScaling = is_true(value);
215+
} else if (strcasecmp(key, PREF_TEX_FILTER) == 0) {
216+
int mode = atoi(value);
217+
if (mode >= 0 && mode <= 1)
218+
gShockPrefs.doTextureFilter = (short)mode;
217219
} else if (strcasecmp(key, PREF_ONSCR_HELP) == 0) {
218220
gShockPrefs.goOnScreenHelp = is_true(value);
219221
} else if (strcasecmp(key, PREF_GAMMA) == 0) {
@@ -267,7 +269,7 @@ OSErr SavePrefs(void) {
267269
fprintf(f, "%s = %s\n", PREF_HALFRES, DoubleSize ? "yes" : "no");
268270
fprintf(f, "%s = %d\n", PREF_DETAIL, _fr_global_detail);
269271
fprintf(f, "%s = %s\n", PREF_USE_OPENGL, gShockPrefs.doUseOpenGL ? "yes" : "no");
270-
fprintf(f, "%s = %s\n", PREF_LIN_SCALING, gShockPrefs.doLinearScaling ? "yes" : "no");
272+
fprintf(f, "%s = %d\n", PREF_TEX_FILTER, gShockPrefs.doTextureFilter);
271273
fprintf(f, "%s = %s\n", PREF_ONSCR_HELP, gShockPrefs.goOnScreenHelp ? "yes" : "no");
272274
fprintf(f, "%s = %d\n", PREF_GAMMA, gShockPrefs.doGamma);
273275
fprintf(f, "%s = %d\n", PREF_MSG_LENGTH, gShockPrefs.goMsgLength);

Diff for: src/MacSrc/Prefs.h

+4-1
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,10 @@ typedef struct {
5757
short doGamma;
5858
Boolean doUseQD;
5959
Boolean doUseOpenGL;
60-
Boolean doLinearScaling;
60+
// 0 => unfiltered
61+
// 1 => bilinear
62+
// TODO: add trilinear, anisotropic?
63+
short doTextureFilter;
6164
} ShockPrefs;
6265

6366
//--------------------

0 commit comments

Comments
 (0)