2 registered members (Ayumi, 1 invisible),
584
guests, and 1
spider. |
Key:
Admin,
Global Mod,
Mod
|
|
|
Re: Rendern an dll leiten / void Render()
[Re: TWO]
#96076
10/30/06 09:34
10/30/06 09:34
|
Joined: Jul 2000
Posts: 27,986 Frankfurt
jcl
Chief Engineer
|
Chief Engineer
Joined: Jul 2000
Posts: 27,986
Frankfurt
|
Oje, da sehe ich gleich eine ganze Menge von Fehlern.
dll_open brauchen Sie nicht. Kopieren Sie Ihre DLL in den acknex_plugins ordner.
Ihre while-Schleife ist eine klassische Endlosschleife und laesst Ihrem PC ertauben. Setzen Sie Ihre Events nur einmal und nicht in einer Schleife. Ich weiss zwar nicht, was initSPI(); und closeSPI(); machen, vermute aber stark, dass sie keinesfalls in die main-Funktion gehoeren, sondern eher an den Anfang des ersten und an den Schluss des letzten Render-Event.
Die Render-Events dagegen duerfen Sie zwar in der Main-Funktion setzen, jedoch keinesfalls - so wie Sie's getan haben - dort aufrufen. Denn auch das fuehrt sicherlich zum Absturz. Und da es nur zwei Events gibt und nicht fuenf, muessen Sie in Ihrem Event selbst unterscheiden, welcher View gerade gerendert wird - fragen Sie dazu ev->render_view ab.
|
|
|
Re: Rendern an dll leiten / void Render()
[Re: jcl]
#96077
12/19/06 17:09
12/19/06 17:09
|
Joined: Aug 2006
Posts: 9 Willich
marcellus
OP
Newbie
|
OP
Newbie
Joined: Aug 2006
Posts: 9
Willich
|
So ich bin es mal wieder. Hatte Zeit mich mal diesem Problem zu widmen.
Ich habe das jetzt mal nur mit einem Kanal (View) ausprobiert. Doch nun habe ich das Problem, dass die Welt der Engine nicht in meinem "g_pd3dDevice" ist. In diesem Objekt müsste ein komplett gerenderter Frame inklusive BeginScene und EndScene sein.
Im WDL steht: -------------------------------
function main() { MAX_PARTICLES = 10000; if (curlevel==1){ level_load(welt);} else{ level_load(welt);} initDome(); wait(2); }
render_sky = initSPI(); render_entities = closeSPI();
------------------------------
In der dll steht: -----------
VOID SetupMatrices() { // For our world matrix, we will just leave it as the identity D3DXMATRIXA16 matWorld; D3DXMatrixRotationY( &matWorld, timeGetTime()/1000.0f ); g_pd3dDevice->SetTransform( D3DTS_WORLD, &matWorld );
// Set up our view matrix. A view matrix can be defined given an eye point, // a point to lookat, and a direction for which way is up. Here, we set the // eye five units back along the z-axis and up three units, look at the // origin, and define "up" to be in the y-direction. D3DXVECTOR3 vEyePt( 0.0f, 0.0f,-3.0f ); D3DXVECTOR3 vLookatPt( 0.0f, 0.0f, 0.0f ); D3DXVECTOR3 vUpVec( 0.0f, 1.0f, 0.0f ); D3DXMATRIXA16 matView; D3DXMatrixLookAtLH( &matView, &vEyePt, &vLookatPt, &vUpVec ); g_pd3dDevice->SetTransform( D3DTS_VIEW, &matView );
// For the projection matrix, we set up a perspective transform (which // transforms geometry from 3D view space to 2D viewport space, with // a perspective divide making objects smaller in the distance). To build // a perpsective transform, we need the field of view (1/4 pi is common), // the aspect ratio, and the near and far clipping planes (which define at // what distances geometry should be no longer be rendered). D3DXMATRIXA16 matProj; D3DXMatrixPerspectiveFovLH( &matProj, D3DX_PI/4, 1.0f, 1.0f, 100.0f ); g_pd3dDevice->SetTransform( D3DTS_PROJECTION, &matProj ); }
DLLFUNC void initDOME(void) { g_pd3dDevice = (LPDIRECT3DDEVICE9)draw_begin(); if (!g_pd3dDevice) return;
// Turn on the zbuffer g_pd3dDevice->SetRenderState( D3DRS_ZENABLE, TRUE );
// Turn on ambient lighting g_pd3dDevice->SetRenderState( D3DRS_AMBIENT, 0xffffffff );
// We need the projection matrix to exist in a nice form before creating the // dome object, so we call SetupMatrices() here. SetupMatrices();
if( !gDome ) { gDome = new SPIDX9Dome( g_pd3dDevice, 512, 512, 21, SPI_1_CHANNEL ); } }
DLLFUNC void initSPI(void){ SetupMatrices(); gDome->SPIBegin(); gDome->SPIPreRender(SPI_1C_FRONT); }
DLLFUNC void closeSPI(void){ gDome->SPIPostRender(); gDome->SPIEnd(); gDome->SPIFlush( SPI_1_CHANNEL, SPI_RENDER_NORMAL ); }
-------------
Die dll funktioniert, da ist kein Bug drin, wird auch alles aufgerufen und es existieren keine null-Objekte.
3D Gamesstudio startet auch anstandslos und ich erhalte einen blauen Bildschirm, wie in der Beispielapplikation der API. Das einzige was fehlt, ist die 3D Welt der Engine. Gibt es da nicht eine Code der die Renderfunktion aufruft bzw. abbildet.
SetupMatrices ist sehr wichtig, denn sie ist für die Berechnung der Verzerrung zuständig.
Schönen Gruß und frohe Weihnachten
Marcel
|
|
|
Re: Rendern an dll leiten / void Render()
[Re: jcl]
#96079
12/20/06 14:44
12/20/06 14:44
|
Joined: Aug 2006
Posts: 9 Willich
marcellus
OP
Newbie
|
OP
Newbie
Joined: Aug 2006
Posts: 9
Willich
|
Danke für die Antwort, jetzt wo Sie es sagen, werde ich die Klammern mal weg lassen. Ich muss zugeben, dass ich mit C/C++ und DirectX noch nie programmiert habe. Jedoch programmiere ich schon ca. 5 Jahre in Java. Und, wieso sollte man seinen Horizont nicht erweitern. Ich werde mich mal gründlich mit der Zeigerproblematik in C++ und mit den DirectX Objekten auseinandersetzen. Ich melde mich dann mal. wenn es funktioniert. Bis die Tage, Marcel
|
|
|
|