Inicialización del Driver de Vídeo.
esto supone que la clase IVideoDriver es amiga de la clase que la declara y por tanto puede acceder a sus miembros privados, tanto el constructor como el destructor.
DIRECTX:
OPENGL:
Para Dev C++:
Para Visual C:
Vamos a empezar con la base de lo que será nuestro motor 3D. Para ello, vamos a independizar la aplicación del uso de una librería gráfica, ya sea OpenGL o DirectX. Para ello nos aprovecharemos del C++ para definir una clase Interfaz con métodos gráficos cuya implementeación, dependerá de qué librería gráfica queramos utilizar.
Para llevar a cabo esta idea, usaremos lo que se denomina Polimorfismo Dinámico, que consiste en definir un puntero a una clase padre, e instanciar un objeto de una clase hija. De esta forma, definiremos un puntero a la clase IVideoDriver e instanciaremos un objeto de la clase OpenGLVideoDriver o DirectX9VideoDriver.
La aplicación trabajará llamando a los métodos declarados en la clase padre, pero implementados en las clases hijas con lo que de esta forma se puede usar una librería gráfica u otra sin que tengamos que modificar el código de la aplicación.
Tal como he diseñado la clase de interfaz, sólo se permite crear una instancia del Driver de Vídeo. Esto lo he hecho así para poder definir una variable estática que permite acceder al Driver de Vídeo desde cualquier clase de la forma: IVideoDriver::GetVideoDriver(), obteniendo el puntero que nos permite acceder a toda su funcionalidad.
Si esta limitación no se ajusta a vuestros propósitos, podéis modificar la clase de forma que se puedan crear tantas instancias del Driver de Vídeo como queráis.
Fijaros en una cosa, los constructores de las clases OpenGLVideoDriver y DirectX9VideoDriver SON PRIVADOS. Esto significa que no podéis crear objetos de dichas clases de forman directa, no podéis hacer NEW. Entonces, ¿cómo se crean las instancias?.
Fijáos, que en el .h de OpenGLVideoDriver y DirectX9VideoDriver aparece la siguiente sentencia:
class OpenGLVideoDriver : public IVideoDriver
{
friend class IVideoDriver; ///< IVideoDriver es amiga de la clase, ya que creará sus instancias.
esto supone que la clase IVideoDriver es amiga de la clase que la declara y por tanto puede acceder a sus miembros privados, tanto el constructor como el destructor.
Con esto, se definen los métodos estáticos:
///////////////////////////////////////////////////////////////////////////////
/// CreateInstance: Crea una instancia del Driver de Vídeo.
///
/// @param e_VIDEO_DRIVER kindVideoDriver: Tipo de librería de la que se
/// obtendrá la instancia:
/// - eOpenGL : OpenGL.
/// - eDirectX9 : DirectX 9.
/// @param e_AXIS_SYSTEM axisSystem: Sistema de ejes coordenados:
/// - eRightHanded : Sistema de mano derecha, como en OpenGL.
/// - eLeftHanded : Sistema de mano izquierda, como en DirectX.
///
/// @return static IVideoDriver *: Instancia del Driver de Vídeo.
///////////////////////////////////////////////////////////////////////////////
static IVideoDriver * CreateInstance( e_VIDEO_DRIVER kindVideoDriver,
e_AXIS_SYSTEM axisSystem );
///////////////////////////////////////////////////////////////////////////////
/// Release: Finaliza la librería gráfica.
///
/// @param IVideoDriver * pIVideoDriver: Instancia del Driver de Vídeo a liberar.
///
/// @return int:
/// - -1 : error.
/// - otro: correcto.
///////////////////////////////////////////////////////////////////////////////
static int Release(IVideoDriver * pIVideoDriver);
que son los que crearán una instancia de cada clase hija. La implementación de dichos métodos se encuentra en los ficheros directxvideodriver.cpp y openglvideodriver.cpp. Se podría haber metido en un fichero ivideodriver.cpp, pero lo he hecho así, para que la instanciación de DirectX sea independiente de la de OpenGL y así cuando se desea compilar para OpenGL no hace falta enlazar con las librerías de DirectX.
CONFIGURACIÓN DE ENTORNOSDIRECTX:
Para desarrollar con DirectX, podéis usar Visual o Dev-C++.
Para trabajar con Dev-C++, teneís que descargaros el paquete de desarrollo DirectX9.DevPak e instalarlo.
Tenéis que añadir las siguientes opciones al proyecto para compilar con DirectX:
Si al ejecutar el ejemplo, os dice que no encuentra la dll, buscad en C:/[directorio instalacion Dev-Cpp]/DLL y veréis que hay unas dll's. Copiaros el fichero d3dx9d.dll al directorio bindx donde se genera el ejecutable, o si no queréis que os pida siempre el fichero, lo copiais al directorio C:/WINDOWS/system32 y os debería funcionar.
Para desarrollar con Visual, tenéis que descargaros el SDK DirectX 9c y configurar los entornos:
En el caso de Visual C 6.0 es MUY IMPORTANTE que los directorios de DirectX estén los primeros, porque debe enlazar con ciertas librerías en lugar de las que vienen por defecto.
Para Visual C 2005:
En la opciones del proyecto debéis declarar el define __DIRECT_X__ y enlazar con las librerías: d3d9.lib d3dx9.lib dxerr9.lib advapi32.lib user32.lib winmm.lib gdi32.lib.
En el caso de OpenGL, debéis declarar el define __WIN_OPEN_GL__ y enlazar con las librerías: opengl32.lib glu32.lib kernel32.lib user32.lib gdi32.lib.
Comentarios