|  |  | @ -867,9 +867,9 @@ Model LoadCubicmap(Image cubesmap) | 
		
	
		
			
			|  |  |  | } RectangleF; | 
		
	
		
			
			|  |  |  |  | 
		
	
		
			
			|  |  |  | RectangleF rightTexUV = { 0, 0, 0.5, 0.5 }; | 
		
	
		
			
			|  |  |  | RectangleF leftTexUV = { 0.5, 0, 0.25, 0.25 }; | 
		
	
		
			
			|  |  |  | RectangleF frontTexUV = { f">0.75, 0, 0.25, 0.25 }; | 
		
	
		
			
			|  |  |  | RectangleF backTexUV = { 0.5, f">0.25, 0.25, 0.25 }; | 
		
	
		
			
			|  |  |  | RectangleF leftTexUV = { 0.5, 0, 0.5, 0.5 }; | 
		
	
		
			
			|  |  |  | RectangleF frontTexUV = { i">0, 0, 0.5, 0.5 }; | 
		
	
		
			
			|  |  |  | RectangleF backTexUV = { 0.5, i">0, 0.5, 0.5 }; | 
		
	
		
			
			|  |  |  | RectangleF topTexUV = { 0, 0.5, 0.5, 0.5 }; | 
		
	
		
			
			|  |  |  | RectangleF bottomTexUV = { 0.5, 0.5, 0.5, 0.5 }; | 
		
	
		
			
			|  |  |  |  | 
		
	
	
		
			
				|  |  | @ -1678,4 +1678,156 @@ bool CheckCollisionBoxSphere(Vector3 minBBox, Vector3 maxBBox, Vector3 centerSph | 
		
	
		
			
			|  |  |  | return collision; | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  |  | 
		
	
		
			
			|  |  |  | //BoundingBox GetCollisionArea(BoundingBox box1, BoundingBox box2) | 
		
	
		
			
			|  |  |  | // TODO | 
		
	
		
			
			|  |  |  | //BoundingBox GetCollisionArea(BoundingBox box1, BoundingBox box2) | 
		
	
		
			
			|  |  |  |  | 
		
	
		
			
			|  |  |  | // Detect and resolve cubicmap collisions | 
		
	
		
			
			|  |  |  | // NOTE: player position (or camera) is modified inside this function | 
		
	
		
			
			|  |  |  | void ResolveCollisionCubicmap(Image cubicmap, Vector3 mapPosition, Vector3 *playerPosition) | 
		
	
		
			
			|  |  |  | { | 
		
	
		
			
			|  |  |  | // Detect the cell where the player is located | 
		
	
		
			
			|  |  |  | int locationCellX = 0; | 
		
	
		
			
			|  |  |  | int locationCellY = 0; | 
		
	
		
			
			|  |  |  |  | 
		
	
		
			
			|  |  |  | locationCellX = floor(playerPosition->x + mapPosition.x + 0.5); | 
		
	
		
			
			|  |  |  | locationCellY = floor(playerPosition->z + mapPosition.z + 0.5); | 
		
	
		
			
			|  |  |  |  | 
		
	
		
			
			|  |  |  | // Multiple Axis -------------------------------------------------------------------------------------------- | 
		
	
		
			
			|  |  |  |  | 
		
	
		
			
			|  |  |  | // Axis x-, y- | 
		
	
		
			
			|  |  |  | if ((cubicmap.pixels[locationCellY * cubicmap.width + (locationCellX - 1)].r != 0) && | 
		
	
		
			
			|  |  |  | (cubicmap.pixels[(locationCellY - 1) * cubicmap.width + (locationCellX)].r != 0)) | 
		
	
		
			
			|  |  |  | { | 
		
	
		
			
			|  |  |  | if (((playerPosition->x + 0.5f) - locationCellX < 0.3) && | 
		
	
		
			
			|  |  |  | ((playerPosition->z + 0.5f) - locationCellY < 0.3)) | 
		
	
		
			
			|  |  |  | { | 
		
	
		
			
			|  |  |  | playerPosition->x = locationCellX - 0.2; | 
		
	
		
			
			|  |  |  | playerPosition->z = locationCellY - 0.2; | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  |  | 
		
	
		
			
			|  |  |  | // Axis x-, y+ | 
		
	
		
			
			|  |  |  | if ((cubicmap.pixels[locationCellY * cubicmap.width + (locationCellX - 1)].r != 0) && | 
		
	
		
			
			|  |  |  | (cubicmap.pixels[(locationCellY + 1) * cubicmap.width + (locationCellX)].r != 0)) | 
		
	
		
			
			|  |  |  | { | 
		
	
		
			
			|  |  |  | if (((playerPosition->x + 0.5f) - locationCellX < 0.3) && | 
		
	
		
			
			|  |  |  | ((playerPosition->z + 0.5f) - locationCellY > 0.7)) | 
		
	
		
			
			|  |  |  | { | 
		
	
		
			
			|  |  |  | playerPosition->x = locationCellX - 0.2; | 
		
	
		
			
			|  |  |  | playerPosition->z = locationCellY + 0.2; | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  |  | 
		
	
		
			
			|  |  |  | // Axis x+, y- | 
		
	
		
			
			|  |  |  | if ((cubicmap.pixels[locationCellY * cubicmap.width + (locationCellX + 1)].r != 0) && | 
		
	
		
			
			|  |  |  | (cubicmap.pixels[(locationCellY - 1) * cubicmap.width + (locationCellX)].r != 0)) | 
		
	
		
			
			|  |  |  | { | 
		
	
		
			
			|  |  |  | if (((playerPosition->x + 0.5f) - locationCellX > 0.7) && | 
		
	
		
			
			|  |  |  | ((playerPosition->z + 0.5f) - locationCellY < 0.3)) | 
		
	
		
			
			|  |  |  | { | 
		
	
		
			
			|  |  |  | playerPosition->x = locationCellX + 0.2; | 
		
	
		
			
			|  |  |  | playerPosition->z = locationCellY - 0.2; | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  |  | 
		
	
		
			
			|  |  |  | // Axis x+, y+ | 
		
	
		
			
			|  |  |  | if ((cubicmap.pixels[locationCellY * cubicmap.width + (locationCellX + 1)].r != 0) && | 
		
	
		
			
			|  |  |  | (cubicmap.pixels[(locationCellY + 1) * cubicmap.width + (locationCellX)].r != 0)) | 
		
	
		
			
			|  |  |  | { | 
		
	
		
			
			|  |  |  | if (((playerPosition->x + 0.5f) - locationCellX > 0.7) && | 
		
	
		
			
			|  |  |  | ((playerPosition->z + 0.5f) - locationCellY > 0.7)) | 
		
	
		
			
			|  |  |  | { | 
		
	
		
			
			|  |  |  | playerPosition->x = locationCellX + 0.2f; | 
		
	
		
			
			|  |  |  | playerPosition->z = locationCellY + 0.2f; | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  |  | 
		
	
		
			
			|  |  |  | // Single Axis --------------------------------------------------------------------------------------------------- | 
		
	
		
			
			|  |  |  |  | 
		
	
		
			
			|  |  |  | // Axis x- | 
		
	
		
			
			|  |  |  | if (cubicmap.pixels[locationCellY * cubicmap.width + (locationCellX - 1)].r != 0) | 
		
	
		
			
			|  |  |  | { | 
		
	
		
			
			|  |  |  | if ((playerPosition->x + 0.5f) - locationCellX < 0.3) | 
		
	
		
			
			|  |  |  | { | 
		
	
		
			
			|  |  |  | playerPosition->x = locationCellX - 0.2; | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | // Axis x+ | 
		
	
		
			
			|  |  |  | if (cubicmap.pixels[locationCellY * cubicmap.width + (locationCellX + 1)].r != 0) | 
		
	
		
			
			|  |  |  | { | 
		
	
		
			
			|  |  |  | if ((playerPosition->x + 0.5f) - locationCellX > 0.7) | 
		
	
		
			
			|  |  |  | { | 
		
	
		
			
			|  |  |  | playerPosition->x = locationCellX + 0.2; | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | // Axis y- | 
		
	
		
			
			|  |  |  | if (cubicmap.pixels[(locationCellY - 1) * cubicmap.width + (locationCellX)].r != 0) | 
		
	
		
			
			|  |  |  | { | 
		
	
		
			
			|  |  |  | if ((playerPosition->z + 0.5f) - locationCellY < 0.3) | 
		
	
		
			
			|  |  |  | { | 
		
	
		
			
			|  |  |  | playerPosition->z = locationCellY - 0.2; | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | // Axis y+ | 
		
	
		
			
			|  |  |  | if (cubicmap.pixels[(locationCellY + 1) * cubicmap.width + (locationCellX)].r != 0) | 
		
	
		
			
			|  |  |  | { | 
		
	
		
			
			|  |  |  | if ((playerPosition->z + 0.5f) - locationCellY > 0.7) | 
		
	
		
			
			|  |  |  | { | 
		
	
		
			
			|  |  |  | playerPosition->z = locationCellY + 0.2; | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  |  | 
		
	
		
			
			|  |  |  | // Diagonals ------------------------------------------------------------------------------------------------------- | 
		
	
		
			
			|  |  |  |  | 
		
	
		
			
			|  |  |  | // Axis x-, y- | 
		
	
		
			
			|  |  |  | if ((cubicmap.pixels[locationCellY * cubicmap.width + (locationCellX - 1)].r == 0) && | 
		
	
		
			
			|  |  |  | (cubicmap.pixels[(locationCellY - 1) * cubicmap.width + (locationCellX)].r == 0) && | 
		
	
		
			
			|  |  |  | (cubicmap.pixels[(locationCellY - 1) * cubicmap.width + (locationCellX - 1)].r != 0)) | 
		
	
		
			
			|  |  |  | { | 
		
	
		
			
			|  |  |  | if (((playerPosition->x + 0.5f) - locationCellX < 0.3) && | 
		
	
		
			
			|  |  |  | ((playerPosition->z + 0.5f) - locationCellY < 0.3)) | 
		
	
		
			
			|  |  |  | { | 
		
	
		
			
			|  |  |  | if (((playerPosition->x + 0.5f) - locationCellX) > ((playerPosition->z + 0.5f) - locationCellY)) playerPosition->x = locationCellX - 0.2; | 
		
	
		
			
			|  |  |  | else playerPosition->z = locationCellY - 0.2; | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  |  | 
		
	
		
			
			|  |  |  | // Axis x-, y+ | 
		
	
		
			
			|  |  |  | if ((cubicmap.pixels[locationCellY * cubicmap.width + (locationCellX - 1)].r == 0) && | 
		
	
		
			
			|  |  |  | (cubicmap.pixels[(locationCellY + 1) * cubicmap.width + (locationCellX)].r == 0) && | 
		
	
		
			
			|  |  |  | (cubicmap.pixels[(locationCellY + 1) * cubicmap.width + (locationCellX - 1)].r != 0)) | 
		
	
		
			
			|  |  |  | { | 
		
	
		
			
			|  |  |  | if (((playerPosition->x + 0.5f) - locationCellX < 0.3) && | 
		
	
		
			
			|  |  |  | ((playerPosition->z + 0.5f) - locationCellY > 0.7)) | 
		
	
		
			
			|  |  |  | { | 
		
	
		
			
			|  |  |  | if (((playerPosition->x + 0.5f) - locationCellX) > (1 - ((playerPosition->z + 0.5f) - locationCellY))) playerPosition->x = locationCellX - 0.2; | 
		
	
		
			
			|  |  |  | else playerPosition->z = locationCellY + 0.2; | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  |  | 
		
	
		
			
			|  |  |  | // Axis x+, y- | 
		
	
		
			
			|  |  |  | if ((cubicmap.pixels[locationCellY * cubicmap.width + (locationCellX + 1)].r == 0) && | 
		
	
		
			
			|  |  |  | (cubicmap.pixels[(locationCellY - 1) * cubicmap.width + (locationCellX)].r == 0) && | 
		
	
		
			
			|  |  |  | (cubicmap.pixels[(locationCellY - 1) * cubicmap.width + (locationCellX + 1)].r != 0)) | 
		
	
		
			
			|  |  |  | { | 
		
	
		
			
			|  |  |  | if (((playerPosition->x + 0.5f) - locationCellX > 0.7) && | 
		
	
		
			
			|  |  |  | ((playerPosition->z + 0.5f) - locationCellY < 0.3)) | 
		
	
		
			
			|  |  |  | { | 
		
	
		
			
			|  |  |  | if (((playerPosition->x + 0.5f) - locationCellX) < (1 - ((playerPosition->z + 0.5f) - locationCellY))) playerPosition->x = locationCellX + 0.2; | 
		
	
		
			
			|  |  |  | else playerPosition->z = locationCellY - 0.2; | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  |  | 
		
	
		
			
			|  |  |  | // Axis x+, y+ | 
		
	
		
			
			|  |  |  | if ((cubicmap.pixels[locationCellY * cubicmap.width + (locationCellX + 1)].r == 0) && | 
		
	
		
			
			|  |  |  | (cubicmap.pixels[(locationCellY + 1) * cubicmap.width + (locationCellX)].r == 0) && | 
		
	
		
			
			|  |  |  | (cubicmap.pixels[(locationCellY + 1) * cubicmap.width + (locationCellX + 1)].r != 0)) | 
		
	
		
			
			|  |  |  | { | 
		
	
		
			
			|  |  |  | if (((playerPosition->x + 0.5f) - locationCellX > 0.7) && | 
		
	
		
			
			|  |  |  | ((playerPosition->z + 0.5f) - locationCellY > 0.7)) | 
		
	
		
			
			|  |  |  | { | 
		
	
		
			
			|  |  |  | if (((playerPosition->x + 0.5f) - locationCellX) < ((playerPosition->z + 0.5f) - locationCellY)) playerPosition->x = locationCellX + 0.2; | 
		
	
		
			
			|  |  |  | else playerPosition->z = locationCellY + 0.2; | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | } |