GoldFish Engine
Quite simple and lightweight game engine
Loading...
Searching...
No Matches
gf_draw.c
1#define GF_EXPOSE_DRAW_PLATFORM
2#define GF_EXPOSE_DRAW
3#define GF_EXPOSE_INPUT
4
5#include <gf_pre.h>
6
7/* External library */
8#include <gf_directx.h>
9
10/* Interface */
11#include <gf_draw_platform.h>
12
13/* Engine */
14#include <gf_draw_driver.h>
15#include <gf_log.h>
16#include <gf_draw.h>
17#include <gf_input.h>
18
19/* Standard */
20#include <string.h>
21#include <stdlib.h>
22
25
26LRESULT CALLBACK gf_draw_platform_proc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp) {
27 PAINTSTRUCT ps;
28 RECT rect;
29 gf_draw_t* draw = (gf_draw_t*)GetWindowLongPtr(hWnd, GWLP_USERDATA);
30 switch(msg) {
31 case WM_PAINT:
32 BeginPaint(hWnd, &ps);
33 EndPaint(hWnd, &ps);
34 break;
35 case WM_SIZE:
36 if(draw->platform != NULL) {
37 GetClientRect(hWnd, &rect);
38 draw->x = rect.left;
39 draw->y = rect.top;
40 draw->width = rect.right - rect.left;
41 draw->height = rect.bottom - rect.top;
42 gf_draw_reshape(draw);
43 }
44 break;
45 case WM_MOUSEMOVE:
46 if(draw->input != NULL) {
47 draw->input->mouse_x = LOWORD(lp);
48 draw->input->mouse_y = HIWORD(lp);
49 }
50 break;
51 case WM_LBUTTONDOWN:
52 case WM_LBUTTONUP:
53 if(draw->input != NULL) {
54 if(msg == WM_LBUTTONDOWN) {
55 SetCapture(hWnd);
57 } else {
59 ReleaseCapture();
60 }
61 }
62 break;
63 case WM_MBUTTONDOWN:
64 case WM_MBUTTONUP:
65 if(draw->input != NULL) {
66 if(msg == WM_MBUTTONDOWN) {
67 SetCapture(hWnd);
69 } else {
71 ReleaseCapture();
72 }
73 }
74 break;
75 case WM_RBUTTONDOWN:
76 case WM_RBUTTONUP:
77 if(draw->input != NULL) {
78 if(msg == WM_RBUTTONDOWN) {
79 SetCapture(hWnd);
81 } else {
83 ReleaseCapture();
84 }
85 }
86 break;
87 case WM_CLOSE:
88 draw->close = 1;
89 break;
90 case WM_DESTROY:
91 PostQuitMessage(0);
92 break;
93 default:
94 return DefWindowProc(hWnd, msg, wp, lp);
95 }
96 return 0;
97}
98
99int gf_draw_platform_has_extension(gf_draw_t* draw, const char* query) { return 0; }
100
102 MSG msg;
103 int ret = 0;
104 while(PeekMessage(&msg, draw->platform->window, 0, 0, PM_NOREMOVE)) {
105 if(GetMessage(&msg, draw->platform->window, 0, 0)) {
106 TranslateMessage(&msg);
107 DispatchMessage(&msg);
108 } else {
109 ret = 1;
110 break;
111 }
112 }
113 if(ret == 0) {
115 gf_draw_frame(draw);
117
118 SwapBuffers(draw->platform->dc);
119 }
120 return ret;
121}
122
124 WNDCLASSEX wc;
125 RECT rect;
126 DWORD style;
127 gf_draw_platform_t* platform = malloc(sizeof(*platform));
128 memset(platform, 0, sizeof(*platform));
129 platform->engine = engine;
130
131 platform->instance = (HINSTANCE)GetModuleHandle(NULL);
132 if(platform->instance == NULL) {
133 gf_log_function(engine, "Failed to get instance", "");
134 gf_draw_platform_destroy(platform);
135 return NULL;
136 }
137
138 wc.cbSize = sizeof(wc);
139 wc.style = CS_HREDRAW | CS_VREDRAW | CS_OWNDC;
140 wc.lpfnWndProc = gf_draw_platform_proc;
141 wc.cbClsExtra = 0;
142 wc.cbWndExtra = 0;
143 wc.hInstance = platform->instance;
144 wc.hIcon = LoadIcon(platform->instance, "GAME");
145 wc.hCursor = LoadCursor(NULL, IDC_ARROW);
146 wc.hbrBackground = NULL;
147 wc.lpszMenuName = NULL;
148 wc.lpszClassName = "goldfish";
149 wc.hIconSm = LoadIcon(platform->instance, "GAME");
150 if(!RegisterClassEx(&wc)) {
151 gf_log_function(engine, "Failed to register class", "");
152 gf_draw_platform_destroy(platform);
153 return NULL;
154 }
155
156 platform->window = CreateWindow("goldfish", draw->title, (WS_OVERLAPPEDWINDOW), draw->x, draw->y, draw->width, draw->height, NULL, 0, platform->instance, NULL);
157 if(platform->window == NULL) {
158 gf_log_function(engine, "Failed to create window", "");
159 gf_draw_platform_destroy(platform);
160 return NULL;
161 }
162
163 SetWindowLongPtr(platform->window, GWLP_USERDATA, (LONG_PTR)draw);
164
165 platform->dc = GetDC(platform->window);
166
167 SetRect(&rect, 0, 0, draw->width, draw->height);
168
169 style = (DWORD)GetWindowLongPtr(platform->window, GWL_STYLE);
170 AdjustWindowRect(&rect, style, FALSE);
171 SetWindowPos(platform->window, NULL, rect.left, rect.top, rect.right - rect.left, rect.bottom - rect.top, SWP_NOMOVE);
172
173 ShowWindow(platform->window, SW_NORMAL);
174 UpdateWindow(platform->window);
175
176 return platform;
177}
178
180 if(platform->dc != NULL) {
181 ReleaseDC(platform->window, platform->dc);
182 }
183 if(platform->window != NULL) {
184 DestroyWindow(platform->window);
185 }
186 gf_log_function(platform->engine, "Destroyed platform-dependent part of drawing driver", "");
187 free(platform);
188}
DirectX headers.
Drawing interface.
void gf_draw_frame(gf_draw_t *draw)
Draw frame (common part)
void gf_draw_reshape(gf_draw_t *draw)
Do stuffs required on resizing window.
Drawing driver.
void gf_draw_driver_before(gf_draw_t *draw)
Called before gf_draw_frame.
Definition gf_driver.c:61
void gf_draw_driver_after(gf_draw_t *draw)
Called after gf_draw_frame.
Definition gf_driver.c:71
Platform-dependent part of drawing driver.
void gf_draw_platform_destroy(gf_draw_platform_t *platform)
Destroy platform-dependent part of drawing driver.
Definition gf_draw.c:179
int gf_draw_platform_has_extension(gf_draw_t *draw, const char *query)
Check if renderer has extension.
Definition gf_draw.c:99
void gf_draw_platform_begin(void)
Initialize platform-dependent part of drawing driver.
Definition gf_draw.c:23
void gf_draw_platform_end(void)
Cleanup platform-dependent part of drawing driver.
Definition gf_draw.c:24
gf_draw_platform_t * gf_draw_platform_create(gf_engine_t *engine, gf_draw_t *draw)
Create platform-dependent part of drawing driver.
Definition gf_draw.c:123
int gf_draw_platform_step(gf_draw_t *draw)
Do platform-dependent step.
Definition gf_draw.c:101
Logger.
#define gf_log_function(engine, fmt,...)
Output log with line number and function name.
Definition gf_log.h:26
Required headers before anything.
#define GF_INPUT_MOUSE_MIDDLE_MASK
Mask for middle mouse button.
Definition input.h:34
#define GF_INPUT_MOUSE_LEFT_MASK
Mask for left mouse button.
Definition input.h:28
#define GF_INPUT_MOUSE_RIGHT_MASK
Mask for right mouse button.
Definition input.h:40
Platform-dependent part of drawing driver.
Drawing interface.
Definition draw.h:108
int y
Y coord of window.
Definition draw.h:108
gf_input_t * input
Input interface.
Definition draw.h:108
char title[128]
Window title.
Definition draw.h:108
int close
1 if it was requested to be closed, otherwise 0
Definition draw.h:108
gf_draw_platform_t * platform
Platform-dependent part of drawing driver.
Definition draw.h:108
int x
X coord of window.
Definition draw.h:108
int width
Width of window.
Definition draw.h:108
int height
Height of window.
Definition draw.h:108
Engine instance.
Definition core.h:46
int mouse_flag
Mouse flag.
Definition input.h:64
int mouse_y
Y coord of mouse.
Definition input.h:64
int mouse_x
X coord of mouse.
Definition input.h:64