Documente Academic
Documente Profesional
Documente Cultură
Labor 2
Labor 2
Laborator Nr.2
la
Grafica pe calculator
Chisinau, 2017
Conditii:
De desenat Litera “N” in DirectX.
PROGRAM:
#include <windows.h>
#include <tchar.h>
#include "d3d9.h"
#pragma comment(lib, "d3d9.lib")
#pragma comment(lib, "d3dx9.lib")
HWND hwnd;
IDirect3D9* pDirect3D = NULL;
IDirect3DDevice9* pDirect3DDevice = NULL;
struct CUSTOMVERTEX
{
float x, y, z, rhv;
DWORD color;
};
#define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZRHW|D3DFVF_DIFFUSE)
point2D punt_c[30] = {
//Punctul control pentru prima bezier
{ -2.4f, 0.0f },
{ -2.74f, -1.8f },
{ -0.85f, 0.5f },
{ -1.f, 3.f },
int fc = 0;
struct point3D
{
float x, y, z;
};
point3D pb[2000];
int NV = 150;
void MyBezier()
{
for (int i = 0; i < 4 * nr_bezier; i = i + 4)
{
pb[fc].x = punt_c[i].x;
pb[fc].y = punt_c[i].y;
pb[fc].z = 0.0;
t = 0.0f;
for (int j = fc + 1; j < NV; j++)
{
t += tstep;
pb[j].x = ((a[0] * t + a[1]) * t + a[2]) * t + a[3];
pb[j].y = ((b[0] * t + b[1]) * t + b[2]) * t + b[3];
pb[j].z = 1.0;
}
fc = fc + 150 + 1;
NV = fc + 150;
}
}
HRESULT InitialDirect3D()
{
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, hwnd,
D3DCREATE_HARDWARE_VERTEXPROCESSING,
&Direct3DParameter, &pDirect3DDevice)))
return E_FAIL;
return S_OK;
}
HRESULT InitialVertexBuffer()
{
CUSTOMVERTEX Vertexes[2000];
MyBezier();
if (FAILED(pDirect3DDevice->CreateVertexBuffer(sizeof Vertexes, 0,
D3DFVF_CUSTOMVERTEX, D3DPOOL_DEFAULT,
&pVertexBuffer, NULL)))
return E_FAIL;
return S_OK;
}
HRESULT RenderingDirect3D()
{
if (pDirect3DDevice == NULL)
return E_FAIL;
pDirect3DDevice->Clear(0, NULL, D3DCLEAR_TARGET,
D3DCOLOR_XRGB(0, 0, 255), 1.f, 0);
pDirect3DDevice->BeginScene();
pDirect3DDevice->SetStreamSource(0, pVertexBuffer, 0,
sizeof(CUSTOMVERTEX));
pDirect3DDevice->SetFVF(D3DFVF_CUSTOMVERTEX);
pDirect3DDevice->DrawPrimitive(D3DPT_LINESTRIP, 0, NV - 151);
pDirect3DDevice->EndScene();
return S_OK;
}
void DeleteDirect3D()
{
if (pDirect3DDevice)
pDirect3DDevice->Release();
if (pDirect3D)
pDirect3D->Release();
}
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.lpszMenuName = NULL;
windowsclass.lpszClassName = _T("WINDOWSCLASS");
windowsclass.hIconSm = LoadIcon(NULL, IDI_APPLICATION);
if (!RegisterClassEx(&windowsclass))
return 0;
if (!(hwnd = CreateWindowEx(
NULL,
_T("WINDOWSCLASS"),
_T("Litere N in DirectX"),
WS_OVERLAPPEDWINDOW | WS_VISIBLE,
100, 50,
// CW_USEDEFAULT, 0,
1000, 800,
// CW_USEDEFAULT, 0,
NULL,
NULL,
hinstance,
NULL)))
return 0;
MSG msg;
ZeroMemory(&msg, sizeof msg);
if (SUCCEEDED(InitialDirect3D()))
{
if (SUCCEEDED(InitialVertexBuffer()))
{
ShowWindow(hwnd, SW_SHOWDEFAULT); // desenam fereastra
UpdateWindow(hwnd); // reinoim fereastra
}
return msg.wParam;
}
Rezultatul Final: