#1 06-09-2013 13:05

VladVegas
From: Київ
Registered: 06-09-2013
Posts: 5

Вопрос по текстурам в памяти gta sa

Здравствуйте! У меня есть вопрос, помогите если в курсе.

Есть структура:

struct RwTexture
{
    RwRaster           *raster;
    RwTexDictionary    *txd;
    RwListEntry        TXDList;
    char               name[RW_TEXTURE_NAME_LENGTH];
    char               mask[RW_TEXTURE_NAME_LENGTH];
    unsigned int       flags;
    int                refs;
};

1-й параметр которой - указатель на структуру RwRaster;

struct RwRaster
{
    RwRaster        *parent;               // 0
    unsigned char   *pixels;
    unsigned char   *palette;              // 8
    int             width, height, depth;  // 12, 16 / 0x10, 20
    int             stride;                // 24 / 0x18
    short           u, v;
    unsigned char   type;
    unsigned char   flags;
    unsigned char   privateFlags;
    unsigned char   format;
    unsigned char   *origPixels;
    int             origWidth, origHeight, origDepth;
    void*           renderResource;
};

Собственно сам вопрос:
*pixels - это указатель на карту пикселей? Если да, то в кам формате они там хранятся?

Offline

#2 06-09-2013 13:22

listener
From: Vice City
Registered: 09-11-2006
Posts: 615
Website

Re: Вопрос по текстурам в памяти gta sa

Да.
Формат задается полем format.
А вообще, это все должно быть в документации на RWG


C5 - GTA IV/RDR/GTA V script compiler.
~ 60% done.

Offline

#3 06-09-2013 13:31

VladVegas
From: Київ
Registered: 06-09-2013
Posts: 5

Re: Вопрос по текстурам в памяти gta sa

Спасибо! Инфу по RWG я читал. Прсто я пытаюсь загрузить пиксели из *.bmp файла, фомат задаю rwRASTERFORMAT8888 | rwRASTERPIXELLOCKEDWRITE(32 bit + write), и подставляю вместо указателя на *pixels свой. Но вместо моей картинки на объекте рисуется прозрачный фон:blush: Не знаешь в чём здесь проблема?

Offline

#4 06-09-2013 14:34

listener
From: Vice City
Registered: 09-11-2006
Posts: 615
Website

Re: Вопрос по текстурам в памяти gta sa

На память не помню, а документации под рукой сейчас нет.
Я не помню, что есть origPixels, возможно что-то с ним.
И выставлен ли корректный stride ?


C5 - GTA IV/RDR/GTA V script compiler.
~ 60% done.

Offline

#5 06-09-2013 15:26

VladVegas
From: Київ
Registered: 06-09-2013
Posts: 5

Re: Вопрос по текстурам в памяти gta sa

Я посмотрел в IDA функцию создания растра RwRasterCreate но там в поле origPixels вообще ничего не записывается.
По поводу stride, в документации написано, что это линии растра байтов, но я так и не понял, что это значит. А как его корректно выставить?

Offline

#6 06-09-2013 17:06

DK22Pac
From: Ukraine
Registered: 26-03-2010
Posts: 447
Website

Re: Вопрос по текстурам в памяти gta sa

VladVegas, в каких целях надо использовать полученную картинку? В игре, или в стороннем приложении?
В RW SDK есть модуль RtBmp, он позволяет создать обьект RwRaster на основе bmp-файла.

Last edited by DK22Pac (12-01-2014 22:35)


Plugin-SDK https://github.com/DK22Pac/plugin-sdk
Discord-сервер по plugin-sdk и программированию в GTA
RU https://discord.gg/QEesDGb
ENG https://discord.gg/zaVqFQv

Offline

#7 06-09-2013 17:46

VladVegas
From: Київ
Registered: 06-09-2013
Posts: 5

Re: Вопрос по текстурам в памяти gta sa

DK22Pac, я собираюсь отрисовать текстуру в игре на объекте(RwFrame). Про RtBmp я знаю(если ты об RtBMPImageRead), но я хотел бы загрузить картинку(массив пикселей) из памяти, возможно ли такое?

Offline

#8 06-09-2013 18:47

DK22Pac
From: Ukraine
Registered: 26-03-2010
Posts: 447
Website

Re: Вопрос по текстурам в памяти gta sa

RwTexture *CResources::LoadTextureFromMemory(char *data, unsigned int size)
{
	CPatch::SetChar(0x7CF9CA, rwSTREAMMEMORY);
	RwMemory memoryImage;
	unsigned int width, height, depth, flags;
	memoryImage.start = data;
	memoryImage.length = size;
	RwImage *image = RtPNGImageRead((char *)&memoryImage);
	RwImageFindRasterFormat(image, 4, &width, &height, &depth, &flags);
	RwRaster *raster = RwRasterCreate(width, height, depth, flags);
	RwRasterSetFromImage(raster, image);
	RwImageDestroy(image);
	CPatch::SetChar(0x7CF9CA, rwSTREAMFILENAME);
	return RwTextureCreate(raster);
}

Plugin-SDK https://github.com/DK22Pac/plugin-sdk
Discord-сервер по plugin-sdk и программированию в GTA
RU https://discord.gg/QEesDGb
ENG https://discord.gg/zaVqFQv

Offline

#9 07-09-2013 11:50

VladVegas
From: Київ
Registered: 06-09-2013
Posts: 5

Re: Вопрос по текстурам в памяти gta sa

DK22Pac, спасибо большое, очень помог!!! listener, тебе тоже спасибо! И если можно, объясните еще пару вещей:

CPatch::SetChar(0x7CF9CA, rwSTREAMMEMORY);

Если я правильно понял, то этой функцией ты подменил параметр type перед вызовом RwStreamOpen в
функции RtPNGImageRead.
(я в C++ не очень, я в основном на Delphi и ASM), и что за тип RwMemory, вернее из чего он(эта структура) состоит? Заранее спасибо!

Last edited by VladVegas (07-09-2013 12:08)

Offline

Board footer

Powered by FluxBB