void MarkedList::ObjectsInWindow( wxRect window, MarkedObject* marked_object, bool single_picking){ int buffer_length = 16384; GLuint *data = (GLuint *)malloc( buffer_length * sizeof(GLuint) ); if(data == NULL)return; int i, j; int half_window_width = 0; wxPoint window_centre; if(single_picking){ half_window_width = (window.width)/2; window_centre.x = window.x + window.width/2; window_centre.y = window.y + window.height/2; } int window_mode = 0; while(1){ if(single_picking){ int window_size = half_window_width; if(window_mode == 0)window_size = 0; if(window_mode == 1)window_size = half_window_width/2; window.x = window_centre.x - window_size; window.y = window_centre.y - window_size; window.width = window_size * 2; window.height = window_size * 2; } GLint num_hits = -1; while(num_hits < 0){ glSelectBuffer(buffer_length, data); glRenderMode(GL_SELECT); glInitNames(); wxGetApp().m_current_viewport->SetViewport(); wxGetApp().m_current_viewport->m_view_point.SetPickProjection(window); wxGetApp().m_current_viewport->m_view_point.SetModelview(); wxGetApp().glCommands(true, false, false); GrippersGLCommands(true, false); glFlush(); num_hits = glRenderMode(GL_RENDER); if(num_hits<0){ free(data); buffer_length *= 10; data = (GLuint *)malloc( buffer_length * sizeof(GLuint) ); if(data == NULL)return; } } int pos = 0; bool added = false; for(i=0; i<num_hits; i++) { unsigned int names = data[pos]; if(names == 0)break; pos++; unsigned int min_depth = data[pos]; pos+=2; MarkedObject* current_found_object = marked_object; bool ignore_coords_only_found = false; for(j=0; j<(int)names; j++, pos++){ if(!ignore_coords_only_found && current_found_object != NULL){ HeeksObj *object = m_name_index.find(data[pos]); if(ignore_coords_only && wxGetApp().m_digitizing->OnlyCoords(object)){ ignore_coords_only_found = true; } else{ if((object->GetType() == GripperType) || ((object->GetMarkingMask() & m_filter) && (object->GetMarkingMask() != 0))){ int window_size = window.width; current_found_object = current_found_object->Add(object, min_depth, window_size); added = true; } } } } } window_mode++; if(!single_picking)break; if(window_mode > 2)break; } free(data); }