Asteroid data merged to entity and display
Asteroids move and are a part of the entity sytem. Added some debug markers for memory usage and fixed a bug in logic causing degenerate triangles to show up depending on the angle of approach towards the origin.
This commit is contained in:
		
							parent
							
								
									e49984b3d0
								
							
						
					
					
						commit
						064d17d34c
					
				
							
								
								
									
										189
									
								
								src/Asteroid.c
									
									
									
									
									
								
							
							
						
						
									
										189
									
								
								src/Asteroid.c
									
									
									
									
									
								
							| @ -241,27 +241,24 @@ Basis getDefaultBasis(Entity *entity) | |||||||
| 
 | 
 | ||||||
| #include <stdlib.h> | #include <stdlib.h> | ||||||
| #include <time.h> | #include <time.h> | ||||||
| v2 *createAsteroidVertexList(MemoryArena_ *arena, v2 pos, i32 iterations) | v2 *createAsteroidVertexList(MemoryArena_ *arena, i32 iterations, | ||||||
|  |                              i32 asteroidRadius) | ||||||
| { | { | ||||||
| 	f32 iterationAngle = 360.0f / iterations; | 	f32 iterationAngle = 360.0f / iterations; | ||||||
| 	iterationAngle     = DEGREES_TO_RADIANS(iterationAngle); | 	iterationAngle     = DEGREES_TO_RADIANS(iterationAngle); | ||||||
| 	v2 *result = | 	v2 *result = | ||||||
| 	    memory_pushBytes(arena, iterations * sizeof(v2)); | 	    memory_pushBytes(arena, iterations * sizeof(v2)); | ||||||
| 
 | 
 | ||||||
| 	srand(time(NULL)); |  | ||||||
| 	for (i32 i = 0; i < iterations; i++) | 	for (i32 i = 0; i < iterations; i++) | ||||||
| 	{ | 	{ | ||||||
| 		i32 randValue      = rand(); | 		i32 randValue = rand(); | ||||||
| 		i32 asteroidRadius = (randValue % 100) + 50; |  | ||||||
| 
 |  | ||||||
| 		result[i] = V2(math_cosf(iterationAngle * i) * asteroidRadius, | 		result[i] = V2(math_cosf(iterationAngle * i) * asteroidRadius, | ||||||
| 		               math_sinf(iterationAngle * i) * asteroidRadius); | 		               math_sinf(iterationAngle * i) * asteroidRadius); | ||||||
| 		result[i] = v2_add(result[i], pos); |  | ||||||
| 
 | 
 | ||||||
| #if 1 | #if 1 | ||||||
| 		f32 displacementDist   = 0.25f * asteroidRadius; | 		f32 displacementDist   = 0.50f * asteroidRadius; | ||||||
| 		i32 vertexDisplacement = | 		i32 vertexDisplacement = | ||||||
| 		    randValue % (i32)displacementDist + (i32)(displacementDist * 0.1f); | 		    randValue % (i32)displacementDist + (i32)(displacementDist * 0.25f); | ||||||
| 
 | 
 | ||||||
| 		i32 quadrantSize = iterations / 4; | 		i32 quadrantSize = iterations / 4; | ||||||
| 
 | 
 | ||||||
| @ -296,16 +293,17 @@ v2 *createAsteroidVertexList(MemoryArena_ *arena, v2 pos, i32 iterations) | |||||||
| 	return result; | 	return result; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| LOCAL_PERSIST v2 *asteroidVertexList = NULL; |  | ||||||
| LOCAL_PERSIST f32 updateAsteroidListTimerThreshold = 1.0f; |  | ||||||
| LOCAL_PERSIST f32 updateAsteroidListTimer          = 1.0f; |  | ||||||
| void asteroid_gameUpdateAndRender(GameState *state, Memory *memory, | void asteroid_gameUpdateAndRender(GameState *state, Memory *memory, | ||||||
|                                   v2 windowSize, f32 dt) |                                   v2 windowSize, f32 dt) | ||||||
| { | { | ||||||
| 	i32 iterations = 16; | 	i32 iterations = 16; | ||||||
|  | 
 | ||||||
|  | 	memory_arenaInit(&state->transientArena, memory->transient, | ||||||
|  | 	                 memory->transientSize); | ||||||
|  | 
 | ||||||
| 	if (!state->init) | 	if (!state->init) | ||||||
| 	{ | 	{ | ||||||
| 
 | 		srand(time(NULL)); | ||||||
| 		memory_arenaInit(&state->persistentArena, memory->persistent, | 		memory_arenaInit(&state->persistentArena, memory->persistent, | ||||||
| 		                 memory->persistentSize); | 		                 memory->persistentSize); | ||||||
| 		initAssetManager(state); | 		initAssetManager(state); | ||||||
| @ -314,8 +312,8 @@ void asteroid_gameUpdateAndRender(GameState *state, Memory *memory, | |||||||
| 		state->pixelsPerMeter = 70.0f; | 		state->pixelsPerMeter = 70.0f; | ||||||
| 
 | 
 | ||||||
| 		{ // Init ship entity
 | 		{ // Init ship entity
 | ||||||
| 			Entity *ship     = &state->entityList[state->entityIndex++]; | 			Entity *ship     = &state->entityList[state->entityIndex]; | ||||||
| 			ship->id         = 0; | 			ship->id         = state->entityIndex++; | ||||||
| 			ship->pos        = V2(0, 0); | 			ship->pos        = V2(0, 0); | ||||||
| 			ship->size       = V2(25.0f, 50.0f); | 			ship->size       = V2(25.0f, 50.0f); | ||||||
| 			ship->hitbox     = ship->size; | 			ship->hitbox     = ship->size; | ||||||
| @ -325,7 +323,35 @@ void asteroid_gameUpdateAndRender(GameState *state, Memory *memory, | |||||||
| 			ship->direction  = direction_null; | 			ship->direction  = direction_null; | ||||||
| 			ship->renderMode = rendermode_triangle; | 			ship->renderMode = rendermode_triangle; | ||||||
| 			ship->tex        = NULL; | 			ship->tex        = NULL; | ||||||
| 			ship->collides   = FALSE; | 			ship->collides   = TRUE; | ||||||
|  | 
 | ||||||
|  | 			i32 numAsteroids = 10; | ||||||
|  | 			for (i32 i = 0; i < numAsteroids; i++) | ||||||
|  | 			{ | ||||||
|  | 				Entity *asteroid = &state->entityList[state->entityIndex]; | ||||||
|  | 				asteroid->id     = state->entityIndex++; | ||||||
|  | 
 | ||||||
|  | 				i32 randValue = rand(); | ||||||
|  | 				i32 randX     = (randValue % (i32)windowSize.w); | ||||||
|  | 				i32 randY     = (randValue % (i32)windowSize.h); | ||||||
|  | 				asteroid->pos = V2i(randX, randY); | ||||||
|  | 
 | ||||||
|  | 				asteroid->size       = V2(100.0f, 100.0f); | ||||||
|  | 				asteroid->hitbox     = asteroid->size; | ||||||
|  | 				asteroid->offset     = v2_scale(asteroid->size, 0.5f); | ||||||
|  | 				asteroid->scale      = 1; | ||||||
|  | 				asteroid->type       = entitytype_asteroid; | ||||||
|  | 				asteroid->direction  = direction_null; | ||||||
|  | 				asteroid->renderMode = rendermode_polygon; | ||||||
|  | 
 | ||||||
|  | 				asteroid->numVertexPoints = 16; | ||||||
|  | 				asteroid->vertexPoints    = createAsteroidVertexList( | ||||||
|  | 				    &state->persistentArena, asteroid->numVertexPoints, | ||||||
|  | 				    (i32)(asteroid->size.x * 0.5f)); | ||||||
|  | 
 | ||||||
|  | 				asteroid->tex      = NULL; | ||||||
|  | 				asteroid->collides = TRUE; | ||||||
|  | 			} | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
| 		state->camera.min = V2(0, 0); | 		state->camera.min = V2(0, 0); | ||||||
| @ -336,20 +362,6 @@ void asteroid_gameUpdateAndRender(GameState *state, Memory *memory, | |||||||
| 
 | 
 | ||||||
| 		debug_init(&state->persistentArena, windowSize, | 		debug_init(&state->persistentArena, windowSize, | ||||||
| 		           state->assetManager.font); | 		           state->assetManager.font); | ||||||
| 
 |  | ||||||
| 		asteroidVertexList = |  | ||||||
| 		    createAsteroidVertexList(&state->persistentArena, V2(500, 500), 16); |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	memory_arenaInit(&state->transientArena, memory->transient, |  | ||||||
| 	                 memory->transientSize); |  | ||||||
| 
 |  | ||||||
| 	updateAsteroidListTimer -= dt; |  | ||||||
| 	if (updateAsteroidListTimer < 0) |  | ||||||
| 	{ |  | ||||||
| 		asteroidVertexList = createAsteroidVertexList(&state->persistentArena, |  | ||||||
| 		                                              V2(500, 500), iterations); |  | ||||||
| 		updateAsteroidListTimer = updateAsteroidListTimerThreshold; |  | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	{ | 	{ | ||||||
| @ -411,19 +423,20 @@ void asteroid_gameUpdateAndRender(GameState *state, Memory *memory, | |||||||
| 				ddP          = direction; | 				ddP          = direction; | ||||||
| 			} | 			} | ||||||
| 
 | 
 | ||||||
|  | 			Degrees rotationsPerSecond = 180.0f; | ||||||
| 			if (getKeyStatus(&state->input.keys[keycode_left], | 			if (getKeyStatus(&state->input.keys[keycode_left], | ||||||
| 			                 readkeytype_repeat, 0.0f, dt)) | 			                 readkeytype_repeat, 0.0f, dt)) | ||||||
| 			{ | 			{ | ||||||
| 				entity->rotation += (120.0f) * dt; | 				entity->rotation += (rotationsPerSecond) * dt; | ||||||
| 			} | 			} | ||||||
| 
 | 
 | ||||||
| 			if (getKeyStatus(&state->input.keys[keycode_right], | 			if (getKeyStatus(&state->input.keys[keycode_right], | ||||||
| 			                 readkeytype_repeat, 0.0f, dt)) | 			                 readkeytype_repeat, 0.0f, dt)) | ||||||
| 			{ | 			{ | ||||||
| 				entity->rotation -= (120.0f) * dt; | 				entity->rotation -= (rotationsPerSecond) * dt; | ||||||
| 			} | 			} | ||||||
| 
 | 
 | ||||||
| 			if (ddP.x != 0.0f && ddP.y != 0.0f) | 			if (ddP.x > 0.0f && ddP.y > 0.0f) | ||||||
| 			{ | 			{ | ||||||
| 				// NOTE(doyle): Cheese it and pre-compute the vector for
 | 				// NOTE(doyle): Cheese it and pre-compute the vector for
 | ||||||
| 				// diagonal using pythagoras theorem on a unit triangle 1^2
 | 				// diagonal using pythagoras theorem on a unit triangle 1^2
 | ||||||
| @ -441,9 +454,9 @@ void asteroid_gameUpdateAndRender(GameState *state, Memory *memory, | |||||||
| 
 | 
 | ||||||
| 			ddP = v2_scale(ddP, state->pixelsPerMeter * 25); | 			ddP = v2_scale(ddP, state->pixelsPerMeter * 25); | ||||||
| 
 | 
 | ||||||
| 			v2 oldDp = entity->dP; | 			v2 oldDp      = entity->dP; | ||||||
| 			v2 resistance = v2_scale(oldDp, 2.0f); | 			v2 resistance = v2_scale(oldDp, 2.0f); | ||||||
| 			ddP = v2_sub(ddP, resistance); | 			ddP           = v2_sub(ddP, resistance); | ||||||
| 
 | 
 | ||||||
| 			entity->dP = v2_add(v2_scale(ddP, dt), oldDp); | 			entity->dP = v2_add(v2_scale(ddP, dt), oldDp); | ||||||
| 
 | 
 | ||||||
| @ -458,22 +471,102 @@ void asteroid_gameUpdateAndRender(GameState *state, Memory *memory, | |||||||
| 			DEBUG_PUSH_VAR("Pos: %5.2f, %5.2f", entity->pos, "v2"); | 			DEBUG_PUSH_VAR("Pos: %5.2f, %5.2f", entity->pos, "v2"); | ||||||
| 			DEBUG_PUSH_VAR("Velocity: %5.2f, %5.2f", entity->dP, "v2"); | 			DEBUG_PUSH_VAR("Velocity: %5.2f, %5.2f", entity->dP, "v2"); | ||||||
| 			DEBUG_PUSH_VAR("Rotation: %5.2f", entity->rotation, "f32"); | 			DEBUG_PUSH_VAR("Rotation: %5.2f", entity->rotation, "f32"); | ||||||
| 
 |  | ||||||
| 			RenderFlags flags = renderflag_wireframe | renderflag_no_texture; |  | ||||||
| 			renderer_entity(&state->renderer, state->camera, entity, pivotPoint, 0, |  | ||||||
| 					V4(0.4f, 0.8f, 1.0f, 1.0f), flags); |  | ||||||
| 
 |  | ||||||
| 			Basis entityBasis = getDefaultBasis(entity); |  | ||||||
| 			renderer_rect(&state->renderer, state->camera, entityBasis.basis, |  | ||||||
| 					V2(4, 4), entityBasis.pivotPoint, |  | ||||||
| 					DEGREES_TO_RADIANS(entity->rotation), NULL, |  | ||||||
| 					V4(1.0f, 0, 0, 1.0f), flags); |  | ||||||
| 		} | 		} | ||||||
| 	} | 		else if (entity->type == entitytype_asteroid) | ||||||
|  | 		{ | ||||||
| 
 | 
 | ||||||
| 	renderer_polygon(&state->renderer, &state->transientArena, state->camera, | 			i32 randValue = rand(); | ||||||
| 	                 asteroidVertexList, iterations, V2(0, 0), 0, NULL, | 			if (entity->direction == direction_null) | ||||||
| 	                 V4(0.0f, 0.0f, 1.0f, 1.0f), 0); | 			{ | ||||||
|  | 				entity->direction = randValue % direction_count; | ||||||
|  | 			} | ||||||
|  | 
 | ||||||
|  | 			v2 ddP = {0}; | ||||||
|  | 			switch (entity->direction) | ||||||
|  | 			{ | ||||||
|  | 			case direction_north: | ||||||
|  | 			{ | ||||||
|  | 				ddP.y = 1.0f; | ||||||
|  | 			} | ||||||
|  | 			break; | ||||||
|  | 
 | ||||||
|  | 			case direction_northwest: | ||||||
|  | 			{ | ||||||
|  | 				ddP.x = 1.0f; | ||||||
|  | 				ddP.y = 1.0f; | ||||||
|  | 			} | ||||||
|  | 			break; | ||||||
|  | 
 | ||||||
|  | 			case direction_west: | ||||||
|  | 			{ | ||||||
|  | 				ddP.x = -1.0f; | ||||||
|  | 			} | ||||||
|  | 			break; | ||||||
|  | 
 | ||||||
|  | 			case direction_southwest: | ||||||
|  | 			{ | ||||||
|  | 				ddP.x = -1.0f; | ||||||
|  | 				ddP.y = -1.0f; | ||||||
|  | 			} | ||||||
|  | 			break; | ||||||
|  | 
 | ||||||
|  | 			case direction_south: | ||||||
|  | 			{ | ||||||
|  | 				ddP.y = -1.0f; | ||||||
|  | 			} | ||||||
|  | 			break; | ||||||
|  | 
 | ||||||
|  | 			case direction_southeast: | ||||||
|  | 			{ | ||||||
|  | 				ddP.x = 1.0f; | ||||||
|  | 				ddP.y = -1.0f; | ||||||
|  | 			} | ||||||
|  | 			break; | ||||||
|  | 
 | ||||||
|  | 			case direction_east: | ||||||
|  | 			{ | ||||||
|  | 				ddP.x = 1.0f; | ||||||
|  | 			} | ||||||
|  | 			break; | ||||||
|  | 
 | ||||||
|  | 			case direction_northeast: | ||||||
|  | 			{ | ||||||
|  | 				ddP.x = 1.0f; | ||||||
|  | 				ddP.y = 1.0f; | ||||||
|  | 			} | ||||||
|  | 			break; | ||||||
|  | 
 | ||||||
|  | 			default: | ||||||
|  | 			{ | ||||||
|  | 				ASSERT(INVALID_CODE_PATH); | ||||||
|  | 			} | ||||||
|  | 			break; | ||||||
|  | 			} | ||||||
|  | 
 | ||||||
|  | 			f32 dirOffset = (randValue % 10) / 100.0f; | ||||||
|  | 			v2_scale(ddP, dirOffset); | ||||||
|  | 			ASSERT(ddP.x <= 1.0f && ddP.y <= 1.0f); | ||||||
|  | 
 | ||||||
|  | 			entity->dP          = v2_scale(ddP, state->pixelsPerMeter * 2); | ||||||
|  | 			v2 ddPHalf          = v2_scale(ddP, 0.5f); | ||||||
|  | 			v2 ddPHalfDtSquared = v2_scale(ddPHalf, (SQUARED(dt))); | ||||||
|  | 
 | ||||||
|  | 			v2 dPDt     = v2_scale(entity->dP, dt); | ||||||
|  | 
 | ||||||
|  | 			entity->pos = v2_add(v2_add(ddPHalfDtSquared, dPDt), entity->pos); | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		RenderFlags flags = renderflag_wireframe | renderflag_no_texture; | ||||||
|  | 		renderer_entity(&state->renderer, &state->transientArena, state->camera, | ||||||
|  | 		                entity, pivotPoint, 0, V4(0.4f, 0.8f, 1.0f, 1.0f), | ||||||
|  | 		                flags); | ||||||
|  | 
 | ||||||
|  | 		Basis entityBasis = getDefaultBasis(entity); | ||||||
|  | 		renderer_rect(&state->renderer, state->camera, entityBasis.basis, | ||||||
|  | 		              V2(4, 4), entityBasis.pivotPoint, | ||||||
|  | 		              DEGREES_TO_RADIANS(entity->rotation), NULL, | ||||||
|  | 		              V4(1.0f, 0, 0, 1.0f), flags); | ||||||
|  | 	} | ||||||
| 
 | 
 | ||||||
| 	TrianglePoints triangle = {0}; | 	TrianglePoints triangle = {0}; | ||||||
| 	triangle.points[0] = V2(100, 200); | 	triangle.points[0] = V2(100, 200); | ||||||
|  | |||||||
							
								
								
									
										15
									
								
								src/Debug.c
									
									
									
									
									
								
							
							
						
						
									
										15
									
								
								src/Debug.c
									
									
									
									
									
								
							| @ -272,5 +272,20 @@ void debug_drawUi(GameState *state, f32 dt) | |||||||
| { | { | ||||||
| 	updateAndRenderDebugStack(&state->renderer, &state->transientArena, dt); | 	updateAndRenderDebugStack(&state->renderer, &state->transientArena, dt); | ||||||
| 	renderConsole(&state->renderer, &state->transientArena); | 	renderConsole(&state->renderer, &state->transientArena); | ||||||
|  | 
 | ||||||
|  | 	MemoryArena_ *transient = &state->transientArena; | ||||||
|  | 	i32 transientSizeInKbs  = transient->size / 1024; | ||||||
|  | 	i32 transientUsedInKbs  = transient->used / 1024; | ||||||
|  | 	v2 transientUsage       = V2i(transientUsedInKbs, transientSizeInKbs); | ||||||
|  | 	DEBUG_PUSH_VAR("Transient Size: %.0f", transient->size, "f32"); | ||||||
|  | 	DEBUG_PUSH_VAR("Transient Usage: %.0f/%.0f", transientUsage, "v2"); | ||||||
|  | 
 | ||||||
|  | 	MemoryArena_ *persistent = &state->persistentArena; | ||||||
|  | 	i32 persistentSizeInKbs  = persistent->size / 1024; | ||||||
|  | 	i32 persistentUsedInKbs  = persistent->used / 1024; | ||||||
|  | 	v2 persistentUsage       = V2i(persistentUsedInKbs, persistentSizeInKbs); | ||||||
|  | 	DEBUG_PUSH_VAR("Permanent Size: %.0f", persistent->size, "f32"); | ||||||
|  | 	DEBUG_PUSH_VAR("Permanent Usage: %.0f/%.0f", persistentUsage, "v2"); | ||||||
|  | 
 | ||||||
| 	debug_clearCounter(); | 	debug_clearCounter(); | ||||||
| } | } | ||||||
|  | |||||||
| @ -72,10 +72,9 @@ INTERNAL void addVertexToRenderGroup(Renderer *renderer, Texture *tex, v4 color, | |||||||
| 			/* New group, unused so initialise it */ | 			/* New group, unused so initialise it */ | ||||||
| 			groupIsValid = TRUE; | 			groupIsValid = TRUE; | ||||||
| 
 | 
 | ||||||
| 			// NOTE(doyle): Mark first vertex as degenerate vertex, but where we
 | 			// NOTE(doyle): Mark first vertex as degenerate vertex
 | ||||||
| 			// request wireframe mode- we can't use degenerate vertexes for line
 | 			group->vertexList[group->vertexIndex++] = vertexList[0]; | ||||||
| 			// mode
 | 
 | ||||||
| 			group->vertexIndex++; |  | ||||||
| 			group->init  = TRUE; | 			group->init  = TRUE; | ||||||
| 			group->tex   = tex; | 			group->tex   = tex; | ||||||
| 			group->color = color; | 			group->color = color; | ||||||
| @ -376,7 +375,7 @@ void renderer_rect(Renderer *const renderer, Rect camera, v2 pos, v2 size, | |||||||
| 		                       ARRAY_COUNT(vertexList), rendermode_quad, flags); | 		                       ARRAY_COUNT(vertexList), rendermode_quad, flags); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void renderer_polygon(Renderer *const renderer, MemoryArena_ *arena, Rect camera, | void renderer_polygon(Renderer *const renderer, Rect camera, | ||||||
|                       v2 *polygonPoints, i32 numPoints, v2 pivotPoint, |                       v2 *polygonPoints, i32 numPoints, v2 pivotPoint, | ||||||
|                       Radians rotate, RenderTex *renderTex, v4 color, |                       Radians rotate, RenderTex *renderTex, v4 color, | ||||||
|                       RenderFlags flags) |                       RenderFlags flags) | ||||||
| @ -390,9 +389,6 @@ void renderer_polygon(Renderer *const renderer, MemoryArena_ *arena, Rect camera | |||||||
| 	if (!renderTex) renderTex = &emptyRenderTex; | 	if (!renderTex) renderTex = &emptyRenderTex; | ||||||
| 
 | 
 | ||||||
| 	i32 numTrisInTriangulation = numPoints - 2; | 	i32 numTrisInTriangulation = numPoints - 2; | ||||||
| 	RenderTriangle_ *polygonTriangulation = memory_pushBytes( |  | ||||||
| 	    arena, (sizeof(RenderTriangle_) * numTrisInTriangulation)); |  | ||||||
| 
 |  | ||||||
| 	v2 triangulationBaseP = polygonPoints[0]; | 	v2 triangulationBaseP = polygonPoints[0]; | ||||||
| 	i32 triangulationIndex = 0; | 	i32 triangulationIndex = 0; | ||||||
| 
 | 
 | ||||||
| @ -402,24 +398,29 @@ void renderer_polygon(Renderer *const renderer, MemoryArena_ *arena, Rect camera | |||||||
| 	addVertexToRenderGroup(renderer, renderTex->tex, color, | 	addVertexToRenderGroup(renderer, renderTex->tex, color, | ||||||
| 	                       &triangulationBaseVertex, 1, rendermode_polygon, | 	                       &triangulationBaseVertex, 1, rendermode_polygon, | ||||||
| 	                       flags); | 	                       flags); | ||||||
|  | 	RenderTriangle_ lastRenderTriForDegeneration = {0}; | ||||||
| 	for (i32 i = 1; triangulationIndex < numTrisInTriangulation; i++) | 	for (i32 i = 1; triangulationIndex < numTrisInTriangulation; i++) | ||||||
| 	{ | 	{ | ||||||
| 		RenderTriangle_ *tri = &polygonTriangulation[triangulationIndex++]; | 		RenderTriangle_ tri = {0}; | ||||||
| 		tri->vertex[0].pos = triangulationBaseP; | 		tri.vertex[0].pos  = triangulationBaseP; | ||||||
| 		tri->vertex[1].pos = polygonPoints[i + 1]; | 		tri.vertex[1].pos  = polygonPoints[i + 1]; | ||||||
| 		tri->vertex[2].pos = polygonPoints[i]; | 		tri.vertex[2].pos  = polygonPoints[i]; | ||||||
| 
 | 
 | ||||||
| 		addVertexToRenderGroup(renderer, renderTex->tex, color, tri->vertex, 3, | 		addVertexToRenderGroup(renderer, renderTex->tex, color, tri.vertex, | ||||||
|  | 		                       ARRAY_COUNT(tri.vertex), rendermode_polygon, | ||||||
|  | 		                       flags); | ||||||
|  | 
 | ||||||
|  | 		if (triangulationIndex++ >= numTrisInTriangulation) | ||||||
|  | 		{ | ||||||
|  | 			lastRenderTriForDegeneration = tri; | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 	for (i32 i = 0; i < 3; i++) | ||||||
|  | 	{ | ||||||
|  | 		addVertexToRenderGroup(renderer, renderTex->tex, color, | ||||||
|  | 		                       &lastRenderTriForDegeneration.vertex[2], 1, | ||||||
| 		                       rendermode_polygon, flags); | 		                       rendermode_polygon, flags); | ||||||
| 	} | 	} | ||||||
| 	RenderTriangle_ tri = polygonTriangulation[numTrisInTriangulation-1]; |  | ||||||
| 	addVertexToRenderGroup(renderer, renderTex->tex, color, &tri.vertex[2], 1, |  | ||||||
| 	                       rendermode_polygon, flags); |  | ||||||
| 	/*
 |  | ||||||
| 	// NOTE(doyle): Create degenerate vertex setup
 |  | ||||||
| 	Vertex triVertexList[5] = {tri->vertex[0], tri->vertex[0], tri->vertex[1], |  | ||||||
| 	                           tri->vertex[2], tri->vertex[2]}; |  | ||||||
| 	*/ |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void renderer_triangle(Renderer *const renderer, Rect camera, | void renderer_triangle(Renderer *const renderer, Rect camera, | ||||||
| @ -515,8 +516,9 @@ void renderer_string(Renderer *const renderer, MemoryArena_ *arena, Rect camera, | |||||||
| 	} | 	} | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void renderer_entity(Renderer *renderer, Rect camera, Entity *entity, | void renderer_entity(Renderer *renderer, MemoryArena_ *transientArena, | ||||||
|                      v2 pivotPoint, Degrees rotate, v4 color, RenderFlags flags) |                      Rect camera, Entity *entity, v2 pivotPoint, Degrees rotate, | ||||||
|  |                      v4 color, RenderFlags flags) | ||||||
| { | { | ||||||
| 	// TODO(doyle): Add early exit on entities out of camera bounds
 | 	// TODO(doyle): Add early exit on entities out of camera bounds
 | ||||||
| 	Radians totalRotation = DEGREES_TO_RADIANS((entity->rotation + rotate)); | 	Radians totalRotation = DEGREES_TO_RADIANS((entity->rotation + rotate)); | ||||||
| @ -573,6 +575,23 @@ void renderer_entity(Renderer *renderer, Rect camera, Entity *entity, | |||||||
| 		renderer_triangle(renderer, camera, triangle, pivotPoint, totalRotation, | 		renderer_triangle(renderer, camera, triangle, pivotPoint, totalRotation, | ||||||
| 		                  &renderTex, color, flags); | 		                  &renderTex, color, flags); | ||||||
| 	} | 	} | ||||||
|  | 	else if (entity->renderMode == rendermode_polygon) | ||||||
|  | 	{ | ||||||
|  | 		ASSERT(entity->numVertexPoints > 3); | ||||||
|  | 		ASSERT(entity->vertexPoints); | ||||||
|  | 
 | ||||||
|  | 		v2 *offsetVertexPoints = memory_pushBytes( | ||||||
|  | 		    transientArena, entity->numVertexPoints * sizeof(v2)); | ||||||
|  | 		for (i32 i = 0; i < entity->numVertexPoints; i++) | ||||||
|  | 		{ | ||||||
|  | 			offsetVertexPoints[i] = | ||||||
|  | 			    v2_add(entity->vertexPoints[i], entity->pos); | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		renderer_polygon(renderer, camera, offsetVertexPoints, | ||||||
|  | 		                 entity->numVertexPoints, pivotPoint, totalRotation, | ||||||
|  | 		                 &renderTex, color, flags); | ||||||
|  | 	} | ||||||
| 	else | 	else | ||||||
| 	{ | 	{ | ||||||
| 		ASSERT(INVALID_CODE_PATH); | 		ASSERT(INVALID_CODE_PATH); | ||||||
|  | |||||||
| @ -10,9 +10,14 @@ typedef struct AudioRenderer AudioRenderer; | |||||||
| enum Direction | enum Direction | ||||||
| { | { | ||||||
| 	direction_north, | 	direction_north, | ||||||
|  | 	direction_northwest, | ||||||
| 	direction_west, | 	direction_west, | ||||||
|  | 	direction_southwest, | ||||||
| 	direction_south, | 	direction_south, | ||||||
|  | 	direction_southeast, | ||||||
| 	direction_east, | 	direction_east, | ||||||
|  | 	direction_northeast, | ||||||
|  | 	direction_count, | ||||||
| 	direction_null, | 	direction_null, | ||||||
| 	direction_num, | 	direction_num, | ||||||
| }; | }; | ||||||
| @ -21,6 +26,7 @@ enum EntityType | |||||||
| { | { | ||||||
| 	entitytype_invalid, | 	entitytype_invalid, | ||||||
| 	entitytype_ship, | 	entitytype_ship, | ||||||
|  | 	entitytype_asteroid, | ||||||
| 	entitytype_count, | 	entitytype_count, | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| @ -48,6 +54,8 @@ typedef struct Entity | |||||||
| 	v2 offset; | 	v2 offset; | ||||||
| 
 | 
 | ||||||
| 	enum RenderMode renderMode; | 	enum RenderMode renderMode; | ||||||
|  | 	v2 *vertexPoints; | ||||||
|  | 	i32 numVertexPoints; | ||||||
| 
 | 
 | ||||||
| 	f32 scale; | 	f32 scale; | ||||||
| 	Degrees rotation; | 	Degrees rotation; | ||||||
|  | |||||||
| @ -88,10 +88,9 @@ void renderer_rect(Renderer *const renderer, Rect camera, v2 pos, v2 size, | |||||||
|                    v2 pivotPoint, Radians rotate, RenderTex *renderTex, |                    v2 pivotPoint, Radians rotate, RenderTex *renderTex, | ||||||
|                    v4 color, RenderFlags flags); |                    v4 color, RenderFlags flags); | ||||||
| 
 | 
 | ||||||
| void renderer_polygon(Renderer *const renderer, MemoryArena_ *arena, | void renderer_polygon(Renderer *const renderer, Rect camera, v2 *polygonPoints, | ||||||
|                       Rect camera, v2 *polygonPoints, i32 numPoints, |                       i32 numPoints, v2 pivotPoint, Radians rotate, | ||||||
|                       v2 pivotPoint, Radians rotate, RenderTex *renderTex, |                       RenderTex *renderTex, v4 color, RenderFlags flags); | ||||||
|                       v4 color, RenderFlags flags); |  | ||||||
| 
 | 
 | ||||||
| inline void renderer_staticRect(Renderer *const renderer, v2 pos, v2 size, | inline void renderer_staticRect(Renderer *const renderer, v2 pos, v2 size, | ||||||
|                                 v2 pivotPoint, Radians rotate, |                                 v2 pivotPoint, Radians rotate, | ||||||
| @ -122,9 +121,9 @@ inline void renderer_staticString(Renderer *const renderer, MemoryArena_ *arena, | |||||||
| 	                pivotPoint, rotate, color, flags); | 	                pivotPoint, rotate, color, flags); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void renderer_entity(Renderer *renderer, Rect camera, Entity *entity, | void renderer_entity(Renderer *renderer, MemoryArena_ *transientArena, | ||||||
|                      v2 pivotPoint, Degrees rotate, v4 color, |                      Rect camera, Entity *entity, v2 pivotPoint, Degrees rotate, | ||||||
|                      RenderFlags flags); |                      v4 color, RenderFlags flags); | ||||||
| 
 | 
 | ||||||
| void renderer_renderGroups(Renderer *renderer); | void renderer_renderGroups(Renderer *renderer); | ||||||
| 
 | 
 | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user