From fc47e3525668493ba12622a2068d124c877ea52c Mon Sep 17 00:00:00 2001 From: Adog64 Date: Sun, 3 Dec 2023 13:03:07 -0500 Subject: [PATCH] Started error codes, working on bitmap loader --- Makefile | 2 +- PlanetMiner | Bin 0 -> 23752 bytes assets/clover.bmp | Bin 0 -> 30138 bytes bin/main.o | Bin 11400 -> 11600 bytes errorcodes.md | 8 ++++++ src/imagefiles.c | 61 ++++++++++++++++++++++++++++++++++++++++++++++ src/imagefiles.h | 9 +++++++ src/main.c | 11 ++++----- src/textfiles.c | 3 ++- 9 files changed, 86 insertions(+), 8 deletions(-) create mode 100755 PlanetMiner create mode 100644 assets/clover.bmp create mode 100644 errorcodes.md create mode 100644 src/imagefiles.c create mode 100644 src/imagefiles.h diff --git a/Makefile b/Makefile index 26511c5..3bb3f39 100644 --- a/Makefile +++ b/Makefile @@ -17,7 +17,7 @@ CFLAGS = -Wall -Wextra -O3 LDFLAGS = # add library linker commands here (start with -l) -LOADLIBS = -lglfw -lGLEW -lGL +LOADLIBS = -lglfw -lGLEW -lGL -lm # add library search paths here (start with -L) LDLIBS = diff --git a/PlanetMiner b/PlanetMiner new file mode 100755 index 0000000000000000000000000000000000000000..3e8c029492c510f4894a33c3ea3f9a8e90baf4ec GIT binary patch literal 23752 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 GW&Z`YZ0`gB literal 0 HcmV?d00001 diff --git a/assets/clover.bmp b/assets/clover.bmp new file mode 100644 index 0000000000000000000000000000000000000000..b64e7102c7e028d6c2624786a4a1818f891c40e8 GIT binary patch literal 30138 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 delta 3365 zcmZ`*3v3is6x~^v?RRNQi(1-+MM{7~K<&qtfR>^V2xuWnimh4< zN=YggwI(z|QVmfsYBd@GDNrn*HnfcpBEKRk6!8O_RKl;`dv_*znCwm7+4s&l_rA}} z?94#*=BhTQd2{-gu0!J#3)~pDKJLmRCet+&#*aaS3img4i%mPAar|fbBd+l#lSnQz z`Ghr^4E5sgF>J@{XCe5+;sG3V`$W|(YZ=;50+jgzlzx*LmTD2A&QMnTy;T-acsLQ@4 zVcVm%5seGDjy2ABMP!|}277%zQF*r4t2LsEM`7EqZP$Icy~;Y=9;VRtvBG9ldRw$s zvSJA5QR4S&?KnX55mCV>joqJwlgfKU<#9~dVP!wpZ_#$*0PMl8;>uH^Dw`Bh5k^0} zmEHbMtJX<^vsG*6-|d_xDvt{14OkPbc6|{1krLmom`vqcO3-2Y!GwLj#BbhKM9XWi zAT+XK1#$;XWx8NEE6~nPgIM%`!fOy%Yh4W9AcaVn>OErh1KixdFcP|G)&sgk)w_3qeMeH&OO_6VeqLH6EACtACF6EB!8{eAOr-_518FgPE+GRB?f zcBeQOE~`r^U)qr3&d-^WH*n_!-J=Rv5Ov01KT_P-Dx3PFs{x z4TCmSSjTI1P(<|RlBOxQ(%$5Sn8qy9!M?^JcmW7>gLEG8QvV zW6UQk=o*SyG|s{QKDcK(0UNe^WBzdH=fFJ7k5latl1ld|g&A7}Y>dlQB4ICjqHt_f zSVsm7@z#kf1_)f(2R=EXode z9Y@D-v_HWTcJiU>e`4K4DRWp-6Cp8CwI@mHs5EO5%uiHdUZN!|gqDv%KgqBWb5gN~ zPa#JnNf@-7Nw61l_9R-AX|M}>*Agu}s^C#<5|1D+NrUrP_btxz*LA?EB-NgVjBx@T zl9~z~sHRKmSCZ<0epH>3dPY}iO&M?>RhOjxqpP%^Ovp~2jd%CDjCgk_$m8xenU3vC=xpOHZi5zYl9uR9KS|tL&qmJz6?P*%t$Ys4f|YsTgFM zfX%3~5|mU`d5JvA$KXy??O#Yvi{v~+PWzCg%5|=A?q8BB=Z3-|oW%;MlT^h4H?dA0 z9Uca)M|OJHvylDu%pBhs}LYs`If!Wvnd;h!PZ@ksnLur^I?stu6!T!5?>CI1Ym+G@!^ zQ{rEiczG8sejb9;Z6#Zznq^XMo0KcB{5^>;?Rq*L6!UI-*LCL;N|^DvgH`a;Y|s`7 zPr715L+Jg4(FSW>MdqCo;ZxW2&^6(HG6ZhAij-!^$SgGvgu{x=>E^L;Sm2C-?o6j* zf|1NpB@Z&PO3m$Qup(=E^lsr#T%uoA`Y^D +#include + +bmp loadBitmapImage(char* path) +{ + FILE* inFile; + bmp image; + + inFile = fopen(path, "rb"); + if( !inFile ) + { + fprintf(stderr, "Could not open bitmap image file [%s].\n", path); + exit(4); + } + + if( fread(image.header, 1, 54, inFile) != 54 ) + { + fprintf(stderr, "Could not read bitmap image header for [%s].\n", path); + exit(5); + } + + // All bitmap images begin their header with "BM". + // This check just validates this + if( image.header[0] != 'B' || image.header[1] != 'M' ) + { + fprintf(stderr, "Bitmap image at [%s] has improper header.\n", path); + exit(6); + } + + // Cast the char pointer of the header to an int pointer and dereference it to get an int out + image.dataPos = *(int*) &(image.header[0x0A]); // Pointer casting to get the data start position information from the header + image.imageSize = *(int*) &(image.header[0x22]); // Extract image size information from the header + image.width = *(int*) &(image.header[0x12]); + image.height = *(int*) &(image.header[0x16]); + + // Correct for any misformatted data start information + if( image.dataPos == 0 ) + { + image.dataPos = 54; + } + + // Correct for missing image size (in bytes) information + if( image.imageSize == 0 ) + { + image.imageSize = 3*image.width*image.height; + } + + // Allocate the image buffer + image.data = (unsigned char*) malloc(sizeof(char) * imageSize); + + if( image.data == NULL ) + { + fprintf(stderr, "Failed to allocate memory while attempting to open bitmap image at [%s].\n", path); + exit(7); + } + + fread(data, 1, imageSize, inFile); + + fclose(inFile); +} diff --git a/src/imagefiles.h b/src/imagefiles.h new file mode 100644 index 0000000..7e5c827 --- /dev/null +++ b/src/imagefiles.h @@ -0,0 +1,9 @@ +typedef struct bmp { + unsigned char header[54]; + unsigned int dataPos; + unsigned int width, height; + unsigned int imageSize; // width*height*3 + unsigned char* data; +} bmp; + +bmp loadBitmapImage(char* path); diff --git a/src/main.c b/src/main.c index b350be0..fb61c1e 100644 --- a/src/main.c +++ b/src/main.c @@ -165,6 +165,7 @@ int main() printf("Entering main loop\n"); float theta = 0.0f; + float radius = 5.0f; do { @@ -172,11 +173,11 @@ int main() if( glfwGetKey(window, GLFW_KEY_W) == GLFW_PRESS ) { - //eye.z -= 0.05f; + radius -= 0.05f; } if( glfwGetKey(window, GLFW_KEY_S) == GLFW_PRESS ) { - // eye.z += 0.05f; + radius += 0.05f; } if( glfwGetKey(window, GLFW_KEY_D) == GLFW_PRESS ) { @@ -195,11 +196,9 @@ int main() // eye.y -= 0.05f; } - eye.x = (float)sin((double)theta); - eye.z = (float)cos((double)theta); - - // center = glms_vec3_add(eye, direction); + eye.x = radius * (float) sin((double) theta); + eye.z = radius * (float) cos((double) theta); mat4s view = glms_lookat(eye, center, up); mat4s model = glms_mat4_identity(); diff --git a/src/textfiles.c b/src/textfiles.c index de6edf8..7bd8c61 100644 --- a/src/textfiles.c +++ b/src/textfiles.c @@ -16,7 +16,7 @@ char* readTextFile(char* fname) if( inFile == NULL ) { fprintf( stderr, "Failed open file, [%s].\n", fname ); - exit(1); + exit(); } fseek( inFile, 0, SEEK_END ); @@ -34,6 +34,7 @@ char* readTextFile(char* fname) result = fread( fileBuffer, 1, fileLength, inFile ); if( result != fileLength ) { + free( fileBuffer ); fprintf( stderr, "Failed while reading [%s] into the file buffer.\n", fname); exit(3); }