| 248 | } |
| 249 | |
| 250 | void GLFWDistribOSPRayWindow::motion(const vec2f &position) |
| 251 | { |
| 252 | static vec2f previousMouse(-1); |
| 253 | |
| 254 | const vec2f mouse(position.x, position.y); |
| 255 | if (previousMouse != vec2f(-1)) { |
| 256 | const bool leftDown = |
| 257 | glfwGetMouseButton(glfwWindow, GLFW_MOUSE_BUTTON_LEFT) == GLFW_PRESS; |
| 258 | const bool rightDown = |
| 259 | glfwGetMouseButton(glfwWindow, GLFW_MOUSE_BUTTON_RIGHT) == GLFW_PRESS; |
| 260 | const bool middleDown = |
| 261 | glfwGetMouseButton(glfwWindow, GLFW_MOUSE_BUTTON_MIDDLE) == GLFW_PRESS; |
| 262 | const vec2f prev = previousMouse; |
| 263 | |
| 264 | bool cameraChanged = leftDown || rightDown || middleDown; |
| 265 | |
| 266 | if (leftDown) { |
| 267 | const vec2f mouseFrom(clamp(prev.x * 2.f / windowSize.x - 1.f, -1.f, 1.f), |
| 268 | clamp(prev.y * 2.f / windowSize.y - 1.f, -1.f, 1.f)); |
| 269 | const vec2f mouseTo(clamp(mouse.x * 2.f / windowSize.x - 1.f, -1.f, 1.f), |
| 270 | clamp(mouse.y * 2.f / windowSize.y - 1.f, -1.f, 1.f)); |
| 271 | arcballCamera->rotate(mouseFrom, mouseTo); |
| 272 | } else if (rightDown) { |
| 273 | arcballCamera->zoom(mouse.y - prev.y); |
| 274 | } else if (middleDown) { |
| 275 | arcballCamera->pan(vec2f(mouse.x - prev.x, prev.y - mouse.y)); |
| 276 | } |
| 277 | |
| 278 | if (cameraChanged) { |
| 279 | windowState.cameraChanged = true; |
| 280 | windowState.eyePos = arcballCamera->eyePos(); |
| 281 | windowState.lookDir = arcballCamera->lookDir(); |
| 282 | windowState.upDir = arcballCamera->upDir(); |
| 283 | } |
| 284 | } |
| 285 | |
| 286 | previousMouse = mouse; |
| 287 | } |
| 288 | |
| 289 | void GLFWDistribOSPRayWindow::display() |
| 290 | { |