[video output=day437 member=cmuratori stream_platform=twitch stream_username=handmade_hero project=code title="Switching to Precomputed Hemisphere Distributions" vod_platform=youtube id=ZS54TWa-ILA annotator=Miblo]
[0:06][@combicombi][Q: Casey, was just watching the previous stream about getting better noise sampling, and I was wondering why you need any randomness if you obtain a pretty evenly and well-covered sampling hemisphere?][:prng :statistics]
[0:49][Undersampling, and moving noise to the least objectionable place][:blackboard :prng :statistics]
[10:59][:Run the game to see how our :lighting is working at the moment][:rendering]
[14:20][Add SamplePoints to the lighting_solution and loft our hemisphere generation code out to GenerateSpiralSamples() and GeneratePoissonSamples()][:lighting :rendering :statistics]
[21:19][:Run the game to see our spiral sample][:lighting :rendering :statistics]
[21:33][Add keybindings for GeneratePoissonSamples() and GenerateSpiralSamples() in UpdateAndRenderWorld(), and reduce the MaxCos value in GeneratePoissonSamples()][:"input handling"]
[24:24][:Run the game and check out our two sampling patterns][:statistics]
[25:23][Make LightingTest() draw connections between clusters of sampling points][:"debug visualisation" :lighting :statistics :rendering]
[27:52][:Run the game to see our cluster of sampling points, and consider other sampling patterns[ref
    author="À. Méndez-feliu and M. Sbert"
    title="Comparing hemisphere sampling techniques for obscurance computation"
    url=http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.468.4690][ref
        author="Holger Dammertz"
        title="Hammersley Points on the Hemisphere"
        url=http://holger.dammertz.org/stuff/notes_HammersleyOnHemisphere.html][ref
            author="Tien-Tsin Wong and Wai-Shing Luk and Pheng-Ann Heng"
            title="Sampling with Hammersley and Halton Points"
            url=http://www.cse.cuhk.edu.hk/~ttwong/papers/udpoint/udpoint.pdf][ref
                site=Wikipedia
                page="Halton sequence"
                url=https://en.wikipedia.org/wiki/Halton_sequence]][:"debug visualisation" :lighting :statistics :rendering]
[36:41][:Run the game and consider gleaning more structure from the spiral sampling over time][:lighting :statistics :rendering]
[37:37][Make LightingTest() colour the sampling points over time][:"debug visualisation" :lighting :statistics :rendering]
[39:49][:Run the game to see our coloured sampling points][:"debug visualisation" :lighting :statistics :rendering]
[43:51][Vary the N2 value in GenerateSpiralSamples() to sample variable coverage of the sphere][:"debug visualisation" :lighting :statistics :rendering]
[45:42][:Run the game to see this variable coverage][:"debug visualisation" :lighting :statistics :rendering]
[46:15][Make GenerateSpiralSamples() offset the coverage rotationally (i.e. spin the spirals)][:"debug visualisation" :lighting :statistics :rendering]
[47:40][:Run the game to see this spin][:"debug visualisation" :lighting :statistics :rendering]
[47:49][Combine these coverage schemes in GenerateSpiralSamples()][:"debug visualisation" :lighting :statistics :rendering]
[48:00][:Run the game to see the variable coverage, and consider how to generate points in clusters][:"debug visualisation" :lighting :statistics :rendering]
[50:33][Introduce the notion of a ClusterTable in LightingTest() to generate clusters of points][:"debug visualisation" :lighting :statistics :rendering]
[55:37][Check out our first cluster][:"debug visualisation" :lighting :statistics :rendering :run]
[56:47][Start to build up our ClusterTable in LightingTest(), also visualising the clusters as lines relative to the entire set][:"debug visualisation" :lighting :statistics :rendering]
[59:39][:Run the game to see our clusters][:"debug visualisation" :lighting :statistics :rendering :run]
[1:00:18][Continue to build up our ClusterTable][:"debug visualisation" :lighting :statistics :rendering]
[1:01:10][Check out this new cluster and consider how best to tessellate our clusters][:"debug visualisation" :lighting :statistics :rendering :run]
[1:04:04][Introduce GeneratePolarSamples()][:lighting :rendering :statistics]
[1:07:47][Polar sampling, derived from the height up the sphere][:blackboard :statistics]
[1:09:29][Continue to implement GeneratePolarSamples(), adding a key to trigger this pattern][:"input handling" :lighting :rendering :statistics]
[1:11:50][Check out this polar pattern, and consider making the spoke count proportional to the slice][:"debug visualisation" :lighting :rendering :statistics :run]
[1:13:18][Introduce a SpokeTable in GeneratePolarSamples() to distribute the samples around the sphere][:lighting :rendering :statistics]
[1:18:29][Check out this polar pattern][:"debug visualisation" :lighting :rendering :statistics :run]
[1:18:41][Bias the z away from directly up and reduce the SliceCount in GeneratePolarSamples()][:lighting :rendering :statistics]
[1:21:03][Check out our awesome polar pattern, and consider how to line the samples up for casting purposes][:"debug visualisation" :lighting :rendering :statistics :run]
[1:23:09][Reduce the SliceCount to 5 and introduce vertical jitter in GeneratePolarSamples()][:lighting :rendering :statistics]
[1:26:13][Check out the polar jitter, and consider how to cluster our sampling points in terms of the jitter][:"debug visualisation" :lighting :rendering :statistics :run]
[1:31:59][Store SamplePoints as a matrix of v3_4x in lighting_solution, and enable InitLighting() to cluster up the samples][:lighting :rendering :statistics]
[1:41:06][Check out our slightly broken :lighting][:rendering :run]
[1:41:22][Enable ComputeLightPropagation() to reorient the SampleD4x along the sample point normal][:lighting :rendering :statistics]
[1:43:50][Check out this potentially more correct :lighting][:rendering :run]
[1:46:06][Q&A][:speech]
[1:47:04][@ssylvan][@handmade_hero By the way, I mentioned this on twitter but the easiest way to compute a cosine distribution is to start with a 2D disk distribution for x / y then compute z by projecting to sphere (z = sqrt(1 - x^2 - y^2))][:statistics]
[1:48:12][@thejimjames40][Q: Do you have some resources for researching different game / system architectures in C? I'd like to focus on the data layout[ref
    author="Jason Gregory"
    title="Game Engine Architecture"
    url=http://gameenginebook.com/]]
[1:51:33][@blackburn1911][Q: What should I / we do everyday to become a good programmer like you, [@jon Jon Blow], etc?]
[1:53:42][@elfeck][Q: Do you use templates in the code right now?]
[1:53:58][@bas170400][Q: Hi, I am programming my first game (2D) as an intake assignment from my next education. The game uses an EntityComponentSystem. But now I'm stuck because I want different entities to have different animations for different situations but I don't know how to implement that. So my question is how do I go about that without writing different sprite components for every different entity type? All sorts of information is welcome][:"entity system"]
[2:00:16][@vkar2][Q: I played with the spiral, and had problems with the angular falloff][:statistics]
[2:00:43][@30ygamer][Q: First timer here. From what I saw it looks like organizational-wise a lot of things are bundled together in your code. How do you handle organizing a lot of code in general? Is it a C / C++ thing to have so many things together? I'm just kinda used to having small pieces of code]
[2:02:38][@gorevojd][Q: [@cmuratori Casey], I just want to say you thank you for everything. I started to watch you in 2014, when I graduated from university. You taught me more than all of my teachers there. I love game development and I love programming all because of you. Just thank you]
[2:03:09][@esert][Q: Did you find an answer to your questions in 'Are Register Names Still Useful?'?[ref
    site="Casey Muratori's home page"
    page="Are Register Names Still Useful?"
    url=https://caseymuratori.com/blog_0028]]
[2:05:39][@phort99][Q: You mentioned not using templates. Do you use any code generation / :metaprogramming at all?]
[2:06:09][@thejimjames40][Q: Every time I am designing the data layout of a game / system I get very happy inside. Is this normal? Or should I see a psychiatrist? Also I absolutely love the sections about the :"entity system" and :"game design" decisions]
[2:06:30][@sneakybob_wot][Q: How much more optimized do you think you'll be able to get this :lighting code once you've sorted out this bundling?][:optimisation :rendering]
[2:06:47][@bozemoto][Q: I'm a programmer with three years' experience, what would you recommend for someone with my experience level to do to improve as a developer. I've been trying to learn new things outside of work, while avoiding breaking the non-compete part of my contract]
[2:07:42][@pythno][Q: Do you still use your Amiga?]
[2:08:23][Close things down][:speech]
[/video]
