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

Task-Manager

Alter Hase

  • »Task-Manager« ist der Autor dieses Themas

Beiträge: 1 087

Wohnort: am PC

Beruf: Student

  • Private Nachricht senden

31

07.11.2007, 21:01

ok die Funktion hab ich schon:

C-/C++-Quelltext

1
2
3
4
5
6
// ******************************************************************

// ReInitialisieren

tbResult tbDirect3D::tbReInit ()
{

}



dann muss ich wahrscheinlich das hier aufrufen:

C-/C++-Quelltext

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
// ******************************************************************

// Herunterfahren

tbResult tbDirect3D::Exit()
{
    m_bInitialized = FALSE;

    if(m_pD3DDevice)
    {
        // Alle Texturen zurücksetzen

        for(DWORD dwStage = 0; dwStage < m_Caps.MaxTextureBlendStages; dwStage++)
        {
            // Die Textur deaktivieren, damit ihr Referenzzähler verringert wird.

            // Andernfalls könnten Speicherlecks entstehen.

            m_pD3DDevice->SetTexture(dwStage, NULL);
        }

        // Vertex- und Index-Buffer zurücksetzen

        m_pD3DDevice->SetStreamSource(0, NULL, 0, 0);
        m_pD3DDevice->SetIndices(NULL);
    }

    // Schnittstellen freigeben

    TB_SAFE_RELEASE(m_pD3D);
    TB_SAFE_RELEASE(m_pD3DDevice);

    if(!m_bOwnWindow)
    {
        // Die Fensterklasse löschen

        UnregisterClass("TriBase Direct3D Window Class", tb_g_DLLHandle);
    }

    TB_INFO("Die Direct3D-Komponente wurde heruntergefahren.");

    return TB_OK;
}


dann rufe ich hier mit ein neues Fenster und ne neue Device auf:

C-/C++-Quelltext

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
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
// Die Initialisierungsmethode

tbResult tbDirect3D::Init(tbConfig* pConfig,
                          char* pcWindowTitle,
                          HWND hOwnWindow,      // = NULL

                          HICON hIcon)          // = NULL

{
    if(!hIcon) hIcon = LoadIcon(tb_g_DLLHandle, MAKEINTRESOURCE(TB_IDI_ICON1));

    HRESULT                 hResult;
    D3DPRESENT_PARAMETERS   PresentParams;
    WNDCLASSEX              WindowClass = {sizeof(WNDCLASSEX), CS_CLASSDC, WindowProc, 0, 0,
                                           tb_g_DLLHandle, hIcon, LoadCursor(NULL, MAKEINTRESOURCE(IDC_ARROW)),
                                           NULL, NULL, "TriBase Direct3D Window Class", NULL};


    // Parameter prüfen

    if(!pConfig) TB_ERROR_NULL_POINTER("pConfig", TB_ERROR);


    memset(m_abIsRS, 255, 210 * sizeof(BOOL));
    memset(m_abIsTSS, 255, 33 * sizeof(BOOL));
    memset(m_abIsSS, 255, 14 * sizeof(BOOL));

    m_abIsRS[0] = FALSE;
    m_abIsRS[1] = FALSE;
    m_abIsRS[2] = FALSE;
    m_abIsRS[3] = FALSE;
    m_abIsRS[4] = FALSE;
    m_abIsRS[5] = FALSE;
    m_abIsRS[6] = FALSE;
    m_abIsRS[10] = FALSE;
    m_abIsRS[11] = FALSE;
    m_abIsRS[12] = FALSE;
    m_abIsRS[13] = FALSE;
    m_abIsRS[17] = FALSE;
    m_abIsRS[18] = FALSE;
    m_abIsRS[21] = FALSE;
    m_abIsRS[30] = FALSE;
    m_abIsRS[31] = FALSE;
    m_abIsRS[32] = FALSE;
    m_abIsRS[33] = FALSE;
    m_abIsRS[39] = FALSE;
    m_abIsRS[40] = FALSE;
    m_abIsRS[41] = FALSE;
    m_abIsRS[42] = FALSE;
    m_abIsRS[43] = FALSE;
    m_abIsRS[44] = FALSE;
    m_abIsRS[45] = FALSE;
    m_abIsRS[46] = FALSE;
    m_abIsRS[49] = FALSE;
    m_abIsRS[50] = FALSE;
    m_abIsRS[51] = FALSE;
    for(DWORD dwRS = 61; dwRS <= 127; dwRS++) m_abIsRS[dwRS] = FALSE;
    m_abIsRS[144] = FALSE;
    m_abIsRS[149] = FALSE;
    m_abIsRS[150] = FALSE;
    m_abIsRS[153] = FALSE;
    m_abIsRS[164] = FALSE;
    m_abIsRS[169] = FALSE;
    m_abIsRS[177] = FALSE;
    m_abIsRS[196] = FALSE;
    m_abIsRS[197] = FALSE;
    
    m_abIsTSS[0] = FALSE;
    m_abIsTSS[12] = FALSE;
    m_abIsTSS[13] = FALSE;
    m_abIsTSS[14] = FALSE;
    m_abIsTSS[15] = FALSE;
    m_abIsTSS[16] = FALSE;
    m_abIsTSS[17] = FALSE;
    m_abIsTSS[18] = FALSE;
    m_abIsTSS[19] = FALSE;
    m_abIsTSS[20] = FALSE;
    m_abIsTSS[21] = FALSE;
    m_abIsTSS[25] = FALSE;
    m_abIsTSS[29] = FALSE;
    m_abIsTSS[30] = FALSE;
    m_abIsTSS[31] = FALSE;

    m_abIsSS[0] = FALSE;

    // Eintragen, ob der Benutzer sein eigenes Fenster hat oder nicht.

    // Wenn ja, das eigene Fenster eintragen.

    m_bOwnWindow = hOwnWindow != NULL;
    if(m_bOwnWindow) m_hWindow = hOwnWindow;

    TB_INFO("Die Direct3D-Komponente wird initialisiert...");

    // Muss ein Fenster erstellt werden?

    if(!tb_g_hWindow)
    {
        if(!m_bOwnWindow)
        {
            TB_INFO("Erstellen des Fensters...");
            
            // Die Fensterklasse registrieren

            if(!RegisterClassEx(&WindowClass))
            {
                // Fehler!

                TB_ERROR("Fehler beim Registrieren der Fensterklasse!", TB_ERROR);
            }

            int iWidth = pConfig->Direct3D.VideoMode.Width;
            int iHeight = pConfig->Direct3D.VideoMode.Height;
            RECT Rect;
            SetRect(&Rect, 0, 0, iWidth, iHeight);
            AdjustWindowRect(&Rect, WS_VISIBLE | WS_OVERLAPPEDWINDOW, FALSE);
            iWidth = Rect.right - Rect.left;
            iHeight = Rect.bottom - Rect.top;

            // Fenster erstellen und prüfen, ob es funktioniert hat

            m_hWindow = CreateWindow("TriBase Direct3D Window Class",
                                     pcWindowTitle,
                                     WS_VISIBLE | WS_OVERLAPPEDWINDOW,
                                     GetSystemMetrics(SM_CXSCREEN) / 2 - iWidth / 2,
                                     GetSystemMetrics(SM_CYSCREEN) / 2 - iHeight / 2,
                                     iWidth,
                                     iHeight,
                                     NULL,
                                     NULL,
                                     tb_g_DLLHandle,
                                     NULL);
            if(!m_hWindow)
            {
                // Fehler!

                TB_ERROR("Erstellung des Fensters ist fehlgeschlagen!", TB_ERROR);
            }
        }

        tb_g_hWindow = m_hWindow;
    }
    else m_hWindow = tb_g_hWindow;

    TB_INFO("Initialisierung von Direct3D...");

    // IDirect3D9-Schnittstelle erzeugen

    m_pD3D = Direct3DCreate9(D3D_SDK_VERSION);
    if(!m_pD3D)
    {
        // Fehler!

        TB_ERROR("Fehler beim Erstellen der IDirect3D9-Schnittstelle! DirectX 9 oder höher wird benötigt!", TB_ERROR);
    }

    // Präsentationsstruktur ausfüllen

    ZeroMemory(&PresentParams, sizeof(D3DPRESENT_PARAMETERS));
    PresentParams.BackBufferWidth               = pConfig->Direct3D.VideoMode.Width;
    PresentParams.BackBufferHeight              = pConfig->Direct3D.VideoMode.Height;
    PresentParams.BackBufferFormat              = pConfig->Direct3D.BackBufferFormat;
    PresentParams.BackBufferCount               = 1;
    PresentParams.MultiSampleType               = pConfig->Direct3D.MultiSamplingType;
    PresentParams.MultiSampleQuality            = pConfig->Direct3D.dwMultiSamplingQuality;
    PresentParams.SwapEffect                    = D3DSWAPEFFECT_DISCARD;
    PresentParams.hDeviceWindow                 = m_hWindow;
    PresentParams.Windowed                      = pConfig->Direct3D.bWindowed;
    PresentParams.EnableAutoDepthStencil        = TRUE;
    PresentParams.AutoDepthStencilFormat        = pConfig->Direct3D.ZStencilBufferFormat;
    PresentParams.Flags                         = pConfig->Direct3D.ZStencilBufferFormat != D3DFMT_D16_LOCKABLE ? D3DPRESENTFLAG_DISCARD_DEPTHSTENCIL : 0;
    PresentParams.FullScreen_RefreshRateInHz    = pConfig->Direct3D.bWindowed ? D3DPRESENT_RATE_DEFAULT : pConfig->Direct3D.VideoMode.RefreshRate;
    PresentParams.PresentationInterval          = pConfig->Direct3D.bVSync ? D3DPRESENT_INTERVAL_ONE : D3DPRESENT_INTERVAL_IMMEDIATE;

    // Und nun die Geräteschnittstelle generieren

    if(FAILED(hResult = m_pD3D->CreateDevice(pConfig->Direct3D.iAdapter,
                                             pConfig->Direct3D.DeviceType,
                                             m_hWindow,
                                             pConfig->Direct3D.dwFlags,
                                             &PresentParams,
                                             &m_pD3DDevice)))
    {
        // Fehler beim Generieren der Schnittstelle!

        TB_ERROR_DIRECTX("m_pD3D->CreateDevice", hResult, TB_ERROR);
    }

    // Parameter eintragen

    m_PresentParams = PresentParams;

    // Die Gerätefähigkeiten abfragen und den aktuellen Status speichern

    m_pD3DDevice->GetDeviceCaps(&m_Caps);
    Capture();

    // Cursor im Vollbildmodus ausblenden

    if(!pConfig->Direct3D.bWindowed) ShowCursor(FALSE);

    // Standardeinstellungen

    SetFVF(D3DFVF_XYZ | D3DFVF_NORMAL | D3DFVF_TEX1);
    SetRS(D3DRS_DITHERENABLE, TRUE);
    for(DWORD dwStage = 0; dwStage < m_Caps.MaxTextureBlendStages; dwStage++)
    {
        if(m_Caps.PrimitiveMiscCaps & D3DPTFILTERCAPS_MINFANISOTROPIC) SetSS(dwStage, D3DSAMP_MINFILTER, D3DTEXF_ANISOTROPIC);
        else SetSS(dwStage, D3DSAMP_MINFILTER, D3DTEXF_LINEAR);
        if(m_Caps.PrimitiveMiscCaps & D3DPTFILTERCAPS_MAGFANISOTROPIC) SetSS(dwStage, D3DSAMP_MAGFILTER, D3DTEXF_ANISOTROPIC);
        else SetSS(dwStage, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR);
        SetSS(dwStage, D3DSAMP_MIPFILTER, D3DTEXF_LINEAR);
        SetSS(dwStage, D3DSAMP_MAXANISOTROPY, m_Caps.MaxAnisotropy);
    }

    m_vScreenSize.x = (float)(PresentParams.BackBufferWidth);
    m_vScreenSize.y = (float)(PresentParams.BackBufferHeight);

    TB_INFO("Die Initialisierung der Direct3D-Komponente ist abgeschlossen!");

    m_PresentResult = TB_OK;
    m_bInitialized = TRUE;

    return TB_OK;
}


so weit fertig...
nur muss ich den beiden Parametern PresentParams.BackBufferWidth PresentParams.BackBufferHeight eigene Werte aus Breakanoid übergeben...

dazu könnte ich diese z.B. mit Integer werten aus Breakanoid festlegen
nur taucht das gleiche problem wie vorhin auf:

TB weiß ja nix von Breakanoid also kann ich keine Integer-werte aus Breakanoid übergeben -.-

mfg
BRWeiden
falls ichs i-wo vergessen hab:

mfg
Task-Manager

Rechtschreibfehler sind mein Eigentum und gewollt!

BlackSnake

Community-Fossil

Beiträge: 1 549

Beruf: Student

  • Private Nachricht senden

32

07.11.2007, 22:05

du hast da was falsch verstanden.
die reinit methode macht alles. sie fährt die device runter, und erstellt sie auch wieder. und sowas wie texturen löschen musste rauslassen. du willts ja legendlich die device neu haben und nicht die ganzen texturen löschen ;)
und d3d9 auch nicht beenden, nur die device.
die parameter übegibste mit hilfe von parametern.

bsp:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
tbResult tbDirect3D::ReInit(customConfigStruct _struct)
{
// Device schließen

...

// Fenster schließen

...

// Fenster neuerstellen

...

// Device neu erstellen, manuell

m_pD3D->CreateDevice(...)
}


du musst evtl die anderen sachen der "PresentParams" speichern. sowas wie multisampling etc...

EDIT:
evtl wäre es ratsam zuversuchen, eine kleine d3d anwendung zu schreiben, wo du keine engine benuzt, die dir die arbeit abnimmt dx zu initialisieren. wenn du das gemeistert hast, verstehste wahrscheinlich schneller wodrauf man achten musst. kannst dir natürlich auch ne kleine engine schreiben, die fürs fenster erstellen, dx initalisieren etc... verantwortlich ist. da lernt man gut, wodrauf man achten muss....

BlackSnake

Community-Fossil

Beiträge: 1 549

Beruf: Student

  • Private Nachricht senden

33

07.11.2007, 22:06

Zitat von »"Nox"«

-> Man muss alle Daten/Buffer, die was mit der Device zu tun haben, neu laden(Ganz wichtig)


also liege ich da falsch. wenn ich die device lösche, muss ich alles texturen neuladen und was noch alles geladen worden ist?
danke für antwort

rewb0rn

Supermoderator

Beiträge: 2 773

Wohnort: Berlin

Beruf: Indie Game Dev

  • Private Nachricht senden

34

07.11.2007, 23:58

ja, wenn du im laufenden betrieb die auflösung ändern willst, musst du die gesamte szene abspeichern, die anwendung (das device) neu initialisieren, und anschließend die szene mit allem was dazu gehört neu laden. das ist auch der grund, warum das bei vielen spielen gar nicht möglich ist.

BlackSnake

Community-Fossil

Beiträge: 1 549

Beruf: Student

  • Private Nachricht senden

35

08.11.2007, 08:28

danke,
da werde ich mir mal ein geschicktes konzept ausdenken, dass die engine die sachen selber abpeichert und selbsständig wieder zurücklädt...

Task-Manager

Alter Hase

  • »Task-Manager« ist der Autor dieses Themas

Beiträge: 1 087

Wohnort: am PC

Beruf: Student

  • Private Nachricht senden

36

08.11.2007, 10:40

hmmm...

Ist es möglich die Engin komplett runterzufahren und sie dan wiede komplett startet? allerdings mit anderen Konfigurationen, da z.B. ne andere Init aufgerufen wird?

weil mit postquitmessage(); wird ja gleich alles beendet...

und müsste man so für jede Auflösing auch noch ne eigene Initialisierung schreiben, die dan aufgerufen wird-.-

sozusagen :
ReInit_für_1024_800();
{
exit(); //runtefahren
Init_mit_1024_800 ();
}

das für alle auflösungen-.-

mfg
BRWeiden

mfg
BRWeiden
falls ichs i-wo vergessen hab:

mfg
Task-Manager

Rechtschreibfehler sind mein Eigentum und gewollt!

rewb0rn

Supermoderator

Beiträge: 2 773

Wohnort: Berlin

Beruf: Indie Game Dev

  • Private Nachricht senden

37

08.11.2007, 11:27

du musst doch nicht für jede auflösung eine andere init schreiben, dafür gibt es doch diese parameterstruktur, mit der das device erstellt wird, da steht die auflösung doch drin. das musste halt nur dementsprechend anpassen.

Task-Manager

Alter Hase

  • »Task-Manager« ist der Autor dieses Themas

Beiträge: 1 087

Wohnort: am PC

Beruf: Student

  • Private Nachricht senden

38

08.11.2007, 11:42

ja ich weiß...
nur wie kann ich diese ändern?
wenn ich in breakanoid einen Int erstelle, und dan z.B. higth und width damit gleichsetzen möchte (z.B. hight=int 2; width=int2;) dan krachts, weil TB ja nicht die Int aus Breakanoid kennt...

mfg
BRWeiden
falls ichs i-wo vergessen hab:

mfg
Task-Manager

Rechtschreibfehler sind mein Eigentum und gewollt!

BlackSnake

Community-Fossil

Beiträge: 1 549

Beruf: Student

  • Private Nachricht senden

39

08.11.2007, 16:04

ich weiß nicht, ob du da was falsch verstehst ;)
am anfang deines prog init du die engine mit tbDirect3D::Instance()->Init() oder so.

jetzt fügst du eindah dem renderer ne weitere funktion zu:
ReInit(hier kommen jetzt die parameter hin, zb height und width oder ne struktur)

diese funktion rufst du dann irgendwo in deinem prog auf:
tbDirect3D::Instance()->ReInit(256, 256)
als beispiel.
die methode würde jetzt die parameter benutzen für die neue auflösung...

BlackSnake

Community-Fossil

Beiträge: 1 549

Beruf: Student

  • Private Nachricht senden

40

08.11.2007, 16:15

wege dem wiederladen der resourcen. man könnte sich ein manager schreiben, der aufzeichnet was du mit der alten device alles geladen hast.
wenn du nun die funktion reinit aufrufst, dann greift die methode auf diesen manager zu und erstellt alles neu.

mein zweiter ansatz wäre, dass man in den manager beim erstellen nicht reinschreibt. wenn man jetzt zum beispiel eine texture erstellt, bekommt man ja die texture zurückgeliefert oder nen pointer, kommt aufs management an.
sobald man die texture/pointer hat, würde man ne funktion aufrufen, die die texture in den manager einträgt oder so:

C-/C++-Quelltext

1
2
1. MarkTextureAsReloadable(BlackTexture* _texture);
2. MarkObjectAsReloadable(BlackCoreObject* _object);

mit beiden funktionen ist es möglich die texture zu makieren...

Werbeanzeige