- 397
- 96
- Версия MoonLoader
- .026-beta
Здравствуйте.
Использую функцию getTextDrawTexture от @Cosmo из темы полезных сниппетов для получения текстуры текстдрава.
Без проблем получаю тектуру и отображаю её в draw_list:AddImage.
Проблема: На некоторые текстдравы наложен материал (цвет), и он не отображается в текстуре. Получается, что текстура отображается без учёта цвета, который задан в m_letterColor, m_boxColor или m_backgroundColor.
Можно ли как-то скомбинировать текстуру и цвет, чтобы итоговое изображение отображалось с учётом наложенного материала?
Может, есть способ применить цвет напрямую к текстуре (RwTexture / RwRaster) ?
🥺🥺
Хмм. в примитиве же можно указать цвет. А если из функции возвращать цвет текстдрава и ставить его в 6-й аргумент:
Вот так работает, такой вариант есть.
Но можно в текстуру сразу? Есть такой вариант?
Использую функцию 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
)
Вот так работает, такой вариант есть.
Но можно в текстуру сразу? Есть такой вариант?
Последнее редактирование: