/** * Sets the rotational component (upper 3x3) of this matrix to the matrix * values in the T precision Matrix3d argument; the other elements of * this matrix are unchanged; a singular value decomposition is performed * on this object's upper 3x3 matrix to factor out the scale, then this * object's upper 3x3 matrix components are replaced by the passed rotation * components, and then the scale is reapplied to the rotational * components. * @param m1 T precision 3x3 matrix */ inline static void Matrix4fSetRotationFromMatrix3f(Matrix4fT* NewObj, const Matrix3fT* m1) { GLfloat scale; scale = Matrix4fSVD(NewObj, NULL, NULL); Matrix4fSetRotationScaleFromMatrix3f(NewObj, m1); Matrix4fMulRotationScale(NewObj, scale); }
Render::Render (View *view, Glib::RefPtr<Gtk::TreeSelection> selection) : m_arcBall(new ArcBall()), m_view (view), m_selection(selection) { set_events (Gdk::POINTER_MOTION_MASK | Gdk::BUTTON_MOTION_MASK | Gdk::BUTTON_PRESS_MASK | Gdk::BUTTON_RELEASE_MASK | Gdk::BUTTON1_MOTION_MASK | Gdk::BUTTON2_MOTION_MASK | Gdk::BUTTON3_MOTION_MASK); GdkGLConfig *glconfig; // glconfig is leaked at program exit glconfig = gdk_gl_config_new_by_mode ((GdkGLConfigMode) (GDK_GL_MODE_RGBA | GDK_GL_MODE_ALPHA | GDK_GL_MODE_STENCIL | GDK_GL_MODE_DEPTH | GDK_GL_MODE_DOUBLE)); if (!glconfig) // try single buffered glconfig = gdk_gl_config_new_by_mode ((GdkGLConfigMode) (GDK_GL_MODE_RGBA | GDK_GL_MODE_ALPHA | GDK_GL_MODE_STENCIL | GDK_GL_MODE_DEPTH)); if (!gtk_widget_set_gl_capability (get_widget(), glconfig, NULL, TRUE, GDK_GL_RGBA_TYPE)) g_error (_("failed to init gl area\n")); memset (&m_transform.M, 0, sizeof (m_transform.M)); Matrix3fT identity; Matrix3fSetIdentity(&identity); // set initial rotation 30 degrees around Y axis identity.s.M11 = identity.s.M22 = 0.5253; // cos -45 identity.s.M12 = 0.851; // -sin -45 identity.s.M21 = -0.851; // sin -45 Matrix4fSetRotationScaleFromMatrix3f(&m_transform, &identity); m_transform.s.SW = 1.0; m_zoom = 120.0; for (uint i = 0; i < N_LIGHTS; i++) m_lights[i] = NULL; m_selection->signal_changed().connect (sigc::mem_fun(*this, &Render::selection_changed)); }