]> git.localhorst.tv Git - tacos.git/blob - src/tacos.cpp
basic floor idea
[tacos.git] / src / tacos.cpp
1 #include "app/assets.hpp"
2 #include "app/config.hpp"
3 #include "app/init.hpp"
4 #include "graphics/camera.hpp"
5 #include "graphics/shader.hpp"
6 #include "graphics/viewport.hpp"
7 #include "graphics/window.hpp"
8 #include "rand/SimplexNoise.hpp"
9 #include "world/Floor.hpp"
10
11 #include <iostream>
12 #include <GL/glew.h>
13 #include <glm/glm.hpp>
14 #include <glm/gtc/matrix_transform.hpp>
15
16 using namespace tacos;
17
18 int main(int argc, char *argv[]) {
19         Config config;
20         config.ReadArgs(argc, argv);
21
22         Init init(config);
23         AssetLoader asset_loader(config);
24         Window window(1440, 900);
25         Viewport viewport(1440, 900);
26
27         constexpr float noise_scale = 1.0f/64.0f;
28         constexpr float height_scale = 5.0f;
29
30         // === test ===
31         Shader floor_vert(asset_loader.LoadVertexShader("floor"));
32         Shader floor_frag(asset_loader.LoadFragmentShader("floor"));
33         Program floor_program;
34         floor_program.Attach(floor_vert);
35         floor_program.Attach(floor_frag);
36         floor_program.Link();
37         GLint mv_location = floor_program.UniformLocation("MV");
38         GLint mvp_location = floor_program.UniformLocation("MVP");
39
40         Floor floor(64, 50);
41         SimplexNoise noise(0);
42         for (int z = 0; z < floor.Depth(); ++z) {
43                 for (int x = 0; x < floor.Width(); ++x) {
44                         floor.SetElevation(x, z, noise(glm::vec3(x * noise_scale, 0.0f, z * noise_scale)) * height_scale);
45                 }
46         }
47         floor.GenerateVertices();
48
49         glm::vec3 focus(20.0f, 0.0f, 20.0f);
50         Camera camera(focus);
51
52         glm::mat4 M;
53         glm::mat4 V;
54         glm::mat4 MV;
55         glm::mat4 MVP;
56
57         floor_program.Use();
58
59         bool running = true;
60         SDL_Event event;
61         while (running) {
62                 while (SDL_PollEvent(&event)) {
63                         switch (event.type) {
64                                 case SDL_QUIT:
65                                         running = false;
66                                         break;
67                                 case SDL_WINDOWEVENT:
68                                         if (event.window.event == SDL_WINDOWEVENT_RESIZED) {
69                                                 viewport.Resize(event.window.data1, event.window.data2);
70                                         }
71                                         break;
72                                 default:
73                                         break;
74                         }
75                 }
76                 V = camera.View();
77                 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
78                 for (int z = 0; z < floor.VAODepth(); ++z) {
79                         for (int x = 0; x < floor.VAOWidth(); ++x) {
80                                 M = glm::translate(glm::mat4(1.0f), floor.VAOPosition(x, z));
81                                 MV = camera.View() * M;
82                                 MVP = viewport.Perspective() * MV;
83                                 floor_program.Uniform(mv_location, MV);
84                                 floor_program.Uniform(mvp_location, MVP);
85                                 floor.DrawVAO(x, z);
86                         }
87                 }
88                 window.Flip();
89         }
90
91         return 0;
92 }