bool Render::on_motion_notify_event(GdkEventMotion* event) { bool redraw=true; Vector2f dragp(event->x, event->y); Vector2f delta = m_downPoint - dragp; double factor = 0.3; Vector3d delta3f(-delta.x*factor, delta.y*factor, 0); get_model()->setMeasuresPoint(Vector2d((10.+event->x)/(get_width()-20), (10.+get_height()-event->y)/(get_height()-20))); if (event->state & GDK_BUTTON1_MASK) { // move or rotate if (event->state & GDK_SHIFT_MASK) { // move object if (false);//delta3f.x<1 && delta3f.y<1) redraw=false; else { Shape *shape; TreeObject *object; if (!m_view->get_selected_stl(object, shape)) return true; if (!object && !shape) return true; Transform3D *transf; if (!shape) transf = &object->transform3D; else transf = &shape->transform3D; transf->move(delta3f); m_downPoint = dragp; //m_view->get_model()->CalcBoundingBoxAndCenter(); } } else { // rotate m_arcBall->dragAccumulate(event->x, event->y, &m_transform); } if (redraw) queue_draw(); return true; } else { if (event->state & GDK_BUTTON2_MASK) { // zoom double factor = 1.0 + 0.01 * (delta.x - delta.y); m_zoom *= factor; } else if (event->state & GDK_BUTTON3_MASK) { // pan Matrix4f matrix; memcpy(&matrix.m00, &m_transform.M[0], sizeof(Matrix4f)); Vector3f m_transl = matrix.getTranslation(); m_transl += delta3f; matrix.setTranslation(m_transl); memcpy(&m_transform.M[0], &matrix.m00, sizeof(Matrix4f)); } m_downPoint = dragp; if (redraw) queue_draw(); return true; } return Gtk::DrawingArea::on_motion_notify_event (event); }
void Model::PlaceOnPlatform(Shape *shape, TreeObject *object) { if (shape) shape->PlaceOnPlatform(); else if(object) { Transform3D * transf = &object->transform3D; transf->move(Vector3f(0, 0, -transf->getTranslation().z())); for (uint s = 0;s<object->shapes.size(); s++) { object->shapes[s]->PlaceOnPlatform(); } } else return; ModelChanged(); }