einen Direct3D Hook?!?

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

 

hamztata

Betreff: einen Direct3D Hook?!?

BeitragDi, Apr 14, 2009 20:27
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDi, Apr 14, 2009 23:25
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDi, Apr 14, 2009 23:57
Antworten mit Zitat
Benutzer-Profile anzeigen
Du kannst nach dem RenderWorld ganz Normal die 2D befehle nutzen.
 

ChristianK

BeitragMi, Apr 15, 2009 0:06
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragMi, Apr 15, 2009 10:52
Antworten mit Zitat
Benutzer-Profile anzeigen
@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

BeitragMi, Apr 15, 2009 10:59
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragMi, Apr 15, 2009 11:04
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragMi, Apr 15, 2009 11:11
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragMi, Apr 15, 2009 18:25
Antworten mit Zitat
Benutzer-Profile anzeigen
ja da stehe ich jetzt auch vor einem problem.
ich kann mittels GetDevice Direct3DDevice9 zurückbekommen und das MUSS reichen.
FastImage basiert darauf....

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group