From ef44b24798759e762afcaeb469f2a3421b048768 Mon Sep 17 00:00:00 2001 From: Adog64 Date: Wed, 29 Nov 2023 14:01:37 -0500 Subject: [PATCH] Cube rendering in c! --- Makefile | 62 ++++++ PlanetMiner | Bin 0 -> 30320 bytes bin/main.o | Bin 0 -> 11224 bytes bin/textfiles.o | Bin 0 -> 2808 bytes devlog.md | 32 +++ src/SimpleFragmentShader.fragmentshader | 7 + src/SimpleVertexShader.vertexshader | 9 + src/controls.h | 14 ++ src/main.c | 250 ++++++++++++++++++++++++ src/textfiles.c | 46 +++++ src/textfiles.h | 1 + src/worldgen.c | 21 ++ src/worldgen.h | 15 ++ todo.md | 45 +++++ 14 files changed, 502 insertions(+) create mode 100644 Makefile create mode 100755 PlanetMiner create mode 100644 bin/main.o create mode 100644 bin/textfiles.o create mode 100644 devlog.md create mode 100644 src/SimpleFragmentShader.fragmentshader create mode 100644 src/SimpleVertexShader.vertexshader create mode 100644 src/controls.h create mode 100644 src/main.c create mode 100644 src/textfiles.c create mode 100644 src/textfiles.h create mode 100644 src/worldgen.c create mode 100644 src/worldgen.h create mode 100644 todo.md diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..26511c5 --- /dev/null +++ b/Makefile @@ -0,0 +1,62 @@ +# the name of your executable +TARGET = PlanetMiner + +# launches your target in terminal +RUN = ./$(TARGET) + +# directory for your source files +SRC_DIR = src + +# directory for your object files +BUILD_DIR = bin + +# add more CompilerFLAGS as your project requires +CFLAGS = -Wall -Wextra -O3 + +# add libraries for your project here +LDFLAGS = + +# add library linker commands here (start with -l) +LOADLIBS = -lglfw -lGLEW -lGL + +# add library search paths here (start with -L) +LDLIBS = + +# add include paths (start with -I) +INC = + +# finds all your objects that corrispond to your .cpp files, system agnostic version +OBJECTS := $(patsubst $(SRC_DIR)/%.c, $(BUILD_DIR)/%.o, $(wildcard $(SRC_DIR)/*.c)) + +.PHONY: all +# makes build directory, updates your objects, builds your executable +all: + mkdir -p $(BUILD_DIR) + +$(MAKE) $(TARGET) + +# updates your objects, builds your executable +$(TARGET): $(OBJECTS) + $(CC) $(OBJECTS) $(CFLAGS) -o $@ $(LOADLIBS) $(LDFLAGS) $(LDLIBS) $(INC) + +# builds your objects +$(BUILD_DIR)/%.o: $(SRC_DIR)/%.c + $(CC) $(CFLAGS) -c $< -o $@ $(LOADLIBS) $(LDFLAGS) $(LDLIBS) $(INC) + +# deletes your built objects and executable +.PHONY: clean +clean: + -rm -rf $(BUILD_DIR) $(TARGET) + clear + +# makes build direcotry, updates your objects, builds your executable, launches your program +.PHONY: run +run: + +$(MAKE) all + $(RUN) + +# explains the only three options you should be using (unless you build more of your own) +.PHONY: help +help: + @echo "`make` - builds/updates everything, is ready to run with `$(RUN)` after completion" + @echo "`make clean` - removes object file folder and executable" + @echo "`make run` - builds/updates everything, runs immediately" diff --git a/PlanetMiner b/PlanetMiner new file mode 100755 index 0000000000000000000000000000000000000000..ae911234f368501b11b4356561710215d244c692 GIT binary patch literal 30320 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 literal 0 HcmV?d00001 diff --git a/bin/textfiles.o b/bin/textfiles.o new file mode 100644 index 0000000000000000000000000000000000000000..76147113f6d01359ed146dd72103435ea3cc965d GIT binary patch literal 2808 zcmbuBO=w(I6vxkGQai@_8b21ny11K`RFdb+L}-j3%(O9?N~lm95n_;+nfo$B=OeuL zLMMt?42n-Jbf-Ia;?kYqq7Af-Te}ihbtNJ$6vUNM&;QLm$<50f1U+zb@A;kcKli>j z=UwvdOG^tQxg3e*=tbK1gc8jj-CtLdWrdEDL)GOQ@Xp77S1&EUTHF4$@H70{`#Vwp zn-Q$yTctm1@wWpU-%IA3Nlv_5i|>?n4n%6#-pM84e0&>4!dm=8E&k;O&a_wM**lxh zRd+|Hm<;OGwr>}f;vZL5t8Y|SZ`D420ri(yhS}_J6D0|9Ay}B1^)zO_^u%-N7paShR zTHSROHTA)AveA_$>Pi~+Qmrl*6M`>TruMOc8>3)O`58XPU|1PnQCMO@wPkyNNW%484ZgcobtJ|PX(&6MIoBVpa7itQl zh7JPqHv(>3pLD+!@rG>p=wSFzWDWl@{9!{c;#d3Y{=l9BWCO>QB)kmB243JH{0tzQ z)R!KeAK)baL0(J#lEtABzHD)HtndwsAG7#-7Dtas{-=iHGI1>ax#4n7c^6+8j^{dV z<$q;y^rO`O+VFJ!Z8`I$=fw^y8d?-x9fjzc)I>Q!==7)=_jj>eg5ApZr4|a zqdvx-x#3nP^47==qhK&MWfkbQ=b}%^ZFrGK?phd<8}#5Hz2ue-y0hfgd!3H%vZC9I zw97Z&bQpQ{%f?^tZn_%*H+T?ju@v=n^G!eSI(qLw|8JpKj=K%LZCk}Sat}!i@5r_j z?BF-6*pSy(0olgQ%R^6MAAA$AiNQptcm|g~Gnk$M%&;`Z{e_zURbOH)YRY%Z%fw{= zX#r-I{bjB&&(b$dLMx@0=NCQhWvq*-yt^jh=@b{8%&!}LDlOHt`%%#eY4QU1*MS~K z(17&0 + +typedef struct camera +{ + vec3s pos; + vec3s dir; + vec3s +} + +void goForward(); +void goBackward(); +void goLeft(); +void goRight(); +void yawLeft(); diff --git a/src/main.c b/src/main.c new file mode 100644 index 0000000..2afe0a9 --- /dev/null +++ b/src/main.c @@ -0,0 +1,250 @@ +#include +#include +#include + +#include + +#include +GLFWwindow* window; + +#include + +#define WINW 800 +#define WINH 450 + +#define FOV 1.4f + +#define SHADER_BUF_SIZE 1000 + +GLuint loadShaders(const char*, const char*); + +int main() +{ + glewExperimental = true; + if( !glfwInit() ) + { + fprintf( stderr, "Failed to initialize GLFW :(\n" ); + return -1; + } + glfwWindowHint(GLFW_SAMPLES, 4); + glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3); + glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3); + glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE); + + glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); + + window = glfwCreateWindow(WINW, WINH, "Planet Miner", NULL, NULL); + if( window == NULL ) + { + fprintf( stderr, "Failed to create window. If you are using an Intel GPU, please note that they are not compatible with OpenGL 3.3\n" ); + glfwTerminate(); + return -1; + } + glfwMakeContextCurrent(window); + + glewExperimental = true; + if( glewInit() != GLEW_OK ) + { + fprintf( stderr, "Failed to initialize GLEW\n" ); + getchar(); + glfwTerminate(); + return -1; + } + + glfwSetInputMode(window, GLFW_STICKY_KEYS, GL_TRUE); + + glClearColor(0.0f, 0.0f, 0.0f, 0.0f); + + GLuint vertexArrayID; + glGenVertexArrays(1, &vertexArrayID); + glBindVertexArray(vertexArrayID); + + + GLuint programID = loadShaders( "src/SimpleVertexShader.vertexshader", "src/SimpleFragmentShader.fragmentshader" ); + + GLuint matrixID = glGetUniformLocation(programID, "MVP"); + + mat4s projection = glms_perspective(FOV, 16.0f / 9.0f, 0.1f, 100.0f); + + vec3s eye = {0.0f, 0.0f, 5.0f}; + vec3s center = {0.0f, 0.0f, 0.0f}; + vec3s up = {0.0f, 1.0f, 0.0f}; + + static const GLfloat g_vertex_buffer_data[] = { + -1.0f,-1.0f,-1.0f, // triangle 1 : begin + -1.0f,-1.0f, 1.0f, + -1.0f, 1.0f, 1.0f, // triangle 1 : end + 1.0f, 1.0f,-1.0f, // triangle 2 : begin + -1.0f,-1.0f,-1.0f, + -1.0f, 1.0f,-1.0f, // triangle 2 : end + 1.0f,-1.0f, 1.0f, + -1.0f,-1.0f,-1.0f, + 1.0f,-1.0f,-1.0f, + 1.0f, 1.0f,-1.0f, + 1.0f,-1.0f,-1.0f, + -1.0f,-1.0f,-1.0f, + -1.0f,-1.0f,-1.0f, + -1.0f, 1.0f, 1.0f, + -1.0f, 1.0f,-1.0f, + 1.0f,-1.0f, 1.0f, + -1.0f,-1.0f, 1.0f, + -1.0f,-1.0f,-1.0f, + -1.0f, 1.0f, 1.0f, + -1.0f,-1.0f, 1.0f, + 1.0f,-1.0f, 1.0f, + 1.0f, 1.0f, 1.0f, + 1.0f,-1.0f,-1.0f, + 1.0f, 1.0f,-1.0f, + 1.0f,-1.0f,-1.0f, + 1.0f, 1.0f, 1.0f, + 1.0f,-1.0f, 1.0f, + 1.0f, 1.0f, 1.0f, + 1.0f, 1.0f,-1.0f, + -1.0f, 1.0f,-1.0f, + 1.0f, 1.0f, 1.0f, + -1.0f, 1.0f,-1.0f, + -1.0f, 1.0f, 1.0f, + 1.0f, 1.0f, 1.0f, + -1.0f, 1.0f, 1.0f, + 1.0f,-1.0f, 1.0f + }; + + GLuint vertexbuffer; + glGenBuffers(1, &vertexbuffer); + glBindBuffer(GL_ARRAY_BUFFER, vertexbuffer); + glBufferData(GL_ARRAY_BUFFER, sizeof(g_vertex_buffer_data), g_vertex_buffer_data, GL_STATIC_DRAW); + + vec3s direction = {0.0f, 0.0f, -5.0f}; + + do + { + glClear( GL_COLOR_BUFFER_BIT ); + g + + if( glfwGetKey(window, GLFW_KEY_W) == GLFW_PRESS ) + { + eye.z -= 0.05f; + } + if( glfwGetKey(window, GLFW_KEY_S) == GLFW_PRESS ) + { + eye.z += 0.05f; + } + if( glfwGetKey(window, GLFW_KEY_D) == GLFW_PRESS ) + { + eye.x += 0.05f; + } + if( glfwGetKey(window, GLFW_KEY_A) == GLFW_PRESS ) + { + eye.x -= 0.05f; + } + if( glfwGetKey(window, GLFW_KEY_SPACE) == GLFW_PRESS ) + { + eye.y += 0.05f; + } + if( glfwGetKey(window, GLFW_KEY_LEFT_SHIFT) == GLFW_PRESS ) + { + eye.y -= 0.05f; + } + + + center = glms_vec3_add(eye, direction); + + mat4s view = glms_lookat(eye, center, up); + mat4s model = glms_mat4_identity(); + mat4s mvp = glms_mat4_mul(glms_mat4_mul(projection, view), model); + + glUseProgram(programID); + + glUniformMatrix4fv(matrixID, 1, GL_FALSE, &mvp); + + glEnableVertexAttribArray(0); + glBindBuffer(GL_ARRAY_BUFFER, vertexbuffer); + + glVertexAttribPointer( + 0, + 3, + GL_FLOAT, + GL_FALSE, + 0, + (void*)0 + ); + + glDrawArrays(GL_TRIANGLES, 0, 12*3); + glDisableVertexAttribArray(0); + + glfwSwapBuffers(window); + glfwPollEvents(); + } + while( glfwGetKey(window, GLFW_KEY_Q) | glfwGetKey(window, GLFW_KEY_ESCAPE) != GLFW_PRESS && !glfwWindowShouldClose(window)); + + glDeleteBuffers(1, &vertexbuffer); + glDeleteProgram(programID); + glDeleteVertexArrays(1, &vertexArrayID); + + glfwTerminate(); + + return 0; +} + +GLuint loadShaders(const char* vertexShaderPath, const char* fragmentShaderPath) +{ + char* vertexShaderCode = readTextFile( vertexShaderPath ); + char* fragmentShaderCode = readTextFile( fragmentShaderPath ); + + GLuint vertexShaderID = glCreateShader(GL_VERTEX_SHADER); + GLuint fragmentShaderID = glCreateShader(GL_FRAGMENT_SHADER); + + GLint result = GL_FALSE; + int infoLogLength; + + printf("Compiling vertex shader...\n"); + glShaderSource(vertexShaderID, 1, &vertexShaderCode, NULL); + glCompileShader(vertexShaderID); + + glGetShaderiv(vertexShaderID, GL_COMPILE_STATUS, &result); + glGetShaderiv(vertexShaderID, GL_INFO_LOG_LENGTH, &infoLogLength); + if( infoLogLength > 0 ) + { + char vertexShaderErrorMessage[infoLogLength + 1]; + glGetShaderInfoLog(vertexShaderID, infoLogLength, NULL, &vertexShaderErrorMessage); + printf("%s\n", &vertexShaderErrorMessage); + } + + printf("Compiling fragment shader...\n"); + glShaderSource(fragmentShaderID, 1, &fragmentShaderCode, NULL); + glCompileShader(fragmentShaderID); + + glGetShaderiv(fragmentShaderID, GL_COMPILE_STATUS, &result); + glGetShaderiv(fragmentShaderID, GL_INFO_LOG_LENGTH, &infoLogLength); + if( infoLogLength > 0 ) + { + char fragmentShaderErrorMessage[infoLogLength + 1]; + glGetShaderInfoLog(fragmentShaderID, infoLogLength, NULL, &fragmentShaderErrorMessage); + printf("%s\n", &fragmentShaderErrorMessage); + } + + printf("Linking program\n"); + GLuint programID = glCreateProgram(); + glAttachShader(programID, vertexShaderID); + glAttachShader(programID, fragmentShaderID); + glLinkProgram(programID); + + glGetProgramiv(programID, GL_LINK_STATUS, &result); + glGetProgramiv(programID, GL_INFO_LOG_LENGTH, &infoLogLength); + if( infoLogLength > 0 ) + { + char programErrorMessage[infoLogLength + 1]; + glGetProgramInfoLog(programID, infoLogLength, NULL, &programErrorMessage); + printf("%s\n", &programErrorMessage); + } + + free( vertexShaderCode ); + free( fragmentShaderCode ); + + glDetachShader( programID, vertexShaderID ); + glDetachShader( programID, fragmentShaderID ); + + glDeleteShader( vertexShaderID ); + glDeleteShader( fragmentShaderID ); + return programID; +} diff --git a/src/textfiles.c b/src/textfiles.c new file mode 100644 index 0000000..de6edf8 --- /dev/null +++ b/src/textfiles.c @@ -0,0 +1,46 @@ +#include +#include +#pragma once + + +// Reads an entire text file into a buffer. +// USES MALLOC BE SURE TO FREE +char* readTextFile(char* fname) +{ + FILE* inFile; + long fileLength; + char* fileBuffer; + size_t result; + + inFile = fopen( fname, "rb" ); + if( inFile == NULL ) + { + fprintf( stderr, "Failed open file, [%s].\n", fname ); + exit(1); + } + + fseek( inFile, 0, SEEK_END ); + fileLength = ftell( inFile ); + printf("File length: %d\n", fileLength); + rewind( inFile ); + + fileBuffer = (char*) malloc(sizeof(char) * (fileLength + 1)); + if( fileBuffer == NULL ) + { + fprintf( stderr, "Failed to allocate memory for reading the file, [%s].\n", fname); + exit(2); + } + + result = fread( fileBuffer, 1, fileLength, inFile ); + if( result != fileLength ) + { + fprintf( stderr, "Failed while reading [%s] into the file buffer.\n", fname); + exit(3); + } + + fileBuffer[fileLength] = '\0'; + + fclose( inFile ); + + return fileBuffer; +} diff --git a/src/textfiles.h b/src/textfiles.h new file mode 100644 index 0000000..409eb9e --- /dev/null +++ b/src/textfiles.h @@ -0,0 +1 @@ +char* readTextFile(char*); diff --git a/src/worldgen.c b/src/worldgen.c new file mode 100644 index 0000000..6b54831 --- /dev/null +++ b/src/worldgen.c @@ -0,0 +1,21 @@ +#include "worldgen.h" +#include + +#define ORDER 1 +#define RSQRT5 0.4472135954999579 +#define TWICE_RSQRT5 = 0.8944271909999159 + +worldMesh generateWorld(vec3s position) +{ + // placeholder struct for world mesh + worldMesh mesh; + vertex.count = 20 * ORDER * 3; // Icosahedron has 20 triangular sides + + mesh.vertices = (GLfloat*) malloc(sizeof(GLfloat) * mesh.count); + populateIcosphere(mesh, ORDER, 1); +} + +void populateIcosphere(worldMesh mesh, unsigned char order, float radius) +{ + +} diff --git a/src/worldgen.h b/src/worldgen.h new file mode 100644 index 0000000..08af7bd --- /dev/null +++ b/src/worldgen.h @@ -0,0 +1,15 @@ +#include + +typedef struct worldMesh { + long int count; + GLfloat* vertices; +} worldMesh; + + +/*! + * @brief top-level world generation function + * + * @param[in] pos the position of the center of the roughly spherical world + * @return the world mesh as a heap-allocated list of vertices. + */ +worldMesh generateWorld(vec3s pos); diff --git a/todo.md b/todo.md new file mode 100644 index 0000000..05c7b8b --- /dev/null +++ b/todo.md @@ -0,0 +1,45 @@ +# Planet Miner To Do List + +## Priority List +1. Render stuff + 1. Render a cube + 2. Render a bunch of cubes + 3. Diffuse lighting + 4. Ray tracing? +2. Procedural worlds + 1. Optimize rendering for this many cubes +3. Block game + 1. World editing + +## Idea Categories +1. Game Engine? + - Custom in C + - Started work on one, kinda liking it so far + - Don't really like pre-built game engines + - If I use one it'll likely be Godot + +2. Voxelization + - Zoning + - Each planet has its own coordinate system (non-voxelized) + - Material is distributed in amorphous blobs containing a certain percent resource + - Before world editing can begin, a work zone must be established to create a local voxelized coordinate system + - + +3. Progression + - The cores of planets exist as large non-voxelized structures + - Requires high level tools to mine + - Contain lots of resources + - Nickel + - Iron + - Asteroids can be mined like planet cores + - Less valuable resources + - Mostly rock + - Requires lower level tools + - Game starts on an Earth-like planet + - Make basic tool with sticks rope and stone fragments + - Stone fragments from smashing stones on rock + +4. Documentation +- Error Codes! +- In-Game Wiki-System +