Add notion of rect struct and button rendering
Begin switching over to using Rect instead of V4s for rectangle operations
for added semantics of pos and size, instead of 2 coordinate points. There
    are more meaningful rectangle operations based on its position and
    size. By providing that upfront it's more intuitive and convenient
    than deducing size from subtracting two vector elements.
			
			
This commit is contained in:
		
							parent
							
								
									adb1aa83f3
								
							
						
					
					
						commit
						8eb9068093
					
				| @ -82,6 +82,9 @@ INTERNAL void rendererInit(GameState *state, v2 windowSize) | ||||
| // TODO(doyle): Remove and implement own random generator!
 | ||||
| #include <time.h> | ||||
| #include <stdlib.h> | ||||
| 
 | ||||
| GLOBAL_VAR UiState uiState = {0}; | ||||
| 
 | ||||
| void worldTraveller_gameInit(GameState *state, v2 windowSize) | ||||
| { | ||||
| 	AssetManager *assetManager = &state->assetManager; | ||||
| @ -342,6 +345,9 @@ void worldTraveller_gameInit(GameState *state, v2 windowSize) | ||||
| #endif | ||||
| 
 | ||||
| 	srand(CAST(u32)(time(NULL))); | ||||
| 
 | ||||
| 	uiState.mouseP      = &state->input.mouse; | ||||
| 	uiState.mouseIsDown = &state->input.mouseLeft; | ||||
| } | ||||
| 
 | ||||
| INTERNAL inline v4 getEntityScreenRect(Entity entity) | ||||
| @ -609,7 +615,6 @@ INTERNAL inline void resetEntityState(World *world, Entity *entity) | ||||
| 	entity->stats->entityIdToAttack = ENTITY_NULL_ID; | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| INTERNAL registerEvent(EventQueue *eventQueue, enum EventType type, void *data) | ||||
| { | ||||
| #ifdef DENGINE_DEBUG | ||||
| @ -620,6 +625,7 @@ INTERNAL registerEvent(EventQueue *eventQueue, enum EventType type, void *data) | ||||
| 	eventQueue->queue[currIndex].type = type; | ||||
| 	eventQueue->queue[currIndex].data = data; | ||||
| } | ||||
| 
 | ||||
| INTERNAL void entityStateSwitch(EventQueue *eventQueue, World *world, | ||||
|                                 Entity *entity, enum EntityState newState) | ||||
| { | ||||
| @ -876,7 +882,49 @@ INTERNAL void sortWorldEntityList(World *world, i32 numDeadEntities) | ||||
| 	world->freeEntityIndex -= numDeadEntities; | ||||
| } | ||||
| 
 | ||||
| UiState uiState = {0}; | ||||
| INTERNAL b32 pointInRect(Rect rect, v2 point) | ||||
| { | ||||
| 	if (point.x < rect.pos.x || point.x > rect.pos.x + rect.size.w || | ||||
| 	    point.y > rect.pos.y + rect.size.h || point.y < rect.pos.y) | ||||
| 		return FALSE; | ||||
| 	return TRUE; | ||||
| } | ||||
| 
 | ||||
| i32 button(AssetManager *assetManager, Renderer *renderer, i32 id, Rect rect, | ||||
|            v2 mouseP) | ||||
| { | ||||
| 	if (pointInRect(rect, mouseP)) | ||||
| 	{ | ||||
| 		uiState.hotItem = id; | ||||
| 		if (uiState.activeItem == 0 && uiState.mouseIsDown) | ||||
| 			uiState.activeItem = id; | ||||
| 	} | ||||
| 
 | ||||
| 	RenderTex renderTex = renderer_createNullRenderTex(assetManager); | ||||
| 	renderer_staticRect(renderer, v2_add(V2(8, 8), rect.pos), rect.size, | ||||
| 	                    V2(0, 0), 0, renderTex, V4(0, 0, 0, 1)); | ||||
| 	if (uiState.hotItem == id) | ||||
| 	{ | ||||
| 		if (uiState.activeItem == id) | ||||
| 		{ | ||||
| 			renderer_staticRect(renderer, v2_add(V2(2, 2), rect.pos), rect.size, | ||||
| 			                    V2(0, 0), 0, renderTex, V4(1, 1, 1, 1)); | ||||
| 		} | ||||
| 		else | ||||
| 		{ | ||||
| 			renderer_staticRect(renderer, v2_add(V2(0, 0), rect.pos), rect.size, | ||||
| 			                    V2(0, 0), 0, renderTex, V4(1, 1, 1, 1)); | ||||
| 		} | ||||
| 	} | ||||
| 	else | ||||
| 	{ | ||||
| 		renderer_staticRect(renderer, v2_add(V2(0, 0), rect.pos), rect.size, | ||||
| 		                    V2(0, 0), 0, renderTex, V4(0.5f, 0.5f, 0.5f, 1)); | ||||
| 	} | ||||
| 
 | ||||
| 	return 0; | ||||
| } | ||||
| 
 | ||||
| void worldTraveller_gameUpdateAndRender(GameState *state, f32 dt) | ||||
| { | ||||
| 	if (dt >= 1.0f) dt = 1.0f; | ||||
| @ -1128,6 +1176,17 @@ void worldTraveller_gameUpdateAndRender(GameState *state, f32 dt) | ||||
| 	renderer_staticRect(renderer, state->input.mouse, hero->hitboxSize, | ||||
| 	                    V2(0, 0), 0, nullRenderTex, V4(0.5f, 0, 0, 0.5f)); | ||||
| 
 | ||||
| #if 0 | ||||
| 	RenderTex renderTex = renderer_createNullRenderTex(assetManager); | ||||
| 	v2 buttonP = V2(500, 500); | ||||
| 	v2 buttonSize = V2(100, 100); | ||||
| 	renderer_staticRect(renderer, v2_add(V2(8, 8), buttonP), buttonSize, | ||||
| 	                    V2(0, 0), 0, renderTex, V4(0, 0, 0, 1)); | ||||
| #endif | ||||
| 
 | ||||
| 	Rect buttonRect = {V2(500, 500), V2(100, 100)}; | ||||
| 	button(assetManager, renderer, 1, buttonRect, *uiState.mouseP); | ||||
| 
 | ||||
| 	/* Draw hero avatar */ | ||||
| 	TexAtlas *heroAtlas  = asset_getTextureAtlas(assetManager, texlist_hero); | ||||
| 	v4 heroAvatarTexRect = heroAtlas->texRect[herorects_head]; | ||||
|  | ||||
| @ -45,6 +45,12 @@ typedef union v4 | ||||
| 	f32 e[4]; | ||||
| } v4; | ||||
| 
 | ||||
| typedef struct Rect | ||||
| { | ||||
| 	v2 pos; | ||||
| 	v2 size; | ||||
| } Rect; | ||||
| 
 | ||||
| INTERNAL inline v2 V2i(const i32 x, const i32 y) | ||||
| { | ||||
| 	v2 result = {CAST(f32)x, CAST(f32)y}; | ||||
|  | ||||
| @ -15,6 +15,8 @@ | ||||
| 
 | ||||
| typedef struct UiState | ||||
| { | ||||
| 	v2 *mouseP; | ||||
| 	b32 *mouseIsDown; | ||||
| 	i32 hotItem; | ||||
| 	i32 activeItem; | ||||
| } UiState; | ||||
| @ -53,7 +55,6 @@ typedef struct GameState | ||||
| 	AssetManager assetManager; | ||||
| 	AudioManager audioManager; | ||||
| 	MemoryArena arena; | ||||
| 	UiState uiState; | ||||
| } GameState; | ||||
| 
 | ||||
| void worldTraveller_gameInit(GameState *state, v2 windowSize); | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user