Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

24.06.2003, 18:54

Bildspeicherformat enumerieren funktioniert nicht richtig

Ich hab' ne Funktion geschrieben, die alle verfügbaren Bildspeicherformate auflisten soll (wie in TriBase, der ConfigDialog). Aber es wird immer nur das D3DFMT_R5G6B5 angezeigt. TriBase zeigt mir aber mehr, warum listet meine Funktio nicht alle auf?

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
//********************************************************************************************
//Für das Bildspeicherformat
EFEResult UpdateBackBufferFormatComboBox(HWND hConfigWnd)
{
    D3DDISPLAYMODE sD3DWindowsDisplayMode;
    D3DFORMAT asD3DFormats[] = {D3DFMT_A2R10G10B10, 
                                D3DFMT_X8R8G8B8, 
                                D3DFMT_A8R8G8B8,
                                D3DFMT_R5G6B5, 
                                D3DFMT_X1R5G5B5, 
                                D3DFMT_A1R5G5B5};
    const char acsFormatDesc[6][21] = {"A2R10G10B10 (32 Bit)",
                                       "X8R8G8B8    (32 Bit)",
                                       "A8R8G8B8    (32 Bit)",
                                       "R5G6B5      (16 Bit)",
                                       "X1R5G5B5    (16 Bit)",
                                       "A1R5G5B5    (16 Bit)"};
    unsigned short usFormat = 0;
    long lResult = 0;

    //Die ComboBox leeren
    SendMessage(hBackBufferFormatComboBox, CB_RESETCONTENT, 0, 0);

    //Den aktuellen Displaymodus von Windows holen
    pD3DInterface->GetAdapterDisplayMode(sDXConfig.Direct3D.uiGraphicAdapter, 
                                         &sD3DWindowsDisplayMode);

    for(usFormat = 0; usFormat < 7; usFormat++)
    {
        //Auf Verfügbarkeit prüfen
        lResult = pD3DInterface->CheckDeviceFormat(sDXConfig.Direct3D.uiGraphicAdapter,
                                                   sDXConfig.Direct3D.D3DDevType,
                                                   sDXConfig.Direct3D.bWindowMode ? 
                                                       sD3DWindowsDisplayMode.Format
                                                       : sDXConfig.Direct3D.D3DDisplayMode.Format,
                                                   D3DUSAGE_RENDERTARGET,
                                                   D3DRTYPE_SURFACE,
                                                   asD3DFormats[usFormat]);

        //Wenn es nicht verfügbar ist, einfach weiter machn
        if(lResult == D3DERR_NOTAVAILABLE)
            continue;

        //Fehler in der Funktion CheckDeviceFormat
        if(lResult == D3DERR_INVALIDCALL)
        {
            MessageBox(hConfigWnd,
                       "Ein Bildspeicherformat konnte nicht auf verfügbarkeit getestet werden",
                       "FireEagle-DirectX-Konfiguration",
                       MB_OK | MB_ICONEXCLAMATION);

            FELogDXError("CheckDeviceFormat", lResult, __FILE__, __LINE__);
        }

        //Kompatibel mit DeviceType?
        lResult = pD3DInterface->CheckDeviceType(sDXConfig.Direct3D.uiGraphicAdapter,
                                                 sDXConfig.Direct3D.D3DDevType,
                                                 sDXConfig.Direct3D.bWindowMode ? 
                                                     sD3DWindowsDisplayMode.Format
                                                     : sDXConfig.Direct3D.D3DDisplayMode.Format,
                                                 asD3DFormats[usFormat],
                                                 sDXConfig.Direct3D.bWindowMode);

        //Wenn es nicht mit dem DeviceType kompatibel ist, verwerfen und weitermachen
        if(lResult == D3DERR_NOTAVAILABLE)
            continue;

        //Fehler in der Funktion CheckDeviceType
        if(lResult == D3DERR_INVALIDCALL)
        {
            MessageBox(hConfigWnd,
                       "Ein Bildspeicherformat konnte nicht auf Kompatibilität mit dem Gerätetyp geprüft werden",
                        "FireEagle-DirectX-Konfiguration",
                        MB_OK | MB_ICONEXCLAMATION);

            FELogDXError("CheckDeviceType", lResult, __FILE__, __LINE__);
        }

        //Ist eine Konvertierung nötig
        if(sDXConfig.Direct3D.bWindowMode 
           && asD3DFormats[usFormat] != sD3DWindowsDisplayMode.Format)
        {
            lResult = pD3DInterface->CheckDeviceFormatConversion
                                         (sDXConfig.Direct3D.uiGraphicAdapter,
                                          sDXConfig.Direct3D.D3DDevType,
                                          sD3DWindowsDisplayMode.Format,
                                          asD3DFormats[usFormat]);

            //Wenn nicht konvertierbar, ignorieren und weiter
            if(lResult == D3DERR_NOTAVAILABLE)
                continue;

            //Wenn CheckDeviceFormatConversion fehlschlug
            if(lResult == D3DERR_INVALIDCALL)
            {
                MessageBox(hConfigWnd,
                           "Ein Bildspeicherformat konnte nicht auf Konvertierungsfähigkeit geprüft werden",
                           "FireEagle-DirectX-Konfiguration",
                           MB_OK | MB_ICONEXCLAMATION);

                FELogDXError("CheckDeviceFormatConversation", lResult, __FILE__, __LINE__);
            }
        }

        SendMessage(hBackBufferFormatComboBox, CB_ADDSTRING, 0, (long)acsFormatDesc[usFormat]);
    }

    return eFEOk;
}