]> git.localhorst.tv Git - tacos.git/blobdiff - src/tacos.cpp
basic floor idea
[tacos.git] / src / tacos.cpp
index 7e0976f6dab2a54d4d247802ace1d1019896b578..580becb9caa0e391a5b779de2010976a9609ad22 100644 (file)
@@ -1,10 +1,92 @@
+#include "app/assets.hpp"
+#include "app/config.hpp"
 #include "app/init.hpp"
-#include "app/window.hpp"
+#include "graphics/camera.hpp"
+#include "graphics/shader.hpp"
+#include "graphics/viewport.hpp"
+#include "graphics/window.hpp"
+#include "rand/SimplexNoise.hpp"
+#include "world/Floor.hpp"
+
+#include <iostream>
+#include <GL/glew.h>
+#include <glm/glm.hpp>
+#include <glm/gtc/matrix_transform.hpp>
 
 using namespace tacos;
 
 int main(int argc, char *argv[]) {
-       Init init;
-       Window window;
+       Config config;
+       config.ReadArgs(argc, argv);
+
+       Init init(config);
+       AssetLoader asset_loader(config);
+       Window window(1440, 900);
+       Viewport viewport(1440, 900);
+
+       constexpr float noise_scale = 1.0f/64.0f;
+       constexpr float height_scale = 5.0f;
+
+       // === test ===
+       Shader floor_vert(asset_loader.LoadVertexShader("floor"));
+       Shader floor_frag(asset_loader.LoadFragmentShader("floor"));
+       Program floor_program;
+       floor_program.Attach(floor_vert);
+       floor_program.Attach(floor_frag);
+       floor_program.Link();
+       GLint mv_location = floor_program.UniformLocation("MV");
+       GLint mvp_location = floor_program.UniformLocation("MVP");
+
+       Floor floor(64, 50);
+       SimplexNoise noise(0);
+       for (int z = 0; z < floor.Depth(); ++z) {
+               for (int x = 0; x < floor.Width(); ++x) {
+                       floor.SetElevation(x, z, noise(glm::vec3(x * noise_scale, 0.0f, z * noise_scale)) * height_scale);
+               }
+       }
+       floor.GenerateVertices();
+
+       glm::vec3 focus(20.0f, 0.0f, 20.0f);
+       Camera camera(focus);
+
+       glm::mat4 M;
+       glm::mat4 V;
+       glm::mat4 MV;
+       glm::mat4 MVP;
+
+       floor_program.Use();
+
+       bool running = true;
+       SDL_Event event;
+       while (running) {
+               while (SDL_PollEvent(&event)) {
+                       switch (event.type) {
+                               case SDL_QUIT:
+                                       running = false;
+                                       break;
+                               case SDL_WINDOWEVENT:
+                                       if (event.window.event == SDL_WINDOWEVENT_RESIZED) {
+                                               viewport.Resize(event.window.data1, event.window.data2);
+                                       }
+                                       break;
+                               default:
+                                       break;
+                       }
+               }
+               V = camera.View();
+               glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+               for (int z = 0; z < floor.VAODepth(); ++z) {
+                       for (int x = 0; x < floor.VAOWidth(); ++x) {
+                               M = glm::translate(glm::mat4(1.0f), floor.VAOPosition(x, z));
+                               MV = camera.View() * M;
+                               MVP = viewport.Perspective() * MV;
+                               floor_program.Uniform(mv_location, MV);
+                               floor_program.Uniform(mvp_location, MVP);
+                               floor.DrawVAO(x, z);
+                       }
+               }
+               window.Flip();
+       }
+
        return 0;
 }