Added some test code in Core that allow for pinch zooming and two-finger rotation.
parent
00d0ec1c00
commit
8c37edcfe7
20
src/Core.cpp
20
src/Core.cpp
|
@ -202,13 +202,29 @@ void Core::doProcess() {
|
||||||
r_view->setView(v_width, v_height);
|
r_view->setView(v_width, v_height);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
} else if (event.type == SDL_MULTIGESTURE) {
|
||||||
|
LOG(LOG_INFO) << "gesture: " << event.mgesture.x << "x" << event.mgesture.y << ", rot:" << event.mgesture.dTheta << ", pinch:" << event.mgesture.dDist << ", fingers:" << event.mgesture.numFingers;
|
||||||
|
RenderCamera *camera = scene->getCamera(1);
|
||||||
|
Vec3 camera_pos = camera->getPosition();
|
||||||
|
camera_pos.y -= event.mgesture.dDist*256.0f;
|
||||||
|
camera->setPosition(camera_pos.x, camera_pos.y, camera_pos.z);
|
||||||
|
float yaw = camera->getYaw();
|
||||||
|
camera->setYaw(yaw - (event.mgesture.dTheta*128.0f));
|
||||||
|
camera->doRefresh();
|
||||||
} else if (event.type == SDL_FINGERMOTION) {
|
} else if (event.type == SDL_FINGERMOTION) {
|
||||||
LOG(LOG_INFO) << "finger: " << event.tfinger.pressure << " " << event.tfinger.x << "x" << event.tfinger.y << " " << event.tfinger.dx << "x" << event.tfinger.dy;
|
LOG(LOG_INFO) << "finger: " << event.tfinger.fingerId << " " << event.tfinger.x << "x" << event.tfinger.y << " " << event.tfinger.dx << "x" << event.tfinger.dy;
|
||||||
|
|
||||||
RenderCamera *camera = scene->getCamera(1);
|
RenderCamera *camera = scene->getCamera(1);
|
||||||
Vec3 camera_pos = camera->getPosition();
|
Vec3 camera_pos = camera->getPosition();
|
||||||
float x = event.tfinger.dx * v_width/16;
|
float x = event.tfinger.dx * v_width/16;
|
||||||
float y = event.tfinger.dy * v_height/16;
|
float y = event.tfinger.dy * v_height/16;
|
||||||
camera->setPosition(camera_pos.x-x, camera_pos.y, camera_pos.z+y);
|
|
||||||
|
// This is weird.
|
||||||
|
float yaw = camera->getYaw() * M_PI / 180.0f;
|
||||||
|
float ax = (-x * cosf(yaw)) + (y * sinf(yaw));
|
||||||
|
float ay = (y * cosf(yaw)) - (-x * sinf(yaw));
|
||||||
|
|
||||||
|
camera->setPosition(camera_pos.x+ax, camera_pos.y, camera_pos.z+ay);
|
||||||
camera->doRefresh();
|
camera->doRefresh();
|
||||||
} else if (event.type == SDL_MOUSEMOTION) {
|
} else if (event.type == SDL_MOUSEMOTION) {
|
||||||
if (event.motion.which == SDL_TOUCH_MOUSEID) continue;
|
if (event.motion.which == SDL_TOUCH_MOUSEID) continue;
|
||||||
|
|
|
@ -104,6 +104,15 @@ RenderView* RenderCamera::getRenderView() {
|
||||||
Vec3 RenderCamera::getPosition() {
|
Vec3 RenderCamera::getPosition() {
|
||||||
return position;
|
return position;
|
||||||
}
|
}
|
||||||
|
float RenderCamera::getYaw() {
|
||||||
|
return yaw;
|
||||||
|
}
|
||||||
|
float RenderCamera::getPitch() {
|
||||||
|
return pitch;
|
||||||
|
}
|
||||||
float RenderCamera::getSize() {
|
float RenderCamera::getSize() {
|
||||||
return size;
|
return size;
|
||||||
}
|
}
|
||||||
|
Mat4 RenderCamera::getModelview() {
|
||||||
|
return mv_matrix;
|
||||||
|
}
|
||||||
|
|
|
@ -29,9 +29,12 @@ class RenderCamera {
|
||||||
void setMode(int mode);
|
void setMode(int mode);
|
||||||
Vec3 getPosition();
|
Vec3 getPosition();
|
||||||
void setPosition(float x, float y, float z);
|
void setPosition(float x, float y, float z);
|
||||||
|
float getPitch();
|
||||||
void setPitch(float pitch);
|
void setPitch(float pitch);
|
||||||
|
float getYaw();
|
||||||
void setYaw(float yaw);
|
void setYaw(float yaw);
|
||||||
float getSize();
|
float getSize();
|
||||||
|
Mat4 getModelview();
|
||||||
private:
|
private:
|
||||||
int render_mode; // 0 = perspective, 1 = orthogonal
|
int render_mode; // 0 = perspective, 1 = orthogonal
|
||||||
Vec3 position; // The camera's coordinates in 3D space
|
Vec3 position; // The camera's coordinates in 3D space
|
||||||
|
|
Loading…
Reference in New Issue