Исходник mimgui blur | Обновление 1.1!

Привет

эффект размытия, наконец, теперь и в mimgui

GitHub mimgui blur:

Скачать mimgui blur
Установка: переместить папку mimgui_blur из архива в папку «*Корневая папка с игрой*/moonloader/lib»


Список функций:
Lua:
mimgui_blur.apply(draw_list, radius, color, rounding, rounding_corners) -- размывает целиком указанный дравлист. все параметры, кроме draw_list, являются необязательными
mimgui_blur.applyItem(draw_list, radius, color, rounding, rounding_corners) -- размывает предыдущий элемент в дравлисте. все параметры, кроме draw_list, являются необязательными
mimgui_blur.applyRect(draw_list, pos_start, pos_end, radius, color, rounding, rounding_corners) -- размывает указанную область в дравлисте. все параметры, кроме draw_list, pos_start, pos_end являются необязательными
Следует отметить, что все эти функции можете вызывать до/после рендера элементов в окнах, и в зависимости от порядка вызова, соответственно, будут размываться те элементы, которые стояли до вызова apply(Item/Rect)

Пример использования:
Lua:
local imgui = require 'mimgui'
local vkeys = require 'vkeys'
local mimgui_blur = require 'mimgui_blur'
local wm = require 'windows.message'
local new = imgui.new
local renderWindow = new.bool(false)
local sizeX, sizeY = getScreenResolution()
local blurMode = false
local blurRadius = new.float(0.8)
local newFrame = imgui.OnFrame(
    function() return renderWindow[0] end,
    function(player)
        imgui.SetNextWindowPos(imgui.ImVec2(sizeX / 2, sizeY / 2), imgui.Cond.FirstUseEver, imgui.ImVec2(0.5, 0.5))
        imgui.SetNextWindowSize(imgui.ImVec2(800, 600), imgui.Cond.FirstUseEver)
        -- mimgui_blur.apply(imgui.GetBackgroundDrawList(), blurRadius[0])
        -- imgui.GetBackgroundDrawList():AddLine(imgui.ImVec2(math.huge, math.huge), imgui.ImVec2(math.huge, math.huge), 0xff0000ff)
        if imgui.Begin("Main Window", renderWindow) then
            imgui.Text("Hello")
            imgui.Text(string.format("Current render mode: %s", renderWindow[0]))
            if imgui.Button('Switch mode') then blurMode = not blurMode end
            imgui.SliderFloat("Blur radius", blurRadius, 0.0, 100.0)
            mimgui_blur.apply(not blurMode and imgui.GetWindowDrawList() or imgui.GetBackgroundDrawList(), blurRadius[0])
        end
        imgui.End()
    end
)
function main()
    addEventHandler('onWindowMessage', function(msg, wparam, lparam)
        if msg == wm.WM_KEYDOWN or msg == wm.WM_SYSKEYDOWN then
            if wparam == vkeys.VK_X then
                renderWindow[0] = not renderWindow[0]
            end
        end
    end)
    wait(-1)
end
 
Последнее редактирование:

#Northn

Pears Project — уже запущен!
Автор темы
Всефорумный модератор
2,652
2,535
в общем, всем снова привет. Меня тоже вдохновила тема того пользователя из раздела рынка, я сел копать и примерно через час уже был рабочий блюр. вот, как я его изначально написал:
Lua:
local ffi = require 'ffi'
local imgui = require 'mimgui'
local ImVec2 = imgui.ImVec2
ffi.cdef[[
    typedef long LONG;
    typedef LONG HRESULT;
    typedef int                 INT;
    typedef unsigned int        UINT;
    typedef unsigned int        *PUINT;
    typedef unsigned long       DWORD;
    typedef int                 BOOL;
    typedef unsigned char       BYTE;
    typedef unsigned short      WORD;
    typedef float               FLOAT;
    typedef void *HANDLE;
    typedef struct tagRECT {
        LONG    left;
        LONG    top;
        LONG    right;
        LONG    bottom;
    } RECT;
    typedef void* IDirect3DPixelShader9;
    typedef int D3DFORMAT;
    typedef int D3DPOOL;
    typedef int D3DBACKBUFFER_TYPE;
    typedef int D3DTEXTUREFILTERTYPE;
    typedef int D3DSAMPLERSTATETYPE;
    typedef struct {
        void *QueryInterface;
        void *AddRef;
        void *Release;
        void *TestCooperativeLevel;
        void *GetAvailableTextureMem;
        void *EvictManagedResources;
        void *GetDirect3D;
        void *GetDeviceCaps;
        void *GetDisplayMode;
        void *GetCreationParameters;
        void *SetCursorProperties;
        void *SetCursorPosition;
        void *ShowCursor;
        void *CreateAdditionalSwapChain;
        void *GetSwapChain;
        void *GetNumberOfSwapChains;
        void *Reset;
        void *Present;
        void *GetBackBuffer;
        void *GetRasterStatus;
        void *SetDialogBoxMode;
        void *SetGammaRamp;
        void *GetGammaRamp;
        void *CreateTexture;
        void *CreateVolumeTexture;
        void *CreateCubeTexture;
        void *CreateVertexBuffer;
        void *CreateIndexBuffer;
        void *CreateRenderTarget;
        void *CreateDepthStencilSurface;
        void *UpdateSurface;
        void *UpdateTexture;
        void *GetRenderTargetData;
        void *GetFrontBufferData;
        void *StretchRect;
        void *ColorFill;
        void *CreateOffscreenPlainSurface;
        void *SetRenderTarget;
        void *GetRenderTarget;
        void *SetDepthStencilSurface;
        void *GetDepthStencilSurface;
        void *BeginScene;
        void *EndScene;
        void *Clear;
        void *SetTransform;
        void *GetTransform;
        void *MultiplyTransform;
        void *SetViewport;
        void *GetViewport;
        void *SetMaterial;
        void *GetMaterial;
        void *SetLight;
        void *GetLight;
        void *LightEnable;
        void *GetLightEnable;
        void *SetClipPlane;
        void *GetClipPlane;
        void *SetRenderState;
        void *GetRenderState;
        void *CreateStateBlock;
        void *BeginStateBlock;
        void *EndStateBlock;
        void *SetClipStatus;
        void *GetClipStatus;
        void *GetTexture;
        void *SetTexture;
        void *GetTextureStageState;
        void *SetTextureStageState;
        void *GetSamplerState;
        void *SetSamplerState;
        void *ValidateDevice;
        void *SetPaletteEntries;
        void *GetPaletteEntries;
        void *SetCurrentTexturePalette;
        void *GetCurrentTexturePalette;
        void *SetScissorRect;
        void *GetScissorRect;
        void *SetSoftwareVertexProcessing;
        void *GetSoftwareVertexProcessing;
        void *SetNPatchMode;
        void *GetNPatchMode;
        void *DrawPrimitive;
        void *DrawIndexedPrimitive;
        void *DrawPrimitiveUP;
        void *DrawIndexedPrimitiveUP;
        void *ProcessVertices;
        void *CreateVertexDeclaration;
        void *SetVertexDeclaration;
        void *GetVertexDeclaration;
        void *SetFVF;
        void *GetFVF;
        void *CreateVertexShader;
        void *SetVertexShader;
        void *GetVertexShader;
        void *SetVertexShaderConstantF;
        void *GetVertexShaderConstantF;
        void *SetVertexShaderConstantI;
        void *GetVertexShaderConstantI;
        void *SetVertexShaderConstantB;
        void *GetVertexShaderConstantB;
        void *SetStreamSource;
        void *GetStreamSource;
        void *SetStreamSourceFreq;
        void *GetStreamSourceFreq;
        void *SetIndices;
        void *GetIndices;
        void *CreatePixelShader;
        void *SetPixelShader;
        void *GetPixelShader;
        void *SetPixelShaderConstantF;
        void *GetPixelShaderConstantF;
        void *SetPixelShaderConstantI;
        void *GetPixelShaderConstantI;
        void *SetPixelShaderConstantB;
        void *GetPixelShaderConstantB;
        void *DrawRectPatch;
        void *DrawTriPatch;
        void *DeletePatch;
        void *CreateQuery;
    } IDirect3DDevice9_vtbl;
    typedef struct {
        IDirect3DDevice9_vtbl* vtbl;
    } IDirect3DDevice9;
   
    typedef struct {
        void *QueryInterface;
        void *AddRef;
        HRESULT(__stdcall* Release)(void *This);
        void *GetDevice;
        void *SetPrivateData;
        void *GetPrivateData;
        void *FreePrivateData;
        void *SetPriority;
        void *GetPriority;
        void *PreLoad;
        void *GetType;
        void *SetLOD;
        void *GetLOD;
        void *GetLevelCount;
        void *SetAutoGenFilterType;
        void *GetAutoGenFilterType;
        void *GenerateMipSubLevels;
        void *GetLevelDesc;
        void *GetSurfaceLevel;
        void *LockRect;
        void *UnlockRect;
        void *AddDirtyRect;
    } IDirect3DTexture9_vtbl;
    typedef struct {
        IDirect3DTexture9_vtbl* vtbl;
    } IDirect3DTexture9;
    typedef struct {
        void *QueryInterface;
        void *AddRef;
        HRESULT(__stdcall* Release)(void *This);
        void *GetDevice;
        void *SetPrivateData;
        void *GetPrivateData;
        void *FreePrivateData;
        void *SetPriority;
        void *GetPriority;
        void *PreLoad;
        void *GetType;
        void *GetContainer;
        void *GetDesc;
        void *LockRect;
        void *UnlockRect;
        void *GetDC;
        void *ReleaseDC;
    } IDirect3DSurface9_vtbl;
    typedef struct {
        IDirect3DSurface9_vtbl* vtbl;
    } IDirect3DSurface9;
    typedef HRESULT(__stdcall* IDirect3DDevice9_CreatePixelShader)(IDirect3DDevice9* This, const DWORD* pFunction, IDirect3DPixelShader9** ppShader);
    typedef HRESULT(__stdcall* IDirect3DDevice9_CreateTexture)(IDirect3DDevice9* This, UINT Width, UINT Height, UINT Levels, DWORD Usage, D3DFORMAT Format, D3DPOOL Pool, IDirect3DTexture9** ppTexture, HANDLE* pSharedHandle);
    typedef HRESULT(__stdcall* IDirect3DDevice9_GetRenderTarget)(IDirect3DDevice9* This, DWORD RenderTargetIndex, IDirect3DSurface9** ppRenderTarget);
    typedef HRESULT(__stdcall* IDirect3DDevice9_GetBackBuffer)(IDirect3DDevice9* This, UINT iSwapChain, UINT iBackBuffer, D3DBACKBUFFER_TYPE Type, IDirect3DSurface9** ppBackBuffer);
    typedef HRESULT(__stdcall* IDirect3DDevice9_StretchRect)(IDirect3DDevice9* This, IDirect3DSurface9* pSourceSurface, const RECT* pSourceRect, IDirect3DSurface9* pDestSurface, const RECT* pDestRect, D3DTEXTUREFILTERTYPE Filter);
    typedef HRESULT(__stdcall* IDirect3DDevice9_SetRenderTarget)(IDirect3DDevice9* This, DWORD RenderTargetIndex, IDirect3DSurface9* pRenderTarget);
    typedef HRESULT(__stdcall* IDirect3DDevice9_SetSamplerState)(IDirect3DDevice9* This, DWORD Sampler, D3DSAMPLERSTATETYPE Type, DWORD Value);
    typedef HRESULT(__stdcall* IDirect3DDevice9_SetPixelShader)(IDirect3DDevice9* This, IDirect3DPixelShader9* pShader);
    typedef HRESULT(__stdcall* IDirect3DDevice9_SetPixelShaderConstantF)(IDirect3DDevice9* This, UINT StartRegister, const float* pConstantData, UINT Vector4fCount);
    typedef HRESULT(__stdcall* IDirect3DTexture9_GetSurfaceLevel)(IDirect3DTexture9* This, UINT Level, IDirect3DSurface9** ppSurfaceLevel);
    typedef HRESULT(__stdcall* IDirect3DTexture9_Release)(IDirect3DTexture9* This);
    typedef HRESULT(__stdcall* IDirect3DSurface9_Release)(IDirect3DSurface9* This);
]]
local shader_binary_x = "\x00\x02\xff\xff\xfe\xff\x2e\x00\x43\x54\x41\x42\x1c\x00\x00\x00\x83\x00\x00\x00\x00\x02\xff\xff\x02\x00\x00\x00\x1c\x00\x00\x00\x00\x01\x00\x00\x7c\x00\x00\x00\x44\x00\x00\x00\x03\x00\x00\x00\x01\x00\x00\x00\x50\x00\x00\x00\x00\x00\x00\x00\x60\x00\x00\x00\x02\x00\x00\x00\x01\x00\x00\x00\x6c\x00\x00\x00\x00\x00\x00\x00\x74\x65\x78\x53\x61\x6d\x70\x6c\x65\x72\x00\xab\x04\x00\x0c\x00\x01\x00\x01\x00\x01\x00\x00\x00\x00\x00\x00\x00\x74\x65\x78\x65\x6c\x57\x69\x64\x74\x68\x00\xab\x00\x00\x03\x00\x01\x00\x01\x00\x01\x00\x00\x00\x00\x00\x00\x00\x70\x73\x5f\x32\x5f\x30\x00\x4d\x69\x63\x72\x6f\x73\x6f\x66\x74\x20\x28\x52\x29\x20\x48\x4c\x53\x4c\x20\x53\x68\x61\x64\x65\x72\x20\x43\x6f\x6d\x70\x69\x6c\x65\x72\x20\x39\x2e\x32\x39\x2e\x39\x35\x32\x2e\x33\x31\x31\x31\x00\x51\x00\x00\x05\x01\x00\x0f\xa0\x14\x3b\xb1\x3f\x00\x00\x00\x00\x18\xe7\xa1\x3e\xc6\x79\x68\x3e\x51\x00\x00\x05\x02\x00\x0f\xa0\xec\xc4\x4e\x40\xdc\xe9\x8f\x3d\x00\x00\x00\x00\x00\x00\x00\x00\x1f\x00\x00\x02\x00\x00\x00\x80\x00\x00\x03\xb0\x1f\x00\x00\x02\x00\x00\x00\x90\x00\x08\x0f\xa0\x42\x00\x00\x03\x00\x00\x0f\x80\x00\x00\xe4\xb0\x00\x08\xe4\xa0\x01\x00\x00\x02\x01\x00\x08\x80\x01\x00\x00\xa0\x05\x00\x00\x03\x01\x00\x01\x80\x01\x00\xff\x80\x00\x00\x00\xa0\x01\x00\x00\x02\x01\x00\x02\x80\x01\x00\x55\xa0\x02\x00\x00\x03\x02\x00\x03\x80\x01\x00\xe4\x81\x00\x00\xe4\xb0\x02\x00\x00\x03\x01\x00\x03\x80\x01\x00\xe4\x80\x00\x00\xe4\xb0\x01\x00\x00\x02\x03\x00\x08\x80\x02\x00\x00\xa0\x05\x00\x00\x03\x03\x00\x01\x80\x03\x00\xff\x80\x00\x00\x00\xa0\x01\x00\x00\x02\x03\x00\x02\x80\x01\x00\x55\xa0\x02\x00\x00\x03\x04\x00\x03\x80\x03\x00\xe4\x81\x00\x00\xe4\xb0\x02\x00\x00\x03\x03\x00\x03\x80\x03\x00\xe4\x80\x00\x00\xe4\xb0\x42\x00\x00\x03\x01\x00\x0f\x80\x01\x00\xe4\x80\x00\x08\xe4\xa0\x42\x00\x00\x03\x02\x00\x0f\x80\x02\x00\xe4\x80\x00\x08\xe4\xa0\x42\x00\x00\x03\x03\x00\x0f\x80\x03\x00\xe4\x80\x00\x08\xe4\xa0\x42\x00\x00\x03\x04\x00\x0f\x80\x04\x00\xe4\x80\x00\x08\xe4\xa0\x05\x00\x00\x03\x02\x00\x07\x80\x02\x00\xe4\x80\x01\x00\xaa\xa0\x04\x00\x00\x04\x02\x00\x07\x80\x00\x00\xe4\x80\x01\x00\xff\xa0\x02\x00\xe4\x80\x04\x00\x00\x04\x01\x00\x07\x80\x01\x00\xe4\x80\x01\x00\xaa\xa0\x02\x00\xe4\x80\x04\x00\x00\x04\x01\x00\x07\x80\x04\x00\xe4\x80\x02\x00\x55\xa0\x01\x00\xe4\x80\x04\x00\x00\x04\x00\x00\x07\x80\x03\x00\xe4\x80\x02\x00\x55\xa0\x01\x00\xe4\x80\x01\x00\x00\x02\x00\x08\x0f\x80\x00\x00\xe4\x80\xff\xff\x00\x00"
local shader_binary_y = "\x00\x02\xff\xff\xfe\xff\x2e\x00\x43\x54\x41\x42\x1c\x00\x00\x00\x83\x00\x00\x00\x00\x02\xff\xff\x02\x00\x00\x00\x1c\x00\x00\x00\x00\x01\x00\x00\x7c\x00\x00\x00\x44\x00\x00\x00\x03\x00\x00\x00\x01\x00\x00\x00\x50\x00\x00\x00\x00\x00\x00\x00\x60\x00\x00\x00\x02\x00\x00\x00\x01\x00\x00\x00\x6c\x00\x00\x00\x00\x00\x00\x00\x74\x65\x78\x53\x61\x6d\x70\x6c\x65\x72\x00\xab\x04\x00\x0c\x00\x01\x00\x01\x00\x01\x00\x00\x00\x00\x00\x00\x00\x74\x65\x78\x65\x6c\x48\x65\x69\x67\x68\x74\x00\x00\x00\x03\x00\x01\x00\x01\x00\x01\x00\x00\x00\x00\x00\x00\x00\x70\x73\x5f\x32\x5f\x30\x00\x4d\x69\x63\x72\x6f\x73\x6f\x66\x74\x20\x28\x52\x29\x20\x48\x4c\x53\x4c\x20\x53\x68\x61\x64\x65\x72\x20\x43\x6f\x6d\x70\x69\x6c\x65\x72\x20\x39\x2e\x32\x39\x2e\x39\x35\x32\x2e\x33\x31\x31\x31\x00\x51\x00\x00\x05\x01\x00\x0f\xa0\x14\x3b\xb1\x3f\x00\x00\x00\x80\x18\xe7\xa1\x3e\xc6\x79\x68\x3e\x51\x00\x00\x05\x02\x00\x0f\xa0\xec\xc4\x4e\x40\xdc\xe9\x8f\x3d\x00\x00\x00\x00\x00\x00\x00\x00\x1f\x00\x00\x02\x00\x00\x00\x80\x00\x00\x03\xb0\x1f\x00\x00\x02\x00\x00\x00\x90\x00\x08\x0f\xa0\x42\x00\x00\x03\x00\x00\x0f\x80\x00\x00\xe4\xb0\x00\x08\xe4\xa0\x01\x00\x00\x02\x01\x00\x08\x80\x01\x00\x00\xa0\x05\x00\x00\x03\x01\x00\x01\x80\x01\x00\xff\x80\x00\x00\x00\xa0\x01\x00\x00\x02\x01\x00\x02\x80\x01\x00\x00\x81\x01\x00\x00\x02\x01\x00\x01\x80\x01\x00\x55\xa0\x02\x00\x00\x03\x01\x00\x03\x80\x01\x00\xe4\x80\x00\x00\xe4\xb0\x01\x00\x00\x02\x02\x00\x01\x80\x00\x00\x00\xb0\x04\x00\x00\x04\x02\x00\x02\x80\x00\x00\x00\xa0\x01\x00\xff\x80\x00\x00\x55\xb0\x01\x00\x00\x02\x03\x00\x08\x80\x02\x00\x00\xa0\x05\x00\x00\x03\x01\x00\x04\x80\x03\x00\xff\x80\x00\x00\x00\xa0\x01\x00\x00\x02\x03\x00\x02\x80\x01\x00\xaa\x81\x01\x00\x00\x02\x03\x00\x01\x80\x01\x00\x55\xa0\x02\x00\x00\x03\x03\x00\x03\x80\x03\x00\xe4\x80\x00\x00\xe4\xb0\x01\x00\x00\x02\x04\x00\x01\x80\x00\x00\x00\xb0\x04\x00\x00\x04\x04\x00\x02\x80\x00\x00\x00\xa0\x03\x00\xff\x80\x00\x00\x55\xb0\x42\x00\x00\x03\x01\x00\x0f\x80\x01\x00\xe4\x80\x00\x08\xe4\xa0\x42\x00\x00\x03\x02\x00\x0f\x80\x02\x00\xe4\x80\x00\x08\xe4\xa0\x42\x00\x00\x03\x03\x00\x0f\x80\x03\x00\xe4\x80\x00\x08\xe4\xa0\x42\x00\x00\x03\x04\x00\x0f\x80\x04\x00\xe4\x80\x00\x08\xe4\xa0\x05\x00\x00\x03\x01\x00\x07\x80\x01\x00\xe4\x80\x01\x00\xaa\xa0\x04\x00\x00\x04\x01\x00\x07\x80\x00\x00\xe4\x80\x01\x00\xff\xa0\x01\x00\xe4\x80\x04\x00\x00\x04\x01\x00\x07\x80\x02\x00\xe4\x80\x01\x00\xaa\xa0\x01\x00\xe4\x80\x04\x00\x00\x04\x01\x00\x07\x80\x03\x00\xe4\x80\x02\x00\x55\xa0\x01\x00\xe4\x80\x04\x00\x00\x04\x00\x00\x07\x80\x04\x00\xe4\x80\x02\x00\x55\xa0\x01\x00\xe4\x80\x01\x00\x00\x02\x00\x08\x0f\x80\x00\x00\xe4\x80\xff\xff\x00\x00"
local width, height = 0, 0
local shader_x, shader_y = ffi.new('IDirect3DPixelShader9*[1]'), ffi.new('IDirect3DPixelShader9*[1]')
local blur_texture, rt_backup = ffi.new('IDirect3DTexture9*[1]'), ffi.new('IDirect3DSurface9*[1]')
local function release_resource(resource)
    if resource[0] ~= nil then
        -- local fn = ffi.cast('HRESULT (__stdcall*)(void*)', resource[0].vtbl.Release)
        -- local item = ffi.cast('void*', resource[0])
        -- fn(item)
        resource[0].vtbl.Release(resource[0])
        resource[0] = nil
        return true
    end
    return false
end
local function begin(parent_list, cmd)
    print('begin')
    do return end
    local device = ffi.cast('IDirect3DDevice9*', cmd.UserCallbackData)
    local IDirect3DDevice9_CreatePixelShader = ffi.cast('IDirect3DDevice9_CreatePixelShader', device.vtbl.CreatePixelShader)
    local IDirect3DDevice9_CreateTexture = ffi.cast('IDirect3DDevice9_CreateTexture', device.vtbl.CreateTexture)
    local IDirect3DDevice9_GetRenderTarget = ffi.cast('IDirect3DDevice9_GetRenderTarget', device.vtbl.GetRenderTarget)
    local IDirect3DDevice9_GetBackBuffer = ffi.cast('IDirect3DDevice9_GetBackBuffer', device.vtbl.GetBackBuffer)
    local IDirect3DDevice9_StretchRect = ffi.cast('IDirect3DDevice9_StretchRect', device.vtbl.StretchRect)
    local IDirect3DDevice9_SetRenderTarget = ffi.cast('IDirect3DDevice9_SetRenderTarget', device.vtbl.SetRenderTarget)
    local IDirect3DDevice9_SetSamplerState = ffi.cast('IDirect3DDevice9_SetSamplerState', device.vtbl.SetSamplerState)
    if shader_x[0] == nil then
        IDirect3DDevice9_CreatePixelShader(device, ffi.cast('DWORD*', shader_binary_x), shader_x)
    end
    if shader_y[0] == nil then
        IDirect3DDevice9_CreatePixelShader(device, ffi.cast('DWORD*', shader_binary_y), shader_y)
    end
    local display_size = imgui.GetIO().DisplaySize
    local current_width = display_size.x
    local current_height = display_size.y
    if width ~= current_width or height ~= current_height or blur_texture[0] == nil then
        release_resource(blur_texture)
        width = current_width
        height = current_height
        IDirect3DDevice9_CreateTexture(device, width, height, 1, 0x00000001, 21, 0, blur_texture, nil)
    end
   
    IDirect3DDevice9_GetRenderTarget(device, 0, rt_backup)
    do
        local IDirect3DTexture9_GetSurfaceLevel = ffi.cast('IDirect3DTexture9_GetSurfaceLevel', blur_texture[0].vtbl.GetSurfaceLevel)
        local back_buffer = ffi.new('IDirect3DSurface9*[1]')
        IDirect3DDevice9_GetBackBuffer(device, 0, 0, 0, back_buffer)
        local surface = ffi.new('IDirect3DSurface9*[1]')
        IDirect3DTexture9_GetSurfaceLevel(blur_texture[0], 0, surface)
        IDirect3DDevice9_StretchRect(device, back_buffer[0], nil, surface[0], nil, 0)
        IDirect3DDevice9_SetRenderTarget(device, 0, surface[0])
        release_resource(surface)
        release_resource(back_buffer)
    end
    IDirect3DDevice9_SetSamplerState(device, 0, 1, 3)
    IDirect3DDevice9_SetSamplerState(device, 0, 2, 3)
end
local function process_x(parent_list, cmd)
    print('process_x')
    do return end
    local device = ffi.cast('IDirect3DDevice9*', cmd.UserCallbackData)
    local IDirect3DDevice9_SetPixelShader = ffi.cast('IDirect3DDevice9_SetPixelShader', device.vtbl.SetPixelShader)
    local IDirect3DDevice9_SetPixelShaderConstantF = ffi.cast('IDirect3DDevice9_SetPixelShaderConstantF', device.vtbl.SetPixelShaderConstantF)
    IDirect3DDevice9_SetPixelShader(device, shader_x[0])
    local params = ffi.new('float[4]')
    params[0] = 1.0 / width
    IDirect3DDevice9_SetPixelShaderConstantF(device, 0, params, 1)
end
local function process_y(parent_list, cmd)
    print('process_y')
    do return end
    local device = ffi.cast('IDirect3DDevice9*', cmd.UserCallbackData)
    local IDirect3DDevice9_SetPixelShader = ffi.cast('IDirect3DDevice9_SetPixelShader', device.vtbl.SetPixelShader)
    local IDirect3DDevice9_SetPixelShaderConstantF = ffi.cast('IDirect3DDevice9_SetPixelShaderConstantF', device.vtbl.SetPixelShaderConstantF)
    IDirect3DDevice9_SetPixelShader(device, shader_y[0])
    local params = ffi.new('float[4]')
    params[0] = 1.0 / height
    IDirect3DDevice9_SetPixelShaderConstantF(device, 0, params, 1)
end
local function end_(parent_list, cmd)
    print('end_')
    do return end
    local device = ffi.cast('IDirect3DDevice9*', cmd.UserCallbackData)
    local IDirect3DDevice9_SetRenderTarget = ffi.cast('IDirect3DDevice9_SetRenderTarget', device.vtbl.SetRenderTarget)
    local IDirect3DDevice9_SetPixelShader = ffi.cast('IDirect3DDevice9_SetPixelShader', device.vtbl.SetPixelShader)
    local IDirect3DDevice9_SetSamplerState = ffi.cast('IDirect3DDevice9_SetSamplerState', device.vtbl.SetSamplerState)
    IDirect3DDevice9_SetRenderTarget(device, 0, rt_backup[0])
    release_resource(rt_backup)
    IDirect3DDevice9_SetPixelShader(device, nil)
    IDirect3DDevice9_SetSamplerState(device, 0, 1, 1)
    IDirect3DDevice9_SetSamplerState(device, 0, 2, 1)
end
local begin_callback = ffi.cast('ImDrawCallback', begin)
local process_x_callback = ffi.cast('ImDrawCallback', process_x)
local process_y_callback = ffi.cast('ImDrawCallback', process_y)
local end_callback = ffi.cast('ImDrawCallback', end_)
local mimgui_blur = {}
local noone = true
function mimgui_blur.apply(draw_list, radius, rounding, flags)
    if noone then noone = false return end
    rounding = rounding or 0
    flags = flags or 0
    local device = ffi.cast('IDirect3DDevice9*', getD3DDevicePtr())
    print(begin_callback)
    print(process_x_callback)
    print(process_y_callback)
    print(end_callback)
    draw_list:AddCallback(ffi.cast('void*', -1), nil)
    draw_list:AddCallback(begin_callback, device)
    local texture_valid = blur_texture[0] ~= nil
    if texture_valid then
        for i = 1, radius do
            draw_list:AddCallback(process_x_callback, device)
            draw_list:AddImageRounded(blur_texture[0], ImVec2(0, 0), ImVec2(width, height), ImVec2(0, 0), ImVec2(1, 1), -1, rounding, flags)
            draw_list:AddCallback(process_y_callback, device)
            draw_list:AddImageRounded(blur_texture[0], ImVec2(0, 0), ImVec2(width, height), ImVec2(0, 0), ImVec2(1, 1), -1, rounding, flags)
        end
    end
    draw_list:AddCallback(end_callback, device)
    if texture_valid then
        draw_list:AddImageRounded(blur_texture[0], ImVec2(0, 0), ImVec2(width, height), ImVec2(0, 0), ImVec2(1, 1), -1, rounding, flags)
    end
end
addEventHandler('onD3DDeviceLost', function()
    release_resource(blur_texture)
    release_resource(rt_backup)
end)
return mimgui_blur

не обращайте внимание на код, писал на скорую руку

казалось бы, всё хорошо, работать будет. и как бы да, ну ладно. заходим в игру.
начинаю тестировать библиотеку, открываю окно полисхелпера - крашит. странно...
перепроверяю, снова крашит. ну ладно, обращаемся к фипу, анализируем. что не так...
1686247413895.png


понятнее не стало. ладно, отправляем ещё больше данных и сам скрипт, с которым происходят краши. не забываем это сообщение, оно сыграет нам на пользу:
1686247504305.png


заходим, отлавливаем краш
1686247560652.png

понятненько. нам луаджит стреляет в ногу со своим джитом. но ведь мы выключили уже его у всех наших коллбеков через jit.off, что не так?

а проблема вот в чём:
1686247640055.png

вот оно что..

объясняю: мы в дравлист добавили свои коллбеки: begin, process_x, process_y, end_. они пока не вызваны и ожидают своей очереди.
спустя некоторое время вызываются все мимгуи рендеры скриптов, и наступает время отправить все наши окна на обработку. делается это с помощью функции RenderDrawData из бэкенда. вот тут то и начинается то самое, о чём говорил фип. заходим тело в этой функции
бинго! вот и причина всех наших крашей.
и так, объясняю:
  1. AddCallback
  2. Все мимгуи окна обработаны и нуждаются в рендере
  3. RenderDrawData
  4. UserCallback() -- является нашим коллбеком, вызывается, крашимся
решение:
а вон, всё на последнем скрине

эта библиотека с блюром должна была выйти чуточку позже, когда оно вышло бы в полисхелпере и все заценили реализацию, но всё пошло немного не по плану. теперь, что касаемо косяков @Andrinall
- jit.off был и являемся одним из важных элементов для всех твоих коллбеков и EndFrame
- ты напрочь забыл об освободении текстур в onD3DDeviceLost и при изменении размера окна игры, из-за чего у пользователей твоей библиотеки крашит при сворачивании/разворачивании/изменении размера окна

а теперь ещё один момент, который я исправил (хоть и костыльным решением):
- функции размытия ни в какую не хотели работать при передаче BackgroundDrawList/ForegroundDrawList, если функция размытия не была вызвана с WindowDrawList. немного разобравшись я понял, в чём дело: имгуи не рендерит и не вызывает дравлисты, в которых не было никакой рисовки (и это логично). костыль-фикс: https://github.com/Northn/mimgui_blur/blob/master/imgui_blur.hpp#L172
фикс уже есть в моей библиотеке



ну, вот и всё. пользуйтесь, что-ли
спасибо @CaJlaT за бенчмарки на своём древнем компе​
 
Последнее редактирование:

CaJlaT

07.11.2024 14:55
Модератор
2,831
2,664
Если добавлять размытие в пределах разумного, то эта библиотека даже на ведре вместо пк будет снижать фпс всего на 5-10
 
  • Нравится
Реакции: Andrinall, #Northn и XRLM

Дядя Энрик.

Активный
339
81
без блюра в наше время никуда, за цветные кнопочки в палитре отдельный респект!
 

Andrinall

Известный
702
518
ты напрочь забыл об освободении текстур в onD3DDeviceLost и при изменении размера окна игры
А так же в моей реализации мне пришлось убрать релиз backBuffer и surface в BeginBlur + rtBackup в EndBlur из-за ошибки table overflow(вероятно из-за туповатой реализации через кучу кастов вирт.таблиц в intptr_t** вместо адекватного использования cdef).

После того как мне в теме написали про сворачивание игры - я стал копаться в коде и смог накостылить чтобы оно разворачивалось после сворачивания, но время жизни библиотеки с работающим блюром упало до 60-90 секунд, вместо 5+ часов, что конечно же меня не устроило)

из-за чего у пользователей твоей библиотеки крашит при сворачивании/разворачивании/изменении размера окна
Кстати, при тестах(после сообщения в теме) у меня это был не краш при разворачивании - окно разворачивалось и было активным, но вот картинки не было(оставался рабочий стол), хотя я мог ребутать скрипты(Crtl+R) и писать в чат

что касаемо косяков @Andrinall
Благодарю за подробное пояснение работы этой jit'овской шляпы и моих косяков

спасибо @Cosmo за бенчмарки на своём древнем компе
вот ещё пример как может сожрать фпс на древнем железе, понятия не имею зачем
CPU: AMD Athlon(tm) 64 X2 Dual Core Processor 5200+ (2 cores) 2.7GHz
RAM: 4096MB DDR2
GPU: NVIDIA GeForce 8400 GS (512MB, DX10(частичная поддержка 11))
OS: Win7 Ultimate x64
mBlur.apply(imgui.GetBackgroundDrawList(), 1)
mBlur.applyItem(imgui.GetWindowDrawList(), 1)

1686291703920.png

Обычный фпс(на всяких там фпсапах :D)

1686291737219.png
 
  • Нравится
  • Вау
Реакции: CaJlaT, #Northn и whyega52

#Northn

Pears Project — уже запущен!
Автор темы
Всефорумный модератор
2,652
2,535
Обновление 1.1!
Строго рекомендую обновиться и распространять именно эту версию, а не прошлую.
Код:
* Теперь, версия библиотеки возвращается в виде числа с плавающей точкой, а не в целочисленном
* Радиус размытия теперь работает более плавно
* Исправлены несколько некорректных/бессмысленных действий
* Загружен код шейдеров
* Добавлены комментарии по коду в mimgui_blur/init.lua
Коммит: https://github.com/Northn/mimgui_blur/commit/e61c2a90db34cf00e54e0edfc0a3b263e329b420

Скачать: https://github.com/Northn/mimgui_blur/releases/download/1.1/mimgui_blur.zip
 
Последнее редактирование:

CaJlaT

07.11.2024 14:55
Модератор
2,831
2,664
Обновление 1.1!
Строго рекомендую обновиться и распространять именно эту версию, а не прошлую.
Код:
* Теперь, версия библиотеки возвращается в виде числа с плавающей точкой, а не в целочисленном
* Радиус размытия теперь работает более плавно
* Исправлены несколько некорректных/бессмысленных действий
* Загружен код шейдеров
* Добавлены комментарии по коду в mimgui_blur/init.lua
Коммит: https://github.com/Northn/mimgui_blur/commit/e61c2a90db34cf00e54e0edfc0a3b263e329b420

Скачать: https://github.com/Northn/mimgui_blur/releases/download/1.1/mimgui_blur.zip
Добавлю, что методом тыка мы нашли оптимальный радиус для бекграунда, который практически не влияет на фпс - 20.0 и меньше, если указать выше, то фпс будет падать в геометрической прогрессии. Блюр в самом окне не снижал фпс больше, чем на 5 даже при радиусе 100
CPU: AMD Athlon(tm) 64 X2 Dual Core Processor 5600+ 2.90 GHz (2 cores/2 threads)
RAM: 5GB DDR2
GPU: GT440 1GB
OS: Windows 10 Enterprice
1686475643660.png

1686475722709.png

1686475631537.png
 
Последнее редактирование:
  • Нравится
Реакции: #Northn

Tema05

Известный
1,471
435
Отличная работа! Вышло в итоге бесплатно :) Могу подкинуть ещё 1 идею. Как по мне в mimgui есть проблема с некрасивой отрисовкой шрифтов. Если приблизить чёрный текст из браузера можно увидеть пиксели жёлтых и синих оттенков. Они призваны сглаживать шрифт. В mimgui же шрифт сглаживается лишь при помощи пикселей того же цвета, что и шрифт, но с разной прозрачностью. При маленьких начертаниях, тонкий шрифтах и в некоторых детализированных иконочных шрифтах это превращается в зачастую нечитаемое месиво из пикселей.

Не знаю насколько возможно сделать так, чтобы любой шрифт в mimgui смотрелся так же хорошо, как и в вебе. Скорее всего это нужно будет делать в самом mimgui.
L6P1wQW.png
 
  • Нравится
Реакции: chapo

Dewize

Известный
447
92
Не особо понял по поводу
mimgui_blur.applyRect(draw_list, pos_start, pos_end, radius, color, rounding, rounding_corners) -- размывает указанную область в дравлисте. все параметры, кроме draw_list, pos_start, pos_end являются необязательными


можете пример скинуть?
 

Andrinall

Известный
702
518
Не особо понял по поводу
mimgui_blur.applyRect(draw_list, pos_start, pos_end, radius, color, rounding, rounding_corners) -- размывает указанную область в дравлисте. все параметры, кроме draw_list, pos_start, pos_end являются необязательными


можете пример скинуть?
Типо вот.
mimgui_blur.applyRect(imgui.GetBackgroundDrawList(), imgui.ImVec2(sw / 2 - size, sh / 2 - size), imgui.ImVec2(sw / 2 + size, sh / 2 + size))
1688652122354.png
 

Andrinall

Известный
702
518
Не понимаю, что можно не понять.
Lua:
local imgui = require 'mimgui'
local blur = require 'mimgui_blur'
imgui.OnInitialize(function()
    imgui.GetIO().IniFilename = nil
end)

imgui.OnFrame(function() return true end, function()
    blur.applyRect(
        imgui.GetBackgroundDrawList(),
        imgui.ImVec2(90, 680), -- координаты для 1600x900 лень подбирать для формулы под все разрешения экрана
        imgui.ImVec2(345, 850)
    )
    
    imgui.SetNextWindowSize(imgui.ImVec2(250, 250))
    if imgui.Begin("Test window", _, imgui.WindowFlags.NoCollapse) then
        imgui.Text("Text")
        if imgui.BeginChild("Blured child", _, true) then
            local cpos = imgui.GetCursorScreenPos()
            imgui.Text("Blured")
            local item_size = imgui.GetItemRectSize()
            blur.applyRect(imgui.GetWindowDrawList(), cpos, cpos + item_size)

            imgui.Text("Not Blured")
            imgui.EndChild()
        end
    end
end).HideCursor = true
1688664263117.png
 
  • Нравится
Реакции: chapo и RTD

Dewize

Известный
447
92
Не понимаю, что можно не понять.
Lua:
local imgui = require 'mimgui'
local blur = require 'mimgui_blur'
imgui.OnInitialize(function()
    imgui.GetIO().IniFilename = nil
end)

imgui.OnFrame(function() return true end, function()
    blur.applyRect(
        imgui.GetBackgroundDrawList(),
        imgui.ImVec2(90, 680), -- координаты для 1600x900 лень подбирать для формулы под все разрешения экрана
        imgui.ImVec2(345, 850)
    )
  
    imgui.SetNextWindowSize(imgui.ImVec2(250, 250))
    if imgui.Begin("Test window", _, imgui.WindowFlags.NoCollapse) then
        imgui.Text("Text")
        if imgui.BeginChild("Blured child", _, true) then
            local cpos = imgui.GetCursorScreenPos()
            imgui.Text("Blured")
            local item_size = imgui.GetItemRectSize()
            blur.applyRect(imgui.GetWindowDrawList(), cpos, cpos + item_size)

            imgui.Text("Not Blured")
            imgui.EndChild()
        end
    end
end).HideCursor = true
Посмотреть вложение 207066
а вот так понятно, спс

Ток не понял, что такое
imgui.ImVec2(90, 680), -- координаты для 1600x900 лень подбирать для формулы под все разрешения экрана
imgui.ImVec2(345, 850)

Не я тип понял, что это координаты где начать размывать, а где нет. Ток откуда ты их взял

+ что такое GetItemRectSize and GetCursorScreenPos()

а вот так понятно, спс

Ток не понял, что такое
imgui.ImVec2(90, 680), -- координаты для 1600x900 лень подбирать для формулы под все разрешения экрана
imgui.ImVec2(345, 850)

Не я тип понял, что это координаты где начать размывать, а где нет. Ток откуда ты их взял

+ что такое GetItemRectSize and GetCursorScreenPos()

крч я сделал, как понял. Однако у меня блюр не в там где надо.


афыаыф:
--===== [ Подключаем библиотеки ] =====--
local imgui = require 'mimgui' -- Графический модуль mimgui
local blur = require ('mimgui_blur') -- Это дополнение для графического модуля mimgui, который добавляет блюр.
------------------------------


--===== [ Функции ] =====--
imgui.OnInitialize(function() -- Функция, вызывающаяся один раз за период жизни скрипта. Типа пред загрузка, перед показом в Imgui
    imgui.GetIO().IniFilename = nil --  Выключаем сохранение
end)
------------------------------

--===== [ Работа с мимгуи ] =====--

--Гл.Окно--
imgui.OnFrame(function() return window_main[0] end,
    function(player)
        imgui.SetNextWindowPos(imgui.ImVec2((displayX / 2), displayY / 2), imgui.Cond.FirstUseEver, imgui.ImVec2(0.5, 0.5)) -- отвечает за положение окна на экране
        imgui.SetNextWindowSize(imgui.ImVec2(1200, 600), imgui.Cond.Always) -- отвечает за размер окна
        imgui.Begin(u8'', window_main, imgui.WindowFlags.NoResize + imgui.WindowFlags.NoTitleBar + imgui.WindowFlags.NoScrollbar + imgui.WindowFlags.NoScrollWithMouse) -- отвечает за отображение окна, его заголовок и флаги
        
        imgui.SetCursorPos(imgui.ImVec2(0, 0)) -- Ставим положение для Чилда

        if imgui.BeginChild('SwitchChild', imgui.ImVec2(215, 600), true) then
            
            --===== [ Блюр ] =====--
            blur.applyRect(imgui.GetBackgroundDrawList(), imgui.ImVec2(0, 0), imgui.ImVec2(215, 600))
            ------------------------------
            imgui.EndChild() -- обязательно следите за тем, чтобы каждый чайлд был закрыт

        imgui.End()
    end
)
------------------------------
 
Последнее редактирование: