Hola, que tal. Quería comentar un problema que tengo con looverLib a la hora de crear mis propias ventanas. El tema es que para hacer esto, también hay que inicializar directx para luego pasar a looverLib los punteros device y direct3d que inicializo. La api tiene funciones para cargar el direct y el device, pero al pasarle al render.init dichos parámetros el programa peta.
La inicialización en sí la hago con esta funcion (los punteros al device, direct y la ventana hwnd (que se muestra correctamente) están declarados como global de momento):
void Inicializa_D3D(void)
{
HRESULT hr;
D3DPRESENT_PARAMETERS d3dpp;
D3DDISPLAYMODE modo_de_video;
// creamos nuestro objeto 3D, siempre enviando como argumento la variable D3D_SDK_VERSION,
// esto para que D3D compruebe que los .h que se estan usando son los correctos.
//Always pass D3D_SDK_VERSION to the function.
obj_D3D = Direct3DCreate9( D3D_SDK_VERSION );
if(!obj_D3D ){
Error_Fatal("Error intentando crear Direct 3D");
}
// Captura nuestro modo de video actual. Esto solamente es necesario si estamos corriendo
// en modo de ventana normal. pero ...
hr=obj_D3D->GetAdapterDisplayMode(D3DADAPTER_DEFAULT,&modo_de_video);
if(FAILED(hr)){
Error_Fatal("Error capturando el modo de video");
}
// Limpia nuestra estructura de parametros. Aunque vamos a llenar todos sus campos, pero es
// una buena practica inicializar variables.
ZeroMemory(&d3dpp,sizeof(d3dpp));
d3dpp.BackBufferWidth = g_ancho;
d3dpp.BackBufferHeight = g_alto;
d3dpp.BackBufferFormat = D3DFMT_A8R8G8B8;
d3dpp.BackBufferCount = 1;
d3dpp.MultiSampleType = D3DMULTISAMPLE_NONE;
d3dpp.MultiSampleQuality = 0;
d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
d3dpp.hDeviceWindow = hwnd;
d3dpp.Windowed = true;
d3dpp.EnableAutoDepthStencil = true;
d3dpp.AutoDepthStencilFormat = D3DFMT_D24S8;
d3dpp.Flags = 0;
d3dpp.FullScreen_RefreshRateInHz = D3DPRESENT_RATE_DEFAULT;
d3dpp.PresentationInterval = D3DPRESENT_INTERVAL_IMMEDIATE;
// Despues de llenar nuestra estructura de parametros, estamos listos para crear nuestro
// dispositivo.
// La mayoria de opciones sobre como crear nuestro dispositivo se configuran con esta
// estructura de parametros.
hr=obj_D3D->CreateDevice(D3DADAPTER_DEFAULT, // El adaptador de pantalla por defecto,
// En un sistema con mas de un monitor debemos
// escoger en cual.
// Usa la aceleracion de hardware antes que la renderizacion por software
D3DDEVTYPE_HAL,
// Nuestro puntero a la ventana principal
hwnd,
// procesa lso vertices por software. Esto es un poco mas lento
// que con hardware, pero funciona en TODAS las tarjetas de video.
D3DCREATE_SOFTWARE_VERTEXPROCESSING,
// Nuestra ya conocida estructura de parametros
&d3dpp,
// Setea el puntero hacia nuestro nuevo dispositivo 3D
&obj_dispositivo_D3D);
if(FAILED(hr)){
Error_Fatal("Error creando el dispositivo");
}
}
Tras esto, que no da ningún tipo de error y que funciona en otra aplicación, le paso los punteros al render.init... y ahí se acaba la aplicación. Mi teoría es que algún parámetro de los que se pasa en createDevice no es correcto para que funcione con la api, pero no se...
Ya se que la pregunta es tremendamente rebuscada, pero la hago por si alguien ha trabajado con looverLib. Muchas gracias.
La inicialización en sí la hago con esta funcion (los punteros al device, direct y la ventana hwnd (que se muestra correctamente) están declarados como global de momento):
void Inicializa_D3D(void)
{
HRESULT hr;
D3DPRESENT_PARAMETERS d3dpp;
D3DDISPLAYMODE modo_de_video;
// creamos nuestro objeto 3D, siempre enviando como argumento la variable D3D_SDK_VERSION,
// esto para que D3D compruebe que los .h que se estan usando son los correctos.
//Always pass D3D_SDK_VERSION to the function.
obj_D3D = Direct3DCreate9( D3D_SDK_VERSION );
if(!obj_D3D ){
Error_Fatal("Error intentando crear Direct 3D");
}
// Captura nuestro modo de video actual. Esto solamente es necesario si estamos corriendo
// en modo de ventana normal. pero ...
hr=obj_D3D->GetAdapterDisplayMode(D3DADAPTER_DEFAULT,&modo_de_video);
if(FAILED(hr)){
Error_Fatal("Error capturando el modo de video");
}
// Limpia nuestra estructura de parametros. Aunque vamos a llenar todos sus campos, pero es
// una buena practica inicializar variables.
ZeroMemory(&d3dpp,sizeof(d3dpp));
d3dpp.BackBufferWidth = g_ancho;
d3dpp.BackBufferHeight = g_alto;
d3dpp.BackBufferFormat = D3DFMT_A8R8G8B8;
d3dpp.BackBufferCount = 1;
d3dpp.MultiSampleType = D3DMULTISAMPLE_NONE;
d3dpp.MultiSampleQuality = 0;
d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
d3dpp.hDeviceWindow = hwnd;
d3dpp.Windowed = true;
d3dpp.EnableAutoDepthStencil = true;
d3dpp.AutoDepthStencilFormat = D3DFMT_D24S8;
d3dpp.Flags = 0;
d3dpp.FullScreen_RefreshRateInHz = D3DPRESENT_RATE_DEFAULT;
d3dpp.PresentationInterval = D3DPRESENT_INTERVAL_IMMEDIATE;
// Despues de llenar nuestra estructura de parametros, estamos listos para crear nuestro
// dispositivo.
// La mayoria de opciones sobre como crear nuestro dispositivo se configuran con esta
// estructura de parametros.
hr=obj_D3D->CreateDevice(D3DADAPTER_DEFAULT, // El adaptador de pantalla por defecto,
// En un sistema con mas de un monitor debemos
// escoger en cual.
// Usa la aceleracion de hardware antes que la renderizacion por software
D3DDEVTYPE_HAL,
// Nuestro puntero a la ventana principal
hwnd,
// procesa lso vertices por software. Esto es un poco mas lento
// que con hardware, pero funciona en TODAS las tarjetas de video.
D3DCREATE_SOFTWARE_VERTEXPROCESSING,
// Nuestra ya conocida estructura de parametros
&d3dpp,
// Setea el puntero hacia nuestro nuevo dispositivo 3D
&obj_dispositivo_D3D);
if(FAILED(hr)){
Error_Fatal("Error creando el dispositivo");
}
}
Tras esto, que no da ningún tipo de error y que funciona en otra aplicación, le paso los punteros al render.init... y ahí se acaba la aplicación. Mi teoría es que algún parámetro de los que se pasa en createDevice no es correcto para que funcione con la api, pero no se...
Ya se que la pregunta es tremendamente rebuscada, pero la hago por si alguien ha trabajado con looverLib. Muchas gracias.