//------------------------------------------------------------------------------ Example::Example(void) : glfw_error_handler(glfwSetErrorCallback(HandleGLFWError)) , glfw_init_ok(glfwInit()) , glfw_window(InitWindow()) , gl() , palette(MakePalette()) , program(MakeProgram()) , view_matrix(program, "ViewMatrix") , screen( oglplus::List("Position").Get(), oglplus::shapes::Screen(), program ), screen_width(800) , screen_height(600) , view_aspect(4.0/3.0) , view_divs(4) , view_tile(0) , view_tile_index(view_divs*view_divs) , mouse_left_down(false) , mouse_middle_down(false) , frame_no(0) { oglplus::UniformSampler(program, "Palette").Set(0); for(unsigned i=0; i!=view_tile_index.size(); ++i) view_tile_index[i] = i; CenterView(); UpdateView(); screen.Use(); self_ptr(this); gl.Enable(oglplus::Capability::ScissorTest); }
bool Render::on_expose_event(GdkEventExpose* event) { GdkGLContext *glcontext = gtk_widget_get_gl_context (get_widget()); GdkGLDrawable *gldrawable = gtk_widget_get_gl_drawable (get_widget()); if (!gldrawable || !gdk_gl_drawable_gl_begin (gldrawable, glcontext)) return false; glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT); glLoadIdentity(); glTranslatef (0.0, 0.0, -2.0 * m_zoom); glMultMatrixf (m_transform.M); CenterView(); glPushMatrix(); glColor3f(0.75f,0.75f,1.0f); glLightModeli(GL_LIGHT_MODEL_LOCAL_VIEWER, 1); Gtk::TreeModel::iterator iter = m_selection->get_selected(); m_view->Draw (iter); glPopMatrix(); if (gdk_gl_drawable_is_double_buffered(gldrawable)) gdk_gl_drawable_swap_buffers (gldrawable); else glFlush(); gdk_gl_drawable_gl_end (gldrawable); return true; }
EditView::EditView( Editor& editor, int w, int h ) : m_Editor(editor), m_PrevPos(-1,-1), m_Canvas( new Img(FMT_RGBX8,w,h ) ), m_ViewBox(0,0,w,h), m_Frame(0), m_Zoom(4), m_Offset(0,0), m_Panning(false), m_PanAnchor(0,0) { m_XZoom = m_Zoom*editor.Proj().Settings().PixW; m_YZoom = m_Zoom*editor.Proj().Settings().PixH; CenterView(); DrawView(m_ViewBox); Proj().AddListener( this ); editor.AddView( this ); }
guint Render::find_object_at(gdouble x, gdouble y) { // Render everything in selection mode GdkGLContext *glcontext = gtk_widget_get_gl_context (get_widget()); GdkGLDrawable *gldrawable = gtk_widget_get_gl_drawable (get_widget()); const GLsizei BUFSIZE = 256; GLuint select_buffer[BUFSIZE]; if (!gldrawable || !gdk_gl_drawable_gl_begin (gldrawable, glcontext)) return 0; glSelectBuffer(BUFSIZE, select_buffer); (void)glRenderMode(GL_SELECT); GLint viewport[4]; glMatrixMode (GL_PROJECTION); glPushMatrix(); glLoadIdentity (); glGetIntegerv(GL_VIEWPORT,viewport); gluPickMatrix(x,viewport[3]-y,2,2,viewport); // 2x2 pixels around the cursor gluPerspective (45.0f, (float)get_width()/(float)get_height(),1.0f, 1000000.0f); glMatrixMode (GL_MODELVIEW); glInitNames(); glPushName(0); glLoadIdentity (); glTranslatef (0.0, 0.0, -2.0 * m_zoom); glMultMatrixf (m_transform.M); CenterView(); glPushMatrix(); glColor3f(0.75f,0.75f,1.0f); glLightModeli(GL_LIGHT_MODEL_LOCAL_VIEWER, 1); Gtk::TreeModel::iterator no_object; m_view->Draw (no_object); // restor projection and model matrices glMatrixMode(GL_PROJECTION); glPopMatrix(); glMatrixMode(GL_MODELVIEW); glPopMatrix(); // restore rendering mode GLint hits = glRenderMode(GL_RENDER); if (gdk_gl_drawable_is_double_buffered(gldrawable)) gdk_gl_drawable_swap_buffers (gldrawable); else glFlush(); gdk_gl_drawable_gl_end (gldrawable); // Process the selection hits GLuint *ptr = select_buffer; GLuint name = 0; GLuint minZ = G_MAXUINT; for (GLint i = 0; i < hits; i++) { /* for each hit */ GLuint n = *ptr++; // number of hits in this record GLuint z1 = *ptr++; // Minimum Z in the hit record ptr++; // Skip Maximum Z coord if (n > 0 && z1 < minZ) { // Found an object further forward. name = *ptr; minZ = z1; } ptr += n; // Skip n name records; } return name; }
void ModelViewController::draw() { if (!valid()) { gui->RFP_Browser->callback( &tree_callback, gui ); gui->RFP_Browser->redraw(); glLoadIdentity(); glViewport (0, 0, w(),h()); // Reset The Current Viewport glMatrixMode (GL_PROJECTION); // Select The Projection Matrix glLoadIdentity (); // Reset The Projection Matrix gluPerspective (45.0f, (float)w()/(float)h(),1.0f, 1000000.0f); // Calculate The Aspect Ratio Of The Window glMatrixMode (GL_MODELVIEW); // Select The Modelview Matrix glLoadIdentity (); // Reset The Modelview Matrix ArcBall->setBounds((GLfloat)w(), (GLfloat)h()); //*NEW* Update mouse bounds for arcball glEnable(GL_LIGHTING); for(int i=0;i<4;i++) { lights[i].Init((GLenum)(GL_LIGHT0+i)); lights[i].SetAmbient(0.2f, 0.2f, 0.2f, 1.0f); lights[i].SetDiffuse(1.0f, 1.0f, 1.0f, 1.0f); lights[i].SetSpecular(1.0f, 1.0f, 1.0f, 1.0f); lights[i].Off(); } lights[0].SetLocation(-100, 100, 200, 0); lights[1].SetLocation(100, 100, 200, 0); lights[2].SetLocation(100, -100, 200, 0); lights[3].SetLocation(100, -100, 200, 0); lights[0].On(); lights[3].On(); // enable lighting glDisable ( GL_LIGHTING); glDepthFunc (GL_LEQUAL); // The Type Of Depth Testing (Less Or Equal) glEnable (GL_DEPTH_TEST); // Enable Depth Testing glHint (GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST); // Set Perspective Calculations To Most Accurate quadratic=gluNewQuadric(); // Create A Pointer To The Quadric Object gluQuadricNormals(quadratic, GLU_SMOOTH); // Create Smooth Normals gluQuadricTexture(quadratic, GL_TRUE); // Create Texture Coords } // glEnable(GL_BLEND); // glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // Clear Screen And Depth Buffer glLoadIdentity(); // Reset The Current Modelview Matrix glTranslatef(0.0f,0.0f,-zoom*2); // Move Left 1.5 Units And Into The Screen 6.0 glMultMatrixf(Transform.M); // NEW: Apply Dynamic Transform CenterView(); glPushMatrix(); // NEW: Prepare Dynamic Transform glColor3f(0.75f,0.75f,1.0f); /*--------------- Draw Grid and Axis ---------------*/ DrawGridAndAxis(); /*--------------- Draw models ------------------*/ glLightModeli(GL_LIGHT_MODEL_LOCAL_VIEWER, 1); Flu_Tree_Browser::Node *node = gui->RFP_Browser->get_selected( 1 ); ProcessControl.Draw(node); /*--------------- Exit -----------------*/ glPopMatrix(); // NEW: Unapply Dynamic Transform glFlush(); // Flush The GL Rendering Pipeline // swap_buffers(); }