SHOW:
|
|
- or go back to the newest paste.
1 | // ConsoleApplication3.cpp : Defines the entry point for the console application. | |
2 | // | |
3 | ||
4 | #include "stdafx.h" | |
5 | ||
6 | // Includes | |
7 | #include <time.h> | |
8 | #include <d3d9.h> | |
9 | #include <d3dx9.h> | |
10 | #include <dwmapi.h> | |
11 | ||
12 | #include <iostream> | |
13 | ||
14 | // Import libraries to link with | |
15 | #pragma comment(lib, "d3d9.lib") | |
16 | #pragma comment(lib, "d3dx9.lib") | |
17 | #pragma comment(lib, "dwmapi.lib") | |
18 | ||
19 | #define ARGB_TRANS 0x00000000 // 100% alpha | |
20 | #define SPRITE_SIZE 128 | |
21 | ||
22 | - | #define TEXTURE_PATH L"C:\\Users\\Simon\\Documents\\Visual Studio 2013\\Projects\\ConsoleApplication3\\x64\\Release\\circle.png" |
22 | + | #define TEXTURE_PATH L"circle.png" |
23 | ||
24 | // +---------+ | |
25 | // | Globals | | |
26 | // +---------+ | |
27 | WCHAR *g_wcpAppName = L"D3DCursor"; | |
28 | INT g_iWidth = 800; | |
29 | INT g_iHeight = 600; | |
30 | MARGINS g_mgDWMMargins = { -1, -1, -1, -1 }; | |
31 | IDirect3D9Ex *g_pD3D = NULL; | |
32 | IDirect3DDevice9Ex *g_pD3DDevice = NULL; | |
33 | IDirect3DVertexBuffer9 *g_pVB = NULL; | |
34 | LPD3DXSPRITE g_sprite = NULL; | |
35 | LPDIRECT3DTEXTURE9 g_circle = NULL; | |
36 | ||
37 | HWND hWnd = NULL; | |
38 | ||
39 | D3DXMATRIX Identity; | |
40 | ||
41 | BOOL wait = false; | |
42 | ||
43 | INT last_x = 0; | |
44 | INT last_y = 0; | |
45 | INT x = 0; | |
46 | INT y = 0; | |
47 | ||
48 | ||
49 | // +--------------+ | |
50 | // | D3DStartup() | | |
51 | // +--------------+----------------------------------+ | |
52 | // | Initialise Direct3D and perform once only tasks | | |
53 | // +-------------------------------------------------+ | |
54 | HRESULT D3DStartup(HWND hWnd) | |
55 | { | |
56 | BOOL bCompOk = FALSE; // Is composition enabled? | |
57 | D3DPRESENT_PARAMETERS pp; // Presentation prefs | |
58 | DWORD msqAAQuality = 0; // Non-maskable quality | |
59 | ||
60 | D3DXMATRIX Ortho2D; | |
61 | ||
62 | // Make sure that DWM composition is enabled | |
63 | DwmIsCompositionEnabled(&bCompOk); | |
64 | if (!bCompOk) return E_FAIL; | |
65 | ||
66 | // Create a Direct3D object | |
67 | if (FAILED(Direct3DCreate9Ex(D3D_SDK_VERSION, &g_pD3D))) return E_FAIL; | |
68 | ||
69 | // Setup presentation parameters | |
70 | ZeroMemory(&pp, sizeof(pp)); | |
71 | pp.Windowed = TRUE; | |
72 | pp.SwapEffect = D3DSWAPEFFECT_DISCARD; // Required for multi sampling | |
73 | pp.BackBufferFormat = D3DFMT_A8R8G8B8; // Back buffer format with alpha channel | |
74 | pp.PresentationInterval = D3DPRESENT_INTERVAL_IMMEDIATE; //Disables vsync | |
75 | ||
76 | // No AA | |
77 | pp.MultiSampleType = D3DMULTISAMPLE_NONE; | |
78 | ||
79 | // Create a Direct3D device object | |
80 | if (FAILED(g_pD3D->CreateDeviceEx(D3DADAPTER_DEFAULT, | |
81 | D3DDEVTYPE_HAL, | |
82 | hWnd, | |
83 | D3DCREATE_HARDWARE_VERTEXPROCESSING, | |
84 | &pp, | |
85 | NULL, | |
86 | &g_pD3DDevice | |
87 | ))) return E_FAIL; | |
88 | ||
89 | // Configure the device state | |
90 | ||
91 | g_pD3DDevice->SetRenderState(D3DRS_LIGHTING, FALSE); | |
92 | ||
93 | g_pD3DDevice->SetRenderState(D3DRS_ALPHABLENDENABLE, TRUE); | |
94 | ||
95 | return S_OK; | |
96 | } | |
97 | ||
98 | // +---------------+ | |
99 | // | D3DShutdown() | | |
100 | // +---------------+----------------------+ | |
101 | // | Release all created Direct3D objects | | |
102 | // +--------------------------------------+ | |
103 | VOID D3DShutdown(VOID) | |
104 | { | |
105 | if (g_pVB != NULL) g_pVB->Release(); | |
106 | if (g_pD3DDevice != NULL) g_pD3DDevice->Release(); | |
107 | if (g_pD3D != NULL) g_pD3D->Release(); | |
108 | } | |
109 | ||
110 | // +--------------+ | |
111 | // | CreateCube() | | |
112 | // +--------------+------------------------------+ | |
113 | // | Populates a vertex buffer with a cube shape | | |
114 | // +---------------------------------------------+ | |
115 | HRESULT InitSprites(VOID) | |
116 | { | |
117 | if (SUCCEEDED(D3DXCreateSprite(g_pD3DDevice, &g_sprite))) | |
118 | { | |
119 | // created OK | |
120 | } | |
121 | ||
122 | D3DXCreateTextureFromFile(g_pD3DDevice, TEXTURE_PATH, &g_circle); | |
123 | ||
124 | return S_OK; | |
125 | } | |
126 | ||
127 | // +----------+ | |
128 | // | Render() | | |
129 | // +----------+-------------------------+ | |
130 | // | Renders a scene to the back buffer | | |
131 | // +------------------------------------+ | |
132 | VOID Render(VOID) | |
133 | { | |
134 | if (!wait) | |
135 | { | |
136 | ||
137 | // Sanity check | |
138 | if (g_pD3DDevice == NULL) return; | |
139 | if (g_sprite == NULL) return; | |
140 | ||
141 | D3DRECT clearRect; | |
142 | clearRect.x1 = last_x - (SPRITE_SIZE / 2); | |
143 | clearRect.x2 = last_x + (SPRITE_SIZE / 2); | |
144 | clearRect.y1 = last_y - (SPRITE_SIZE / 2); | |
145 | clearRect.y2 = last_y + (SPRITE_SIZE / 2); | |
146 | ||
147 | g_pD3DDevice->Clear(1, &clearRect, D3DCLEAR_TARGET, ARGB_TRANS, 1.0f, 0); | |
148 | ||
149 | // Render scene | |
150 | if (SUCCEEDED(g_pD3DDevice->BeginScene())) | |
151 | { | |
152 | D3DXMATRIX mat; | |
153 | if (SUCCEEDED(g_sprite->Begin(D3DXSPRITE_ALPHABLEND))) | |
154 | { | |
155 | D3DXMatrixTranslation(&mat, x+0.0f-(SPRITE_SIZE/2), y+0.0f-(SPRITE_SIZE/2), 0.0f); | |
156 | g_sprite->SetTransform(&mat); | |
157 | g_sprite->Draw(g_circle, NULL, NULL, NULL, 0xff000000); | |
158 | g_sprite->End(); | |
159 | } | |
160 | ||
161 | g_pD3DDevice->EndScene(); | |
162 | } | |
163 | ||
164 | // Update display | |
165 | g_pD3DDevice->PresentEx(NULL, NULL, NULL, NULL, NULL); | |
166 | } | |
167 | } | |
168 | ||
169 | // +--------------+ | |
170 | // | WindowProc() | | |
171 | // +--------------+------------------+ | |
172 | // | The main window message handler | | |
173 | // +---------------------------------+ | |
174 | LRESULT WINAPI WindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) | |
175 | { | |
176 | return DefWindowProc(hWnd, uMsg, wParam, lParam); | |
177 | } | |
178 | ||
179 | // +-----------+ | |
180 | // | WinMain() | | |
181 | // +-----------+---------+ | |
182 | // | Program entry point | | |
183 | // +---------------------+ | |
184 | INT WINAPI StartD3DCursorWindow(HINSTANCE hInstance, HWND hParent, int x, int y, int width, int height, bool topmost) | |
185 | { | |
186 | MSG uMsg; | |
187 | WNDCLASSEX wc = { sizeof(WNDCLASSEX), // cbSize | |
188 | NULL, // style | |
189 | WindowProc, // lpfnWndProc | |
190 | NULL, // cbClsExtra | |
191 | NULL, // cbWndExtra | |
192 | hInstance, // hInstance | |
193 | LoadIcon(NULL, IDI_APPLICATION), // hIcon | |
194 | LoadCursor(NULL, IDC_ARROW), // hCursor | |
195 | NULL, // hbrBackground | |
196 | NULL, // lpszMenuName | |
197 | g_wcpAppName, // lpszClassName | |
198 | LoadIcon(NULL, IDI_APPLICATION) };// hIconSm | |
199 | ||
200 | RegisterClassEx(&wc); | |
201 | ||
202 | g_iWidth = width; | |
203 | g_iHeight = height; | |
204 | ||
205 | hWnd = CreateWindowEx(WS_EX_COMPOSITED | WS_EX_LAYERED | WS_EX_TRANSPARENT, // dwExStyle | |
206 | g_wcpAppName, // lpClassName | |
207 | g_wcpAppName, // lpWindowName | |
208 | WS_POPUP, // dwStyle | |
209 | x, y, // x, y | |
210 | g_iWidth, g_iHeight, // nWidth, nHeight | |
211 | hParent, // hWndParent | |
212 | NULL, // hMenu | |
213 | hInstance, // hInstance | |
214 | NULL); // lpParam | |
215 | ||
216 | // Extend glass to cover whole window | |
217 | DwmExtendFrameIntoClientArea(hWnd, &g_mgDWMMargins); | |
218 | ||
219 | // Initialise Direct3D | |
220 | if (SUCCEEDED(D3DStartup(hWnd))) | |
221 | { | |
222 | if (SUCCEEDED(InitSprites())) | |
223 | { | |
224 | // Show the window | |
225 | ShowWindow(hWnd, SW_SHOWDEFAULT); | |
226 | UpdateWindow(hWnd); | |
227 | } | |
228 | } | |
229 | ||
230 | // Shutdown Direct3D | |
231 | ||
232 | // Exit application | |
233 | return 0; | |
234 | } | |
235 | ||
236 | int _tmain(int argc, _TCHAR* argv[]) | |
237 | { | |
238 | StartD3DCursorWindow(GetModuleHandle(NULL),0,0,0,2560,1440,true); | |
239 | ||
240 | while (true) | |
241 | { | |
242 | LPPOINT point = new POINT; | |
243 | GetCursorPos(point); | |
244 | last_x = x; | |
245 | last_y = y; | |
246 | x = point->x; | |
247 | y = point->y; | |
248 | Render(); | |
249 | Sleep(10); | |
250 | } | |
251 | ||
252 | return 0; | |
253 | } |