documentkk

6
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],

Upload: elly

Post on 22-Jan-2016

216 views

Category:

Documents


0 download

DESCRIPTION

c++

TRANSCRIPT

Page 1: Documentkk

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]

};

Page 2: Documentkk

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 = p[0][0];Vertexes[0].y = p[0][1];Vertexes[N-1].x = p[3][0];Vertexes[N-1].y = p[3][1];

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

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

*/t = 0.f;

Page 3: Documentkk

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,

Page 4: Documentkk

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,

Page 5: Documentkk

// CW_USEDEFAULT, 0, NULL,NULL,hinstance,NULL)))return 0;

MSG msg;ZeroMemory(&msg, sizeof msg);

if (SUCCEEDED(InitialDirect3D(hwnd))){

ShowWindow(hwnd, SW_SHOWDEFAULT); // desenam fereastraUpdateWindow(hwnd); // reinoim fereastra

InitialVertexBuffer();

RenderingDirect3D();while (GetMessage(&msg, NULL, 0, 0)){

TranslateMessage(&msg);DispatchMessage(&msg);

}}

return msg.wParam;}