Search code examples
c++openglglm-math

glm : is not a type or namespace? Confusing bug in my header


I'm following this tutorial here (I'm aware that theres changes from glfw 2 to 3 that haven't been defined in this tutorial, and I've corrected those aspects.

However, when trying to compile after having what should be working, I'm getting an error in that my header file isn't recognising the glm as a namespace, and so it's assuming int which breaks the rest of the program.

My header is as follows:

#ifndef CONTROLS_HPP
#define CONTROLS_HPP

 void computeMatricesFromInputs();
 glm::mat4 getViewMatrix();
 glm::mat4 getProjectionMatrix();

#endif

and my .cpp file is this:

// Include GLFW
#include <glfw3.h>
extern GLFWwindow* window;

// Include GLM
#include <glm/glm.hpp>
#include <glm/gtc/matrix_transform.hpp>
#include <glm/gtx/transform.hpp>
using namespace glm;

#include "Outputs/controls.hpp"

glm::mat4 ViewMatrix;
glm::mat4 ProjectionMatrix;

glm::mat4 getViewMatrix(){
return ViewMatrix;
}
glm::mat4 getProjectionMatrix(){
return ProjectionMatrix;
}


// Initial position : on +Z
glm::vec3 position = glm::vec3(0, 0, 5);
// Initial horizontal angle : toward -Z
float horizontalAngle = 3.14f;
// Initial vertical angle : none
float verticalAngle = 0.0f;
// Initial Field of View
float initialFoV = 45.0f;

float speed = 3.0f; // 3 units / second
float mouseSpeed = 0.005f;



void computeMatricesFromInputs(){

// glfwGetTime is called only once, the first time this function is called
static double lastTime = glfwGetTime();

// Compute time difference between current and last frame
double currentTime = glfwGetTime();
float deltaTime = float(currentTime - lastTime);

// Get mouse position
double xpos, ypos;
glfwGetCursorPos(window, &xpos, &ypos);

// Reset mouse position for next frame
glfwSetCursorPos(window, 1024 / 2, 768 / 2);

// Compute new orientation
horizontalAngle += mouseSpeed * float(1024 / 2 - xpos);
verticalAngle += mouseSpeed * float(768 / 2 - ypos);

// Direction : Spherical coordinates to Cartesian coordinates conversion
glm::vec3 direction(
    cos(verticalAngle) * sin(horizontalAngle),
    sin(verticalAngle),
    cos(verticalAngle) * cos(horizontalAngle)
    );

// Right vector
glm::vec3 right = glm::vec3(
    sin(horizontalAngle - 3.14f / 2.0f),
    0,
    cos(horizontalAngle - 3.14f / 2.0f)
    );

// Up vector
glm::vec3 up = glm::cross(right, direction);

// Move forward
if (glfwGetKey(window, GLFW_KEY_UP) == GLFW_PRESS){
    position += direction * deltaTime * speed;
}
// Move backward
if (glfwGetKey(window, GLFW_KEY_DOWN) == GLFW_PRESS){
    position -= direction * deltaTime * speed;
}
// Strafe right
if (glfwGetKey(window, GLFW_KEY_RIGHT) == GLFW_PRESS){
    position += right * deltaTime * speed;
}
// Strafe left
if (glfwGetKey(window, GLFW_KEY_LEFT) == GLFW_PRESS){
    position -= right * deltaTime * speed;
}

float FoV = initialFoV;

// Projection matrix : 45° Field of View, 4:3 ratio, display range : 0.1 unit <-> 100 units
ProjectionMatrix = glm::perspective(FoV, 4.0f / 3.0f, 0.1f, 100.0f);
// Camera matrix
ViewMatrix = glm::lookAt(
    position,           // Camera is here
    position + direction, // and looks here : at the same position, plus "direction"
    up                  // Head is up (set to 0,-1,0 to look upside-down)
    );

// For the next frame, the "last time" will be "now"
lastTime = currentTime;
}

I'm pretty confused whats going on here, all other aspects using glm have been completely fine.


Solution

  • This question has been answered by Borgleader for me (thanks!). It was solved by using the include for glm in the header too.