[video member=cmuratori stream_platform=twitch stream_username=handmade_hero project=code title="Adjusting Sprite Cards to Counter Projection" vod_platform=youtube id=0h916hXePbw annotator=Miblo] [0:02][Recap and set the stage for the day] [1:07][handmade_math.h: Make PerspectiveProjection() set the near clip plane to a positive value and perform some test multiplications] [3:58][Step into PerspectiveProjection() and inspect Test0 and Test1] [6:42][Blackboard: Check our clip plane equations] [12:29][handmade_math.h: Swap the perspective and non-perspective code in PerspectiveProjection(), step into it and inspect Test0 and Test1 again] [16:42][Blackboard: Solving for d and e] [22:04][handmade_math.h: Make PerspectiveProjection() compute Test0 and Test1 using negated n and f, step into it and inspect them again] [23:37][handmade_math.h: Switch PerspectiveProjection() to use the perspective correct equation, step in and inspect the Test0 and Test1] [24:42][Blackboard: Checking the math for the perspective correct terms] [33:32][handmade_math.h: Simplify the d term for the perspective correct equation] [34:43][Blackboard: Solving for d and e in the perspective correct clip plane equations] [38:51][handmade_platform.h: Rename w to __ in the v3 union] [40:48][Step into PerspectiveProjection() and inspect Test0 and Test1] [42:06][Run the game to see that we're back in business] [43:30][handmade_render_group.cpp: Make PushBitmap() tilt upright sprites and run the game] [44:40][Reflect on our unwitting correctness] [47:27][Blackboard: Sprite Cards] [51:24][Run the game to demo the squatness of the trees] [53:41][Blackboard: Producing the sprites' depth and height using the camera's relative position] [55:18]["Watch this point"][quote 551] [59:14][Blackboard: Approaching this problem using ray intersections] [1:03:08][Blackboard: Solving for ray intersects ray] [1:09:02][Blackboard: Simplifying this down] [1:12:56][Blackboard: Handling the case when the vectors are parallel] [1:20:13][Blackboard: Determining the conditions under which this equation is unsolvable] [1:23:29][handmade_math.h: Introduce RayIntersect2()] [1:27:01][Blackboard: Producing a ta that goes with the same denominator] [1:39:43][handmade_math.h: Make RayIntersect2() compute ta and tb using the same denominator] [1:43:21][Try to solve our equations using an online tool] [1:48:07][handmade_render_group.cpp: Make PushBitmap() compute and call RayIntersect2() on the camera and card positions] [1:54:22][handmade_render_group.h: Add CameraP, CameraX, CameraY and CameraZ to the render_group struct] [1:57:56][handmade_render_group.cpp: Make SetCameraTransform() take the Camera position values] [2:01:17][Run the game to see that it is not nearly as messed up as expected] [2:02:07][Q&A][:speech] [2:03:09][@quikligames][There was a lot of chat about Wolfram expecting 1-letter variable names and interpreting rbx as r * b * x] [2:03:23][@billdstrong][Didn't we do this math when doing the screen projection?] [2:04:12][@Miblo][Do you think we needed an epilepsy warning there?] [2:04:44][@pepevel][Hello, yesterday I was asking about shaders and the z-buffer. Could I rephrase the question? It will be the last time] [2:05:00][@macielda][Maybe if you swap the order of the sum on 'tb = ...' you get an equation more similar to 'ta = ...'?] [2:05:26][handmade_math.h: Try swapping the order of the sum in RayIntersect2()] [2:06:03][@vaualbus][Can you show again the equation?] [2:07:11][@zennmystic][Is the stream weekends only now or is it temp thing?] [2:07:31][@insobot][1935 is Molly Rocket's upcoming volitional fiction game, set in the criminal underworld of New York City in the 1930s[ref site="Molly Rocket" page="Announcing 1935!" url="http://mollyrocket.com/news_0023.html"]] [2:07:37][@pepevel][As Handmade Hero is a 2D game, my idea would be to treat the z variable not as the z coordinate but as a variable that the pixel shader will use to kill hidden pixels and do alpha blending with the GPU power] [2:10:28][@macielda][Are you doing this so you can mix perspective projection and orthographic projection for game objects?] [2:11:31][@rooctag][Now we have the alpha issue with the 3D stuff, is this easier to fix than the 2D sort because you already know how to fix that?] [2:13:32][@vaualbus][This could be the solutiun at least for Matlab: \[ta = -(Pax*rby - Pay*rbx - Pbx*rby + Pby*rbx)/(rax*rby - ray*rbx), tb = -(Pax*ray - Pay*rax - Pbx*ray + Pby*rax)/(rax*rby - ray*rbx)\]] [2:17:57][handmade_render_group.cpp: Make PushBitmap() use CardRyz to set the YAxis] [2:18:24][Run the game to see that we're surprisingly good] [2:20:01][@macielda][It seems like @vaualbus' solution is negated in relation to yours] [2:23:14][handmade_render_group.cpp: Enable PushBitmap() to produce a standard sprite card and run the game to see that] [2:25:14][handmade_opengl.cpp: Temporarily make OpenGLRenderCommands() clip out all transparent pixels, and run the game] [2:27:47][Consider addressing transparency in the sort, and close it down][:speech] [/video]