Day 39 complete.

This commit is contained in:
igor
2026-04-24 14:08:11 -07:00
parent 0149719030
commit 536c2664fe
4 changed files with 45 additions and 17 deletions
+2 -2
View File
@@ -34,7 +34,7 @@
#undef ARCHITECTURE_ARM32 #undef ARCHITECTURE_ARM32
#define ARCHITECTURE_ARM32 1 #define ARCHITECTURE_ARM32 1
#else #else
#error Unknown not architecture . . . #error Unknown architecture . . .
#endif #endif
/* OS */ /* OS */
@@ -61,7 +61,7 @@
#undef OS_LINUX #undef OS_LINUX
#define OS_LINUX 1 #define OS_LINUX 1
#else #else
#error Unknown Operating System . . . #error Unknown operating system . . .
#endif #endif
/* Compiler */ /* Compiler */
+27 -3
View File
@@ -97,10 +97,17 @@ static void DrawBitmap(game_offscreen_buffer *Buffer, loaded_bitmap *Bitmap, F32
S32 Width = Buffer->Width; S32 Width = Buffer->Width;
S32 Height = Buffer->Height; S32 Height = Buffer->Height;
if(MinX < 0) S32 SourceOffsetX = 0;
if(MinX < 0) {
SourceOffsetX = -MinX;
MinX = 0; MinX = 0;
if(MinY < 0) }
S32 SourceOffsetY = 0;
if(MinY < 0) {
SourceOffsetY = -MinY;
MinY = 0; MinY = 0;
}
if(MaxX > Width) if(MaxX > Width)
MaxX = Width; MaxX = Width;
@@ -108,6 +115,7 @@ static void DrawBitmap(game_offscreen_buffer *Buffer, loaded_bitmap *Bitmap, F32
MaxY = Height; MaxY = Height;
U32 *SourceRow = Bitmap->Pixels + Bitmap->Width*(Bitmap->Height - 1); U32 *SourceRow = Bitmap->Pixels + Bitmap->Width*(Bitmap->Height - 1);
SourceRow += -Bitmap->Width*SourceOffsetY + SourceOffsetX;
U8 *DestRow = ((U8 *)Buffer->Memory + MinX*Buffer->BytesPerPixel + MinY*Buffer->Pitch); U8 *DestRow = ((U8 *)Buffer->Memory + MinX*Buffer->BytesPerPixel + MinY*Buffer->Pitch);
for(S32 Y = MinY; Y < MaxY; Y++) { for(S32 Y = MinY; Y < MaxY; Y++) {
U32 *Dest = (U32 *)DestRow; U32 *Dest = (U32 *)DestRow;
@@ -461,6 +469,22 @@ void UpdateAndRender(thread_context *Thread, game_memory *Memory, game_input *In
} }
GameState->PlayerP = NewPlayerP; GameState->PlayerP = NewPlayerP;
} }
GameState->CameraP.AbsTileZ = GameState->PlayerP.AbsTileZ;
tile_map_difference Diff = SubtractInF32(TileMap, &GameState->PlayerP, &GameState->CameraP);
if(Diff.dX > (9.0f*TileMap->TileSideInMeters)) {
GameState->CameraP.AbsTileX += 17;
}
if(Diff.dX < -(9.0f*TileMap->TileSideInMeters)) {
GameState->CameraP.AbsTileX -= 17;
}
if(Diff.dY > (5.0f*TileMap->TileSideInMeters)) {
GameState->CameraP.AbsTileY += 9;
}
if(Diff.dY < -(5.0f*TileMap->TileSideInMeters)) {
GameState->CameraP.AbsTileY -= 9;
}
} }
} }
@@ -510,7 +534,7 @@ void UpdateAndRender(thread_context *Thread, game_memory *Memory, game_input *In
F32 PlayerG = 0.0f; F32 PlayerG = 0.0f;
F32 PlayerB = 0.0f; F32 PlayerB = 0.0f;
F32 PlayerGroundPointX = ScreenCenterX + MetersToPixels*Diff.dX; F32 PlayerGroundPointX = ScreenCenterX + MetersToPixels*Diff.dX;
F32 PlayerGroundPointY = ScreenCenterY + MetersToPixels*Diff.dY; F32 PlayerGroundPointY = ScreenCenterY - MetersToPixels*Diff.dY;
F32 PlayerLeft = PlayerGroundPointX - 0.5f * MetersToPixels*PlayerWidth; F32 PlayerLeft = PlayerGroundPointX - 0.5f * MetersToPixels*PlayerWidth;
F32 PlayerTop = PlayerGroundPointY - MetersToPixels*PlayerHeight; F32 PlayerTop = PlayerGroundPointY - MetersToPixels*PlayerHeight;
DrawRectangle(Buffer, PlayerLeft, PlayerTop, PlayerLeft + MetersToPixels*PlayerWidth, PlayerTop + MetersToPixels*PlayerHeight, PlayerR, PlayerG, PlayerB); DrawRectangle(Buffer, PlayerLeft, PlayerTop, PlayerLeft + MetersToPixels*PlayerWidth, PlayerTop + MetersToPixels*PlayerHeight, PlayerR, PlayerG, PlayerB);
+3 -3
View File
@@ -140,9 +140,9 @@ static tile_map_difference SubtractInF32(tile_map *TileMap, tile_map_position *A
{ {
tile_map_difference Result; tile_map_difference Result;
F32 dTileX = (F32)A->AbsTileX - (F32)B->AbsTileY; F32 dTileX = (F32)A->AbsTileX - (F32)B->AbsTileX;
F32 dTileY = (F32)A->AbsTileX - (F32)B->AbsTileY; F32 dTileY = (F32)A->AbsTileY - (F32)B->AbsTileY;
F32 dTileZ = (F32)A->AbsTileX - (F32)B->AbsTileY; F32 dTileZ = (F32)A->AbsTileZ - (F32)B->AbsTileZ;
Result.dX = TileMap->TileSideInMeters*dTileX + (A->OffsetX - B->OffsetX); Result.dX = TileMap->TileSideInMeters*dTileX + (A->OffsetX - B->OffsetX);
Result.dY = TileMap->TileSideInMeters*dTileY + (A->OffsetY - B->OffsetY); Result.dY = TileMap->TileSideInMeters*dTileY + (A->OffsetY - B->OffsetY);
+13 -9
View File
@@ -402,6 +402,7 @@ static U32 GetLastWriteTime(const char *FileName)
{ {
struct stat file_info; struct stat file_info;
memset(&file_info, 0, sizeof(file_info)); memset(&file_info, 0, sizeof(file_info));
if(stat(FileName, &file_info) != 0) { if(stat(FileName, &file_info) != 0) {
/* TODO: Diagnostic. perror("stat failed"); */ /* TODO: Diagnostic. perror("stat failed"); */
} }
@@ -550,16 +551,14 @@ S32 main(S32 argc, char *argv[])
/* NOTE: Floating windows are not supported oficially by Wayland /* NOTE: Floating windows are not supported oficially by Wayland
* protocol. However, SDL_WINDOW_ALWAYS_ON_TOP does work on KDE * protocol. However, SDL_WINDOW_ALWAYS_ON_TOP does work on KDE
* under Wayland. I have not tested GNOME. */ * under Wayland. I have not tested GNOME. */
SDL_Window *Window = SDL_CreateWindow("Handmade Hero", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, RESOLUTION_WIDTH+20, RESOLUTION_HEIGHT+20, SDL_WINDOW_RESIZABLE); SDL_Window *Window = SDL_CreateWindow("Handmade Hero", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, RESOLUTION_WIDTH+20, RESOLUTION_HEIGHT+20, SDL_WINDOW_RESIZABLE/* | SDL_WINDOW_ALWAYS_ON_TOP*/);
/*SDL_WINDOW_RESIZABLE |
SDL_WINDOW_ALWAYS_ON_TOP);*/
if(Window) { if(Window) {
SDL_DisplayMode display_mode; SDL_DisplayMode display_mode;
SDL_GetCurrentDisplayMode(0, &display_mode); SDL_GetCurrentDisplayMode(0, &display_mode);
SDL_Renderer *Renderer = SDL_CreateRenderer(Window, -1, SDL_RENDERER_PRESENTVSYNC); SDL_Renderer *Renderer = SDL_CreateRenderer(Window, -1, SDL_RENDERER_PRESENTVSYNC);
SDL_SetWindowPosition(Window, (display_mode.w - RESOLUTION_WIDTH-20), (display_mode.h - RESOLUTION_HEIGHT-20)); SDL_SetWindowPosition(Window, (display_mode.w - RESOLUTION_WIDTH-30), (display_mode.h - RESOLUTION_HEIGHT-30));
/* NOTE: For future reference, the custom window bar should use /* NOTE: For future reference, the custom window bar should use
* SDL_SetWindowHitTest to define areas that will be used to * SDL_SetWindowHitTest to define areas that will be used to
@@ -793,16 +792,21 @@ S32 main(S32 argc, char *argv[])
SDLDisplayBufferInWindow(GlobalBackbuffer, Window, Renderer); SDLDisplayBufferInWindow(GlobalBackbuffer, Window, Renderer);
F64 MSPerFrame = 1000.0 * SDLGetSecondsElapsed(LastCounter, EndCounter); F64 MSPerFrame = 1000.0 * SDLGetSecondsElapsed(LastCounter, EndCounter);
F64 FPS = 0.0; F64 FPS = 1000.0 / MSPerFrame;
LastCounter = EndCounter; LastCounter = EndCounter;
#if 0 #if 1
U64 EndCycleCount = __rdtsc(); U64 EndCycleCount = __rdtsc();
U64 CyclesElapsed = EndCycleCount - LastCycleCount; U64 CyclesElapsed = EndCycleCount - LastCycleCount;
F64 MCPF = ((double)CyclesElapsed / (1000.0 * 1000.0)); F64 MCPF = ((F64)CyclesElapsed / (1000.0 * 1000.0));
fprintf(stderr, "%.02f ms/f, %.02f/s, %.02f mc/f\n",
MSPerFrame, FPS, MCPF); //fprintf(stderr, "%.02f ms/f, %.02f f/s, %.02f mc/f\n", MSPerFrame, FPS, MCPF);
static char fps_buffer[128];
snprintf(fps_buffer, sizeof(fps_buffer), "%.02f ms/f, %.02f f/s, %.02f mc/f", MSPerFrame, FPS, MCPF);
SDL_SetWindowTitle(Window, (const char *)fps_buffer);
LastCycleCount = EndCycleCount; LastCycleCount = EndCycleCount;
#endif #endif