getTextDrawTexture

ChаtGPT

Активный
Автор темы
397
96
Версия MoonLoader
.026-beta
Здравствуйте.
Использую функцию getTextDrawTexture от @Cosmo из темы полезных сниппетов для получения текстуры текстдрава.
Без проблем получаю тектуру и отображаю её в draw_list:AddImage.

Проблема: На некоторые текстдравы наложен материал (цвет), и он не отображается в текстуре. Получается, что текстура отображается без учёта цвета, который задан в m_letterColor, m_boxColor или m_backgroundColor.

Можно ли как-то скомбинировать текстуру и цвет, чтобы итоговое изображение отображалось с учётом наложенного материала?
Может, есть способ применить цвет напрямую к текстуре (RwTexture / RwRaster) ?

🥺🥺


Lua:
ffi.cdef [[
    struct CTextDrawData {
        float          m_fLetterWidth;
        float          m_fLetterHeight;
        unsigned long  m_letterColor;
        unsigned char  unknown;
        unsigned char  m_bCenter;
        unsigned char  m_bBox;
        float          m_fBoxSizeX;
        float          m_fBoxSizeY;
        unsigned long  m_boxColor;
        unsigned char  m_nProportional;
        unsigned long  m_backgroundColor;
        unsigned char  m_nShadow;
        unsigned char  m_nOutline;
        unsigned char  m_bLeft;
        unsigned char  m_bRight;
        int            m_nStyle;
        float          m_fX;
        float          m_fY;
        unsigned char  pad_[8];
        unsigned long  field_99B;
        unsigned long  field_99F;
        unsigned long  m_nIndex;
        unsigned char  field_9A7;
        unsigned short m_nModel;
        float          m_rotation[3];
        float          m_fZoom;
        unsigned short m_aColor[2];
        unsigned char  field_9BE;
        unsigned char  field_9BF;
        unsigned char  field_9C0;
        unsigned long  field_9C1;
        unsigned long  field_9C5;
        unsigned long  field_9C9;
        unsigned long  field_9CD;
        unsigned char  field_9D1;
        unsigned long  field_9D2;
    }__attribute__ ((packed));

    struct CTextDraw {
        char m_szText[801];
        char m_szString[1602];
        struct CTextDrawData m_data;
    }__attribute__ ((packed));

    struct CTextDrawPool {
        int       m_bNotEmpty[2048 + 256];
        struct CTextDraw* m_pObject[2048 + 256];
    }__attribute__ ((packed));

    typedef unsigned char RwUInt8;
    typedef int RwInt32;
    typedef short RwInt16;

    struct RwRaster {
        struct RwRaster             *parent;
        RwUInt8                     *cpPixels;
        RwUInt8                     *palette;
        RwInt32                     width, height, depth;
        RwInt32                     stride;
        RwInt16                     nOffsetX, nOffsetY;
        RwUInt8                     cType;
        RwUInt8                     cFlags;
        RwUInt8                     privateFlags;
        RwUInt8                     cFormat;
        RwUInt8                     *originalPixels;
        RwInt32                      originalWidth;
        RwInt32                      originalHeight;
        RwInt32                      originalStride;
        void*                       texture_ptr;
    };

    struct RwTexture {
        struct RwRaster* raster;
    };
]]


function getTextDrawTexture(textdraw_id) -- Получение текстуры модели текстдрава
    if not sampTextdrawIsExists(textdraw_id) then return false end
    local offset = { ["R1"] = 0x216058, ["R3"] = 0x26B2B8 }
    local vSAMP = getGameGlobal(707) <= 21 and 'R1' or 'R3'
    local textdraw_pool = ffi.cast("struct CTextDrawPool*", sampGetTextdrawPoolPtr())
    local textures_pool = ffi.cast("struct RwTexture**", sampGetBase() + offset[vSAMP])

    local pObject = textdraw_pool.m_pObject[textdraw_id]
    if pObject ~= ffi.NULL then
        local index = pObject.m_data.m_nIndex
        if index ~= 0xFFFFFFFF then
            local raster = textures_pool[index].raster
            return true, raster.texture_ptr
        end
    end
    return false
end

-- Использование
local result, texture = getTextDrawTexture(1)
if result then
    draw_list:AddImage(texture, rect_min, rect_max)
end

Хмм. в примитиве же можно указать цвет. А если из функции возвращать цвет текстдрава и ставить его в 6-й аргумент:

Lua:
draw_list:AddImage(
    texture,
    rect_min,
    rect_max,
    imgui.ImVec2(0, 0),
    imgui.ImVec2(1, 1),
    0xFF30F483
)

Вот так работает, такой вариант есть.
Но можно в текстуру сразу? Есть такой вариант?
 
Последнее редактирование:

sh1va

Новичок
3
6
Lua:
local ffi = require("ffi")

function applyColorToTexture(raster, color)
    local pixels = ffi.cast("RwUInt8*", raster.cpPixels)
    local width = raster.width
    local height = raster.height
    local stride = raster.stride
    for y = 0, height - 1 do
        for x = 0, width - 1 do
            local pixelOffset = (y * stride) + (x * 4)
            pixels[pixelOffset + 0] = (pixels[pixelOffset + 0] * ffi.cast("RwUInt8", (color & 0xFF))) / 255 -- R
            pixels[pixelOffset + 1] = (pixels[pixelOffset + 1] * ffi.cast("RwUInt8", ((color >> 8) & 0xFF))) / 255 -- G
            pixels[pixelOffset + 2] = (pixels[pixelOffset + 2] * ffi.cast("RwUInt8", ((color >> 16) & 0xFF))) / 255 -- B
end
    end
end
 
Последнее редактирование:

kyrtion

Известный
998
365

Похожие темы