Рейтинг темы:
  • 0 Голос(ов) - 0 в среднем
  • 1
  • 2
  • 3
  • 4
  • 5
Как получить контекст GM8
#3
В общем, что сумел выяснить, изучив исходники: необязательно подключать весь GMAPI, достаточно просто получить указатели IDirect3D8* и IDirect3DDevice8* по адресу в памяти приложения. Для GM 8.0 это 0x0058D384. Можно написать вот так:

Код:
[== C++ ==]
#include <d3d8.h>

#define GM80_ADDRESS_STORAGE_DIRECTX 0x0058D384;

struct GMDirect3DInfo
{
    IDirect3D8* d3dInterface;
    IDirect3DDevice8* d3dDevice;
};

const GMDirect3DInfo* d3d = (GMDirect3DInfo*)GM80_ADDRESS_STORAGE_DIRECTX;

И потом использовать переменную d3d для извлечения девайса, где это нужно, например:

Код:
[== C++ ==]
#define DLLExport extern "C" __declspec(dllexport)

DLLExport double getGMDeviceViewportWidth()
{
    IDirect3DDevice8* device = d3d->d3dDevice;
    D3DVIEWPORT8 viewport;
    device->GetViewport(&viewport);
    return (double)viewport.Width;
}

Остальные методы девайса не проверял, но тоже должны работать. Но, честно говоря, как все это будет дружить с внутренней логикой GM - темный лес...

Для 6.1 и 7.0 адреса будут, соответственно, такие:

Код:
[== C++ ==]
#define GM61_ADDRESS_STORAGE_DIRECTX 0x005379F0;
#define GM70_ADDRESS_STORAGE_DIRECTX 0x00587A60;

Там есть какой-то хитрый метод динамического определения версии GM, но я еще в нем не разобрался.
Ответ


Сообщения в этой теме

Перейти к форуму:


Пользователи, просматривающие эту тему: 2 Гость(ей)