Исходник Гайд RenderScreenBuffer - наконец-то SAMP на mimgui

RenderScreenBuffer - простенькая библиотека на C++ для получения буфера окна в качестве текстуры для рендера.

Исходный код: GitHub
Имеет как CAPI, так и полноценный API C++ библиотеки, которую при необходимости вы можете подключить свой проект. На все том же CAPI реализована обертка для Lua, таким образом можно использовать внутри MoonLoader.

Первое, что приходит на ум - рендер окна игры внутри окна ImGui:
Lua:
local RenderScreenBuffer = require("RenderScreenBuffer")
local imgui = require("mimgui")

local renderer = nil

function main()
  -- Аргументы: minX, minY, maxX, maxY
  renderer = RenderScreenBuffer:new(100, 100, 200, 200)
  --[[
    Fullscreen:
    renderer = RenderScreenBuffer:new()
  ]]
end

imgui.OnInitialize(function()
  imgui.GetIO().IniFilename = nil
end)

imgui.OnFrame(
  function() return true end,
  function(player)
    local sizeX, sizeY = getScreenResolution()
    imgui.SetNextWindowPos(imgui.ImVec2(sizeX / 2, sizeY / 2), imgui.Cond.FirstUseEver, imgui.ImVec2(0.5, 0.5))
    imgui.SetNextWindowSize(imgui.ImVec2(500, 500), imgui.Cond.FirstUseEver)
    imgui.Begin("Main Window")
    if renderer ~= nil then
      local texture = renderer:get()
      if texture then
        imgui.Image(texture, imgui.ImVec2(100, 100))
      end
    end
    imgui.End()
  end
)
1750000573771.png
1750000886554.png

Но никто не мешает делать более интересные штуки, к примеру, скриншоты игры:
Lua:
local RenderScreenBuffer = require("RenderScreenBuffer")
local ffi = require("ffi")

ffi.cdef [[
  long D3DXSaveTextureToFileA(
    const char* pDestFile,
    int DestFormat,
    void* pSrcTexture,
    const void *pSrcPalette
  );
]]

local d3dx9 = ffi.load(("%s\\d3dx9_25.dll"):format(getFolderPath(0x25)))

function main()
  local renderer = RenderScreenBuffer:new(100, 100, 200, 200)

  while not isSampAvailable() do wait(0) end
  sampRegisterChatCommand("ts", function()
    local path = [[C:\Users\egaaa\OneDrive\Рабочий стол\test.png]]
    d3dx9.D3DXSaveTextureToFileA(path, 3, renderer:get(), nil)
    sampAddChatMessage("TakeScreenshot", -1)
  end)
end

Установка для MoonLoader: разархивировать содержимое архива в папку moonloader/lib
 

Вложения

  • RenderScreenBuffer.rar
    5.9 KB · Просмотры: 7