BSP/NAV viewer
[tar-legacy.git] / MCDV / main.cpp
index 2501edc49e4b3711d105eab3a9acc2cd805e9e36..dd519a31738ac6945d54301fa2a74321ecae9090 100644 (file)
@@ -10,6 +10,9 @@
 #include "GLFWUtil.hpp"
 
 #include "vbsp.hpp"
+#include "nav.hpp"
+#include "radar.hpp"
+#include "util.h"
 
 #include "Shader.hpp"
 #include "Texture.hpp"
@@ -27,8 +30,8 @@ void mouse_callback(GLFWwindow* window, double xpos, double ypos);
 void mouse_button_callback(GLFWwindow* window, int button, int action, int mods);
 void scroll_callback(GLFWwindow* window, double xoffset, double yoffset);
 
-int window_width = 800;
-int window_height = 600;
+int window_width = 1024;
+int window_height = 1024;
 
 float deltaTime = 0.0f;
 float lastFrame = 0.0f;
@@ -40,11 +43,85 @@ double mousey;
 
 Camera camera;
 
-int main() {
+int SV_WIREFRAME = 0; //0: off 1: overlay 2: only
+int SV_RENDERMODE = 0;
+int SV_PERSPECTIVE = 0;
+
+float M_HEIGHT_MIN = 0.0f;
+float M_HEIGHT_MAX = 10.0f;
+
+float M_CLIP_NEAR = 0.1f;
+float M_CLIP_FAR = 100.0f;
+
+bool SV_DRAW_BSP = true;
+bool SV_DRAW_NAV = false;
+
+Radar* _radar;
+
+float M_ORTHO_SIZE = 20.0f;
+
+int main(int argc, char* argv[]) {
+       std::string _FILE_BSP = "";
+       std::string _FILE_NAV = "";
+
+       for (int i = 1; i < argc; ++i) {
+               char* _arg = argv[i];
+               std::string arg = _arg;
+
+               if (split(arg, '.').back() == "bsp") {
+                       _FILE_BSP = arg;
+               }
+
+               if (split(arg, '.').back() == "nav") {
+                       _FILE_NAV = arg;
+               }
+       }
+
+       /*
+       std::vector<glm::vec3> data = {
+               glm::vec3(0,0,-5),
+               glm::vec3(0,0,-4.5),
+               glm::vec3(10,-2,0),
+               glm::vec3(-3,5,0),
+               glm::vec3(0,2,-9),
+               glm::vec3(3,-5,0),
+               glm::vec3(-2,0,4),
+               glm::vec3(1,4,5),
+               glm::vec3(1,4.5f, 5),
+               glm::vec3(4,-5,0),
+               glm::vec3(0,4,-4),
+               glm::vec3(0,6,4),
+               glm::vec3(0,10,0),
+               glm::vec3(-2,-16,0),
+               glm::vec3(0,-4,-8),
+               glm::vec3(1,1,0),
+               glm::vec3(3,3,-4),
+               glm::vec3(0,4,0),
+               glm::vec3(0,-1,0)
+       };
+
+       octree::Tree test(data, 3);
+
+       octree::Node* tNode = test.head.getNodeByVec(glm::vec3(0, 0, -5));
+       std::vector<glm::vec3> points = tNode->getContainedValues();
+
+       for (int i = 0; i < points.size(); i++) {
+               glm::vec3 p = points[i];
+
+               std::cout << p.x << " : " << p.y << " : " << p.z << std::endl;
+       }
+
+       std::cout << "Total entries: " << test.head.getEntryCount() << std::endl;
+
+       system("PAUSE");
+       return 0;
+       */
+
+
 
 #pragma region Initialisation
 
-       std::cout << "Harry Game Engine" << std::endl;
+       std::cout << "Bigman Engine" << std::endl;
 
        //Initialize OpenGL
        glfwInit();
@@ -54,7 +131,7 @@ int main() {
        //glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);
 
        //Creating the window
-       GLFWwindow* window = glfwCreateWindow(window_width, window_height, "bigman engine :: de_canals.bsp", NULL, NULL);
+       GLFWwindow* window = glfwCreateWindow(window_width, window_height, "bigman engine", NULL, NULL);
 
        //Check if window open
        if (window == NULL)
@@ -71,7 +148,7 @@ int main() {
        }
 
        //Viewport
-       glViewport(0, 0, 800, 600);
+       glViewport(0, 0, 1024, 1024);
        glfwSetFramebufferSizeCallback(window, framebuffer_size_callback);
 
        //Mouse
@@ -86,101 +163,38 @@ int main() {
        glEnable(GL_DEPTH_TEST);
 
        //The unlit shader thing
-       Shader shader_unlit("unlit.vs", "unlit.fs");
-       Shader shader_lit("depth.vs", "depth.fs");
+       Shader shader_unlit("shaders/unlit.vs", "shaders/unlit.fs");
+       Shader shader_lit("shaders/depth.vs", "shaders/depth.fs");
 
        //Mesh handling -----------------------------------------------------------------------------
 
-       vbsp_level bsp_map("de_canals.bsp", true);
-       Mesh t200(bsp_map.generate_bigmesh());
-
-       //test2.generate_mesh(0);
-       
-       std::cout << "GENERATED" << std::endl;
-
-       std::vector<float> m_cube_verts = {
-               // positions          // normals          rds
-               -0.5f, -0.5f, -0.5f,  0.0f,  0.0f, -1.0f,
-               0.5f, -0.5f, -0.5f,  0.0f,  0.0f, -1.0f,
-               0.5f,  0.5f, -0.5f,  0.0f,  0.0f, -1.0f,
-               0.5f,  0.5f, -0.5f,  0.0f,  0.0f, -1.0f,
-               -0.5f,  0.5f, -0.5f,  0.0f,  0.0f, -1.0f,
-               -0.5f, -0.5f, -0.5f,  0.0f,  0.0f, -1.0f,
-
-               -0.5f, -0.5f,  0.5f,  0.0f,  0.0f, 1.0f,
-               0.5f, -0.5f,  0.5f,  0.0f,  0.0f, 1.0f,
-               0.5f,  0.5f,  0.5f,  0.0f,  0.0f, 1.0f,
-               0.5f,  0.5f,  0.5f,  0.0f,  0.0f, 1.0f,
-               -0.5f,  0.5f,  0.5f,  0.0f,  0.0f, 1.0f,
-               -0.5f, -0.5f,  0.5f,  0.0f,  0.0f, 1.0f,
-
-               -0.5f,  0.5f,  0.5f, -1.0f,  0.0f,  0.0f,
-               -0.5f,  0.5f, -0.5f, -1.0f,  0.0f,  0.0f,
-               -0.5f, -0.5f, -0.5f, -1.0f,  0.0f,  0.0f,
-               -0.5f, -0.5f, -0.5f, -1.0f,  0.0f,  0.0f,
-               -0.5f, -0.5f,  0.5f, -1.0f,  0.0f,  0.0f,
-               -0.5f,  0.5f,  0.5f, -1.0f,  0.0f,  0.0f,
-
-               0.5f,  0.5f,  0.5f,  1.0f,  0.0f,  0.0f,
-               0.5f,  0.5f, -0.5f,  1.0f,  0.0f,  0.0f,
-               0.5f, -0.5f, -0.5f,  1.0f,  0.0f,  0.0f,
-               0.5f, -0.5f, -0.5f,  1.0f,  0.0f,  0.0f,
-               0.5f, -0.5f,  0.5f,  1.0f,  0.0f,  0.0f,
-               0.5f,  0.5f,  0.5f,  1.0f,  0.0f,  0.0f,
-
-               -0.5f, -0.5f, -0.5f,  0.0f, -1.0f,  0.0f,
-               0.5f, -0.5f, -0.5f,  0.0f, -1.0f,  0.0f,
-               0.5f, -0.5f,  0.5f,  0.0f, -1.0f,  0.0f,
-               0.5f, -0.5f,  0.5f,  0.0f, -1.0f,  0.0f,
-               -0.5f, -0.5f,  0.5f,  0.0f, -1.0f,  0.0f,
-               -0.5f, -0.5f, -0.5f,  0.0f, -1.0f,  0.0f,
-
-               -0.5f,  0.5f, -0.5f,  0.0f,  1.0f,  0.0f,
-               0.5f,  0.5f, -0.5f,  0.0f,  1.0f,  0.0f,
-               0.5f,  0.5f,  0.5f,  0.0f,  1.0f,  0.0f,
-               0.5f,  0.5f,  0.5f,  0.0f,  1.0f,  0.0f,
-               -0.5f,  0.5f,  0.5f,  0.0f,  1.0f,  0.0f,
-               -0.5f,  0.5f, -0.5f,  0.0f,  1.0f,  0.0f,
-       };
-       Mesh cube(m_cube_verts);
-
-       std::vector<GameObject> level_meshes = std::vector<GameObject>();
-
-       Mesh hallo;
-
-       for (int i = 0; i < bsp_map.texDataString.size(); i++) {
-               continue;
-               basic_mesh test_bsp_mesh = bsp_map.generate_mesh(i);
-               std::vector<float> verts = std::vector<float>();
-               for (int x = 0; x < test_bsp_mesh.vertices.size(); x++) {
-                       verts.push_back(test_bsp_mesh.vertices[x].x);
-                       verts.push_back(test_bsp_mesh.vertices[x].y);
-                       verts.push_back(test_bsp_mesh.vertices[x].z);
-                       verts.push_back(test_bsp_mesh.normals[x].x);
-                       verts.push_back(test_bsp_mesh.normals[x].y);
-                       verts.push_back(test_bsp_mesh.normals[x].z);
-               }
-
-               if (verts.size() < 3)
-                       continue;
+       Mesh* t200 = NULL;
+       Mesh* t201 = NULL;
 
-               Mesh* m = new Mesh(verts);
-               GameObject obj(m);
+       if (_FILE_BSP != ""){
+               vbsp_level bsp_map(_FILE_BSP, true);
+               t200 = new Mesh(bsp_map.generate_bigmesh());
+       }
 
-               level_meshes.push_back(obj);
+       if (_FILE_NAV != "") {
+               Nav::Mesh bob(_FILE_NAV);
+               t201 = new Mesh(bob.generateGLMesh());
        }
 
+       //Radar rtest("de_overpass.txt");
+       //_radar = &rtest;
 
-       std::cout << level_meshes.size() << std::endl;
 
-       std::cout << "MESH GENERATION COMPLETE" << std::endl;
 
 
+       //VertAlphaMesh t300(vbsp_level::genVertAlpha(t200.vertices, t201.vertices));
 
        util_keyHandler keys(window);
        //Create camera (test)
        camera = Camera(&keys);
 
+       glEnable(GL_CULL_FACE);
+       glCullFace(GL_FRONT);
 
 
        //The main loop
@@ -197,31 +211,49 @@ int main() {
                //Rendering commands
                glClearColor(0.05f, 0.05f, 0.05f, 1.0f);
                glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
-               glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
+               glPolygonMode(GL_FRONT, GL_FILL);
+
 
-               glm::vec3 sunColor = glm::vec3(2.0f, 2.0f, 2.0f);
 
                shader_lit.use();
-               shader_lit.setVec3("directional.direction", 0.3f, -0.5f, -0.4f);
-               shader_lit.setVec3("directional.ambient", sunColor * 0.2f);
-               shader_lit.setVec3("directional.diffuse", sunColor * 0.4f);
-               shader_lit.setVec3("viewPos", camera.cameraPos);
+               if(SV_PERSPECTIVE == 0)
+                       shader_lit.setMatrix("projection", glm::perspective(glm::radians(90.0f / 2), (float)window_width / (float)window_height, M_CLIP_NEAR, M_CLIP_FAR));
+               else
+                       shader_lit.setMatrix("projection", glm::ortho(-M_ORTHO_SIZE, M_ORTHO_SIZE, -M_ORTHO_SIZE, M_ORTHO_SIZE, M_CLIP_NEAR, M_CLIP_FAR));
 
-               shader_lit.setMatrix("projection", camera.getProjectionMatrix());
                shader_lit.setMatrix("view", camera.getViewMatrix());
 
                glm::mat4 model = glm::mat4();
                shader_lit.setMatrix("model", model);
 
                shader_lit.setVec3("color", 0.0f, 0.0f, 1.0f);
+               shader_lit.setFloat("HEIGHT_MIN", M_HEIGHT_MIN);
+               shader_lit.setFloat("HEIGHT_MAX", M_HEIGHT_MAX);
+
+               
+               if (SV_RENDERMODE == 0)
+                       if(t200 != NULL)
+                               t200->Draw();
+               
+               if(SV_RENDERMODE == 1)
+                       if (t201 != NULL)
+                               t201->Draw();
+
+               
+                       
+
+               //t300.Draw();
+
+               //glPolygonMode(GL_FRONT, GL_LINE);
+               //
+               //shader_unlit.use();
+               //shader_unlit.setMatrix("projection", camera.getProjectionMatrix());
+               //shader_unlit.setMatrix("view", camera.getViewMatrix());
+               //shader_unlit.setMatrix("model", model);
+               //shader_unlit.setVec3("color", 0.0f, 0.0f, 1.0f);
+               //
+               //t201.Draw();
 
-               //Do drawing logic
-               for (int i = 0; i < level_meshes.size(); i++) {
-                       level_meshes[i].DrawMesh();
-               }
-               hallo.Draw();
-               cube.Draw();
-               t200.Draw();
 
                //Check and call events, swap buffers
                glfwSwapBuffers(window);
@@ -241,10 +273,70 @@ void framebuffer_size_callback(GLFWwindow* window, int width, int height)
        window_height = height;
 }
 
+bool K_CONTROL_MIN = false;
+bool K_CONTROL_MAX = false;
+int SV_EDITMODE = 0;
+
+void setWindowTitle() {
+       std::string title = "BigmanEngine | ";
+
+}
+
 void processInput(GLFWwindow* window, util_keyHandler keys)
 {
        if (keys.getKeyDown(GLFW_KEY_ESCAPE))
                glfwSetWindowShouldClose(window, true);
+
+       if (keys.getKeyDown(GLFW_KEY_1)) {
+               SV_EDITMODE = 0; glfwSetWindowTitle(window, "Bigman Engine :: EDITING MIN");
+       }
+       if (keys.getKeyDown(GLFW_KEY_2)) {
+               SV_EDITMODE = 1; glfwSetWindowTitle(window, "Bigman Engine :: EDITING MAX");
+       }
+       if (keys.getKeyDown(GLFW_KEY_3)) {
+               //SV_EDITMODE = 2; glfwSetWindowTitle(window, "Bigman Engine :: de_overpass.bsp - EDITING NEAR");
+       }
+       if (keys.getKeyDown(GLFW_KEY_4)) {
+               //SV_EDITMODE = 3; glfwSetWindowTitle(window, "Bigman Engine :: de_overpass.bsp - EDITING FAR");
+       }
+
+       if (keys.getKeyDown(GLFW_KEY_5)) {
+               SV_PERSPECTIVE = 0; glfwSetWindowTitle(window, "Bigman Engine :: perspective");
+       }
+
+       if (keys.getKeyDown(GLFW_KEY_6)) {
+               SV_PERSPECTIVE = 1; glfwSetWindowTitle(window, "Bigman Engine :: ortho");
+       }
+
+
+       if (keys.getKeyDown(GLFW_KEY_7)) {
+               SV_RENDERMODE = 0; glfwSetWindowTitle(window, "Bigman Engine :: .bsp");
+
+               glEnable(GL_CULL_FACE);
+       }
+
+       if (keys.getKeyDown(GLFW_KEY_8)) {
+               SV_RENDERMODE = 1; glfwSetWindowTitle(window, "Bigman Engine :: .nav");
+
+               glDisable(GL_CULL_FACE);
+       }
+
+       if (keys.getKeyDown(GLFW_KEY_9)) {
+               SV_EDITMODE = 4;
+               //M_ORTHO_SIZE = (_radar->scale / 0.1f) / 2.0f;
+               //camera.cameraPos.x = (-_radar->pos_x ) * 0.01f;
+               //camera.cameraPos.z = (_radar->pos_y - 1024) * 0.01f;
+               glfwSetWindowTitle(window, "Bigman Engine :: EDITING ORTHO SCALE");
+
+       }
+
+       if (keys.getKeyDown(GLFW_KEY_0)) {
+               camera.yaw = 0;
+               camera.pitch = -90;
+               camera.mouseUpdate(0, 0, true);
+               //camera.cameraFront = glm::vec3(0, 0, -1);
+               //camera.cameraUp = glm::vec3(0, 1, 0);
+       }
 }
 
 void mouse_callback(GLFWwindow* window, double xpos, double ypos)
@@ -255,7 +347,20 @@ void mouse_callback(GLFWwindow* window, double xpos, double ypos)
 
 void scroll_callback(GLFWwindow* window, double xoffset, double yoffset)
 {
-       camera.fov = glm::clamp(camera.fov + (float)yoffset, 2.0f, 90.0f);
+       //camera.fov = glm::clamp(camera.fov + (float)yoffset, 2.0f, 90.0f);
+
+       if(SV_EDITMODE == 0)
+               M_HEIGHT_MIN += (float)yoffset * 0.1f;
+
+       if (SV_EDITMODE == 1)
+               M_HEIGHT_MAX += (float)yoffset * 0.1f;
+
+       if (SV_EDITMODE == 4)
+               M_ORTHO_SIZE += (float)yoffset * 0.1f;
+
+       //if (SV_EDITMODE == 2) M_CLIP_NEAR += (float)yoffset * 0.1f;
+
+       //if (SV_EDITMODE == 3) M_CLIP_FAR += (float)yoffset * 0.1f;
 }
 
 void mouse_button_callback(GLFWwindow* window, int button, int action, int mods)