Вопрос [NL] render.shadow problem (?)

dsc.gg/solar-tech
Продавец
Статус
Оффлайн
Регистрация
10 Мар 2022
Сообщения
140
Реакции[?]
53
Поинты[?]
15K
Заметил такую особенность: если в x или y присутствуют числа после нуля (X: 431.78018), то начинается не корректное отображение на пиксель, эта проблема касается только "render.shadow", ниже код и скрин для понимания.

Сталкивался ли кто с данной проблемой и как вы ее решили? (Кроме убирания чисел после нуля)

code_language.lua:
rectangle_glow = function(x, y, w, h, r, g, b, a)
    render.rect(vector(x, y), vector(x + w, y + h), color(17, 17, 17, 155), 2.5, true)
    render.rect_outline(vector(x, y), vector(x + w, y + h), color(r, g, b, 100), 1, 2.5, true)
    render.shadow(vector(x, y), vector(x + w, y + h), color(r, g, b, a), 20, 0, 2.5)
end
105911BB-AEBD-4E51-AF21-2590E6C16200.png
1C871A84-FFF5-4156-B733-A66DB11E42D8.png
 
Последнее редактирование:
Дизайнер
Статус
Оффлайн
Регистрация
18 Авг 2017
Сообщения
1,924
Реакции[?]
2,245
Поинты[?]
146K
Товары в продаже
1
оно просто округлило число
431.7 ≈ 432

если тебе это не надо, округляй сам через math.floor
 
Начинающий
Статус
Оффлайн
Регистрация
14 Апр 2021
Сообщения
53
Реакции[?]
8
Поинты[?]
0
Эммм, если что у тебя положение в пикселях по x и y, они не могут быть float. Если ты допустим для анимки используешь float значения, тебе нужно ее round'ить.
round fn:
local function round(num)
    return math.floor(num+0.5);
end
Причина в том, что прямая конверсия из float->int не делает никаких округлений, e. g. int(2.6) == 2 || int(0.99999999999999) == 0 || int(-1.8) == -1 (P.S. 0.9... мб может быть 1 так как там конверсия периода типо, чтобы 10/3*3 = 10)

usage xd:
local round_vector = function (v) v.x = round(v.x); v.y = round(v.y); v.z = round(v.z); return v end;
Можно было сделать минималистичнeе и добавить метод в класс вектора, но чита я в данный момент не имею и такое сделать не могу.

usage xd2:
rectangle_glow = function(x, y, w, h, r, g, b, a)
    render.rect(round_vector(vector(x, y)), round_vector(vector(x + w, y + h)), color(17, 17, 17, 155), 2.5, true)
    render.rect_outline(round_vector(vector(x, y)), round_vector(vector(x + w, y + h)), color(r, g, b, 100), 1, 2.5, true)
    render.shadow(round_vector(vector(x, y)), round_vector(vector(x + w, y + h)), color(r, g, b, a), 20, 0, 2.5)
end
 
Начинающий
Статус
Оффлайн
Регистрация
15 Янв 2021
Сообщения
77
Реакции[?]
15
Поинты[?]
0
Эммм, если что у тебя положение в пикселях по x и y, они не могут быть float. Если ты допустим для анимки используешь float значения, тебе нужно ее round'ить.
round fn:
local function round(num)
    return math.floor(num+0.5);
end
Причина в том, что прямая конверсия из float->int не делает никаких округлений, e. g. int(2.6) == 2 || int(0.99999999999999) == 0 || int(-1.8) == -1 (P.S. 0.9... мб может быть 1 так как там конверсия периода типо, чтобы 10/3*3 = 10)

usage xd:
local round_vector = function (v) v.x = round(v.x); v.y = round(v.y); v.z = round(v.z); return v end;
Можно было сделать минималистичнeе и добавить метод в класс вектора, но чита я в данный момент не имею и такое сделать не могу.

usage xd2:
rectangle_glow = function(x, y, w, h, r, g, b, a)
    render.rect(round_vector(vector(x, y)), round_vector(vector(x + w, y + h)), color(17, 17, 17, 155), 2.5, true)
    render.rect_outline(round_vector(vector(x, y)), round_vector(vector(x + w, y + h)), color(r, g, b, 100), 1, 2.5, true)
    render.shadow(round_vector(vector(x, y)), round_vector(vector(x + w, y + h)), color(r, g, b, a), 20, 0, 2.5)
end
либо просто использовать :floor()
 
Начинающий
Статус
Оффлайн
Регистрация
14 Апр 2021
Сообщения
53
Реакции[?]
8
Поинты[?]
0
либо просто использовать :floor()
Если ты имеешь ввиду
JavaScript:
local round_vector = function (vec) vec = vec + vector(0.5, 0.5, 0.5); vec:floor(); return vec; end
-- e.g. round_vector(vector(1.6, 1.2, 1.9)) -> vector(2.1, 1.7, 2.4):floor() -> vector(2, 1, 2)
то логику работы кода это не меняет + я еще сверху упомянул, что у меня нету подписки и я использовал функции апи, которые я могу без нее проверить.
 
Сверху Снизу