Skip to content

Instantly share code, notes, and snippets.

@nkrapivin
Created June 26, 2024 16:21
Show Gist options
  • Save nkrapivin/893e256eba1e28a83863761b777436c6 to your computer and use it in GitHub Desktop.
Save nkrapivin/893e256eba1e28a83863761b777436c6 to your computer and use it in GitHub Desktop.
Off-by-one fix script for GameMaker
// 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