Day 11 complete.

This commit is contained in:
Edward R. Gonzalez 2023-09-15 21:35:27 -04:00
parent 97c2a46805
commit 9831c46739
16 changed files with 248 additions and 92 deletions

3
.gitmodules vendored
View File

@ -1,3 +0,0 @@
[submodule "handmade-hero-notes"]
path = handmade-hero-notes
url = https://github.com/Ed94/handmade-hero-notes

7
docs/Day 001.md Normal file
View File

@ -0,0 +1,7 @@
# Day 1
Project initially setup. Followed the video and the book.
I went extra since I already have a perferred setup I've recently grown accoustmed to and I'm going to take advantage of the metaprogramming library I've recently made for myself. Although I doubt it'll see much action...
I'll be keeping the code pretty C like as Casey does in the series. Main purpose is to be able to use whitebox.

9
docs/Day 002.md Normal file
View File

@ -0,0 +1,9 @@
# Day 2
Pretty smooth so far, modular header library is showing its limitations...
I have enough practice messsing with forwards and library linkage now that it wasn't much of a show stopper at least. All the mess is quarantined in the in win32.h and so far it looks like it will be enough to keep it all there.
I added extra stuff in `grime.h`, `macros.h`, and `types.h` that he will either go over soon from my vauge memory last time I just watched him (instead of doing) + stuff from gencpp's version of the zpl library.
![img](https://files.catbox.moe/wxasgz.png)

4
docs/Day 003.md Normal file
View File

@ -0,0 +1,4 @@
# Day 3
Was able to follow along just fine, lots of more `Gdi32`` stuff to forward in `win32.h`.

2
docs/Day 004.md Normal file
View File

@ -0,0 +1,2 @@
# Day 4

4
docs/Day 011.md Normal file
View File

@ -0,0 +1,4 @@
# Day 11
Architecture discussion was great. Did some diagramming of it.

BIN
docs/Visuals.afdesign Normal file

Binary file not shown.

@ -1 +0,0 @@
Subproject commit 5d1c77a44299fb8eddc4417cfe5e899289e555af

61
project/engine.cpp Normal file
View File

@ -0,0 +1,61 @@
#include "engine.h"
NS_ENGINE_BEGIN
internal void
render_weird_graident(OffscreenBuffer* buffer, u32 x_offset, u32 y_offset )
{
// TODO(Ed): See if with optimizer if buffer should be passed by value.
struct Pixel {
u8 Blue;
u8 Green;
u8 Red;
u8 Alpha;
};
u8* row = rcast( u8*, buffer->Memory);
local_persist float wildcard = 0;
for ( u32 y = 0; y < buffer->Height; ++ y )
{
// u8* pixel = rcast(u8*, row);
// Pixel* pixel = rcast( Pixel*, row );
u32* pixel = rcast(u32*, row);
for ( u32 x = 0; x < buffer->Width; ++ x )
{
/* Pixel in memory:
-----------------------------------------------
Pixel + 0 Pixel + 1 Pixel + 2 Pixel + 3
RR GG GG XX
-----------------------------------------------
x86-64 : Little Endian Arch
0x XX BB GG RR
*/
#if 0
u8 blue = scast(u8, x + x_offset * u8(wildcard) % 256);
u8 green = scast(u8, y + y_offset - u8(wildcard) % 128);
u8 red = scast(u8, wildcard) % 256 - x * 0.4f;
#else
u8 blue = scast(u8, x + x_offset);
u8 green = scast(u8, y + y_offset);
u8 red = 0;
#endif
*pixel++ = (red << 16) | (green << 8) | blue;
}
wildcard += 0.5375f;
row += buffer->Pitch;
}
}
internal
void update_and_render( OffscreenBuffer* back_buffer
// Temp (for feature parity)
, u32 x_offset, u32 y_offset
)
{
render_weird_graident( back_buffer, x_offset, y_offset );
}
NS_ENGINE_END

30
project/engine.h Normal file
View File

@ -0,0 +1,30 @@
/*
Services the engine provides to the platform layer
*/
#pragma once
#include "platform.h"
#define NS_ENGINE_BEGIN namespace engine {
#define NS_ENGINE_END }
NS_ENGINE_BEGIN
struct OffscreenBuffer
{
void* Memory; // Lets use directly mess with the "pixel's memory buffer"
u32 Width;
u32 Height;
u32 Pitch;
u32 BytesPerPixel;
};
// Needs a contextual reference to four things:
// Timing, Input, Bitmap Buffer, Sound Buffer
void update_and_render( OffscreenBuffer* back_buffer
// Temp (for feature parity)
, u32 x_offset, u32 y_offset
);
NS_ENGINE_END

8
project/handmace.cpp Normal file
View File

@ -0,0 +1,8 @@
/*
Hnadmade Hero game code layer.
*/
#pragma once
#include "engine.h"

View File

@ -1,3 +1,22 @@
/*
TODO : This is not a final platform layer
- Saved game locations
- Getting a handle to our own executable file
- Asset loading path
- Threading (launch a thread)
- Raw Input (support for multiple keyboards)
- Sleep / timeBeginPeriod
- ClipCursor() (for multimonitor support)
- Fullscreen support
- WM_SETCURSOR (control cursor visibility)
- QueryCancelAutoplay
- WM_ACTIVATEAPP (for when not active)
- Blit speed improvemnts (BitBlt)
- Hardware acceleration ( OpenGL or Direct3D or both )
- GetKeyboardLayout (for French keyboards, international WASD support)
*/
#if __clang__ #if __clang__
#pragma clang diagnostic push #pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wunused-const-variable" #pragma clang diagnostic ignored "-Wunused-const-variable"
@ -6,21 +25,19 @@
#pragma clang diagnostic ignored "-Wunknown-pragmas" #pragma clang diagnostic ignored "-Wunknown-pragmas"
#pragma clang diagnostic ignored "-Wvarargs" #pragma clang diagnostic ignored "-Wvarargs"
#pragma clang diagnostic ignored "-Wunused-function" #pragma clang diagnostic ignored "-Wunused-function"
#pragma clang diagnostic ignored "-Wunused-but-set-variable"
#endif #endif
#include "grime.h" #include <math.h> // TODO : Implement math ourselves
#include "macros.h"
#include "types.h"
#include "math_constants.h"
// #include <stdio.h>
// TODO : Implement sound ourselves
#include <math.h>
// Platform Layer headers
#include "platform.h"
#include "jsl.h" // Using this to get dualsense controllers
#include "win32.h" #include "win32.h"
// Using this to get dualsense controllers
#include "JoyShockLibrary/JoyShockLibrary.h" // Engine layer headers
#include "engine.h"
// TOOD(Ed): Redo these macros properly later. // TOOD(Ed): Redo these macros properly later.
@ -47,7 +64,6 @@ ensure_impl( bool condition, char const* message ) {
JslSetLightColour( 0, (255 << 8 ) ); \ JslSetLightColour( 0, (255 << 8 ) ); \
} while (0) } while (0)
NS_WIN32_BEGIN NS_WIN32_BEGIN
// TODO(Ed) : This is a global for now. // TODO(Ed) : This is a global for now.
@ -248,51 +264,6 @@ get_window_dimensions( HWND window_handle )
return result; return result;
} }
internal void
render_weird_graident(OffscreenBuffer* buffer, u32 x_offset, u32 y_offset )
{
// TODO(Ed): See if with optimizer if buffer should be passed by value.
struct Pixel {
u8 Blue;
u8 Green;
u8 Red;
u8 Alpha;
};
u8* row = rcast( u8*, buffer->Memory);
local_persist float wildcard = 0;
for ( u32 y = 0; y < buffer->Height; ++ y )
{
// u8* pixel = rcast(u8*, row);
// Pixel* pixel = rcast( Pixel*, row );
u32* pixel = rcast(u32*, row);
for ( u32 x = 0; x < buffer->Width; ++ x )
{
/* Pixel in memory:
-----------------------------------------------
Pixel + 0 Pixel + 1 Pixel + 2 Pixel + 3
RR GG GG XX
-----------------------------------------------
x86-64 : Little Endian Arch
0x XX BB GG RR
*/
#if 0
u8 blue = scast(u8, x + x_offset * u8(wildcard) % 256);
u8 green = scast(u8, y + y_offset - u8(wildcard) % 128);
u8 red = scast(u8, wildcard) % 256 - x * 0.4f;
#else
u8 blue = scast(u8, x + x_offset);
u8 green = scast(u8, y + y_offset);
u8 red = 0;
#endif
*pixel++ = (red << 16) | (green << 8) | blue;
}
wildcard += 0.5375f;
row += buffer->Pitch;
}
}
internal void internal void
resize_dib_section( OffscreenBuffer* buffer, u32 width, u32 height ) resize_dib_section( OffscreenBuffer* buffer, u32 width, u32 height )
@ -357,7 +328,7 @@ main_window_callback(
LPARAM l_param LPARAM l_param
) )
{ {
LRESULT result; LRESULT result = 0;
switch ( system_messages ) switch ( system_messages )
{ {
@ -528,10 +499,9 @@ WinMain(
} }
} }
// MessageBox( 0, L"First message!", L"Handmade Hero", MB_Ok_Btn | MB_Icon_Information ); // MessageBox( 0, L"First message!", L"Handmade Hero", MB_Ok_Btn | MB_Icon_Information );
WNDCLASS WNDCLASSW
window_class {}; window_class {};
window_class.style = CS_Horizontal_Redraw | CS_Vertical_Redraw; window_class.style = CS_Horizontal_Redraw | CS_Vertical_Redraw;
window_class.lpfnWndProc = main_window_callback; window_class.lpfnWndProc = main_window_callback;
@ -742,10 +712,10 @@ WinMain(
} }
} }
engine::update_and_render( rcast(engine::OffscreenBuffer*, & BackBuffer.Memory), x_offset, y_offset );
// Rendering // Rendering
{ {
render_weird_graident( &BackBuffer, x_offset, y_offset );
WinDimensions dimensions = get_window_dimensions( window_handle ); WinDimensions dimensions = get_window_dimensions( window_handle );
HDC device_context = GetDC( window_handle ); HDC device_context = GetDC( window_handle );
display_buffer_in_window( device_context, dimensions.Width, dimensions.Height, &BackBuffer display_buffer_in_window( device_context, dimensions.Width, dimensions.Height, &BackBuffer
@ -865,3 +835,6 @@ WinMain(
return 0; return 0;
} }
// Engine layer translation unit.
#include "engine.cpp"

12
project/platform/jsl.h Normal file
View File

@ -0,0 +1,12 @@
// Joyshock grime wrapper
#if __clang__
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wreturn-type-c-linkage"
#endif
#include "JoyShockLibrary/JoyShockLibrary.h"
#if __clang__
#pragma clang diagnostic pop
#endif

View File

@ -0,0 +1,11 @@
/*
Platform abstraction layer for the project.
Services the platform provides to the engine & game.
*/
#pragma once
#include "grime.h"
#include "macros.h"
#include "math_constants.h"
#include "types.h"

View File

@ -1,5 +1,5 @@
/* /*
Alternative header for windows.h Windows dependency header
*/ */
#pragma once #pragma once

View File

@ -8,7 +8,9 @@ Push-Location $path_root
#region Arguments #region Arguments
$vendor = $null $vendor = $null
$release = $null $optimized = $false
$debug = $false
$analysis = $false
[array] $vendors = @( "clang", "msvc" ) [array] $vendors = @( "clang", "msvc" )
@ -17,11 +19,12 @@ Push-Location $path_root
if ( $args ) { $args | ForEach-Object { if ( $args ) { $args | ForEach-Object {
switch ($_){ switch ($_){
{ $_ -in $vendors } { $vendor = $_; break } { $_ -in $vendors } { $vendor = $_; break }
"release" { $release = $true } "optimized" { $optimized = $true }
"debug" { $release = $false } "debug" { $debug = $true }
"analysis" { $analysis = $true }
} }
}} }}
#endregion Arguments #endregion Argument
#region Configuration #region Configuration
if ($IsWindows) { if ($IsWindows) {
@ -47,10 +50,9 @@ function run-compiler
{ {
param( $compiler, $unit, $compiler_args ) param( $compiler, $unit, $compiler_args )
$compiler_args += @( if ( $analysis ) {
($flag_define + 'UNICODE'), $compiler_args += $flag_syntax_only
($flag_define + '_UNICODE') }
)
write-host "`Compiling $unit" write-host "`Compiling $unit"
write-host "Compiler config:" write-host "Compiler config:"
@ -109,6 +111,8 @@ function run-linker
if ( $vendor -match "clang" ) if ( $vendor -match "clang" )
{ {
# https://clang.llvm.org/docs/ClangCommandLineReference.html # https://clang.llvm.org/docs/ClangCommandLineReference.html
$flag_all_c = '/TC'
$flag_all_cpp = '/TP'
$flag_compile = '-c' $flag_compile = '-c'
$flag_color_diagnostics = '-fcolor-diagnostics' $flag_color_diagnostics = '-fcolor-diagnostics'
$flag_no_color_diagnostics = '-fno-color-diagnostics' $flag_no_color_diagnostics = '-fno-color-diagnostics'
@ -122,15 +126,19 @@ if ( $vendor -match "clang" )
$flag_library_path = '-L' $flag_library_path = '-L'
$flag_link_win = '-Wl,' $flag_link_win = '-Wl,'
$flag_link_win_subsystem_console = '/SUBSYSTEM:CONSOLE' $flag_link_win_subsystem_console = '/SUBSYSTEM:CONSOLE'
$flag_link_win_subsystem_windows = '/SUBSYSTEM:WINDOWS'
$flag_link_win_machine_32 = '/MACHINE:X86' $flag_link_win_machine_32 = '/MACHINE:X86'
$flag_link_win_machine_64 = '/MACHINE:X64' $flag_link_win_machine_64 = '/MACHINE:X64'
$flag_link_win_debug = '/DEBUG' $flag_link_win_debug = '/DEBUG'
$flag_link_win_pdb = '/PDB:' $flag_link_win_pdb = '/PDB:'
$flag_link_win_path_output = '/OUT:' $flag_link_win_path_output = '/OUT:'
$flag_no_optimization = '-O0' $flag_no_optimization = '-O0'
$flag_optimize_fast = '-O2'
$flag_optimize_size = '-O1'
$flag_path_output = '-o' $flag_path_output = '-o'
$flag_preprocess_non_intergrated = '-no-integrated-cpp' $flag_preprocess_non_intergrated = '-no-integrated-cpp'
$flag_profiling_debug = '-fdebug-info-for-profiling' $flag_profiling_debug = '-fdebug-info-for-profiling'
$flag_syntax_only = '-fsyntax-only'
$flag_target_arch = '-target' $flag_target_arch = '-target'
$flag_wall = '-Wall' $flag_wall = '-Wall'
$flag_warning = '-W' $flag_warning = '-W'
@ -169,10 +177,15 @@ if ( $vendor -match "clang" )
$flag_preprocess_non_intergrated, $flag_preprocess_non_intergrated,
( $flag_path_output + $object ) ( $flag_path_output + $object )
) )
if ( $release -eq $false ) { if ( $optimized ) {
$compiler_args += $flag_optimize_fast
}
else {
$compiler_args += $flag_no_optimization
}
if ( $debug ) {
$compiler_args += ( $flag_define + 'Build_Debug' ) $compiler_args += ( $flag_define + 'Build_Debug' )
$compiler_args += $flag_debug, $flag_debug_codeview, $flag_profiling_debug $compiler_args += $flag_debug, $flag_debug_codeview, $flag_profiling_debug
$compiler_args += $flag_no_optimization
} }
$warning_ignores | ForEach-Object { $warning_ignores | ForEach-Object {
@ -187,12 +200,10 @@ if ( $vendor -match "clang" )
$flag_link_win_machine_64, $flag_link_win_machine_64,
$( $flag_link_win_path_output + $executable ) $( $flag_link_win_path_output + $executable )
) )
if ( $release -eq $false ) { if ( $debug ) {
$linker_args += $flag_link_win_debug $linker_args += $flag_link_win_debug
$linker_args += $flag_link_win_pdb + $pdb $linker_args += $flag_link_win_pdb + $pdb
} }
else {
}
$libraries | ForEach-Object { $libraries | ForEach-Object {
$linker_args += $_ + '.lib' $linker_args += $_ + '.lib'
@ -209,6 +220,8 @@ if ( $vendor -match "clang" )
if ( $vendor -match "msvc" ) if ( $vendor -match "msvc" )
{ {
# https://learn.microsoft.com/en-us/cpp/build/reference/compiler-options-listed-by-category?view=msvc-170 # https://learn.microsoft.com/en-us/cpp/build/reference/compiler-options-listed-by-category?view=msvc-170
$flag_all_c = '/TC'
$flag_all_cpp = '/TP'
$flag_compile = '/c' $flag_compile = '/c'
$flag_debug = '/Zi' $flag_debug = '/Zi'
$flag_define = '/D' $flag_define = '/D'
@ -232,11 +245,15 @@ if ( $vendor -match "msvc" )
$flag_link_win_subsystem_console = '/SUBSYSTEM:CONSOLE' $flag_link_win_subsystem_console = '/SUBSYSTEM:CONSOLE'
$flag_link_win_subsystem_windows = '/SUBSYSTEM:WINDOWS' $flag_link_win_subsystem_windows = '/SUBSYSTEM:WINDOWS'
$flag_no_optimization = '/Od' $flag_no_optimization = '/Od'
$flag_optimize_fast = '/O2'
$flag_optimize_size = '/O1'
$flag_optimized_debug = '/Zo'
$flag_out_name = '/OUT:' $flag_out_name = '/OUT:'
$flag_path_interm = '/Fo' $flag_path_interm = '/Fo'
$flag_path_debug = '/Fd' $flag_path_debug = '/Fd'
$flag_path_output = '/Fe' $flag_path_output = '/Fe'
$flag_preprocess_conform = '/Zc:preprocessor' $flag_preprocess_conform = '/Zc:preprocessor'
$flag_syntax_only = '/Zs'
# This works because this project uses a single unit to build # This works because this project uses a single unit to build
function build-simple function build-simple
@ -249,6 +266,7 @@ if ( $vendor -match "msvc" )
$compiler_args += @( $compiler_args += @(
$flag_nologo, $flag_nologo,
$flag_all_cpp,
$flag_exceptions_disabled, $flag_exceptions_disabled,
( $flag_define + '_HAS_EXCEPTIONS=0' ), ( $flag_define + '_HAS_EXCEPTIONS=0' ),
$flag_RTTI_disabled, $flag_RTTI_disabled,
@ -257,19 +275,33 @@ if ( $vendor -match "msvc" )
( $flag_path_interm + $path_build + '\' ), ( $flag_path_interm + $path_build + '\' ),
( $flag_path_output + $path_build + '\' ) ( $flag_path_output + $path_build + '\' )
) )
if ( $release -eq $false ) {
if ( $optimize ) {
$compiler_args += $flag_optimize_fast
}
else {
$compiler_args += $flag_no_optimization
}
if ( $debug )
{
$compiler_args += $flag_debug $compiler_args += $flag_debug
$compiler_args += ( $flag_define + 'Build_Debug' ) $compiler_args += ( $flag_define + 'Build_Debug' )
$compiler_args += ( $flag_path_debug + $path_build + '\' ) $compiler_args += ( $flag_path_debug + $path_build + '\' )
$compiler_args += $flag_link_win_rt_static_debug $compiler_args += $flag_link_win_rt_static_debug
$compiler_args += $flag_no_optimization
if ( $optimized ) {
$compiler_args += $flag_optimized_debug
}
} }
else { else {
$compiler_args += $flag_link_win_rt_static $compiler_args += $flag_link_win_rt_static
} }
$compiler_args += $includes | ForEach-Object { $flag_include + $_ } $compiler_args += $includes | ForEach-Object { $flag_include + $_ }
$compiler_args += $flag_compile, $unit $compiler_args += $unit
run-compiler $compiler $unit $compiler_args # $compiler_args += $flag_compile, $unit
# run-compiler $compiler $unit $compiler_args
$linker_args += @( $linker_args += @(
$flag_nologo, $flag_nologo,
@ -284,7 +316,11 @@ if ( $vendor -match "msvc" )
} }
$linker_args += $object $linker_args += $object
run-linker $linker $executable $linker_args # run-linker $linker $executable $linker_args
$compiler_args += $flag_linker
$compiler_args += $linker_args
run-compiler $compiler $unit $compiler_args
} }
$compiler = 'cl' $compiler = 'cl'
@ -354,10 +390,13 @@ $lib_user32 = 'User32.lib'
# Github # Github
$lib_jsl = Join-Path $path_deps 'JoyShockLibrary/x64/JoyShockLibrary.lib' $lib_jsl = Join-Path $path_deps 'JoyShockLibrary/x64/JoyShockLibrary.lib'
$unit = Join-Path $path_project 'handmade_win32.cpp' $unit = Join-Path $path_platform 'handmade_win32.cpp'
$executable = Join-Path $path_build 'handmade_win32.exe' $executable = Join-Path $path_build 'handmade_win32.exe'
$compiler_args = @() $compiler_args = @(
($flag_define + 'UNICODE'),
($flag_define + '_UNICODE')
)
$linker_args = @( $linker_args = @(
$lib_gdi32, $lib_gdi32,