void InteractiveBitmapsApp::update(){ GestureWorks::Instance()->ProcessFrame(); std::vector point_events = GestureWorks::Instance()->ConsumePointEvents(); //Hit-test new points to see if they struck one of the logo objects for (std::vector::iterator event_it = point_events.begin(); event_it != point_events.end(); event_it++) { std::pair pos(normScreenToWindowPx(event_it->position.x, event_it->position.y)); if (event_it->status == gwc::TOUCHADDED) { //All new touchpoints must go through hit testing to see if they apply to our bitmap manipulation; since logo1 is always on top, we check it first if (test_point(pos.first, pos.second, logo1_dimensions.x, logo1_dimensions.y, logo1_dimensions.width, logo1_dimensions.height, logo1_dimensions.rotation, logo1_dimensions.scale) ) { GestureWorks::Instance()->AddTouchPoint(L"logo1", event_it->point_id); } else if (test_point(pos.first, pos.second, logo2_dimensions.x, logo2_dimensions.y, logo2_dimensions.width, logo2_dimensions.height, logo2_dimensions.rotation, logo2_dimensions.scale) ) { GestureWorks::Instance()->AddTouchPoint(L"logo2", event_it->point_id); } } } //Interpret gesture events std::vector gesture_events = GestureWorks::Instance()->ConsumeGestureEvents(); for (std::vector::iterator gesture_it = gesture_events.begin(); gesture_it != gesture_events.end(); gesture_it++) { if (gesture_it->target == "logo1") { if (gesture_it->gesture_id == "n-drag") { float dx = gesture_it->values.at("drag_dx"); float dy = gesture_it->values.at("drag_dy"); if (!use_pixels) { dx = dx * screen_width; dy = dy * screen_height; } float new_x = logo1_dimensions.x + dx; float new_y = logo1_dimensions.y + dy; logo1_dimensions.x = new_x; logo1_dimensions.y = new_y; } else if (gesture_it->gesture_id == "n-rotate") { //Rotation is about a specific point, so we need to do a coordinate transform and adjust //not only the object's rotation, but it's x and y values as well float rotation_angle = degreesToRads(gesture_it->values.at("rotate_dtheta")); //If we have points down, move the box; if there are no points, this is from gesture inertia and there is no //center about which to rotate if (gesture_it->n != 0) { float temp_x = rotateAboutCenterX(logo1_dimensions.x, logo1_dimensions.y, gesture_it->x, gesture_it->y, rotation_angle); float temp_y = rotateAboutCenterY(logo1_dimensions.x, logo1_dimensions.y, gesture_it->x, gesture_it->y, rotation_angle); } logo1_dimensions.rotation = logo1_dimensions.rotation + rotation_angle; } else if (gesture_it->gesture_id == "n-scale") { float dsx = gesture_it->values.at("scale_dsx"); if (!use_pixels) { dsx = dsx * screen_width; } logo1_dimensions.scale = logo1_dimensions.scale + dsx; } } else if (gesture_it->target == "logo2") { if (gesture_it->gesture_id == "n-drag") { float dx = gesture_it->values.at("drag_dx"); float dy = gesture_it->values.at("drag_dy"); if (!use_pixels) { dx = dx * screen_width; dy = dy * screen_height; } float new_x = logo2_dimensions.x + dx; float new_y = logo2_dimensions.y + dy; logo2_dimensions.x = new_x; logo2_dimensions.y = new_y; } else if (gesture_it->gesture_id == "n-rotate") { //Rotation is about a specific point, so we need to do a coordinate transform and adjust //not only the object's rotation, but it's x and y values as well float rotation_angle = degreesToRads(gesture_it->values.at("rotate_dtheta")); float temp_x = rotateAboutCenterX(logo2_dimensions.x, logo2_dimensions.y, gesture_it->x, gesture_it->y, rotation_angle); float temp_y = rotateAboutCenterY(logo2_dimensions.x, logo2_dimensions.y, gesture_it->x, gesture_it->y, rotation_angle); logo2_dimensions.rotation = logo2_dimensions.rotation + rotation_angle; } else if (gesture_it->gesture_id == "n-scale") { float dsx = gesture_it->values.at("scale_dsx"); if (!use_pixels) { dsx = dsx * screen_width; } logo2_dimensions.scale = logo2_dimensions.scale + dsx; } } } }