Handmade Hero»Episode Guide
Adding More Editor Interactions
?
?

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:01Recap and set the stage for the day continuing with our asset editing UI
🗩
0:01Recap and set the stage for the day continuing with our asset editing UI
🗩
0:01Recap and set the stage for the day continuing with our asset editing UI
🗩
1:22Run the game to show our asset editing UI and consider positioning and styling it, and aggregate continuous interactions (e.g. drags)
🏃
1:22Run the game to show our asset editing UI and consider positioning and styling it, and aggregate continuous interactions (e.g. drags)
🏃
1:22Run the game to show our asset editing UI and consider positioning and styling it, and aggregate continuous interactions (e.g. drags)
🏃
8:00Set up to enable the undo / redo system to aggregate continuous interactions, introducing the notion of an InProgressSentinel in the in_game_editor
8:00Set up to enable the undo / redo system to aggregate continuous interactions, introducing the notion of an InProgressSentinel in the in_game_editor
8:00Set up to enable the undo / redo system to aggregate continuous interactions, introducing the notion of an InProgressSentinel in the in_game_editor
15:22Implement EditableBoolean(), with a few words on functional decomposition
15:22Implement EditableBoolean(), with a few words on functional decomposition
15:22Implement EditableBoolean(), with a few words on functional decomposition
19:32Run the game to see that our boolean button doesn't toggle
🏃
19:32Run the game to see that our boolean button doesn't toggle
🏃
19:32Run the game to see that our boolean button doesn't toggle
🏃
19:36Augment dev_ui_layout with EditOccurred and dev_ui_edit_block with PrevEditOccurred, for EndEditBlock() and BeginEndBlock() to set
19:36Augment dev_ui_layout with EditOccurred and dev_ui_edit_block with PrevEditOccurred, for EndEditBlock() and BeginEndBlock() to set
19:36Augment dev_ui_layout with EditOccurred and dev_ui_edit_block with PrevEditOccurred, for EndEditBlock() and BeginEndBlock() to set
23:30Run the game to find that our boolean button toggles
🏃
23:30Run the game to find that our boolean button toggles
🏃
23:30Run the game to find that our boolean button toggles
🏃
24:22Implement EditableType(), introducing a version of Button() that takes an additional Classifier
24:22Implement EditableType(), introducing a version of Button() that takes an additional Classifier
24:22Implement EditableType(), introducing a version of Button() that takes an additional Classifier
30:09Run the game to see our editable type button
🏃
30:09Run the game to see our editable type button
🏃
30:09Run the game to see our editable type button
🏃
30:36Make EditableType() print out the value
30:36Make EditableType() print out the value
30:36Make EditableType() print out the value
31:32Run the game to find that our editable type button does not cycle through the types
🏃
31:32Run the game to find that our editable type button does not cycle through the types
🏃
31:32Run the game to find that our editable type button does not cycle through the types
🏃
32:17Enable AssetEditor() to wrap the values of the editable type button
32:17Enable AssetEditor() to wrap the values of the editable type button
32:17Enable AssetEditor() to wrap the values of the editable type button
36:15Break in to EditableType() and watch what happens upon clicking the button
🏃
36:15Break in to EditableType() and watch what happens upon clicking the button
🏃
36:15Break in to EditableType() and watch what happens upon clicking the button
🏃
37:04Fix EditableType() to correctly increment and decrement the Value
37:04Fix EditableType() to correctly increment and decrement the Value
37:04Fix EditableType() to correctly increment and decrement the Value
37:51Run the game to find that that doesn't fix our problem
🏃
37:51Run the game to find that that doesn't fix our problem
🏃
37:51Run the game to find that that doesn't fix our problem
🏃
39:01Change ToExecute and NextToExecute in dev_ui to be of the type dev_ui_interaction, and propagate this change
39:01Change ToExecute and NextToExecute in dev_ui to be of the type dev_ui_interaction, and propagate this change
39:01Change ToExecute and NextToExecute in dev_ui to be of the type dev_ui_interaction, and propagate this change
40:25Run the game to find that our EditableType button works fine
🏃
40:25Run the game to find that our EditableType button works fine
🏃
40:25Run the game to find that our EditableType button works fine
🏃
41:27Enable EditableSize() and EditablePxy() to print out the Value
41:27Enable EditableSize() and EditablePxy() to print out the Value
41:27Enable EditableSize() and EditablePxy() to print out the Value
43:13Check out the Size and Percent values in our UI
🏃
43:13Check out the Size and Percent values in our UI
🏃
43:13Check out the Size and Percent values in our UI
🏃
43:28Enable EditableSize to draw a special widget with BasicTextElement()
43:28Enable EditableSize to draw a special widget with BasicTextElement()
43:28Enable EditableSize to draw a special widget with BasicTextElement()
45:43Check out the Size button widget in our UI
🏃
45:43Check out the Size button widget in our UI
🏃
45:43Check out the Size button widget in our UI
🏃
45:53Give the Size widget some border
45:53Give the Size widget some border
45:53Give the Size widget some border
46:40Check out the bordered Size widget in our UI
🏃
46:40Check out the bordered Size widget in our UI
🏃
46:40Check out the bordered Size widget in our UI
🏃
47:11Enable EditablePxy() to draw a widget like the Size button, and this function and EditableSize() to handle draggable interactions
47:11Enable EditablePxy() to draw a widget like the Size button, and this function and EditableSize() to handle draggable interactions
47:11Enable EditablePxy() to draw a widget like the Size button, and this function and EditableSize() to handle draggable interactions
56:26Try dragging our Percent widget, without success
🏃
56:26Try dragging our Percent widget, without success
🏃
56:26Try dragging our Percent widget, without success
🏃
56:59Peruse the code for the possible cause of our dragging bug
📖
56:59Peruse the code for the possible cause of our dragging bug
📖
56:59Peruse the code for the possible cause of our dragging bug
📖
58:59Step in to EditablePxy() to see what's happening
🏃
58:59Step in to EditablePxy() to see what's happening
🏃
58:59Step in to EditablePxy() to see what's happening
🏃
59:35Make EditableBoolean(), EditableType(), EditableSize(), EditablePxy() to all set EditOccured to true
59:35Make EditableBoolean(), EditableType(), EditableSize(), EditablePxy() to all set EditOccured to true
59:35Make EditableBoolean(), EditableType(), EditableSize(), EditablePxy() to all set EditOccured to true
1:00:18Try dragging our Percent and Size widgets, successfully
🏃
1:00:18Try dragging our Percent and Size widgets, successfully
🏃
1:00:18Try dragging our Percent and Size widgets, successfully
🏃
1:01:16Make EditablePxy() clamp the values to the passed in Min and Max
1:01:16Make EditablePxy() clamp the values to the passed in Min and Max
1:01:16Make EditablePxy() clamp the values to the passed in Min and Max
1:02:04Try out our clamped Percent widget, and demonstrate the need for edit aggregation
🏃
1:02:04Try out our clamped Percent widget, and demonstrate the need for edit aggregation
🏃
1:02:04Try out our clamped Percent widget, and demonstrate the need for edit aggregation
🏃
1:03:44Introduce GetOrCreateEditInProgress() to aggregate edits, replacing AllocateEditorEdit()
1:03:44Introduce GetOrCreateEditInProgress() to aggregate edits, replacing AllocateEditorEdit()
1:03:44Introduce GetOrCreateEditInProgress() to aggregate edits, replacing AllocateEditorEdit()
1:15:23Enable EditorInteract() to handle the notion of EndInteraction
1:15:23Enable EditorInteract() to handle the notion of EndInteraction
1:15:23Enable EditorInteract() to handle the notion of EndInteraction
1:20:13Run the game and crash in EditorInteract()
🏃
1:20:13Run the game and crash in EditorInteract()
🏃
1:20:13Run the game and crash in EditorInteract()
🏃
1:20:26Fix InitializeEditor() to initialise the InProgresSentinel
1:20:26Fix InitializeEditor() to initialise the InProgresSentinel
1:20:26Fix InitializeEditor() to initialise the InProgresSentinel
1:21:02Try out our aggregated undo, and consider prettying it up
🏃
1:21:02Try out our aggregated undo, and consider prettying it up
🏃
1:21:02Try out our aggregated undo, and consider prettying it up
🏃
1:22:31Consider how to handle coexistence of the debug and developer UI
1:22:31Consider how to handle coexistence of the debug and developer UI
1:22:31Consider how to handle coexistence of the debug and developer UI
1:24:06Investigate the font baseline issue
1:24:06Investigate the font baseline issue
1:24:06Investigate the font baseline issue
1:27:10Change TextOp() to factor in the AscenderHeight to the glyph's offset
1:27:10Change TextOp() to factor in the AscenderHeight to the glyph's offset
1:27:10Change TextOp() to factor in the AscenderHeight to the glyph's offset
1:31:48Check out the font drawing in our UI
🏃
1:31:48Check out the font drawing in our UI
🏃
1:31:48Check out the font drawing in our UI
🏃
1:32:11Refresh our memories on our font encoding
📖
1:32:11Refresh our memories on our font encoding
📖
1:32:11Refresh our memories on our font encoding
📖
1:36:46Check out testfonts_v2.hha in TabView
🗹
1:36:46Check out testfonts_v2.hha in TabView
🗹
1:36:46Check out testfonts_v2.hha in TabView
🗹
1:40:05The mathematics of the font alignment percentage
🖌
1:40:05The mathematics of the font alignment percentage
🖌
1:40:05The mathematics of the font alignment percentage
🖌
1:48:42Make SetAlignPoint() and GetPPercent() clamp alignment percentages to the range -2 to 2
1:48:42Make SetAlignPoint() and GetPPercent() clamp alignment percentages to the range -2 to 2
1:48:42Make SetAlignPoint() and GetPPercent() clamp alignment percentages to the range -2 to 2
1:50:34Run the game and get nutso stuff on the font alignment
🏃
1:50:34Run the game and get nutso stuff on the font alignment
🏃
1:50:34Run the game and get nutso stuff on the font alignment
🏃
1:50:42Regenerate our .hha files to get our newly aligned fonts
🗹
1:50:42Regenerate our .hha files to get our newly aligned fonts
🗹
1:50:42Regenerate our .hha files to get our newly aligned fonts
🗹
1:52:17Run the game to find that our font baselines are now correct
🏃
1:52:17Run the game to find that our font baselines are now correct
🏃
1:52:17Run the game to find that our font baselines are now correct
🏃
1:53:08Q&A
🗩
1:53:08Q&A
🗩
1:53:08Q&A
🗩
1:53:38jojomunki Q: What does ## mean? I looked it up but I don't think I understand what its use is. Is it supposed to link different variables into one variable?
🗪
1:53:38jojomunki Q: What does ## mean? I looked it up but I don't think I understand what its use is. Is it supposed to link different variables into one variable?
🗪
1:53:38jojomunki Q: What does ## mean? I looked it up but I don't think I understand what its use is. Is it supposed to link different variables into one variable?
🗪
1:57:36skinpop Q: I've been trying to implement the walk system from your recent talk.1 In the talk you make the point that "shrinking" the walk edge is trivial. I've made it that far in my own code but I haven't been able to figure how to do the shrinking without testing all edges against all segments of the walk edge. That approach doesn't scale well. So I was wondering if you could say a few words about how you did it - assuming you had another approach. I am using a half-edge structure for the manifold
🗪
1:57:36skinpop Q: I've been trying to implement the walk system from your recent talk.1 In the talk you make the point that "shrinking" the walk edge is trivial. I've made it that far in my own code but I haven't been able to figure how to do the shrinking without testing all edges against all segments of the walk edge. That approach doesn't scale well. So I was wondering if you could say a few words about how you did it - assuming you had another approach. I am using a half-edge structure for the manifold
🗪
1:57:36skinpop Q: I've been trying to implement the walk system from your recent talk.1 In the talk you make the point that "shrinking" the walk edge is trivial. I've made it that far in my own code but I haven't been able to figure how to do the shrinking without testing all edges against all segments of the walk edge. That approach doesn't scale well. So I was wondering if you could say a few words about how you did it - assuming you had another approach. I am using a half-edge structure for the manifold
🗪
1:58:54Efficiently shrinking the walk edge as per the walk system from The Witness
🖌
1:58:54Efficiently shrinking the walk edge as per the walk system from The Witness
🖌
1:58:54Efficiently shrinking the walk edge as per the walk system from The Witness
🖌
2:01:07centhusiast Q: Do you know how to rotate a font? Do you use stb_truetype.h2 for font rendering?
🗪
2:01:07centhusiast Q: Do you know how to rotate a font? Do you use stb_truetype.h2 for font rendering?
🗪
2:01:07centhusiast Q: Do you know how to rotate a font? Do you use stb_truetype.h2 for font rendering?
🗪
2:05:37Wrap it up
🗩
2:05:37Wrap it up
🗩
2:05:37Wrap it up
🗩