Advertisement
Guest User

Untitled

a guest
Mar 28th, 2020
111
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.00 KB | None | 0 0
  1. //Bobur's edits
  2.     class ObjectMover : public VEEventListenerGLFW {
  3.     private:
  4.         bool virtual onKeyboard(veEvent event) {
  5.            
  6.             ///create some default constants for the actions
  7.             //glm::vec3 positionCube = getSceneManagerPointer()->getSceneNode("The Cube Parent")->getPosition();
  8.             glm::vec4 translate = glm::vec4(0.0, 0.0, 0.0, 1.0);    //total translation
  9.             glm::vec4 rot4 = glm::vec4(1.0);                        //total rotation around the axes, is 4d !
  10.             float angle = 0.0;
  11.             float rotSpeed = 2.0;
  12.  
  13.  
  14.             VESceneNode* pCube = getSceneManagerPointer()->getSceneNode("The Cube Parent");
  15.             //VESceneNode* pParent = pCube->getParent();
  16.             VECamera* pCamera = getSceneManagerPointer()->getCamera();
  17.             VESceneNode* pParent = pCamera->getParent();
  18.  
  19.             switch (event.idata1) {
  20.             case GLFW_KEY_R:
  21.                 g_restart = true;
  22.                 break;
  23.             case GLFW_KEY_A:
  24.                 translate = pCube->getTransform() * glm::vec4(-1.0, 0.0, 0.0, 1.0); //left
  25.                 break;
  26.             case GLFW_KEY_D:
  27.                 translate = pCube->getTransform() * glm::vec4(1.0, 0.0, 0.0, 1.0); //right
  28.                 break;
  29.             case GLFW_KEY_W:
  30.                 translate = pCube->getTransform() * glm::vec4(0.0, 0.0, 1.0, 1.0); //forward
  31.                 //translate.y = 0.0f;
  32.                 break;
  33.             case GLFW_KEY_S:
  34.                 translate = pCube->getTransform() * glm::vec4(0.0, 0.0, -1.0, 1.0); //back
  35.                 //translate.y = 0.0f;
  36.                 break;
  37.             case GLFW_KEY_Q:
  38.                 translate =  pParent->getTransform() * glm::vec4(0.0, -1.0, 0.0, 1.0); //down
  39.                 break;
  40.             case GLFW_KEY_E:
  41.                 translate = pParent->getTransform() * glm::vec4(0.0, 1.0, 0.0, 1.0);  //up
  42.                 break;
  43.             case GLFW_KEY_J:                            //yaw rotation is already in parent space
  44.                 angle = rotSpeed * (float)event.dt * -1.0f;
  45.                 rot4 = pCube->getTransform() * glm::vec4(0.0, 1.0, 0.0, 1.0);
  46.                 break;
  47.             case GLFW_KEY_L:                        //yaw rotation is already in parent space
  48.                 angle = rotSpeed * (float)event.dt * 1.0f;
  49.                 rot4 = pCube->getTransform() * glm::vec4(0.0, 1.0, 0.0, 1.0);
  50.                 break;
  51.             case GLFW_KEY_I:                            //pitch rotation is in cam/local space
  52.                 angle = rotSpeed * (float)event.dt * 1.0f;          //pitch angle
  53.                 rot4 = pCube->getTransform() * glm::vec4(1.0, 0.0, 0.0, 1.0); //x axis from local to parent space!
  54.                 break;
  55.             case GLFW_KEY_K:                            //pitch rotation is in cam/local space
  56.                 angle = rotSpeed * (float)event.dt * -1.0f;     //pitch angle
  57.                 rot4 = pCube->getTransform() * glm::vec4(1.0, 0.0, 0.0, 1.0); //x axis from local to parent space!
  58.                 break;
  59.             case GLFW_KEY_LEFT:                         //yaw rotation is already in parent space
  60.                 angle = rotSpeed * (float)event.dt * -1.0f;
  61.                 rot4 = glm::vec4(0.0, 1.0, 0.0, 1.0);
  62.                 break;
  63.             case GLFW_KEY_RIGHT:                        //yaw rotation is already in parent space
  64.                 angle = rotSpeed * (float)event.dt * 1.0f;
  65.                 rot4 = glm::vec4(0.0, 1.0, 0.0, 1.0);
  66.                 break;
  67.             case GLFW_KEY_UP:                           //pitch rotation is in cam/local space
  68.                 angle = rotSpeed * (float)event.dt * 1.0f;          //pitch angle
  69.                 rot4 = pCamera->getTransform() * glm::vec4(1.0, 0.0, 0.0, 1.0); //x axis from local to parent space!
  70.                 break;
  71.             case GLFW_KEY_DOWN:                         //pitch rotation is in cam/local space
  72.                 angle = rotSpeed * (float)event.dt * -1.0f;     //pitch angle
  73.                 rot4 = pCamera->getTransform() * glm::vec4(1.0, 0.0, 0.0, 1.0); //x axis from local to parent space!
  74.                 break;
  75.  
  76.             default:
  77.                 return false;
  78.             };
  79.  
  80.             if (pParent == nullptr) {
  81.                 pParent = pCamera;
  82.             }
  83.  
  84.             ///add the new translation vector to the previous one
  85.             float speed = 1.0f;
  86.             glm::vec3 trans = speed * glm::vec3(translate.x, translate.y, translate.z);
  87.             pCube->multiplyTransform(glm::translate(glm::mat4(1.0f), (float)event.dt * trans));
  88.  
  89.             ///combination of yaw and pitch, both wrt to parent space
  90.             glm::vec3  rot3 = glm::vec3(rot4.x, rot4.y, rot4.z);
  91.             glm::mat4  rotate = glm::rotate(glm::mat4(1.0), angle, rot3);
  92.             pCube->multiplyTransform(rotate);
  93.  
  94.             return true;
  95.         }
  96.     public:
  97.         //Constructor of class ObjectMover
  98.         ObjectMover(std::string name) : VEEventListenerGLFW(name) { };
  99.  
  100.         ///Destructor of class ObjectMover
  101.         virtual ~ObjectMover() {};
  102.     };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement