mirror of
				https://github.com/Ed94/HandmadeHero.git
				synced 2025-11-03 23:36:13 -08:00 
			
		
		
		
	Day 32 complete
This commit is contained in:
		
							
								
								
									
										12
									
								
								.vscode/c_cpp_properties.json
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										12
									
								
								.vscode/c_cpp_properties.json
									
									
									
									
										vendored
									
									
								
							@@ -6,7 +6,7 @@
 | 
				
			|||||||
                "${workspaceFolder}/project/",
 | 
					                "${workspaceFolder}/project/",
 | 
				
			||||||
                "${workspaceFolder}/project/dependencies/",
 | 
					                "${workspaceFolder}/project/dependencies/",
 | 
				
			||||||
                "${workspaceFolder}/project/platform/",
 | 
					                "${workspaceFolder}/project/platform/",
 | 
				
			||||||
                "${workspaceFolder}/project/engine/",
 | 
					                "${workspaceFolder}/project/engine/"
 | 
				
			||||||
            ],
 | 
					            ],
 | 
				
			||||||
            "defines": [
 | 
					            "defines": [
 | 
				
			||||||
                "_DEBUG",
 | 
					                "_DEBUG",
 | 
				
			||||||
@@ -15,11 +15,11 @@
 | 
				
			|||||||
                "GEN_TIME",
 | 
					                "GEN_TIME",
 | 
				
			||||||
                "INTELLISENSE_DIRECTIVES",
 | 
					                "INTELLISENSE_DIRECTIVES",
 | 
				
			||||||
                "Build_Debug",
 | 
					                "Build_Debug",
 | 
				
			||||||
                "Build_Development",
 | 
					                "Build_Development"
 | 
				
			||||||
            ],
 | 
					            ],
 | 
				
			||||||
            "windowsSdkVersion": "10.0.22621.0",
 | 
					            "windowsSdkVersion": "10.0.22621.0",
 | 
				
			||||||
            "compilerPath": "cl.exe",
 | 
					            "compilerPath": "cl.exe",
 | 
				
			||||||
            "intelliSenseMode": "msvc-x64",
 | 
					            "intelliSenseMode": "msvc-x64"
 | 
				
			||||||
        },
 | 
					        },
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
            "name": "Win32 clang",
 | 
					            "name": "Win32 clang",
 | 
				
			||||||
@@ -27,18 +27,18 @@
 | 
				
			|||||||
                "${workspaceFolder}/project/",
 | 
					                "${workspaceFolder}/project/",
 | 
				
			||||||
                "${workspaceFolder}/project/dependencies/",
 | 
					                "${workspaceFolder}/project/dependencies/",
 | 
				
			||||||
                "${workspaceFolder}/project/platform/",
 | 
					                "${workspaceFolder}/project/platform/",
 | 
				
			||||||
                "${workspaceFolder}/project/engine/",
 | 
					                "${workspaceFolder}/project/engine/"
 | 
				
			||||||
            ],
 | 
					            ],
 | 
				
			||||||
            "defines": [
 | 
					            "defines": [
 | 
				
			||||||
                "_DEBUG",
 | 
					                "_DEBUG",
 | 
				
			||||||
                "UNICODE",
 | 
					                "UNICODE",
 | 
				
			||||||
                "_UNICODE",
 | 
					                "_UNICODE",
 | 
				
			||||||
                "GEN_TIME",
 | 
					                "GEN_TIME",
 | 
				
			||||||
                "INTELLISENSE_DIRECTIVES",
 | 
					                "INTELLISENSE_DIRECTIVES"
 | 
				
			||||||
            ],
 | 
					            ],
 | 
				
			||||||
            "windowsSdkVersion": "10.0.22621.0",
 | 
					            "windowsSdkVersion": "10.0.22621.0",
 | 
				
			||||||
            "compilerPath": "clang.exe",
 | 
					            "compilerPath": "clang.exe",
 | 
				
			||||||
            "intelliSenseMode": "clang-x64",
 | 
					            "intelliSenseMode": "clang-x64"
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    ],
 | 
					    ],
 | 
				
			||||||
    "version": 4
 | 
					    "version": 4
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										2
									
								
								.vscode/settings.json
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								.vscode/settings.json
									
									
									
									
										vendored
									
									
								
							@@ -78,7 +78,7 @@
 | 
				
			|||||||
	},
 | 
						},
 | 
				
			||||||
	"C_Cpp.intelliSenseEngineFallback": "disabled",
 | 
						"C_Cpp.intelliSenseEngineFallback": "disabled",
 | 
				
			||||||
	"C_Cpp.errorSquiggles": "enabled",
 | 
						"C_Cpp.errorSquiggles": "enabled",
 | 
				
			||||||
	"C_Cpp.default.compilerPath": "cl.exe",
 | 
						"C_Cpp.default.compilerPath": "C:\\Users\\Ed\\scoop\\apps\\llvm\\current\\bin\\clang-cpp.exe",
 | 
				
			||||||
	"C_Cpp.exclusionPolicy": "checkFilesAndFolders",
 | 
						"C_Cpp.exclusionPolicy": "checkFilesAndFolders",
 | 
				
			||||||
	"C_Cpp.files.exclude": {
 | 
						"C_Cpp.files.exclude": {
 | 
				
			||||||
		"**/.vscode": true,
 | 
							"**/.vscode": true,
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										23
									
								
								.vscode/tasks.json
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										23
									
								
								.vscode/tasks.json
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,23 @@
 | 
				
			|||||||
 | 
					{
 | 
				
			||||||
 | 
					    "version": "2.0.0",
 | 
				
			||||||
 | 
					    "tasks": [
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            "label": "build development",
 | 
				
			||||||
 | 
					            "type": "shell",
 | 
				
			||||||
 | 
					            "command": "pwsh.exe",
 | 
				
			||||||
 | 
					            "args": [
 | 
				
			||||||
 | 
					                "-NoProfile",
 | 
				
			||||||
 | 
					                "-ExecutionPolicy",
 | 
				
			||||||
 | 
					                "Bypass",
 | 
				
			||||||
 | 
					                "-File",
 | 
				
			||||||
 | 
					                "${workspaceFolder}/scripts/build.ps1",
 | 
				
			||||||
 | 
					                "msvc",
 | 
				
			||||||
 | 
					                "dev"
 | 
				
			||||||
 | 
					            ],
 | 
				
			||||||
 | 
					            "group": {
 | 
				
			||||||
 | 
					                "kind": "build",
 | 
				
			||||||
 | 
					                "isDefault": true
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    ]
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@@ -8,8 +8,8 @@
 | 
				
			|||||||
		<ShowEmptyFolders>true</ShowEmptyFolders>
 | 
							<ShowEmptyFolders>true</ShowEmptyFolders>
 | 
				
			||||||
		<IsVirtual>false</IsVirtual>
 | 
							<IsVirtual>false</IsVirtual>
 | 
				
			||||||
		<IsFolder>false</IsFolder>
 | 
							<IsFolder>false</IsFolder>
 | 
				
			||||||
		<BuildCommand>pwsh -ExecutionPolicy Bypass -NoProfile -NonInteractive -File $(WorkspaceDirectory)/scripts/build.ps1 msvc dev engine</BuildCommand>
 | 
							<BuildCommand>pwsh -ExecutionPolicy Bypass -NoProfile -NonInteractive -File $(WorkspaceDirectory)/scripts/build.ps1 msvc dev</BuildCommand>
 | 
				
			||||||
		<RebuildCommand>pwsh -ExecutionPolicy Bypass -NoProfile -NonInteractive -File $(WorkspaceDirectory)/scripts/build.ps1 msvc dev platform</RebuildCommand>
 | 
							<RebuildCommand>pwsh -ExecutionPolicy Bypass -NoProfile -NonInteractive -File $(WorkspaceDirectory)/scripts/rebuild.ps1 msvc dev</RebuildCommand>
 | 
				
			||||||
		<BuildFileCommand></BuildFileCommand>
 | 
							<BuildFileCommand></BuildFileCommand>
 | 
				
			||||||
		<CleanCommand>pwsh -ExecutionPolicy Bypass -NoProfile -NonInteractive -File $(WorkspaceDirectory)/scripts/clean.ps1</CleanCommand>
 | 
							<CleanCommand>pwsh -ExecutionPolicy Bypass -NoProfile -NonInteractive -File $(WorkspaceDirectory)/scripts/clean.ps1</CleanCommand>
 | 
				
			||||||
		<BuildWorkingDirectory></BuildWorkingDirectory>
 | 
							<BuildWorkingDirectory></BuildWorkingDirectory>
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										3
									
								
								docs/Day 032.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								docs/Day 032.md
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,3 @@
 | 
				
			|||||||
 | 
					# Day 32
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -448,12 +448,14 @@ void startup( Memory* memory, platform::ModuleAPI* platform_api )
 | 
				
			|||||||
	hh::GameState* game_state = rcast( hh::GameState*, state->game_memory.persistent );
 | 
						hh::GameState* game_state = rcast( hh::GameState*, state->game_memory.persistent );
 | 
				
			||||||
	assert( sizeof(hh::GameState) <= state->game_memory.persistent_size );
 | 
						assert( sizeof(hh::GameState) <= state->game_memory.persistent_size );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	game_state->tile_map_x = 0;
 | 
					 | 
				
			||||||
	game_state->tile_map_y = 0;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	hh::PlayerState* player = & game_state->player_state;
 | 
						hh::PlayerState* player = & game_state->player_state;
 | 
				
			||||||
	player->pos_x      = 920;
 | 
						player->position.tile_map_x = 0;
 | 
				
			||||||
	player->pos_y      = 466;
 | 
						player->position.tile_map_y = 0;
 | 
				
			||||||
 | 
						player->position.tile_x     = 3;
 | 
				
			||||||
 | 
						player->position.tile_y     = 3;
 | 
				
			||||||
 | 
						player->position.x          = 0.f;
 | 
				
			||||||
 | 
						player->position.y          = 0.f;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	player->mid_jump   = false;
 | 
						player->mid_jump   = false;
 | 
				
			||||||
	player->jump_time  = 0.f;
 | 
						player->jump_time  = 0.f;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@@ -464,56 +466,43 @@ void shutdown( Memory* memory, platform::ModuleAPI* platform_api )
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
inline
 | 
					inline
 | 
				
			||||||
CanonPosition get_cannonical_position( World* world, RawPosition raw_pos )
 | 
					void cannonicalize_coord( World* world, s32 num_tiles, s32* tile_map_coord, s32* tile_coord, f32* pos_coord )
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	s32 tile_map_x = raw_pos.tile_map_x;
 | 
						s32 new_tile_map_coord = *tile_map_coord;
 | 
				
			||||||
	s32 tile_map_y = raw_pos.tile_map_y;
 | 
						f32 tile_size          = scast(f32, world->tile_size_in_meters);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	f32 pos_x = ( raw_pos.x - world->tile_upper_left_x );
 | 
						// TODO(Ed) : Need to use an alt method for reconnonicalizing because this can end up rounding back up to the tile.
 | 
				
			||||||
	f32 pos_y = ( raw_pos.y - world->tile_upper_left_y );
 | 
						// TODO(Ed) : Add bounds checking to prevent wrapping
 | 
				
			||||||
 | 
						s32 offset         = floor_f32_to_s32( (* pos_coord) / tile_size );
 | 
				
			||||||
 | 
						s32 new_tile_coord = (* tile_coord) + offset;
 | 
				
			||||||
 | 
						f32 new_pos_coord  = (* pos_coord)  - scast(f32, offset) * tile_size;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	f32 tile_size = scast(f32, world->tile_size_in_pixels);
 | 
						assert( new_pos_coord >= 0.f );
 | 
				
			||||||
 | 
						assert( new_pos_coord < tile_size );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	s32 tile_x = floor_f32_to_s32( pos_x / tile_size );
 | 
						if ( new_tile_coord  < 0 )
 | 
				
			||||||
	s32 tile_y = floor_f32_to_s32( pos_y / tile_size );
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	f32 tile_rel_x = pos_x - scast(f32, tile_x) * tile_size;
 | 
					 | 
				
			||||||
	f32 tile_rel_y = pos_y - scast(f32, tile_y) * tile_size;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	assert( tile_rel_x >= 0.f );
 | 
					 | 
				
			||||||
	assert( tile_rel_y >= 0.f );
 | 
					 | 
				
			||||||
	assert( tile_rel_x < tile_size );
 | 
					 | 
				
			||||||
	assert( tile_rel_y < tile_size );
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	/*
 | 
					 | 
				
			||||||
		The puprpose of this is to be able to detect if the point is outside of the tilemap,
 | 
					 | 
				
			||||||
		and if so, roll the point over to an adjacent tilemap.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		For example : If the point is at x = -1, then it is outside of the tilemap, and
 | 
					 | 
				
			||||||
		should be rolled over to the tilemap to the left of the current tilemap.
 | 
					 | 
				
			||||||
	*/
 | 
					 | 
				
			||||||
	if ( tile_x < 0 )
 | 
					 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		tile_x += world->num_tiles_x;
 | 
							new_tile_coord += num_tiles;
 | 
				
			||||||
		-- tile_map_x;
 | 
							-- new_tile_map_coord;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	if ( tile_y < 0 )
 | 
						if ( new_tile_coord >= num_tiles )
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		tile_y += world->num_tiles_y;
 | 
							new_tile_coord -= num_tiles;
 | 
				
			||||||
		-- tile_map_y;
 | 
							++ new_tile_map_coord;
 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	if ( tile_x >= world->num_tiles_x )
 | 
					 | 
				
			||||||
	{
 | 
					 | 
				
			||||||
		tile_x -= world->num_tiles_x;
 | 
					 | 
				
			||||||
		++ tile_map_x;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	if ( tile_y >= world->num_tiles_y )
 | 
					 | 
				
			||||||
	{
 | 
					 | 
				
			||||||
		tile_y -= world->num_tiles_y;
 | 
					 | 
				
			||||||
		++ tile_map_y;
 | 
					 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return { tile_rel_x, tile_rel_y, tile_map_x, tile_map_y, tile_x, tile_y };
 | 
						(* tile_map_coord) = new_tile_map_coord;
 | 
				
			||||||
 | 
						(* tile_coord)     = new_tile_coord;
 | 
				
			||||||
 | 
						(* pos_coord)      = new_pos_coord;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					inline
 | 
				
			||||||
 | 
					CanonPosition recannonicalize_position( World* world, CanonPosition pos )
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						CanonPosition result = pos;
 | 
				
			||||||
 | 
						cannonicalize_coord( world, world->num_tiles_x, & result.tile_map_x, & result.tile_x, & result.x );
 | 
				
			||||||
 | 
						cannonicalize_coord( world, world->num_tiles_y, & result.tile_map_y, & result.tile_y, & result.y );
 | 
				
			||||||
 | 
						return result;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
inline
 | 
					inline
 | 
				
			||||||
@@ -555,20 +544,28 @@ TileMap* world_get_tilemap( World* world, s32 tile_map_x, s32 tile_map_y )
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
internal
 | 
					internal
 | 
				
			||||||
b32 world_is_point_empty( World* world, RawPosition raw_pos )
 | 
					b32 world_is_point_empty( World* world, CanonPosition position )
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	assert( world != nullptr );
 | 
						assert( world != nullptr );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	b32 is_empty = false;
 | 
						b32 is_empty = false;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	CanonPosition position = get_cannonical_position( world, raw_pos );
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	TileMap* tile_map = world_get_tilemap( world, position.tile_map_x, position.tile_map_y );
 | 
						TileMap* tile_map = world_get_tilemap( world, position.tile_map_x, position.tile_map_y );
 | 
				
			||||||
	         is_empty = tilemap_is_point_empty( tile_map, world, position.tile_x, position.tile_y );
 | 
						         is_empty = tilemap_is_point_empty( tile_map, world, position.tile_x, position.tile_y );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return is_empty;
 | 
						return is_empty;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void draw_debug_point(OffscreenBuffer* back_buffer, World* world, CanonPosition pos, f32 red, f32 green, f32 blue)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						draw_rectangle(back_buffer,
 | 
				
			||||||
 | 
							pos.x * world->tile_meters_to_pixels + world->tile_upper_left_x + scast(f32, pos.tile_x	* world->tile_size_in_pixels),
 | 
				
			||||||
 | 
							pos.y * world->tile_meters_to_pixels + world->tile_upper_left_y + scast(f32, pos.tile_y	* world->tile_size_in_pixels),
 | 
				
			||||||
 | 
							(pos.x + 0.1f) * world->tile_meters_to_pixels + world->tile_upper_left_x + scast(f32, pos.tile_x	* world->tile_size_in_pixels),
 | 
				
			||||||
 | 
							(pos.y + 0.1f) * world->tile_meters_to_pixels + world->tile_upper_left_y + scast(f32, pos.tile_y	* world->tile_size_in_pixels),
 | 
				
			||||||
 | 
							red, green, blue);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Engine_API
 | 
					Engine_API
 | 
				
			||||||
void update_and_render( f32 delta_time, InputState* input, OffscreenBuffer* back_buffer
 | 
					void update_and_render( f32 delta_time, InputState* input, OffscreenBuffer* back_buffer
 | 
				
			||||||
	, Memory* memory, platform::ModuleAPI* platform_api, ThreadContext* thread )
 | 
						, Memory* memory, platform::ModuleAPI* platform_api, ThreadContext* thread )
 | 
				
			||||||
@@ -773,6 +770,7 @@ void update_and_render( f32 delta_time, InputState* input, OffscreenBuffer* back
 | 
				
			|||||||
	World world;
 | 
						World world;
 | 
				
			||||||
	world.tile_size_in_meters = 1.4f;
 | 
						world.tile_size_in_meters = 1.4f;
 | 
				
			||||||
	world.tile_size_in_pixels = 85;
 | 
						world.tile_size_in_pixels = 85;
 | 
				
			||||||
 | 
						world.tile_meters_to_pixels = scast(f32, world.tile_size_in_pixels) / world.tile_size_in_meters;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	f32 tile_size_in_pixels = scast(f32, world.tile_size_in_pixels);
 | 
						f32 tile_size_in_pixels = scast(f32, world.tile_size_in_pixels);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -789,21 +787,21 @@ void update_and_render( f32 delta_time, InputState* input, OffscreenBuffer* back
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	world.tile_maps = rcast(TileMap*, tile_maps);
 | 
						world.tile_maps = rcast(TileMap*, tile_maps);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	TileMap* current_tile_map = world_get_tilemap( & world, game_state->tile_map_x, game_state->tile_map_y );
 | 
						TileMap* current_tile_map = world_get_tilemap( & world, player->position.tile_map_x, player->position.tile_map_y );
 | 
				
			||||||
	assert( current_tile_map != nullptr );
 | 
						assert( current_tile_map != nullptr );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	player->width  = tile_size_in_pixels * 0.70f;
 | 
						player->height = 1.4f;
 | 
				
			||||||
	player->height = tile_size_in_pixels * 0.9f;
 | 
						player->width  = player->height * 0.7f;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	f32 player_half_width     = player->width  / 2.f;
 | 
						f32 player_half_width     = player->width  / 2.f;
 | 
				
			||||||
	f32 player_quarter_height = player->height / 4.f;
 | 
						f32 player_quarter_height = player->height / 4.f;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	input_poll_player_actions( input, & player_actions );
 | 
						input_poll_player_actions( input, & player_actions );
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		f32 move_speed = 200.f;
 | 
							f32 move_speed = 6.f;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		f32 new_player_pos_x = player->pos_x;
 | 
							f32 new_player_pos_x = player->position.x;
 | 
				
			||||||
		f32 new_player_pos_y = player->pos_y;
 | 
							f32 new_player_pos_y = player->position.y;
 | 
				
			||||||
		if ( player_actions.player_x_move_analog || player_actions.player_y_move_analog )
 | 
							if ( player_actions.player_x_move_analog || player_actions.player_y_move_analog )
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			new_player_pos_x += scast(f32, player_actions.player_x_move_analog * delta_time * move_speed);
 | 
								new_player_pos_x += scast(f32, player_actions.player_x_move_analog * delta_time * move_speed);
 | 
				
			||||||
@@ -814,40 +812,65 @@ void update_and_render( f32 delta_time, InputState* input, OffscreenBuffer* back
 | 
				
			|||||||
			new_player_pos_x += scast(f32, player_actions.player_x_move_digital) * delta_time * move_speed;
 | 
								new_player_pos_x += scast(f32, player_actions.player_x_move_digital) * delta_time * move_speed;
 | 
				
			||||||
			new_player_pos_y -= scast(f32, player_actions.player_y_move_digital) * delta_time * move_speed;
 | 
								new_player_pos_y -= scast(f32, player_actions.player_y_move_digital) * delta_time * move_speed;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		new_player_pos_y += sinf( player->jump_time * TAU ) * 200.f * delta_time;
 | 
							new_player_pos_y += sinf( player->jump_time * TAU ) * 10.f * delta_time;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		b32 valid_new_pos = true;
 | 
							b32 valid_new_pos = true;
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			RawPosition test_pos = { 
 | 
								//RawPosition test_pos = {
 | 
				
			||||||
				new_player_pos_x - player_half_width, new_player_pos_y - player_quarter_height, 
 | 
								//	new_player_pos_x - player_half_width, new_player_pos_y - player_quarter_height,
 | 
				
			||||||
				game_state->tile_map_x, game_state->tile_map_y 
 | 
								//	player->position.tile_map_x, player->position.tile_map_y
 | 
				
			||||||
 | 
								//};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								CanonPosition test_pos = {
 | 
				
			||||||
 | 
									new_player_pos_x, new_player_pos_y,
 | 
				
			||||||
 | 
									player->position.tile_map_x, player->position.tile_map_y,
 | 
				
			||||||
 | 
									player->position.tile_x, player->position.tile_y
 | 
				
			||||||
			};
 | 
								};
 | 
				
			||||||
 | 
								test_pos     = recannonicalize_position( & world, test_pos );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			valid_new_pos &= world_is_point_empty( & world, test_pos );
 | 
								// TODO(Ed) : Need a delta-function that auto-reconnonicalizes.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			test_pos.x     = new_player_pos_x + player_half_width;
 | 
								CanonPosition test_pos_nw {
 | 
				
			||||||
			valid_new_pos &= world_is_point_empty( & world, test_pos );
 | 
									new_player_pos_x - player_half_width, new_player_pos_y - player_quarter_height,
 | 
				
			||||||
 | 
									player->position.tile_map_x, player->position.tile_map_y,
 | 
				
			||||||
 | 
									player->position.tile_x, player->position.tile_y
 | 
				
			||||||
 | 
								};
 | 
				
			||||||
 | 
								test_pos_nw       = recannonicalize_position( & world, test_pos_nw );
 | 
				
			||||||
 | 
								valid_new_pos    &= world_is_point_empty( & world, test_pos_nw );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			test_pos.x     = new_player_pos_x - player_half_width;
 | 
								CanonPosition test_pos_ne {
 | 
				
			||||||
			test_pos.y     = new_player_pos_y;
 | 
									new_player_pos_x + player_half_width, new_player_pos_y - player_quarter_height,
 | 
				
			||||||
			valid_new_pos &= world_is_point_empty( & world, test_pos );
 | 
									player->position.tile_map_x, player->position.tile_map_y,
 | 
				
			||||||
 | 
									player->position.tile_x, player->position.tile_y
 | 
				
			||||||
 | 
								};
 | 
				
			||||||
 | 
								test_pos_ne       = recannonicalize_position( & world, test_pos_ne );
 | 
				
			||||||
 | 
								valid_new_pos &= world_is_point_empty( & world, test_pos_ne );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			test_pos.x     = new_player_pos_x + player_half_width;
 | 
								CanonPosition test_pos_sw {
 | 
				
			||||||
			valid_new_pos &= world_is_point_empty( & world, test_pos );
 | 
									new_player_pos_x - player_half_width, new_player_pos_y,
 | 
				
			||||||
 | 
									player->position.tile_map_x, player->position.tile_map_y,
 | 
				
			||||||
 | 
									player->position.tile_x, player->position.tile_y
 | 
				
			||||||
 | 
								};
 | 
				
			||||||
 | 
								test_pos_sw       = recannonicalize_position( & world, test_pos_sw );
 | 
				
			||||||
 | 
								valid_new_pos &= world_is_point_empty( & world, test_pos_sw );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								CanonPosition test_pos_se {
 | 
				
			||||||
 | 
									new_player_pos_x + player_half_width, new_player_pos_y,
 | 
				
			||||||
 | 
									player->position.tile_map_x, player->position.tile_map_y,
 | 
				
			||||||
 | 
									player->position.tile_x, player->position.tile_y
 | 
				
			||||||
 | 
								};
 | 
				
			||||||
 | 
								test_pos_se       = recannonicalize_position( & world, test_pos_se );
 | 
				
			||||||
 | 
								valid_new_pos &= world_is_point_empty( & world, test_pos_se );
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if ( valid_new_pos )
 | 
							if ( valid_new_pos )
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			RawPosition   raw_pos   = { new_player_pos_x, new_player_pos_y, game_state->tile_map_x, game_state->tile_map_y };
 | 
								CanonPosition new_pos = {
 | 
				
			||||||
			CanonPosition canon_pos = get_cannonical_position( & world, raw_pos);
 | 
									new_player_pos_x, new_player_pos_y,
 | 
				
			||||||
 | 
									player->position.tile_map_x, player->position.tile_map_y,
 | 
				
			||||||
			game_state->tile_map_x = canon_pos.tile_map_x;
 | 
									player->position.tile_x, player->position.tile_y
 | 
				
			||||||
			game_state->tile_map_y = canon_pos.tile_map_y;
 | 
								};
 | 
				
			||||||
 | 
								player->position = recannonicalize_position( & world, new_pos );
 | 
				
			||||||
			// current_tile_map = world_get_tilemap( & world, game_state->tile_map_x, game_state->tile_map_y );
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			player->pos_x = world.tile_upper_left_x + tile_size_in_pixels * scast(f32, canon_pos.tile_x) + canon_pos.x;
 | 
					 | 
				
			||||||
			player->pos_y = world.tile_upper_left_y + tile_size_in_pixels * scast(f32, canon_pos.tile_y) + canon_pos.y;
 | 
					 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		// player_tile_x
 | 
							// player_tile_x
 | 
				
			||||||
@@ -881,35 +904,50 @@ void update_and_render( f32 delta_time, InputState* input, OffscreenBuffer* back
 | 
				
			|||||||
		for ( s32 col = 0; col < 16; ++ col )
 | 
							for ( s32 col = 0; col < 16; ++ col )
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			u32 tileID = tilemap_tile_value( current_tile_map, & world, col, row );
 | 
								u32 tileID = tilemap_tile_value( current_tile_map, & world, col, row );
 | 
				
			||||||
			f32 grey[3] = { 0.15f, 0.15f, 0.15f };
 | 
								f32 color[3] = { 0.15f, 0.15f, 0.15f };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			if ( tileID == 1 )
 | 
								if ( tileID == 1 )
 | 
				
			||||||
			{
 | 
								{
 | 
				
			||||||
				grey[0] = 0.22f;
 | 
									color[0] = 0.22f;
 | 
				
			||||||
				grey[1] = 0.22f;
 | 
									color[1] = 0.22f;
 | 
				
			||||||
				grey[2] = 0.22f;
 | 
									color[2] = 0.22f;
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								if ( row == player->position.tile_y && col == player->position.tile_x )
 | 
				
			||||||
 | 
								{
 | 
				
			||||||
 | 
									color[0] = 0.44f;
 | 
				
			||||||
 | 
									color[1] = 0.3f;
 | 
				
			||||||
 | 
									color[2] = 0.3f;
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			f32 min_x = world.tile_upper_left_x + scast(f32, col) * tile_size_in_pixels;
 | 
								f32 min_x = world.tile_upper_left_x + scast(f32, col) * tile_size_in_pixels;
 | 
				
			||||||
			f32 min_y = world.tile_upper_left_y + scast(f32, row) * tile_size_in_pixels;
 | 
								f32 min_y = world.tile_upper_left_y + scast(f32, row) * tile_size_in_pixels;
 | 
				
			||||||
 | 
								// f32 min_x = scast(f32, col) * tile_size_in_pixels;
 | 
				
			||||||
 | 
								// f32 min_y = scast(f32, row) * tile_size_in_pixels;
 | 
				
			||||||
			f32 max_x = min_x + tile_size_in_pixels;
 | 
								f32 max_x = min_x + tile_size_in_pixels;
 | 
				
			||||||
			f32 max_y = min_y + tile_size_in_pixels;
 | 
								f32 max_y = min_y + tile_size_in_pixels;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			draw_rectangle( back_buffer
 | 
								draw_rectangle( back_buffer
 | 
				
			||||||
				, min_x, min_y
 | 
									, min_x, min_y
 | 
				
			||||||
				, max_x, max_y
 | 
									, max_x, max_y
 | 
				
			||||||
				, grey[0], grey[1], grey[2] );
 | 
									, color[0], color[1], color[2] );
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// Player
 | 
						// Player
 | 
				
			||||||
	f32 player_red   = 0.3f;
 | 
						f32 player_red   = 0.7f;
 | 
				
			||||||
	f32 player_green = 0.3f;
 | 
						f32 player_green = 0.7f;
 | 
				
			||||||
	f32 player_blue  = 0.3f;
 | 
						f32 player_blue  = 0.3f;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						f32 player_tile_x_offset = scast(f32, player->position.tile_x * world.tile_size_in_pixels);
 | 
				
			||||||
 | 
						f32 player_tile_y_offset = scast(f32, player->position.tile_y * world.tile_size_in_pixels);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						f32 player_screen_pos_x = world.tile_upper_left_x + player_tile_x_offset + player->position.x * world.tile_meters_to_pixels;
 | 
				
			||||||
 | 
						f32 player_screen_pos_y = world.tile_upper_left_y + player_tile_y_offset + player->position.y * world.tile_meters_to_pixels;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	draw_rectangle( back_buffer
 | 
						draw_rectangle( back_buffer
 | 
				
			||||||
		, player->pos_x - player_half_width, player->pos_y - player->height
 | 
							, player_screen_pos_x - player_half_width * world.tile_meters_to_pixels, player_screen_pos_y - player->height * world.tile_meters_to_pixels
 | 
				
			||||||
		, player->pos_x + player_half_width, player->pos_y
 | 
							, player_screen_pos_x + player_half_width * world.tile_meters_to_pixels, player_screen_pos_y
 | 
				
			||||||
		, player_red, player_green, player_blue );
 | 
							, player_red, player_green, player_blue );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// Auto-Snapshot percent bar
 | 
						// Auto-Snapshot percent bar
 | 
				
			||||||
@@ -926,8 +964,8 @@ void update_and_render( f32 delta_time, InputState* input, OffscreenBuffer* back
 | 
				
			|||||||
	if ( memory->replay_mode == ReplayMode_Record )
 | 
						if ( memory->replay_mode == ReplayMode_Record )
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		draw_rectangle( back_buffer
 | 
							draw_rectangle( back_buffer
 | 
				
			||||||
			, scast(f32, player->pos_x) + 50.f, scast(f32, player->pos_y) - 50.f
 | 
								, player->position.x + 50.f, player->position.y - 50.f
 | 
				
			||||||
			, scast(f32, player->pos_x) + 10.f, scast(f32, player->pos_y) + 40.f
 | 
								, player->position.x + 10.f, player->position.y + 40.f
 | 
				
			||||||
			, 1.f, 1.f, 1.f );
 | 
								, 1.f, 1.f, 1.f );
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -11,6 +11,11 @@
 | 
				
			|||||||
#define NS_ENGINE_BEGIN namespace engine {
 | 
					#define NS_ENGINE_BEGIN namespace engine {
 | 
				
			||||||
#define NS_ENGINE_END }
 | 
					#define NS_ENGINE_END }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifndef Engine_API
 | 
				
			||||||
 | 
					// The build system is reponsible for defining this API macro for exporting symbols.
 | 
				
			||||||
 | 
					#	define Engine_API
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
NS_ENGINE_BEGIN
 | 
					NS_ENGINE_BEGIN
 | 
				
			||||||
 | 
					
 | 
				
			||||||
enum ReplayMode : s32
 | 
					enum ReplayMode : s32
 | 
				
			||||||
@@ -286,6 +291,7 @@ struct World
 | 
				
			|||||||
{
 | 
					{
 | 
				
			||||||
	f32 tile_size_in_meters;
 | 
						f32 tile_size_in_meters;
 | 
				
			||||||
	s32 tile_size_in_pixels;
 | 
						s32 tile_size_in_pixels;
 | 
				
			||||||
 | 
						f32 tile_meters_to_pixels;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	f32 tile_upper_left_x;
 | 
						f32 tile_upper_left_x;
 | 
				
			||||||
	f32 tile_upper_left_y;
 | 
						f32 tile_upper_left_y;
 | 
				
			||||||
@@ -302,8 +308,7 @@ struct World
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
struct CanonPosition
 | 
					struct CanonPosition
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	// TODO(Ed): Convert these to resolution-indenpent rep of world units (a proper vector space?))
 | 
						// TODO(Ed) : Should this be from the center of the tile?
 | 
				
			||||||
	// Note: Tile-Relative position
 | 
					 | 
				
			||||||
	f32 x;
 | 
						f32 x;
 | 
				
			||||||
	f32 y;
 | 
						f32 y;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -319,15 +324,4 @@ struct CanonPosition
 | 
				
			|||||||
	s32 tile_y;
 | 
						s32 tile_y;
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// TODO(Ed) : Is this necessary?
 | 
					 | 
				
			||||||
struct RawPosition
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
	// Note: TileMap-Relative position
 | 
					 | 
				
			||||||
	f32 x;
 | 
					 | 
				
			||||||
	f32 y;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	s32 tile_map_x;
 | 
					 | 
				
			||||||
	s32 tile_map_y;
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
NS_ENGINE_END
 | 
					NS_ENGINE_END
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -3,10 +3,6 @@
 | 
				
			|||||||
*/
 | 
					*/
 | 
				
			||||||
#pragma once
 | 
					#pragma once
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifndef Engine_API
 | 
					 | 
				
			||||||
#	define Engine_API
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
NS_ENGINE_BEGIN
 | 
					NS_ENGINE_BEGIN
 | 
				
			||||||
 | 
					
 | 
				
			||||||
using OnModuleRelaodFn = void( Memory* memory, platform::ModuleAPI* platform_api );
 | 
					using OnModuleRelaodFn = void( Memory* memory, platform::ModuleAPI* platform_api );
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -3,12 +3,15 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
NS_ENGINE_BEGIN
 | 
					NS_ENGINE_BEGIN
 | 
				
			||||||
 | 
					
 | 
				
			||||||
constexpr Str const symbol_on_module_load = str_ascii( "?on_module_reload@engine@@YAXPEAUMemory@1@PEAUModuleAPI@platform@@@Z" );
 | 
					constexpr 
 | 
				
			||||||
constexpr Str const symbol_startup        = str_ascii( "?startup@engine@@YAXPEAUMemory@1@PEAUModuleAPI@platform@@@Z" );
 | 
					Str const  symbol_on_module_load = str_ascii("?on_module_reload@engine@@YAXPEAUMemory@1@PEAUModuleAPI@platform@@@Z");
 | 
				
			||||||
constexpr Str const symbol_shutdown       = str_ascii( "?shutdown@engine@@YAXPEAUMemory@1@PEAUModuleAPI@platform@@@Z" );
 | 
					constexpr 
 | 
				
			||||||
constexpr Str const symbol_update_and_render =
 | 
					Str const  symbol_startup = str_ascii("?startup@engine@@YAXPEAUMemory@1@PEAUModuleAPI@platform@@@Z");
 | 
				
			||||||
    str_ascii( "?update_and_render@engine@@YAXMPEAUInputState@1@PEAUOffscreenBuffer@1@PEAUMemory@1@PEAUModuleAPI@platform@@PEAUThreadContext@1@@Z" );
 | 
					constexpr 
 | 
				
			||||||
constexpr Str const symbol_update_audio =
 | 
					Str const  symbol_shutdown = str_ascii("?shutdown@engine@@YAXPEAUMemory@1@PEAUModuleAPI@platform@@@Z");
 | 
				
			||||||
    str_ascii( "?update_audio@engine@@YAXMPEAUAudioBuffer@1@PEAUMemory@1@PEAUModuleAPI@platform@@PEAUThreadContext@1@@Z" );
 | 
					constexpr 
 | 
				
			||||||
 | 
					Str const  symbol_update_and_render = str_ascii("?update_and_render@engine@@YAXMPEAUInputState@1@PEAUOffscreenBuffer@1@PEAUMemory@1@PEAUModuleAPI@platform@@PEAUThreadContext@1@@Z");
 | 
				
			||||||
 | 
					constexpr 
 | 
				
			||||||
 | 
					Str const  symbol_update_audio = str_ascii("?update_audio@engine@@YAXMPEAUAudioBuffer@1@PEAUMemory@1@PEAUModuleAPI@platform@@PEAUThreadContext@1@@Z");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
NS_ENGINE_END
 | 
					NS_ENGINE_END
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -75,8 +75,10 @@ struct PlayerState
 | 
				
			|||||||
	f32 height;
 | 
						f32 height;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// TODO(Ed) : Should this be canonical position now?
 | 
						// TODO(Ed) : Should this be canonical position now?
 | 
				
			||||||
	f32 pos_x;
 | 
						//f32 pos_x;
 | 
				
			||||||
	f32 pos_y;
 | 
						//f32 pos_y;
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						engine::CanonPosition position;
 | 
				
			||||||
	
 | 
						
 | 
				
			||||||
	b32 mid_jump;
 | 
						b32 mid_jump;
 | 
				
			||||||
	f32 jump_time;
 | 
						f32 jump_time;
 | 
				
			||||||
@@ -94,9 +96,6 @@ struct PlayerActions
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
struct GameState
 | 
					struct GameState
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	s32 tile_map_x;
 | 
					 | 
				
			||||||
	s32 tile_map_y;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	PlayerState player_state;
 | 
						PlayerState player_state;
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,3 +1,5 @@
 | 
				
			|||||||
// This was generated by project/codegen/platform_gen.cpp
 | 
					//This was generated by project/codegen/platform_gen.cpp
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define using_context() \
 | 
				
			||||||
 | 
					Context *  parent;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define using_context() Context* parent;
 | 
					 | 
				
			||||||
 
 | 
				
			|||||||
@@ -97,15 +97,6 @@ FILETIME file_get_last_write_time( char const* path )
 | 
				
			|||||||
	GetFileAttributesExA( path, GetFileExInfoStandard, & engine_dll_file_attributes );
 | 
						GetFileAttributesExA( path, GetFileExInfoStandard, & engine_dll_file_attributes );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return engine_dll_file_attributes.ftLastWriteTime;
 | 
						return engine_dll_file_attributes.ftLastWriteTime;
 | 
				
			||||||
#if 0
 | 
					 | 
				
			||||||
	WIN32_FIND_DATAA dll_file_info = {};
 | 
					 | 
				
			||||||
	HANDLE dll_file_handle = FindFirstFileA( path, & dll_file_info );
 | 
					 | 
				
			||||||
	if ( dll_file_handle == INVALID_HANDLE_VALUE )
 | 
					 | 
				
			||||||
	{
 | 
					 | 
				
			||||||
		FindClose( dll_file_handle );
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	return dll_file_info.ftLastWriteTime;
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#pragma region Timing
 | 
					#pragma region Timing
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -17,10 +17,11 @@ Import-Module $format_cpp
 | 
				
			|||||||
	   $debug 	         = $null
 | 
						   $debug 	         = $null
 | 
				
			||||||
	   $analysis	     = $false
 | 
						   $analysis	     = $false
 | 
				
			||||||
	   $dev              = $false
 | 
						   $dev              = $false
 | 
				
			||||||
 | 
						   $verbose          = $null
 | 
				
			||||||
	   $platform         = $null
 | 
						   $platform         = $null
 | 
				
			||||||
	   $engine           = $null
 | 
						   $engine           = $null
 | 
				
			||||||
	   $game             = $null
 | 
						   $game             = $null
 | 
				
			||||||
	   $verbose      = $null
 | 
						   $module_specified = $false
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[array] $vendors = @( "clang", "msvc" )
 | 
					[array] $vendors = @( "clang", "msvc" )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -33,17 +34,61 @@ if ( $args ) { $args | ForEach-Object {
 | 
				
			|||||||
		"debug"               { $debug     = $true }
 | 
							"debug"               { $debug     = $true }
 | 
				
			||||||
		"analysis"            { $analysis  = $true }
 | 
							"analysis"            { $analysis  = $true }
 | 
				
			||||||
		"dev"                 { $dev       = $true }
 | 
							"dev"                 { $dev       = $true }
 | 
				
			||||||
		"platform"            { $platform  = $true }
 | 
					 | 
				
			||||||
		"engine"              { $engine    = $true }
 | 
					 | 
				
			||||||
		"game"                { $game      = $true }
 | 
					 | 
				
			||||||
		"verbose"             { $verbose   = $true }
 | 
							"verbose"             { $verbose   = $true }
 | 
				
			||||||
 | 
							"platform"            { $platform  = $true }
 | 
				
			||||||
 | 
							"engine"              { $engine    = $true; $module_specified = $true }
 | 
				
			||||||
 | 
							"game"                { $game      = $true; $module_specified = $true }
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}}
 | 
					}}
 | 
				
			||||||
#endregion Argument
 | 
					#endregion Argument
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					if ( -not $module_specified )
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						$platform = $true
 | 
				
			||||||
 | 
						$engine   = $true
 | 
				
			||||||
 | 
						$game     = $true
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# Load up toolchain configuraion
 | 
					# Load up toolchain configuraion
 | 
				
			||||||
. $config_toolchain
 | 
					. $config_toolchain
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Check to see if the module has changed files since the last build
 | 
				
			||||||
 | 
					function check-ModuleForChanges
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						param( [string]$path_module )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						$module_name = split-path $path_module -leaf
 | 
				
			||||||
 | 
						$path_csv    = Join-Path $path_build ($module_name + "_module_hashes.csv")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						$csv_file_hashes = $null
 | 
				
			||||||
 | 
						if ( test-path $path_csv ) {
 | 
				
			||||||
 | 
							$csv_file_hashes = @{}
 | 
				
			||||||
 | 
							import-csv $path_csv | foreach-object {
 | 
				
			||||||
 | 
								$csv_file_hashes[ $_.name ] = $_.value
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						$file_hashes = @{}
 | 
				
			||||||
 | 
						get-childitem -path $path_module -recurse -file | foreach-object {
 | 
				
			||||||
 | 
							$id                 = $_.fullname
 | 
				
			||||||
 | 
							$hash_info          = get-filehash -path $id -Algorithm MD5
 | 
				
			||||||
 | 
							$file_hashes[ $id ] = $hash_info.Hash
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						$file_hashes.GetEnumerator() | foreach-object { [PSCustomObject]$_ } |
 | 
				
			||||||
 | 
							export-csv $path_csv -NoTypeInformation
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if ( -not $csv_file_hashes )                         { return $true }
 | 
				
			||||||
 | 
						if ( $csv_file_hashes.Count -ne $file_hashes.Count ) { return $true }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						foreach ( $key in $csv_file_hashes.Keys ) {
 | 
				
			||||||
 | 
							if ( $csv_file_hashes[ $key ] -ne $file_hashes[ $key ] ) {
 | 
				
			||||||
 | 
								return $true
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return $false
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#region Building
 | 
					#region Building
 | 
				
			||||||
write-host "Building HandmadeHero with $vendor"
 | 
					write-host "Building HandmadeHero with $vendor"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -105,8 +150,16 @@ else {
 | 
				
			|||||||
	$compiler_args += ( $flag_define + 'Build_Development=0' )
 | 
						$compiler_args += ( $flag_define + 'Build_Development=0' )
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					$should_format_gen = $false
 | 
				
			||||||
 | 
					
 | 
				
			||||||
function build-engine
 | 
					function build-engine
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
						$should_build = check-ModuleForChanges $path_engine
 | 
				
			||||||
 | 
						if ( $should_build -eq $false ) {
 | 
				
			||||||
 | 
							write-host "No changes detected in engine module, skipping build" -ForegroundColor Yellow
 | 
				
			||||||
 | 
							return
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	$path_pdb_lock = Join-Path $path_binaries 'handmade_engine.pdb.lock'
 | 
						$path_pdb_lock = Join-Path $path_binaries 'handmade_engine.pdb.lock'
 | 
				
			||||||
	New-Item $path_pdb_lock -ItemType File -Force
 | 
						New-Item $path_pdb_lock -ItemType File -Force
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -123,12 +176,10 @@ function build-engine
 | 
				
			|||||||
	$local:compiler_args = $script:compiler_args
 | 
						$local:compiler_args = $script:compiler_args
 | 
				
			||||||
	$compiler_args      += ($flag_define + 'Build_DLL=1' )
 | 
						$compiler_args      += ($flag_define + 'Build_DLL=1' )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if ( $vendor -eq 'msvc' )
 | 
						if ( $vendor -eq 'msvc' ) {
 | 
				
			||||||
	{
 | 
					 | 
				
			||||||
		$compiler_args += ($flag_define + 'Engine_API=__declspec(dllexport)')
 | 
							$compiler_args += ($flag_define + 'Engine_API=__declspec(dllexport)')
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	if ( $vendor -eq 'clang' )
 | 
						if ( $vendor -eq 'clang' ) {
 | 
				
			||||||
	{
 | 
					 | 
				
			||||||
		$compiler_args += ($flag_define + 'Engine_API=__attribute__((visibility("default")))')
 | 
							$compiler_args += ($flag_define + 'Engine_API=__attribute__((visibility("default")))')
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -146,6 +197,8 @@ function build-engine
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	#region CodeGen Post-Build
 | 
						#region CodeGen Post-Build
 | 
				
			||||||
	if ( -not $handmade_process_active ) {
 | 
						if ( -not $handmade_process_active ) {
 | 
				
			||||||
 | 
							$path_engine_symbols = Join-Path $path_build 'handmade_engine.symbols'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		# Create the symbol table
 | 
							# Create the symbol table
 | 
				
			||||||
		if ( Test-Path $dynamic_library )
 | 
							if ( Test-Path $dynamic_library )
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
@@ -212,7 +265,6 @@ function build-engine
 | 
				
			|||||||
			}
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			# Write the symbol table to a file
 | 
								# Write the symbol table to a file
 | 
				
			||||||
			$path_engine_symbols = Join-Path $path_build 'handmade_engine.symbols'
 | 
					 | 
				
			||||||
			$engine_symbols.Values | Out-File -Path $path_engine_symbols
 | 
								$engine_symbols.Values | Out-File -Path $path_engine_symbols
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -245,6 +297,7 @@ function build-engine
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
		$path_generated_file = Join-Path $path_build 'engine_symbol_table.hpp'
 | 
							$path_generated_file = Join-Path $path_build 'engine_symbol_table.hpp'
 | 
				
			||||||
		move-item $path_generated_file (join-path $path_gen (split-path $path_generated_file -leaf)) -Force
 | 
							move-item $path_generated_file (join-path $path_gen (split-path $path_generated_file -leaf)) -Force
 | 
				
			||||||
 | 
							$should_format_gen = $true
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
if ( $engine ) {
 | 
					if ( $engine ) {
 | 
				
			||||||
@@ -253,6 +306,17 @@ if ( $engine ) {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
function build-platform
 | 
					function build-platform
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
						if ( $handmade_process_active ) {
 | 
				
			||||||
 | 
							write-host "Handmade process is active, skipping platform build" -ForegroundColor Yellow
 | 
				
			||||||
 | 
							return
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						$should_build = check-ModuleForChanges $path_platform
 | 
				
			||||||
 | 
						if ( $should_build -eq $false ) {
 | 
				
			||||||
 | 
							write-host "No changes detected in platform module, skipping build" -ForegroundColor Yellow
 | 
				
			||||||
 | 
							return
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	# CodeGen Pre-Build
 | 
						# CodeGen Pre-Build
 | 
				
			||||||
	if ( $true )
 | 
						if ( $true )
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
@@ -291,6 +355,8 @@ function build-platform
 | 
				
			|||||||
			}
 | 
								}
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		Pop-Location
 | 
							Pop-Location
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							$should_format_gen = $true
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	# Delete old PDBs
 | 
						# Delete old PDBs
 | 
				
			||||||
@@ -319,12 +385,6 @@ function build-platform
 | 
				
			|||||||
	$executable = Join-Path $path_binaries 'handmade_win32.exe'
 | 
						$executable = Join-Path $path_binaries 'handmade_win32.exe'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	build-simple $path_build $includes $compiler_args $linker_args $unit $executable
 | 
						build-simple $path_build $includes $compiler_args $linker_args $unit $executable
 | 
				
			||||||
 | 
					 | 
				
			||||||
	# if ( Test-Path $executable )
 | 
					 | 
				
			||||||
	# {
 | 
					 | 
				
			||||||
	# 	$data_path = Join-Path $path_data 'handmade_win32.exe'
 | 
					 | 
				
			||||||
	# 	move-item $executable $data_path -Force
 | 
					 | 
				
			||||||
	# }
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
if ( $platform ) {
 | 
					if ( $platform ) {
 | 
				
			||||||
	build-platform
 | 
						build-platform
 | 
				
			||||||
@@ -338,14 +398,17 @@ if ( (Test-Path $path_jsl_dll) -eq $false )
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
#endregion Handmade Runtime
 | 
					#endregion Handmade Runtime
 | 
				
			||||||
 | 
					
 | 
				
			||||||
push-location $path_scripts
 | 
					if ( $should_format_gen )
 | 
				
			||||||
$include = @(
 | 
					{
 | 
				
			||||||
 | 
						push-location $path_scripts
 | 
				
			||||||
 | 
						$include = @(
 | 
				
			||||||
		'*.cpp'
 | 
							'*.cpp'
 | 
				
			||||||
		'*.hpp'
 | 
							'*.hpp'
 | 
				
			||||||
)
 | 
						)
 | 
				
			||||||
format-cpp $path_gen $include
 | 
						format-cpp $path_gen $include
 | 
				
			||||||
format-cpp (Join-Path $path_platform 'gen' ) $include
 | 
						format-cpp (Join-Path $path_platform 'gen' ) $include
 | 
				
			||||||
pop-location
 | 
						pop-location
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Pop-Location
 | 
					Pop-Location
 | 
				
			||||||
#endregion Building
 | 
					#endregion Building
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -14,7 +14,6 @@ if ( $dev ) {
 | 
				
			|||||||
	if ( $debug -eq $null ) {
 | 
						if ( $debug -eq $null ) {
 | 
				
			||||||
		$debug = $true
 | 
							$debug = $true
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					 | 
				
			||||||
	if ( $optimize -eq $null ) {
 | 
						if ( $optimize -eq $null ) {
 | 
				
			||||||
		$optimize = $false
 | 
							$optimize = $false
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
@@ -149,12 +148,15 @@ if ( $vendor -match "clang" )
 | 
				
			|||||||
	)
 | 
						)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	# https://learn.microsoft.com/en-us/cpp/c-runtime-library/crt-library-features?view=msvc-170
 | 
						# https://learn.microsoft.com/en-us/cpp/c-runtime-library/crt-library-features?view=msvc-170
 | 
				
			||||||
 | 
						if ( $IsWindows ) {
 | 
				
			||||||
		$libraries = @(
 | 
							$libraries = @(
 | 
				
			||||||
			'Kernel32' # For Windows API
 | 
								'Kernel32' # For Windows API
 | 
				
			||||||
			# 'msvcrt', # For the C Runtime (Dynamically Linked)
 | 
								# 'msvcrt', # For the C Runtime (Dynamically Linked)
 | 
				
			||||||
			# 'libucrt',
 | 
								# 'libucrt',
 | 
				
			||||||
			'libcmt'    # For the C Runtime (Static Linkage)
 | 
								'libcmt'    # For the C Runtime (Static Linkage)
 | 
				
			||||||
		)
 | 
							)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	function build-simple
 | 
						function build-simple
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		param( [string]$path_output, [array]$includes, [array]$compiler_args, [array]$linker_args, [string]$unit, [string]$binary )
 | 
							param( [string]$path_output, [array]$includes, [array]$compiler_args, [array]$linker_args, [string]$unit, [string]$binary )
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1 +1,5 @@
 | 
				
			|||||||
Clear-Host
 | 
					$clean = join-path $PSScriptRoot 'clean.ps1'
 | 
				
			||||||
 | 
					$build = join-path $PSScriptRoot 'build.ps1'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					& $clean
 | 
				
			||||||
 | 
					& $build 'msvc' 'dev'
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user