Trebao bi malu pomoc, uglavnom imam iscrtavanje trokuta i sad bi htio da se okrece oko svoje osi (po x osi),
pokusavam na sve moguce nacine, ali ne radi, pa me zanima u cemu grijesim?
main.cpp
#include "stdafx.h"
#include "directX9.h"
int WIDTH = 1024;
int HEIGHT = 768;
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow)
{
HWND hwnd;
WNDCLASS wndclass;
MSG msg;
wndclass.style = CS_HREDRAW | CS_VREDRAW;
wndclass.lpfnWndProc = WndProc;
wndclass.cbClsExtra = 0;
wndclass.cbWndExtra = 0;
wndclass.hInstance = hInstance;
wndclass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
wndclass.hCursor = LoadCursor(NULL, IDC_ARROW);
wndclass.hbrBackground = (HBRUSH) GetStockObject(WHITE_BRUSH);
wndclass.lpszMenuName = NULL;
wndclass.lpszClassName = L"Experimental Game Project";
if (!RegisterClass(&wndclass))
{
return 0;
}
hwnd = CreateWindow(L"Experimental Game Project",
L"Experimental Game Project",
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,
CW_USEDEFAULT,
WIDTH,
HEIGHT,
NULL,
NULL,
hInstance,
NULL);
DX_init(hwnd); /* >>>> Initialize DirectX */
ShowWindow(hwnd, iCmdShow);
UpdateWindow(hwnd);
while(true)
{
while(PeekMessage(&msg,NULL,0,0,PM_REMOVE))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
if(msg.message == WM_QUIT) break;
DX_render(); /* >>>> DirectX render */
}
return msg.wParam;
}
LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
HDC hdc;
PAINTSTRUCT ps;
RECT rect;
switch (message)
{
case WM_PAINT:
hdc = BeginPaint(hwnd, &ps);
GetClientRect(hwnd, &rect);
EndPaint(hwnd, &ps);
break;
case WM_DESTROY:
DX_clean(); /* >>>> DirectX cleanup */
PostQuitMessage(0);
break;
default:
return DefWindowProc(hwnd, message, wParam, lParam);
}
}
DirectX.cpp
#include "stdafx.h"
#include <d3d9.h>
#include <d3d9types.h>
#include <d3d9caps.h>
#include "directX9.h"
#include <d3dx9.h>
#pragma comment (lib,"d3d9.lib")
#pragma comment (lib,"d3dx9.lib");
#define CUSTOMFVF (D3DFVF_XYZRHW | D3DFVF_DIFFUSE)
LPDIRECT3D9 d3d;
LPDIRECT3DDEVICE9 d3ddev;
LPDIRECT3DVERTEXBUFFER9 v_buffer;
D3DXMATRIX matrixRotate;
void DX_init (void);
void DX_render (void);
void DX_clean (void);
struct customVertex
{
float x,y,z,rhw;
DWORD color;
};
void DX_init (HWND hWnd)
{
customVertex vertices [] =
{
{ 480.0f, 150.0f, 0.5f, 1.0f, D3DCOLOR_XRGB(0, 0, 255), },
{ 680.0f, 500.0f, 0.5f, 1.0f, D3DCOLOR_XRGB(0, 0, 255), },
{ 280.0f, 500.0f, 0.5f, 1.0f, D3DCOLOR_XRGB(0, 0, 255), },
};
d3d = Direct3DCreate9(D3D_SDK_VERSION);
D3DPRESENT_PARAMETERS d3dpp;
VOID * pVoid;
ZeroMemory(&d3dpp,sizeof(d3dpp));
d3dpp.Windowed = true;
d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
d3dpp.hDeviceWindow = hWnd;
d3d->CreateDevice(D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL,hWnd,D3DCREATE_SOFTWARE_VERTEXPROCESSING,&d3dpp,&d3ddev);
d3ddev->CreateVertexBuffer(3*sizeof(customVertex),0,CUSTOMFVF,D3DPOOL_MANAGED,&v_buffer,NULL);
v_buffer->Lock(0,0,(void**)&pVoid,0);
memcpy(pVoid,vertices,sizeof(vertices));
v_buffer->Unlock();
}
void DX_render (void)
{
IDirect3DSurface9 * backBuffer = NULL;
static float index = 0.0f; index +=0.5f;
d3ddev->Clear(0,NULL,D3DCLEAR_TARGET,D3DCOLOR_XRGB(0,0,0),1.0f,0);
d3ddev->BeginScene();
d3ddev->SetFVF(CUSTOMFVF);
d3ddev->DrawPrimitive(D3DPT_TRIANGLELIST,0,1);
d3ddev->SetStreamSource(0,v_buffer,0,sizeof(customVertex));
D3DXMatrixRotationX(&matrixRotate,index);
d3ddev->SetTransform(D3DTS_WORLD ,&matrixRotate);
d3ddev->EndScene();
d3ddev->Present(NULL,NULL,NULL,NULL);
}
void DX_clean (void)
{
v_buffer->Release();
d3d->Release();
d3ddev->Release();
}