Autor | Thema: Fehler bei meiner DLL | | 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.
|
| | 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
|
| | 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
|
|
|