Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //Bobur's edits
- class ObjectMover : public VEEventListenerGLFW {
- private:
- bool virtual onKeyboard(veEvent event) {
- ///create some default constants for the actions
- //glm::vec3 positionCube = getSceneManagerPointer()->getSceneNode("The Cube Parent")->getPosition();
- glm::vec4 translate = glm::vec4(0.0, 0.0, 0.0, 1.0); //total translation
- glm::vec4 rot4 = glm::vec4(1.0); //total rotation around the axes, is 4d !
- float angle = 0.0;
- float rotSpeed = 2.0;
- VESceneNode* pCube = getSceneManagerPointer()->getSceneNode("The Cube Parent");
- //VESceneNode* pParent = pCube->getParent();
- VECamera* pCamera = getSceneManagerPointer()->getCamera();
- VESceneNode* pParent = pCamera->getParent();
- switch (event.idata1) {
- case GLFW_KEY_R:
- g_restart = true;
- break;
- case GLFW_KEY_A:
- translate = pCube->getTransform() * glm::vec4(-1.0, 0.0, 0.0, 1.0); //left
- break;
- case GLFW_KEY_D:
- translate = pCube->getTransform() * glm::vec4(1.0, 0.0, 0.0, 1.0); //right
- break;
- case GLFW_KEY_W:
- translate = pCube->getTransform() * glm::vec4(0.0, 0.0, 1.0, 1.0); //forward
- //translate.y = 0.0f;
- break;
- case GLFW_KEY_S:
- translate = pCube->getTransform() * glm::vec4(0.0, 0.0, -1.0, 1.0); //back
- //translate.y = 0.0f;
- break;
- case GLFW_KEY_Q:
- translate = pParent->getTransform() * glm::vec4(0.0, -1.0, 0.0, 1.0); //down
- break;
- case GLFW_KEY_E:
- translate = pParent->getTransform() * glm::vec4(0.0, 1.0, 0.0, 1.0); //up
- break;
- case GLFW_KEY_J: //yaw rotation is already in parent space
- angle = rotSpeed * (float)event.dt * -1.0f;
- rot4 = pCube->getTransform() * glm::vec4(0.0, 1.0, 0.0, 1.0);
- break;
- case GLFW_KEY_L: //yaw rotation is already in parent space
- angle = rotSpeed * (float)event.dt * 1.0f;
- rot4 = pCube->getTransform() * glm::vec4(0.0, 1.0, 0.0, 1.0);
- break;
- case GLFW_KEY_I: //pitch rotation is in cam/local space
- angle = rotSpeed * (float)event.dt * 1.0f; //pitch angle
- rot4 = pCube->getTransform() * glm::vec4(1.0, 0.0, 0.0, 1.0); //x axis from local to parent space!
- break;
- case GLFW_KEY_K: //pitch rotation is in cam/local space
- angle = rotSpeed * (float)event.dt * -1.0f; //pitch angle
- rot4 = pCube->getTransform() * glm::vec4(1.0, 0.0, 0.0, 1.0); //x axis from local to parent space!
- break;
- case GLFW_KEY_LEFT: //yaw rotation is already in parent space
- angle = rotSpeed * (float)event.dt * -1.0f;
- rot4 = glm::vec4(0.0, 1.0, 0.0, 1.0);
- break;
- case GLFW_KEY_RIGHT: //yaw rotation is already in parent space
- angle = rotSpeed * (float)event.dt * 1.0f;
- rot4 = glm::vec4(0.0, 1.0, 0.0, 1.0);
- break;
- case GLFW_KEY_UP: //pitch rotation is in cam/local space
- angle = rotSpeed * (float)event.dt * 1.0f; //pitch angle
- rot4 = pCamera->getTransform() * glm::vec4(1.0, 0.0, 0.0, 1.0); //x axis from local to parent space!
- break;
- case GLFW_KEY_DOWN: //pitch rotation is in cam/local space
- angle = rotSpeed * (float)event.dt * -1.0f; //pitch angle
- rot4 = pCamera->getTransform() * glm::vec4(1.0, 0.0, 0.0, 1.0); //x axis from local to parent space!
- break;
- default:
- return false;
- };
- if (pParent == nullptr) {
- pParent = pCamera;
- }
- ///add the new translation vector to the previous one
- float speed = 1.0f;
- glm::vec3 trans = speed * glm::vec3(translate.x, translate.y, translate.z);
- pCube->multiplyTransform(glm::translate(glm::mat4(1.0f), (float)event.dt * trans));
- ///combination of yaw and pitch, both wrt to parent space
- glm::vec3 rot3 = glm::vec3(rot4.x, rot4.y, rot4.z);
- glm::mat4 rotate = glm::rotate(glm::mat4(1.0), angle, rot3);
- pCube->multiplyTransform(rotate);
- return true;
- }
- public:
- //Constructor of class ObjectMover
- ObjectMover(std::string name) : VEEventListenerGLFW(name) { };
- ///Destructor of class ObjectMover
- virtual ~ObjectMover() {};
- };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement