Hi,
I am writing a school project of mine, drawing different circuits transfer function (voltage transfer and phase). I wrote my code in C++ msvc Win32 native app with D3D9 and it works just fine. Only problem is, somehow rendering misses every second line, actually not missing but barely drawing it, and it's very frustrating. What could be the problem?
[attachment=21163:d3d9.png]
void render(void)
{
D3DXMATRIX world, scale, translate, center;
D3DXMATRIX view;
D3DXMATRIX final;
H transfer;
LPVOID lpVertices;
DWORD vertexCount;
VERTEX vertex;
double xScale, yScale;
double marginsWidthH, marginsWidthV;
// ha nem létezik az áramkör
if (lpcirc == NULL)
return;
// elkérjük a transzfer karakterisztikát
transfer = lpcirc->getH();
// ha üres
if (transfer.count == 0)
return;
// margó szélessége egységre nézve
marginsWidthH = BODE_WINDOW_MARGIN / (WindowWidth / 2.0f);
marginsWidthV = BODE_WINDOW_MARGIN / (WindowHeight / 2.0f);
// Identitás mátrix mindenre
D3DXMatrixIdentity(&world);
D3DXMatrixIdentity(&scale);
D3DXMatrixIdentity(¢er);
D3DXMatrixIdentity(&translate);
// Identitás mátrix a nézetre
D3DXMatrixIdentity(&view);
/// =========================================
/// Pár adat, amit el?re ki kell számolni
/// =========================================
// min, max frekvenciakitev?
double pwMin = transfer.fs[0].pw;
double pwMax = transfer.fs[transfer.count - 1].pw;
// min, max átvitel
double fsMin = 10.0 * log(ABS2(transfer.minFs.Zu2_u1));
double fsMax = 10.0 * log(ABS2(transfer.maxFs.Zu2_u1));
// min, max fázis
double phMin = ARG(transfer.minPh.Zu2_u1);
double phMax = ARG(transfer.maxPh.Zu2_u1);
/// =========================================
/// Transzferkarakterisztika
/// =========================================
// egységre leskálázva, margó beleszámít
xScale = (1.0 - marginsWidthH) / (pwMax - pwMin);
// abszolútérték skálája egységre nézve
yScale = (1.0 - marginsWidthV) / (fsMax - fsMin);
// töröljük a képerny?t
lpd3dDevice->Clear(0, NULL, D3DCLEAR_TARGET, 0xFFDDDDDD, 1.0f, 0);
// kezd?dhet a rajzolás
lpd3dDevice->BeginScene();
// betoljuk a függvényt az origóba
D3DXMatrixTranslation(¢er, (float) -pwMin, (float) -fsMax, 0.0);
// megskálázzuk, hogy a diagramunk elférjen az ablakban
D3DXMatrixScaling(&scale, 2.0f * (float) xScale, 2.0f * (float) yScale, 1.0f);
// eltoljuk a függvényt a -1.0-ba x tengelyen (ablak bal széle) + margó
// y tengelyen 1.0 (ablak teteje ) - margó
D3DXMatrixTranslation(&translate, -1.0f + (float) marginsWidthH, 1.0f - (float) marginsWidthV, 0.0f);
// ered? mátrix
final = world * center * scale * translate;
// transzformációk beállítása
lpd3dDevice->SetTransform(D3DTS_WORLD, &final);
lpd3dDevice->SetTransform(D3DTS_VIEW, &view);
/// =========================================
/// Transzferkarakterisztika rajzolása
/// =========================================
// elkérjük a vertex buffert
lpd3dVertexBuffer->Lock(0, BODE_VERTEXBUFFER_SIZE, (LPVOID*) &lpVertices, 0);
// egyel?re nincs pont
vertexCount = 0;
// végigmegyünk az összes ponton az átviteli függvényben
for (int i = 0; i < transfer.count; i++)
{
vertex.color = 0x66000000;
vertex.x = (float) transfer.fs[i].pw;
vertex.y = (float) (10.0 * log(ABS2(transfer.fs[i].Zu2_u1)));
vertex.z = 1.0f;
// bemásoljuk a videómemóriába
memcpy(((VERTEX*) lpVertices + vertexCount), &vertex, sizeof(VERTEX));
// egyel több pont a halmazban
vertexCount++;
}
// feloldjuk a videómemóriát
lpd3dVertexBuffer->Unlock();
lpd3dDevice->SetStreamSource(0, lpd3dVertexBuffer, 0, sizeof(VERTEX));
lpd3dDevice->SetFVF(BODE_D3DFVF);
lpd3dDevice->DrawPrimitive(D3DPT_LINESTRIP, 0, vertexCount - 1);
/// =========================================
/// Transzferkarakterisztika VÉGE
/// =========================================
// Identitás mátrix mindenre
D3DXMatrixIdentity(&world);
D3DXMatrixIdentity(&scale);
D3DXMatrixIdentity(¢er);
D3DXMatrixIdentity(&translate);
// Identitás mátrix a nézetre
D3DXMatrixIdentity(&view);
/// =========================================
/// Fázismenet
/// =========================================
// egységre leskálázva, margó beleszámít
xScale = (1.0 - marginsWidthH) / (pwMax - pwMin);
// abszolútérték skálája egységre nézve
yScale = (1.0 - marginsWidthV) / (phMax - phMin);
// betoljuk a függvényt az origóba
D3DXMatrixTranslation(¢er, (float) -pwMin, (float) -phMax, 0.0f);
// megskálázzuk, hogy a diagramunk elférjen az ablakban
D3DXMatrixScaling(&scale, 2.0f * (float) xScale, 2.0f * (float) yScale, 1.0f);
// eltoljuk a függvényt a -1.0-ba x tengelyen (ablak bal széle) + margó
// y tengelyen 1.0 (ablak teteje ) - margó
D3DXMatrixTranslation(&translate, -1.0f + (float) marginsWidthH, 1.0f - (float) marginsWidthV, 0.0f);
// ered? mátrix
final = world * center * scale * translate;
// transzformációk beállítása
lpd3dDevice->SetTransform(D3DTS_WORLD, &final);
lpd3dDevice->SetTransform(D3DTS_VIEW, &view);
/// =========================================
/// Fázismenet rajzolása
/// =========================================
// elkérjük a vertex buffert
lpd3dVertexBuffer->Lock(0, BODE_VERTEXBUFFER_SIZE, (LPVOID*) &lpVertices, 0);
// egyel?re nincs pont
vertexCount = 0;
// végigmegyünk az összes ponton az átviteli függvényben
for (int i = 0; i < transfer.count; i++)
{
vertex.color = 0xFFFF0000;
vertex.x = (float) transfer.fs[i].pw;
vertex.y = (float) ARG(transfer.fs[i].Zu2_u1);
vertex.z = 1.0f;
// bemásoljuk a videómemóriába
memcpy(((VERTEX*) lpVertices + vertexCount), &vertex, sizeof(VERTEX));
// egyel több pont a halmazban
vertexCount++;
}
// feloldjuk a videómemóriát
lpd3dVertexBuffer->Unlock();
lpd3dDevice->SetStreamSource(0, lpd3dVertexBuffer, 0, sizeof(VERTEX));
lpd3dDevice->SetFVF(BODE_D3DFVF);
lpd3dDevice->DrawPrimitive(D3DPT_LINESTRIP, 0, vertexCount - 1);
/// =========================================
/// Fázismenet VÉGE
/// =========================================
// vége a rajzolásnak
lpd3dDevice->EndScene();
// mutassa meg az eredményt
lpd3dDevice->Present(NULL, NULL, NULL, NULL);
}