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;
в 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;
но я сомневаюсь, действительно ли они возвращают то что надо, потому что они ни как мне не помогли.
]]>#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, но я еще в нем не разобрался.
]]>