einen Direct3D Hook?!?
Übersicht

hamztataBetreff: einen Direct3D Hook?!? |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Hat schonmal jemand sowas versucht?
Also wenn man beispielsweise eine 2d engine coden will, die im BB3D Fenster rendert. Müsste wohl in C++ oder BMax gecodet werden. Ich such sowas in der art. |
||
![]() |
Chester |
![]() Antworten mit Zitat ![]() |
---|---|---|
was genau meinst du damit?
Einfach nur die Benutzung eines BB Fensters mit einer anderen Engine? Weil das ist eigentlich überhaupt kein Problem für irgendeine Engine. Ich mach es ja hier genauso. Aber was genau meinst du mit 2D Engine im BB3D Fenster? Suchst du vielleicht sowas wie Draw3D? |
||
![]() |
BtbN |
![]() Antworten mit Zitat ![]() |
---|---|---|
Du kannst nach dem RenderWorld ganz Normal die 2D befehle nutzen. | ||
ChristianK |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Man könnte dann auch gleich die Direct3D-Objekte verwenden, die von B3D erstellt werden, falls du das meinst. Siehe SystemProperty![]() |
||
AdvanceLcd
Intel Core 2 Duo 3.2 GHz, 4 GB RAM, GeForce 8800 GTX | MacBook Pro 15,4″ Intel Core 2 Duo 2.4 GHz, 2 GB RAM, GeForce 8600M GT |
hamztata |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
@chester: so wie bei dir, kommt dem was ich will wohl am nächsten.
Ich möchte wissen wie man mittels der direct3d device in einem bb3d fenster rendern kann. Aber es soll normal als bb3d fenster funktionieren. Im Grunde mopst man sich zwischendurch mittels pointer das d3d device zeichnet sein zeug und gibts hinterher wieder an bb3d zurück. Also stellt euch vor, ihr habt irgendein game in bb3d am laufen, und ich möchte mir eine dll bauen, welche dann seperat 2d befehle ausführen kann.(und nein, ich möchte nicht die internen nutzen) letztendlich geht es mir um dx9 mit xors3d, weil ich da was probieren will, aber ich denke, die wahrscheinlichkeit ist höher, daß das jemand mal mit bb3d gemacht hat, und ich es dann ableiten kann. sowas, nur mein c++ verständnis reicht nicht aus, um daraus sagen wir eine init und eine deinit funktion zu bauen, um befehle wie drawrect,drawimage,loadimage etc. einzubauen. wobei ich dies schon hinbekomme, nur der Init(), DeInit() part ist das Problem, weil zwischen diesen beiden funktionen müsste der hook bei meinem createdevice bleiben, und erst bei deinit zurückgegeben werden. Code: [AUSKLAPPEN] // D3d hook
#include <windows.h> #include <cstdio> #include <d3d9.h> #include <d3dx9.h> typedef HRESULT(__stdcall* EndScene_t)(LPDIRECT3DDEVICE9); // typedef EndScene_t pEndScene; void InitHook(); void *DetourFunc(BYTE *src, const BYTE *dst, const int len); HRESULT __stdcall hkEndScene(LPDIRECT3DDEVICE9 pDevice) { // das ist das entscheidende: Wenn normalerweise EndScene aufgerufen wird, wird diese Funktion von dem Programm aufgerufen // hier kommen die Sachen hin die man drawn will mit pDevice. // und dann noch zurück zum originalen EndScene, diese muss ja auch aufgerufen werden return pEndScene(pDevice); } int WINAPI DllMain(HINSTANCE hInst,DWORD reason,LPVOID reserved) { switch(reason) { case DLL_PROCESS_ATTACH: CreateThread(0, 0, (LPTHREAD_START_ROUTINE) InitHook, 0, 0, 0); break; } return true; } void InitHook() { HMODULE hModule = NULL; while( !hModule ) { hModule = GetModuleHandleA( "d3d9.dll" ); // Handle zur DLL holen Sleep( 100 ); // 100ms warten } // 0x4FDD71B0 ist die Addresse für EndScene in d3d9.dll pEndScene = ( EndScene_t )DetourFunc((PBYTE) 0x4FDD71B0,(PBYTE)hkEndScene, 5); // hier ist der hook } void *DetourFunc(BYTE *src, const BYTE *dst, const int len) // detour, muss man nicht wirklich verstehen. Der Code ersetzt das alte endScene durch unseres. Ist von gd { BYTE *jmp = (BYTE*)malloc(len+5); DWORD dwback; VirtualProtect(src, len, PAGE_READWRITE, &dwback); memcpy(jmp, src, len); jmp += len; jmp[0] = 0xE9; *(DWORD*)(jmp+1) = (DWORD)(src+len - jmp) - 5; src[0] = 0xE9; *(DWORD*)(src+1) = (DWORD)(dst - src) - 5; VirtualProtect(src, len, dwback, &dwback); return (jmp-len); } |
||
matze-t |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Ich habs noch nie probiert, aber ich denk mit SystemProperty kannste da was machen, so wies ChristianK vorgeschlagen hat.
Code: [AUSKLAPPEN] d3ddevice = SystemProperty("Direct3DDevice7");
|
||
hamztata |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
ja, das weiß ich, den pointer darauf bekomme ich ja, und mein code oben sollte funktionieren, aber ich brauch halt eine init und eine deinit funktion, wo darin die eigenen dx9 funktionen ausgeführt werden.
vielleicht kann ja einer hier mehr c++ als ich, und weiß wie man meinen geposteten code oben umschreiben müsste um diese funktionen zu erhalten. man kann ja basierend auf bb3d SystemProperty nehmen, ich kanns ja ableiten. |
||
matze-t |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Schau dir mal des (etwas ältere) Beispiel zu SystemProperty an. Ich glaub so was in die Richtung möchtest du machen. Du kannst das d3d-Device direkt nutzen.
Was zu Problemen führen könnte: Mit BB benutzt du DircetX 7, in C++ DirectX 9. Wenn du genau das lösen willst, kann ich dir leider auch nicht weiterhelfen. BlitzBasic: Code: [AUSKLAPPEN] Const D3DSHADE_FLAT= 1
Const D3DSHADE_GOURAUD= 2 Const D3DSHADE_PHONG= 3 Graphics3D 800,600,32,2 Direct3D7=SystemProperty$("Direct3D7") Direct3DDevice7=SystemProperty$("Direct3DDevice7") DirectDraw7=SystemProperty$("DirectDraw7") DirectInput7=SystemProperty$("DirectInput7") AppHWND=SystemProperty$("AppHWND") AppHINSTANCE=SystemProperty$("AppHINSTANCE") cam=CreateCamera() PositionEntity cam,0,0,-4 light=CreateLight() RotateEntity light,60,30,0 sphere=CreateSphere() While Not KeyHit(1) Text 0,0,"Press 1,2 or 3 to change the Render Style" If KeyHit(2) ChangeRenderStyle Direct3DDevice7,D3DSHADE_FLAT If KeyHit(3) ChangeRenderStyle Direct3DDevice7,D3DSHADE_GOURAUD If KeyHit(4) ChangeRenderStyle Direct3DDevice7,D3DSHADE_PHONG RenderWorld Flip Wend End C++ (in dll) Code: [AUSKLAPPEN] #define BBDECL extern "C" _declspec(dllexport)
#define BBCALL _stdcall #include BBDECL void BBCALL ChangeRenderStyle(IDirect3DDevice7 *lpDev, unsigned int mode) { int hr = lpDev->SetRenderState(D3DRENDERSTATE_SHADEMODE, mode); } |
||
hamztata |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
ja da stehe ich jetzt auch vor einem problem.
ich kann mittels GetDevice Direct3DDevice9 zurückbekommen und das MUSS reichen. FastImage basiert darauf.... |
||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group