[win32, graphics, wip] working on multi surface, currently using top-level transparent window and moving them to cover the 'parent' window area...
This commit is contained in:
		
							parent
							
								
									c357da97f6
								
							
						
					
					
						commit
						ae7a60b942
					
				| 
						 | 
					@ -1,4 +1,4 @@
 | 
				
			||||||
 | 
					
 | 
				
			||||||
set INCLUDES=/I ..\..\src /I ..\..\src\util /I ..\..\src\platform /I ../../ext /I ../../ext/angle_headers
 | 
					set INCLUDES=/I ..\..\src /I ..\..\src\util /I ..\..\src\platform /I ../../ext /I ../../ext/angle_headers
 | 
				
			||||||
 | 
					
 | 
				
			||||||
cl /we4013 /Zi /Zc:preprocessor /std:c11 %INCLUDES% main.c /link /LIBPATH:../../bin milepost.dll.lib /out:../../bin/example_multi_surface.exe
 | 
					cl /we4013 /Zi /Zc:preprocessor /std:c11 %INCLUDES% main.c /link /MANIFEST:EMBED /MANIFESTINPUT:../../src/win32_manifest.xml /LIBPATH:../../bin milepost.dll.lib /out:../../bin/example_multi_surface.exe
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -23,7 +23,7 @@ int main()
 | 
				
			||||||
		return(-1);
 | 
							return(-1);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	mg_surface_swap_interval(surface1, 0);
 | 
						mg_surface_swap_interval(surface1, 0);
 | 
				
			||||||
 | 
					//*
 | 
				
			||||||
	mg_surface surface2 = mg_surface_create_for_window(window, MG_CANVAS);
 | 
						mg_surface surface2 = mg_surface_create_for_window(window, MG_CANVAS);
 | 
				
			||||||
	if(mg_surface_is_nil(surface2))
 | 
						if(mg_surface_is_nil(surface2))
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
| 
						 | 
					@ -31,21 +31,21 @@ int main()
 | 
				
			||||||
		return(-1);
 | 
							return(-1);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	mg_surface_swap_interval(surface2, 0);
 | 
						mg_surface_swap_interval(surface2, 0);
 | 
				
			||||||
 | 
					//*/
 | 
				
			||||||
	mg_canvas canvas1 = mg_canvas_create();
 | 
						mg_canvas canvas1 = mg_canvas_create();
 | 
				
			||||||
	if(mg_canvas_is_nil(canvas1))
 | 
						if(mg_canvas_is_nil(canvas1))
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		printf("Error: couldn't create canvas 1\n");
 | 
							printf("Error: couldn't create canvas 1\n");
 | 
				
			||||||
		return(-1);
 | 
							return(-1);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					//*
 | 
				
			||||||
	mg_canvas canvas2 = mg_canvas_create();
 | 
						mg_canvas canvas2 = mg_canvas_create();
 | 
				
			||||||
	if(mg_canvas_is_nil(canvas2))
 | 
						if(mg_canvas_is_nil(canvas2))
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		printf("Error: couldn't create canvas 2\n");
 | 
							printf("Error: couldn't create canvas 2\n");
 | 
				
			||||||
		return(-1);
 | 
							return(-1);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					//*/
 | 
				
			||||||
	// start app
 | 
						// start app
 | 
				
			||||||
	mp_window_bring_to_front(window);
 | 
						mp_window_bring_to_front(window);
 | 
				
			||||||
	mp_window_focus(window);
 | 
						mp_window_focus(window);
 | 
				
			||||||
| 
						 | 
					@ -73,19 +73,26 @@ int main()
 | 
				
			||||||
		mg_surface_prepare(surface1);
 | 
							mg_surface_prepare(surface1);
 | 
				
			||||||
		mg_canvas_set_current(canvas1);
 | 
							mg_canvas_set_current(canvas1);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								mg_set_color_rgba(0, 0, 0.5, 0.5);
 | 
				
			||||||
 | 
								mg_clear();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			mg_set_color_rgba(1, 0, 0, 1);
 | 
								mg_set_color_rgba(1, 0, 0, 1);
 | 
				
			||||||
			mg_rectangle_fill(100, 100, 300, 150);
 | 
								mg_rectangle_fill(100, 100, 300, 150);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		mg_render(surface1, canvas1);
 | 
							mg_render(surface1, canvas1);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//*
 | 
				
			||||||
		mg_surface_prepare(surface2);
 | 
							mg_surface_prepare(surface2);
 | 
				
			||||||
		mg_canvas_set_current(canvas2);
 | 
							mg_canvas_set_current(canvas2);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								mg_set_color_rgba(0, 0, 0, 0);
 | 
				
			||||||
 | 
								mg_clear();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			mg_set_color_rgba(0, 0, 1, 1);
 | 
								mg_set_color_rgba(0, 0, 1, 1);
 | 
				
			||||||
			mg_rectangle_fill(300, 300, 300, 200);
 | 
								mg_rectangle_fill(300, 300, 300, 200);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		mg_render(surface2, canvas2);
 | 
							mg_render(surface2, canvas2);
 | 
				
			||||||
 | 
					//*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		mg_surface_present(surface1);
 | 
							mg_surface_present(surface1);
 | 
				
			||||||
		mg_surface_present(surface2);
 | 
							mg_surface_present(surface2);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -149,6 +149,7 @@ void mg_wgl_surface_prepare(mg_surface_data* interface)
 | 
				
			||||||
void mg_wgl_surface_present(mg_surface_data* interface)
 | 
					void mg_wgl_surface_present(mg_surface_data* interface)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	mg_wgl_surface* surface = (mg_wgl_surface*)interface;
 | 
						mg_wgl_surface* surface = (mg_wgl_surface*)interface;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	SwapBuffers(surface->hDC);
 | 
						SwapBuffers(surface->hDC);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -223,7 +224,12 @@ mg_surface_data* mg_wgl_surface_create_for_window(mp_window window)
 | 
				
			||||||
				WGL_SUPPORT_OPENGL_ARB, GL_TRUE,
 | 
									WGL_SUPPORT_OPENGL_ARB, GL_TRUE,
 | 
				
			||||||
				WGL_DOUBLE_BUFFER_ARB, GL_TRUE,
 | 
									WGL_DOUBLE_BUFFER_ARB, GL_TRUE,
 | 
				
			||||||
				WGL_PIXEL_TYPE_ARB, WGL_TYPE_RGBA_ARB,
 | 
									WGL_PIXEL_TYPE_ARB, WGL_TYPE_RGBA_ARB,
 | 
				
			||||||
 | 
									WGL_TRANSPARENT_ARB, TRUE,
 | 
				
			||||||
				WGL_COLOR_BITS_ARB, 32,
 | 
									WGL_COLOR_BITS_ARB, 32,
 | 
				
			||||||
 | 
									WGL_RED_BITS_ARB, 8,
 | 
				
			||||||
 | 
									WGL_GREEN_BITS_ARB, 8,
 | 
				
			||||||
 | 
									WGL_BLUE_BITS_ARB, 8,
 | 
				
			||||||
 | 
									WGL_ALPHA_BITS_ARB, 8,
 | 
				
			||||||
				WGL_DEPTH_BITS_ARB, 24,
 | 
									WGL_DEPTH_BITS_ARB, 24,
 | 
				
			||||||
				WGL_STENCIL_BITS_ARB, 8,
 | 
									WGL_STENCIL_BITS_ARB, 8,
 | 
				
			||||||
				0};
 | 
									0};
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -7,6 +7,7 @@
 | 
				
			||||||
*
 | 
					*
 | 
				
			||||||
*****************************************************************/
 | 
					*****************************************************************/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include<dwmapi.h>
 | 
				
			||||||
#include"mp_app.c"
 | 
					#include"mp_app.c"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void mp_init_keys()
 | 
					void mp_init_keys()
 | 
				
			||||||
| 
						 | 
					@ -245,6 +246,38 @@ static void process_wheel_event(mp_window_data* window, f32 x, f32 y)
 | 
				
			||||||
	mp_queue_event(&event);
 | 
						mp_queue_event(&event);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static void win32_update_child_layers(mp_window_data* window)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						RECT clientRect;
 | 
				
			||||||
 | 
						GetClientRect(window->win32.hWnd, &clientRect);
 | 
				
			||||||
 | 
						POINT point = {0};
 | 
				
			||||||
 | 
						ClientToScreen(window->win32.hWnd, &point);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						int w = clientRect.right - clientRect.left;
 | 
				
			||||||
 | 
						int h = clientRect.bottom - clientRect.top;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						HWND insertAfter = window->win32.hWnd;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						for_list(&window->win32.layers, layer, mp_layer, listElt)
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							mp_rect clipped = {0};
 | 
				
			||||||
 | 
							clipped.x = Clamp(layer->frame.x, 0, w);
 | 
				
			||||||
 | 
							clipped.y = Clamp(layer->frame.y, 0, h);
 | 
				
			||||||
 | 
							clipped.w = Clamp(layer->frame.w, 0, w - layer->frame.x);
 | 
				
			||||||
 | 
							clipped.h = Clamp(layer->frame.h, 0, h - layer->frame.y);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							SetWindowPos(layer->hWnd,
 | 
				
			||||||
 | 
							             insertAfter,
 | 
				
			||||||
 | 
							             point.x + clipped.x,
 | 
				
			||||||
 | 
							             point.y + clipped.y,
 | 
				
			||||||
 | 
							             clipped.w,
 | 
				
			||||||
 | 
							             clipped.h,
 | 
				
			||||||
 | 
							             SWP_NOACTIVATE|SWP_NOOWNERZORDER);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							insertAfter = layer->hWnd;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
LRESULT WinProc(HWND windowHandle, UINT message, WPARAM wParam, LPARAM lParam)
 | 
					LRESULT WinProc(HWND windowHandle, UINT message, WPARAM wParam, LPARAM lParam)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	LRESULT result = 0;
 | 
						LRESULT result = 0;
 | 
				
			||||||
| 
						 | 
					@ -290,8 +323,10 @@ LRESULT WinProc(HWND windowHandle, UINT message, WPARAM wParam, LPARAM lParam)
 | 
				
			||||||
			mp_event event = {0};
 | 
								mp_event event = {0};
 | 
				
			||||||
			event.window = mp_window_handle_from_ptr(mpWindow);
 | 
								event.window = mp_window_handle_from_ptr(mpWindow);
 | 
				
			||||||
			event.type = MP_EVENT_WINDOW_RESIZE;
 | 
								event.type = MP_EVENT_WINDOW_RESIZE;
 | 
				
			||||||
			event.frame.rect = (mp_rect){rect->bottom, rect->left, rect->top - rect->bottom, rect->right - rect->left};
 | 
								event.frame.rect = (mp_rect){rect->left, rect->bottom, rect->bottom - rect->top, rect->right - rect->left};
 | 
				
			||||||
			mp_queue_event(&event);
 | 
								mp_queue_event(&event);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								win32_update_child_layers(mpWindow);
 | 
				
			||||||
		} break;
 | 
							} break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		case WM_MOVING:
 | 
							case WM_MOVING:
 | 
				
			||||||
| 
						 | 
					@ -303,8 +338,10 @@ LRESULT WinProc(HWND windowHandle, UINT message, WPARAM wParam, LPARAM lParam)
 | 
				
			||||||
			mp_event event = {0};
 | 
								mp_event event = {0};
 | 
				
			||||||
			event.window = mp_window_handle_from_ptr(mpWindow);
 | 
								event.window = mp_window_handle_from_ptr(mpWindow);
 | 
				
			||||||
			event.type = MP_EVENT_WINDOW_MOVE;
 | 
								event.type = MP_EVENT_WINDOW_MOVE;
 | 
				
			||||||
			event.frame.rect = (mp_rect){rect->bottom, rect->left, rect->top - rect->bottom, rect->right - rect->left};
 | 
								event.frame.rect = (mp_rect){rect->left, rect->bottom, rect->bottom - rect->top, rect->right - rect->left};
 | 
				
			||||||
			mp_queue_event(&event);
 | 
								mp_queue_event(&event);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								win32_update_child_layers(mpWindow);
 | 
				
			||||||
		} break;
 | 
							} break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		case WM_SETFOCUS:
 | 
							case WM_SETFOCUS:
 | 
				
			||||||
| 
						 | 
					@ -566,6 +603,7 @@ mp_window mp_window_create(mp_rect rect, const char* title, mp_window_style styl
 | 
				
			||||||
	quit:;
 | 
						quit:;
 | 
				
			||||||
	mp_window_data* window = mp_window_alloc();
 | 
						mp_window_data* window = mp_window_alloc();
 | 
				
			||||||
	window->win32.hWnd = windowHandle;
 | 
						window->win32.hWnd = windowHandle;
 | 
				
			||||||
 | 
						window->win32.layers = (list_info){0};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	SetPropW(windowHandle, L"MilePost", window);
 | 
						SetPropW(windowHandle, L"MilePost", window);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -992,16 +1030,37 @@ void mg_surface_init_for_window(mg_surface_data* surface, mp_window_data* window
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	RECT parentRect;
 | 
						RECT parentRect;
 | 
				
			||||||
	GetClientRect(window->win32.hWnd, &parentRect);
 | 
						GetClientRect(window->win32.hWnd, &parentRect);
 | 
				
			||||||
 | 
						POINT point = {0};
 | 
				
			||||||
 | 
						ClientToScreen(window->win32.hWnd, &point);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	int width = parentRect.right - parentRect.left;
 | 
						int width = parentRect.right - parentRect.left;
 | 
				
			||||||
	int height = parentRect.bottom - parentRect.top;
 | 
						int height = parentRect.bottom - parentRect.top;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	surface->layer.hWnd = CreateWindow("layer_window_class", "layer",
 | 
						surface->layer.hWnd = CreateWindow("layer_window_class", "layer",
 | 
				
			||||||
	                            WS_CHILD | WS_VISIBLE,
 | 
						                                     WS_POPUP | WS_VISIBLE,
 | 
				
			||||||
	                            0, 0, width, height,
 | 
						                                     point.x, point.y, width, height,
 | 
				
			||||||
	                                     window->win32.hWnd,
 | 
						                                     window->win32.hWnd,
 | 
				
			||||||
	                                     0,
 | 
						                                     0,
 | 
				
			||||||
	                                     layerWindowClass.hInstance,
 | 
						                                     layerWindowClass.hInstance,
 | 
				
			||||||
	                                     0);
 | 
						                                     0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						HRGN region = CreateRectRgn(0, 0, -1, -1);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						DWM_BLURBEHIND bb = {0};
 | 
				
			||||||
 | 
						bb.dwFlags = DWM_BB_ENABLE | DWM_BB_BLURREGION;
 | 
				
			||||||
 | 
						bb.hRgnBlur = region;
 | 
				
			||||||
 | 
						bb.fEnable = TRUE;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						HRESULT res = DwmEnableBlurBehindWindow(surface->layer.hWnd, &bb);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						DeleteObject(region);
 | 
				
			||||||
 | 
						if(res != S_OK)
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							log_error("couldn't enable blur behind\n");
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						surface->layer.frame = (mp_rect){0, 0, width, height};
 | 
				
			||||||
 | 
						list_append(&window->win32.layers, &surface->layer.listElt);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void mg_surface_init_remote(mg_surface_data* surface, u32 width, u32 height)
 | 
					void mg_surface_init_remote(mg_surface_data* surface, u32 width, u32 height)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -20,10 +20,13 @@
 | 
				
			||||||
typedef struct win32_window_data
 | 
					typedef struct win32_window_data
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	HWND hWnd;
 | 
						HWND hWnd;
 | 
				
			||||||
 | 
						list_info layers;
 | 
				
			||||||
} win32_window_data;
 | 
					} win32_window_data;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
typedef struct mp_layer
 | 
					typedef struct mp_layer
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
						list_elt listElt;
 | 
				
			||||||
 | 
						mp_rect frame;
 | 
				
			||||||
	HWND hWnd;
 | 
						HWND hWnd;
 | 
				
			||||||
} mp_layer;
 | 
					} mp_layer;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,5 +1,11 @@
 | 
				
			||||||
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
 | 
					<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
 | 
				
			||||||
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
 | 
					<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
 | 
				
			||||||
 | 
					<compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">
 | 
				
			||||||
 | 
					    <application>
 | 
				
			||||||
 | 
					      <!-- Windows 10 GUID -->
 | 
				
			||||||
 | 
					      <supportedOS Id="{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}" />
 | 
				
			||||||
 | 
					    </application>
 | 
				
			||||||
 | 
					</compatibility>
 | 
				
			||||||
<assemblyIdentity
 | 
					<assemblyIdentity
 | 
				
			||||||
    version="0.0.0.1"
 | 
					    version="0.0.0.1"
 | 
				
			||||||
    processorArchitecture="*"
 | 
					    processorArchitecture="*"
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue