Как рендерить сетку

- |2347| -

Известный
Автор темы
344
115
Версия MoonLoader
.026-beta
Подскажите, как сделать что-то подобное
1734461436284.png
 
Решение
небольшой сниппет (можно разобрать по частям, при желании, если всё не нужно)
Lua:
local vector3d = require("vector3d")

local sector_t = (function()
    local this = {}
    local draw

    function this:calc_all()
        self.data = { [0] = 1 }

        local step = {
            x = (self.max.x - self.min.x) / self.div,
            y = (self.max.y - self.min.y) / self.div
        }

        for i = 0, self.div do
            local x = self.min.x + step.x * i
            for j = 0, self.div do
                local y = self.min.y + step.y * j
                table.insert(self.data, vector3d(x, y, self.max.z))
            end
        end

        for i = 0, self.div do
            local y = self.min.y + step.y * i
            for j = 0...

wojciech?

Известный
Проверенный
355
237
небольшой сниппет (можно разобрать по частям, при желании, если всё не нужно)
Lua:
local vector3d = require("vector3d")

local sector_t = (function()
    local this = {}
    local draw

    function this:calc_all()
        self.data = { [0] = 1 }

        local step = {
            x = (self.max.x - self.min.x) / self.div,
            y = (self.max.y - self.min.y) / self.div
        }

        for i = 0, self.div do
            local x = self.min.x + step.x * i
            for j = 0, self.div do
                local y = self.min.y + step.y * j
                table.insert(self.data, vector3d(x, y, self.max.z))
            end
        end

        for i = 0, self.div do
            local y = self.min.y + step.y * i
            for j = 0, self.div do
                local x = self.min.x + step.x * j
                table.insert(self.data, vector3d(x, y, self.max.z))
            end
        end
    end

    function this:calc_raw()
        self.data = { [0] = 0 }

        local step = {
            x = (self.max.x - self.min.x) / self.div,
            y = (self.max.y - self.min.y) / self.div
        }

        for i = 0, self.div do
            local x = self.min.x + step.x * i
            local y = self.min.y + step.y * i
            table.insert(self.data, vector3d(x, self.min.y, self.max.z))
            table.insert(self.data, vector3d(x, self.max.y, self.max.z))
            table.insert(self.data, vector3d(self.min.x, y, self.max.z))
            table.insert(self.data, vector3d(self.max.x, y, self.max.z))
        end
    end

    function this:draw_all(func)
        local old
        for i, v in ipairs(self.data) do
            local r, x, y = convert3DCoordsToScreenEx(v.x, v.y, v.z, true, true)
            if r then
                if old then
                    local cur = { x = x, y = y }
                    func(old, cur)
                    old = cur
                else
                    old = { x = x, y = y }
                end
            end
            if i % (self.div + 1) == 0 then
                old = false
            end
        end
    end

    function this:draw_raw(func)
        local t = self.data
        for i = 1, #t, 2 do
            local r1, x1, y1 = convert3DCoordsToScreenEx(t[i].x, t[i].y, t[i].z, true, true)
            local r2, x2, y2 = convert3DCoordsToScreenEx(t[i + 1].x, t[i + 1].y, t[i + 1].z, true, true)
            if r1 and r2 then
                func({ x = x1, y = y1 }, { x = x2, y = y2 })
            end
        end
    end

    function this:draw(func)
        local f = self.data and draw[(self.data[0])]
        if f then
            f(self, func)
        end
    end

    draw = {
        [0] = this.draw_raw,
        [1] = this.draw_all
    }

    local function constructor(_, min, max, div)
        return setmetatable({ min = min, max = max, div = div }, { __index = this })
    end

    return setmetatable(this, { __call = constructor })
end)()

использование:
Lua:
local imgui = require("mimgui")
local vector3d = require("vector3d")

-- sector_t из кода выше

-- точки на карте
local min = vector3d(1165, -2044, 69)
local max = vector3d(1182, -2032, 69)

-- 10 и 20 количество квадратов в одной линии
local all = sector_t(min, max, 10)
local raw = sector_t(min, max, 20)

-- calc_all рассчитает все возможные линии
-- в этом случае 242 точки
all:calc_all()

-- calc_raw только от одной стороны сектора к другой
-- в этом случае 84 точки
raw:calc_raw()

imgui.OnFrame(function() return isPlayerPlaying(PLAYER_HANDLE) end,
function(this)
    local dl = imgui.GetBackgroundDrawList()

    raw:draw(function(a, b)
        dl:AddLine(imgui.ImVec2(a.x, a.y), imgui.ImVec2(b.x, b.y), 0x690000FF, 2)
    end)

    all:draw(function(a, b)
        renderDrawLine(a.x, a.y, b.x, b.y, 2, 0x6900FF00)
        -- если пользоваться рендером муна, то можно засунуть это в беск.цикл или в событие onD3DPresent
    end)
end).HideCursor = true

получится что-то вроде этого:
1734474024027.png


расчет всех точек (calc_all, на скрине зеленый) относительно гарантировано отрендерит всю зону в дальнейшем, грубый расчет (calc_raw, на скрине красный) только если все точки находятся в пределах экрана
1734474374508.png