[platform/canvas]
- Changed canvas coordinate system to match UI coord system (origin at top left, y axis down) - Changed mouse coordinate system to match UI and canvas - No need to pass width/height to ui_begin_frame() anymore
This commit is contained in:
		
							parent
							
								
									7b2ef080e8
								
							
						
					
					
						commit
						1212d714d5
					
				| 
						 | 
				
			
			@ -51,8 +51,8 @@ int main()
 | 
			
		|||
	str8 path1 = mp_app_get_resource_path(mem_scratch(), "../resources/triceratops.png");
 | 
			
		||||
	str8 path2 = mp_app_get_resource_path(mem_scratch(), "../resources/Top512.png");
 | 
			
		||||
 | 
			
		||||
	mg_image_region image1 = mg_image_atlas_alloc_from_file(atlas, atlasImage, path1, true);
 | 
			
		||||
	mg_image_region image2 = mg_image_atlas_alloc_from_file(atlas, atlasImage, path2, true);
 | 
			
		||||
	mg_image_region image1 = mg_image_atlas_alloc_from_file(atlas, atlasImage, path1, false);
 | 
			
		||||
	mg_image_region image2 = mg_image_atlas_alloc_from_file(atlas, atlasImage, path2, false);
 | 
			
		||||
 | 
			
		||||
	// start app
 | 
			
		||||
	mp_window_bring_to_front(window);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -123,14 +123,14 @@ int main()
 | 
			
		|||
						{
 | 
			
		||||
							if(y + 200 < contentRect.h)
 | 
			
		||||
							{
 | 
			
		||||
								y+=5;
 | 
			
		||||
								y-=5;
 | 
			
		||||
							}
 | 
			
		||||
						}
 | 
			
		||||
						else if(event.key.code == MP_KEY_DOWN)
 | 
			
		||||
						{
 | 
			
		||||
							if(y - 200 > 0)
 | 
			
		||||
							{
 | 
			
		||||
								y-=5;
 | 
			
		||||
								y+=5;
 | 
			
		||||
							}
 | 
			
		||||
						}
 | 
			
		||||
						//*/
 | 
			
		||||
| 
						 | 
				
			
			@ -180,19 +180,19 @@ int main()
 | 
			
		|||
 | 
			
		||||
			mg_set_color_rgba(0, 0, 0, 1);
 | 
			
		||||
			mg_set_width(20);
 | 
			
		||||
			mg_move_to(x-100, y-100);
 | 
			
		||||
			mg_cubic_to(x-50, y-150+frown, x+50, y-150+frown, x+100, y-100);
 | 
			
		||||
			mg_move_to(x-100, y+100);
 | 
			
		||||
			mg_cubic_to(x-50, y+150+frown, x+50, y+150+frown, x+100, y+100);
 | 
			
		||||
			mg_stroke();
 | 
			
		||||
 | 
			
		||||
			// eyes
 | 
			
		||||
			mg_ellipse_fill(x-70, y+50, 30, 50);
 | 
			
		||||
			mg_ellipse_fill(x+70, y+50, 30, 50);
 | 
			
		||||
			mg_ellipse_fill(x-70, y-50, 30, 50);
 | 
			
		||||
			mg_ellipse_fill(x+70, y-50, 30, 50);
 | 
			
		||||
 | 
			
		||||
			// text
 | 
			
		||||
			mg_set_color_rgba(0, 0, 1, 1);
 | 
			
		||||
			mg_set_font(font);
 | 
			
		||||
			mg_set_font_size(12);
 | 
			
		||||
			mg_move_to(50, 50);
 | 
			
		||||
			mg_move_to(50, 600-50);
 | 
			
		||||
 | 
			
		||||
			str8 text = str8_pushf(mem_scratch(),
 | 
			
		||||
			                      "Milepost vector graphics test program (frame time = %fs, fps = %f)...",
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -43,11 +43,11 @@ int main()
 | 
			
		|||
 | 
			
		||||
	//NOTE: create image
 | 
			
		||||
	str8 imagePath = mp_app_get_resource_path(mem_scratch(), "../resources/triceratops.png");
 | 
			
		||||
	mg_image image = mg_image_create_from_file(imagePath, true);
 | 
			
		||||
	mg_image image = mg_image_create_from_file(imagePath, false);
 | 
			
		||||
	vec2 imageSize = mg_image_size(image);
 | 
			
		||||
 | 
			
		||||
	str8 imagePath2 = mp_app_get_resource_path(mem_scratch(), "../resources/Top512.png");
 | 
			
		||||
	mg_image image2 = mg_image_create_from_file(imagePath2, true);
 | 
			
		||||
	mg_image image2 = mg_image_create_from_file(imagePath2, false);
 | 
			
		||||
	vec2 imageSize2 = mg_image_size(image2);
 | 
			
		||||
 | 
			
		||||
	// start app
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -140,11 +140,8 @@ int main()
 | 
			
		|||
	f32 zoom = 1;
 | 
			
		||||
 | 
			
		||||
	f32 startX = 10;
 | 
			
		||||
	f32 startY = (contentRect.h - lineHeight - 10);
 | 
			
		||||
/*
 | 
			
		||||
	f32 startX = -100;
 | 
			
		||||
	f32 startY = -100;
 | 
			
		||||
*/
 | 
			
		||||
	f32 startY = 10 + lineHeight;
 | 
			
		||||
 | 
			
		||||
	while(!mp_should_quit())
 | 
			
		||||
	{
 | 
			
		||||
		f64 startFrameTime = mp_get_time(MP_CLOCK_MONOTONIC);
 | 
			
		||||
| 
						 | 
				
			
			@ -167,7 +164,7 @@ int main()
 | 
			
		|||
						if(event.key.action == MP_KEY_PRESS)
 | 
			
		||||
						{
 | 
			
		||||
							tracked = true;
 | 
			
		||||
							vec2 mousePos = mp_input_mouse_position();
 | 
			
		||||
							vec2 mousePos = mp_mouse_position();
 | 
			
		||||
							trackPoint.x = mousePos.x/zoom - startX;
 | 
			
		||||
							trackPoint.y = mousePos.y/zoom - startY;
 | 
			
		||||
						}
 | 
			
		||||
| 
						 | 
				
			
			@ -180,7 +177,7 @@ int main()
 | 
			
		|||
 | 
			
		||||
				case MP_EVENT_MOUSE_WHEEL:
 | 
			
		||||
				{
 | 
			
		||||
					vec2 mousePos = mp_input_mouse_position();
 | 
			
		||||
					vec2 mousePos = mp_mouse_position();
 | 
			
		||||
					f32 trackX = mousePos.x/zoom - startX;
 | 
			
		||||
					f32 trackY = mousePos.y/zoom - startY;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -198,7 +195,7 @@ int main()
 | 
			
		|||
 | 
			
		||||
		if(tracked)
 | 
			
		||||
		{
 | 
			
		||||
			vec2 mousePos = mp_input_mouse_position();
 | 
			
		||||
			vec2 mousePos = mp_mouse_position();
 | 
			
		||||
			startX = mousePos.x/zoom - trackPoint.x;
 | 
			
		||||
			startY = mousePos.y/zoom - trackPoint.y;
 | 
			
		||||
		}
 | 
			
		||||
| 
						 | 
				
			
			@ -249,7 +246,7 @@ int main()
 | 
			
		|||
				mg_glyph_outlines((str32){subIndex, glyphs});
 | 
			
		||||
				mg_fill();
 | 
			
		||||
 | 
			
		||||
				textY -= lineHeight;
 | 
			
		||||
				textY += lineHeight;
 | 
			
		||||
				mg_move_to(textX, textY);
 | 
			
		||||
				startIndex++;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -261,7 +258,7 @@ int main()
 | 
			
		|||
			mg_set_color_rgba(0, 0, 1, 1);
 | 
			
		||||
			mg_set_font(font);
 | 
			
		||||
			mg_set_font_size(14);
 | 
			
		||||
			mg_move_to(10, 10 + lineHeight);
 | 
			
		||||
			mg_move_to(10, contentRect.h - 10 - lineHeight);
 | 
			
		||||
 | 
			
		||||
			str8 text = str8_pushf(mem_scratch(),
 | 
			
		||||
			                      "Test program: %i glyphs, frame time = %fs, fps = %f",
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -258,7 +258,7 @@ int main()
 | 
			
		|||
		ui_flags defaultFlags = UI_FLAG_DRAW_BORDER;
 | 
			
		||||
 | 
			
		||||
		ui_box* root = 0;
 | 
			
		||||
		ui_frame(800, 610)
 | 
			
		||||
		ui_frame()
 | 
			
		||||
		{
 | 
			
		||||
			root = ui_box_top();
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -3348,7 +3348,7 @@ mp_rect mg_glyph_outlines_from_font_data(mg_font_data* fontData, str32 glyphIndi
 | 
			
		|||
 | 
			
		||||
		f32 xOffset = canvas->subPathLastPoint.x;
 | 
			
		||||
		f32 yOffset = canvas->subPathLastPoint.y;
 | 
			
		||||
		f32 flip = canvas->textFlip ? -1 : 1;
 | 
			
		||||
		f32 flip = canvas->textFlip ? 1 : -1;
 | 
			
		||||
 | 
			
		||||
		if(!glyphIndex || glyphIndex >= fontData->glyphCount)
 | 
			
		||||
		{
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -16,7 +16,7 @@ vertex vs_out VertexShader(ushort vid [[vertex_id]])
 | 
			
		|||
{
 | 
			
		||||
	vs_out out;
 | 
			
		||||
	out.uv = float2((vid << 1) & 2, vid & 2);
 | 
			
		||||
	out.pos = float4(out.uv * float2(2, 2) + float2(-1, -1), 0, 1);
 | 
			
		||||
	out.pos = float4(out.uv * float2(2, -2) + float2(-1, 1), 0, 1);
 | 
			
		||||
	return(out);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -871,12 +871,12 @@ static void mp_process_mouse_button(NSEvent* nsEvent, mp_window_data* window, mp
 | 
			
		|||
	event.type = MP_EVENT_MOUSE_MOVE;
 | 
			
		||||
	event.window = mp_window_handle_from_ptr(window);
 | 
			
		||||
	event.move.x = p.x;
 | 
			
		||||
	event.move.y = p.y;
 | 
			
		||||
	event.move.y = frame.size.height - p.y;
 | 
			
		||||
	event.move.deltaX = [nsEvent deltaX];
 | 
			
		||||
	event.move.deltaY = -[nsEvent deltaY];
 | 
			
		||||
	event.move.deltaY = [nsEvent deltaY];
 | 
			
		||||
	event.move.mods = mp_convert_osx_mods([nsEvent modifierFlags]);
 | 
			
		||||
 | 
			
		||||
	mp_update_mouse_move(p.x, p.y, event.move.deltaX, event.move.deltaY);
 | 
			
		||||
	mp_update_mouse_move(event.move.x, event.move.y, event.move.deltaX, event.move.deltaY);
 | 
			
		||||
 | 
			
		||||
	mp_queue_event(&event);
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -891,7 +891,7 @@ static void mp_process_mouse_button(NSEvent* nsEvent, mp_window_data* window, mp
 | 
			
		|||
	event.move.x = 0;
 | 
			
		||||
	event.move.y = 0;
 | 
			
		||||
	event.move.deltaX = [nsEvent scrollingDeltaX]*factor;
 | 
			
		||||
	event.move.deltaY = [nsEvent scrollingDeltaY]*factor;
 | 
			
		||||
	event.move.deltaY = -[nsEvent scrollingDeltaY]*factor;
 | 
			
		||||
	event.move.mods = mp_convert_osx_mods([nsEvent modifierFlags]);
 | 
			
		||||
 | 
			
		||||
	mp_update_mouse_wheel(event.move.deltaX, event.move.deltaY);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										25
									
								
								src/ui.c
								
								
								
								
							
							
						
						
									
										25
									
								
								src/ui.c
								
								
								
								
							| 
						 | 
				
			
			@ -66,9 +66,6 @@ typedef struct ui_context
 | 
			
		|||
{
 | 
			
		||||
	bool init;
 | 
			
		||||
 | 
			
		||||
	f32 width;
 | 
			
		||||
	f32 height;
 | 
			
		||||
 | 
			
		||||
	u64 frameCounter;
 | 
			
		||||
	f64 frameTime;
 | 
			
		||||
	f64 lastFrameDuration;
 | 
			
		||||
| 
						 | 
				
			
			@ -384,10 +381,7 @@ bool ui_box_hovering(ui_box* box, vec2 p)
 | 
			
		|||
 | 
			
		||||
vec2 ui_mouse_position(void)
 | 
			
		||||
{
 | 
			
		||||
	ui_context* ui = ui_get_context();
 | 
			
		||||
 | 
			
		||||
	vec2 mousePos = mp_mouse_position();
 | 
			
		||||
	mousePos.y = ui->height - mousePos.y;
 | 
			
		||||
	return(mousePos);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -395,7 +389,6 @@ vec2 ui_mouse_delta(void)
 | 
			
		|||
{
 | 
			
		||||
	ui_context* ui = ui_get_context();
 | 
			
		||||
	vec2 delta = mp_mouse_delta();
 | 
			
		||||
	delta.y *= -1.;
 | 
			
		||||
	return(delta);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -403,7 +396,6 @@ vec2 ui_mouse_wheel(void)
 | 
			
		|||
{
 | 
			
		||||
	ui_context* ui = ui_get_context();
 | 
			
		||||
	vec2 delta = mp_mouse_wheel();
 | 
			
		||||
	delta.y *= -1.;
 | 
			
		||||
	return(delta);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -1278,33 +1270,24 @@ void ui_draw()
 | 
			
		|||
	ui_context* ui = ui_get_context();
 | 
			
		||||
 | 
			
		||||
	//NOTE: draw
 | 
			
		||||
	mg_mat2x3 transform = {1, 0, 0,
 | 
			
		||||
	                       0, -1, ui->height};
 | 
			
		||||
 | 
			
		||||
	bool oldTextFlip = mg_get_text_flip();
 | 
			
		||||
	mg_set_text_flip(true);
 | 
			
		||||
	mg_set_text_flip(false);
 | 
			
		||||
 | 
			
		||||
	mg_matrix_push(transform);
 | 
			
		||||
	ui_draw_box(ui->root);
 | 
			
		||||
	mg_matrix_pop();
 | 
			
		||||
 | 
			
		||||
	mg_set_text_flip(oldTextFlip);
 | 
			
		||||
 | 
			
		||||
	//TODO: restore flip??
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
//-----------------------------------------------------------------------------
 | 
			
		||||
// frame begin/end
 | 
			
		||||
//-----------------------------------------------------------------------------
 | 
			
		||||
 | 
			
		||||
void ui_begin_frame(u32 width, u32 height)
 | 
			
		||||
void ui_begin_frame()
 | 
			
		||||
{
 | 
			
		||||
	ui_context* ui = ui_get_context();
 | 
			
		||||
 | 
			
		||||
	mem_arena_clear(&ui->frameArena);
 | 
			
		||||
 | 
			
		||||
	ui->width = width;
 | 
			
		||||
	ui->height = height;
 | 
			
		||||
	ui->frameCounter++;
 | 
			
		||||
	f64 time = mp_get_time(MP_CLOCK_MONOTONIC);
 | 
			
		||||
	ui->lastFrameDuration = time - ui->frameTime;
 | 
			
		||||
| 
						 | 
				
			
			@ -1314,8 +1297,8 @@ void ui_begin_frame(u32 width, u32 height)
 | 
			
		|||
	ui->z = 0;
 | 
			
		||||
 | 
			
		||||
	ui_style defaultStyle = {0};
 | 
			
		||||
	defaultStyle.size.s[UI_AXIS_X] = (ui_size){UI_SIZE_PIXELS, width, 0};
 | 
			
		||||
	defaultStyle.size.s[UI_AXIS_Y] = (ui_size){UI_SIZE_PIXELS, height, 0};
 | 
			
		||||
	defaultStyle.size.s[UI_AXIS_X] = (ui_size){UI_SIZE_CHILDREN};
 | 
			
		||||
	defaultStyle.size.s[UI_AXIS_Y] = (ui_size){UI_SIZE_CHILDREN};
 | 
			
		||||
 | 
			
		||||
	ui->root = ui_box_begin("_root_", 0);
 | 
			
		||||
	*ui->root->targetStyle = defaultStyle;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										4
									
								
								src/ui.h
								
								
								
								
							
							
						
						
									
										4
									
								
								src/ui.h
								
								
								
								
							| 
						 | 
				
			
			@ -316,11 +316,11 @@ void ui_init(void);
 | 
			
		|||
ui_context* ui_get_context(void);
 | 
			
		||||
void ui_set_context(ui_context* context);
 | 
			
		||||
 | 
			
		||||
void ui_begin_frame(u32 width, u32 height);
 | 
			
		||||
void ui_begin_frame(void);
 | 
			
		||||
void ui_end_frame(void);
 | 
			
		||||
void ui_draw(void);
 | 
			
		||||
 | 
			
		||||
#define ui_frame(width, height) defer_loop(ui_begin_frame(width, height), ui_end_frame())
 | 
			
		||||
#define ui_frame() defer_loop(ui_begin_frame(), ui_end_frame())
 | 
			
		||||
 | 
			
		||||
//-------------------------------------------------------------------------------------
 | 
			
		||||
// Box keys
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -19,17 +19,11 @@ extern "C" {
 | 
			
		|||
#define OFFSET_OF_CONTAINER(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)
 | 
			
		||||
 | 
			
		||||
#ifdef __cplusplus
 | 
			
		||||
#define CONTAINER_OF(ptr, type, member) ({          \
 | 
			
		||||
	#define CONTAINER_OF(ptr, type, member) ({          \
 | 
			
		||||
		    const decltype( ((type *)0)->member ) *__mptr = (ptr);    \
 | 
			
		||||
		    (type *)( (char *)__mptr - OFFSET_OF_CONTAINER(type,member) );})
 | 
			
		||||
#else
 | 
			
		||||
/*
 | 
			
		||||
#define CONTAINER_OF(ptr, type, member) ({          \
 | 
			
		||||
		    const char *__mptr = (char*)(ptr);    \
 | 
			
		||||
		    (type *)(__mptr - OFFSET_OF_CONTAINER(type,member) );})
 | 
			
		||||
*/
 | 
			
		||||
#define CONTAINER_OF(ptr, type, member) (type *)((char*)(ptr) - OFFSET_OF_CONTAINER(type,member))
 | 
			
		||||
 | 
			
		||||
	#define CONTAINER_OF(ptr, type, member) (type *)((char*)(ptr) - OFFSET_OF_CONTAINER(type,member))
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
//-------------------------------------------------------------------------
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -9,6 +9,7 @@
 | 
			
		|||
#ifndef __STRINGS_H_
 | 
			
		||||
#define __STRINGS_H_
 | 
			
		||||
 | 
			
		||||
#include<string.h>
 | 
			
		||||
#include"typedefs.h"
 | 
			
		||||
#include"lists.h"
 | 
			
		||||
#include"memory.h"
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue