You are on page 1of 5

Lectia 4 Bezier 2D

#include <windows.h>
#include <tchar.h>
#include "d3d9.h"
LPDIRECT3D9 pDirect3D = NULL;
LPDIRECT3DDEVICE9 pDirect3DDevice = NULL;
LPDIRECT3DVERTEXBUFFER9 pVertexBuffer = NULL; //
struct CUSTOMVERTEX
{
float x, y, z,
rhv;
DWORD color;
};
#define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZRHW | D3DFVF_DIFFUSE)
class p
{
public:
int x, y;
};
/*
float p[4][2] = { { 1., 3. },
{ 15., 39. },
{ 189., 22. },
{ 179., 150. },
};
*/
float p[4][2] = { { 179., 150. },
{ 160., 200. },
{ 189., 215. },
{ 100., 150. },
};
int N = 20;
float t;
float dt = 1. / (N-1);
float a[4], b[4];
float a[4] = {
-p[0][0] + 3.f*p[1][0] - 3.f*p[2][0] + p[3][0],
3.f*p[0][0] - 6.f*p[1][0] + 3.f*p[2][0],
-3.f*p[0][0] + 3.f*p[1][0],
p[0][0]
};
float b[4] = {
-p[0][1] + 3.f*p[1][1] - 3.f*p[2][1] + p[3][1],
3.f*p[0][1] - 6.f*p[1][1] + 3.f*p[2][1],
-3.f*p[0][1] + 3.f*p[1][1],
p[0][1]
};

HRESULT InitialDirect3D(HWND hvnd)


{
if ((pDirect3D = Direct3DCreate9(D3D_SDK_VERSION)) == NULL)
return E_FAIL;
D3DDISPLAYMODE Display;
if (FAILED(pDirect3D->
GetAdapterDisplayMode(D3DADAPTER_DEFAULT, &Display)))
return E_FAIL;
D3DPRESENT_PARAMETERS Direct3DParameter;
ZeroMemory(&Direct3DParameter, sizeof Direct3DParameter);
Direct3DParameter.Windowed = TRUE;
Direct3DParameter.SwapEffect = D3DSWAPEFFECT_DISCARD;
Direct3DParameter.BackBufferFormat = Display.Format;
if (FAILED(pDirect3D->
CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hvnd,
D3DCREATE_HARDWARE_VERTEXPROCESSING,
&Direct3DParameter, &pDirect3DDevice)))
return E_FAIL;
/*
if(FAILED(pDirect3D->
CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hvnd,
D3DCREATE_SOFTWARE_VERTEXPROCESSING,
&Direct3DParameter, &pDirect3DDevice)))
return E_FAIL;
*/
return S_OK;
}
HRESULT InitialVertexBuffer()
{
CUSTOMVERTEX *Vertexes = new CUSTOMVERTEX[N];
int i;
for (i = 0; i < N; i++)
{
Vertexes[i].z = 0.5f;
Vertexes[i].rhv = 1.0f;
Vertexes[i].color = 0X00ff00ff;
}
Vertexes[0].x =
Vertexes[0].y =
Vertexes[N-1].x
Vertexes[N-1].y

p[0][0];
p[0][1];
= p[3][0];
= p[3][1];

/*
a[0]
a[1]
a[2]
a[3]

=
=
=
=

-p[0][0] + 3.f*p[1][0] - 3.f*p[2][0] + p[3][0];


3.f*p[0][0] - 6.f*p[1][0] + 3.f*p[2][0];
-3.f*p[0][0] + 3.f*p[1][0];
p[0][0];

b[0]
b[1]
b[2]
b[3]

=
=
=
=

-p[0][1] + 3.f*p[1][1] - 3.f*p[2][1] + p[3][1];


3.f*p[0][1] - 6.f*p[1][1] + 3.f*p[2][1];
-3.f*p[0][1] + 3.f*p[1][1];
p[0][1];

*/
t = 0.f;

for (i = 1; i < N-1; i++)


{
t += dt;
Vertexes[i].x = ((a[0] * t + a[1])*t + a[2])*t + a[3];
Vertexes[i].y = ((b[0] * t + b[1])*t + b[2])*t + b[3];
}
if (FAILED(pDirect3DDevice>CreateVertexBuffer(N*sizeof(CUSTOMVERTEX),
0, D3DFVF_CUSTOMVERTEX, D3DPOOL_DEFAULT, &pVertexBuffer,
NULL)))
return E_FAIL;
void *pVB = NULL;
if (FAILED(pVertexBuffer->Lock(0, N*sizeof(CUSTOMVERTEX),
(void**)&pVB, 0)))
return E_FAIL;
memcpy(pVB, Vertexes, N*sizeof(CUSTOMVERTEX));
pVertexBuffer->Unlock();
return S_OK;
}
HRESULT RenderingDirect3D()
{
if (pDirect3DDevice == NULL)
return E_FAIL;
pDirect3DDevice->Clear(0, NULL, D3DCLEAR_TARGET,
D3DCOLOR_XRGB(255, 255, 0), 1.f, 0);
pDirect3DDevice->BeginScene();
// Aici va urma desenarea scenei
pDirect3DDevice->SetStreamSource(0, pVertexBuffer, 0,
sizeof(CUSTOMVERTEX));
pDirect3DDevice->SetFVF(D3DFVF_CUSTOMVERTEX);
//

pDirect3DDevice->DrawPrimitive(D3DPT_TRIANGLELIST, 0, 2);
/*
int i;
for (i = 0; i < N - 1; i++)
pDirect3DDevice->DrawPrimitive(D3DPT_LINELIST, i,

1);
*/
pDirect3DDevice->DrawPrimitive(D3DPT_LINESTRIP, 0, N-1);
pDirect3DDevice->EndScene();
pDirect3DDevice->Present(NULL, NULL, NULL, NULL);
return S_OK;
}

LRESULT CALLBACK MainWinProc(HWND hwnd,


UINT msg,

WPARAM wparam,
LPARAM lparam)
{
switch (msg)
{
//
case WM_PAINT:
RenderingDirect3D();
ValidateRect(hwnd, NULL);
break;
//
case WM_DESTROY:
PostQuitMessage(0);
return 0;
}
return DefWindowProc(hwnd, msg, wparam, lparam);
}

int WINAPI WinMain(


//
int WINAPI _main(
HINSTANCE hinstance,
HINSTANCE hprevinstance,
LPSTR lpCmdLine,
int nCmdShow)
{
WNDCLASSEX windowsclass;
windowsclass.cbSize = sizeof(WNDCLASSEX);
windowsclass.style = CS_DBLCLKS | CS_OWNDC | CS_HREDRAW |
CS_VREDRAW;
windowsclass.lpfnWndProc = MainWinProc;
windowsclass.cbClsExtra = 0;
windowsclass.cbWndExtra = 0;
windowsclass.hInstance = hinstance;
windowsclass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
windowsclass.hCursor = LoadCursor(NULL, IDC_ARROW);
windowsclass.hbrBackground = (HBRUSH)GetStockObject(GRAY_BRUSH);
//windowsclass.hbrBackground =
(HBRUSH)GetStockObject(WHITE_BRUSH);
windowsclass.lpszMenuName = NULL;
windowsclass.lpszClassName = _T("WINDOWSCLASS");
//windowsclass.lpszClassName = L"WINDOWSCLASS";
windowsclass.hIconSm = LoadIcon(NULL, IDI_APPLICATION);
if (!RegisterClassEx(&windowsclass))
return 0;
HWND hwnd;
if (!(hwnd = CreateWindowEx(
NULL,
_T("WINDOWSCLASS"),
//L"WINDOWSCLASS",
_T("Basic window for DirectX"),
//L"Basic window for DirectX",
WS_OVERLAPPEDWINDOW | WS_VISIBLE,
300, 150,
//
CW_USEDEFAULT, 0,
500, 400,
//
CW_USEDEFAULT, 0,

NULL,
NULL,
hinstance,
NULL)))
return 0;
MSG msg;
ZeroMemory(&msg, sizeof msg);
if (SUCCEEDED(InitialDirect3D(hwnd)))
{
ShowWindow(hwnd, SW_SHOWDEFAULT); // desenam fereastra
UpdateWindow(hwnd); // reinoim fereastra
InitialVertexBuffer();
RenderingDirect3D();
while (GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
return msg.wParam;
}

You might also like