hero/code and chat013: Miscellaneous fixes
This commit is contained in:
parent
6ea1be4b70
commit
eb4548b401
|
@ -1,14 +1,14 @@
|
||||||
[video output=day038 member=cmuratori stream_platform=twitch stream_username=handmade_hero project=code title="Basic Linear Bitmap Blending" vod_platform=youtube id=ydiHNs1YQoI annotator=schme annotator=effect0r annotator=theinternetftw]
|
[video output=day038 member=cmuratori stream_platform=twitch stream_username=handmade_hero project=code title="Basic Linear Bitmap Blending" vod_platform=youtube id=ydiHNs1YQoI annotator=schme annotator=effect0r annotator=theinternetftw]
|
||||||
[0:00:00][Prestream stuff]
|
[0:00:00][Prestream stuff]
|
||||||
[0:09:18][Intro and welcome]
|
[0:09:18][Intro and welcome]
|
||||||
[0:10:52][Where we left of from last time]
|
[0:10:52][Where we left off from last time]
|
||||||
[0:11:17][Fixing the hero's color]
|
[0:11:17][Fixing the hero's color]
|
||||||
[0:16:16][Figuring out what the shift values are]
|
[0:16:16][Figuring out what the shift values are]
|
||||||
[0:18:48][Bitscanforward]
|
[0:18:48][Bitscanforward]
|
||||||
[0:27:53][Renaming bitscanforward to FindLeastSignificantSetBit]
|
[0:27:53][Renaming bitscanforward to FindLeastSignificantSetBit]
|
||||||
[0:29:36][The intrinsics thing]
|
[0:29:36][The intrinsics thing]
|
||||||
[0:30:16][Finding out what compiler we're on]
|
[0:30:16][Finding out what compiler we're on]
|
||||||
[0:31:27][Making a comprimise: Allowing the intrinsics file access to the platform layer]
|
[0:31:27][Making a compromise: Allowing the intrinsics file access to the platform layer]
|
||||||
[0:33:20][Determining what compiler is being used]
|
[0:33:20][Determining what compiler is being used]
|
||||||
[0:41:20][Simple version of using the alpha channel]
|
[0:41:20][Simple version of using the alpha channel]
|
||||||
[0:45:20][Alpha as an opacity value]
|
[0:45:20][Alpha as an opacity value]
|
||||||
|
@ -17,7 +17,7 @@
|
||||||
[0:50:04][Krita crashes..]
|
[0:50:04][Krita crashes..]
|
||||||
[0:50:47][Blackboard session explaining alpha blending using the background value]
|
[0:50:47][Blackboard session explaining alpha blending using the background value]
|
||||||
[0:51:01]['Deriving' the formula for a linear blend]
|
[0:51:01]['Deriving' the formula for a linear blend]
|
||||||
[0:58:02][The cannonical form of a linear blend]
|
[0:58:02][The canonical form of a linear blend]
|
||||||
[0:58:45][How the 't' works in the linear blend formula]
|
[0:58:45][How the 't' works in the linear blend formula]
|
||||||
[1:00:35][Implementing the floating point version of linear blend]
|
[1:00:35][Implementing the floating point version of linear blend]
|
||||||
[1:06:55][Drawing the herohead at the location of the player]
|
[1:06:55][Drawing the herohead at the location of the player]
|
||||||
|
@ -38,5 +38,5 @@
|
||||||
[1:34:36][Is the large VirtualAlloc() at the beginning similar to Linux mmap()?]
|
[1:34:36][Is the large VirtualAlloc() at the beginning similar to Linux mmap()?]
|
||||||
[1:35:51][What bitvalue is 50% brightness?]
|
[1:35:51][What bitvalue is 50% brightness?]
|
||||||
[1:37:34][Does the display bitmap operation actually do anything with the alpha channel?]
|
[1:37:34][Does the display bitmap operation actually do anything with the alpha channel?]
|
||||||
[1:37:58][The solid curve on Wikipedias gamma correction is the linear space intensity. Should be what you're looking for.]
|
[1:37:58][The solid curve on Wikipedia's gamma correction is the linear space intensity. Should be what you're looking for.]
|
||||||
[/video]
|
[/video]
|
||||||
|
|
|
@ -9,7 +9,7 @@
|
||||||
[0:16:20][Tackeling SetCursor]
|
[0:16:20][Tackeling SetCursor]
|
||||||
[0:17:45][Spy++]
|
[0:17:45][Spy++]
|
||||||
[0:21:45][LoadCursor()]
|
[0:21:45][LoadCursor()]
|
||||||
[0:25:50][Setting up dynamically controled cursor visability]
|
[0:25:50][Setting up dynamically controlled cursor visibility]
|
||||||
[0:34:12][Trying to figure out how to stop the 'loading' cursor]
|
[0:34:12][Trying to figure out how to stop the 'loading' cursor]
|
||||||
[0:37:53][Fullscreen support[ref
|
[0:37:53][Fullscreen support[ref
|
||||||
site="The Old New Thing"
|
site="The Old New Thing"
|
||||||
|
@ -17,7 +17,7 @@
|
||||||
url="http://blogs.msdn.com/b/oldnewthing/archive/2010/04/12/9994016.aspx"]]
|
url="http://blogs.msdn.com/b/oldnewthing/archive/2010/04/12/9994016.aspx"]]
|
||||||
[0:51:09][Discussion on his method of going fullscreen in Windows]
|
[0:51:09][Discussion on his method of going fullscreen in Windows]
|
||||||
[0:54:45][Going over the notes]
|
[0:54:45][Going over the notes]
|
||||||
[0:55:30]['Hackey' way to fill the entire screen with the game]
|
[0:55:30]['Hacky' way to fill the entire screen with the game]
|
||||||
[0:58:50][Q&A][:speech]
|
[0:58:50][Q&A][:speech]
|
||||||
[0:59:57][You said you want your artist to leave an alpha apron around your bitmaps. Why is that?]
|
[0:59:57][You said you want your artist to leave an alpha apron around your bitmaps. Why is that?]
|
||||||
[1:02:15][Sour trolli worms or Haribo gummy bears?]
|
[1:02:15][Sour trolli worms or Haribo gummy bears?]
|
||||||
|
|
|
@ -31,13 +31,13 @@
|
||||||
[1:11:27][Will there be a minimum distance to the wall?]
|
[1:11:27][Will there be a minimum distance to the wall?]
|
||||||
[1:12:03][Will computing a vector where the player will stop just before the wall solve the sticking?]
|
[1:12:03][Will computing a vector where the player will stop just before the wall solve the sticking?]
|
||||||
[1:13:13][Additional explanation to the bounce vector calculation]
|
[1:13:13][Additional explanation to the bounce vector calculation]
|
||||||
[1:19:25][Is there a way to speed up the DrawBitmap -code?]
|
[1:19:25][Is there a way to speed up the DrawBitmap code?]
|
||||||
[1:21:15][Suggestion to remove reblitting the background to improve performance]
|
[1:21:15][Suggestion to remove reblitting the background to improve performance]
|
||||||
[1:22:08][Stream notes Casey drew the cos/sin triangle wrong]
|
[1:22:08][Stream notes Casey drew the cos/sin triangle wrong]
|
||||||
[1:23:39][A wish to mention formal keywords to help people look things up]
|
[1:23:39][A wish to mention formal keywords to help people look things up]
|
||||||
[1:24:53][Was the Witness collision trick to try maintain the distance traveled?]
|
[1:24:53][Was the Witness collision trick to try maintain the distance traveled?]
|
||||||
[1:25:21][Why does wall bouncing not seem to cause sticking, but sliding does?]
|
[1:25:21][Why does wall bouncing not seem to cause sticking, but sliding does?]
|
||||||
[1:27:06][Stream mentions KhanAchademy for learning math]
|
[1:27:06][Stream mentions KhanAcademy for learning math]
|
||||||
[1:27:20][Will the rendering code be able to squash bitmaps?]
|
[1:27:20][Will the rendering code be able to squash bitmaps?]
|
||||||
[1:28:01][Could you/would you benefit from unrolling the collision loop ... ?]
|
[1:28:01][Could you/would you benefit from unrolling the collision loop ... ?]
|
||||||
[/video]
|
[/video]
|
||||||
|
|
|
@ -2,10 +2,10 @@
|
||||||
[0:00:00][Intro and welcome]
|
[0:00:00][Intro and welcome]
|
||||||
[0:01:25][Where we were..]
|
[0:01:25][Where we were..]
|
||||||
[0:01:50][Addressing a bug that was found by the forums]
|
[0:01:50][Addressing a bug that was found by the forums]
|
||||||
[0:04:30][Thinking about how to handle imput]
|
[0:04:30][Thinking about how to handle input]
|
||||||
[0:06:24][Which controller maps to which character?]
|
[0:06:24][Which controller maps to which character?]
|
||||||
[0:09:04][How we're going to handle this problem]
|
[0:09:04][How we're going to handle this problem]
|
||||||
[0:10:36][Maping a controller to a character]
|
[0:10:36][Mapping a controller to a character]
|
||||||
[0:11:36][Pulling player info into the 'entity' structure to support multiple players]
|
[0:11:36][Pulling player info into the 'entity' structure to support multiple players]
|
||||||
[0:12:50][Modifying game_input to allow for multiple players]
|
[0:12:50][Modifying game_input to allow for multiple players]
|
||||||
[0:14:31][Changing his mind about how to handle this]
|
[0:14:31][Changing his mind about how to handle this]
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
[0:00:25][Owl of Shame: Single producer/Multiple consumer issue]
|
[0:00:25][Owl of Shame: Single producer/Multiple consumer issue]
|
||||||
[0:03:33][InterlockedCompareExchange]
|
[0:03:33][InterlockedCompareExchange]
|
||||||
[0:04:20][Fixing our shame]
|
[0:04:20][Fixing our shame]
|
||||||
[0:06:19][Siumplifying more with the API change]
|
[0:06:19][Simplifying more with the API change]
|
||||||
[0:09:00][Implementing the multithreading API]
|
[0:09:00][Implementing the multithreading API]
|
||||||
[0:12:42][Piping the work queue through]
|
[0:12:42][Piping the work queue through]
|
||||||
[0:14:33][Global defines for AddEntry and CompleteAllWork]
|
[0:14:33][Global defines for AddEntry and CompleteAllWork]
|
||||||
|
@ -35,7 +35,7 @@
|
||||||
[1:16:10][@pragmascrypt][Is the WeShouldSleep still right after you changed the if condition?]
|
[1:16:10][@pragmascrypt][Is the WeShouldSleep still right after you changed the if condition?]
|
||||||
[1:17:55][@manicthenobody][Why do you use #if 0 instead of // or /*?]
|
[1:17:55][@manicthenobody][Why do you use #if 0 instead of // or /*?]
|
||||||
[1:19:09][@nightbasilisk][Can you show 4k?]
|
[1:19:09][@nightbasilisk][Can you show 4k?]
|
||||||
[1:19:47][gasto5 Q: Is multithreaded code less reliable than singlethreaded code?]
|
[1:19:47][@gasto5][Q: Is multithreaded code less reliable than singlethreaded code?]
|
||||||
[1:20:37][@noxy_key][So is the circular buffer recycling threads after they're done processing a tile? I wasn't clear on why a circular buffer was chosen.]
|
[1:20:37][@noxy_key][So is the circular buffer recycling threads after they're done processing a tile? I wasn't clear on why a circular buffer was chosen.]
|
||||||
[1:20:56][Power cord bumped, computer shut down]
|
[1:20:56][Power cord bumped, computer shut down]
|
||||||
[1:24:20][@noxy_key][(once more) So is the circular buffer recycling threads after they're done processing a tile? I wasn't clear on why a circular buffer was chosen.]
|
[1:24:20][@noxy_key][(once more) So is the circular buffer recycling threads after they're done processing a tile? I wasn't clear on why a circular buffer was chosen.]
|
||||||
|
|
|
@ -22,7 +22,7 @@
|
||||||
[56:11]["We won't add up to 100%"][quote 469]
|
[56:11]["We won't add up to 100%"][quote 469]
|
||||||
[58:00][Q&A][:speech]
|
[58:00][Q&A][:speech]
|
||||||
[59:22][@gunngames][Can I avoid taxation by reinvesting into capital gains?]
|
[59:22][@gunngames][Can I avoid taxation by reinvesting into capital gains?]
|
||||||
[59:44][@dudeinbasement1][Why won't we add to ~100%?]
|
[59:44][@dudeinbasement1][Why won't we add to \~100%?]
|
||||||
[1:00:42][@sssmcgrath][How would you self-update an exe? Right now I have a second exe that copies a file that overwrites the current exe. So main exe calls updateme.exe, closes itself, updateme sleeps for 1/2 second, then copies... There's gotta be something smarter]
|
[1:00:42][@sssmcgrath][How would you self-update an exe? Right now I have a second exe that copies a file that overwrites the current exe. So main exe calls updateme.exe, closes itself, updateme sleeps for 1/2 second, then copies... There's gotta be something smarter]
|
||||||
[1:01:27][@zamar037][Can the percentage support a decimal place?]
|
[1:01:27][@zamar037][Can the percentage support a decimal place?]
|
||||||
[1:01:46][handmade_debug.cpp: Print the percentage as a float]
|
[1:01:46][handmade_debug.cpp: Print the percentage as a float]
|
||||||
|
|
|
@ -46,7 +46,7 @@
|
||||||
[1:52:02][Build and run in -Od and investigate what's happening]
|
[1:52:02][Build and run in -Od and investigate what's happening]
|
||||||
[1:54:18][handmade_sim_region.cpp: Add an assert in AddEntityToHash() to validate the hash, run the game and do not hit that assertion]
|
[1:54:18][handmade_sim_region.cpp: Add an assert in AddEntityToHash() to validate the hash, run the game and do not hit that assertion]
|
||||||
[1:55:07][Step through AddEntityToHash() and investigate what's happening]
|
[1:55:07][Step through AddEntityToHash() and investigate what's happening]
|
||||||
[1:56:30][handmade_sim_region.cpp: Add an assert in GetOrAddBrain() to validate the brain, run the game and ]
|
[1:56:30][handmade_sim_region.cpp: Walk through GetOrAddBrain()]
|
||||||
[1:57:38][handmade_sim_region.cpp: Make GetOrAddBrain() set the Hash->ID, run the game and crash in FreeFrame()]
|
[1:57:38][handmade_sim_region.cpp: Make GetOrAddBrain() set the Hash->ID, run the game and crash in FreeFrame()]
|
||||||
[1:58:31][handmade_sim_region.h: Remove the ID from the entity_hash and brain_hash and instead use their Ptr to identify them]
|
[1:58:31][handmade_sim_region.h: Remove the ID from the entity_hash and brain_hash and instead use their Ptr to identify them]
|
||||||
[1:59:36][Run the game and note that "our brains are still not working properly"][quote 535]
|
[1:59:36][Run the game and note that "our brains are still not working properly"][quote 535]
|
||||||
|
|
|
@ -72,7 +72,7 @@
|
||||||
page="glcorearb.h"
|
page="glcorearb.h"
|
||||||
url="https://www.khronos.org/registry/OpenGL/api/GL/glcorearb.h"]]
|
url="https://www.khronos.org/registry/OpenGL/api/GL/glcorearb.h"]]
|
||||||
[1:32:47][Compile and run to see our crazy w coordinate]
|
[1:32:47][Compile and run to see our crazy w coordinate]
|
||||||
[1:33:56][Introduce handmade_opengl.h ]
|
[1:33:56][Create handmade_opengl.h]
|
||||||
[1:36:18][handmade_opengl.cpp: Make OpenGLInit() call OpenGLCreateProgram(), and write here docs for Header, Vertex and Fragment code]
|
[1:36:18][handmade_opengl.cpp: Make OpenGLInit() call OpenGLCreateProgram(), and write here docs for Header, Vertex and Fragment code]
|
||||||
[1:41:57][Run the game to find that we got through the compilation phase okay, and determine to enable OpenGLCreateProgram() to perform error handling]
|
[1:41:57][Run the game to find that we got through the compilation phase okay, and determine to enable OpenGLCreateProgram() to perform error handling]
|
||||||
[1:44:21][handmade_opengl.cpp: Enable OpenGLCreateProgram() to log shader info and assert on validation failure[ref
|
[1:44:21][handmade_opengl.cpp: Enable OpenGLCreateProgram() to log shader info and assert on validation failure[ref
|
||||||
|
|
|
@ -67,7 +67,7 @@
|
||||||
[1:36:43][Run the game and watch the incorrect clipping behaviour]
|
[1:36:43][Run the game and watch the incorrect clipping behaviour]
|
||||||
[1:37:42][handmade_math.h: Tweak the near and far clip plane in PerspectiveProjection()]
|
[1:37:42][handmade_math.h: Tweak the near and far clip plane in PerspectiveProjection()]
|
||||||
[1:38:54][Try to find a source for the standard projection perspective matrix]
|
[1:38:54][Try to find a source for the standard projection perspective matrix]
|
||||||
[1:43:48][Run the game and consider ]
|
[1:43:48][Run the game to see some projection wonkiness]
|
||||||
[1:46:06][handmade_render_group.cpp: Try turning off the ZBias in PushBitmap()]
|
[1:46:06][handmade_render_group.cpp: Try turning off the ZBias in PushBitmap()]
|
||||||
[1:46:25][Run the game to see that everything is sorting as expected]
|
[1:46:25][Run the game to see that everything is sorting as expected]
|
||||||
[1:48:45][Consider that the ZBias is pre-transformed and appears to be being applied in clip space]
|
[1:48:45][Consider that the ZBias is pre-transformed and appears to be being applied in clip space]
|
||||||
|
|
|
@ -53,7 +53,7 @@
|
||||||
[1:07:12][Investigate which VK_ keys are available to us]
|
[1:07:12][Investigate which VK_ keys are available to us]
|
||||||
[1:10:06][win32_handmade.cpp: Make Win32ProcessPendingMessage() use VK_OEM_PLUS and VK_OEM_MINUS]
|
[1:10:06][win32_handmade.cpp: Make Win32ProcessPendingMessage() use VK_OEM_PLUS and VK_OEM_MINUS]
|
||||||
[1:10:46][Run the game to try out our key bindings, and investigate why we can't cycle between the textures]
|
[1:10:46][Run the game to try out our key bindings, and investigate why we can't cycle between the textures]
|
||||||
[1:12:29][handmade_opengl.cpp: ]
|
[1:12:29][handmade_opengl.cpp: Double-check CompileFinalStretch()]
|
||||||
[1:13:05][Consult the documentation on Framebuffer[ref
|
[1:13:05][Consult the documentation on Framebuffer[ref
|
||||||
site="Khronos"
|
site="Khronos"
|
||||||
page="Framebuffer"
|
page="Framebuffer"
|
||||||
|
|
|
@ -21,7 +21,7 @@
|
||||||
[54:30][Blackboard: All light must go somewhere]
|
[54:30][Blackboard: All light must go somewhere]
|
||||||
[55:33][handmade_render_group.cpp: Enable LightingTest() to make RefC converge towards 0, and track the transference and accumulation of light]
|
[55:33][handmade_render_group.cpp: Enable LightingTest() to make RefC converge towards 0, and track the transference and accumulation of light]
|
||||||
[1:03:25][handmade_render_group.cpp: Enable LightingTest() to correct for the wrongness of the transfer]
|
[1:03:25][handmade_render_group.cpp: Enable LightingTest() to correct for the wrongness of the transfer]
|
||||||
[1:11:10][Step in to LightingTest() and ]
|
[1:11:10][Step through LightingTest()]
|
||||||
[1:13:10][Consider how to handle emission]
|
[1:13:10][Consider how to handle emission]
|
||||||
[1:13:46][handmade_render_group.cpp: Prevent LightingTest() from performing the correction and just letting the light bounce ad infinitum]
|
[1:13:46][handmade_render_group.cpp: Prevent LightingTest() from performing the correction and just letting the light bounce ad infinitum]
|
||||||
[1:14:27][Run the game to see the flickery results]
|
[1:14:27][Run the game to see the flickery results]
|
||||||
|
|
|
@ -34,7 +34,7 @@
|
||||||
[1:12:47][Make RayCast() account for the Source Position in the Position computation][:lighting :rendering]
|
[1:12:47][Make RayCast() account for the Source Position in the Position computation][:lighting :rendering]
|
||||||
[1:13:55][:Run the game to see that it looks much more correct][:lighting :rendering]
|
[1:13:55][:Run the game to see that it looks much more correct][:lighting :rendering]
|
||||||
[1:15:47][Temporarily increase the RayCount in ComputeLightPropagation()][:lighting :rendering]
|
[1:15:47][Temporarily increase the RayCount in ComputeLightPropagation()][:lighting :rendering]
|
||||||
[1:16:01][:Run the game to see the :lighting solution with more rays[:rendering]]
|
[1:16:01][:Run the game to see the :lighting solution with more rays][:rendering]
|
||||||
[1:17:05][Determine to make the light sampling more unbiased][:lighting :rendering :speech]
|
[1:17:05][Determine to make the light sampling more unbiased][:lighting :rendering :speech]
|
||||||
[1:18:58][:Run the game and determine to enable :lighting recomputation while showing the :"debug visualisation"][:"debug system" :rendering]
|
[1:18:58][:Run the game and determine to enable :lighting recomputation while showing the :"debug visualisation"][:"debug system" :rendering]
|
||||||
[1:19:34][Enable UpdateAndRenderWorld() to recompute the :lighting while showing the :"debug visualisation"][:"debug system" :rendering]
|
[1:19:34][Enable UpdateAndRenderWorld() to recompute the :lighting while showing the :"debug visualisation"][:"debug system" :rendering]
|
||||||
|
|
|
@ -4,7 +4,7 @@
|
||||||
page="HandmadeHero / cpp"
|
page="HandmadeHero / cpp"
|
||||||
url=https://github.com/HandmadeHero/cpp/issues]][:speech]
|
url=https://github.com/HandmadeHero/cpp/issues]][:speech]
|
||||||
[1:35][Show item_hat_03.png with a view to investigating why we are extracting six tiles from this four-tile asset][:admin :art :"asset system"]
|
[1:35][Show item_hat_03.png with a view to investigating why we are extracting six tiles from this four-tile asset][:admin :art :"asset system"]
|
||||||
[5:14][Determine to enable test_png to output ]
|
[5:14][Determine to enable test_png to output alpha pixels full white]
|
||||||
[6:54][Enable WriteImageTopDownRGBA() to output any alpha pixels full white, introducing ThreshAlpha()][:rendering]
|
[6:54][Enable WriteImageTopDownRGBA() to output any alpha pixels full white, introducing ThreshAlpha()][:rendering]
|
||||||
[9:52][Run test_png on item_hat_03.png and see some spurious data in the output][:admin :rendering]
|
[9:52][Run test_png on item_hat_03.png and see some spurious data in the output][:admin :rendering]
|
||||||
[11:40][Reacquaint ourselves with ProcessMultiTileImport() to see that it only processes tiles containing alpha pixels][:"asset system" :research :rendering]
|
[11:40][Reacquaint ourselves with ProcessMultiTileImport() to see that it only processes tiles containing alpha pixels][:"asset system" :research :rendering]
|
||||||
|
|
|
@ -64,7 +64,7 @@
|
||||||
[1:55:52][Get a new dotahero][:admin]
|
[1:55:52][Get a new dotahero][:admin]
|
||||||
[1:56:43][Ponder ~RemedyBG's breakpoint confusion][:"hot reloading" :library :speech]
|
[1:56:43][Ponder ~RemedyBG's breakpoint confusion][:"hot reloading" :library :speech]
|
||||||
[1:57:46][Wonder why we're jumping to an unknown function][:"hot reloading" :library :speech]
|
[1:57:46][Wonder why we're jumping to an unknown function][:"hot reloading" :library :speech]
|
||||||
[1:58:17][:Run, rebuild, step in to OpenGLEndFrame() and ][:"hot reloading" :library]
|
[1:58:17][:Run, rebuild, step in to OpenGLEndFrame() and inspect the OpenGL struct][:"hot reloading" :library]
|
||||||
[1:59:51][Remember that our OpenGL functions reside in a dll-local table, and must be reinitialised][:"hot reloading" :library :speech]
|
[1:59:51][Remember that our OpenGL functions reside in a dll-local table, and must be reinitialised][:"hot reloading" :library :speech]
|
||||||
[2:01:32][Augment open_gl with our OpenGL functions, renaming OpenGLGlobalFunction() to OpenGLFunction()][:library :rendering]
|
[2:01:32][Augment open_gl with our OpenGL functions, renaming OpenGLGlobalFunction() to OpenGLFunction()][:library :rendering]
|
||||||
[2:08:23][Make our OpenGL context available to all OpenGL-calling functions, and Win32InitOpenGL() initialise our OpenGL functions][:library :rendering]
|
[2:08:23][Make our OpenGL context available to all OpenGL-calling functions, and Win32InitOpenGL() initialise our OpenGL functions][:library :rendering]
|
||||||
|
|
Loading…
Reference in New Issue