mirror of
				https://github.com/Ed94/HandmadeHero.git
				synced 2025-11-03 15:26:12 -08:00 
			
		
		
		
	Day 24 complete
This commit is contained in:
		
							
								
								
									
										8
									
								
								.vscode/bookmarks.json
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										8
									
								
								.vscode/bookmarks.json
									
									
									
									
										vendored
									
									
								
							@@ -14,22 +14,22 @@
 | 
				
			|||||||
					"label": "Static Data"
 | 
										"label": "Static Data"
 | 
				
			||||||
				},
 | 
									},
 | 
				
			||||||
				{
 | 
									{
 | 
				
			||||||
					"line": 631,
 | 
										"line": 640,
 | 
				
			||||||
					"column": 0,
 | 
										"column": 0,
 | 
				
			||||||
					"label": "Timing"
 | 
										"label": "Timing"
 | 
				
			||||||
				},
 | 
									},
 | 
				
			||||||
				{
 | 
									{
 | 
				
			||||||
					"line": 1453,
 | 
										"line": 1471,
 | 
				
			||||||
					"column": 4,
 | 
										"column": 4,
 | 
				
			||||||
					"label": "Main Loop : Audio Processing"
 | 
										"label": "Main Loop : Audio Processing"
 | 
				
			||||||
				},
 | 
									},
 | 
				
			||||||
				{
 | 
									{
 | 
				
			||||||
					"line": 1572,
 | 
										"line": 1590,
 | 
				
			||||||
					"column": 2,
 | 
										"column": 2,
 | 
				
			||||||
					"label": "Main Loop : Timing Update"
 | 
										"label": "Main Loop : Timing Update"
 | 
				
			||||||
				},
 | 
									},
 | 
				
			||||||
				{
 | 
									{
 | 
				
			||||||
					"line": 1656,
 | 
										"line": 1674,
 | 
				
			||||||
					"column": 0,
 | 
										"column": 0,
 | 
				
			||||||
					"label": "Main Loop : End"
 | 
										"label": "Main Loop : End"
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -15,18 +15,20 @@
 | 
				
			|||||||
    </ProjectConfiguration>
 | 
					    </ProjectConfiguration>
 | 
				
			||||||
  </ItemGroup>
 | 
					  </ItemGroup>
 | 
				
			||||||
  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Development|x64'">
 | 
					  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Development|x64'">
 | 
				
			||||||
    <IncludePath>$(ProjectDir)project;$(IncludePath)</IncludePath>
 | 
					    <IncludePath>$(ProjectDir)project;$(IncludePath);</IncludePath>
 | 
				
			||||||
    <LibraryPath>$(ProjectDir)data;$(windir)System32;$(LibraryPath)</LibraryPath>
 | 
					    <LibraryPath>$(ProjectDir)data;$(windir)System32;$(LibraryPath)</LibraryPath>
 | 
				
			||||||
    <NMakeBuildCommandLine>pwsh -ExecutionPolicy Bypass -NoProfile -NonInteractive -File $(ProjectDir)scripts\build.ps1 msvc dev engine</NMakeBuildCommandLine>
 | 
					    <NMakeBuildCommandLine>pwsh -ExecutionPolicy Bypass -NoProfile -NonInteractive -File $(ProjectDir)scripts\build.ps1 msvc dev engine</NMakeBuildCommandLine>
 | 
				
			||||||
    <NMakeCleanCommandLine>pwsh ExecutionPolicy Bypass -NoProfile -NonInteractive -File $(ProjectDir)scripts\clean.ps1</NMakeCleanCommandLine>
 | 
					    <NMakeCleanCommandLine>pwsh ExecutionPolicy Bypass -NoProfile -NonInteractive -File $(ProjectDir)scripts\clean.ps1</NMakeCleanCommandLine>
 | 
				
			||||||
    <NMakePreprocessorDefinitions>GEN_TIME;Build_Development;Build_Debug;$(NMakePreprocessorDefinitions)</NMakePreprocessorDefinitions>
 | 
					    <NMakePreprocessorDefinitions>GEN_TIME;Build_Development;Build_Debug;$(NMakePreprocessorDefinitions)</NMakePreprocessorDefinitions>
 | 
				
			||||||
    <ExternalIncludePath>$(VC_IncludePath);$(WindowsSDK_IncludePath)</ExternalIncludePath>
 | 
					    <ExternalIncludePath>$(VC_IncludePath);$(WindowsSDK_IncludePath);$(UniversalCRT_IncludePath);</ExternalIncludePath>
 | 
				
			||||||
    <NMakeReBuildCommandLine>
 | 
					    <NMakeReBuildCommandLine>
 | 
				
			||||||
    </NMakeReBuildCommandLine>
 | 
					    </NMakeReBuildCommandLine>
 | 
				
			||||||
  </PropertyGroup>
 | 
					  </PropertyGroup>
 | 
				
			||||||
  <ItemGroup>
 | 
					  <ItemGroup>
 | 
				
			||||||
 | 
					    <ClInclude Include="project\dependencies\gen.hpp" />
 | 
				
			||||||
    <ClInclude Include="project\engine\engine.hpp" />
 | 
					    <ClInclude Include="project\engine\engine.hpp" />
 | 
				
			||||||
    <ClInclude Include="project\engine\engine_game_api.hpp" />
 | 
					    <ClInclude Include="project\engine\engine_game_api.hpp" />
 | 
				
			||||||
 | 
					    <ClInclude Include="project\gen\engine_symbol_table.hpp" />
 | 
				
			||||||
    <ClInclude Include="project\handmade.hpp" />
 | 
					    <ClInclude Include="project\handmade.hpp" />
 | 
				
			||||||
    <ClInclude Include="project\platform\generics.hpp" />
 | 
					    <ClInclude Include="project\platform\generics.hpp" />
 | 
				
			||||||
    <ClInclude Include="project\platform\grime.hpp" />
 | 
					    <ClInclude Include="project\platform\grime.hpp" />
 | 
				
			||||||
@@ -34,12 +36,13 @@
 | 
				
			|||||||
    <ClInclude Include="project\platform\macros.hpp" />
 | 
					    <ClInclude Include="project\platform\macros.hpp" />
 | 
				
			||||||
    <ClInclude Include="project\platform\math_constants.hpp" />
 | 
					    <ClInclude Include="project\platform\math_constants.hpp" />
 | 
				
			||||||
    <ClInclude Include="project\platform\platform.hpp" />
 | 
					    <ClInclude Include="project\platform\platform.hpp" />
 | 
				
			||||||
    <ClInclude Include="project\platform\platform_engine_api.hpp" />
 | 
					 | 
				
			||||||
    <ClInclude Include="project\platform\strings.hpp" />
 | 
					    <ClInclude Include="project\platform\strings.hpp" />
 | 
				
			||||||
    <ClInclude Include="project\platform\types.hpp" />
 | 
					    <ClInclude Include="project\platform\types.hpp" />
 | 
				
			||||||
    <ClInclude Include="project\platform\win32.hpp" />
 | 
					    <ClInclude Include="project\platform\win32.hpp" />
 | 
				
			||||||
  </ItemGroup>
 | 
					  </ItemGroup>
 | 
				
			||||||
  <ItemGroup>
 | 
					  <ItemGroup>
 | 
				
			||||||
 | 
					    <ClCompile Include="project\codegen\engine_postbuild_gen.cpp" />
 | 
				
			||||||
 | 
					    <ClCompile Include="project\codegen\platform_gen.cpp" />
 | 
				
			||||||
    <ClCompile Include="project\engine\engine.cpp" />
 | 
					    <ClCompile Include="project\engine\engine.cpp" />
 | 
				
			||||||
    <ClCompile Include="project\handmade.cpp" />
 | 
					    <ClCompile Include="project\handmade.cpp" />
 | 
				
			||||||
    <ClCompile Include="project\handmade_engine.cpp" />
 | 
					    <ClCompile Include="project\handmade_engine.cpp" />
 | 
				
			||||||
@@ -68,6 +71,11 @@
 | 
				
			|||||||
    <None Include="scripts\helpers\target_arch.psm1" />
 | 
					    <None Include="scripts\helpers\target_arch.psm1" />
 | 
				
			||||||
    <None Include="scripts\update_deps.ps1" />
 | 
					    <None Include="scripts\update_deps.ps1" />
 | 
				
			||||||
  </ItemGroup>
 | 
					  </ItemGroup>
 | 
				
			||||||
 | 
					  <ItemGroup>
 | 
				
			||||||
 | 
					    <Content Include="project\codegen\Readme.md" />
 | 
				
			||||||
 | 
					    <Content Include="project\gen\Readme.md" />
 | 
				
			||||||
 | 
					    <Content Include="scripts\rebuild.ps1" />
 | 
				
			||||||
 | 
					  </ItemGroup>
 | 
				
			||||||
  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Development|x64'" Label="Configuration">
 | 
					  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Development|x64'" Label="Configuration">
 | 
				
			||||||
    <ConfigurationType>Makefile</ConfigurationType>
 | 
					    <ConfigurationType>Makefile</ConfigurationType>
 | 
				
			||||||
    <UseDebugLibraries>true</UseDebugLibraries>
 | 
					    <UseDebugLibraries>true</UseDebugLibraries>
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										5
									
								
								docs/Day 024.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										5
									
								
								docs/Day 024.md
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,5 @@
 | 
				
			|||||||
 | 
					# Day 24
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Did lots of cleanup & refactoring on my side.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Started to use gencpp to generate the engne module symbol constants for the platform layer.
 | 
				
			||||||
@@ -18,7 +18,7 @@ using namespace gen;
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
constexpr StrC fname_handmade_engine_symbols = txt("handmade_engine.symbols");
 | 
					constexpr StrC fname_handmade_engine_symbols = txt("handmade_engine.symbols");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
String get_symbol_from_module_table( FileContents symbol_table, u32 symbol_ID )
 | 
					void get_symbols_from_module_table( FileContents symbol_table, Array<String> symbols )
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct Token
 | 
						struct Token
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
@@ -26,11 +26,8 @@ String get_symbol_from_module_table( FileContents symbol_table, u32 symbol_ID )
 | 
				
			|||||||
		u32         Len;
 | 
							u32         Len;
 | 
				
			||||||
	};
 | 
						};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	Token tokens[256] = {};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	char const* scanner = rcast( char const*, symbol_table.data );
 | 
						char const* scanner = rcast( char const*, symbol_table.data );
 | 
				
			||||||
	u32 left = symbol_table.size;
 | 
						u32 left = symbol_table.size;
 | 
				
			||||||
	u32 line = 0;
 | 
					 | 
				
			||||||
	while ( left )
 | 
						while ( left )
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		if ( *scanner == '\n' || *scanner == '\r' )
 | 
							if ( *scanner == '\n' || *scanner == '\r' )
 | 
				
			||||||
@@ -40,23 +37,17 @@ String get_symbol_from_module_table( FileContents symbol_table, u32 symbol_ID )
 | 
				
			|||||||
		}
 | 
							}
 | 
				
			||||||
		else
 | 
							else
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			tokens[line].Ptr = scanner;
 | 
								Token token {};
 | 
				
			||||||
 | 
								token.Ptr = scanner;
 | 
				
			||||||
			while ( left && *scanner != '\r' && *scanner != '\n' )
 | 
								while ( left && *scanner != '\r' && *scanner != '\n' )
 | 
				
			||||||
			{
 | 
								{
 | 
				
			||||||
				-- left;
 | 
									-- left;
 | 
				
			||||||
				++ scanner;
 | 
									++ scanner;
 | 
				
			||||||
				++ tokens[line].Len;
 | 
									++ token.Len;
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
 | 
								symbols.append( String::make_length( GlobalAllocator, token.Ptr, token.Len ) );
 | 
				
			||||||
			if ( line == symbol_ID )
 | 
					 | 
				
			||||||
			{
 | 
					 | 
				
			||||||
				String result = String::make_length( GlobalAllocator, tokens[line].Ptr, tokens[line].Len );
 | 
					 | 
				
			||||||
				return result;
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
			++ line;
 | 
					 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	return {};
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int gen_main()
 | 
					int gen_main()
 | 
				
			||||||
@@ -74,25 +65,24 @@ int gen_main()
 | 
				
			|||||||
	builder.print( fmt_newline );
 | 
						builder.print( fmt_newline );
 | 
				
			||||||
	builder.print_fmt( "NS_ENGINE_BEGIN\n\n" );
 | 
						builder.print_fmt( "NS_ENGINE_BEGIN\n\n" );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	StrC symbol_on_module_load    = get_symbol_from_module_table( symbol_table, engine::ModuleAPI::Sym_OnModuleReload );
 | 
						Array<String> symbols = Array<String>::init_reserve( GlobalAllocator, kilobytes(1) );
 | 
				
			||||||
	StrC symbol_startup           = get_symbol_from_module_table( symbol_table, engine::ModuleAPI::Sym_Startup );
 | 
						get_symbols_from_module_table( symbol_table, symbols );
 | 
				
			||||||
	StrC symbol_shutdown          = get_symbol_from_module_table( symbol_table, engine::ModuleAPI::Sym_Shutdown );
 | 
					 | 
				
			||||||
	StrC symbol_update_and_render = get_symbol_from_module_table( symbol_table, engine::ModuleAPI::Sym_UpdateAndRender );
 | 
					 | 
				
			||||||
	StrC symbol_update_audio      = get_symbol_from_module_table( symbol_table, engine::ModuleAPI::Sym_UpdateAudio );
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	builder.print( parse_variable( token_fmt( "symbol", symbol_on_module_load, stringize(
 | 
						using ModuleAPI = engine::ModuleAPI;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						builder.print( parse_variable( token_fmt( "symbol", (StrC)symbols[ModuleAPI::Sym_OnModuleReload], stringize(
 | 
				
			||||||
		constexpr const Str symbol_on_module_load = str_ascii("<symbol>");
 | 
							constexpr const Str symbol_on_module_load = str_ascii("<symbol>");
 | 
				
			||||||
	))));
 | 
						))));
 | 
				
			||||||
	builder.print( parse_variable( token_fmt( "symbol", symbol_startup, stringize(
 | 
						builder.print( parse_variable( token_fmt( "symbol", (StrC)symbols[ModuleAPI::Sym_Startup], stringize(
 | 
				
			||||||
		constexpr const Str symbol_startup = str_ascii("<symbol>");
 | 
							constexpr const Str symbol_startup = str_ascii("<symbol>");
 | 
				
			||||||
	))));
 | 
						))));
 | 
				
			||||||
	builder.print( parse_variable( token_fmt( "symbol", symbol_shutdown, stringize(
 | 
						builder.print( parse_variable( token_fmt( "symbol", (StrC)symbols[ModuleAPI::Sym_Shutdown], stringize(
 | 
				
			||||||
		constexpr const Str symbol_shutdown = str_ascii("<symbol>");
 | 
							constexpr const Str symbol_shutdown = str_ascii("<symbol>");
 | 
				
			||||||
	))));
 | 
						))));
 | 
				
			||||||
	builder.print( parse_variable( token_fmt( "symbol", symbol_update_and_render, stringize(
 | 
						builder.print( parse_variable( token_fmt( "symbol", (StrC)symbols[ModuleAPI::Sym_UpdateAndRender], stringize(
 | 
				
			||||||
		constexpr const Str symbol_update_and_render = str_ascii("<symbol>");
 | 
							constexpr const Str symbol_update_and_render = str_ascii("<symbol>");
 | 
				
			||||||
	))));
 | 
						))));
 | 
				
			||||||
	builder.print( parse_variable( token_fmt( "symbol", symbol_update_audio, stringize(
 | 
						builder.print( parse_variable( token_fmt( "symbol", (StrC)symbols[ModuleAPI::Sym_UpdateAudio], stringize(
 | 
				
			||||||
		constexpr const Str symbol_update_audio = str_ascii("<symbol>");
 | 
							constexpr const Str symbol_update_audio = str_ascii("<symbol>");
 | 
				
			||||||
	))));
 | 
						))));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -150,12 +150,13 @@ render_weird_graident(OffscreenBuffer* buffer, u32 x_offset, u32 y_offset )
 | 
				
			|||||||
			u8 green = scast(u8, y + y_offset - u8(wildcard) % 128);
 | 
								u8 green = scast(u8, y + y_offset - u8(wildcard) % 128);
 | 
				
			||||||
			u8 red   = scast(u8, wildcard) % 256 - x * 0.4f;
 | 
								u8 red   = scast(u8, wildcard) % 256 - x * 0.4f;
 | 
				
			||||||
		#else
 | 
							#else
 | 
				
			||||||
			u8 blue  = scast(u8, x + x_offset);
 | 
								u8 red   = scast(u8, y + x_offset);
 | 
				
			||||||
			u8 green = scast(u8, y + y_offset);
 | 
								u8 green = scast(u8, x + y_offset);
 | 
				
			||||||
			u8 red   = 0;
 | 
								u8 blue  = scast(u8, x + y - x_offset - y_offset);
 | 
				
			||||||
 | 
								//    blue *= 2;
 | 
				
			||||||
		#endif
 | 
							#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			*pixel++ = u32(red << 16) | u32(green/2 << 16) | blue/2 << 0;
 | 
								*pixel++ = u32(red/2 << 16) | u32(green/6 << 8) | blue/2 << 0;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		wildcard += 0.5375f;
 | 
							wildcard += 0.5375f;
 | 
				
			||||||
		row += buffer->Pitch;
 | 
							row += buffer->Pitch;
 | 
				
			||||||
@@ -197,7 +198,11 @@ render_player( OffscreenBuffer* buffer, s32 pos_x, s32 pos_y )
 | 
				
			|||||||
internal
 | 
					internal
 | 
				
			||||||
void begin_recording_input( EngineState* state, InputState* input, platform::ModuleAPI* platform_api )
 | 
					void begin_recording_input( EngineState* state, InputState* input, platform::ModuleAPI* platform_api )
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	state->ActiveInputRecordingFile.Path = str_ascii("test_input.hmi");
 | 
						Str file_name = str_ascii("test_input.hmi");
 | 
				
			||||||
 | 
						StrPath file_path = {};
 | 
				
			||||||
 | 
						file_path.concat( platform_api->path_scratch, file_name );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						state->ActiveInputRecordingFile.Path = file_path;
 | 
				
			||||||
	state->InputRecordingIndex = 1;
 | 
						state->InputRecordingIndex = 1;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// TODO(Ed) : If game persist memory is larger than 4 gb, this will need to be done in chunks...
 | 
						// TODO(Ed) : If game persist memory is larger than 4 gb, this will need to be done in chunks...
 | 
				
			||||||
@@ -215,9 +220,11 @@ internal
 | 
				
			|||||||
void begin_playback_input( EngineState* state, InputState* input, platform::ModuleAPI* platform_api )
 | 
					void begin_playback_input( EngineState* state, InputState* input, platform::ModuleAPI* platform_api )
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	Str file_name = str_ascii("test_input.hmi");
 | 
						Str file_name = str_ascii("test_input.hmi");
 | 
				
			||||||
	if ( platform_api->file_check_exists( file_name ) )
 | 
						StrPath file_path = {};
 | 
				
			||||||
 | 
						file_path.concat( platform_api->path_scratch, file_name );
 | 
				
			||||||
 | 
						if ( platform_api->file_check_exists( file_path ) )
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		state->ActivePlaybackFile.Path = str_ascii("test_input.hmi");
 | 
							state->ActivePlaybackFile.Path = file_path;
 | 
				
			||||||
		state->InputPlayingIndex = 1;
 | 
							state->InputPlayingIndex = 1;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -254,7 +261,7 @@ InputStateSnapshot input_state_snapshot( InputState* input )
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
		if ( controller->Keyboard )
 | 
							if ( controller->Keyboard )
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			snapshot.Controllers[idx].Keyboard       = *controller->Keyboard;
 | 
								snapshot.Controllers[idx].Keyboard = *controller->Keyboard;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if ( controller->Mouse )
 | 
							if ( controller->Mouse )
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -80,8 +80,9 @@ using FileRewindFn       = void ( File* file );
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
struct ModuleAPI
 | 
					struct ModuleAPI
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	Str PathRoot;
 | 
						Str path_root;
 | 
				
			||||||
	Str PathBinaries;
 | 
						Str path_binaries;
 | 
				
			||||||
 | 
						Str path_scratch;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#if Build_Development
 | 
					#if Build_Development
 | 
				
			||||||
	DebugSetPauseRenderingFn* debug_set_pause_rendering;
 | 
						DebugSetPauseRenderingFn* debug_set_pause_rendering;
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -22,8 +22,7 @@ struct Str
 | 
				
			|||||||
		str_append( Len, Data, src.Len, src.Data );
 | 
							str_append( Len, Data, src.Len, src.Data );
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	static
 | 
						void concat( u32 dest_size, Str* dest, Str const str_a, Str const str_b )
 | 
				
			||||||
	void concast( u32 dest_size, Str* dest, Str const str_a, Str const str_b )
 | 
					 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		str_concat( dest_size, dest->Data
 | 
							str_concat( dest_size, dest->Data
 | 
				
			||||||
			, str_a.Len, str_a.Data
 | 
								, str_a.Len, str_a.Data
 | 
				
			||||||
@@ -42,8 +41,8 @@ struct Str
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
template< u32 capacity >
 | 
					 | 
				
			||||||
// Fixed length raw strings.
 | 
					// Fixed length raw strings.
 | 
				
			||||||
 | 
					template< u32 capacity >
 | 
				
			||||||
struct StrFixed
 | 
					struct StrFixed
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	constexpr static u32 Capacity = capacity;
 | 
						constexpr static u32 Capacity = capacity;
 | 
				
			||||||
@@ -188,3 +187,5 @@ u32 str_length( char const* str )
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	return result;
 | 
						return result;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					using StrPath = StrFixed< S16_MAX >;
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -84,9 +84,10 @@ enum MB : UINT
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
enum Mem : DWORD
 | 
					enum Mem : DWORD
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	MEM_Commit_Zeroed = MEM_COMMIT,
 | 
						MEM_Commit_Zeroed   = MEM_COMMIT,
 | 
				
			||||||
	MEM_Reserve	      = MEM_RESERVE,
 | 
						MEM_Reserve	        = MEM_RESERVE,
 | 
				
			||||||
	MEM_Release 	  = MEM_RELEASE,
 | 
						MEM_Release 	    = MEM_RELEASE,
 | 
				
			||||||
 | 
						MEM_Use_Large_pages = MEM_LARGE_PAGES,
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
enum Page : DWORD
 | 
					enum Page : DWORD
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -97,8 +97,9 @@ struct DirectSoundBuffer
 | 
				
			|||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#pragma region Static Data
 | 
					#pragma region Static Data
 | 
				
			||||||
global StrFixed< S16_MAX > Path_Root;
 | 
					global StrPath Path_Root;
 | 
				
			||||||
global StrFixed< S16_MAX > Path_Binaries;
 | 
					global StrPath Path_Binaries;
 | 
				
			||||||
 | 
					global StrPath Path_Scratch;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// TODO(Ed) : This is a global for now.
 | 
					// TODO(Ed) : This is a global for now.
 | 
				
			||||||
global b32 Running         = false;
 | 
					global b32 Running         = false;
 | 
				
			||||||
@@ -130,14 +131,19 @@ global f32 Engine_Frame_Target_MS = 1000.f / scast(f32, Engine_Refresh_Hz);
 | 
				
			|||||||
internal
 | 
					internal
 | 
				
			||||||
FILETIME file_get_last_write_time( char const* path )
 | 
					FILETIME file_get_last_write_time( char const* path )
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
						WIN32_FILE_ATTRIBUTE_DATA engine_dll_file_attributes = {};
 | 
				
			||||||
 | 
						GetFileAttributesExA( path, GetFileExInfoStandard, & engine_dll_file_attributes );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return engine_dll_file_attributes.ftLastWriteTime;
 | 
				
			||||||
 | 
					#if 0
 | 
				
			||||||
	WIN32_FIND_DATAA dll_file_info = {};
 | 
						WIN32_FIND_DATAA dll_file_info = {};
 | 
				
			||||||
	HANDLE dll_file_handle = FindFirstFileA( path, & dll_file_info );
 | 
						HANDLE dll_file_handle = FindFirstFileA( path, & dll_file_info );
 | 
				
			||||||
	if ( dll_file_handle == INVALID_HANDLE_VALUE )
 | 
						if ( dll_file_handle == INVALID_HANDLE_VALUE )
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		FindClose( dll_file_handle );
 | 
							FindClose( dll_file_handle );
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					 | 
				
			||||||
	return dll_file_info.ftLastWriteTime;
 | 
						return dll_file_info.ftLastWriteTime;
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
struct AudioTimeMarker
 | 
					struct AudioTimeMarker
 | 
				
			||||||
@@ -503,6 +509,9 @@ poll_input( engine::InputState* input, u32 jsl_num_devices, JSL_DeviceHandle* js
 | 
				
			|||||||
	// Keyboard Polling
 | 
						// Keyboard Polling
 | 
				
			||||||
	// Keyboards are unified for now.
 | 
						// Keyboards are unified for now.
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
 | 
							// TODO(Ed): this needs to be moved out of heere when frames are detached from polling input.
 | 
				
			||||||
 | 
							input->Controllers[0].Keyboard = {};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		constexpr u32 is_down = 0x80000000;
 | 
							constexpr u32 is_down = 0x80000000;
 | 
				
			||||||
		input_process_digital_btn( & old_keyboard->Q,         & new_keyboard->Q,         GetAsyncKeyState( 'Q' ),       is_down );
 | 
							input_process_digital_btn( & old_keyboard->Q,         & new_keyboard->Q,         GetAsyncKeyState( 'Q' ),       is_down );
 | 
				
			||||||
		input_process_digital_btn( & old_keyboard->E,         & new_keyboard->E,         GetAsyncKeyState( 'E' ),       is_down );
 | 
							input_process_digital_btn( & old_keyboard->E,         & new_keyboard->E,         GetAsyncKeyState( 'E' ),       is_down );
 | 
				
			||||||
@@ -685,7 +694,8 @@ display_buffer_in_window( HDC device_context, u32 window_width, u32 window_heigh
 | 
				
			|||||||
		, x, y, width, height
 | 
							, x, y, width, height
 | 
				
			||||||
		, x, y, width, height
 | 
							, x, y, width, height
 | 
				
			||||||
	#endif
 | 
						#endif
 | 
				
			||||||
		, 0, 0, window_width, window_height
 | 
							, 0, 0, buffer->Width, buffer->Height
 | 
				
			||||||
 | 
							// , 0, 0, window_width, window_height
 | 
				
			||||||
		, 0, 0, buffer->Width, buffer->Height
 | 
							, 0, 0, buffer->Width, buffer->Height
 | 
				
			||||||
		, buffer->Memory, & buffer->Info
 | 
							, buffer->Memory, & buffer->Info
 | 
				
			||||||
		, DIB_ColorTable_RGB, RO_Source_To_Dest );
 | 
							, DIB_ColorTable_RGB, RO_Source_To_Dest );
 | 
				
			||||||
@@ -1147,13 +1157,11 @@ WinMain( HINSTANCE instance, HINSTANCE prev_instance, LPSTR commandline, int sho
 | 
				
			|||||||
	// Memory
 | 
						// Memory
 | 
				
			||||||
	engine::Memory engine_memory {};
 | 
						engine::Memory engine_memory {};
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		engine_memory.PersistentSize = megabytes( 128 );
 | 
							u64 total_size = gigabytes( 4 );
 | 
				
			||||||
		// engine_memory.FrameSize	     = megabytes( 64 );
 | 
					 | 
				
			||||||
		engine_memory.TransientSize  = gigabytes( 2 );
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
		u64 total_size = engine_memory.PersistentSize
 | 
							engine_memory.PersistentSize = total_size - megabytes( 128 );
 | 
				
			||||||
			// + engine_memory.FrameSize
 | 
							// engine_memory.FrameSize	     = megabytes( 64 );
 | 
				
			||||||
			+ engine_memory.TransientSize;
 | 
							engine_memory.TransientSize  = total_size - engine_memory.PersistentSize;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	#if Build_Debug
 | 
						#if Build_Debug
 | 
				
			||||||
		void* base_address = rcast(void*, terabytes( 1 ));
 | 
							void* base_address = rcast(void*, terabytes( 1 ));
 | 
				
			||||||
@@ -1177,7 +1185,7 @@ WinMain( HINSTANCE instance, HINSTANCE prev_instance, LPSTR commandline, int sho
 | 
				
			|||||||
	{
 | 
						{
 | 
				
			||||||
		window_class.style = CS_Horizontal_Redraw | CS_Vertical_Redraw;
 | 
							window_class.style = CS_Horizontal_Redraw | CS_Vertical_Redraw;
 | 
				
			||||||
		window_class.lpfnWndProc = main_window_callback;
 | 
							window_class.lpfnWndProc = main_window_callback;
 | 
				
			||||||
		// window_class.cbClsExtra  = ;
 | 
							// window_class.cbClsExtra  = ;about:blank#blocked
 | 
				
			||||||
		// window_class.cbWndExtra  = ;
 | 
							// window_class.cbWndExtra  = ;
 | 
				
			||||||
		window_class.hInstance   = instance;
 | 
							window_class.hInstance   = instance;
 | 
				
			||||||
		// window_class.hIcon = ;
 | 
							// window_class.hIcon = ;
 | 
				
			||||||
@@ -1193,13 +1201,13 @@ WinMain( HINSTANCE instance, HINSTANCE prev_instance, LPSTR commandline, int sho
 | 
				
			|||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		window_handle = CreateWindowExW(
 | 
							window_handle = CreateWindowExW(
 | 
				
			||||||
			// WS_EX_LAYERED | WS_EX_TOPMOST,
 | 
								WS_EX_LAYERED | WS_EX_TOPMOST,
 | 
				
			||||||
			WS_EX_LAYERED,
 | 
								// WS_EX_LAYERED,
 | 
				
			||||||
			window_class.lpszClassName,
 | 
								window_class.lpszClassName,
 | 
				
			||||||
			L"Handmade Hero",
 | 
								L"Handmade Hero",
 | 
				
			||||||
			WS_Overlapped_Window | WS_Initially_Visible,
 | 
								WS_Overlapped_Window | WS_Initially_Visible,
 | 
				
			||||||
			CW_Use_Default, CW_Use_Default, // x, y
 | 
								CW_Use_Default, CW_Use_Default, // x, y
 | 
				
			||||||
			1100, 700, // width, height
 | 
								CW_Use_Default, CW_Use_Default, // width, height
 | 
				
			||||||
			0, 0,                         // parent, menu
 | 
								0, 0,                         // parent, menu
 | 
				
			||||||
			instance, 0                   // instance, param
 | 
								instance, 0                   // instance, param
 | 
				
			||||||
		);
 | 
							);
 | 
				
			||||||
@@ -1212,7 +1220,7 @@ WinMain( HINSTANCE instance, HINSTANCE prev_instance, LPSTR commandline, int sho
 | 
				
			|||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	// WinDimensions dimensions = get_window_dimensions( window_handle );
 | 
						// WinDimensions dimensions = get_window_dimensions( window_handle );
 | 
				
			||||||
	resize_dib_section( &Surface_Back_Buffer, 1280, 720 );
 | 
						resize_dib_section( &Surface_Back_Buffer, 1920, 1080 );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// Setup pathing
 | 
						// Setup pathing
 | 
				
			||||||
	StrFixed< S16_MAX > path_pdb_lock {};
 | 
						StrFixed< S16_MAX > path_pdb_lock {};
 | 
				
			||||||
@@ -1247,11 +1255,21 @@ WinMain( HINSTANCE instance, HINSTANCE prev_instance, LPSTR commandline, int sho
 | 
				
			|||||||
		Path_Engine_DLL_InUse.concat( Path_Binaries, FName_Engine_DLL_InUse );
 | 
							Path_Engine_DLL_InUse.concat( Path_Binaries, FName_Engine_DLL_InUse );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		path_pdb_lock.concat( Path_Binaries, FName_Engine_PDB_Lock );
 | 
							path_pdb_lock.concat( Path_Binaries, FName_Engine_PDB_Lock );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							Path_Scratch.concat( Path_Root, str_ascii("scratch") );
 | 
				
			||||||
 | 
							Path_Scratch.Data[ Path_Scratch.Len ] = '\\';
 | 
				
			||||||
 | 
							++ Path_Scratch.Len;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							CreateDirectoryA( Path_Scratch, 0 );
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// Prepare platform API
 | 
						// Prepare platform API
 | 
				
			||||||
	ModuleAPI platform_api {};
 | 
						ModuleAPI platform_api {};
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
 | 
							platform_api.path_root     = Path_Root;
 | 
				
			||||||
 | 
							platform_api.path_binaries = Path_Binaries;
 | 
				
			||||||
 | 
							platform_api.path_scratch  = Path_Scratch;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	#if Build_Development
 | 
						#if Build_Development
 | 
				
			||||||
		platform_api.debug_set_pause_rendering = & debug_set_pause_rendering;
 | 
							platform_api.debug_set_pause_rendering = & debug_set_pause_rendering;
 | 
				
			||||||
	#endif
 | 
						#endif
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -201,8 +201,7 @@ if ( $vendor -match "clang" )
 | 
				
			|||||||
		$map    = join-path $path_build (split-path $map    -Leaf)
 | 
							$map    = join-path $path_build (split-path $map    -Leaf)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		# The PDB file has to also be time-stamped so that we can reload the DLL at runtime
 | 
							# The PDB file has to also be time-stamped so that we can reload the DLL at runtime
 | 
				
			||||||
		$timestamp = Get-Date -Format "yyyy-MM-dd_HH-mm-ss"
 | 
							$pdb    = $binary -replace '\.(exe|dll)$', "_$(get-random).pdb"
 | 
				
			||||||
		$pdb       = $binary -replace '\.(exe|dll)$', "_$timestamp.pdb"
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
		$compiler_args += @(
 | 
							$compiler_args += @(
 | 
				
			||||||
			$flag_no_color_diagnostics,
 | 
								$flag_no_color_diagnostics,
 | 
				
			||||||
@@ -322,8 +321,7 @@ if ( $vendor -match "msvc" )
 | 
				
			|||||||
		$map    = join-path $path_build (split-path $map    -Leaf)
 | 
							$map    = join-path $path_build (split-path $map    -Leaf)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		# The PDB file has to also be time-stamped so that we can reload the DLL at runtime
 | 
							# The PDB file has to also be time-stamped so that we can reload the DLL at runtime
 | 
				
			||||||
		$timestamp = Get-Date -Format "yyyy-MM-dd_HH-mm-ss"
 | 
							$pdb    = $binary -replace '\.(exe|dll)$', "_$(get-random).pdb"
 | 
				
			||||||
		$pdb       = $binary -replace '\.(exe|dll)$', "_$timestamp.pdb"
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
		$compiler_args += @(
 | 
							$compiler_args += @(
 | 
				
			||||||
			$flag_nologo,
 | 
								$flag_nologo,
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user