Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Video driver - mICrO

Iniciado por ethernet, 07 de Febrero de 2003, 10:18:25 PM

« anterior - próximo »

ethernet



       Basicamente es para que la gente vea como hacer un sistema de drivers para su motor/juego, etc.

       Este es un ejemplo de como conseguir cargar la implementacion de una clase de una dll de esta manera con muy pocos cambios conseguir por ejemplo renderizar con OpenGL Direct3d o cualquier otra API sin tener que cambiar ni una linea de codigo.

       Aunque aqui se muestra como ejemplo un driver de video se puede aplicar a otros sistemas como AI, sonido...

       Si quieres ver implementaciones de este tipo en el codigo fuente del quake o del unreal puedes ver como se usa este sistema.






//////////////////////////////////////////////////////////////////////

// Video.h: interface for Video DLLs

// Common Use

//////////////////////////////////////////////////////////////////////



#if !defined(TVideoDriver__INCLUDED_)

#define TVideoDriver__INCLUDED_



// this is actually our interface, i added only a few functions

struct TVideoDriver

{

// get driver name

virtual void getName(char* strOut);



// init the driver

virtual BOOL initialize(HWND window);



// finish the driver

virtual BOOL finalize();



// setup the driver

virtual BOOL setup();



// begin a frame

virtual BOOL beginFrame();



// end a frame

virtual BOOL endFrame();



// open the driver for rendering

virtual BOOL openVideo(HWND renderWindow);



// close the driver for rendering

virtual BOOL closeVideo();

};



// the only function that a driver must export

typedef TVideoDriver*(*ptrFuncGetVideoDriver)();



#endif // !defined(TVideoDriver__INCLUDED_)



//////////////////////////////////////////////////////////////////////

// main.cpp: dll main

// This in CustomDriver.Dll

//////////////////////////////////////////////////////////////////////



// just the driver object

CCustomVideoDriver driver;



// return a cast to the interface

extern "C" __declspec(dllexport) TVideoDriver* getVideoDriver()

{

return (TYakVideoDriver*) &

}





//////////////////////////////////////////////////////////////////////

// CustomVideoDriver.h: Declaration of our driver

// This in CustomDriver.Dll

//////////////////////////////////////////////////////////////////////

class CCustomVideoDriver : public TYakVideoDriver

{

public:



// driver interfaces



void getName(char* strOut);



BOOL initialize(HWND window);  

BOOL finalize();



BOOL setup();





BOOL beginFrame();

BOOL endFrame();



BOOL openVideo(HWND renderWindow);

BOOL closeVideo();



// custom data, just a posible example

private:



D3D9TextureManager* pManager;

}





//////////////////////////////////////////////////////////////////////

// CustomVideoDriver.cpp: Code of our driver (just example)

// This in CustomDriver.Dll

//////////////////////////////////////////////////////////////////////

BOOL CCustomVideoDriver::initialize(HWND window)

{

return initD3D9(); // and so on

}







//////////////////////////////////////////////////////////////////////

// DriverManager.h: Manage the drivers

// This in our game.exe

//////////////////////////////////////////////////////////////////////

class CVideoManager

{

public :



BOOL loadDriver(char* fileName);

BOOL unloaDriver();

inline TYakVideoDriver* getDriver(){return driver;}

private :



HMODULE libraryHandle;

TYakVideoDriver* driver;

}



//////////////////////////////////////////////////////////////////////

// DriverManager.cpp: Manage the drivers

// This in our game.exe

//////////////////////////////////////////////////////////////////////

BOOL CVideoManager::loadDriver(char* fileName)

{

BOOL result = TRUE;



libraryHandle = LoadLibrary(fileName);



if (libraryHandle != NULL)

{

 ptrFuncGetVideoDriver funcGetDriver =(ptrFuncGetVideoDriver)

  GetProcAddress(libraryHandle, "getVideoDriver");

 

 if (funcGetDriver != NULL)

  driver = funcGetDriver();

 else

  result = FALSE;

}

else

{

 result = FALSE

 driver = NULL;

}



return result;

}





//////////////////////////////////////////////////////////////////////

// game.cpp: Some code to see how we could use it

// This in our game.exe

//////////////////////////////////////////////////////////////////////



void game()

{

videoManager.getDriver()->OpenVideo(mainWindow);

}








    Éste código fue enviado por mICrO.

    Si quieres enviar tu propio código hazlo a  
eth_cotd@lycos.es

    ethernet

    He añadido algunos comentarios, micro no ha puesto demasiados y aunque a los q lleven un tiempo programando les sonara esta forma de cargar la implementacion de una libreria en tiempo de ejecucion, a otros les puede sonar a chino y mas si no estan  muy familiarizados con c++.
    Hay tutoriales de como usar este sistema en flicpode y como no, en google.com :D

    Esta semana ha sido la primera q he podido elegir cotw mucha gracias a los q han enviado codigos, todos de muy buena calidad.

    saludos

    Zaelsius

                                    Hay algo parecido en FlipCode: http://www.flipcode.com/cgi-bin/msg.cgi?sh...orum=cotd&id=-1, aunque está enfocado a DirectX.                                

    ethernet

    ZaelSiuS:
    No se refiere a eso exactamente, mas bien lo mas parecido es este codigo mega-ofsucado :
    http://www.flipcode.com/cgi-bin/msg.cgi?sh...orum=cotd&id=-1

    AK47

                                    Magnifico codigo, si señor!
    ¡Oh gracias gran maestro micro, por compartir tu sabiduria con nosotros, seguramente este codigo me salvara la vida!
    El codigo es casi tan bueno como MI Pekechat que tambien se puede pillar en este foro. Asi que ya lo estais probando XDDD ;)

    Bueno trabajo maetro micro  8)                                






    Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
    Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
    Muchísimas gracias.