CheatMenuSA/moonloader/lib/mimgui/dx9.lua

172 lines
6.6 KiB
Lua
Raw Normal View History

2020-12-02 16:18:34 -05:00
-- This file is part of mimgui project
-- Licensed under the MIT License
-- Copyright (c) 2018, FYP <https://github.com/THE-FYP>
local imgui = require 'mimgui.imgui'
local lib = imgui.lib
local ffi = require 'ffi'
ffi.cdef [[
typedef struct IDirect3DDevice9 *LPDIRECT3DDEVICE9, *PDIRECT3DDEVICE9;
typedef struct IDirect3DVertexBuffer9 *LPDIRECT3DVERTEXBUFFER9, *PDIRECT3DVERTEXBUFFER9;
typedef struct IDirect3DIndexBuffer9 *LPDIRECT3DINDEXBUFFER9, *PDIRECT3DINDEXBUFFER9;
typedef struct IDirect3DTexture9 *LPDIRECT3DTEXTURE9, *PDIRECT3DTEXTURE9;
typedef const char *LPCTSTR;
typedef const void *LPCVOID;
typedef unsigned int UINT;
typedef void *HWND;
typedef signed __int64 INT64, *PINT64;
typedef unsigned int UINT_PTR, *PUINT_PTR;
typedef long LONG_PTR, *PLONG_PTR;
typedef UINT_PTR WPARAM;
typedef LONG_PTR LPARAM;
typedef LONG_PTR LRESULT;
typedef struct ImGui_ImplDX9_Context
{
LPDIRECT3DDEVICE9 pd3dDevice;
LPDIRECT3DVERTEXBUFFER9 pVB;
LPDIRECT3DINDEXBUFFER9 pIB;
LPDIRECT3DTEXTURE9 FontTexture;
int VertexBufferSize;
int IndexBufferSize;
} ImGui_ImplDX9_Context;
bool ImGui_ImplWin32_Init(HWND hwnd, INT64* ticksPerSecond, INT64* time);
void ImGui_ImplWin32_NewFrame(HWND hwnd, INT64 ticksPerSecond, INT64* time);
LRESULT ImGui_ImplWin32_WndProcHandler(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam);
ImGui_ImplDX9_Context* ImGui_ImplDX9_Init(LPDIRECT3DDEVICE9 device);
void ImGui_ImplDX9_Shutdown(ImGui_ImplDX9_Context* context);
void ImGui_ImplDX9_NewFrame(ImGui_ImplDX9_Context* context);
void ImGui_ImplDX9_RenderDrawData(ImGui_ImplDX9_Context* context, ImDrawData* draw_data);
void ImGui_ImplDX9_InvalidateDeviceObjects(ImGui_ImplDX9_Context* context);
bool ImGui_ImplDX9_CreateFontsTexture(ImGui_ImplDX9_Context* context); // replaces ImGui_ImplDX9_CreateDeviceObjects since they are the same
void ImGui_ImplDX9_InvalidateFontsTexture(ImGui_ImplDX9_Context* context);
LPDIRECT3DTEXTURE9 ImGui_ImplDX9_CreateTextureFromFile(LPDIRECT3DDEVICE9 device, LPCTSTR path);
LPDIRECT3DTEXTURE9 ImGui_ImplDX9_CreateTextureFromFileInMemory(LPDIRECT3DDEVICE9 device, LPCVOID src, UINT size);
void ImGui_ImplDX9_ReleaseTexture(LPDIRECT3DTEXTURE9 tex);
int __stdcall MultiByteToWideChar(UINT CodePage, unsigned long dwFlags, const char* lpMultiByteStr, int cbMultiByte, wchar_t* lpWideCharStr, int cchWideChar);
]]
local ImplDX9 = {}
function ImplDX9.new(device, hwnd)
-- ImGui_ImplDX9_Context* ImGui_ImplDX9_Init(LPDIRECT3DDEVICE9 device);
local obj = {}
local d3dcontext = lib.ImGui_ImplDX9_Init(device)
if d3dcontext == nil then
return nil
end
local context = imgui.CreateContext()
obj.ticksPerSecond = ffi.new('INT64[1]', 0)
obj.time = ffi.new('INT64[1]', 0)
imgui.SetCurrentContext(context)
local imio = imgui.GetIO()
imio.BackendRendererName = 'imgui_impl_dx9_lua'
imio.BackendFlags = bit.bor(imio.BackendFlags, lib.ImGuiBackendFlags_RendererHasVtxOffset) -- We can honor the ImDrawCmd::VtxOffset field, allowing for large meshes.
-- bool ImGui_ImplWin32_Init(HWND hwnd, INT64* ticksPerSecond, INT64* time);
if not lib.ImGui_ImplWin32_Init(hwnd, obj.ticksPerSecond, obj.time) then
-- void ImGui_ImplDX9_Shutdown(ImGui_ImplDX9_Context* context);
lib.ImGui_ImplDX9_Shutdown(d3dcontext)
imgui.DestroyContext(context)
return nil
end
obj.context = context
obj.d3dcontext = d3dcontext
obj.d3ddevice = device
obj.hwnd = hwnd
-- set finalizer
ffi.gc(d3dcontext, function(cd)
imgui.SetCurrentContext(context)
-- void ImGui_ImplDX9_Shutdown(ImGui_ImplDX9_Context* context);
lib.ImGui_ImplDX9_Shutdown(cd)
imgui.DestroyContext(context)
end)
return setmetatable(obj, {__index = ImplDX9})
end
function ImplDX9:SwitchContext()
imgui.SetCurrentContext(self.context)
end
function ImplDX9:NewFrame()
self:SwitchContext()
-- void ImGui_ImplDX9_NewFrame(ImGui_ImplDX9_Context* context);
lib.ImGui_ImplDX9_NewFrame(self.d3dcontext)
-- void ImGui_ImplWin32_NewFrame(HWND hwnd, INT64 ticksPerSecond, INT64* time);
lib.ImGui_ImplWin32_NewFrame(self.hwnd, self.ticksPerSecond[0], self.time)
imgui.NewFrame()
end
function ImplDX9:EndFrame()
self:SwitchContext()
imgui.Render()
-- void ImGui_ImplDX9_RenderDrawData(ImGui_ImplDX9_Context* context, ImDrawData* draw_data);
lib.ImGui_ImplDX9_RenderDrawData(self.d3dcontext, imgui.GetDrawData())
end
function ImplDX9:WindowMessage(msg, wparam, lparam)
self:SwitchContext()
if msg == 0x0102 then -- WM_CHAR
if wparam < 256 then
local char = ffi.new('char[1]', wparam)
local wchar = ffi.new('wchar_t[1]', 0)
if ffi.C.MultiByteToWideChar(0, 0, char, 1, wchar, 1) > 0 then
wparam = wchar[0]
end
end
end
-- LRESULT ImGui_ImplWin32_WndProcHandler(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam);
return lib.ImGui_ImplWin32_WndProcHandler(self.hwnd, msg, wparam, lparam)
end
function ImplDX9:InvalidateDeviceObjects()
self:SwitchContext()
-- void ImGui_ImplDX9_InvalidateDeviceObjects(ImGui_ImplDX9_Context* context);
lib.ImGui_ImplDX9_InvalidateDeviceObjects(self.d3dcontext)
end
function ImplDX9:CreateTextureFromFile(path)
-- LPDIRECT3DTEXTURE9 ImGui_ImplDX9_CreateTextureFromFile(LPDIRECT3DDEVICE9 device, LPCTSTR path);
local tex = lib.ImGui_ImplDX9_CreateTextureFromFile(self.d3ddevice, path)
if tex == nil then
return nil
end
-- void ImGui_ImplDX9_ReleaseTexture(LPDIRECT3DTEXTURE9 tex);
return ffi.gc(tex, lib.ImGui_ImplDX9_ReleaseTexture)
end
function ImplDX9:CreateTextureFromFileInMemory(src, size)
-- LPDIRECT3DTEXTURE9 ImGui_ImplDX9_CreateTextureFromFileInMemory(LPDIRECT3DDEVICE9 device, LPCVOID src, UINT size);
if type(src) == 'number' then
src = ffi.cast('LPCVOID', src)
end
local tex = lib.ImGui_ImplDX9_CreateTextureFromFileInMemory(self.d3ddevice, src, size)
if tex == nil then
return nil
end
-- void ImGui_ImplDX9_ReleaseTexture(LPDIRECT3DTEXTURE9 tex);
return ffi.gc(tex, lib.ImGui_ImplDX9_ReleaseTexture)
end
function ImplDX9:ReleaseTexture(tex)
ffi.gc(tex, nil)
lib.ImGui_ImplDX9_ReleaseTexture(tex)
end
function ImplDX9:CreateFontsTexture()
self:SwitchContext()
-- bool ImGui_ImplDX9_CreateFontsTexture(ImGui_ImplDX9_Context* context);
return lib.ImGui_ImplDX9_CreateFontsTexture(self.d3dcontext)
end
function ImplDX9:InvalidateFontsTexture()
self:SwitchContext()
-- void ImGui_ImplDX9_InvalidateFontsTexture(ImGui_ImplDX9_Context* context);
lib.ImGui_ImplDX9_InvalidateFontsTexture(self.d3dcontext)
end
return ImplDX9