Created
June 26, 2024 16:21
-
-
Save nkrapivin/893e256eba1e28a83863761b777436c6 to your computer and use it in GitHub Desktop.
Off-by-one fix script for GameMaker
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// some graphics functions on consoles are off-by-one pixel >:( | |
// GameMaker adds +1 on DX11 (and DX12 since 2022.0.2.49) | |
// but doesn't do this for OpenGL (it adds 0.01 which does nothing) | |
// and it doesn't do this for Gnm (PS4) so when adding +1 ourselves | |
// this brings back DX11 behavior on PS4 and Switch targets (hopefully????) | |
global.nik_fudge = | |
((os_type == os_linux) || (os_type == os_macosx) || (os_type == os_switch) || (os_type == os_ps4)) | |
? 1.0 // OpenGL or PS4 graphics platforms... | |
: 0.0; | |
// FYI: macOS is still an OpenGL platform in GameMaker :) | |
function drawnik_point(a_x, a_y) { | |
var l_fudge = global.nik_fudge; | |
a_x += l_fudge; | |
a_y += l_fudge; | |
draw_point(a_x, a_y); | |
} | |
function drawnik_point_color(a_x, a_y, a_color) { | |
var l_fudge = global.nik_fudge; | |
a_x += l_fudge; | |
a_y += l_fudge; | |
draw_point_color(a_x, a_y, a_color); | |
} | |
function drawnik_line(a_x1, a_y1, a_x2, a_y2) { | |
var l_fudge = global.nik_fudge; | |
a_x1 += l_fudge; | |
a_y1 += l_fudge; | |
a_x2 += l_fudge; | |
a_y2 += l_fudge; | |
draw_line(a_x1, a_y1, a_x2, a_y2); | |
} | |
function drawnik_line_color(a_x1, a_y1, a_x2, a_y2, a_col1, a_col2) { | |
var l_fudge = global.nik_fudge; | |
a_x1 += l_fudge; | |
a_y1 += l_fudge; | |
a_x2 += l_fudge; | |
a_y2 += l_fudge; | |
draw_line_color(a_x1, a_y1, a_x2, a_y2, a_col1, a_col2); | |
} | |
function drawnik_line_width(a_x1, a_y1, a_x2, a_y2, a_w) { | |
var l_fudge = global.nik_fudge; | |
a_x1 += l_fudge; | |
a_y1 += l_fudge; | |
a_x2 += l_fudge; | |
a_y2 += l_fudge; | |
draw_line_width(a_x1, a_y1, a_x2, a_y2, a_w); | |
} | |
function drawnik_line_width_color(a_x1, a_y1, a_x2, a_y2, a_w, a_col1, a_col2) { | |
var l_fudge = global.nik_fudge; | |
a_x1 += l_fudge; | |
a_y1 += l_fudge; | |
a_x2 += l_fudge; | |
a_y2 += l_fudge; | |
draw_line_width_color(a_x1, a_y1, a_x2, a_y2, a_w, a_col1, a_col2); | |
} | |
function drawnik_triangle(a_x1, a_y1, a_x2, a_y2, a_x3, a_y3, a_outline) { | |
var l_fudge = global.nik_fudge; | |
a_x1 += l_fudge; | |
a_y1 += l_fudge; | |
a_x2 += l_fudge; | |
a_y2 += l_fudge; | |
a_x3 += l_fudge; | |
a_y3 += l_fudge; | |
draw_triangle(a_x1, a_y1, a_x2, a_y2, a_x3, a_y3, a_outline); | |
} | |
function drawnik_triangle_color(a_x1, a_y1, a_x2, a_y2, a_x3, a_y3, a_col1, a_col2, a_col3, a_outline) { | |
var l_fudge = global.nik_fudge; | |
a_x1 += l_fudge; | |
a_y1 += l_fudge; | |
a_x2 += l_fudge; | |
a_y2 += l_fudge; | |
a_x3 += l_fudge; | |
a_y3 += l_fudge; | |
draw_triangle_color(a_x1, a_y1, a_x2, a_y2, a_x3, a_y3, a_col1, a_col2, a_col3, a_outline); | |
} | |
function drawnik_rectangle(a_x1, a_y1, a_x2, a_y2, a_outline) { | |
var l_fudge = global.nik_fudge; | |
// this is intentional! there's extra fudging when outline is false on OpenGL | |
// but not on PS4... >:((( | |
if (a_outline || (os_type == os_ps4)) { | |
a_x2 += l_fudge; | |
a_y2 += l_fudge; | |
} | |
draw_rectangle(a_x1, a_y1, a_x2, a_y2, a_outline); | |
} | |
function drawnik_rectangle_color(a_x1, a_y1, a_x2, a_y2, a_col1, a_col2, a_col3, a_col4, a_outline) { | |
var l_fudge = global.nik_fudge; | |
// this is intentional! there's extra fudging when outline is false on OpenGL | |
// but not on PS4... >:((( | |
if (a_outline || (os_type == os_ps4)) { | |
a_x2 += l_fudge; | |
a_y2 += l_fudge; | |
} | |
draw_rectangle_color(a_x1, a_y1, a_x2, a_y2, a_col1, a_col2, a_col3, a_col4, a_outline); | |
} | |
function drawnik_ellipse(a_x1, a_y1, a_x2, a_y2, a_outline) { | |
var l_fudge = global.nik_fudge; | |
a_x1 += l_fudge; | |
a_y1 += l_fudge; | |
a_x2 += l_fudge; | |
a_y2 += l_fudge; | |
draw_ellipse(a_x1, a_y1, a_x2, a_y2, a_outline); | |
} | |
function drawnik_ellipse_color(a_x1, a_y1, a_x2, a_y2, a_col1, a_col2, a_outline) { | |
var l_fudge = global.nik_fudge; | |
a_x1 += l_fudge; | |
a_y1 += l_fudge; | |
a_x2 += l_fudge; | |
a_y2 += l_fudge; | |
draw_ellipse_color(a_x1, a_y1, a_x2, a_y2, a_col1, a_col2, a_outline); | |
} | |
function drawnik_roundrect(a_x1, a_y1, a_x2, a_y2, a_outline) { | |
var l_fudge = global.nik_fudge; | |
a_x1 += l_fudge; | |
a_y1 += l_fudge; | |
a_x2 += l_fudge; | |
a_y2 += l_fudge; | |
draw_roundrect(a_x1, a_y1, a_x2, a_y2, a_outline); | |
} | |
function drawnik_roundrect_color(a_x1, a_y1, a_x2, a_y2, a_col1, a_col2, a_outline) { | |
var l_fudge = global.nik_fudge; | |
a_x1 += l_fudge; | |
a_y1 += l_fudge; | |
a_x2 += l_fudge; | |
a_y2 += l_fudge; | |
draw_roundrect_color(a_x1, a_y1, a_x2, a_y2, a_col1, a_col2, a_outline); | |
} | |
function drawnik_roundrect_ext(a_x1, a_y1, a_x2, a_y2, a_radiusx, a_radiusy, a_outline) { | |
var l_fudge = global.nik_fudge; | |
a_x1 += l_fudge; | |
a_y1 += l_fudge; | |
a_x2 += l_fudge; | |
a_y2 += l_fudge; | |
draw_roundrect_ext(a_x1, a_y1, a_x2, a_y2, a_radiusx, a_radiusy, a_outline); | |
} | |
function drawnik_roundrect_color_ext(a_x1, a_y1, a_x2, a_y2, a_radiusx, a_radiusy, a_col1, a_col2, a_outline) { | |
var l_fudge = global.nik_fudge; | |
a_x1 += l_fudge; | |
a_y1 += l_fudge; | |
a_x2 += l_fudge; | |
a_y2 += l_fudge; | |
draw_roundrect_color_ext(a_x1, a_y1, a_x2, a_y2, a_radiusx, a_radiusy, a_col1, a_col2, a_outline); | |
} | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment