documentkk
DESCRIPTION
c++TRANSCRIPT
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 = 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;
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 fereastraUpdateWindow(hwnd); // reinoim fereastra
InitialVertexBuffer();
RenderingDirect3D();while (GetMessage(&msg, NULL, 0, 0)){
TranslateMessage(&msg);DispatchMessage(&msg);
}}
return msg.wParam;}