[video member=cmuratori stream_platform=twitch stream_username=handmade_hero project=code title="Fading In and Out from the Windows Desktop" vod_platform=youtube id=hsKMH89VmR8 annotator=Miblo] [1:15][Recap our current situation] [1:45][Internet: SetLayeredWindowAttributes[ref site=MSDN page="SetLayeredWindowAttributes function" url=https://msdn.microsoft.com/en-us/library/windows/desktop/ms633540]] [2:56][win32_handmade.cpp: Create a fullscreen window that's transparent but black, and gradually increase its opacity] [5:01][Run the game and see the fade-out] [5:15][win32_handmade.cpp: Make the fade-out routine something that can be called incrementally] [9:24][Run the game and see that nothing happens] [9:47][win32_handmade.cpp: Defer calling ShowWindow until FadeAlpha is 1.0f] [13:58][win32_handmade.cpp: Enable the timing loop] [14:13][Run the game and see a slight flicker on the transition] [16:04][Debugger: Step into ShowWindow] [18:35][win32_handmade.cpp: Try doing ToggleFullscreen after showing it, then try and force a repaint[ref site="MSDN" page="InvalidateRect function" url="https://msdn.microsoft.com/en-us/library/windows/desktop/dd145002"]] [20:39][win32_handmade.cpp: Set WindowsAlpha = 255 and test if(IsWindowVisible)] [27:32][Debugger: Break into ShowWindow in SetFadeAlpha and see it's not getting called] [28:23][Spy++: Look at the Window Styles] [31:08][win32_handmade.cpp: Correct the FadingComplete / ShowingComplete tests][quote 341] [31:43][Run the game and see that we don't have our glitch] [32:35][win32_handmade.cpp: Introduce dFadeAlpha to fade back to the desktop] [38:15][win32_handmade.h: Introduce win32_fader_state and win32_fader] [40:37][win32_handmade.cpp: Introduce UpdateFade] [41:23][win32_handmade.cpp: Make a little finite state machine for the fades] [44:25][win32_handmade.cpp: Briefly describe the finite state machine] [45:05][win32_handmade.h: Add Win32Fade_FadingGame to win32_fader_state] [46:46][win32_handmade.cpp: Introduce InitFader, BeginFadein and BeginFadeOut] [53:37][win32_handmade.cpp: Only do BeginFadeToDesktop if Win32Fade_Inactive] [54:28][Run the game and see that we're working properly] [54:59][Q&A][:speech] [55:44][@m1el][Casey, you need one more state to wait for alpha-enabled window to show, because you might have the same bug when you fade to desktop] [57:25][@SteelGolem][Your fading setup seems overcomplicated to me. Why not just take a screenshot, blit that to the back buffer, and fade that? What platforms wouldn't that work for?] [1:00:26][@insofaras][Why are you using a second window for the fade in, instead of just fading in the main window?] [1:02:06][@Miblo][Wow, thank you for such a comprehensive A: to my Q:. That's exactly what I wanted! Another small one: Would it be possible to make bits of the window transparent, e.g. for the situation where some monstar has torn a hole in the game window, revealing the desktop beneath?] [1:03:31][@Mr4thDimention][Suppose you're Microsoft, but instead of wanting all of the money in the world you just want to make a living selling your OS. Do you think you could do that while providing a good way for users of your platform to debug the code that uses your API?] [1:05:17][@insofaras][Can you not unset the layered window flag after doing the fade?] [1:07:15][@SteelGolem][Wait, why can I Alt-PrintScreen to capture HDCP with windows but I can't take a screencap manually? I have lots of screenshots of my PS3 through the player via prntscrnt] [1:08:53][@blah238][So this detour was all about startup and shutdown fades, but how would you implement fading in between in-game scenes? This shouldn't involve the Windows API, correct?] [1:09:25][handmade_cutscene.h: Add tFadeIn to layered_scene] [1:10:35][handmade_cutscene.cpp: Implement fade to black between cutscene shots] [1:12:56][Run the game and see that fade] [1:13:27][Note that the alpha must be gamma corrected] [1:16:41][We are out of time][:speech] [/video]