Autor Wątek: ZTS: Przygotowanie DirectX SDK do pracy z Mingw  (Przeczytany 7100 razy)

st3tc

  • Gość
# Luty 01, 2007, 09:47:36
Zrób To Sam - Odcinek 1 :)

Temat:    Przygotowanie aktualnych wersji SDK DirectX do współpracy z Mingw.
Zadanko: Rozwiązanie problemu z brakiem aktualnych libków kompatybilnych z GCC.


1. Niezbędne programy
 
Udajemy się na stronkę
http://www.mingw.org/download.shtml

I zasysamy mingw-utils oraz binutils. Tam są potrzebne programiki do konwersji lib-ków VC++ na libki GCC.

Bezpośrednie linki:
http://prdownloads.sf.net/mingw/mingw-utils-0.3.tar.gz?download
http://prdownloads.sf.net/mingw/binutils-2.15.91-20040904-1.tar.gz?download

Potrzebujemy 3 programów:

as.exe
dlltool.exe
reimp.exe.

Muszą być w tym samym katalogu, lub widzieć się poprzez ścieżki PATH. Reimp.exe jest w mingw-utils, reszta w binutils.


2. Konwersja

UWAGA: konwersji mogą być poddane jedynie libki importowe - libki które posiadają kod nie da się przetworzyć. Ale i to da się obejść :)

Aby wykonać konwersję uruchamiamy reimpa. Np:

reimp.exe  d3d10.lib

To utworzy nam bibliotekę dla GCC o nazwie  libd3d10.a


3. Problemy

Problemy będą z bibliotekami nie posiadającymi importów, ale kod lub jakieś obiekty.

W tym przypadku powinno dać się to obejść stosując *.a które są w pakiecie Mingw. Gdyby jednak się nie dało (mało prawdopodobne ale …) - podaję ręczne obejścia :

dxguid.lib - nie da się poddać konwersji. No problem - zamiast tego w jednym z plików CPP przed wszystkimi nagłówkami podajemy:

#define INITGUID
Inna popularna i często używana to dinput8.lib. Zawiera potrzebne obiekty definiujące formaty danych np. dla myszki.

Poniżej kilka z formatów - często używanych. Tą metodą można zrobić każdy brakujący - info dostępne na necie.

Własne wersje c_dfDIMouse   c_dfDIMouse2

Kod: (cpp) [Zaznacz]
#define numObjects(x) (sizeof(x) / sizeof(x[0]))

DIOBJECTDATAFORMAT dfDIMouse[] = {
  { &GUID_XAxis,  DIMOFS_X, DIDFT_ANYINSTANCE | DIDFT_AXIS, 0 },
  { &GUID_YAxis,  DIMOFS_Y, DIDFT_ANYINSTANCE | DIDFT_AXIS, 0 },
  { &GUID_ZAxis,  DIMOFS_Z, DIDFT_OPTIONAL | DIDFT_ANYINSTANCE | DIDFT_AXIS, 0 },
  { &GUID_Button, DIMOFS_BUTTON0, DIDFT_ANYINSTANCE | DIDFT_BUTTON, 0 },
  { &GUID_Button, DIMOFS_BUTTON1, DIDFT_ANYINSTANCE | DIDFT_BUTTON, 0 },
  { &GUID_Button, DIMOFS_BUTTON2, DIDFT_OPTIONAL | DIDFT_ANYINSTANCE | DIDFT_BUTTON, 0 },
  { &GUID_Button, DIMOFS_BUTTON3, DIDFT_OPTIONAL | DIDFT_ANYINSTANCE | DIDFT_BUTTON, 0 }
};

const DIDATAFORMAT c_dfDIMouse = {
    sizeof(DIDATAFORMAT),
    sizeof(DIOBJECTDATAFORMAT),
    DIDF_RELAXIS,
    sizeof(DIMOUSESTATE),
    numObjects(dfDIMouse),
    dfDIMouse
};

DIOBJECTDATAFORMAT dfDIMouse2[] = {
  { &GUID_XAxis,  DIMOFS_X, DIDFT_ANYINSTANCE | DIDFT_AXIS, 0 },
  { &GUID_YAxis,  DIMOFS_Y, DIDFT_ANYINSTANCE | DIDFT_AXIS, 0 },
  { &GUID_ZAxis,  DIMOFS_Z, DIDFT_OPTIONAL | DIDFT_ANYINSTANCE | DIDFT_AXIS, 0 },
  { &GUID_Button, DIMOFS_BUTTON0, DIDFT_ANYINSTANCE | DIDFT_BUTTON, 0 },
  { &GUID_Button, DIMOFS_BUTTON1, DIDFT_ANYINSTANCE | DIDFT_BUTTON, 0 },
  { &GUID_Button, DIMOFS_BUTTON2, DIDFT_OPTIONAL | DIDFT_ANYINSTANCE | DIDFT_BUTTON, 0 },
  { &GUID_Button, DIMOFS_BUTTON3, DIDFT_OPTIONAL | DIDFT_ANYINSTANCE | DIDFT_BUTTON, 0 },
  { &GUID_Button, DIMOFS_BUTTON4, DIDFT_OPTIONAL | DIDFT_ANYINSTANCE | DIDFT_BUTTON, 0 },
  { &GUID_Button, DIMOFS_BUTTON5, DIDFT_OPTIONAL | DIDFT_ANYINSTANCE | DIDFT_BUTTON, 0 },
  { &GUID_Button, DIMOFS_BUTTON6, DIDFT_OPTIONAL | DIDFT_ANYINSTANCE | DIDFT_BUTTON, 0 },
  { &GUID_Button, DIMOFS_BUTTON7, DIDFT_OPTIONAL | DIDFT_ANYINSTANCE | DIDFT_BUTTON, 0 }
};

const DIDATAFORMAT c_dfDIMouse2 = {
    sizeof(DIDATAFORMAT),
    sizeof(DIOBJECTDATAFORMAT),
    DIDF_RELAXIS,
    sizeof(DIMOUSESTATE2),
    numObjects(dfDIMouse2),
    dfDIMouse2
};

Klawiatura - zastępuje c_dfDIKeyboard

Kod: (cpp) [Zaznacz]
DIDATAFORMAT       c_dfDIKeyboard;
DIOBJECTDATAFORMAT diodf[256];
int i;

for(i=0; i<256; i++)
{
diodf[i].pguid       = &GUID_Key;
diodf[i].dwOfs       = i;
diodf[i].dwType      = DIDFT_BUTTON | DIDFT_MAKEINSTANCE(i) | 0x80000000;
diodf[i].dwFlags       = 0;
}

c_dfDIKeyboard.dwSize       = sizeof(DIDATAFORMAT);
c_dfDIKeyboard.dwObjSize    = sizeof(DIOBJECTDATAFORMAT);
c_dfDIKeyboard.dwFlags    = 0;
c_dfDIKeyboard.dwDataSize   = 256;
c_dfDIKeyboard.dwNumObjs    = 256;
c_dfDIKeyboard.rgodf        = diodf;

Do szczęścia brakuje jeszcze c_dfDIJoystick i c_dfDIJoystick2 ale to później (a może ktoś tu dopisze ? :) )


4. Podsumowanko

Poza malutkimi problemami (które wcale nie muszą wystąpić) - mamy do dyspozycji zawsze aktualne libki i nagłówki dla GCC - nie trzeba szukać po necie i czekać aż ktoś łaskawie przygotuje.

Pozdr.
 st3tc
« Ostatnia zmiana: Marzec 07, 2007, 20:05:58 wysłana przez st3tc »

Offline Mr. Spam

  • Miłośnik przetworów mięsnych