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_ | ||||
| 
 | ||||
| #include"mp_app.h" | ||||
| #include"graphics.h" | ||||
| #include"graphics/graphics.h" | ||||
| 
 | ||||
| #ifdef __OBJC__ | ||||
| 	#import<Cocoa/Cocoa.h> | ||||
|  | @ -18,7 +18,7 @@ | |||
| #include"macro_helpers.h" | ||||
| #include"platform_log.h" | ||||
| #include"platform_clock.h" | ||||
| #include"graphics_surface.h" | ||||
| #include"graphics/graphics_surface.h" | ||||
| 
 | ||||
| #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"?> | ||||
| <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 | ||||
|     version="0.0.0.1" | ||||
|     processorArchitecture="*" | ||||
|     name="forkingpaths.orca.runtime" | ||||
|     type="win32" | ||||
| /> | ||||
| <description>Orca Runtime</description> | ||||
| <dependency> | ||||
|     <dependentAssembly> | ||||
|         <assemblyIdentity | ||||
|             type="win32" | ||||
|             name="Microsoft.Windows.Common-Controls" | ||||
|             version="6.0.0.0" | ||||
|             processorArchitecture="*" | ||||
|             publicKeyToken="6595b64144ccf1df" | ||||
|             language="*" | ||||
|         /> | ||||
|     </dependentAssembly> | ||||
| </dependency> | ||||
| </assembly> | ||||
| <?xml version="1.0" encoding="UTF-8" standalone="yes"?> | ||||
| <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 | ||||
|     version="0.0.0.1" | ||||
|     processorArchitecture="*" | ||||
|     name="forkingpaths.orca.runtime" | ||||
|     type="win32" | ||||
| /> | ||||
| <description>Orca Runtime</description> | ||||
| <dependency> | ||||
|     <dependentAssembly> | ||||
|         <assemblyIdentity | ||||
|             type="win32" | ||||
|             name="Microsoft.Windows.Common-Controls" | ||||
|             version="6.0.0.0" | ||||
|             processorArchitecture="*" | ||||
|             publicKeyToken="6595b64144ccf1df" | ||||
|             language="*" | ||||
|         /> | ||||
|     </dependentAssembly> | ||||
| </dependency> | ||||
| </assembly> | ||||
|  | @ -10,7 +10,7 @@ | |||
| #define EGL_EGLEXT_PROTOTYPES | ||||
| #include<EGL/egl.h> | ||||
| #include<EGL/eglext.h> | ||||
| #include"mp_app_internal.h" | ||||
| #include"app/mp_app_internal.h" | ||||
| #include"graphics_surface.h" | ||||
| #include"gl_loader.h" | ||||
| 
 | ||||
|  | @ -10,7 +10,7 @@ | |||
| #define __EGL_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_remote(u32 width, u32 height); | ||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							|  | @ -1,330 +1,330 @@ | |||
| /************************************************************//**
 | ||||
| * | ||||
| *	@file: graphics.h | ||||
| *	@author: Martin Fouilleul | ||||
| *	@date: 23/01/2023 | ||||
| *	@revision: | ||||
| * | ||||
| *****************************************************************/ | ||||
| #ifndef __GRAPHICS_H_ | ||||
| #define __GRAPHICS_H_ | ||||
| 
 | ||||
| #include"util/typedefs.h" | ||||
| #include"platform/platform.h" | ||||
| #include"mp_app.h" | ||||
| 
 | ||||
| //------------------------------------------------------------------------------------------
 | ||||
| //NOTE(martin): backends selection
 | ||||
| //------------------------------------------------------------------------------------------
 | ||||
| 
 | ||||
| typedef enum { | ||||
| 	MG_NONE, | ||||
| 	MG_METAL, | ||||
| 	MG_GL, | ||||
| 	MG_GLES, | ||||
| 	MG_CANVAS, | ||||
| 	MG_HOST } mg_surface_api; | ||||
| 
 | ||||
| //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
 | ||||
| #if PLATFORM_MACOS | ||||
| 	#ifndef MG_COMPILE_METAL | ||||
| 		#define MG_COMPILE_METAL 1 | ||||
| 	#endif | ||||
| 
 | ||||
| 	#ifndef MG_COMPILE_GLES | ||||
| 		#define MG_COMPILE_GLES 1 | ||||
| 	#endif | ||||
| 
 | ||||
| 	#ifndef MG_COMPILE_CANVAS | ||||
| 		#if !MG_COMPILE_METAL | ||||
| 			#error "Canvas surface requires a Metal backend on macOS. Make sure you define MG_COMPILE_METAL to 1." | ||||
| 		#endif | ||||
| 		#define MG_COMPILE_CANVAS 1 | ||||
| 	#endif | ||||
| 
 | ||||
| 	#define MG_COMPILE_GL 0 | ||||
| 
 | ||||
| #elif PLATFORM_WINDOWS | ||||
| 	#ifndef MG_COMPILE_GL | ||||
| 		#define MG_COMPILE_GL 1 | ||||
| 	#endif | ||||
| 
 | ||||
| 	#ifndef MG_COMPILE_GLES | ||||
| 		#define MG_COMPILE_GLES 1 | ||||
| 	#endif | ||||
| 
 | ||||
| 	#ifndef MG_COMPILE_CANVAS | ||||
| 		#if !MG_COMPILE_GL | ||||
| 			#error "Canvas surface requires an OpenGL backend on Windows. Make sure you define MG_COMPILE_GL to 1." | ||||
| 		#endif | ||||
| 		#define MG_COMPILE_CANVAS 1 | ||||
| 	#endif | ||||
| 
 | ||||
| #elif PLATFORM_LINUX | ||||
| 	#ifndef MG_COMPILE_GL | ||||
| 		#define MG_COMPILE_GL 1 | ||||
| 	#endif | ||||
| 
 | ||||
| 	#ifndef MG_COMPILE_CANVAS | ||||
| 		#if !MG_COMPILE_GL | ||||
| 			#error "Canvas surface requires an OpenGL backend on Linux. Make sure you define MG_COMPILE_GL to 1." | ||||
| 		#endif | ||||
| 		#define MG_COMPILE_CANVAS 1 | ||||
| 	#endif | ||||
| #endif | ||||
| 
 | ||||
| //NOTE: these macros are used to select backend-specific APIs to include when using milepost
 | ||||
| #ifdef MG_EXPOSE_SURFACE_METAL | ||||
| 	#include"mtl_surface.h" | ||||
| #endif | ||||
| 
 | ||||
| #ifdef MG_EXPOSE_SURFACE_WGL | ||||
| 	#include"wgl_surface.h" | ||||
| #endif | ||||
| 
 | ||||
| //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
 | ||||
| 
 | ||||
| MP_API bool mg_is_surface_api_available(mg_surface_api api); | ||||
| 
 | ||||
| //------------------------------------------------------------------------------------------
 | ||||
| //NOTE(martin): graphics surface
 | ||||
| //------------------------------------------------------------------------------------------
 | ||||
| typedef struct mg_surface { u64 h; } mg_surface; | ||||
| 
 | ||||
| MP_API mg_surface mg_surface_nil(void); | ||||
| 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 void mg_surface_destroy(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_deselect(void); | ||||
| 
 | ||||
| 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_contents_scaling(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); | ||||
| 
 | ||||
| //NOTE(martin): surface sharing
 | ||||
| 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_host(mp_window window); | ||||
| 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); | ||||
| 
 | ||||
| //------------------------------------------------------------------------------------------
 | ||||
| //NOTE(martin): graphics canvas structs
 | ||||
| //------------------------------------------------------------------------------------------
 | ||||
| typedef struct mg_canvas { u64 h; } mg_canvas; | ||||
| typedef struct mg_font { u64 h; } mg_font; | ||||
| typedef struct mg_image { u64 h; } mg_image; | ||||
| 
 | ||||
| typedef struct mg_mat2x3 | ||||
| { | ||||
| 	f32 m[6]; | ||||
| } mg_mat2x3; | ||||
| 
 | ||||
| typedef struct mg_color | ||||
| { | ||||
| 	union | ||||
| 	{ | ||||
| 		struct | ||||
| 		{ | ||||
| 			f32 r; | ||||
| 			f32 g; | ||||
| 			f32 b; | ||||
| 			f32 a; | ||||
| 		}; | ||||
| 		f32 c[4]; | ||||
| 	}; | ||||
| } mg_color; | ||||
| 
 | ||||
| typedef enum {MG_JOINT_MITER = 0, | ||||
|               MG_JOINT_BEVEL, | ||||
| 	          MG_JOINT_NONE } mg_joint_type; | ||||
| 
 | ||||
| typedef enum {MG_CAP_NONE = 0, | ||||
|               MG_CAP_SQUARE } mg_cap_type; | ||||
| 
 | ||||
| typedef struct mg_font_extents | ||||
| { | ||||
| 	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 leading;   // spacing between one row's descent and the next row's ascent
 | ||||
| 	f32 xHeight;   // height of the lower case letter 'x'
 | ||||
| 	f32 capHeight; // height of the upper case letter 'M'
 | ||||
| 	f32 width;     // maximum width of the font
 | ||||
| 
 | ||||
| } mg_font_extents; | ||||
| 
 | ||||
| typedef struct mg_text_extents | ||||
| { | ||||
| 	f32 xBearing; | ||||
| 	f32 yBearing; | ||||
| 	f32 width; | ||||
| 	f32 height; | ||||
| 	f32 xAdvance; | ||||
| 	f32 yAdvance; | ||||
| 
 | ||||
| } mg_text_extents; | ||||
| 
 | ||||
| //------------------------------------------------------------------------------------------
 | ||||
| //NOTE(martin): graphics canvas
 | ||||
| //------------------------------------------------------------------------------------------
 | ||||
| MP_API mg_canvas mg_canvas_nil(void); | ||||
| MP_API bool mg_canvas_is_nil(mg_canvas canvas); | ||||
| 
 | ||||
| MP_API mg_canvas mg_canvas_create(void); | ||||
| MP_API void mg_canvas_destroy(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); | ||||
| 
 | ||||
| //------------------------------------------------------------------------------------------
 | ||||
| //NOTE(martin): fonts
 | ||||
| //------------------------------------------------------------------------------------------
 | ||||
| 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 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//
 | ||||
| //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_scaled_extents(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
 | ||||
| //              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_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 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 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); | ||||
| 
 | ||||
| //------------------------------------------------------------------------------------------
 | ||||
| //NOTE(martin): images
 | ||||
| //------------------------------------------------------------------------------------------
 | ||||
| MP_API mg_image mg_image_nil(void); | ||||
| 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_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_file(mg_surface surface, str8 path, bool flip); | ||||
| 
 | ||||
| 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 vec2 mg_image_size(mg_image image); | ||||
| 
 | ||||
| //------------------------------------------------------------------------------------------
 | ||||
| //NOTE(martin): atlasing
 | ||||
| //------------------------------------------------------------------------------------------
 | ||||
| 
 | ||||
| //NOTE: rectangle allocator
 | ||||
| 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 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); | ||||
| 
 | ||||
| //NOTE: image atlas helpers
 | ||||
| typedef struct mg_image_region | ||||
| { | ||||
| 	mg_image image; | ||||
| 	mp_rect rect; | ||||
| } 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_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 void mg_image_atlas_recycle(mg_rect_atlas* atlas, mg_image_region imageRgn); | ||||
| 
 | ||||
| //------------------------------------------------------------------------------------------
 | ||||
| //NOTE(martin): transform, viewport and clipping
 | ||||
| //------------------------------------------------------------------------------------------
 | ||||
| MP_API void mg_viewport(mp_rect viewPort); | ||||
| 
 | ||||
| MP_API void mg_matrix_push(mg_mat2x3 matrix); | ||||
| 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_pop(void); | ||||
| 
 | ||||
| //------------------------------------------------------------------------------------------
 | ||||
| //NOTE(martin): graphics attributes setting/getting
 | ||||
| //------------------------------------------------------------------------------------------
 | ||||
| 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_width(f32 width); | ||||
| MP_API void mg_set_tolerance(f32 tolerance); | ||||
| 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_cap(mg_cap_type cap); | ||||
| MP_API void mg_set_font(mg_font font); | ||||
| MP_API void mg_set_font_size(f32 size); | ||||
| MP_API void mg_set_text_flip(bool flip); | ||||
| MP_API void mg_set_image(mg_image image); | ||||
| MP_API void mg_set_image_source_region(mp_rect region); | ||||
| 
 | ||||
| MP_API mg_color mg_get_color(void); | ||||
| MP_API f32 mg_get_width(void); | ||||
| MP_API f32 mg_get_tolerance(void); | ||||
| MP_API mg_joint_type mg_get_joint(void); | ||||
| MP_API f32 mg_get_max_joint_excursion(void); | ||||
| MP_API mg_cap_type mg_get_cap(void); | ||||
| MP_API mg_font mg_get_font(void); | ||||
| MP_API f32 mg_get_font_size(void); | ||||
| MP_API bool mg_get_text_flip(void); | ||||
| 
 | ||||
| //------------------------------------------------------------------------------------------
 | ||||
| //NOTE(martin): path construction
 | ||||
| //------------------------------------------------------------------------------------------
 | ||||
| MP_API vec2 mg_get_position(void); | ||||
| MP_API void mg_move_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_cubic_to(f32 x1, f32 y1, f32 x2, f32 y2, f32 x3, f32 y3); | ||||
| MP_API void mg_close_path(void); | ||||
| 
 | ||||
| MP_API mp_rect mg_glyph_outlines(str32 glyphIndices); | ||||
| MP_API void mg_codepoints_outlines(str32 string); | ||||
| MP_API void mg_text_outlines(str8 string); | ||||
| 
 | ||||
| //------------------------------------------------------------------------------------------
 | ||||
| //NOTE(martin): clear/fill/stroke
 | ||||
| //------------------------------------------------------------------------------------------
 | ||||
| MP_API void mg_clear(void); | ||||
| MP_API void mg_fill(void); | ||||
| MP_API void mg_stroke(void); | ||||
| 
 | ||||
| //------------------------------------------------------------------------------------------
 | ||||
| //NOTE(martin): 'fast' shapes primitives
 | ||||
| //------------------------------------------------------------------------------------------
 | ||||
| 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_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_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_circle_fill(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); | ||||
| 
 | ||||
| //NOTE: image helpers
 | ||||
| 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); | ||||
| 
 | ||||
| #endif //__GRAPHICS_H_
 | ||||
| /************************************************************//**
 | ||||
| * | ||||
| *	@file: graphics.h | ||||
| *	@author: Martin Fouilleul | ||||
| *	@date: 23/01/2023 | ||||
| *	@revision: | ||||
| * | ||||
| *****************************************************************/ | ||||
| #ifndef __GRAPHICS_H_ | ||||
| #define __GRAPHICS_H_ | ||||
| 
 | ||||
| #include"util/typedefs.h" | ||||
| #include"platform/platform.h" | ||||
| #include"app/mp_app.h" | ||||
| 
 | ||||
| //------------------------------------------------------------------------------------------
 | ||||
| //NOTE(martin): backends selection
 | ||||
| //------------------------------------------------------------------------------------------
 | ||||
| 
 | ||||
| typedef enum { | ||||
| 	MG_NONE, | ||||
| 	MG_METAL, | ||||
| 	MG_GL, | ||||
| 	MG_GLES, | ||||
| 	MG_CANVAS, | ||||
| 	MG_HOST } mg_surface_api; | ||||
| 
 | ||||
| //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
 | ||||
| #if PLATFORM_MACOS | ||||
| 	#ifndef MG_COMPILE_METAL | ||||
| 		#define MG_COMPILE_METAL 1 | ||||
| 	#endif | ||||
| 
 | ||||
| 	#ifndef MG_COMPILE_GLES | ||||
| 		#define MG_COMPILE_GLES 1 | ||||
| 	#endif | ||||
| 
 | ||||
| 	#ifndef MG_COMPILE_CANVAS | ||||
| 		#if !MG_COMPILE_METAL | ||||
| 			#error "Canvas surface requires a Metal backend on macOS. Make sure you define MG_COMPILE_METAL to 1." | ||||
| 		#endif | ||||
| 		#define MG_COMPILE_CANVAS 1 | ||||
| 	#endif | ||||
| 
 | ||||
| 	#define MG_COMPILE_GL 0 | ||||
| 
 | ||||
| #elif PLATFORM_WINDOWS | ||||
| 	#ifndef MG_COMPILE_GL | ||||
| 		#define MG_COMPILE_GL 1 | ||||
| 	#endif | ||||
| 
 | ||||
| 	#ifndef MG_COMPILE_GLES | ||||
| 		#define MG_COMPILE_GLES 1 | ||||
| 	#endif | ||||
| 
 | ||||
| 	#ifndef MG_COMPILE_CANVAS | ||||
| 		#if !MG_COMPILE_GL | ||||
| 			#error "Canvas surface requires an OpenGL backend on Windows. Make sure you define MG_COMPILE_GL to 1." | ||||
| 		#endif | ||||
| 		#define MG_COMPILE_CANVAS 1 | ||||
| 	#endif | ||||
| 
 | ||||
| #elif PLATFORM_LINUX | ||||
| 	#ifndef MG_COMPILE_GL | ||||
| 		#define MG_COMPILE_GL 1 | ||||
| 	#endif | ||||
| 
 | ||||
| 	#ifndef MG_COMPILE_CANVAS | ||||
| 		#if !MG_COMPILE_GL | ||||
| 			#error "Canvas surface requires an OpenGL backend on Linux. Make sure you define MG_COMPILE_GL to 1." | ||||
| 		#endif | ||||
| 		#define MG_COMPILE_CANVAS 1 | ||||
| 	#endif | ||||
| #endif | ||||
| 
 | ||||
| //NOTE: these macros are used to select backend-specific APIs to include when using milepost
 | ||||
| #ifdef MG_EXPOSE_SURFACE_METAL | ||||
| 	#include"mtl_surface.h" | ||||
| #endif | ||||
| 
 | ||||
| #ifdef MG_EXPOSE_SURFACE_WGL | ||||
| 	#include"wgl_surface.h" | ||||
| #endif | ||||
| 
 | ||||
| //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
 | ||||
| 
 | ||||
| MP_API bool mg_is_surface_api_available(mg_surface_api api); | ||||
| 
 | ||||
| //------------------------------------------------------------------------------------------
 | ||||
| //NOTE(martin): graphics surface
 | ||||
| //------------------------------------------------------------------------------------------
 | ||||
| typedef struct mg_surface { u64 h; } mg_surface; | ||||
| 
 | ||||
| MP_API mg_surface mg_surface_nil(void); | ||||
| 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 void mg_surface_destroy(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_deselect(void); | ||||
| 
 | ||||
| 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_contents_scaling(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); | ||||
| 
 | ||||
| //NOTE(martin): surface sharing
 | ||||
| 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_host(mp_window window); | ||||
| 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); | ||||
| 
 | ||||
| //------------------------------------------------------------------------------------------
 | ||||
| //NOTE(martin): graphics canvas structs
 | ||||
| //------------------------------------------------------------------------------------------
 | ||||
| typedef struct mg_canvas { u64 h; } mg_canvas; | ||||
| typedef struct mg_font { u64 h; } mg_font; | ||||
| typedef struct mg_image { u64 h; } mg_image; | ||||
| 
 | ||||
| typedef struct mg_mat2x3 | ||||
| { | ||||
| 	f32 m[6]; | ||||
| } mg_mat2x3; | ||||
| 
 | ||||
| typedef struct mg_color | ||||
| { | ||||
| 	union | ||||
| 	{ | ||||
| 		struct | ||||
| 		{ | ||||
| 			f32 r; | ||||
| 			f32 g; | ||||
| 			f32 b; | ||||
| 			f32 a; | ||||
| 		}; | ||||
| 		f32 c[4]; | ||||
| 	}; | ||||
| } mg_color; | ||||
| 
 | ||||
| typedef enum {MG_JOINT_MITER = 0, | ||||
|               MG_JOINT_BEVEL, | ||||
| 	          MG_JOINT_NONE } mg_joint_type; | ||||
| 
 | ||||
| typedef enum {MG_CAP_NONE = 0, | ||||
|               MG_CAP_SQUARE } mg_cap_type; | ||||
| 
 | ||||
| typedef struct mg_font_extents | ||||
| { | ||||
| 	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 leading;   // spacing between one row's descent and the next row's ascent
 | ||||
| 	f32 xHeight;   // height of the lower case letter 'x'
 | ||||
| 	f32 capHeight; // height of the upper case letter 'M'
 | ||||
| 	f32 width;     // maximum width of the font
 | ||||
| 
 | ||||
| } mg_font_extents; | ||||
| 
 | ||||
| typedef struct mg_text_extents | ||||
| { | ||||
| 	f32 xBearing; | ||||
| 	f32 yBearing; | ||||
| 	f32 width; | ||||
| 	f32 height; | ||||
| 	f32 xAdvance; | ||||
| 	f32 yAdvance; | ||||
| 
 | ||||
| } mg_text_extents; | ||||
| 
 | ||||
| //------------------------------------------------------------------------------------------
 | ||||
| //NOTE(martin): graphics canvas
 | ||||
| //------------------------------------------------------------------------------------------
 | ||||
| MP_API mg_canvas mg_canvas_nil(void); | ||||
| MP_API bool mg_canvas_is_nil(mg_canvas canvas); | ||||
| 
 | ||||
| MP_API mg_canvas mg_canvas_create(void); | ||||
| MP_API void mg_canvas_destroy(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); | ||||
| 
 | ||||
| //------------------------------------------------------------------------------------------
 | ||||
| //NOTE(martin): fonts
 | ||||
| //------------------------------------------------------------------------------------------
 | ||||
| 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 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//
 | ||||
| //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_scaled_extents(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
 | ||||
| //              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_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 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 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); | ||||
| 
 | ||||
| //------------------------------------------------------------------------------------------
 | ||||
| //NOTE(martin): images
 | ||||
| //------------------------------------------------------------------------------------------
 | ||||
| MP_API mg_image mg_image_nil(void); | ||||
| 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_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_file(mg_surface surface, str8 path, bool flip); | ||||
| 
 | ||||
| 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 vec2 mg_image_size(mg_image image); | ||||
| 
 | ||||
| //------------------------------------------------------------------------------------------
 | ||||
| //NOTE(martin): atlasing
 | ||||
| //------------------------------------------------------------------------------------------
 | ||||
| 
 | ||||
| //NOTE: rectangle allocator
 | ||||
| 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 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); | ||||
| 
 | ||||
| //NOTE: image atlas helpers
 | ||||
| typedef struct mg_image_region | ||||
| { | ||||
| 	mg_image image; | ||||
| 	mp_rect rect; | ||||
| } 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_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 void mg_image_atlas_recycle(mg_rect_atlas* atlas, mg_image_region imageRgn); | ||||
| 
 | ||||
| //------------------------------------------------------------------------------------------
 | ||||
| //NOTE(martin): transform, viewport and clipping
 | ||||
| //------------------------------------------------------------------------------------------
 | ||||
| MP_API void mg_viewport(mp_rect viewPort); | ||||
| 
 | ||||
| MP_API void mg_matrix_push(mg_mat2x3 matrix); | ||||
| 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_pop(void); | ||||
| 
 | ||||
| //------------------------------------------------------------------------------------------
 | ||||
| //NOTE(martin): graphics attributes setting/getting
 | ||||
| //------------------------------------------------------------------------------------------
 | ||||
| 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_width(f32 width); | ||||
| MP_API void mg_set_tolerance(f32 tolerance); | ||||
| 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_cap(mg_cap_type cap); | ||||
| MP_API void mg_set_font(mg_font font); | ||||
| MP_API void mg_set_font_size(f32 size); | ||||
| MP_API void mg_set_text_flip(bool flip); | ||||
| MP_API void mg_set_image(mg_image image); | ||||
| MP_API void mg_set_image_source_region(mp_rect region); | ||||
| 
 | ||||
| MP_API mg_color mg_get_color(void); | ||||
| MP_API f32 mg_get_width(void); | ||||
| MP_API f32 mg_get_tolerance(void); | ||||
| MP_API mg_joint_type mg_get_joint(void); | ||||
| MP_API f32 mg_get_max_joint_excursion(void); | ||||
| MP_API mg_cap_type mg_get_cap(void); | ||||
| MP_API mg_font mg_get_font(void); | ||||
| MP_API f32 mg_get_font_size(void); | ||||
| MP_API bool mg_get_text_flip(void); | ||||
| 
 | ||||
| //------------------------------------------------------------------------------------------
 | ||||
| //NOTE(martin): path construction
 | ||||
| //------------------------------------------------------------------------------------------
 | ||||
| MP_API vec2 mg_get_position(void); | ||||
| MP_API void mg_move_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_cubic_to(f32 x1, f32 y1, f32 x2, f32 y2, f32 x3, f32 y3); | ||||
| MP_API void mg_close_path(void); | ||||
| 
 | ||||
| MP_API mp_rect mg_glyph_outlines(str32 glyphIndices); | ||||
| MP_API void mg_codepoints_outlines(str32 string); | ||||
| MP_API void mg_text_outlines(str8 string); | ||||
| 
 | ||||
| //------------------------------------------------------------------------------------------
 | ||||
| //NOTE(martin): clear/fill/stroke
 | ||||
| //------------------------------------------------------------------------------------------
 | ||||
| MP_API void mg_clear(void); | ||||
| MP_API void mg_fill(void); | ||||
| MP_API void mg_stroke(void); | ||||
| 
 | ||||
| //------------------------------------------------------------------------------------------
 | ||||
| //NOTE(martin): 'fast' shapes primitives
 | ||||
| //------------------------------------------------------------------------------------------
 | ||||
| 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_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_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_circle_fill(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); | ||||
| 
 | ||||
| //NOTE: image helpers
 | ||||
| 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); | ||||
| 
 | ||||
| #endif //__GRAPHICS_H_
 | ||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							|  | @ -1,82 +1,82 @@ | |||
| /************************************************************//**
 | ||||
| * | ||||
| *	@file: graphics_common.h | ||||
| *	@author: Martin Fouilleul | ||||
| *	@date: 26/04/2023 | ||||
| * | ||||
| *****************************************************************/ | ||||
| #ifndef __GRAPHICS_COMMON_H_ | ||||
| #define __GRAPHICS_COMMON_H_ | ||||
| 
 | ||||
| #include"graphics.h" | ||||
| 
 | ||||
| //------------------------------------------------------------------------
 | ||||
| // canvas structs
 | ||||
| //------------------------------------------------------------------------
 | ||||
| typedef enum { MG_PATH_MOVE, | ||||
|                MG_PATH_LINE, | ||||
| 	           MG_PATH_QUADRATIC, | ||||
| 	           MG_PATH_CUBIC } mg_path_elt_type; | ||||
| 
 | ||||
| typedef struct mg_path_elt | ||||
| { | ||||
| 	mg_path_elt_type type; | ||||
| 	vec2 p[3]; | ||||
| 
 | ||||
| } mg_path_elt; | ||||
| 
 | ||||
| typedef struct mg_path_descriptor | ||||
| { | ||||
| 	u32 startIndex; | ||||
| 	u32 count; | ||||
| 	vec2 startPoint; | ||||
| 
 | ||||
| } mg_path_descriptor; | ||||
| 
 | ||||
| typedef struct mg_attributes | ||||
| { | ||||
| 	f32 width; | ||||
| 	f32 tolerance; | ||||
| 	mg_color color; | ||||
| 	mg_joint_type joint; | ||||
| 	f32 maxJointExcursion; | ||||
| 	mg_cap_type cap; | ||||
| 
 | ||||
| 	mg_font font; | ||||
| 	f32 fontSize; | ||||
| 
 | ||||
| 	mg_image image; | ||||
| 	mp_rect srcRegion; | ||||
| 
 | ||||
| 	mg_mat2x3 transform; | ||||
| 	mp_rect clip; | ||||
| 
 | ||||
| } mg_attributes; | ||||
| 
 | ||||
| typedef enum { MG_CMD_FILL, | ||||
| 	           MG_CMD_STROKE, | ||||
| 	           MG_CMD_JUMP | ||||
| 	     } mg_primitive_cmd; | ||||
| 
 | ||||
| typedef struct mg_primitive | ||||
| { | ||||
| 	mg_primitive_cmd cmd; | ||||
| 	mg_attributes attributes; | ||||
| 
 | ||||
| 	union | ||||
| 	{ | ||||
| 		mg_path_descriptor path; | ||||
| 		mp_rect rect; | ||||
| 		u32 jump; | ||||
| 	}; | ||||
| 
 | ||||
| } mg_primitive; | ||||
| 
 | ||||
| MP_API void mg_surface_render_commands(mg_surface surface, | ||||
|                                        mg_color clearColor, | ||||
|                                        u32 primitiveCount, | ||||
|                                        mg_primitive* primitives, | ||||
|                                        u32 eltCount, | ||||
|                                        mg_path_elt* elements); | ||||
| 
 | ||||
| #endif //__GRAPHICS_COMMON_H_
 | ||||
| /************************************************************//**
 | ||||
| * | ||||
| *	@file: graphics_common.h | ||||
| *	@author: Martin Fouilleul | ||||
| *	@date: 26/04/2023 | ||||
| * | ||||
| *****************************************************************/ | ||||
| #ifndef __GRAPHICS_COMMON_H_ | ||||
| #define __GRAPHICS_COMMON_H_ | ||||
| 
 | ||||
| #include"graphics.h" | ||||
| 
 | ||||
| //------------------------------------------------------------------------
 | ||||
| // canvas structs
 | ||||
| //------------------------------------------------------------------------
 | ||||
| typedef enum { MG_PATH_MOVE, | ||||
|                MG_PATH_LINE, | ||||
| 	           MG_PATH_QUADRATIC, | ||||
| 	           MG_PATH_CUBIC } mg_path_elt_type; | ||||
| 
 | ||||
| typedef struct mg_path_elt | ||||
| { | ||||
| 	mg_path_elt_type type; | ||||
| 	vec2 p[3]; | ||||
| 
 | ||||
| } mg_path_elt; | ||||
| 
 | ||||
| typedef struct mg_path_descriptor | ||||
| { | ||||
| 	u32 startIndex; | ||||
| 	u32 count; | ||||
| 	vec2 startPoint; | ||||
| 
 | ||||
| } mg_path_descriptor; | ||||
| 
 | ||||
| typedef struct mg_attributes | ||||
| { | ||||
| 	f32 width; | ||||
| 	f32 tolerance; | ||||
| 	mg_color color; | ||||
| 	mg_joint_type joint; | ||||
| 	f32 maxJointExcursion; | ||||
| 	mg_cap_type cap; | ||||
| 
 | ||||
| 	mg_font font; | ||||
| 	f32 fontSize; | ||||
| 
 | ||||
| 	mg_image image; | ||||
| 	mp_rect srcRegion; | ||||
| 
 | ||||
| 	mg_mat2x3 transform; | ||||
| 	mp_rect clip; | ||||
| 
 | ||||
| } mg_attributes; | ||||
| 
 | ||||
| typedef enum { MG_CMD_FILL, | ||||
| 	           MG_CMD_STROKE, | ||||
| 	           MG_CMD_JUMP | ||||
| 	     } mg_primitive_cmd; | ||||
| 
 | ||||
| typedef struct mg_primitive | ||||
| { | ||||
| 	mg_primitive_cmd cmd; | ||||
| 	mg_attributes attributes; | ||||
| 
 | ||||
| 	union | ||||
| 	{ | ||||
| 		mg_path_descriptor path; | ||||
| 		mp_rect rect; | ||||
| 		u32 jump; | ||||
| 	}; | ||||
| 
 | ||||
| } mg_primitive; | ||||
| 
 | ||||
| MP_API void mg_surface_render_commands(mg_surface surface, | ||||
|                                        mg_color clearColor, | ||||
|                                        u32 primitiveCount, | ||||
|                                        mg_primitive* primitives, | ||||
|                                        u32 eltCount, | ||||
|                                        mg_path_elt* elements); | ||||
| 
 | ||||
| #endif //__GRAPHICS_COMMON_H_
 | ||||
|  | @ -1,454 +1,454 @@ | |||
| /************************************************************//**
 | ||||
| * | ||||
| *	@file: graphics_surface.c | ||||
| *	@author: Martin Fouilleul | ||||
| *	@date: 25/04/2023 | ||||
| * | ||||
| *****************************************************************/ | ||||
| 
 | ||||
| #include"graphics_surface.h" | ||||
| 
 | ||||
| //---------------------------------------------------------------
 | ||||
| // per-thread selected surface
 | ||||
| //---------------------------------------------------------------
 | ||||
| 
 | ||||
| mp_thread_local mg_surface __mgSelectedSurface = {0}; | ||||
| 
 | ||||
| //---------------------------------------------------------------
 | ||||
| // typed handles functions
 | ||||
| //---------------------------------------------------------------
 | ||||
| 
 | ||||
| mg_surface mg_surface_handle_alloc(mg_surface_data* surface) | ||||
| { | ||||
| 	mg_surface handle = {.h = mg_handle_alloc(MG_HANDLE_SURFACE, (void*)surface) }; | ||||
| 	return(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); | ||||
| 	return(data); | ||||
| } | ||||
| 
 | ||||
| mg_image mg_image_handle_alloc(mg_image_data* image) | ||||
| { | ||||
| 	mg_image handle = {.h = mg_handle_alloc(MG_HANDLE_IMAGE, (void*)image) }; | ||||
| 	return(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); | ||||
| 	return(data); | ||||
| } | ||||
| 
 | ||||
| //---------------------------------------------------------------
 | ||||
| // surface API
 | ||||
| //---------------------------------------------------------------
 | ||||
| 
 | ||||
| #if MG_COMPILE_GL | ||||
| 	#if PLATFORM_WINDOWS | ||||
| 		#include"wgl_surface.h" | ||||
| 		#define gl_surface_create_for_window mg_wgl_surface_create_for_window | ||||
| 	#endif | ||||
| #endif | ||||
| 
 | ||||
| #if MG_COMPILE_GLES | ||||
| 	#include"egl_surface.h" | ||||
| #endif | ||||
| 
 | ||||
| #if MG_COMPILE_METAL | ||||
| 	#include"mtl_surface.h" | ||||
| #endif | ||||
| 
 | ||||
| #if MG_COMPILE_CANVAS | ||||
| 	#if PLATFORM_MACOS | ||||
| 		mg_surface_data* mtl_canvas_surface_create_for_window(mp_window window); | ||||
| 	#elif PLATFORM_WINDOWS | ||||
| 		mg_surface_data* gl_canvas_surface_create_for_window(mp_window window); | ||||
| 	#endif | ||||
| #endif | ||||
| 
 | ||||
| bool mg_is_surface_backend_available(mg_surface_api api) | ||||
| { | ||||
| 	bool result = false; | ||||
| 	switch(api) | ||||
| 	{ | ||||
| 		#if MG_COMPILE_METAL | ||||
| 			case MG_METAL: | ||||
| 		#endif | ||||
| 
 | ||||
| 		#if MG_COMPILE_GL | ||||
| 			case MG_GL: | ||||
| 		#endif | ||||
| 
 | ||||
| 		#if MG_COMPILE_GLES | ||||
| 			case MG_GLES: | ||||
| 		#endif | ||||
| 
 | ||||
| 		#if MG_COMPILE_CANVAS | ||||
| 			case MG_CANVAS: | ||||
| 		#endif | ||||
| 			result = true; | ||||
| 			break; | ||||
| 
 | ||||
| 		default: | ||||
| 			break; | ||||
| 	} | ||||
| 	return(result); | ||||
| } | ||||
| 
 | ||||
| mg_surface mg_surface_nil() { return((mg_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) | ||||
| { | ||||
| 	if(__mgData.init) | ||||
| 	{ | ||||
| 		mg_init(); | ||||
| 	} | ||||
| 	mg_surface surfaceHandle = mg_surface_nil(); | ||||
| 	mg_surface_data* surface = 0; | ||||
| 
 | ||||
| 	switch(api) | ||||
| 	{ | ||||
| 	#if MG_COMPILE_GL | ||||
| 		case MG_GL: | ||||
| 			surface = gl_surface_create_for_window(window); | ||||
| 			break; | ||||
| 	#endif | ||||
| 
 | ||||
| 	#if MG_COMPILE_GLES | ||||
| 		case MG_GLES: | ||||
| 			surface = mg_egl_surface_create_for_window(window); | ||||
| 			break; | ||||
| 	#endif | ||||
| 
 | ||||
| 	#if MG_COMPILE_METAL | ||||
| 		case MG_METAL: | ||||
| 			surface = mg_mtl_surface_create_for_window(window); | ||||
| 			break; | ||||
| 	#endif | ||||
| 
 | ||||
| 	#if MG_COMPILE_CANVAS | ||||
| 		case MG_CANVAS: | ||||
| 
 | ||||
| 		#if PLATFORM_MACOS | ||||
| 			surface = mtl_canvas_surface_create_for_window(window); | ||||
| 		#elif PLATFORM_WINDOWS | ||||
| 			surface = gl_canvas_surface_create_for_window(window); | ||||
| 		#endif | ||||
| 			break; | ||||
| 	#endif | ||||
| 
 | ||||
| 		default: | ||||
| 			break; | ||||
| 	} | ||||
| 	if(surface) | ||||
| 	{ | ||||
| 		surfaceHandle = mg_surface_handle_alloc(surface); | ||||
| 		mg_surface_prepare(surfaceHandle); | ||||
| 	} | ||||
| 	return(surfaceHandle); | ||||
| } | ||||
| 
 | ||||
| mg_surface mg_surface_create_remote(u32 width, u32 height, mg_surface_api api) | ||||
| { | ||||
| 	if(!__mgData.init) | ||||
| 	{ | ||||
| 		mg_init(); | ||||
| 	} | ||||
| 	mg_surface surfaceHandle = mg_surface_nil(); | ||||
| 	mg_surface_data* surface = 0; | ||||
| 
 | ||||
| 	switch(api) | ||||
| 	{ | ||||
| 	#if MG_COMPILE_GLES | ||||
| 		case MG_GLES: | ||||
| 			surface = mg_egl_surface_create_remote(width, height); | ||||
| 			break; | ||||
| 	#endif | ||||
| 
 | ||||
| 		default: | ||||
| 			break; | ||||
| 	} | ||||
| 	if(surface) | ||||
| 	{ | ||||
| 		surfaceHandle = mg_surface_handle_alloc(surface); | ||||
| 		mg_surface_prepare(surfaceHandle); | ||||
| 	} | ||||
| 	return(surfaceHandle); | ||||
| } | ||||
| 
 | ||||
| mg_surface mg_surface_create_host(mp_window window) | ||||
| { | ||||
| 	if(!__mgData.init) | ||||
| 	{ | ||||
| 		mg_init(); | ||||
| 	} | ||||
| 	mg_surface handle = mg_surface_nil(); | ||||
| 	mg_surface_data* surface = 0; | ||||
| 	#if PLATFORM_MACOS | ||||
| 		surface = mg_osx_surface_create_host(window); | ||||
| 	#elif PLATFORM_WINDOWS | ||||
| 		surface = mg_win32_surface_create_host(window); | ||||
| 	#endif | ||||
| 
 | ||||
| 	if(surface) | ||||
| 	{ | ||||
| 		handle = mg_surface_handle_alloc(surface); | ||||
| 	} | ||||
| 	return(handle); | ||||
| } | ||||
| 
 | ||||
| void mg_surface_destroy(mg_surface handle) | ||||
| { | ||||
| 	DEBUG_ASSERT(__mgData.init); | ||||
| 	mg_surface_data* surface = mg_surface_data_from_handle(handle); | ||||
| 	if(surface) | ||||
| 	{ | ||||
| 		if(__mgSelectedSurface.h == handle.h) | ||||
| 		{ | ||||
| 			mg_surface_deselect(); | ||||
| 		} | ||||
| 
 | ||||
| 		if(surface->backend && surface->backend->destroy) | ||||
| 		{ | ||||
| 			surface->backend->destroy(surface->backend); | ||||
| 		} | ||||
| 		surface->destroy(surface); | ||||
| 		mg_handle_recycle(handle.h); | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| void mg_surface_deselect() | ||||
| { | ||||
| 	DEBUG_ASSERT(__mgData.init); | ||||
| 
 | ||||
| 	mg_surface_data* prevSurface = mg_surface_data_from_handle(__mgSelectedSurface); | ||||
| 	if(prevSurface && prevSurface->deselect) | ||||
| 	{ | ||||
| 		prevSurface->deselect(prevSurface); | ||||
| 	} | ||||
| 	__mgSelectedSurface = mg_surface_nil(); | ||||
| } | ||||
| 
 | ||||
| void mg_surface_prepare(mg_surface surface) | ||||
| { | ||||
| 	DEBUG_ASSERT(__mgData.init); | ||||
| 
 | ||||
| 	if(surface.h != __mgSelectedSurface.h) | ||||
| 	{ | ||||
| 		mg_surface_deselect(); | ||||
| 	} | ||||
| 
 | ||||
| 	mg_surface_data* surfaceData = mg_surface_data_from_handle(surface); | ||||
| 	if(surfaceData && surfaceData->prepare) | ||||
| 	{ | ||||
| 		surfaceData->prepare(surfaceData); | ||||
| 		__mgSelectedSurface = surface; | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| void mg_surface_present(mg_surface surface) | ||||
| { | ||||
| 	DEBUG_ASSERT(__mgData.init); | ||||
| 	mg_surface_data* surfaceData = mg_surface_data_from_handle(surface); | ||||
| 	if(surfaceData && surfaceData->present) | ||||
| 	{ | ||||
| 		surfaceData->present(surfaceData); | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| void mg_surface_swap_interval(mg_surface surface, int swap) | ||||
| { | ||||
| 	DEBUG_ASSERT(__mgData.init); | ||||
| 	mg_surface_data* surfaceData = mg_surface_data_from_handle(surface); | ||||
| 	if(surfaceData && surfaceData->swapInterval) | ||||
| 	{ | ||||
| 		surfaceData->swapInterval(surfaceData, swap); | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| vec2 mg_surface_get_size(mg_surface surface) | ||||
| { | ||||
| 	DEBUG_ASSERT(__mgData.init); | ||||
| 	vec2 size = {0}; | ||||
| 	mg_surface_data* surfaceData = mg_surface_data_from_handle(surface); | ||||
| 	if(surfaceData && surfaceData->getSize) | ||||
| 	{ | ||||
| 		size = surfaceData->getSize(surfaceData); | ||||
| 	} | ||||
| 	return(size); | ||||
| } | ||||
| 
 | ||||
| vec2 mg_surface_contents_scaling(mg_surface surface) | ||||
| { | ||||
| 	DEBUG_ASSERT(__mgData.init); | ||||
| 	vec2 scaling = {1, 1}; | ||||
| 	mg_surface_data* surfaceData = mg_surface_data_from_handle(surface); | ||||
| 	if(surfaceData && surfaceData->contentsScaling) | ||||
| 	{ | ||||
| 		scaling = surfaceData->contentsScaling(surfaceData); | ||||
| 	} | ||||
| 	return(scaling); | ||||
| } | ||||
| 
 | ||||
| void mg_surface_set_hidden(mg_surface surface, bool hidden) | ||||
| { | ||||
| 	DEBUG_ASSERT(__mgData.init); | ||||
| 	mg_surface_data* surfaceData = mg_surface_data_from_handle(surface); | ||||
| 	if(surfaceData && surfaceData->setHidden) | ||||
| 	{ | ||||
| 		surfaceData->setHidden(surfaceData, hidden); | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| bool mg_surface_get_hidden(mg_surface surface) | ||||
| { | ||||
| 	DEBUG_ASSERT(__mgData.init); | ||||
| 	bool res = false; | ||||
| 	mg_surface_data* surfaceData = mg_surface_data_from_handle(surface); | ||||
| 	if(surfaceData && surfaceData->getHidden) | ||||
| 	{ | ||||
| 		res = surfaceData->getHidden(surfaceData); | ||||
| 	} | ||||
| 	return(res); | ||||
| } | ||||
| 
 | ||||
| void* mg_surface_native_layer(mg_surface surface) | ||||
| { | ||||
| 	void* res = 0; | ||||
| 	mg_surface_data* surfaceData = mg_surface_data_from_handle(surface); | ||||
| 	if(surfaceData && surfaceData->nativeLayer) | ||||
| 	{ | ||||
| 		res = surfaceData->nativeLayer(surfaceData); | ||||
| 	} | ||||
| 	return(res); | ||||
| } | ||||
| 
 | ||||
| mg_surface_id mg_surface_remote_id(mg_surface handle) | ||||
| { | ||||
| 	mg_surface_id remoteId = 0; | ||||
| 	mg_surface_data* surface = mg_surface_data_from_handle(handle); | ||||
| 	if(surface && surface->remoteID) | ||||
| 	{ | ||||
| 		remoteId = surface->remoteID(surface); | ||||
| 	} | ||||
| 	return(remoteId); | ||||
| } | ||||
| 
 | ||||
| void mg_surface_host_connect(mg_surface handle, mg_surface_id remoteID) | ||||
| { | ||||
| 	mg_surface_data* surface = mg_surface_data_from_handle(handle); | ||||
| 	if(surface && surface->hostConnect) | ||||
| 	{ | ||||
| 		surface->hostConnect(surface, remoteID); | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| void mg_surface_render_commands(mg_surface surface, | ||||
|                                 mg_color clearColor, | ||||
|                                 u32 primitiveCount, | ||||
|                                 mg_primitive* primitives, | ||||
|                                 u32 eltCount, | ||||
|                                 mg_path_elt* elements) | ||||
| { | ||||
| 	mg_surface_data* surfaceData = mg_surface_data_from_handle(surface); | ||||
| 
 | ||||
| 	if(surface.h != __mgSelectedSurface.h) | ||||
| 	{ | ||||
| 		log_error("surface is not selected. Make sure to call mg_surface_prepare() before drawing onto a surface.\n"); | ||||
| 	} | ||||
| 	else if(surfaceData && surfaceData->backend) | ||||
| 	{ | ||||
| 		surfaceData->backend->render(surfaceData->backend, | ||||
| 		                             clearColor, | ||||
| 		                             primitiveCount, | ||||
| 		                             primitives, | ||||
| 		                             eltCount, | ||||
| 		                             elements); | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| //------------------------------------------------------------------------------------------
 | ||||
| //NOTE(martin): images
 | ||||
| //------------------------------------------------------------------------------------------
 | ||||
| 
 | ||||
| vec2 mg_image_size(mg_image image) | ||||
| { | ||||
| 	vec2 res = {0}; | ||||
| 	mg_image_data* imageData = mg_image_data_from_handle(image); | ||||
| 	if(imageData) | ||||
| 	{ | ||||
| 		res = imageData->size; | ||||
| 	} | ||||
| 	return(res); | ||||
| } | ||||
| 
 | ||||
| mg_image mg_image_create(mg_surface surface, u32 width, u32 height) | ||||
| { | ||||
| 	mg_image image = mg_image_nil(); | ||||
| 	mg_surface_data* surfaceData = mg_surface_data_from_handle(surface); | ||||
| 
 | ||||
| 	if(surface.h != __mgSelectedSurface.h) | ||||
| 	{ | ||||
| 		log_error("surface is not selected. Make sure to call mg_surface_prepare() before modifying graphics resources.\n"); | ||||
| 	} | ||||
| 	else if(surfaceData && surfaceData->backend) | ||||
| 	{ | ||||
| 		DEBUG_ASSERT(surfaceData->api == MG_CANVAS); | ||||
| 
 | ||||
| 		mg_image_data* imageData = surfaceData->backend->imageCreate(surfaceData->backend, (vec2){width, height}); | ||||
| 		if(imageData) | ||||
| 		{ | ||||
| 			imageData->surface = surface; | ||||
| 			image = mg_image_handle_alloc(imageData); | ||||
| 		} | ||||
| 	} | ||||
| 	return(image); | ||||
| } | ||||
| 
 | ||||
| void mg_image_destroy(mg_image image) | ||||
| { | ||||
| 	mg_image_data* imageData = mg_image_data_from_handle(image); | ||||
| 
 | ||||
| 	if(imageData) | ||||
| 	{ | ||||
| 		if(imageData->surface.h != __mgSelectedSurface.h) | ||||
| 		{ | ||||
| 			log_error("surface is not selected. Make sure to call mg_surface_prepare() before modifying graphics resources.\n"); | ||||
| 		} | ||||
| 		else | ||||
| 		{ | ||||
| 			mg_surface_data* surface = mg_surface_data_from_handle(imageData->surface); | ||||
| 			if(surface && surface->backend) | ||||
| 			{ | ||||
| 				surface->backend->imageDestroy(surface->backend, imageData); | ||||
| 				mg_handle_recycle(image.h); | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| void mg_image_upload_region_rgba8(mg_image image, mp_rect region, u8* pixels) | ||||
| { | ||||
| 	mg_image_data* imageData = mg_image_data_from_handle(image); | ||||
| 
 | ||||
| 	if(imageData) | ||||
| 	{ | ||||
| 		if(imageData->surface.h != __mgSelectedSurface.h) | ||||
| 		{ | ||||
| 			log_error("surface is not selected. Make sure to call mg_surface_prepare() before modifying graphics resources.\n"); | ||||
| 		} | ||||
| 		else | ||||
| 		{ | ||||
| 			mg_surface_data* surfaceData = mg_surface_data_from_handle(imageData->surface); | ||||
| 			if(surfaceData) | ||||
| 			{ | ||||
| 				DEBUG_ASSERT(surfaceData->backend); | ||||
| 				surfaceData->backend->imageUploadRegion(surfaceData->backend, imageData, region, pixels); | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
| /************************************************************//**
 | ||||
| * | ||||
| *	@file: graphics_surface.c | ||||
| *	@author: Martin Fouilleul | ||||
| *	@date: 25/04/2023 | ||||
| * | ||||
| *****************************************************************/ | ||||
| 
 | ||||
| #include"graphics_surface.h" | ||||
| 
 | ||||
| //---------------------------------------------------------------
 | ||||
| // per-thread selected surface
 | ||||
| //---------------------------------------------------------------
 | ||||
| 
 | ||||
| mp_thread_local mg_surface __mgSelectedSurface = {0}; | ||||
| 
 | ||||
| //---------------------------------------------------------------
 | ||||
| // typed handles functions
 | ||||
| //---------------------------------------------------------------
 | ||||
| 
 | ||||
| mg_surface mg_surface_handle_alloc(mg_surface_data* surface) | ||||
| { | ||||
| 	mg_surface handle = {.h = mg_handle_alloc(MG_HANDLE_SURFACE, (void*)surface) }; | ||||
| 	return(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); | ||||
| 	return(data); | ||||
| } | ||||
| 
 | ||||
| mg_image mg_image_handle_alloc(mg_image_data* image) | ||||
| { | ||||
| 	mg_image handle = {.h = mg_handle_alloc(MG_HANDLE_IMAGE, (void*)image) }; | ||||
| 	return(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); | ||||
| 	return(data); | ||||
| } | ||||
| 
 | ||||
| //---------------------------------------------------------------
 | ||||
| // surface API
 | ||||
| //---------------------------------------------------------------
 | ||||
| 
 | ||||
| #if MG_COMPILE_GL | ||||
| 	#if PLATFORM_WINDOWS | ||||
| 		#include"wgl_surface.h" | ||||
| 		#define gl_surface_create_for_window mg_wgl_surface_create_for_window | ||||
| 	#endif | ||||
| #endif | ||||
| 
 | ||||
| #if MG_COMPILE_GLES | ||||
| 	#include"egl_surface.h" | ||||
| #endif | ||||
| 
 | ||||
| #if MG_COMPILE_METAL | ||||
| 	#include"mtl_surface.h" | ||||
| #endif | ||||
| 
 | ||||
| #if MG_COMPILE_CANVAS | ||||
| 	#if PLATFORM_MACOS | ||||
| 		mg_surface_data* mtl_canvas_surface_create_for_window(mp_window window); | ||||
| 	#elif PLATFORM_WINDOWS | ||||
| 		mg_surface_data* gl_canvas_surface_create_for_window(mp_window window); | ||||
| 	#endif | ||||
| #endif | ||||
| 
 | ||||
| bool mg_is_surface_backend_available(mg_surface_api api) | ||||
| { | ||||
| 	bool result = false; | ||||
| 	switch(api) | ||||
| 	{ | ||||
| 		#if MG_COMPILE_METAL | ||||
| 			case MG_METAL: | ||||
| 		#endif | ||||
| 
 | ||||
| 		#if MG_COMPILE_GL | ||||
| 			case MG_GL: | ||||
| 		#endif | ||||
| 
 | ||||
| 		#if MG_COMPILE_GLES | ||||
| 			case MG_GLES: | ||||
| 		#endif | ||||
| 
 | ||||
| 		#if MG_COMPILE_CANVAS | ||||
| 			case MG_CANVAS: | ||||
| 		#endif | ||||
| 			result = true; | ||||
| 			break; | ||||
| 
 | ||||
| 		default: | ||||
| 			break; | ||||
| 	} | ||||
| 	return(result); | ||||
| } | ||||
| 
 | ||||
| mg_surface mg_surface_nil() { return((mg_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) | ||||
| { | ||||
| 	if(__mgData.init) | ||||
| 	{ | ||||
| 		mg_init(); | ||||
| 	} | ||||
| 	mg_surface surfaceHandle = mg_surface_nil(); | ||||
| 	mg_surface_data* surface = 0; | ||||
| 
 | ||||
| 	switch(api) | ||||
| 	{ | ||||
| 	#if MG_COMPILE_GL | ||||
| 		case MG_GL: | ||||
| 			surface = gl_surface_create_for_window(window); | ||||
| 			break; | ||||
| 	#endif | ||||
| 
 | ||||
| 	#if MG_COMPILE_GLES | ||||
| 		case MG_GLES: | ||||
| 			surface = mg_egl_surface_create_for_window(window); | ||||
| 			break; | ||||
| 	#endif | ||||
| 
 | ||||
| 	#if MG_COMPILE_METAL | ||||
| 		case MG_METAL: | ||||
| 			surface = mg_mtl_surface_create_for_window(window); | ||||
| 			break; | ||||
| 	#endif | ||||
| 
 | ||||
| 	#if MG_COMPILE_CANVAS | ||||
| 		case MG_CANVAS: | ||||
| 
 | ||||
| 		#if PLATFORM_MACOS | ||||
| 			surface = mtl_canvas_surface_create_for_window(window); | ||||
| 		#elif PLATFORM_WINDOWS | ||||
| 			surface = gl_canvas_surface_create_for_window(window); | ||||
| 		#endif | ||||
| 			break; | ||||
| 	#endif | ||||
| 
 | ||||
| 		default: | ||||
| 			break; | ||||
| 	} | ||||
| 	if(surface) | ||||
| 	{ | ||||
| 		surfaceHandle = mg_surface_handle_alloc(surface); | ||||
| 		mg_surface_prepare(surfaceHandle); | ||||
| 	} | ||||
| 	return(surfaceHandle); | ||||
| } | ||||
| 
 | ||||
| mg_surface mg_surface_create_remote(u32 width, u32 height, mg_surface_api api) | ||||
| { | ||||
| 	if(!__mgData.init) | ||||
| 	{ | ||||
| 		mg_init(); | ||||
| 	} | ||||
| 	mg_surface surfaceHandle = mg_surface_nil(); | ||||
| 	mg_surface_data* surface = 0; | ||||
| 
 | ||||
| 	switch(api) | ||||
| 	{ | ||||
| 	#if MG_COMPILE_GLES | ||||
| 		case MG_GLES: | ||||
| 			surface = mg_egl_surface_create_remote(width, height); | ||||
| 			break; | ||||
| 	#endif | ||||
| 
 | ||||
| 		default: | ||||
| 			break; | ||||
| 	} | ||||
| 	if(surface) | ||||
| 	{ | ||||
| 		surfaceHandle = mg_surface_handle_alloc(surface); | ||||
| 		mg_surface_prepare(surfaceHandle); | ||||
| 	} | ||||
| 	return(surfaceHandle); | ||||
| } | ||||
| 
 | ||||
| mg_surface mg_surface_create_host(mp_window window) | ||||
| { | ||||
| 	if(!__mgData.init) | ||||
| 	{ | ||||
| 		mg_init(); | ||||
| 	} | ||||
| 	mg_surface handle = mg_surface_nil(); | ||||
| 	mg_surface_data* surface = 0; | ||||
| 	#if PLATFORM_MACOS | ||||
| 		surface = mg_osx_surface_create_host(window); | ||||
| 	#elif PLATFORM_WINDOWS | ||||
| 		surface = mg_win32_surface_create_host(window); | ||||
| 	#endif | ||||
| 
 | ||||
| 	if(surface) | ||||
| 	{ | ||||
| 		handle = mg_surface_handle_alloc(surface); | ||||
| 	} | ||||
| 	return(handle); | ||||
| } | ||||
| 
 | ||||
| void mg_surface_destroy(mg_surface handle) | ||||
| { | ||||
| 	DEBUG_ASSERT(__mgData.init); | ||||
| 	mg_surface_data* surface = mg_surface_data_from_handle(handle); | ||||
| 	if(surface) | ||||
| 	{ | ||||
| 		if(__mgSelectedSurface.h == handle.h) | ||||
| 		{ | ||||
| 			mg_surface_deselect(); | ||||
| 		} | ||||
| 
 | ||||
| 		if(surface->backend && surface->backend->destroy) | ||||
| 		{ | ||||
| 			surface->backend->destroy(surface->backend); | ||||
| 		} | ||||
| 		surface->destroy(surface); | ||||
| 		mg_handle_recycle(handle.h); | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| void mg_surface_deselect() | ||||
| { | ||||
| 	DEBUG_ASSERT(__mgData.init); | ||||
| 
 | ||||
| 	mg_surface_data* prevSurface = mg_surface_data_from_handle(__mgSelectedSurface); | ||||
| 	if(prevSurface && prevSurface->deselect) | ||||
| 	{ | ||||
| 		prevSurface->deselect(prevSurface); | ||||
| 	} | ||||
| 	__mgSelectedSurface = mg_surface_nil(); | ||||
| } | ||||
| 
 | ||||
| void mg_surface_prepare(mg_surface surface) | ||||
| { | ||||
| 	DEBUG_ASSERT(__mgData.init); | ||||
| 
 | ||||
| 	if(surface.h != __mgSelectedSurface.h) | ||||
| 	{ | ||||
| 		mg_surface_deselect(); | ||||
| 	} | ||||
| 
 | ||||
| 	mg_surface_data* surfaceData = mg_surface_data_from_handle(surface); | ||||
| 	if(surfaceData && surfaceData->prepare) | ||||
| 	{ | ||||
| 		surfaceData->prepare(surfaceData); | ||||
| 		__mgSelectedSurface = surface; | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| void mg_surface_present(mg_surface surface) | ||||
| { | ||||
| 	DEBUG_ASSERT(__mgData.init); | ||||
| 	mg_surface_data* surfaceData = mg_surface_data_from_handle(surface); | ||||
| 	if(surfaceData && surfaceData->present) | ||||
| 	{ | ||||
| 		surfaceData->present(surfaceData); | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| void mg_surface_swap_interval(mg_surface surface, int swap) | ||||
| { | ||||
| 	DEBUG_ASSERT(__mgData.init); | ||||
| 	mg_surface_data* surfaceData = mg_surface_data_from_handle(surface); | ||||
| 	if(surfaceData && surfaceData->swapInterval) | ||||
| 	{ | ||||
| 		surfaceData->swapInterval(surfaceData, swap); | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| vec2 mg_surface_get_size(mg_surface surface) | ||||
| { | ||||
| 	DEBUG_ASSERT(__mgData.init); | ||||
| 	vec2 size = {0}; | ||||
| 	mg_surface_data* surfaceData = mg_surface_data_from_handle(surface); | ||||
| 	if(surfaceData && surfaceData->getSize) | ||||
| 	{ | ||||
| 		size = surfaceData->getSize(surfaceData); | ||||
| 	} | ||||
| 	return(size); | ||||
| } | ||||
| 
 | ||||
| vec2 mg_surface_contents_scaling(mg_surface surface) | ||||
| { | ||||
| 	DEBUG_ASSERT(__mgData.init); | ||||
| 	vec2 scaling = {1, 1}; | ||||
| 	mg_surface_data* surfaceData = mg_surface_data_from_handle(surface); | ||||
| 	if(surfaceData && surfaceData->contentsScaling) | ||||
| 	{ | ||||
| 		scaling = surfaceData->contentsScaling(surfaceData); | ||||
| 	} | ||||
| 	return(scaling); | ||||
| } | ||||
| 
 | ||||
| void mg_surface_set_hidden(mg_surface surface, bool hidden) | ||||
| { | ||||
| 	DEBUG_ASSERT(__mgData.init); | ||||
| 	mg_surface_data* surfaceData = mg_surface_data_from_handle(surface); | ||||
| 	if(surfaceData && surfaceData->setHidden) | ||||
| 	{ | ||||
| 		surfaceData->setHidden(surfaceData, hidden); | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| bool mg_surface_get_hidden(mg_surface surface) | ||||
| { | ||||
| 	DEBUG_ASSERT(__mgData.init); | ||||
| 	bool res = false; | ||||
| 	mg_surface_data* surfaceData = mg_surface_data_from_handle(surface); | ||||
| 	if(surfaceData && surfaceData->getHidden) | ||||
| 	{ | ||||
| 		res = surfaceData->getHidden(surfaceData); | ||||
| 	} | ||||
| 	return(res); | ||||
| } | ||||
| 
 | ||||
| void* mg_surface_native_layer(mg_surface surface) | ||||
| { | ||||
| 	void* res = 0; | ||||
| 	mg_surface_data* surfaceData = mg_surface_data_from_handle(surface); | ||||
| 	if(surfaceData && surfaceData->nativeLayer) | ||||
| 	{ | ||||
| 		res = surfaceData->nativeLayer(surfaceData); | ||||
| 	} | ||||
| 	return(res); | ||||
| } | ||||
| 
 | ||||
| mg_surface_id mg_surface_remote_id(mg_surface handle) | ||||
| { | ||||
| 	mg_surface_id remoteId = 0; | ||||
| 	mg_surface_data* surface = mg_surface_data_from_handle(handle); | ||||
| 	if(surface && surface->remoteID) | ||||
| 	{ | ||||
| 		remoteId = surface->remoteID(surface); | ||||
| 	} | ||||
| 	return(remoteId); | ||||
| } | ||||
| 
 | ||||
| void mg_surface_host_connect(mg_surface handle, mg_surface_id remoteID) | ||||
| { | ||||
| 	mg_surface_data* surface = mg_surface_data_from_handle(handle); | ||||
| 	if(surface && surface->hostConnect) | ||||
| 	{ | ||||
| 		surface->hostConnect(surface, remoteID); | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| void mg_surface_render_commands(mg_surface surface, | ||||
|                                 mg_color clearColor, | ||||
|                                 u32 primitiveCount, | ||||
|                                 mg_primitive* primitives, | ||||
|                                 u32 eltCount, | ||||
|                                 mg_path_elt* elements) | ||||
| { | ||||
| 	mg_surface_data* surfaceData = mg_surface_data_from_handle(surface); | ||||
| 
 | ||||
| 	if(surface.h != __mgSelectedSurface.h) | ||||
| 	{ | ||||
| 		log_error("surface is not selected. Make sure to call mg_surface_prepare() before drawing onto a surface.\n"); | ||||
| 	} | ||||
| 	else if(surfaceData && surfaceData->backend) | ||||
| 	{ | ||||
| 		surfaceData->backend->render(surfaceData->backend, | ||||
| 		                             clearColor, | ||||
| 		                             primitiveCount, | ||||
| 		                             primitives, | ||||
| 		                             eltCount, | ||||
| 		                             elements); | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| //------------------------------------------------------------------------------------------
 | ||||
| //NOTE(martin): images
 | ||||
| //------------------------------------------------------------------------------------------
 | ||||
| 
 | ||||
| vec2 mg_image_size(mg_image image) | ||||
| { | ||||
| 	vec2 res = {0}; | ||||
| 	mg_image_data* imageData = mg_image_data_from_handle(image); | ||||
| 	if(imageData) | ||||
| 	{ | ||||
| 		res = imageData->size; | ||||
| 	} | ||||
| 	return(res); | ||||
| } | ||||
| 
 | ||||
| mg_image mg_image_create(mg_surface surface, u32 width, u32 height) | ||||
| { | ||||
| 	mg_image image = mg_image_nil(); | ||||
| 	mg_surface_data* surfaceData = mg_surface_data_from_handle(surface); | ||||
| 
 | ||||
| 	if(surface.h != __mgSelectedSurface.h) | ||||
| 	{ | ||||
| 		log_error("surface is not selected. Make sure to call mg_surface_prepare() before modifying graphics resources.\n"); | ||||
| 	} | ||||
| 	else if(surfaceData && surfaceData->backend) | ||||
| 	{ | ||||
| 		DEBUG_ASSERT(surfaceData->api == MG_CANVAS); | ||||
| 
 | ||||
| 		mg_image_data* imageData = surfaceData->backend->imageCreate(surfaceData->backend, (vec2){width, height}); | ||||
| 		if(imageData) | ||||
| 		{ | ||||
| 			imageData->surface = surface; | ||||
| 			image = mg_image_handle_alloc(imageData); | ||||
| 		} | ||||
| 	} | ||||
| 	return(image); | ||||
| } | ||||
| 
 | ||||
| void mg_image_destroy(mg_image image) | ||||
| { | ||||
| 	mg_image_data* imageData = mg_image_data_from_handle(image); | ||||
| 
 | ||||
| 	if(imageData) | ||||
| 	{ | ||||
| 		if(imageData->surface.h != __mgSelectedSurface.h) | ||||
| 		{ | ||||
| 			log_error("surface is not selected. Make sure to call mg_surface_prepare() before modifying graphics resources.\n"); | ||||
| 		} | ||||
| 		else | ||||
| 		{ | ||||
| 			mg_surface_data* surface = mg_surface_data_from_handle(imageData->surface); | ||||
| 			if(surface && surface->backend) | ||||
| 			{ | ||||
| 				surface->backend->imageDestroy(surface->backend, imageData); | ||||
| 				mg_handle_recycle(image.h); | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| void mg_image_upload_region_rgba8(mg_image image, mp_rect region, u8* pixels) | ||||
| { | ||||
| 	mg_image_data* imageData = mg_image_data_from_handle(image); | ||||
| 
 | ||||
| 	if(imageData) | ||||
| 	{ | ||||
| 		if(imageData->surface.h != __mgSelectedSurface.h) | ||||
| 		{ | ||||
| 			log_error("surface is not selected. Make sure to call mg_surface_prepare() before modifying graphics resources.\n"); | ||||
| 		} | ||||
| 		else | ||||
| 		{ | ||||
| 			mg_surface_data* surfaceData = mg_surface_data_from_handle(imageData->surface); | ||||
| 			if(surfaceData) | ||||
| 			{ | ||||
| 				DEBUG_ASSERT(surfaceData->backend); | ||||
| 				surfaceData->backend->imageUploadRegion(surfaceData->backend, imageData, region, pixels); | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|  | @ -1,112 +1,112 @@ | |||
| /************************************************************//**
 | ||||
| * | ||||
| *	@file: graphics_surface.h | ||||
| *	@author: Martin Fouilleul | ||||
| *	@date: 26/04/2023 | ||||
| * | ||||
| *****************************************************************/ | ||||
| #ifndef __GRAPHICS_SURFACE_H_ | ||||
| #define __GRAPHICS_SURFACE_H_ | ||||
| 
 | ||||
| #include"graphics_common.h" | ||||
| #include"mp_app_internal.h" | ||||
| 
 | ||||
| #ifdef __cplusplus | ||||
| extern "C" { | ||||
| #endif | ||||
| 
 | ||||
| //---------------------------------------------------------------
 | ||||
| // surface interface
 | ||||
| //---------------------------------------------------------------
 | ||||
| typedef struct mg_surface_data mg_surface_data; | ||||
| typedef struct mg_canvas_backend mg_canvas_backend; | ||||
| 
 | ||||
| typedef void (*mg_surface_destroy_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_present_proc)(mg_surface_data* surface); | ||||
| 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_contents_scaling_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_native_layer_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 struct mg_surface_data | ||||
| { | ||||
| 	mg_surface_api api; | ||||
| 	mp_layer layer; | ||||
| 
 | ||||
| 	mg_surface_destroy_proc destroy; | ||||
| 	mg_surface_prepare_proc prepare; | ||||
| 	mg_surface_present_proc present; | ||||
| 	mg_surface_deselect_proc deselect; | ||||
| 	mg_surface_swap_interval_proc swapInterval; | ||||
| 	mg_surface_get_size_proc getSize; | ||||
| 	mg_surface_contents_scaling_proc contentsScaling; | ||||
| 	mg_surface_get_hidden_proc getHidden; | ||||
| 	mg_surface_set_hidden_proc setHidden; | ||||
| 	mg_surface_native_layer_proc nativeLayer; | ||||
| 	mg_surface_remote_id_proc remoteID; | ||||
| 	mg_surface_host_connect_proc hostConnect; | ||||
| 
 | ||||
| 	mg_canvas_backend* backend; | ||||
| 
 | ||||
| } mg_surface_data; | ||||
| 
 | ||||
| mg_surface mg_surface_alloc_handle(mg_surface_data* surface); | ||||
| 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_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_cleanup(mg_surface_data* surface); | ||||
| void* mg_surface_native_layer(mg_surface surface); | ||||
| 
 | ||||
| //---------------------------------------------------------------
 | ||||
| // canvas backend interface
 | ||||
| //---------------------------------------------------------------
 | ||||
| typedef struct mg_image_data | ||||
| { | ||||
| 	list_elt listElt; | ||||
| 	u32 generation; | ||||
| 	mg_surface surface; | ||||
| 	vec2 size; | ||||
| 
 | ||||
| } mg_image_data; | ||||
| 
 | ||||
| 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 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, | ||||
|                                                            mg_image_data* image, | ||||
|                                                            mp_rect region, | ||||
|                                                            u8* pixels); | ||||
| 
 | ||||
| typedef void (*mg_canvas_backend_render_proc)(mg_canvas_backend* backend, | ||||
|                                               mg_color clearColor, | ||||
|                                               u32 primitiveCount, | ||||
|                                               mg_primitive* primitives, | ||||
|                                               u32 eltCount, | ||||
|                                               mg_path_elt* pathElements); | ||||
| 
 | ||||
| typedef struct mg_canvas_backend | ||||
| { | ||||
| 	mg_canvas_backend_destroy_proc destroy; | ||||
| 
 | ||||
| 	mg_canvas_backend_image_create_proc imageCreate; | ||||
| 	mg_canvas_backend_image_destroy_proc imageDestroy; | ||||
| 	mg_canvas_backend_image_upload_region_proc imageUploadRegion; | ||||
| 
 | ||||
| 	mg_canvas_backend_render_proc render; | ||||
| 
 | ||||
| } mg_canvas_backend; | ||||
| 
 | ||||
| #ifdef __cplusplus | ||||
| } // extern "C"
 | ||||
| #endif | ||||
| 
 | ||||
| #endif //__GRAPHICS_SURFACE_H_
 | ||||
| /************************************************************//**
 | ||||
| * | ||||
| *	@file: graphics_surface.h | ||||
| *	@author: Martin Fouilleul | ||||
| *	@date: 26/04/2023 | ||||
| * | ||||
| *****************************************************************/ | ||||
| #ifndef __GRAPHICS_SURFACE_H_ | ||||
| #define __GRAPHICS_SURFACE_H_ | ||||
| 
 | ||||
| #include"graphics_common.h" | ||||
| #include"app/mp_app_internal.h" | ||||
| 
 | ||||
| #ifdef __cplusplus | ||||
| extern "C" { | ||||
| #endif | ||||
| 
 | ||||
| //---------------------------------------------------------------
 | ||||
| // surface interface
 | ||||
| //---------------------------------------------------------------
 | ||||
| typedef struct mg_surface_data mg_surface_data; | ||||
| typedef struct mg_canvas_backend mg_canvas_backend; | ||||
| 
 | ||||
| typedef void (*mg_surface_destroy_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_present_proc)(mg_surface_data* surface); | ||||
| 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_contents_scaling_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_native_layer_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 struct mg_surface_data | ||||
| { | ||||
| 	mg_surface_api api; | ||||
| 	mp_layer layer; | ||||
| 
 | ||||
| 	mg_surface_destroy_proc destroy; | ||||
| 	mg_surface_prepare_proc prepare; | ||||
| 	mg_surface_present_proc present; | ||||
| 	mg_surface_deselect_proc deselect; | ||||
| 	mg_surface_swap_interval_proc swapInterval; | ||||
| 	mg_surface_get_size_proc getSize; | ||||
| 	mg_surface_contents_scaling_proc contentsScaling; | ||||
| 	mg_surface_get_hidden_proc getHidden; | ||||
| 	mg_surface_set_hidden_proc setHidden; | ||||
| 	mg_surface_native_layer_proc nativeLayer; | ||||
| 	mg_surface_remote_id_proc remoteID; | ||||
| 	mg_surface_host_connect_proc hostConnect; | ||||
| 
 | ||||
| 	mg_canvas_backend* backend; | ||||
| 
 | ||||
| } mg_surface_data; | ||||
| 
 | ||||
| mg_surface mg_surface_alloc_handle(mg_surface_data* surface); | ||||
| 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_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_cleanup(mg_surface_data* surface); | ||||
| void* mg_surface_native_layer(mg_surface surface); | ||||
| 
 | ||||
| //---------------------------------------------------------------
 | ||||
| // canvas backend interface
 | ||||
| //---------------------------------------------------------------
 | ||||
| typedef struct mg_image_data | ||||
| { | ||||
| 	list_elt listElt; | ||||
| 	u32 generation; | ||||
| 	mg_surface surface; | ||||
| 	vec2 size; | ||||
| 
 | ||||
| } mg_image_data; | ||||
| 
 | ||||
| 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 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, | ||||
|                                                            mg_image_data* image, | ||||
|                                                            mp_rect region, | ||||
|                                                            u8* pixels); | ||||
| 
 | ||||
| typedef void (*mg_canvas_backend_render_proc)(mg_canvas_backend* backend, | ||||
|                                               mg_color clearColor, | ||||
|                                               u32 primitiveCount, | ||||
|                                               mg_primitive* primitives, | ||||
|                                               u32 eltCount, | ||||
|                                               mg_path_elt* pathElements); | ||||
| 
 | ||||
| typedef struct mg_canvas_backend | ||||
| { | ||||
| 	mg_canvas_backend_destroy_proc destroy; | ||||
| 
 | ||||
| 	mg_canvas_backend_image_create_proc imageCreate; | ||||
| 	mg_canvas_backend_image_destroy_proc imageDestroy; | ||||
| 	mg_canvas_backend_image_upload_region_proc imageUploadRegion; | ||||
| 
 | ||||
| 	mg_canvas_backend_render_proc render; | ||||
| 
 | ||||
| } mg_canvas_backend; | ||||
| 
 | ||||
| #ifdef __cplusplus | ||||
| } // extern "C"
 | ||||
| #endif | ||||
| 
 | ||||
| #endif //__GRAPHICS_SURFACE_H_
 | ||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							|  | @ -12,8 +12,8 @@ | |||
| #include<simd/simd.h> | ||||
| 
 | ||||
| #include"graphics_surface.h" | ||||
| #include"macro_helpers.h" | ||||
| #include"osx_app.h" | ||||
| #include"util/macro_helpers.h" | ||||
| #include"app/osx_app.h" | ||||
| 
 | ||||
| typedef struct mg_mtl_surface | ||||
| { | ||||
|  | @ -6,12 +6,12 @@ | |||
| *	@revision: | ||||
| * | ||||
| *****************************************************************/ | ||||
| #include"win32_app.h" | ||||
| #include"app/win32_app.h" | ||||
| #include"graphics_surface.h" | ||||
| #include"gl_loader.h" | ||||
| 
 | ||||
| #include<GL/wglext.h> | ||||
| #include"macro_helpers.h" | ||||
| #include"util/macro_helpers.h" | ||||
| 
 | ||||
| #define WGL_PROC_LIST \ | ||||
| 	WGL_PROC(WGLCHOOSEPIXELFORMATARB, wglChoosePixelFormatARB) \ | ||||
|  | @ -60,24 +60,24 @@ | |||
| //---------------------------------------------------------------
 | ||||
| 
 | ||||
| #if PLATFORM_WINDOWS | ||||
| 	#include"win32_app.c" | ||||
| 	#include"graphics_common.c" | ||||
| 	#include"graphics_surface.c" | ||||
| 	#include"app/win32_app.c" | ||||
| 	#include"graphics/graphics_common.c" | ||||
| 	#include"graphics/graphics_surface.c" | ||||
| 
 | ||||
| 	#if MG_COMPILE_GL || MG_COMPILE_GLES | ||||
| 		#include"gl_loader.c" | ||||
| 		#include"graphics/gl_loader.c" | ||||
| 	#endif | ||||
| 
 | ||||
| 	#if MG_COMPILE_GL | ||||
| 		#include"wgl_surface.c" | ||||
| 		#include"graphics/wgl_surface.c" | ||||
| 	#endif | ||||
| 
 | ||||
| 	#if MG_COMPILE_CANVAS | ||||
| 		#include"gl_canvas.c" | ||||
| 		#include"graphics/gl_canvas.c" | ||||
| 	#endif | ||||
| 
 | ||||
| 	#if MG_COMPILE_GLES | ||||
| 		#include"egl_surface.c" | ||||
| 		#include"graphics/egl_surface.c" | ||||
| 	#endif | ||||
| 
 | ||||
| #elif PLATFORM_MACOS | ||||
|  | @ -86,5 +86,5 @@ | |||
| 	#error "Unsupported platform" | ||||
| #endif | ||||
| 
 | ||||
| #include"input_state.c" | ||||
| #include"ui.c" | ||||
| #include"ui/input_state.c" | ||||
| #include"ui/ui.c" | ||||
|  |  | |||
|  | @ -38,15 +38,13 @@ | |||
| //----------------------------------------------------------------
 | ||||
| // application/graphics layer
 | ||||
| //----------------------------------------------------------------
 | ||||
| #include"mp_app.h" | ||||
| #include"graphics.h" | ||||
| #include"input_state.h" | ||||
| #include"ui.h" | ||||
| #include"app/mp_app.h" | ||||
| #include"graphics/graphics.h" | ||||
| #include"ui/input_state.h" | ||||
| #include"ui/ui.h" | ||||
| 
 | ||||
| #ifdef MG_INCLUDE_GL_API | ||||
| 	#include"gl_api.h" | ||||
| 	#include"graphics/gl_api.h" | ||||
| #endif | ||||
| 
 | ||||
| //#include"ui.h"
 | ||||
| 
 | ||||
| #endif //__MILEPOST_H_
 | ||||
|  |  | |||
|  | @ -7,20 +7,20 @@ | |||
| * | ||||
| *****************************************************************/ | ||||
| 
 | ||||
| #include"osx_path.m" | ||||
| #include"osx_app.m" | ||||
| #include"graphics_common.c" | ||||
| #include"graphics_surface.c" | ||||
| #include"platform/osx_path.m" | ||||
| #include"app/osx_app.m" | ||||
| #include"graphics/graphics_common.c" | ||||
| #include"graphics/graphics_surface.c" | ||||
| 
 | ||||
| #if MG_COMPILE_METAL | ||||
| 	#include"mtl_surface.m" | ||||
| 	#include"graphics/mtl_surface.m" | ||||
| #endif | ||||
| 
 | ||||
| #if MG_COMPILE_CANVAS | ||||
| 	#include"mtl_renderer.m" | ||||
| 	#include"graphics/mtl_renderer.m" | ||||
| #endif | ||||
| 
 | ||||
| #if MG_COMPILE_GLES | ||||
| 	#include"gl_loader.c" | ||||
| 	#include"egl_surface.c" | ||||
| 	#include"graphics/gl_loader.c" | ||||
| 	#include"graphics/egl_surface.c" | ||||
| #endif | ||||
|  |  | |||
|  | @ -12,7 +12,7 @@ | |||
| #include"util/typedefs.h" | ||||
| #include"util/strings.h" | ||||
| #include"util/utf8.h" | ||||
| #include"mp_app.h" | ||||
| #include"app/mp_app.h" | ||||
| 
 | ||||
| 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 <graphics.h> | ||||
| #include <math.h> | ||||
| 
 | ||||
| #include <orca.h> | ||||
|  |  | |||
|  | @ -11,6 +11,7 @@ else | |||
|   CLANG=clang | ||||
| fi | ||||
| 
 | ||||
| ORCA_DIR=../.. | ||||
| STDLIB_DIR=../../cstdlib | ||||
| ORCA_SDK_DIR=../../sdk | ||||
| MILEPOST_DIR=../../milepost | ||||
|  | @ -25,6 +26,7 @@ wasmFlags="--target=wasm32 \ | |||
|   -mbulk-memory \ | ||||
|   -D__ORCA__ \ | ||||
|   -I $STDLIB_DIR/include \ | ||||
|   -I $ORCA_DIR/ext \ | ||||
|   -I $ORCA_SDK_DIR \ | ||||
|   -I $MILEPOST_DIR/ext -I $MILEPOST_DIR -I $MILEPOST_DIR/src" | ||||
| 
 | ||||
|  |  | |||
|  | @ -1,5 +1,4 @@ | |||
| #include <keys.h> | ||||
| #include <graphics.h> | ||||
| #include <math.h> | ||||
| 
 | ||||
| #include <orca.h> | ||||
|  |  | |||
|  | @ -11,6 +11,8 @@ else | |||
|   CLANG=clang | ||||
| fi | ||||
| 
 | ||||
| ORCA_DIR=../.. | ||||
| 
 | ||||
| wasmFlags="--target=wasm32 \ | ||||
|   --no-standard-libraries \ | ||||
|   -fno-builtin \ | ||||
|  | @ -20,6 +22,7 @@ wasmFlags="--target=wasm32 \ | |||
|   -O2 \ | ||||
|   -mbulk-memory \ | ||||
|   -D__ORCA__ \ | ||||
|   -I $ORCA_DIR/ext \ | ||||
|   -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 | ||||
|  |  | |||
|  | @ -1,6 +1,4 @@ | |||
| #include"keys.h" | ||||
| #include"graphics.h" | ||||
| #include"ui.h" | ||||
| 
 | ||||
| #include"orca.h" | ||||
| 
 | ||||
|  |  | |||
|  | @ -168,7 +168,7 @@ def build_milepost_lib_mac(release): | |||
|         # TODO: shaderFlagParam | ||||
|         "-fno-fast-math", "-c", | ||||
|         "-o", "../build/mtl_renderer.air", | ||||
|         "src/mtl_renderer.metal", | ||||
|         "src/graphics/mtl_renderer.metal", | ||||
|     ], check=True) | ||||
|     subprocess.run([ | ||||
|         "xcrun", "-sdk", "macosx", "metallib", | ||||
|  | @ -302,7 +302,8 @@ def build_orca_win(release): | |||
|     includes = [ | ||||
|         "/I", "src", | ||||
|         "/I", "sdk", | ||||
|         "/I", "ext" | ||||
|         "/I", "ext", | ||||
|         "/I", "ext/angle/include", | ||||
|         "/I", "ext/wasm3/source", | ||||
|         "/I", "milepost/src" | ||||
|     ] | ||||
|  | @ -332,6 +333,7 @@ def build_orca_mac(release): | |||
|         "-Imilepost/src/util", | ||||
|         "-Imilepost/src/platform", | ||||
|         "-Iext", | ||||
|         "-Iext/angle/include", | ||||
|         "-Iext/wasm3/source" | ||||
|     ] | ||||
|     libs = ["-Lbuild/bin", "-Lbuild/lib", "-lmilepost", "-lwasm3"] | ||||
|  | @ -380,12 +382,12 @@ def gen_all_bindings(): | |||
| 
 | ||||
|     bindgen("canvas", "src/canvas_api.json", | ||||
|         guest_stubs="sdk/orca_surface.c", | ||||
|         guest_include="graphics.h", | ||||
|         guest_include="graphics/graphics.h", | ||||
|         wasm3_bindings="src/canvas_api_bind_gen.c", | ||||
|     ) | ||||
|     bindgen("clock", "src/clock_api.json", | ||||
|         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", | ||||
|     ) | ||||
|     bindgen("io", "src/io_api.json", | ||||
|  |  | |||
|  | @ -18,10 +18,10 @@ | |||
| #include"util/strings.c" | ||||
| #include"util/utf8.c" | ||||
| 
 | ||||
| #include"graphics_common.c" | ||||
| #include"input_state.c" | ||||
| #include"graphics/graphics_common.c" | ||||
| #include"ui/input_state.c" | ||||
| #include"ui/ui.c" | ||||
| 
 | ||||
| #include"orca_exports.c" | ||||
| #include"orca_surface.c" | ||||
| #include"ui.c" | ||||
| 
 | ||||
| #include"io_stubs.c" | ||||
|  |  | |||
|  | @ -21,7 +21,10 @@ | |||
| 
 | ||||
| #include"math.h" | ||||
| 
 | ||||
| #include"graphics.h" | ||||
| #include"graphics/graphics.h" | ||||
| #include"ui/input_state.h" | ||||
| #include"ui/ui.h" | ||||
| 
 | ||||
| #include"gl31.h" | ||||
| 
 | ||||
| #if COMPILER_CLANG | ||||
|  |  | |||
|  | @ -11,7 +11,7 @@ | |||
| 
 | ||||
| #define MG_INCLUDE_GL_API | ||||
| #include"milepost.h" | ||||
| #include"graphics_common.h" | ||||
| #include"graphics/graphics_common.h" | ||||
| 
 | ||||
| #include"orca_app.h" | ||||
| 
 | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue