Allgemeine Fragen zur PROFAN Programmierung

Views (Heute): 249187 (10623)

| Suchen
| Zurück zur Übersicht

Autor | Thema: Fehler bei meiner DLL
Marcel Pursche
| Datum:10.02.02 16:17 (mp05@metropolis.de) |
Hallo, beim Entwickeln der Fast3D.dll ist leider ein Problem aufgetretten. Wenn ich die Funktion zum Rendern aufrufe kommt die Fehlermeldung: "Exception EInvalidOp im Modul PROFAN.EXE bei 0001A16D. Fehler bei Gleitkomma-Operation." Benutze ich die DLL mit C++ kommt ein ähnlicher Fehler. Weiß jemand wo das Problem sein könnte? P.S: Falls jemand den Code benötigt würde ich ihn per E-Mail zusenden.
Sven Schmidts
| Datum:11.02.02 10:10 (schmidts@flat2serv.de) |
Sorry, aber ... welche DLL mit welchen Aufrufparametern wird wie angesteuert? Du hast Dich etwas pauschal ausgedrückt, wie "Auto geht nicht, warum" ;) Mfg. Sven Schmidts
Marcel Pursche
| Datum: 11.02.02 20:40 (mp05@metropolis.de) |
Hallo, das Problem tritt bei dieser Funktion auf(Nach dem zweiten Aufruf): EXPORT HRESULT Fast3DRenderScene(BOOL bWireframe) { HRESULT hr; // Testet den kooperativen Level um zu sehen ob das rendern möglich ist if( FAILED( hr = m_pd3dDevice->TestCooperativeLevel() ) ) { // Wenn das Device verloren ging, soll nicht gerendert werden bis es wieder da ist if( D3DERR_DEVICELOST == hr ) return S_OK; // überprüfe ob die Größe des Device verändert werden muß if( D3DERR_DEVICENOTRESET == hr ) { // Falls wir ein Fenster haben soll das Desktop-Format für den Back-Buffer // verwendet werden if( m_bWindowed ) { D3DAdapterInfo* pAdapterInfo = &m_Adapters[m_dwAdapter]; m_pD3D->GetAdapterDisplayMode( m_dwAdapter, &pAdapterInfo->d3ddmDesktop ); m_d3dpp.BackBufferFormat = pAdapterInfo->d3ddmDesktop.Format; } if(SUCCEEDED(hr = Resize3DEnvironment())) return -1; } return hr; } // Sichtbereich und Z-Buffer löschen m_pd3dDevice->Clear(0, NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, D3DCOLOR_XRGB(0,0,0), 1.0f, 0L); // Scene beginnen if (SUCCEEDED(m_pd3dDevice->BeginScene())) { // Texture-Mode setzen m_pd3dDevice->SetTextureStageState( 0, D3DTSS_COLOROP, D3DTOP_DISABLE ); m_pd3dDevice->SetTextureStageState( 0, D3DTSS_ALPHAOP, D3DTOP_DISABLE ); m_pd3dDevice->SetTextureStageState( 0, D3DTSS_ADDRESSU, D3DTADDRESS_CLAMP); m_pd3dDevice->SetTextureStageState( 0, D3DTSS_ADDRESSV, D3DTADDRESS_CLAMP); m_pd3dDevice->SetTextureStageState( 0, D3DTSS_ADDRESSW, D3DTADDRESS_CLAMP ); // Texture setzen m_pd3dDevice->SetTexture(0, tex); // tex ist die Textur die zum Testen geladen wurde m_pd3dDevice->SetTextureStageState( 0, D3DTSS_COLORARG1, D3DTA_TEXTURE ); m_pd3dDevice->SetTextureStageState( 0, D3DTSS_COLOROP, D3DTOP_SELECTARG1 ); // Schleife for (int iDraw = 0; iDraw < dwNumObject; iDraw++) { // Material setzen m_pd3dDevice->SetMaterial(&m_pObjectList[iDraw]->mtrl); // lokale Matrix für Objekt m_pd3dDevice->SetTransform(D3DTS_WORLD, &m_pObjectList[iDraw]->matLocal); m_pd3dDevice->SetStreamSource(0, m_pObjectList[iDraw]->m_pVB, sizeof(CUSTOMVERTEX)); m_pd3dDevice->SetVertexShader(D3DFVF_CUSTOMVERTEX); m_pd3dDevice->SetIndices(m_pObjectList[iDraw]->m_pIB, 0); if (bWireframe) { m_pd3dDevice->DrawIndexedPrimitive(D3DPT_LINELIST, 0, m_pObjectList[iDraw]->dwNumVertices, 0, m_pObjectList[iDraw]->dwNumPrimitives); } else { m_pd3dDevice->DrawIndexedPrimitive(D3DPT_TRIANGLELIST, 0, m_pObjectList[iDraw]->dwNumVertices, 0, m_pObjectList[iDraw]->dwNumPrimitives); } } m_pd3dDevice->EndScene(); m_pd3dDevice->Present(NULL, NULL, NULL, NULL); return 0; } return -1; } Und hier die benutzte Funktion: HRESULT Resize3DEnvironment() { HRESULT hr; // Reset das Device if( FAILED( hr = m_pd3dDevice->Reset( &m_d3dpp ) ) ) return hr; // Holle das RenderTarget Surface-Desc LPDIRECT3DSURFACE8 pBackBuffer; m_pd3dDevice->GetBackBuffer( 0, D3DBACKBUFFER_TYPE_MONO, &pBackBuffer ); pBackBuffer->GetDesc( &m_d3dsdBackBuffer ); pBackBuffer->Release(); return S_OK; } Ich vermute, dass das Problem durch diese Funktion entsteht: EXPORT HRESULT Fast3DVertexBuffer( CUSTOMVERTEX* m_pVertex, DWORD dwVertex, float x, float y, float z, float nx, float ny, float nz, float tu, float tv) { // Überprüfen ob m_pVertex auf etwas zeigt if (m_pVertex == NULL) {return -1;} // Stuktur füllen m_pVertex[dwVertex].x = x; m_pVertex[dwVertex].y = y; m_pVertex[dwVertex].z = z; m_pVertex[dwVertex].nx = nx; m_pVertex[dwVertex].ny = ny; m_pVertex[dwVertex].nz = nz; m_pVertex[dwVertex].tu = tu; m_pVertex[dwVertex].tv = tv; return 0; } Das sind die benutzen Strukturen und Makros: #ifdef __cplusplus #define EXPORT extern "C" __declspec (stdcall) #else #define EXPORT __declspec (stdcall) #endif //Strukturen struct CUSTOMVERTEX { float x, y, z; float nx, ny, nz; float tu, tv; }; #define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZ|D3DFVF_NORMAL|D3DFVF_TEX1) typedef struct _F3DOBJECT { LPDIRECT3DVERTEXBUFFER8 m_pVB; DWORD dwNumVertices; LPDIRECT3DINDEXBUFFER8 m_pIB; DWORD dwNumPrimitives; D3DMATERIAL8 mtrl; D3DXVECTOR3 vLoc; D3DXVECTOR3 vRot; D3DMATRIX matLocal; LPDIRECT3DTEXTURE8 textures[7]; DWORD dwTextureFlag [20][7]; DWORD dwTextureWert [20][7]; }F3DOBJECT; typedef F3DOBJECT* LPF3DOBJECT; MfG Marcel

| Zurück zur Übersicht