reorganizing milepost directory tree into app, graphics, platfrom, ui, util
This commit is contained in:
		
							parent
							
								
									11dde9fea3
								
							
						
					
					
						commit
						bfadcad7f3
					
				|  | @ -10,7 +10,7 @@ | ||||||
| #define __OSX_APP_H_ | #define __OSX_APP_H_ | ||||||
| 
 | 
 | ||||||
| #include"mp_app.h" | #include"mp_app.h" | ||||||
| #include"graphics.h" | #include"graphics/graphics.h" | ||||||
| 
 | 
 | ||||||
| #ifdef __OBJC__ | #ifdef __OBJC__ | ||||||
| 	#import<Cocoa/Cocoa.h> | 	#import<Cocoa/Cocoa.h> | ||||||
|  | @ -18,7 +18,7 @@ | ||||||
| #include"macro_helpers.h" | #include"macro_helpers.h" | ||||||
| #include"platform_log.h" | #include"platform_log.h" | ||||||
| #include"platform_clock.h" | #include"platform_clock.h" | ||||||
| #include"graphics_surface.h" | #include"graphics/graphics_surface.h" | ||||||
| 
 | 
 | ||||||
| #include"mp_app.c" | #include"mp_app.c" | ||||||
| 
 | 
 | ||||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							|  | @ -1,28 +1,28 @@ | ||||||
| <?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"> | <compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1"> | ||||||
|     <application> |     <application> | ||||||
|       <!-- Windows 10 GUID --> |       <!-- Windows 10 GUID --> | ||||||
|       <supportedOS Id="{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}" /> |       <supportedOS Id="{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}" /> | ||||||
|     </application> |     </application> | ||||||
| </compatibility> | </compatibility> | ||||||
| <assemblyIdentity | <assemblyIdentity | ||||||
|     version="0.0.0.1" |     version="0.0.0.1" | ||||||
|     processorArchitecture="*" |     processorArchitecture="*" | ||||||
|     name="forkingpaths.orca.runtime" |     name="forkingpaths.orca.runtime" | ||||||
|     type="win32" |     type="win32" | ||||||
| /> | /> | ||||||
| <description>Orca Runtime</description> | <description>Orca Runtime</description> | ||||||
| <dependency> | <dependency> | ||||||
|     <dependentAssembly> |     <dependentAssembly> | ||||||
|         <assemblyIdentity |         <assemblyIdentity | ||||||
|             type="win32" |             type="win32" | ||||||
|             name="Microsoft.Windows.Common-Controls" |             name="Microsoft.Windows.Common-Controls" | ||||||
|             version="6.0.0.0" |             version="6.0.0.0" | ||||||
|             processorArchitecture="*" |             processorArchitecture="*" | ||||||
|             publicKeyToken="6595b64144ccf1df" |             publicKeyToken="6595b64144ccf1df" | ||||||
|             language="*" |             language="*" | ||||||
|         /> |         /> | ||||||
|     </dependentAssembly> |     </dependentAssembly> | ||||||
| </dependency> | </dependency> | ||||||
| </assembly> | </assembly> | ||||||
|  | @ -10,7 +10,7 @@ | ||||||
| #define EGL_EGLEXT_PROTOTYPES | #define EGL_EGLEXT_PROTOTYPES | ||||||
| #include<EGL/egl.h> | #include<EGL/egl.h> | ||||||
| #include<EGL/eglext.h> | #include<EGL/eglext.h> | ||||||
| #include"mp_app_internal.h" | #include"app/mp_app_internal.h" | ||||||
| #include"graphics_surface.h" | #include"graphics_surface.h" | ||||||
| #include"gl_loader.h" | #include"gl_loader.h" | ||||||
| 
 | 
 | ||||||
|  | @ -10,7 +10,7 @@ | ||||||
| #define __EGL_SURFACE_H_ | #define __EGL_SURFACE_H_ | ||||||
| 
 | 
 | ||||||
| #include"graphics_surface.h" | #include"graphics_surface.h" | ||||||
| #include"mp_app.h" | #include"app/mp_app.h" | ||||||
| 
 | 
 | ||||||
| mg_surface_data* mg_egl_surface_create_for_window(mp_window window); | mg_surface_data* mg_egl_surface_create_for_window(mp_window window); | ||||||
| mg_surface_data* mg_egl_surface_create_remote(u32 width, u32 height); | mg_surface_data* mg_egl_surface_create_remote(u32 width, u32 height); | ||||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							|  | @ -1,330 +1,330 @@ | ||||||
| /************************************************************//**
 | /************************************************************//**
 | ||||||
| * | * | ||||||
| *	@file: graphics.h | *	@file: graphics.h | ||||||
| *	@author: Martin Fouilleul | *	@author: Martin Fouilleul | ||||||
| *	@date: 23/01/2023 | *	@date: 23/01/2023 | ||||||
| *	@revision: | *	@revision: | ||||||
| * | * | ||||||
| *****************************************************************/ | *****************************************************************/ | ||||||
| #ifndef __GRAPHICS_H_ | #ifndef __GRAPHICS_H_ | ||||||
| #define __GRAPHICS_H_ | #define __GRAPHICS_H_ | ||||||
| 
 | 
 | ||||||
| #include"util/typedefs.h" | #include"util/typedefs.h" | ||||||
| #include"platform/platform.h" | #include"platform/platform.h" | ||||||
| #include"mp_app.h" | #include"app/mp_app.h" | ||||||
| 
 | 
 | ||||||
| //------------------------------------------------------------------------------------------
 | //------------------------------------------------------------------------------------------
 | ||||||
| //NOTE(martin): backends selection
 | //NOTE(martin): backends selection
 | ||||||
| //------------------------------------------------------------------------------------------
 | //------------------------------------------------------------------------------------------
 | ||||||
| 
 | 
 | ||||||
| typedef enum { | typedef enum { | ||||||
| 	MG_NONE, | 	MG_NONE, | ||||||
| 	MG_METAL, | 	MG_METAL, | ||||||
| 	MG_GL, | 	MG_GL, | ||||||
| 	MG_GLES, | 	MG_GLES, | ||||||
| 	MG_CANVAS, | 	MG_CANVAS, | ||||||
| 	MG_HOST } mg_surface_api; | 	MG_HOST } mg_surface_api; | ||||||
| 
 | 
 | ||||||
| //NOTE: these macros are used to select which backend to include when building milepost
 | //NOTE: these macros are used to select which backend to include when building milepost
 | ||||||
| //      they can be overridden by passing them to the compiler command line
 | //      they can be overridden by passing them to the compiler command line
 | ||||||
| #if PLATFORM_MACOS | #if PLATFORM_MACOS | ||||||
| 	#ifndef MG_COMPILE_METAL | 	#ifndef MG_COMPILE_METAL | ||||||
| 		#define MG_COMPILE_METAL 1 | 		#define MG_COMPILE_METAL 1 | ||||||
| 	#endif | 	#endif | ||||||
| 
 | 
 | ||||||
| 	#ifndef MG_COMPILE_GLES | 	#ifndef MG_COMPILE_GLES | ||||||
| 		#define MG_COMPILE_GLES 1 | 		#define MG_COMPILE_GLES 1 | ||||||
| 	#endif | 	#endif | ||||||
| 
 | 
 | ||||||
| 	#ifndef MG_COMPILE_CANVAS | 	#ifndef MG_COMPILE_CANVAS | ||||||
| 		#if !MG_COMPILE_METAL | 		#if !MG_COMPILE_METAL | ||||||
| 			#error "Canvas surface requires a Metal backend on macOS. Make sure you define MG_COMPILE_METAL to 1." | 			#error "Canvas surface requires a Metal backend on macOS. Make sure you define MG_COMPILE_METAL to 1." | ||||||
| 		#endif | 		#endif | ||||||
| 		#define MG_COMPILE_CANVAS 1 | 		#define MG_COMPILE_CANVAS 1 | ||||||
| 	#endif | 	#endif | ||||||
| 
 | 
 | ||||||
| 	#define MG_COMPILE_GL 0 | 	#define MG_COMPILE_GL 0 | ||||||
| 
 | 
 | ||||||
| #elif PLATFORM_WINDOWS | #elif PLATFORM_WINDOWS | ||||||
| 	#ifndef MG_COMPILE_GL | 	#ifndef MG_COMPILE_GL | ||||||
| 		#define MG_COMPILE_GL 1 | 		#define MG_COMPILE_GL 1 | ||||||
| 	#endif | 	#endif | ||||||
| 
 | 
 | ||||||
| 	#ifndef MG_COMPILE_GLES | 	#ifndef MG_COMPILE_GLES | ||||||
| 		#define MG_COMPILE_GLES 1 | 		#define MG_COMPILE_GLES 1 | ||||||
| 	#endif | 	#endif | ||||||
| 
 | 
 | ||||||
| 	#ifndef MG_COMPILE_CANVAS | 	#ifndef MG_COMPILE_CANVAS | ||||||
| 		#if !MG_COMPILE_GL | 		#if !MG_COMPILE_GL | ||||||
| 			#error "Canvas surface requires an OpenGL backend on Windows. Make sure you define MG_COMPILE_GL to 1." | 			#error "Canvas surface requires an OpenGL backend on Windows. Make sure you define MG_COMPILE_GL to 1." | ||||||
| 		#endif | 		#endif | ||||||
| 		#define MG_COMPILE_CANVAS 1 | 		#define MG_COMPILE_CANVAS 1 | ||||||
| 	#endif | 	#endif | ||||||
| 
 | 
 | ||||||
| #elif PLATFORM_LINUX | #elif PLATFORM_LINUX | ||||||
| 	#ifndef MG_COMPILE_GL | 	#ifndef MG_COMPILE_GL | ||||||
| 		#define MG_COMPILE_GL 1 | 		#define MG_COMPILE_GL 1 | ||||||
| 	#endif | 	#endif | ||||||
| 
 | 
 | ||||||
| 	#ifndef MG_COMPILE_CANVAS | 	#ifndef MG_COMPILE_CANVAS | ||||||
| 		#if !MG_COMPILE_GL | 		#if !MG_COMPILE_GL | ||||||
| 			#error "Canvas surface requires an OpenGL backend on Linux. Make sure you define MG_COMPILE_GL to 1." | 			#error "Canvas surface requires an OpenGL backend on Linux. Make sure you define MG_COMPILE_GL to 1." | ||||||
| 		#endif | 		#endif | ||||||
| 		#define MG_COMPILE_CANVAS 1 | 		#define MG_COMPILE_CANVAS 1 | ||||||
| 	#endif | 	#endif | ||||||
| #endif | #endif | ||||||
| 
 | 
 | ||||||
| //NOTE: these macros are used to select backend-specific APIs to include when using milepost
 | //NOTE: these macros are used to select backend-specific APIs to include when using milepost
 | ||||||
| #ifdef MG_EXPOSE_SURFACE_METAL | #ifdef MG_EXPOSE_SURFACE_METAL | ||||||
| 	#include"mtl_surface.h" | 	#include"mtl_surface.h" | ||||||
| #endif | #endif | ||||||
| 
 | 
 | ||||||
| #ifdef MG_EXPOSE_SURFACE_WGL | #ifdef MG_EXPOSE_SURFACE_WGL | ||||||
| 	#include"wgl_surface.h" | 	#include"wgl_surface.h" | ||||||
| #endif | #endif | ||||||
| 
 | 
 | ||||||
| //TODO: expose nsgl surface when supported, expose egl surface, etc...
 | //TODO: expose nsgl surface when supported, expose egl surface, etc...
 | ||||||
| 
 | 
 | ||||||
| //TODO: add MG_INCLUDE_OPENGL/GLES/etc, once we know how we make different gl versions co-exist
 | //TODO: add MG_INCLUDE_OPENGL/GLES/etc, once we know how we make different gl versions co-exist
 | ||||||
| 
 | 
 | ||||||
| MP_API bool mg_is_surface_api_available(mg_surface_api api); | MP_API bool mg_is_surface_api_available(mg_surface_api api); | ||||||
| 
 | 
 | ||||||
| //------------------------------------------------------------------------------------------
 | //------------------------------------------------------------------------------------------
 | ||||||
| //NOTE(martin): graphics surface
 | //NOTE(martin): graphics surface
 | ||||||
| //------------------------------------------------------------------------------------------
 | //------------------------------------------------------------------------------------------
 | ||||||
| typedef struct mg_surface { u64 h; } mg_surface; | typedef struct mg_surface { u64 h; } mg_surface; | ||||||
| 
 | 
 | ||||||
| MP_API mg_surface mg_surface_nil(void); | MP_API mg_surface mg_surface_nil(void); | ||||||
| MP_API bool mg_surface_is_nil(mg_surface surface); | MP_API bool mg_surface_is_nil(mg_surface surface); | ||||||
| 
 | 
 | ||||||
| MP_API mg_surface mg_surface_create_for_window(mp_window window, mg_surface_api api); | MP_API mg_surface mg_surface_create_for_window(mp_window window, mg_surface_api api); | ||||||
| MP_API void mg_surface_destroy(mg_surface surface); | MP_API void mg_surface_destroy(mg_surface surface); | ||||||
| 
 | 
 | ||||||
| MP_API void mg_surface_prepare(mg_surface surface); | MP_API void mg_surface_prepare(mg_surface surface); | ||||||
| MP_API void mg_surface_present(mg_surface surface); | MP_API void mg_surface_present(mg_surface surface); | ||||||
| MP_API void mg_surface_deselect(void); | MP_API void mg_surface_deselect(void); | ||||||
| 
 | 
 | ||||||
| MP_API void mg_surface_swap_interval(mg_surface surface, int swap); | MP_API void mg_surface_swap_interval(mg_surface surface, int swap); | ||||||
| MP_API vec2 mg_surface_get_size(mg_surface surface); | MP_API vec2 mg_surface_get_size(mg_surface surface); | ||||||
| MP_API vec2 mg_surface_contents_scaling(mg_surface surface); | MP_API vec2 mg_surface_contents_scaling(mg_surface surface); | ||||||
| MP_API bool mg_surface_get_hidden(mg_surface surface); | MP_API bool mg_surface_get_hidden(mg_surface surface); | ||||||
| MP_API void mg_surface_set_hidden(mg_surface surface, bool hidden); | MP_API void mg_surface_set_hidden(mg_surface surface, bool hidden); | ||||||
| 
 | 
 | ||||||
| //NOTE(martin): surface sharing
 | //NOTE(martin): surface sharing
 | ||||||
| typedef u64 mg_surface_id; | typedef u64 mg_surface_id; | ||||||
| 
 | 
 | ||||||
| MP_API mg_surface mg_surface_create_remote(u32 width, u32 height, mg_surface_api api); | MP_API mg_surface mg_surface_create_remote(u32 width, u32 height, mg_surface_api api); | ||||||
| MP_API mg_surface mg_surface_create_host(mp_window window); | MP_API mg_surface mg_surface_create_host(mp_window window); | ||||||
| MP_API mg_surface_id mg_surface_remote_id(mg_surface surface); | MP_API mg_surface_id mg_surface_remote_id(mg_surface surface); | ||||||
| MP_API void mg_surface_host_connect(mg_surface surface, mg_surface_id remoteId); | MP_API void mg_surface_host_connect(mg_surface surface, mg_surface_id remoteId); | ||||||
| 
 | 
 | ||||||
| //------------------------------------------------------------------------------------------
 | //------------------------------------------------------------------------------------------
 | ||||||
| //NOTE(martin): graphics canvas structs
 | //NOTE(martin): graphics canvas structs
 | ||||||
| //------------------------------------------------------------------------------------------
 | //------------------------------------------------------------------------------------------
 | ||||||
| typedef struct mg_canvas { u64 h; } mg_canvas; | typedef struct mg_canvas { u64 h; } mg_canvas; | ||||||
| typedef struct mg_font { u64 h; } mg_font; | typedef struct mg_font { u64 h; } mg_font; | ||||||
| typedef struct mg_image { u64 h; } mg_image; | typedef struct mg_image { u64 h; } mg_image; | ||||||
| 
 | 
 | ||||||
| typedef struct mg_mat2x3 | typedef struct mg_mat2x3 | ||||||
| { | { | ||||||
| 	f32 m[6]; | 	f32 m[6]; | ||||||
| } mg_mat2x3; | } mg_mat2x3; | ||||||
| 
 | 
 | ||||||
| typedef struct mg_color | typedef struct mg_color | ||||||
| { | { | ||||||
| 	union | 	union | ||||||
| 	{ | 	{ | ||||||
| 		struct | 		struct | ||||||
| 		{ | 		{ | ||||||
| 			f32 r; | 			f32 r; | ||||||
| 			f32 g; | 			f32 g; | ||||||
| 			f32 b; | 			f32 b; | ||||||
| 			f32 a; | 			f32 a; | ||||||
| 		}; | 		}; | ||||||
| 		f32 c[4]; | 		f32 c[4]; | ||||||
| 	}; | 	}; | ||||||
| } mg_color; | } mg_color; | ||||||
| 
 | 
 | ||||||
| typedef enum {MG_JOINT_MITER = 0, | typedef enum {MG_JOINT_MITER = 0, | ||||||
|               MG_JOINT_BEVEL, |               MG_JOINT_BEVEL, | ||||||
| 	          MG_JOINT_NONE } mg_joint_type; | 	          MG_JOINT_NONE } mg_joint_type; | ||||||
| 
 | 
 | ||||||
| typedef enum {MG_CAP_NONE = 0, | typedef enum {MG_CAP_NONE = 0, | ||||||
|               MG_CAP_SQUARE } mg_cap_type; |               MG_CAP_SQUARE } mg_cap_type; | ||||||
| 
 | 
 | ||||||
| typedef struct mg_font_extents | typedef struct mg_font_extents | ||||||
| { | { | ||||||
| 	f32 ascent;    // the extent above the baseline (by convention a positive value extends above the baseline)
 | 	f32 ascent;    // the extent above the baseline (by convention a positive value extends above the baseline)
 | ||||||
| 	f32 descent;   // the extent below the baseline (by convention, positive value extends below the baseline)
 | 	f32 descent;   // the extent below the baseline (by convention, positive value extends below the baseline)
 | ||||||
| 	f32 leading;   // spacing between one row's descent and the next row's ascent
 | 	f32 leading;   // spacing between one row's descent and the next row's ascent
 | ||||||
| 	f32 xHeight;   // height of the lower case letter 'x'
 | 	f32 xHeight;   // height of the lower case letter 'x'
 | ||||||
| 	f32 capHeight; // height of the upper case letter 'M'
 | 	f32 capHeight; // height of the upper case letter 'M'
 | ||||||
| 	f32 width;     // maximum width of the font
 | 	f32 width;     // maximum width of the font
 | ||||||
| 
 | 
 | ||||||
| } mg_font_extents; | } mg_font_extents; | ||||||
| 
 | 
 | ||||||
| typedef struct mg_text_extents | typedef struct mg_text_extents | ||||||
| { | { | ||||||
| 	f32 xBearing; | 	f32 xBearing; | ||||||
| 	f32 yBearing; | 	f32 yBearing; | ||||||
| 	f32 width; | 	f32 width; | ||||||
| 	f32 height; | 	f32 height; | ||||||
| 	f32 xAdvance; | 	f32 xAdvance; | ||||||
| 	f32 yAdvance; | 	f32 yAdvance; | ||||||
| 
 | 
 | ||||||
| } mg_text_extents; | } mg_text_extents; | ||||||
| 
 | 
 | ||||||
| //------------------------------------------------------------------------------------------
 | //------------------------------------------------------------------------------------------
 | ||||||
| //NOTE(martin): graphics canvas
 | //NOTE(martin): graphics canvas
 | ||||||
| //------------------------------------------------------------------------------------------
 | //------------------------------------------------------------------------------------------
 | ||||||
| MP_API mg_canvas mg_canvas_nil(void); | MP_API mg_canvas mg_canvas_nil(void); | ||||||
| MP_API bool mg_canvas_is_nil(mg_canvas canvas); | MP_API bool mg_canvas_is_nil(mg_canvas canvas); | ||||||
| 
 | 
 | ||||||
| MP_API mg_canvas mg_canvas_create(void); | MP_API mg_canvas mg_canvas_create(void); | ||||||
| MP_API void mg_canvas_destroy(mg_canvas canvas); | MP_API void mg_canvas_destroy(mg_canvas canvas); | ||||||
| MP_API mg_canvas mg_canvas_set_current(mg_canvas canvas); | MP_API mg_canvas mg_canvas_set_current(mg_canvas canvas); | ||||||
| MP_API void mg_render(mg_surface surface, mg_canvas canvas); | MP_API void mg_render(mg_surface surface, mg_canvas canvas); | ||||||
| 
 | 
 | ||||||
| //------------------------------------------------------------------------------------------
 | //------------------------------------------------------------------------------------------
 | ||||||
| //NOTE(martin): fonts
 | //NOTE(martin): fonts
 | ||||||
| //------------------------------------------------------------------------------------------
 | //------------------------------------------------------------------------------------------
 | ||||||
| MP_API mg_font mg_font_nil(void); | MP_API mg_font mg_font_nil(void); | ||||||
| MP_API mg_font mg_font_create_from_memory(u32 size, byte* buffer, u32 rangeCount, unicode_range* ranges); | MP_API mg_font mg_font_create_from_memory(u32 size, byte* buffer, u32 rangeCount, unicode_range* ranges); | ||||||
| MP_API void mg_font_destroy(mg_font font); | MP_API void mg_font_destroy(mg_font font); | ||||||
| 
 | 
 | ||||||
| //NOTE(martin): the following int valued functions return -1 if font is invalid or codepoint is not present in font//
 | //NOTE(martin): the following int valued functions return -1 if font is invalid or codepoint is not present in font//
 | ||||||
| //TODO(martin): add enum error codes
 | //TODO(martin): add enum error codes
 | ||||||
| 
 | 
 | ||||||
| MP_API mg_font_extents mg_font_get_extents(mg_font font); | MP_API mg_font_extents mg_font_get_extents(mg_font font); | ||||||
| MP_API mg_font_extents mg_font_get_scaled_extents(mg_font font, f32 emSize); | MP_API mg_font_extents mg_font_get_scaled_extents(mg_font font, f32 emSize); | ||||||
| MP_API f32 mg_font_get_scale_for_em_pixels(mg_font font, f32 emSize); | MP_API f32 mg_font_get_scale_for_em_pixels(mg_font font, f32 emSize); | ||||||
| 
 | 
 | ||||||
| //NOTE(martin): if you need to process more than one codepoint, first convert your codepoints to glyph indices, then use the
 | //NOTE(martin): if you need to process more than one codepoint, first convert your codepoints to glyph indices, then use the
 | ||||||
| //              glyph index versions of the functions, which can take an array of glyph indices.
 | //              glyph index versions of the functions, which can take an array of glyph indices.
 | ||||||
| 
 | 
 | ||||||
| MP_API str32 mg_font_get_glyph_indices(mg_font font, str32 codePoints, str32 backing); | MP_API str32 mg_font_get_glyph_indices(mg_font font, str32 codePoints, str32 backing); | ||||||
| MP_API str32 mg_font_push_glyph_indices(mg_font font, mem_arena* arena, str32 codePoints); | MP_API str32 mg_font_push_glyph_indices(mg_font font, mem_arena* arena, str32 codePoints); | ||||||
| MP_API u32 mg_font_get_glyph_index(mg_font font, utf32 codePoint); | MP_API u32 mg_font_get_glyph_index(mg_font font, utf32 codePoint); | ||||||
| 
 | 
 | ||||||
| MP_API int mg_font_get_codepoint_extents(mg_font font, utf32 codePoint, mg_text_extents* outExtents); | MP_API int mg_font_get_codepoint_extents(mg_font font, utf32 codePoint, mg_text_extents* outExtents); | ||||||
| 
 | 
 | ||||||
| MP_API int mg_font_get_glyph_extents(mg_font font, str32 glyphIndices, mg_text_extents* outExtents); | MP_API int mg_font_get_glyph_extents(mg_font font, str32 glyphIndices, mg_text_extents* outExtents); | ||||||
| 
 | 
 | ||||||
| MP_API mp_rect mg_text_bounding_box_utf32(mg_font font, f32 fontSize, str32 text); | MP_API mp_rect mg_text_bounding_box_utf32(mg_font font, f32 fontSize, str32 text); | ||||||
| MP_API mp_rect mg_text_bounding_box(mg_font font, f32 fontSize, str8 text); | MP_API mp_rect mg_text_bounding_box(mg_font font, f32 fontSize, str8 text); | ||||||
| 
 | 
 | ||||||
| //------------------------------------------------------------------------------------------
 | //------------------------------------------------------------------------------------------
 | ||||||
| //NOTE(martin): images
 | //NOTE(martin): images
 | ||||||
| //------------------------------------------------------------------------------------------
 | //------------------------------------------------------------------------------------------
 | ||||||
| MP_API mg_image mg_image_nil(void); | MP_API mg_image mg_image_nil(void); | ||||||
| MP_API bool mg_image_is_nil(mg_image a); | MP_API bool mg_image_is_nil(mg_image a); | ||||||
| 
 | 
 | ||||||
| MP_API mg_image mg_image_create(mg_surface surface, u32 width, u32 height); | MP_API mg_image mg_image_create(mg_surface surface, u32 width, u32 height); | ||||||
| MP_API mg_image mg_image_create_from_rgba8(mg_surface surface, u32 width, u32 height, u8* pixels); | MP_API mg_image mg_image_create_from_rgba8(mg_surface surface, u32 width, u32 height, u8* pixels); | ||||||
| MP_API mg_image mg_image_create_from_data(mg_surface surface, str8 data, bool flip); | MP_API mg_image mg_image_create_from_data(mg_surface surface, str8 data, bool flip); | ||||||
| MP_API mg_image mg_image_create_from_file(mg_surface surface, str8 path, bool flip); | MP_API mg_image mg_image_create_from_file(mg_surface surface, str8 path, bool flip); | ||||||
| 
 | 
 | ||||||
| MP_API void mg_image_destroy(mg_image image); | MP_API void mg_image_destroy(mg_image image); | ||||||
| 
 | 
 | ||||||
| MP_API void mg_image_upload_region_rgba8(mg_image image, mp_rect region, u8* pixels); | MP_API void mg_image_upload_region_rgba8(mg_image image, mp_rect region, u8* pixels); | ||||||
| MP_API vec2 mg_image_size(mg_image image); | MP_API vec2 mg_image_size(mg_image image); | ||||||
| 
 | 
 | ||||||
| //------------------------------------------------------------------------------------------
 | //------------------------------------------------------------------------------------------
 | ||||||
| //NOTE(martin): atlasing
 | //NOTE(martin): atlasing
 | ||||||
| //------------------------------------------------------------------------------------------
 | //------------------------------------------------------------------------------------------
 | ||||||
| 
 | 
 | ||||||
| //NOTE: rectangle allocator
 | //NOTE: rectangle allocator
 | ||||||
| typedef struct mg_rect_atlas mg_rect_atlas; | typedef struct mg_rect_atlas mg_rect_atlas; | ||||||
| 
 | 
 | ||||||
| MP_API mg_rect_atlas* mg_rect_atlas_create(mem_arena* arena, i32 width, i32 height); | MP_API mg_rect_atlas* mg_rect_atlas_create(mem_arena* arena, i32 width, i32 height); | ||||||
| MP_API mp_rect mg_rect_atlas_alloc(mg_rect_atlas* atlas, i32 width, i32 height); | MP_API mp_rect mg_rect_atlas_alloc(mg_rect_atlas* atlas, i32 width, i32 height); | ||||||
| MP_API void mg_rect_atlas_recycle(mg_rect_atlas* atlas, mp_rect rect); | MP_API void mg_rect_atlas_recycle(mg_rect_atlas* atlas, mp_rect rect); | ||||||
| 
 | 
 | ||||||
| //NOTE: image atlas helpers
 | //NOTE: image atlas helpers
 | ||||||
| typedef struct mg_image_region | typedef struct mg_image_region | ||||||
| { | { | ||||||
| 	mg_image image; | 	mg_image image; | ||||||
| 	mp_rect rect; | 	mp_rect rect; | ||||||
| } mg_image_region; | } mg_image_region; | ||||||
| 
 | 
 | ||||||
| MP_API mg_image_region mg_image_atlas_alloc_from_rgba8(mg_rect_atlas* atlas, mg_image backingImage, u32 width, u32 height, u8* pixels); | MP_API mg_image_region mg_image_atlas_alloc_from_rgba8(mg_rect_atlas* atlas, mg_image backingImage, u32 width, u32 height, u8* pixels); | ||||||
| MP_API mg_image_region mg_image_atlas_alloc_from_data(mg_rect_atlas* atlas, mg_image backingImage, str8 data, bool flip); | MP_API mg_image_region mg_image_atlas_alloc_from_data(mg_rect_atlas* atlas, mg_image backingImage, str8 data, bool flip); | ||||||
| MP_API mg_image_region mg_image_atlas_alloc_from_file(mg_rect_atlas* atlas, mg_image backingImage, str8 path, bool flip); | MP_API mg_image_region mg_image_atlas_alloc_from_file(mg_rect_atlas* atlas, mg_image backingImage, str8 path, bool flip); | ||||||
| MP_API void mg_image_atlas_recycle(mg_rect_atlas* atlas, mg_image_region imageRgn); | MP_API void mg_image_atlas_recycle(mg_rect_atlas* atlas, mg_image_region imageRgn); | ||||||
| 
 | 
 | ||||||
| //------------------------------------------------------------------------------------------
 | //------------------------------------------------------------------------------------------
 | ||||||
| //NOTE(martin): transform, viewport and clipping
 | //NOTE(martin): transform, viewport and clipping
 | ||||||
| //------------------------------------------------------------------------------------------
 | //------------------------------------------------------------------------------------------
 | ||||||
| MP_API void mg_viewport(mp_rect viewPort); | MP_API void mg_viewport(mp_rect viewPort); | ||||||
| 
 | 
 | ||||||
| MP_API void mg_matrix_push(mg_mat2x3 matrix); | MP_API void mg_matrix_push(mg_mat2x3 matrix); | ||||||
| MP_API void mg_matrix_pop(void); | MP_API void mg_matrix_pop(void); | ||||||
| 
 | 
 | ||||||
| MP_API void mg_clip_push(f32 x, f32 y, f32 w, f32 h); | MP_API void mg_clip_push(f32 x, f32 y, f32 w, f32 h); | ||||||
| MP_API void mg_clip_pop(void); | MP_API void mg_clip_pop(void); | ||||||
| 
 | 
 | ||||||
| //------------------------------------------------------------------------------------------
 | //------------------------------------------------------------------------------------------
 | ||||||
| //NOTE(martin): graphics attributes setting/getting
 | //NOTE(martin): graphics attributes setting/getting
 | ||||||
| //------------------------------------------------------------------------------------------
 | //------------------------------------------------------------------------------------------
 | ||||||
| MP_API void mg_set_color(mg_color color); | MP_API void mg_set_color(mg_color color); | ||||||
| MP_API void mg_set_color_rgba(f32 r, f32 g, f32 b, f32 a); | MP_API void mg_set_color_rgba(f32 r, f32 g, f32 b, f32 a); | ||||||
| MP_API void mg_set_width(f32 width); | MP_API void mg_set_width(f32 width); | ||||||
| MP_API void mg_set_tolerance(f32 tolerance); | MP_API void mg_set_tolerance(f32 tolerance); | ||||||
| MP_API void mg_set_joint(mg_joint_type joint); | MP_API void mg_set_joint(mg_joint_type joint); | ||||||
| MP_API void mg_set_max_joint_excursion(f32 maxJointExcursion); | MP_API void mg_set_max_joint_excursion(f32 maxJointExcursion); | ||||||
| MP_API void mg_set_cap(mg_cap_type cap); | MP_API void mg_set_cap(mg_cap_type cap); | ||||||
| MP_API void mg_set_font(mg_font font); | MP_API void mg_set_font(mg_font font); | ||||||
| MP_API void mg_set_font_size(f32 size); | MP_API void mg_set_font_size(f32 size); | ||||||
| MP_API void mg_set_text_flip(bool flip); | MP_API void mg_set_text_flip(bool flip); | ||||||
| MP_API void mg_set_image(mg_image image); | MP_API void mg_set_image(mg_image image); | ||||||
| MP_API void mg_set_image_source_region(mp_rect region); | MP_API void mg_set_image_source_region(mp_rect region); | ||||||
| 
 | 
 | ||||||
| MP_API mg_color mg_get_color(void); | MP_API mg_color mg_get_color(void); | ||||||
| MP_API f32 mg_get_width(void); | MP_API f32 mg_get_width(void); | ||||||
| MP_API f32 mg_get_tolerance(void); | MP_API f32 mg_get_tolerance(void); | ||||||
| MP_API mg_joint_type mg_get_joint(void); | MP_API mg_joint_type mg_get_joint(void); | ||||||
| MP_API f32 mg_get_max_joint_excursion(void); | MP_API f32 mg_get_max_joint_excursion(void); | ||||||
| MP_API mg_cap_type mg_get_cap(void); | MP_API mg_cap_type mg_get_cap(void); | ||||||
| MP_API mg_font mg_get_font(void); | MP_API mg_font mg_get_font(void); | ||||||
| MP_API f32 mg_get_font_size(void); | MP_API f32 mg_get_font_size(void); | ||||||
| MP_API bool mg_get_text_flip(void); | MP_API bool mg_get_text_flip(void); | ||||||
| 
 | 
 | ||||||
| //------------------------------------------------------------------------------------------
 | //------------------------------------------------------------------------------------------
 | ||||||
| //NOTE(martin): path construction
 | //NOTE(martin): path construction
 | ||||||
| //------------------------------------------------------------------------------------------
 | //------------------------------------------------------------------------------------------
 | ||||||
| MP_API vec2 mg_get_position(void); | MP_API vec2 mg_get_position(void); | ||||||
| MP_API void mg_move_to(f32 x, f32 y); | MP_API void mg_move_to(f32 x, f32 y); | ||||||
| MP_API void mg_line_to(f32 x, f32 y); | MP_API void mg_line_to(f32 x, f32 y); | ||||||
| MP_API void mg_quadratic_to(f32 x1, f32 y1, f32 x2, f32 y2); | MP_API void mg_quadratic_to(f32 x1, f32 y1, f32 x2, f32 y2); | ||||||
| MP_API void mg_cubic_to(f32 x1, f32 y1, f32 x2, f32 y2, f32 x3, f32 y3); | MP_API void mg_cubic_to(f32 x1, f32 y1, f32 x2, f32 y2, f32 x3, f32 y3); | ||||||
| MP_API void mg_close_path(void); | MP_API void mg_close_path(void); | ||||||
| 
 | 
 | ||||||
| MP_API mp_rect mg_glyph_outlines(str32 glyphIndices); | MP_API mp_rect mg_glyph_outlines(str32 glyphIndices); | ||||||
| MP_API void mg_codepoints_outlines(str32 string); | MP_API void mg_codepoints_outlines(str32 string); | ||||||
| MP_API void mg_text_outlines(str8 string); | MP_API void mg_text_outlines(str8 string); | ||||||
| 
 | 
 | ||||||
| //------------------------------------------------------------------------------------------
 | //------------------------------------------------------------------------------------------
 | ||||||
| //NOTE(martin): clear/fill/stroke
 | //NOTE(martin): clear/fill/stroke
 | ||||||
| //------------------------------------------------------------------------------------------
 | //------------------------------------------------------------------------------------------
 | ||||||
| MP_API void mg_clear(void); | MP_API void mg_clear(void); | ||||||
| MP_API void mg_fill(void); | MP_API void mg_fill(void); | ||||||
| MP_API void mg_stroke(void); | MP_API void mg_stroke(void); | ||||||
| 
 | 
 | ||||||
| //------------------------------------------------------------------------------------------
 | //------------------------------------------------------------------------------------------
 | ||||||
| //NOTE(martin): 'fast' shapes primitives
 | //NOTE(martin): 'fast' shapes primitives
 | ||||||
| //------------------------------------------------------------------------------------------
 | //------------------------------------------------------------------------------------------
 | ||||||
| MP_API void mg_rectangle_fill(f32 x, f32 y, f32 w, f32 h); | MP_API void mg_rectangle_fill(f32 x, f32 y, f32 w, f32 h); | ||||||
| MP_API void mg_rectangle_stroke(f32 x, f32 y, f32 w, f32 h); | MP_API void mg_rectangle_stroke(f32 x, f32 y, f32 w, f32 h); | ||||||
| MP_API void mg_rounded_rectangle_fill(f32 x, f32 y, f32 w, f32 h, f32 r); | MP_API void mg_rounded_rectangle_fill(f32 x, f32 y, f32 w, f32 h, f32 r); | ||||||
| MP_API void mg_rounded_rectangle_stroke(f32 x, f32 y, f32 w, f32 h, f32 r); | MP_API void mg_rounded_rectangle_stroke(f32 x, f32 y, f32 w, f32 h, f32 r); | ||||||
| MP_API void mg_ellipse_fill(f32 x, f32 y, f32 rx, f32 ry); | MP_API void mg_ellipse_fill(f32 x, f32 y, f32 rx, f32 ry); | ||||||
| MP_API void mg_ellipse_stroke(f32 x, f32 y, f32 rx, f32 ry); | MP_API void mg_ellipse_stroke(f32 x, f32 y, f32 rx, f32 ry); | ||||||
| MP_API void mg_circle_fill(f32 x, f32 y, f32 r); | MP_API void mg_circle_fill(f32 x, f32 y, f32 r); | ||||||
| MP_API void mg_circle_stroke(f32 x, f32 y, f32 r); | MP_API void mg_circle_stroke(f32 x, f32 y, f32 r); | ||||||
| MP_API void mg_arc(f32 x, f32 y, f32 r, f32 arcAngle, f32 startAngle); | MP_API void mg_arc(f32 x, f32 y, f32 r, f32 arcAngle, f32 startAngle); | ||||||
| 
 | 
 | ||||||
| //NOTE: image helpers
 | //NOTE: image helpers
 | ||||||
| MP_API void mg_image_draw(mg_image image, mp_rect rect); | MP_API void mg_image_draw(mg_image image, mp_rect rect); | ||||||
| MP_API void mg_image_draw_region(mg_image image, mp_rect srcRegion, mp_rect dstRegion); | MP_API void mg_image_draw_region(mg_image image, mp_rect srcRegion, mp_rect dstRegion); | ||||||
| 
 | 
 | ||||||
| #endif //__GRAPHICS_H_
 | #endif //__GRAPHICS_H_
 | ||||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							|  | @ -1,82 +1,82 @@ | ||||||
| /************************************************************//**
 | /************************************************************//**
 | ||||||
| * | * | ||||||
| *	@file: graphics_common.h | *	@file: graphics_common.h | ||||||
| *	@author: Martin Fouilleul | *	@author: Martin Fouilleul | ||||||
| *	@date: 26/04/2023 | *	@date: 26/04/2023 | ||||||
| * | * | ||||||
| *****************************************************************/ | *****************************************************************/ | ||||||
| #ifndef __GRAPHICS_COMMON_H_ | #ifndef __GRAPHICS_COMMON_H_ | ||||||
| #define __GRAPHICS_COMMON_H_ | #define __GRAPHICS_COMMON_H_ | ||||||
| 
 | 
 | ||||||
| #include"graphics.h" | #include"graphics.h" | ||||||
| 
 | 
 | ||||||
| //------------------------------------------------------------------------
 | //------------------------------------------------------------------------
 | ||||||
| // canvas structs
 | // canvas structs
 | ||||||
| //------------------------------------------------------------------------
 | //------------------------------------------------------------------------
 | ||||||
| typedef enum { MG_PATH_MOVE, | typedef enum { MG_PATH_MOVE, | ||||||
|                MG_PATH_LINE, |                MG_PATH_LINE, | ||||||
| 	           MG_PATH_QUADRATIC, | 	           MG_PATH_QUADRATIC, | ||||||
| 	           MG_PATH_CUBIC } mg_path_elt_type; | 	           MG_PATH_CUBIC } mg_path_elt_type; | ||||||
| 
 | 
 | ||||||
| typedef struct mg_path_elt | typedef struct mg_path_elt | ||||||
| { | { | ||||||
| 	mg_path_elt_type type; | 	mg_path_elt_type type; | ||||||
| 	vec2 p[3]; | 	vec2 p[3]; | ||||||
| 
 | 
 | ||||||
| } mg_path_elt; | } mg_path_elt; | ||||||
| 
 | 
 | ||||||
| typedef struct mg_path_descriptor | typedef struct mg_path_descriptor | ||||||
| { | { | ||||||
| 	u32 startIndex; | 	u32 startIndex; | ||||||
| 	u32 count; | 	u32 count; | ||||||
| 	vec2 startPoint; | 	vec2 startPoint; | ||||||
| 
 | 
 | ||||||
| } mg_path_descriptor; | } mg_path_descriptor; | ||||||
| 
 | 
 | ||||||
| typedef struct mg_attributes | typedef struct mg_attributes | ||||||
| { | { | ||||||
| 	f32 width; | 	f32 width; | ||||||
| 	f32 tolerance; | 	f32 tolerance; | ||||||
| 	mg_color color; | 	mg_color color; | ||||||
| 	mg_joint_type joint; | 	mg_joint_type joint; | ||||||
| 	f32 maxJointExcursion; | 	f32 maxJointExcursion; | ||||||
| 	mg_cap_type cap; | 	mg_cap_type cap; | ||||||
| 
 | 
 | ||||||
| 	mg_font font; | 	mg_font font; | ||||||
| 	f32 fontSize; | 	f32 fontSize; | ||||||
| 
 | 
 | ||||||
| 	mg_image image; | 	mg_image image; | ||||||
| 	mp_rect srcRegion; | 	mp_rect srcRegion; | ||||||
| 
 | 
 | ||||||
| 	mg_mat2x3 transform; | 	mg_mat2x3 transform; | ||||||
| 	mp_rect clip; | 	mp_rect clip; | ||||||
| 
 | 
 | ||||||
| } mg_attributes; | } mg_attributes; | ||||||
| 
 | 
 | ||||||
| typedef enum { MG_CMD_FILL, | typedef enum { MG_CMD_FILL, | ||||||
| 	           MG_CMD_STROKE, | 	           MG_CMD_STROKE, | ||||||
| 	           MG_CMD_JUMP | 	           MG_CMD_JUMP | ||||||
| 	     } mg_primitive_cmd; | 	     } mg_primitive_cmd; | ||||||
| 
 | 
 | ||||||
| typedef struct mg_primitive | typedef struct mg_primitive | ||||||
| { | { | ||||||
| 	mg_primitive_cmd cmd; | 	mg_primitive_cmd cmd; | ||||||
| 	mg_attributes attributes; | 	mg_attributes attributes; | ||||||
| 
 | 
 | ||||||
| 	union | 	union | ||||||
| 	{ | 	{ | ||||||
| 		mg_path_descriptor path; | 		mg_path_descriptor path; | ||||||
| 		mp_rect rect; | 		mp_rect rect; | ||||||
| 		u32 jump; | 		u32 jump; | ||||||
| 	}; | 	}; | ||||||
| 
 | 
 | ||||||
| } mg_primitive; | } mg_primitive; | ||||||
| 
 | 
 | ||||||
| MP_API void mg_surface_render_commands(mg_surface surface, | MP_API void mg_surface_render_commands(mg_surface surface, | ||||||
|                                        mg_color clearColor, |                                        mg_color clearColor, | ||||||
|                                        u32 primitiveCount, |                                        u32 primitiveCount, | ||||||
|                                        mg_primitive* primitives, |                                        mg_primitive* primitives, | ||||||
|                                        u32 eltCount, |                                        u32 eltCount, | ||||||
|                                        mg_path_elt* elements); |                                        mg_path_elt* elements); | ||||||
| 
 | 
 | ||||||
| #endif //__GRAPHICS_COMMON_H_
 | #endif //__GRAPHICS_COMMON_H_
 | ||||||
|  | @ -1,454 +1,454 @@ | ||||||
| /************************************************************//**
 | /************************************************************//**
 | ||||||
| * | * | ||||||
| *	@file: graphics_surface.c | *	@file: graphics_surface.c | ||||||
| *	@author: Martin Fouilleul | *	@author: Martin Fouilleul | ||||||
| *	@date: 25/04/2023 | *	@date: 25/04/2023 | ||||||
| * | * | ||||||
| *****************************************************************/ | *****************************************************************/ | ||||||
| 
 | 
 | ||||||
| #include"graphics_surface.h" | #include"graphics_surface.h" | ||||||
| 
 | 
 | ||||||
| //---------------------------------------------------------------
 | //---------------------------------------------------------------
 | ||||||
| // per-thread selected surface
 | // per-thread selected surface
 | ||||||
| //---------------------------------------------------------------
 | //---------------------------------------------------------------
 | ||||||
| 
 | 
 | ||||||
| mp_thread_local mg_surface __mgSelectedSurface = {0}; | mp_thread_local mg_surface __mgSelectedSurface = {0}; | ||||||
| 
 | 
 | ||||||
| //---------------------------------------------------------------
 | //---------------------------------------------------------------
 | ||||||
| // typed handles functions
 | // typed handles functions
 | ||||||
| //---------------------------------------------------------------
 | //---------------------------------------------------------------
 | ||||||
| 
 | 
 | ||||||
| mg_surface mg_surface_handle_alloc(mg_surface_data* surface) | mg_surface mg_surface_handle_alloc(mg_surface_data* surface) | ||||||
| { | { | ||||||
| 	mg_surface handle = {.h = mg_handle_alloc(MG_HANDLE_SURFACE, (void*)surface) }; | 	mg_surface handle = {.h = mg_handle_alloc(MG_HANDLE_SURFACE, (void*)surface) }; | ||||||
| 	return(handle); | 	return(handle); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| mg_surface_data* mg_surface_data_from_handle(mg_surface handle) | mg_surface_data* mg_surface_data_from_handle(mg_surface handle) | ||||||
| { | { | ||||||
| 	mg_surface_data* data = mg_data_from_handle(MG_HANDLE_SURFACE, handle.h); | 	mg_surface_data* data = mg_data_from_handle(MG_HANDLE_SURFACE, handle.h); | ||||||
| 	return(data); | 	return(data); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| mg_image mg_image_handle_alloc(mg_image_data* image) | mg_image mg_image_handle_alloc(mg_image_data* image) | ||||||
| { | { | ||||||
| 	mg_image handle = {.h = mg_handle_alloc(MG_HANDLE_IMAGE, (void*)image) }; | 	mg_image handle = {.h = mg_handle_alloc(MG_HANDLE_IMAGE, (void*)image) }; | ||||||
| 	return(handle); | 	return(handle); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| mg_image_data* mg_image_data_from_handle(mg_image handle) | mg_image_data* mg_image_data_from_handle(mg_image handle) | ||||||
| { | { | ||||||
| 	mg_image_data* data = mg_data_from_handle(MG_HANDLE_IMAGE, handle.h); | 	mg_image_data* data = mg_data_from_handle(MG_HANDLE_IMAGE, handle.h); | ||||||
| 	return(data); | 	return(data); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| //---------------------------------------------------------------
 | //---------------------------------------------------------------
 | ||||||
| // surface API
 | // surface API
 | ||||||
| //---------------------------------------------------------------
 | //---------------------------------------------------------------
 | ||||||
| 
 | 
 | ||||||
| #if MG_COMPILE_GL | #if MG_COMPILE_GL | ||||||
| 	#if PLATFORM_WINDOWS | 	#if PLATFORM_WINDOWS | ||||||
| 		#include"wgl_surface.h" | 		#include"wgl_surface.h" | ||||||
| 		#define gl_surface_create_for_window mg_wgl_surface_create_for_window | 		#define gl_surface_create_for_window mg_wgl_surface_create_for_window | ||||||
| 	#endif | 	#endif | ||||||
| #endif | #endif | ||||||
| 
 | 
 | ||||||
| #if MG_COMPILE_GLES | #if MG_COMPILE_GLES | ||||||
| 	#include"egl_surface.h" | 	#include"egl_surface.h" | ||||||
| #endif | #endif | ||||||
| 
 | 
 | ||||||
| #if MG_COMPILE_METAL | #if MG_COMPILE_METAL | ||||||
| 	#include"mtl_surface.h" | 	#include"mtl_surface.h" | ||||||
| #endif | #endif | ||||||
| 
 | 
 | ||||||
| #if MG_COMPILE_CANVAS | #if MG_COMPILE_CANVAS | ||||||
| 	#if PLATFORM_MACOS | 	#if PLATFORM_MACOS | ||||||
| 		mg_surface_data* mtl_canvas_surface_create_for_window(mp_window window); | 		mg_surface_data* mtl_canvas_surface_create_for_window(mp_window window); | ||||||
| 	#elif PLATFORM_WINDOWS | 	#elif PLATFORM_WINDOWS | ||||||
| 		mg_surface_data* gl_canvas_surface_create_for_window(mp_window window); | 		mg_surface_data* gl_canvas_surface_create_for_window(mp_window window); | ||||||
| 	#endif | 	#endif | ||||||
| #endif | #endif | ||||||
| 
 | 
 | ||||||
| bool mg_is_surface_backend_available(mg_surface_api api) | bool mg_is_surface_backend_available(mg_surface_api api) | ||||||
| { | { | ||||||
| 	bool result = false; | 	bool result = false; | ||||||
| 	switch(api) | 	switch(api) | ||||||
| 	{ | 	{ | ||||||
| 		#if MG_COMPILE_METAL | 		#if MG_COMPILE_METAL | ||||||
| 			case MG_METAL: | 			case MG_METAL: | ||||||
| 		#endif | 		#endif | ||||||
| 
 | 
 | ||||||
| 		#if MG_COMPILE_GL | 		#if MG_COMPILE_GL | ||||||
| 			case MG_GL: | 			case MG_GL: | ||||||
| 		#endif | 		#endif | ||||||
| 
 | 
 | ||||||
| 		#if MG_COMPILE_GLES | 		#if MG_COMPILE_GLES | ||||||
| 			case MG_GLES: | 			case MG_GLES: | ||||||
| 		#endif | 		#endif | ||||||
| 
 | 
 | ||||||
| 		#if MG_COMPILE_CANVAS | 		#if MG_COMPILE_CANVAS | ||||||
| 			case MG_CANVAS: | 			case MG_CANVAS: | ||||||
| 		#endif | 		#endif | ||||||
| 			result = true; | 			result = true; | ||||||
| 			break; | 			break; | ||||||
| 
 | 
 | ||||||
| 		default: | 		default: | ||||||
| 			break; | 			break; | ||||||
| 	} | 	} | ||||||
| 	return(result); | 	return(result); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| mg_surface mg_surface_nil() { return((mg_surface){.h = 0}); } | mg_surface mg_surface_nil() { return((mg_surface){.h = 0}); } | ||||||
| bool mg_surface_is_nil(mg_surface surface) { return(surface.h == 0); } | bool mg_surface_is_nil(mg_surface surface) { return(surface.h == 0); } | ||||||
| 
 | 
 | ||||||
| mg_surface mg_surface_create_for_window(mp_window window, mg_surface_api api) | mg_surface mg_surface_create_for_window(mp_window window, mg_surface_api api) | ||||||
| { | { | ||||||
| 	if(__mgData.init) | 	if(__mgData.init) | ||||||
| 	{ | 	{ | ||||||
| 		mg_init(); | 		mg_init(); | ||||||
| 	} | 	} | ||||||
| 	mg_surface surfaceHandle = mg_surface_nil(); | 	mg_surface surfaceHandle = mg_surface_nil(); | ||||||
| 	mg_surface_data* surface = 0; | 	mg_surface_data* surface = 0; | ||||||
| 
 | 
 | ||||||
| 	switch(api) | 	switch(api) | ||||||
| 	{ | 	{ | ||||||
| 	#if MG_COMPILE_GL | 	#if MG_COMPILE_GL | ||||||
| 		case MG_GL: | 		case MG_GL: | ||||||
| 			surface = gl_surface_create_for_window(window); | 			surface = gl_surface_create_for_window(window); | ||||||
| 			break; | 			break; | ||||||
| 	#endif | 	#endif | ||||||
| 
 | 
 | ||||||
| 	#if MG_COMPILE_GLES | 	#if MG_COMPILE_GLES | ||||||
| 		case MG_GLES: | 		case MG_GLES: | ||||||
| 			surface = mg_egl_surface_create_for_window(window); | 			surface = mg_egl_surface_create_for_window(window); | ||||||
| 			break; | 			break; | ||||||
| 	#endif | 	#endif | ||||||
| 
 | 
 | ||||||
| 	#if MG_COMPILE_METAL | 	#if MG_COMPILE_METAL | ||||||
| 		case MG_METAL: | 		case MG_METAL: | ||||||
| 			surface = mg_mtl_surface_create_for_window(window); | 			surface = mg_mtl_surface_create_for_window(window); | ||||||
| 			break; | 			break; | ||||||
| 	#endif | 	#endif | ||||||
| 
 | 
 | ||||||
| 	#if MG_COMPILE_CANVAS | 	#if MG_COMPILE_CANVAS | ||||||
| 		case MG_CANVAS: | 		case MG_CANVAS: | ||||||
| 
 | 
 | ||||||
| 		#if PLATFORM_MACOS | 		#if PLATFORM_MACOS | ||||||
| 			surface = mtl_canvas_surface_create_for_window(window); | 			surface = mtl_canvas_surface_create_for_window(window); | ||||||
| 		#elif PLATFORM_WINDOWS | 		#elif PLATFORM_WINDOWS | ||||||
| 			surface = gl_canvas_surface_create_for_window(window); | 			surface = gl_canvas_surface_create_for_window(window); | ||||||
| 		#endif | 		#endif | ||||||
| 			break; | 			break; | ||||||
| 	#endif | 	#endif | ||||||
| 
 | 
 | ||||||
| 		default: | 		default: | ||||||
| 			break; | 			break; | ||||||
| 	} | 	} | ||||||
| 	if(surface) | 	if(surface) | ||||||
| 	{ | 	{ | ||||||
| 		surfaceHandle = mg_surface_handle_alloc(surface); | 		surfaceHandle = mg_surface_handle_alloc(surface); | ||||||
| 		mg_surface_prepare(surfaceHandle); | 		mg_surface_prepare(surfaceHandle); | ||||||
| 	} | 	} | ||||||
| 	return(surfaceHandle); | 	return(surfaceHandle); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| mg_surface mg_surface_create_remote(u32 width, u32 height, mg_surface_api api) | mg_surface mg_surface_create_remote(u32 width, u32 height, mg_surface_api api) | ||||||
| { | { | ||||||
| 	if(!__mgData.init) | 	if(!__mgData.init) | ||||||
| 	{ | 	{ | ||||||
| 		mg_init(); | 		mg_init(); | ||||||
| 	} | 	} | ||||||
| 	mg_surface surfaceHandle = mg_surface_nil(); | 	mg_surface surfaceHandle = mg_surface_nil(); | ||||||
| 	mg_surface_data* surface = 0; | 	mg_surface_data* surface = 0; | ||||||
| 
 | 
 | ||||||
| 	switch(api) | 	switch(api) | ||||||
| 	{ | 	{ | ||||||
| 	#if MG_COMPILE_GLES | 	#if MG_COMPILE_GLES | ||||||
| 		case MG_GLES: | 		case MG_GLES: | ||||||
| 			surface = mg_egl_surface_create_remote(width, height); | 			surface = mg_egl_surface_create_remote(width, height); | ||||||
| 			break; | 			break; | ||||||
| 	#endif | 	#endif | ||||||
| 
 | 
 | ||||||
| 		default: | 		default: | ||||||
| 			break; | 			break; | ||||||
| 	} | 	} | ||||||
| 	if(surface) | 	if(surface) | ||||||
| 	{ | 	{ | ||||||
| 		surfaceHandle = mg_surface_handle_alloc(surface); | 		surfaceHandle = mg_surface_handle_alloc(surface); | ||||||
| 		mg_surface_prepare(surfaceHandle); | 		mg_surface_prepare(surfaceHandle); | ||||||
| 	} | 	} | ||||||
| 	return(surfaceHandle); | 	return(surfaceHandle); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| mg_surface mg_surface_create_host(mp_window window) | mg_surface mg_surface_create_host(mp_window window) | ||||||
| { | { | ||||||
| 	if(!__mgData.init) | 	if(!__mgData.init) | ||||||
| 	{ | 	{ | ||||||
| 		mg_init(); | 		mg_init(); | ||||||
| 	} | 	} | ||||||
| 	mg_surface handle = mg_surface_nil(); | 	mg_surface handle = mg_surface_nil(); | ||||||
| 	mg_surface_data* surface = 0; | 	mg_surface_data* surface = 0; | ||||||
| 	#if PLATFORM_MACOS | 	#if PLATFORM_MACOS | ||||||
| 		surface = mg_osx_surface_create_host(window); | 		surface = mg_osx_surface_create_host(window); | ||||||
| 	#elif PLATFORM_WINDOWS | 	#elif PLATFORM_WINDOWS | ||||||
| 		surface = mg_win32_surface_create_host(window); | 		surface = mg_win32_surface_create_host(window); | ||||||
| 	#endif | 	#endif | ||||||
| 
 | 
 | ||||||
| 	if(surface) | 	if(surface) | ||||||
| 	{ | 	{ | ||||||
| 		handle = mg_surface_handle_alloc(surface); | 		handle = mg_surface_handle_alloc(surface); | ||||||
| 	} | 	} | ||||||
| 	return(handle); | 	return(handle); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void mg_surface_destroy(mg_surface handle) | void mg_surface_destroy(mg_surface handle) | ||||||
| { | { | ||||||
| 	DEBUG_ASSERT(__mgData.init); | 	DEBUG_ASSERT(__mgData.init); | ||||||
| 	mg_surface_data* surface = mg_surface_data_from_handle(handle); | 	mg_surface_data* surface = mg_surface_data_from_handle(handle); | ||||||
| 	if(surface) | 	if(surface) | ||||||
| 	{ | 	{ | ||||||
| 		if(__mgSelectedSurface.h == handle.h) | 		if(__mgSelectedSurface.h == handle.h) | ||||||
| 		{ | 		{ | ||||||
| 			mg_surface_deselect(); | 			mg_surface_deselect(); | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
| 		if(surface->backend && surface->backend->destroy) | 		if(surface->backend && surface->backend->destroy) | ||||||
| 		{ | 		{ | ||||||
| 			surface->backend->destroy(surface->backend); | 			surface->backend->destroy(surface->backend); | ||||||
| 		} | 		} | ||||||
| 		surface->destroy(surface); | 		surface->destroy(surface); | ||||||
| 		mg_handle_recycle(handle.h); | 		mg_handle_recycle(handle.h); | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void mg_surface_deselect() | void mg_surface_deselect() | ||||||
| { | { | ||||||
| 	DEBUG_ASSERT(__mgData.init); | 	DEBUG_ASSERT(__mgData.init); | ||||||
| 
 | 
 | ||||||
| 	mg_surface_data* prevSurface = mg_surface_data_from_handle(__mgSelectedSurface); | 	mg_surface_data* prevSurface = mg_surface_data_from_handle(__mgSelectedSurface); | ||||||
| 	if(prevSurface && prevSurface->deselect) | 	if(prevSurface && prevSurface->deselect) | ||||||
| 	{ | 	{ | ||||||
| 		prevSurface->deselect(prevSurface); | 		prevSurface->deselect(prevSurface); | ||||||
| 	} | 	} | ||||||
| 	__mgSelectedSurface = mg_surface_nil(); | 	__mgSelectedSurface = mg_surface_nil(); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void mg_surface_prepare(mg_surface surface) | void mg_surface_prepare(mg_surface surface) | ||||||
| { | { | ||||||
| 	DEBUG_ASSERT(__mgData.init); | 	DEBUG_ASSERT(__mgData.init); | ||||||
| 
 | 
 | ||||||
| 	if(surface.h != __mgSelectedSurface.h) | 	if(surface.h != __mgSelectedSurface.h) | ||||||
| 	{ | 	{ | ||||||
| 		mg_surface_deselect(); | 		mg_surface_deselect(); | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	mg_surface_data* surfaceData = mg_surface_data_from_handle(surface); | 	mg_surface_data* surfaceData = mg_surface_data_from_handle(surface); | ||||||
| 	if(surfaceData && surfaceData->prepare) | 	if(surfaceData && surfaceData->prepare) | ||||||
| 	{ | 	{ | ||||||
| 		surfaceData->prepare(surfaceData); | 		surfaceData->prepare(surfaceData); | ||||||
| 		__mgSelectedSurface = surface; | 		__mgSelectedSurface = surface; | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void mg_surface_present(mg_surface surface) | void mg_surface_present(mg_surface surface) | ||||||
| { | { | ||||||
| 	DEBUG_ASSERT(__mgData.init); | 	DEBUG_ASSERT(__mgData.init); | ||||||
| 	mg_surface_data* surfaceData = mg_surface_data_from_handle(surface); | 	mg_surface_data* surfaceData = mg_surface_data_from_handle(surface); | ||||||
| 	if(surfaceData && surfaceData->present) | 	if(surfaceData && surfaceData->present) | ||||||
| 	{ | 	{ | ||||||
| 		surfaceData->present(surfaceData); | 		surfaceData->present(surfaceData); | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void mg_surface_swap_interval(mg_surface surface, int swap) | void mg_surface_swap_interval(mg_surface surface, int swap) | ||||||
| { | { | ||||||
| 	DEBUG_ASSERT(__mgData.init); | 	DEBUG_ASSERT(__mgData.init); | ||||||
| 	mg_surface_data* surfaceData = mg_surface_data_from_handle(surface); | 	mg_surface_data* surfaceData = mg_surface_data_from_handle(surface); | ||||||
| 	if(surfaceData && surfaceData->swapInterval) | 	if(surfaceData && surfaceData->swapInterval) | ||||||
| 	{ | 	{ | ||||||
| 		surfaceData->swapInterval(surfaceData, swap); | 		surfaceData->swapInterval(surfaceData, swap); | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| vec2 mg_surface_get_size(mg_surface surface) | vec2 mg_surface_get_size(mg_surface surface) | ||||||
| { | { | ||||||
| 	DEBUG_ASSERT(__mgData.init); | 	DEBUG_ASSERT(__mgData.init); | ||||||
| 	vec2 size = {0}; | 	vec2 size = {0}; | ||||||
| 	mg_surface_data* surfaceData = mg_surface_data_from_handle(surface); | 	mg_surface_data* surfaceData = mg_surface_data_from_handle(surface); | ||||||
| 	if(surfaceData && surfaceData->getSize) | 	if(surfaceData && surfaceData->getSize) | ||||||
| 	{ | 	{ | ||||||
| 		size = surfaceData->getSize(surfaceData); | 		size = surfaceData->getSize(surfaceData); | ||||||
| 	} | 	} | ||||||
| 	return(size); | 	return(size); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| vec2 mg_surface_contents_scaling(mg_surface surface) | vec2 mg_surface_contents_scaling(mg_surface surface) | ||||||
| { | { | ||||||
| 	DEBUG_ASSERT(__mgData.init); | 	DEBUG_ASSERT(__mgData.init); | ||||||
| 	vec2 scaling = {1, 1}; | 	vec2 scaling = {1, 1}; | ||||||
| 	mg_surface_data* surfaceData = mg_surface_data_from_handle(surface); | 	mg_surface_data* surfaceData = mg_surface_data_from_handle(surface); | ||||||
| 	if(surfaceData && surfaceData->contentsScaling) | 	if(surfaceData && surfaceData->contentsScaling) | ||||||
| 	{ | 	{ | ||||||
| 		scaling = surfaceData->contentsScaling(surfaceData); | 		scaling = surfaceData->contentsScaling(surfaceData); | ||||||
| 	} | 	} | ||||||
| 	return(scaling); | 	return(scaling); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void mg_surface_set_hidden(mg_surface surface, bool hidden) | void mg_surface_set_hidden(mg_surface surface, bool hidden) | ||||||
| { | { | ||||||
| 	DEBUG_ASSERT(__mgData.init); | 	DEBUG_ASSERT(__mgData.init); | ||||||
| 	mg_surface_data* surfaceData = mg_surface_data_from_handle(surface); | 	mg_surface_data* surfaceData = mg_surface_data_from_handle(surface); | ||||||
| 	if(surfaceData && surfaceData->setHidden) | 	if(surfaceData && surfaceData->setHidden) | ||||||
| 	{ | 	{ | ||||||
| 		surfaceData->setHidden(surfaceData, hidden); | 		surfaceData->setHidden(surfaceData, hidden); | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| bool mg_surface_get_hidden(mg_surface surface) | bool mg_surface_get_hidden(mg_surface surface) | ||||||
| { | { | ||||||
| 	DEBUG_ASSERT(__mgData.init); | 	DEBUG_ASSERT(__mgData.init); | ||||||
| 	bool res = false; | 	bool res = false; | ||||||
| 	mg_surface_data* surfaceData = mg_surface_data_from_handle(surface); | 	mg_surface_data* surfaceData = mg_surface_data_from_handle(surface); | ||||||
| 	if(surfaceData && surfaceData->getHidden) | 	if(surfaceData && surfaceData->getHidden) | ||||||
| 	{ | 	{ | ||||||
| 		res = surfaceData->getHidden(surfaceData); | 		res = surfaceData->getHidden(surfaceData); | ||||||
| 	} | 	} | ||||||
| 	return(res); | 	return(res); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void* mg_surface_native_layer(mg_surface surface) | void* mg_surface_native_layer(mg_surface surface) | ||||||
| { | { | ||||||
| 	void* res = 0; | 	void* res = 0; | ||||||
| 	mg_surface_data* surfaceData = mg_surface_data_from_handle(surface); | 	mg_surface_data* surfaceData = mg_surface_data_from_handle(surface); | ||||||
| 	if(surfaceData && surfaceData->nativeLayer) | 	if(surfaceData && surfaceData->nativeLayer) | ||||||
| 	{ | 	{ | ||||||
| 		res = surfaceData->nativeLayer(surfaceData); | 		res = surfaceData->nativeLayer(surfaceData); | ||||||
| 	} | 	} | ||||||
| 	return(res); | 	return(res); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| mg_surface_id mg_surface_remote_id(mg_surface handle) | mg_surface_id mg_surface_remote_id(mg_surface handle) | ||||||
| { | { | ||||||
| 	mg_surface_id remoteId = 0; | 	mg_surface_id remoteId = 0; | ||||||
| 	mg_surface_data* surface = mg_surface_data_from_handle(handle); | 	mg_surface_data* surface = mg_surface_data_from_handle(handle); | ||||||
| 	if(surface && surface->remoteID) | 	if(surface && surface->remoteID) | ||||||
| 	{ | 	{ | ||||||
| 		remoteId = surface->remoteID(surface); | 		remoteId = surface->remoteID(surface); | ||||||
| 	} | 	} | ||||||
| 	return(remoteId); | 	return(remoteId); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void mg_surface_host_connect(mg_surface handle, mg_surface_id remoteID) | void mg_surface_host_connect(mg_surface handle, mg_surface_id remoteID) | ||||||
| { | { | ||||||
| 	mg_surface_data* surface = mg_surface_data_from_handle(handle); | 	mg_surface_data* surface = mg_surface_data_from_handle(handle); | ||||||
| 	if(surface && surface->hostConnect) | 	if(surface && surface->hostConnect) | ||||||
| 	{ | 	{ | ||||||
| 		surface->hostConnect(surface, remoteID); | 		surface->hostConnect(surface, remoteID); | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void mg_surface_render_commands(mg_surface surface, | void mg_surface_render_commands(mg_surface surface, | ||||||
|                                 mg_color clearColor, |                                 mg_color clearColor, | ||||||
|                                 u32 primitiveCount, |                                 u32 primitiveCount, | ||||||
|                                 mg_primitive* primitives, |                                 mg_primitive* primitives, | ||||||
|                                 u32 eltCount, |                                 u32 eltCount, | ||||||
|                                 mg_path_elt* elements) |                                 mg_path_elt* elements) | ||||||
| { | { | ||||||
| 	mg_surface_data* surfaceData = mg_surface_data_from_handle(surface); | 	mg_surface_data* surfaceData = mg_surface_data_from_handle(surface); | ||||||
| 
 | 
 | ||||||
| 	if(surface.h != __mgSelectedSurface.h) | 	if(surface.h != __mgSelectedSurface.h) | ||||||
| 	{ | 	{ | ||||||
| 		log_error("surface is not selected. Make sure to call mg_surface_prepare() before drawing onto a surface.\n"); | 		log_error("surface is not selected. Make sure to call mg_surface_prepare() before drawing onto a surface.\n"); | ||||||
| 	} | 	} | ||||||
| 	else if(surfaceData && surfaceData->backend) | 	else if(surfaceData && surfaceData->backend) | ||||||
| 	{ | 	{ | ||||||
| 		surfaceData->backend->render(surfaceData->backend, | 		surfaceData->backend->render(surfaceData->backend, | ||||||
| 		                             clearColor, | 		                             clearColor, | ||||||
| 		                             primitiveCount, | 		                             primitiveCount, | ||||||
| 		                             primitives, | 		                             primitives, | ||||||
| 		                             eltCount, | 		                             eltCount, | ||||||
| 		                             elements); | 		                             elements); | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| //------------------------------------------------------------------------------------------
 | //------------------------------------------------------------------------------------------
 | ||||||
| //NOTE(martin): images
 | //NOTE(martin): images
 | ||||||
| //------------------------------------------------------------------------------------------
 | //------------------------------------------------------------------------------------------
 | ||||||
| 
 | 
 | ||||||
| vec2 mg_image_size(mg_image image) | vec2 mg_image_size(mg_image image) | ||||||
| { | { | ||||||
| 	vec2 res = {0}; | 	vec2 res = {0}; | ||||||
| 	mg_image_data* imageData = mg_image_data_from_handle(image); | 	mg_image_data* imageData = mg_image_data_from_handle(image); | ||||||
| 	if(imageData) | 	if(imageData) | ||||||
| 	{ | 	{ | ||||||
| 		res = imageData->size; | 		res = imageData->size; | ||||||
| 	} | 	} | ||||||
| 	return(res); | 	return(res); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| mg_image mg_image_create(mg_surface surface, u32 width, u32 height) | mg_image mg_image_create(mg_surface surface, u32 width, u32 height) | ||||||
| { | { | ||||||
| 	mg_image image = mg_image_nil(); | 	mg_image image = mg_image_nil(); | ||||||
| 	mg_surface_data* surfaceData = mg_surface_data_from_handle(surface); | 	mg_surface_data* surfaceData = mg_surface_data_from_handle(surface); | ||||||
| 
 | 
 | ||||||
| 	if(surface.h != __mgSelectedSurface.h) | 	if(surface.h != __mgSelectedSurface.h) | ||||||
| 	{ | 	{ | ||||||
| 		log_error("surface is not selected. Make sure to call mg_surface_prepare() before modifying graphics resources.\n"); | 		log_error("surface is not selected. Make sure to call mg_surface_prepare() before modifying graphics resources.\n"); | ||||||
| 	} | 	} | ||||||
| 	else if(surfaceData && surfaceData->backend) | 	else if(surfaceData && surfaceData->backend) | ||||||
| 	{ | 	{ | ||||||
| 		DEBUG_ASSERT(surfaceData->api == MG_CANVAS); | 		DEBUG_ASSERT(surfaceData->api == MG_CANVAS); | ||||||
| 
 | 
 | ||||||
| 		mg_image_data* imageData = surfaceData->backend->imageCreate(surfaceData->backend, (vec2){width, height}); | 		mg_image_data* imageData = surfaceData->backend->imageCreate(surfaceData->backend, (vec2){width, height}); | ||||||
| 		if(imageData) | 		if(imageData) | ||||||
| 		{ | 		{ | ||||||
| 			imageData->surface = surface; | 			imageData->surface = surface; | ||||||
| 			image = mg_image_handle_alloc(imageData); | 			image = mg_image_handle_alloc(imageData); | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| 	return(image); | 	return(image); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void mg_image_destroy(mg_image image) | void mg_image_destroy(mg_image image) | ||||||
| { | { | ||||||
| 	mg_image_data* imageData = mg_image_data_from_handle(image); | 	mg_image_data* imageData = mg_image_data_from_handle(image); | ||||||
| 
 | 
 | ||||||
| 	if(imageData) | 	if(imageData) | ||||||
| 	{ | 	{ | ||||||
| 		if(imageData->surface.h != __mgSelectedSurface.h) | 		if(imageData->surface.h != __mgSelectedSurface.h) | ||||||
| 		{ | 		{ | ||||||
| 			log_error("surface is not selected. Make sure to call mg_surface_prepare() before modifying graphics resources.\n"); | 			log_error("surface is not selected. Make sure to call mg_surface_prepare() before modifying graphics resources.\n"); | ||||||
| 		} | 		} | ||||||
| 		else | 		else | ||||||
| 		{ | 		{ | ||||||
| 			mg_surface_data* surface = mg_surface_data_from_handle(imageData->surface); | 			mg_surface_data* surface = mg_surface_data_from_handle(imageData->surface); | ||||||
| 			if(surface && surface->backend) | 			if(surface && surface->backend) | ||||||
| 			{ | 			{ | ||||||
| 				surface->backend->imageDestroy(surface->backend, imageData); | 				surface->backend->imageDestroy(surface->backend, imageData); | ||||||
| 				mg_handle_recycle(image.h); | 				mg_handle_recycle(image.h); | ||||||
| 			} | 			} | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void mg_image_upload_region_rgba8(mg_image image, mp_rect region, u8* pixels) | void mg_image_upload_region_rgba8(mg_image image, mp_rect region, u8* pixels) | ||||||
| { | { | ||||||
| 	mg_image_data* imageData = mg_image_data_from_handle(image); | 	mg_image_data* imageData = mg_image_data_from_handle(image); | ||||||
| 
 | 
 | ||||||
| 	if(imageData) | 	if(imageData) | ||||||
| 	{ | 	{ | ||||||
| 		if(imageData->surface.h != __mgSelectedSurface.h) | 		if(imageData->surface.h != __mgSelectedSurface.h) | ||||||
| 		{ | 		{ | ||||||
| 			log_error("surface is not selected. Make sure to call mg_surface_prepare() before modifying graphics resources.\n"); | 			log_error("surface is not selected. Make sure to call mg_surface_prepare() before modifying graphics resources.\n"); | ||||||
| 		} | 		} | ||||||
| 		else | 		else | ||||||
| 		{ | 		{ | ||||||
| 			mg_surface_data* surfaceData = mg_surface_data_from_handle(imageData->surface); | 			mg_surface_data* surfaceData = mg_surface_data_from_handle(imageData->surface); | ||||||
| 			if(surfaceData) | 			if(surfaceData) | ||||||
| 			{ | 			{ | ||||||
| 				DEBUG_ASSERT(surfaceData->backend); | 				DEBUG_ASSERT(surfaceData->backend); | ||||||
| 				surfaceData->backend->imageUploadRegion(surfaceData->backend, imageData, region, pixels); | 				surfaceData->backend->imageUploadRegion(surfaceData->backend, imageData, region, pixels); | ||||||
| 			} | 			} | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
|  | @ -1,112 +1,112 @@ | ||||||
| /************************************************************//**
 | /************************************************************//**
 | ||||||
| * | * | ||||||
| *	@file: graphics_surface.h | *	@file: graphics_surface.h | ||||||
| *	@author: Martin Fouilleul | *	@author: Martin Fouilleul | ||||||
| *	@date: 26/04/2023 | *	@date: 26/04/2023 | ||||||
| * | * | ||||||
| *****************************************************************/ | *****************************************************************/ | ||||||
| #ifndef __GRAPHICS_SURFACE_H_ | #ifndef __GRAPHICS_SURFACE_H_ | ||||||
| #define __GRAPHICS_SURFACE_H_ | #define __GRAPHICS_SURFACE_H_ | ||||||
| 
 | 
 | ||||||
| #include"graphics_common.h" | #include"graphics_common.h" | ||||||
| #include"mp_app_internal.h" | #include"app/mp_app_internal.h" | ||||||
| 
 | 
 | ||||||
| #ifdef __cplusplus | #ifdef __cplusplus | ||||||
| extern "C" { | extern "C" { | ||||||
| #endif | #endif | ||||||
| 
 | 
 | ||||||
| //---------------------------------------------------------------
 | //---------------------------------------------------------------
 | ||||||
| // surface interface
 | // surface interface
 | ||||||
| //---------------------------------------------------------------
 | //---------------------------------------------------------------
 | ||||||
| typedef struct mg_surface_data mg_surface_data; | typedef struct mg_surface_data mg_surface_data; | ||||||
| typedef struct mg_canvas_backend mg_canvas_backend; | typedef struct mg_canvas_backend mg_canvas_backend; | ||||||
| 
 | 
 | ||||||
| typedef void (*mg_surface_destroy_proc)(mg_surface_data* surface); | typedef void (*mg_surface_destroy_proc)(mg_surface_data* surface); | ||||||
| typedef void (*mg_surface_prepare_proc)(mg_surface_data* surface); | typedef void (*mg_surface_prepare_proc)(mg_surface_data* surface); | ||||||
| typedef void (*mg_surface_deselect_proc)(mg_surface_data* surface); | typedef void (*mg_surface_deselect_proc)(mg_surface_data* surface); | ||||||
| typedef void (*mg_surface_present_proc)(mg_surface_data* surface); | typedef void (*mg_surface_present_proc)(mg_surface_data* surface); | ||||||
| typedef void (*mg_surface_swap_interval_proc)(mg_surface_data* surface, int swap); | typedef void (*mg_surface_swap_interval_proc)(mg_surface_data* surface, int swap); | ||||||
| typedef vec2 (*mg_surface_get_size_proc)(mg_surface_data* surface); | typedef vec2 (*mg_surface_get_size_proc)(mg_surface_data* surface); | ||||||
| typedef vec2 (*mg_surface_contents_scaling_proc)(mg_surface_data* surface); | typedef vec2 (*mg_surface_contents_scaling_proc)(mg_surface_data* surface); | ||||||
| typedef bool (*mg_surface_get_hidden_proc)(mg_surface_data* surface); | typedef bool (*mg_surface_get_hidden_proc)(mg_surface_data* surface); | ||||||
| typedef void (*mg_surface_set_hidden_proc)(mg_surface_data* surface, bool hidden); | typedef void (*mg_surface_set_hidden_proc)(mg_surface_data* surface, bool hidden); | ||||||
| typedef void* (*mg_surface_native_layer_proc)(mg_surface_data* surface); | typedef void* (*mg_surface_native_layer_proc)(mg_surface_data* surface); | ||||||
| typedef mg_surface_id (*mg_surface_remote_id_proc)(mg_surface_data* surface); | typedef mg_surface_id (*mg_surface_remote_id_proc)(mg_surface_data* surface); | ||||||
| typedef void (*mg_surface_host_connect_proc)(mg_surface_data* surface, mg_surface_id remoteId); | typedef void (*mg_surface_host_connect_proc)(mg_surface_data* surface, mg_surface_id remoteId); | ||||||
| 
 | 
 | ||||||
| typedef struct mg_surface_data | typedef struct mg_surface_data | ||||||
| { | { | ||||||
| 	mg_surface_api api; | 	mg_surface_api api; | ||||||
| 	mp_layer layer; | 	mp_layer layer; | ||||||
| 
 | 
 | ||||||
| 	mg_surface_destroy_proc destroy; | 	mg_surface_destroy_proc destroy; | ||||||
| 	mg_surface_prepare_proc prepare; | 	mg_surface_prepare_proc prepare; | ||||||
| 	mg_surface_present_proc present; | 	mg_surface_present_proc present; | ||||||
| 	mg_surface_deselect_proc deselect; | 	mg_surface_deselect_proc deselect; | ||||||
| 	mg_surface_swap_interval_proc swapInterval; | 	mg_surface_swap_interval_proc swapInterval; | ||||||
| 	mg_surface_get_size_proc getSize; | 	mg_surface_get_size_proc getSize; | ||||||
| 	mg_surface_contents_scaling_proc contentsScaling; | 	mg_surface_contents_scaling_proc contentsScaling; | ||||||
| 	mg_surface_get_hidden_proc getHidden; | 	mg_surface_get_hidden_proc getHidden; | ||||||
| 	mg_surface_set_hidden_proc setHidden; | 	mg_surface_set_hidden_proc setHidden; | ||||||
| 	mg_surface_native_layer_proc nativeLayer; | 	mg_surface_native_layer_proc nativeLayer; | ||||||
| 	mg_surface_remote_id_proc remoteID; | 	mg_surface_remote_id_proc remoteID; | ||||||
| 	mg_surface_host_connect_proc hostConnect; | 	mg_surface_host_connect_proc hostConnect; | ||||||
| 
 | 
 | ||||||
| 	mg_canvas_backend* backend; | 	mg_canvas_backend* backend; | ||||||
| 
 | 
 | ||||||
| } mg_surface_data; | } mg_surface_data; | ||||||
| 
 | 
 | ||||||
| mg_surface mg_surface_alloc_handle(mg_surface_data* surface); | mg_surface mg_surface_alloc_handle(mg_surface_data* surface); | ||||||
| mg_surface_data* mg_surface_data_from_handle(mg_surface handle); | mg_surface_data* mg_surface_data_from_handle(mg_surface handle); | ||||||
| 
 | 
 | ||||||
| void mg_surface_init_for_window(mg_surface_data* surface, mp_window_data* window); | void mg_surface_init_for_window(mg_surface_data* surface, mp_window_data* window); | ||||||
| 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); | ||||||
| void mg_surface_init_host(mg_surface_data* surface, mp_window_data* window); | void mg_surface_init_host(mg_surface_data* surface, mp_window_data* window); | ||||||
| void mg_surface_cleanup(mg_surface_data* surface); | void mg_surface_cleanup(mg_surface_data* surface); | ||||||
| void* mg_surface_native_layer(mg_surface surface); | void* mg_surface_native_layer(mg_surface surface); | ||||||
| 
 | 
 | ||||||
| //---------------------------------------------------------------
 | //---------------------------------------------------------------
 | ||||||
| // canvas backend interface
 | // canvas backend interface
 | ||||||
| //---------------------------------------------------------------
 | //---------------------------------------------------------------
 | ||||||
| typedef struct mg_image_data | typedef struct mg_image_data | ||||||
| { | { | ||||||
| 	list_elt listElt; | 	list_elt listElt; | ||||||
| 	u32 generation; | 	u32 generation; | ||||||
| 	mg_surface surface; | 	mg_surface surface; | ||||||
| 	vec2 size; | 	vec2 size; | ||||||
| 
 | 
 | ||||||
| } mg_image_data; | } mg_image_data; | ||||||
| 
 | 
 | ||||||
| typedef void (*mg_canvas_backend_destroy_proc)(mg_canvas_backend* backend); | typedef void (*mg_canvas_backend_destroy_proc)(mg_canvas_backend* backend); | ||||||
| 
 | 
 | ||||||
| typedef mg_image_data* (*mg_canvas_backend_image_create_proc)(mg_canvas_backend* backend, vec2 size); | typedef mg_image_data* (*mg_canvas_backend_image_create_proc)(mg_canvas_backend* backend, vec2 size); | ||||||
| typedef void (*mg_canvas_backend_image_destroy_proc)(mg_canvas_backend* backend, mg_image_data* image); | typedef void (*mg_canvas_backend_image_destroy_proc)(mg_canvas_backend* backend, mg_image_data* image); | ||||||
| typedef void (*mg_canvas_backend_image_upload_region_proc)(mg_canvas_backend* backend, | typedef void (*mg_canvas_backend_image_upload_region_proc)(mg_canvas_backend* backend, | ||||||
|                                                            mg_image_data* image, |                                                            mg_image_data* image, | ||||||
|                                                            mp_rect region, |                                                            mp_rect region, | ||||||
|                                                            u8* pixels); |                                                            u8* pixels); | ||||||
| 
 | 
 | ||||||
| typedef void (*mg_canvas_backend_render_proc)(mg_canvas_backend* backend, | typedef void (*mg_canvas_backend_render_proc)(mg_canvas_backend* backend, | ||||||
|                                               mg_color clearColor, |                                               mg_color clearColor, | ||||||
|                                               u32 primitiveCount, |                                               u32 primitiveCount, | ||||||
|                                               mg_primitive* primitives, |                                               mg_primitive* primitives, | ||||||
|                                               u32 eltCount, |                                               u32 eltCount, | ||||||
|                                               mg_path_elt* pathElements); |                                               mg_path_elt* pathElements); | ||||||
| 
 | 
 | ||||||
| typedef struct mg_canvas_backend | typedef struct mg_canvas_backend | ||||||
| { | { | ||||||
| 	mg_canvas_backend_destroy_proc destroy; | 	mg_canvas_backend_destroy_proc destroy; | ||||||
| 
 | 
 | ||||||
| 	mg_canvas_backend_image_create_proc imageCreate; | 	mg_canvas_backend_image_create_proc imageCreate; | ||||||
| 	mg_canvas_backend_image_destroy_proc imageDestroy; | 	mg_canvas_backend_image_destroy_proc imageDestroy; | ||||||
| 	mg_canvas_backend_image_upload_region_proc imageUploadRegion; | 	mg_canvas_backend_image_upload_region_proc imageUploadRegion; | ||||||
| 
 | 
 | ||||||
| 	mg_canvas_backend_render_proc render; | 	mg_canvas_backend_render_proc render; | ||||||
| 
 | 
 | ||||||
| } mg_canvas_backend; | } mg_canvas_backend; | ||||||
| 
 | 
 | ||||||
| #ifdef __cplusplus | #ifdef __cplusplus | ||||||
| } // extern "C"
 | } // extern "C"
 | ||||||
| #endif | #endif | ||||||
| 
 | 
 | ||||||
| #endif //__GRAPHICS_SURFACE_H_
 | #endif //__GRAPHICS_SURFACE_H_
 | ||||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							|  | @ -12,8 +12,8 @@ | ||||||
| #include<simd/simd.h> | #include<simd/simd.h> | ||||||
| 
 | 
 | ||||||
| #include"graphics_surface.h" | #include"graphics_surface.h" | ||||||
| #include"macro_helpers.h" | #include"util/macro_helpers.h" | ||||||
| #include"osx_app.h" | #include"app/osx_app.h" | ||||||
| 
 | 
 | ||||||
| typedef struct mg_mtl_surface | typedef struct mg_mtl_surface | ||||||
| { | { | ||||||
|  | @ -6,12 +6,12 @@ | ||||||
| *	@revision: | *	@revision: | ||||||
| * | * | ||||||
| *****************************************************************/ | *****************************************************************/ | ||||||
| #include"win32_app.h" | #include"app/win32_app.h" | ||||||
| #include"graphics_surface.h" | #include"graphics_surface.h" | ||||||
| #include"gl_loader.h" | #include"gl_loader.h" | ||||||
| 
 | 
 | ||||||
| #include<GL/wglext.h> | #include<GL/wglext.h> | ||||||
| #include"macro_helpers.h" | #include"util/macro_helpers.h" | ||||||
| 
 | 
 | ||||||
| #define WGL_PROC_LIST \ | #define WGL_PROC_LIST \ | ||||||
| 	WGL_PROC(WGLCHOOSEPIXELFORMATARB, wglChoosePixelFormatARB) \ | 	WGL_PROC(WGLCHOOSEPIXELFORMATARB, wglChoosePixelFormatARB) \ | ||||||
|  | @ -60,24 +60,24 @@ | ||||||
| //---------------------------------------------------------------
 | //---------------------------------------------------------------
 | ||||||
| 
 | 
 | ||||||
| #if PLATFORM_WINDOWS | #if PLATFORM_WINDOWS | ||||||
| 	#include"win32_app.c" | 	#include"app/win32_app.c" | ||||||
| 	#include"graphics_common.c" | 	#include"graphics/graphics_common.c" | ||||||
| 	#include"graphics_surface.c" | 	#include"graphics/graphics_surface.c" | ||||||
| 
 | 
 | ||||||
| 	#if MG_COMPILE_GL || MG_COMPILE_GLES | 	#if MG_COMPILE_GL || MG_COMPILE_GLES | ||||||
| 		#include"gl_loader.c" | 		#include"graphics/gl_loader.c" | ||||||
| 	#endif | 	#endif | ||||||
| 
 | 
 | ||||||
| 	#if MG_COMPILE_GL | 	#if MG_COMPILE_GL | ||||||
| 		#include"wgl_surface.c" | 		#include"graphics/wgl_surface.c" | ||||||
| 	#endif | 	#endif | ||||||
| 
 | 
 | ||||||
| 	#if MG_COMPILE_CANVAS | 	#if MG_COMPILE_CANVAS | ||||||
| 		#include"gl_canvas.c" | 		#include"graphics/gl_canvas.c" | ||||||
| 	#endif | 	#endif | ||||||
| 
 | 
 | ||||||
| 	#if MG_COMPILE_GLES | 	#if MG_COMPILE_GLES | ||||||
| 		#include"egl_surface.c" | 		#include"graphics/egl_surface.c" | ||||||
| 	#endif | 	#endif | ||||||
| 
 | 
 | ||||||
| #elif PLATFORM_MACOS | #elif PLATFORM_MACOS | ||||||
|  | @ -86,5 +86,5 @@ | ||||||
| 	#error "Unsupported platform" | 	#error "Unsupported platform" | ||||||
| #endif | #endif | ||||||
| 
 | 
 | ||||||
| #include"input_state.c" | #include"ui/input_state.c" | ||||||
| #include"ui.c" | #include"ui/ui.c" | ||||||
|  |  | ||||||
|  | @ -38,15 +38,13 @@ | ||||||
| //----------------------------------------------------------------
 | //----------------------------------------------------------------
 | ||||||
| // application/graphics layer
 | // application/graphics layer
 | ||||||
| //----------------------------------------------------------------
 | //----------------------------------------------------------------
 | ||||||
| #include"mp_app.h" | #include"app/mp_app.h" | ||||||
| #include"graphics.h" | #include"graphics/graphics.h" | ||||||
| #include"input_state.h" | #include"ui/input_state.h" | ||||||
| #include"ui.h" | #include"ui/ui.h" | ||||||
| 
 | 
 | ||||||
| #ifdef MG_INCLUDE_GL_API | #ifdef MG_INCLUDE_GL_API | ||||||
| 	#include"gl_api.h" | 	#include"graphics/gl_api.h" | ||||||
| #endif | #endif | ||||||
| 
 | 
 | ||||||
| //#include"ui.h"
 |  | ||||||
| 
 |  | ||||||
| #endif //__MILEPOST_H_
 | #endif //__MILEPOST_H_
 | ||||||
|  |  | ||||||
|  | @ -7,20 +7,20 @@ | ||||||
| * | * | ||||||
| *****************************************************************/ | *****************************************************************/ | ||||||
| 
 | 
 | ||||||
| #include"osx_path.m" | #include"platform/osx_path.m" | ||||||
| #include"osx_app.m" | #include"app/osx_app.m" | ||||||
| #include"graphics_common.c" | #include"graphics/graphics_common.c" | ||||||
| #include"graphics_surface.c" | #include"graphics/graphics_surface.c" | ||||||
| 
 | 
 | ||||||
| #if MG_COMPILE_METAL | #if MG_COMPILE_METAL | ||||||
| 	#include"mtl_surface.m" | 	#include"graphics/mtl_surface.m" | ||||||
| #endif | #endif | ||||||
| 
 | 
 | ||||||
| #if MG_COMPILE_CANVAS | #if MG_COMPILE_CANVAS | ||||||
| 	#include"mtl_renderer.m" | 	#include"graphics/mtl_renderer.m" | ||||||
| #endif | #endif | ||||||
| 
 | 
 | ||||||
| #if MG_COMPILE_GLES | #if MG_COMPILE_GLES | ||||||
| 	#include"gl_loader.c" | 	#include"graphics/gl_loader.c" | ||||||
| 	#include"egl_surface.c" | 	#include"graphics/egl_surface.c" | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
|  | @ -12,7 +12,7 @@ | ||||||
| #include"util/typedefs.h" | #include"util/typedefs.h" | ||||||
| #include"util/strings.h" | #include"util/strings.h" | ||||||
| #include"util/utf8.h" | #include"util/utf8.h" | ||||||
| #include"mp_app.h" | #include"app/mp_app.h" | ||||||
| 
 | 
 | ||||||
| typedef struct mp_key_state | typedef struct mp_key_state | ||||||
| { | { | ||||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							|  | @ -1,5 +1,4 @@ | ||||||
| #include <keys.h> | #include <keys.h> | ||||||
| #include <graphics.h> |  | ||||||
| #include <math.h> | #include <math.h> | ||||||
| 
 | 
 | ||||||
| #include <orca.h> | #include <orca.h> | ||||||
|  |  | ||||||
|  | @ -11,6 +11,7 @@ else | ||||||
|   CLANG=clang |   CLANG=clang | ||||||
| fi | fi | ||||||
| 
 | 
 | ||||||
|  | ORCA_DIR=../.. | ||||||
| STDLIB_DIR=../../cstdlib | STDLIB_DIR=../../cstdlib | ||||||
| ORCA_SDK_DIR=../../sdk | ORCA_SDK_DIR=../../sdk | ||||||
| MILEPOST_DIR=../../milepost | MILEPOST_DIR=../../milepost | ||||||
|  | @ -25,6 +26,7 @@ wasmFlags="--target=wasm32 \ | ||||||
|   -mbulk-memory \ |   -mbulk-memory \ | ||||||
|   -D__ORCA__ \ |   -D__ORCA__ \ | ||||||
|   -I $STDLIB_DIR/include \ |   -I $STDLIB_DIR/include \ | ||||||
|  |   -I $ORCA_DIR/ext \ | ||||||
|   -I $ORCA_SDK_DIR \ |   -I $ORCA_SDK_DIR \ | ||||||
|   -I $MILEPOST_DIR/ext -I $MILEPOST_DIR -I $MILEPOST_DIR/src" |   -I $MILEPOST_DIR/ext -I $MILEPOST_DIR -I $MILEPOST_DIR/src" | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -1,5 +1,4 @@ | ||||||
| #include <keys.h> | #include <keys.h> | ||||||
| #include <graphics.h> |  | ||||||
| #include <math.h> | #include <math.h> | ||||||
| 
 | 
 | ||||||
| #include <orca.h> | #include <orca.h> | ||||||
|  |  | ||||||
|  | @ -11,6 +11,8 @@ else | ||||||
|   CLANG=clang |   CLANG=clang | ||||||
| fi | fi | ||||||
| 
 | 
 | ||||||
|  | ORCA_DIR=../.. | ||||||
|  | 
 | ||||||
| wasmFlags="--target=wasm32 \ | wasmFlags="--target=wasm32 \ | ||||||
|   --no-standard-libraries \ |   --no-standard-libraries \ | ||||||
|   -fno-builtin \ |   -fno-builtin \ | ||||||
|  | @ -20,6 +22,7 @@ wasmFlags="--target=wasm32 \ | ||||||
|   -O2 \ |   -O2 \ | ||||||
|   -mbulk-memory \ |   -mbulk-memory \ | ||||||
|   -D__ORCA__ \ |   -D__ORCA__ \ | ||||||
|  |   -I $ORCA_DIR/ext \ | ||||||
|   -isystem ../../cstdlib/include -I ../../sdk -I../../milepost/ext -I ../../milepost -I ../../milepost/src" |   -isystem ../../cstdlib/include -I ../../sdk -I../../milepost/ext -I ../../milepost -I ../../milepost/src" | ||||||
| 
 | 
 | ||||||
| $CLANG $wasmFlags -o ./module.wasm ../../sdk/orca.c ../../cstdlib/src/*.c src/main.c | $CLANG $wasmFlags -o ./module.wasm ../../sdk/orca.c ../../cstdlib/src/*.c src/main.c | ||||||
|  |  | ||||||
|  | @ -1,6 +1,4 @@ | ||||||
| #include"keys.h" | #include"keys.h" | ||||||
| #include"graphics.h" |  | ||||||
| #include"ui.h" |  | ||||||
| 
 | 
 | ||||||
| #include"orca.h" | #include"orca.h" | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -168,7 +168,7 @@ def build_milepost_lib_mac(release): | ||||||
|         # TODO: shaderFlagParam |         # TODO: shaderFlagParam | ||||||
|         "-fno-fast-math", "-c", |         "-fno-fast-math", "-c", | ||||||
|         "-o", "../build/mtl_renderer.air", |         "-o", "../build/mtl_renderer.air", | ||||||
|         "src/mtl_renderer.metal", |         "src/graphics/mtl_renderer.metal", | ||||||
|     ], check=True) |     ], check=True) | ||||||
|     subprocess.run([ |     subprocess.run([ | ||||||
|         "xcrun", "-sdk", "macosx", "metallib", |         "xcrun", "-sdk", "macosx", "metallib", | ||||||
|  | @ -302,7 +302,8 @@ def build_orca_win(release): | ||||||
|     includes = [ |     includes = [ | ||||||
|         "/I", "src", |         "/I", "src", | ||||||
|         "/I", "sdk", |         "/I", "sdk", | ||||||
|         "/I", "ext" |         "/I", "ext", | ||||||
|  |         "/I", "ext/angle/include", | ||||||
|         "/I", "ext/wasm3/source", |         "/I", "ext/wasm3/source", | ||||||
|         "/I", "milepost/src" |         "/I", "milepost/src" | ||||||
|     ] |     ] | ||||||
|  | @ -332,6 +333,7 @@ def build_orca_mac(release): | ||||||
|         "-Imilepost/src/util", |         "-Imilepost/src/util", | ||||||
|         "-Imilepost/src/platform", |         "-Imilepost/src/platform", | ||||||
|         "-Iext", |         "-Iext", | ||||||
|  |         "-Iext/angle/include", | ||||||
|         "-Iext/wasm3/source" |         "-Iext/wasm3/source" | ||||||
|     ] |     ] | ||||||
|     libs = ["-Lbuild/bin", "-Lbuild/lib", "-lmilepost", "-lwasm3"] |     libs = ["-Lbuild/bin", "-Lbuild/lib", "-lmilepost", "-lwasm3"] | ||||||
|  | @ -380,12 +382,12 @@ def gen_all_bindings(): | ||||||
| 
 | 
 | ||||||
|     bindgen("canvas", "src/canvas_api.json", |     bindgen("canvas", "src/canvas_api.json", | ||||||
|         guest_stubs="sdk/orca_surface.c", |         guest_stubs="sdk/orca_surface.c", | ||||||
|         guest_include="graphics.h", |         guest_include="graphics/graphics.h", | ||||||
|         wasm3_bindings="src/canvas_api_bind_gen.c", |         wasm3_bindings="src/canvas_api_bind_gen.c", | ||||||
|     ) |     ) | ||||||
|     bindgen("clock", "src/clock_api.json", |     bindgen("clock", "src/clock_api.json", | ||||||
|         guest_stubs="sdk/orca_clock.c", |         guest_stubs="sdk/orca_clock.c", | ||||||
|         guest_include="platform_clock.h", |         guest_include="platform/platform_clock.h", | ||||||
|         wasm3_bindings="src/clock_api_bind_gen.c", |         wasm3_bindings="src/clock_api_bind_gen.c", | ||||||
|     ) |     ) | ||||||
|     bindgen("io", "src/io_api.json", |     bindgen("io", "src/io_api.json", | ||||||
|  |  | ||||||
|  | @ -18,10 +18,10 @@ | ||||||
| #include"util/strings.c" | #include"util/strings.c" | ||||||
| #include"util/utf8.c" | #include"util/utf8.c" | ||||||
| 
 | 
 | ||||||
| #include"graphics_common.c" | #include"graphics/graphics_common.c" | ||||||
| #include"input_state.c" | #include"ui/input_state.c" | ||||||
|  | #include"ui/ui.c" | ||||||
|  | 
 | ||||||
| #include"orca_exports.c" | #include"orca_exports.c" | ||||||
| #include"orca_surface.c" | #include"orca_surface.c" | ||||||
| #include"ui.c" |  | ||||||
| 
 |  | ||||||
| #include"io_stubs.c" | #include"io_stubs.c" | ||||||
|  |  | ||||||
|  | @ -21,7 +21,10 @@ | ||||||
| 
 | 
 | ||||||
| #include"math.h" | #include"math.h" | ||||||
| 
 | 
 | ||||||
| #include"graphics.h" | #include"graphics/graphics.h" | ||||||
|  | #include"ui/input_state.h" | ||||||
|  | #include"ui/ui.h" | ||||||
|  | 
 | ||||||
| #include"gl31.h" | #include"gl31.h" | ||||||
| 
 | 
 | ||||||
| #if COMPILER_CLANG | #if COMPILER_CLANG | ||||||
|  |  | ||||||
|  | @ -11,7 +11,7 @@ | ||||||
| 
 | 
 | ||||||
| #define MG_INCLUDE_GL_API | #define MG_INCLUDE_GL_API | ||||||
| #include"milepost.h" | #include"milepost.h" | ||||||
| #include"graphics_common.h" | #include"graphics/graphics_common.h" | ||||||
| 
 | 
 | ||||||
| #include"orca_app.h" | #include"orca_app.h" | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue