+#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;
}