From 6b8af9cf83851c075c6c9514b1deaa931c2b19a4 Mon Sep 17 00:00:00 2001 From: Thomas Guillermo Albers Raviola Date: Fri, 16 Jan 2026 23:02:32 +0100 Subject: Initial commit --- 07-july/src/main.c | 227 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 227 insertions(+) create mode 100644 07-july/src/main.c (limited to '07-july/src/main.c') diff --git a/07-july/src/main.c b/07-july/src/main.c new file mode 100644 index 0000000..d119764 --- /dev/null +++ b/07-july/src/main.c @@ -0,0 +1,227 @@ +#include "game.h" +#include "math/vector3f.h" +#include "math/vector2f.h" +#include "math/matrix4x4.h" +#include "input.h" +#include "util/util.h" +#include "util/util_time.h" +#include "light.h" +#include "renderer/renderer.h" + +/* + TODO: Shadows + Texture Atlases + + improve math package + repair gui on renderer.c +*/ + +void LoadResources(game_t* game); +void Draw(game_t* game); +void ProcessInput(game_t* game); +void CleanUp(game_t* game); + +int main(int args, char* argv[]) +{ + SDL_Init(SDL_INIT_EVERYTHING); + + game_t game; + game.gameState = RUNNING; + game.window = Window_Create("Test", WINDOW_WIDTH, WINDOW_HEIGHT); + + if(glewInit() != GLEW_OK) + Util_FatalError("Glew could no be started!"); + + glEnable(GL_DEPTH_TEST); + glEnable(GL_CULL_FACE); + glCullFace(GL_BACK); + SDL_GL_SetSwapInterval(0); + //glPolygonMode( GL_FRONT_AND_BACK, GL_LINE ); + + game.shaderProgram.ID = Shader_CompileShaders("resources/shaders/shader.vert", + "resources/shaders/shader.frag"); + + game.terrainProgram.ID = Shader_CompileShaders("resources/shaders/terrainShader.vert", + "resources/shaders/terrainShader.frag"); + glUseProgram(game.shaderProgram.ID); + + Camera_Init(&game.camera); + + LoadResources(&game); + glClearColor(0.0f, 0.0f, 0.0f, 1.0f); + + Time_Init(); + Time_SetMaxFramesPerSecond(6000); + while(game.gameState != EXIT) + { + Time_Begin(); + ProcessInput(&game); + Player_Update(&game.player, game.terrain); + Draw(&game); + + float FPS = Time_End(); + + if( !( Time_GetCountedFrames() % (int)FPS ) ) { + fprintf(stderr, "FPS: %.4f\n", FPS); + } + } + + Window_Destroy(game.window); + CleanUp(&game); + SDL_Quit(); + return 0; +} + +void CleanUp(game_t* game) +{ + Shape_Free(game->entsShape); + Texture_Destroy(game->entsTexture); + Terrain_Destroy(game->terrain); + + Shader_Destroy(game->shaderProgram.ID); + Shader_Destroy(game->terrainProgram.ID); + Render_Quit(); +} + +void LoadResources(game_t* game) +{ + Render_Init(); + Uint32 start = SDL_GetTicks(); + + game->entsShape = Shape_MakeCube(); + game->entsTexture = Texture_Create("resources/textures/gato.png"); + + Player_Init(&game->player); + game->player.entity.texture = game->entsTexture; + game->player.entity.shape = game->entsShape; + + { + vec3_t position = { 0.0f, 3.0f, 0.0f }; + float rotation[3] = { 0.0f, 45.0f, 45.0f }; + game->ents[0].position = position; + game->ents[0].rotX = rotation[0]; + game->ents[0].rotY = rotation[1]; + game->ents[0].rotZ = rotation[2]; + game->ents[0].shape = game->entsShape; + game->ents[0].texture = game->entsTexture; + } + + { + vec3_t position = { -400.0f, 0.0f, -400.0f }; + texture_t *blendmap = Texture_Create("resources/textures/blendmap.png"); + TerrainTexturePack pack = + { + { + Texture_Create("resources/textures/soil1.png"), + Texture_Create("resources/textures/soil2.png"), + Texture_Create("resources/textures/soil4.png"), + Texture_Create("resources/textures/soil3.png"), + } + }; + game->terrain = Terrain_Create(800, 800, "resources/textures/heightmap.png", blendmap, &pack); + game->terrain->position = position; + } + + /* Shader Layouts */ + + game->shaderProgram.Texture = Shader_GetUniformLocation(game->shaderProgram.ID, "Texture"); + game->shaderProgram.modelToWorld = Shader_GetUniformLocation(game->shaderProgram.ID, "Matrix_modelToWorld"); + game->shaderProgram.totalTransform = Shader_GetUniformLocation(game->shaderProgram.ID, "Matrix_totalTransform"); + game->shaderProgram.lightPosition = Shader_GetUniformLocation(game->shaderProgram.ID, "lightPosition"); + game->shaderProgram.lightColor = Shader_GetUniformLocation(game->shaderProgram.ID, "lightColor"); + game->shaderProgram.lightAttenuation = Shader_GetUniformLocation(game->shaderProgram.ID, "attenuation"); + + game->terrainProgram.modelToWorld = Shader_GetUniformLocation(game->terrainProgram.ID, "Matrix_modelToWorld"); + game->terrainProgram.totalTransform = Shader_GetUniformLocation(game->terrainProgram.ID, "Matrix_totalTransform"); + game->terrainProgram.lightPosition = Shader_GetUniformLocation(game->terrainProgram.ID, "lightPosition"); + game->terrainProgram.lightColor = Shader_GetUniformLocation(game->terrainProgram.ID, "lightColor"); + game->terrainProgram.lightAttenuation = Shader_GetUniformLocation(game->terrainProgram.ID, "attenuation"); + + game->terrainProgram.Texture_Background = Shader_GetUniformLocation(game->terrainProgram.ID, "Texture_Background"); + game->terrainProgram.Texture_BlendMap = Shader_GetUniformLocation(game->terrainProgram.ID, "Texture_BlendMap"); + game->terrainProgram.Texture_R = Shader_GetUniformLocation(game->terrainProgram.ID, "Texture_R"); + game->terrainProgram.Texture_G = Shader_GetUniformLocation(game->terrainProgram.ID, "Texture_G"); + game->terrainProgram.Texture_B = Shader_GetUniformLocation(game->terrainProgram.ID, "Texture_B"); + + fprintf(stderr, "Loading time: %u (ms)\n", SDL_GetTicks() - start); +} + +void Draw(game_t* game) +{ + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + + /*We upload all the light vectors*/ + static light_t diffuseLight[4] = + { + { {0.0f, 20.0f, 0.0f}, {1.0f, 1.0f, 1.0f, 1.0f}, {1.0f, 0.01f, 0.002f} }, + { {10.0f, 20.0f, 0.0f}, {1.0f, 0.0f, 0.0f, 1.0f}, {1.0f, 0.01f, 0.002f} }, + { {20.0f, 20.0f, 0.0f}, {0.0f, 0.0f, 1.0f, 1.0f}, {1.0f, 0.01f, 0.002f} }, + { {30.0f, 20.0f, 0.0f}, {0.0f, 1.0f, 0.0f, 1.0f}, {1.0f, 0.01f, 0.002f} }, + }; + + Shader_SetUniformVec3(game->shaderProgram.ID, "World_eyePosition", (float*)&game->camera.position); + Render_LoadLights(&game->shaderProgram, diffuseLight, 4); + + mat4_t viewMatrix, projectionMatrix, projectedViewMatrix; + + viewMatrix = Camera_GetModelToViewMatrix(&game->camera); + projectionMatrix = mat4_perspective(60.0f, WINDOW_ASPECT_RATIO, 0.1f, 300.0f); + projectedViewMatrix = mat4_mul(&projectionMatrix, &viewMatrix); + + Render_DrawEntity(&game->shaderProgram, &projectedViewMatrix, &game->player.entity); + Render_DrawEntity(&game->shaderProgram, &projectedViewMatrix, &game->ents[0]); + + glUseProgram(game->terrainProgram.ID); + + Shader_SetUniformVec3(game->terrainProgram.ID, "World_eyePosition", (float*)&game->camera.position); + Render_LoadLights(&game->terrainProgram, diffuseLight, 4); + + Render_DrawTerrain(&game->terrainProgram, &projectedViewMatrix, game->terrain); + + glUseProgram(game->shaderProgram.ID); + + Window_Update(game->window); +} + +void ProcessInput(game_t* game) +{ + vec2_t mousePosition; + SDL_Event e; + while(SDL_PollEvent(&e)) + { + switch(e.type) + { + case SDL_QUIT: + game->gameState = EXIT; + break; + + case SDL_MOUSEMOTION: + mousePosition = vec2_create(e.motion.x, e.motion.y); + Camera_MouseUpdate(&game->camera, &mousePosition); + break; + + case SDL_KEYDOWN: + Input_PressKey(e.key.keysym.scancode); + break; + + case SDL_KEYUP: + Input_ReleaseKey(e.key.keysym.scancode); + break; + } + + if(Input_isKeyPressed(SDL_SCANCODE_UP)) + Camera_Move_Foward(&game->camera); + + if(Input_isKeyPressed(SDL_SCANCODE_DOWN)) + Camera_Move_Backward(&game->camera); + + if(Input_isKeyPressed(SDL_SCANCODE_LEFT)) + Camera_Move_Left(&game->camera); + + if(Input_isKeyPressed(SDL_SCANCODE_RIGHT)) + Camera_Move_Right(&game->camera); + + if(Input_isKeyPressed(SDL_SCANCODE_ESCAPE)) + game->gameState = EXIT; + } +} -- cgit v1.2.3