1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50
|
#include "globalincs/pstypes.h"
#include "io/key.h"
#include "lab/renderer/lab_cameras.h"
#include "lab/labv2_internal.h"
LabCamera::~LabCamera() {
cam_delete(FS_camera);
}
void OrbitCamera::handleInput(int dx, int dy, bool, bool rmbDown, int modifierKeys) {
if (dx == 0 && dy == 0)
return;
if (rmbDown) {
if (modifierKeys & KEY_SHIFTED) {
distance *= 1.0f + (dy / 200.0f);
CLAMP(distance, 1.0f, 10000000.0f);
}
else {
theta += dx / 100.0f;
phi += dy / 100.0f;
CLAMP(phi, 0.01f, PI - 0.01f);
}
}
updateCamera();
}
void OrbitCamera::displayedObjectChanged() {
if (getLabManager()->CurrentObject != -1) {
distance = Objects[getLabManager()->CurrentObject].radius * 1.6f;
}
updateCamera();
}
void OrbitCamera::updateCamera() {
auto cam = FS_camera.getCamera();
vec3d new_position;
new_position.xyz.x = sinf(phi) * cosf(theta);
new_position.xyz.y = cosf(phi);
new_position.xyz.z = sinf(phi) * sinf(theta);
vm_vec_scale(&new_position, distance);
cam->set_position(&new_position);
cam->set_rotation_facing(&getLabManager()->CurrentPosition);
}
|