Handmade Hero»Episode Guide
Making the Debug System CLANG Compatible
?
?

Keyboard Navigation

Global Keys

[, < / ], > Jump to previous / next episode
W, K, P / S, J, N Jump to previous / next marker
t / T Toggle theatre / SUPERtheatre mode
V Revert filter to original state Y Select link (requires manual Ctrl-c)

Menu toggling

q Quotes r References f Filter y Link c Credits

In-Menu Movement

a
w
s
d
h j k l


Quotes and References Menus

Enter Jump to timecode

Quotes, References and Credits Menus

o Open URL (in new tab)

Filter Menu

x, Space Toggle category and focus next
X, ShiftSpace Toggle category and focus previous
v Invert topics / media as per focus

Filter and Link Menus

z Toggle filter / linking mode

Credits Menu

Enter Open URL (in new tab)
0:31Set the stage for the day with a few words on compiling for multiple platforms
0:31Set the stage for the day with a few words on compiling for multiple platforms
0:31Set the stage for the day with a few words on compiling for multiple platforms
3:20Determine to make the debug system compatible with CLANG
3:20Determine to make the debug system compatible with CLANG
3:20Determine to make the debug system compatible with CLANG
5:48handmade_debug_interface.h: Explain the RecordDebugEvent() and DEBUG_NAME macros
5:48handmade_debug_interface.h: Explain the RecordDebugEvent() and DEBUG_NAME macros
5:48handmade_debug_interface.h: Explain the RecordDebugEvent() and DEBUG_NAME macros
8:59Describe our problem and demo string concatenation
8:59Describe our problem and demo string concatenation
8:59Describe our problem and demo string concatenation
14:06Consult the GCC documentation (see Resouces, GCC Manual)
14:06Consult the GCC documentation (see Resouces, GCC Manual)
14:06Consult the GCC documentation (see Resouces, GCC Manual)
14:52handmade.cpp: Demo the difference between GCC's and Visual Studio's implementations of string concatenation
14:52handmade.cpp: Demo the difference between GCC's and Visual Studio's implementations of string concatenation
14:52handmade.cpp: Demo the difference between GCC's and Visual Studio's implementations of string concatenation
17:28Consider how to workaround the problem
17:28Consider how to workaround the problem
17:28Consider how to workaround the problem
26:07Consider adding support for constant string concatenation to CLANG
26:07Consider adding support for constant string concatenation to CLANG
26:07Consider adding support for constant string concatenation to CLANG
27:04handmade_debug.cpp: Reacquaint ourselves with the code
27:04handmade_debug.cpp: Reacquaint ourselves with the code
27:04handmade_debug.cpp: Reacquaint ourselves with the code
28:334coder feature request: A standard way to send a platform message to 4coder in order to jump to a file at a given line
28:334coder feature request: A standard way to send a platform message to 4coder in order to jump to a file at a given line
28:334coder feature request: A standard way to send a platform message to 4coder in order to jump to a file at a given line
31:16handmade_debug.interface.h: Consider having two versions of UniqueFileCounterString__()
31:16handmade_debug.interface.h: Consider having two versions of UniqueFileCounterString__()
31:16handmade_debug.interface.h: Consider having two versions of UniqueFileCounterString__()
34:25handmade_debug_interface.h: Add Name to the debug_event struct and make BEGIN_BLOCK and END_BLOCK take it
34:25handmade_debug_interface.h: Add Name to the debug_event struct and make BEGIN_BLOCK and END_BLOCK take it
34:25handmade_debug_interface.h: Add Name to the debug_event struct and make BEGIN_BLOCK and END_BLOCK take it
41:46handmade_debug.cpp: Change DebugParseName() to take a ProperName
41:46handmade_debug.cpp: Change DebugParseName() to take a ProperName
41:46handmade_debug.cpp: Change DebugParseName() to take a ProperName
45:34handmade_debug_interface.h: Make the TIMED_BLOCK macros take a Name
45:34handmade_debug_interface.h: Make the TIMED_BLOCK macros take a Name
45:34handmade_debug_interface.h: Make the TIMED_BLOCK macros take a Name
46:52Run the game to see what that produces
46:52Run the game to see what that produces
46:52Run the game to see what that produces
48:47Step through DebugParseName() and inspect what it does
48:47Step through DebugParseName() and inspect what it does
48:47Step through DebugParseName() and inspect what it does
50:31handmade_debug.cpp: Make GetElementFromEvent() set a Name rather than NameStartsAt
50:31handmade_debug.cpp: Make GetElementFromEvent() set a Name rather than NameStartsAt
50:31handmade_debug.cpp: Make GetElementFromEvent() set a Name rather than NameStartsAt
52:48handmade_debug.cpp: Make DEBUGInit() set the Name
52:48handmade_debug.cpp: Make DEBUGInit() set the Name
52:48handmade_debug.cpp: Make DEBUGInit() set the Name
54:04Run the game and see what we're recording
54:04Run the game and see what we're recording
54:04Run the game and see what we're recording
54:54handmade_debug_interface.h: Ensure that everyone is passing the correct information down
54:54handmade_debug_interface.h: Ensure that everyone is passing the correct information down
54:54handmade_debug_interface.h: Ensure that everyone is passing the correct information down
57:30Inspect the assembly for the debug system during the cutscene rendering
57:30Inspect the assembly for the debug system during the cutscene rendering
57:30Inspect the assembly for the debug system during the cutscene rendering
1:02:47Step through GetElementFromEvent() and StoreEvent() to see what they do
1:02:47Step through GetElementFromEvent() and StoreEvent() to see what they do
1:02:47Step through GetElementFromEvent() and StoreEvent() to see what they do
1:05:47handmade_debug.cpp: Make DEBUGEventToText() use our newly passed Name and run the game to see what it produces
1:05:47handmade_debug.cpp: Make DEBUGEventToText() use our newly passed Name and run the game to see what it produces
1:05:47handmade_debug.cpp: Make DEBUGEventToText() use our newly passed Name and run the game to see what it produces
1:07:41Determine that we've solved our problem and close the issue
1:07:41Determine that we've solved our problem and close the issue
1:07:41Determine that we've solved our problem and close the issue
1:11:22Run the game and assess our situation
1:11:22Run the game and assess our situation
1:11:22Run the game and assess our situation
1:12:48Determine to fix the camera tracking
1:12:48Determine to fix the camera tracking
1:12:48Determine to fix the camera tracking
1:15:03Step into UpdateCameraForEntityMovement() and investigate why the player is never being found by EntityOverlapsRectangle()
1:15:03Step into UpdateCameraForEntityMovement() and investigate why the player is never being found by EntityOverlapsRectangle()
1:15:03Step into UpdateCameraForEntityMovement() and investigate why the player is never being found by EntityOverlapsRectangle()
1:23:47handmade_sim_region.cpp: Make UpdateCameraForEntityMovement() test on IsInRectangle() rather than EntityOverlapsRectangle()
1:23:47handmade_sim_region.cpp: Make UpdateCameraForEntityMovement() test on IsInRectangle() rather than EntityOverlapsRectangle()
1:23:47handmade_sim_region.cpp: Make UpdateCameraForEntityMovement() test on IsInRectangle() rather than EntityOverlapsRectangle()
1:28:12Step into UpdateCameraForEntityMovement() and receive a positive result
1:28:12Step into UpdateCameraForEntityMovement() and receive a positive result
1:28:12Step into UpdateCameraForEntityMovement() and receive a positive result
1:29:46handmade_sim_region.cpp: Make UpdateCameraForEntityMovement() record the RoomDelta differently
1:29:46handmade_sim_region.cpp: Make UpdateCameraForEntityMovement() record the RoomDelta differently
1:29:46handmade_sim_region.cpp: Make UpdateCameraForEntityMovement() record the RoomDelta differently
1:32:50Run the game and find that the camera is incorrectly positioned
1:32:50Run the game and find that the camera is incorrectly positioned
1:32:50Run the game and find that the camera is incorrectly positioned
1:33:35handmade_sim_region.cpp: Make UpdateCameraForEntityMovement() correctly set the RoomRelP, run the game and find that it's having trouble snapping back
1:33:35handmade_sim_region.cpp: Make UpdateCameraForEntityMovement() correctly set the RoomRelP, run the game and find that it's having trouble snapping back
1:33:35handmade_sim_region.cpp: Make UpdateCameraForEntityMovement() correctly set the RoomRelP, run the game and find that it's having trouble snapping back
1:34:48handmade_sim_region.cpp: Change UpdateCameraForEntityMovement() to snap to the room centers
1:34:48handmade_sim_region.cpp: Change UpdateCameraForEntityMovement() to snap to the room centers
1:34:48handmade_sim_region.cpp: Change UpdateCameraForEntityMovement() to snap to the room centers
1:37:02Run the game and find that the camera snaps correctly
1:37:02Run the game and find that the camera snaps correctly
1:37:02Run the game and find that the camera snaps correctly
1:37:33handmade_sim_region.cpp: Enable UpdateCameraForEntityMovement() to interpolate between camera positions
1:37:33handmade_sim_region.cpp: Enable UpdateCameraForEntityMovement() to interpolate between camera positions
1:37:33handmade_sim_region.cpp: Enable UpdateCameraForEntityMovement() to interpolate between camera positions
1:38:29Run the game to see that it correctly interpolates between camera positions
1:38:29Run the game to see that it correctly interpolates between camera positions
1:38:29Run the game to see that it correctly interpolates between camera positions
1:38:54Consider supporting differently sized rooms
1:38:54Consider supporting differently sized rooms
1:38:54Consider supporting differently sized rooms
1:39:50handmade_world_mode.cpp: Make AddStandardRoom() take RadiusX and RadiusY in order to create variably sized rooms
1:39:50handmade_world_mode.cpp: Make AddStandardRoom() take RadiusX and RadiusY in order to create variably sized rooms
1:39:50handmade_world_mode.cpp: Make AddStandardRoom() take RadiusX and RadiusY in order to create variably sized rooms
1:48:13Run the game to see that we're creating rooms as we were doing
1:48:13Run the game to see that we're creating rooms as we were doing
1:48:13Run the game to see that we're creating rooms as we were doing
1:48:38handmade_world_mode.cpp: Enable AddStandardRoom() to align the rooms and support different radii
1:48:38handmade_world_mode.cpp: Enable AddStandardRoom() to align the rooms and support different radii
1:48:38handmade_world_mode.cpp: Enable AddStandardRoom() to align the rooms and support different radii
1:53:07Run the game to see what that does
1:53:07Run the game to see what that does
1:53:07Run the game to see what that does
1:53:36handmade_world_mode.cpp: Try changing the sizes of the rooms
1:53:36handmade_world_mode.cpp: Try changing the sizes of the rooms
1:53:36handmade_world_mode.cpp: Try changing the sizes of the rooms
1:55:08Run the game to find that we have different sized rooms
1:55:08Run the game to find that we have different sized rooms
1:55:08Run the game to find that we have different sized rooms
1:56:11handmade_world_mode.cpp: Enable AddStandardRoom() to know the sizes of abutting rooms
1:56:11handmade_world_mode.cpp: Enable AddStandardRoom() to know the sizes of abutting rooms
1:56:11handmade_world_mode.cpp: Enable AddStandardRoom() to know the sizes of abutting rooms
1:58:32Run the game to see our variably sized rooms and consider making the camera zoom to correctly frame the rooms
1:58:32Run the game to see our variably sized rooms and consider making the camera zoom to correctly frame the rooms
1:58:32Run the game to see our variably sized rooms and consider making the camera zoom to correctly frame the rooms
1:59:26Q&A
🗩
1:59:26Q&A
🗩
1:59:26Q&A
🗩
2:00:29zilarrezko Hey Casey, is anyone planning on doing a more boiled down version of Handmade Hero, to take apart the game and give a breakdown of the aspect of each system in the project?
🗪
2:00:29zilarrezko Hey Casey, is anyone planning on doing a more boiled down version of Handmade Hero, to take apart the game and give a breakdown of the aspect of each system in the project?
🗪
2:00:29zilarrezko Hey Casey, is anyone planning on doing a more boiled down version of Handmade Hero, to take apart the game and give a breakdown of the aspect of each system in the project?
🗪
2:01:13Miblo Or make the camera pan within the room?
🗪
2:01:13Miblo Or make the camera pan within the room?
🗪
2:01:13Miblo Or make the camera pan within the room?
🗪
2:01:33highergravity Long time archive viewer, but first time live streamer! I have two pre-stream questions but I can never make the pre-stream time. 1) Do you have a strong opinion about why int *p is "superior style" than int* p, or are you impartial to whatever the developer prefers?
🗪
2:01:33highergravity Long time archive viewer, but first time live streamer! I have two pre-stream questions but I can never make the pre-stream time. 1) Do you have a strong opinion about why int *p is "superior style" than int* p, or are you impartial to whatever the developer prefers?
🗪
2:01:33highergravity Long time archive viewer, but first time live streamer! I have two pre-stream questions but I can never make the pre-stream time. 1) Do you have a strong opinion about why int *p is "superior style" than int* p, or are you impartial to whatever the developer prefers?
🗪
2:02:12Demo: Pointer declaration style
2:02:12Demo: Pointer declaration style
2:02:12Demo: Pointer declaration style
2:04:40highergravity 2) Do compiler optimisations (-O2) guarantee that the same output is generated for time-independent code? That is, does the out-of-order processing ever introduce some nasty logic / contol flow bugs that -Od wouldn't?
🗪
2:04:40highergravity 2) Do compiler optimisations (-O2) guarantee that the same output is generated for time-independent code? That is, does the out-of-order processing ever introduce some nasty logic / contol flow bugs that -Od wouldn't?
🗪
2:04:40highergravity 2) Do compiler optimisations (-O2) guarantee that the same output is generated for time-independent code? That is, does the out-of-order processing ever introduce some nasty logic / contol flow bugs that -Od wouldn't?
🗪
2:08:01mtsmox You said you didn't want to use PRETTY_FUNCTION because that wouldn't work because of duplicate GUIDs. But the only place where PRETTY_FUNCTION would have been used is in TIMED_FUNCTION, which should never be used more then once in any function anyway. So not using DEBUG_NAME in TIMED_FUNCTION would solve the problem. All the other calls to TIMED_BLOCK_ would still work with DEBUG_NAME and thus use the COUNTER to be unique. So I think the extra field for the Name is really not necessary.
🗪
2:08:01mtsmox You said you didn't want to use PRETTY_FUNCTION because that wouldn't work because of duplicate GUIDs. But the only place where PRETTY_FUNCTION would have been used is in TIMED_FUNCTION, which should never be used more then once in any function anyway. So not using DEBUG_NAME in TIMED_FUNCTION would solve the problem. All the other calls to TIMED_BLOCK_ would still work with DEBUG_NAME and thus use the COUNTER to be unique. So I think the extra field for the Name is really not necessary.
🗪
2:08:01mtsmox You said you didn't want to use PRETTY_FUNCTION because that wouldn't work because of duplicate GUIDs. But the only place where PRETTY_FUNCTION would have been used is in TIMED_FUNCTION, which should never be used more then once in any function anyway. So not using DEBUG_NAME in TIMED_FUNCTION would solve the problem. All the other calls to TIMED_BLOCK_ would still work with DEBUG_NAME and thus use the COUNTER to be unique. So I think the extra field for the Name is really not necessary.
🗪
2:08:55zennmystic You talked about GCC / CLANG at the start. To be clear, you will be dropping visual studio at some point?
🗪
2:08:55zennmystic You talked about GCC / CLANG at the start. To be clear, you will be dropping visual studio at some point?
🗪
2:08:55zennmystic You talked about GCC / CLANG at the start. To be clear, you will be dropping visual studio at some point?
🗪
2:09:43linike860 What is your opinion on Minkowski Portal Refinement for collision detection and response? I feel it is much nicer as it gives you much of the collision information (normal, depth, etc.) without having to implement an entire separate algorithm like GJK does
🗪
2:09:43linike860 What is your opinion on Minkowski Portal Refinement for collision detection and response? I feel it is much nicer as it gives you much of the collision information (normal, depth, etc.) without having to implement an entire separate algorithm like GJK does
🗪
2:09:43linike860 What is your opinion on Minkowski Portal Refinement for collision detection and response? I feel it is much nicer as it gives you much of the collision information (normal, depth, etc.) without having to implement an entire separate algorithm like GJK does
🗪
2:10:26zilarrezko Have you tried -Ox for optimizations? I believe it gives even faster code (it's a fast hand for multiple optimization flags, I believe)
🗪
2:10:26zilarrezko Have you tried -Ox for optimizations? I believe it gives even faster code (it's a fast hand for multiple optimization flags, I believe)
🗪
2:10:26zilarrezko Have you tried -Ox for optimizations? I believe it gives even faster code (it's a fast hand for multiple optimization flags, I believe)
🗪
2:12:36garryjohanson I would like to cast my vote that we should do the slides some day
🗪
2:12:36garryjohanson I would like to cast my vote that we should do the slides some day
🗪
2:12:36garryjohanson I would like to cast my vote that we should do the slides some day
🗪
2:12:57tukimitzu How long do you think it will take for JAI to take over the C++ space in the game industry? It's not even out yet and I can already say that language is the best thing ever designed
🗪
2:12:57tukimitzu How long do you think it will take for JAI to take over the C++ space in the game industry? It's not even out yet and I can already say that language is the best thing ever designed
🗪
2:12:57tukimitzu How long do you think it will take for JAI to take over the C++ space in the game industry? It's not even out yet and I can already say that language is the best thing ever designed
🗪
2:14:54ray_caster Are you using SDL? If not and, assuming the answer isn't just "everything needs to be hand-made", is there another reason? What are your thoughts in general on SDL?
🗪
2:14:54ray_caster Are you using SDL? If not and, assuming the answer isn't just "everything needs to be hand-made", is there another reason? What are your thoughts in general on SDL?
🗪
2:14:54ray_caster Are you using SDL? If not and, assuming the answer isn't just "everything needs to be hand-made", is there another reason? What are your thoughts in general on SDL?
🗪
2:17:50zennmystic I guess what I was really asking was will you be dropping it?
🗪
2:17:50zennmystic I guess what I was really asking was will you be dropping it?
🗪
2:17:50zennmystic I guess what I was really asking was will you be dropping it?
🗪
2:19:02azmreece Do you have any thoughts on when to use multiple threads? Is the answer any more in depth than "when single-threaded isn't fast enough"?
🗪
2:19:02azmreece Do you have any thoughts on when to use multiple threads? Is the answer any more in depth than "when single-threaded isn't fast enough"?
🗪
2:19:02azmreece Do you have any thoughts on when to use multiple threads? Is the answer any more in depth than "when single-threaded isn't fast enough"?
🗪
2:21:26tuxiak Do you still have a TODO list like you used to? Could you show it? I'm still on Day 110 with the videos
🗪
2:21:26tuxiak Do you still have a TODO list like you used to? Could you show it? I'm still on Day 110 with the videos
🗪
2:21:26tuxiak Do you still have a TODO list like you used to? Could you show it? I'm still on Day 110 with the videos
🗪
2:21:51Wrap it up
🗩
2:21:51Wrap it up
🗩
2:21:51Wrap it up
🗩