#1 2021-11-15 18:52:55

FireRun
Разработчик Xtreme3D
Из Казахстана
Зарегистрирован: 2018-06-11
Сообщений: 131
Сайт

Как получить контекст GM8

Привет всем, как же давно уже не создавал новых тем на форуме  smile
Вопрос такой, хочу подключить библиотеку ImGui к гм8, только чтобы дисплеи не перерисовывался, а рисовался на контексте самого GM8 (DX8 или DX9?), никогда не пробовал такого, как это можно сделать на С++?

Редактировался FireRun (2021-11-15 18:54:29)


Программист,Художник
музыкальный продюсер (FIRERUN): https://soundcloud.com/djfirerun
Xtreme3D Editor (Xtreme3D с графическим интерфейсом): https://vk.com/x3deditor

Offline

#2 2021-11-19 13:45:16

Gecko
Админ
Из РФ, Казань
Зарегистрирован: 2018-06-02
Сообщений: 160
Сайт

Re: Как получить контекст GM8

Раньше можно было получить контекст при помощи GMAPI, но я его не тестировал с GM8. Могу поковырять на досуге, может работает)

Offline

#3 2021-11-19 15:55:00

Gecko
Админ
Из РФ, Казань
Зарегистрирован: 2018-06-02
Сообщений: 160
Сайт

Re: Как получить контекст GM8

В общем, что сумел выяснить, изучив исходники: необязательно подключать весь GMAPI, достаточно просто получить указатели IDirect3D8* и IDirect3DDevice8* по адресу в памяти приложения. Для GM 8.0 это 0x0058D384. Можно написать вот так:

#include <d3d8.h>

#define GM80_ADDRESS_STORAGE_DIRECTX 0x0058D384;

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

const GMDirect3DInfo* d3d = (GMDirect3DInfo*)GM80_ADDRESS_STORAGE_DIRECTX;

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

#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 адреса будут, соответственно, такие:

#define GM61_ADDRESS_STORAGE_DIRECTX 0x005379F0;
#define GM70_ADDRESS_STORAGE_DIRECTX 0x00587A60;

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

Offline

#4 2021-11-22 16:06:37

FireRun
Разработчик Xtreme3D
Из Казахстана
Зарегистрирован: 2018-06-11
Сообщений: 131
Сайт

Re: Как получить контекст GM8

Спасибо, завтра обязательно опробую)
Если что выложу сюда


Программист,Художник
музыкальный продюсер (FIRERUN): https://soundcloud.com/djfirerun
Xtreme3D Editor (Xtreme3D с графическим интерфейсом): https://vk.com/x3deditor

Offline

#5 2021-12-13 09:46:04

FireRun
Разработчик Xtreme3D
Из Казахстана
Зарегистрирован: 2018-06-11
Сообщений: 131
Сайт

Re: Как получить контекст GM8

В общем ничего не вышло, ImGui для dx8 нет, минимальная версия это dx9. Но, руки опускать все ровно не хочется, раз с встроенным GUI движком в xtreme3d проблемы, решил стоит попробовать портировать imgui для xtreme3d, там как раз есть биндинг для win32 и opengl 2. Только как подключится к контексту X3D я не знаю, в GLScene нет функции для получения HDC и HGLRC  (или я не нашел), если будет у кого время добавить функции для возврата текущих HDC и HGLRC (wglGetCurrentContext) в x3d, готов полностью добавить ImGui  smile

Редактировался FireRun (2021-12-13 17:35:25)


Программист,Художник
музыкальный продюсер (FIRERUN): https://soundcloud.com/djfirerun
Xtreme3D Editor (Xtreme3D с графическим интерфейсом): https://vk.com/x3deditor

Offline

#6 2021-12-13 17:46:41

FireRun
Разработчик Xtreme3D
Из Казахстана
Зарегистрирован: 2018-06-11
Сообщений: 131
Сайт

Re: Как получить контекст GM8

Проверил работоспособность убрав все функции x3d, работает все отлично, но только на новом контексте wglCreateContext, есть идеи как к x3d прикрутить ?

qfm5cqoefOY.jpg?size=1280x759&quality=96&sign=b3dd634fe4b886976628be2aefa6e80c&type=album

в xtreme3d добавил 3 функции:

function ViewerGetHandle(viewer: real): real; stdcall;
begin
  result:=Integer(TGLSceneViewer(trunc64(viewer)).Handle);
end;

function ViewerGetRC(viewer: real): real; stdcall;
begin
  result:=Integer(TGLSceneViewer(trunc64(viewer)).Buffer);
end;

function ViewerGetDC(viewer: real): real; stdcall;
begin
  result:=Integer(TGLSceneViewer(trunc64(viewer)).RenderDC);
end;

но я сомневаюсь, действительно ли они возвращают то что надо, потому что они ни как мне не помогли.

Редактировался FireRun (2021-12-13 18:11:02)


Программист,Художник
музыкальный продюсер (FIRERUN): https://soundcloud.com/djfirerun
Xtreme3D Editor (Xtreme3D с графическим интерфейсом): https://vk.com/x3deditor

Offline

#7 2021-12-13 20:16:48

FireRun
Разработчик Xtreme3D
Из Казахстана
Зарегистрирован: 2018-06-11
Сообщений: 131
Сайт

Re: Как получить контекст GM8

Заменил функции таким способом, но все ровно ничего не отображается

function ViewerGetHandle(viewer: real): real; stdcall;
begin
  result:=Integer(TGLSceneViewer(trunc64(viewer)).ParentWindow);
end;

function ViewerGetRC(): real; stdcall;
begin
  result:=Integer(wglGetCurrentContext());
end;

function ViewerGetDC(viewer: real): real; stdcall;
begin
  result:=Integer(GetDC( TGLSceneViewer(trunc64(viewer)).ParentWindow ));
end;

Редактировался FireRun (2021-12-13 20:19:11)


Программист,Художник
музыкальный продюсер (FIRERUN): https://soundcloud.com/djfirerun
Xtreme3D Editor (Xtreme3D с графическим интерфейсом): https://vk.com/x3deditor

Offline

#8 2021-12-18 19:48:14

Gecko
Админ
Из РФ, Казань
Зарегистрирован: 2018-06-02
Сообщений: 160
Сайт

Re: Как получить контекст GM8

Теоретически через wglGetCurrentContext должно работать, но видимо не так все просто с рендерингом извне. Где-то что-то не так установлено, какие-то свойства glEnable, ресурсы не так подключены на момент входа в контекст - и в итоге очень высока вероятность, что не сработает. Это очень сложно отлаживать, к сожалению. Даже непонятно, с какой стороны подходить. В идеале конечно лучше ImGui непосредственно в сам движок добавить как расширение.

Offline

Подвал доски

Под управлением FluxBB