void View::auto_rotate() { RFO_File *file; RFO_Object *object; get_selected_stl (object, file); m_model->OptimizeRotation(file, object); }
void View::auto_rotate() { Shape *shape; TreeObject *object; get_selected_stl (object, shape); m_model->OptimizeRotation(shape, object); }
void View::rotate_selection (Vector4f rotate) { RFO_File *file; RFO_Object *object; get_selected_stl (object, file); m_model->RotateObject (file, object, rotate); queue_draw(); }
void View::mirror_selection () { Shape *shape; TreeObject *object; get_selected_stl (object, shape); m_model->Mirror(shape, object); queue_draw(); }
void View::invertnormals_selection () { Shape *shape; TreeObject *object; get_selected_stl (object, shape); m_model->InvertNormals(shape, object); queue_draw(); }
void View::rotate_selection (Vector4d rotate) { Shape *shape; TreeObject *object; get_selected_stl (object, shape); m_model->RotateObject (shape, object, rotate); queue_draw(); }
void View::scale_object() { RFO_File *file; RFO_Object *object; get_selected_stl (object, file); Gtk::HScale *scale_slider; m_builder->get_widget("m_scale_slider", scale_slider); m_model->ScaleObject (file, object, scale_slider->get_value()); }
void View::scale_object() { Shape *shape; TreeObject *object; get_selected_stl (object, shape); Gtk::SpinButton *scale_value; m_builder->get_widget("m_scale_value", scale_value); m_model->ScaleObject (shape, object, scale_value->get_value()); }
void RFO::DeleteSelected(Gtk::TreeModel::iterator &iter) { RFO_Object *object; RFO_File *file; get_selected_stl (iter, object, file); if (file != NULL) Objects[object->idx].files.erase (Objects[object->idx].files.begin() + file->idx); else if (object != NULL) Objects.erase (Objects.begin() + object->idx); update_model(); }
void View::duplicate_selected_stl() { TreeObject *object; Shape *shape; if (!get_selected_stl (object, shape) || !shape) return; // duplicate m_model->AddShape (object, *shape, shape->filename); queue_draw(); }
/* Updates the scale slider when a new STL is selected, * giving it the new STL's current scale factor */ void View::update_scale_slider() { RFO_File *file; RFO_Object *object; get_selected_stl (object, file); if (!file) return; Gtk::HScale *scale_slider; m_builder->get_widget("m_scale_slider", scale_slider); scale_slider->set_value(file->stl.getScaleFactor()); }
/* Updates the scale value when a new STL is selected, * giving it the new STL's current scale factor */ void View::update_scale_value() { Shape *shape; TreeObject *object; get_selected_stl (object, shape); if (!shape) return; Gtk::SpinButton *scale_sb; m_builder->get_widget("m_scale_value", scale_sb); scale_sb->set_value(shape->getScaleFactor()); }
void View::duplicate_selected_stl() { RFO_Object *object; RFO_File *file; if (!get_selected_stl (object, file) || !file) return; // duplicate RFO_File* obj = m_model->AddStl (object, file->stl, file->location); // translate Vector3f p = file->transform3D.transform.getTranslation(); Vector3f size = file->stl.Max - file->stl.Min; p.x += size.x + 5.0f; // 5mm space obj->transform3D.transform.setTranslation (p); m_model->CalcBoundingBoxAndCenter(); queue_draw(); }
void RFO::draw (Settings &settings, Gtk::TreeModel::iterator &iter) { RFO_File *sel_file; RFO_Object *sel_object; get_selected_stl (iter, sel_object, sel_file); glPushMatrix(); glMultMatrixf (&transform3D.transform.array[0]); for (uint i = 0; i < Objects.size(); i++) { RFO_Object *object = &Objects[i]; glPushMatrix(); glMultMatrixf (&object->transform3D.transform.array[0]); for (uint j = 0; j < object->files.size(); j++) { RFO_File *file = &object->files[j]; glPushMatrix(); glMultMatrixf (&file->transform3D.transform.array[0]); if (sel_file == file || (!sel_file && sel_object == object)) { // FIXME: hideous changing global state for this [!] settings.Display.PolygonRGBA.r += 0.5f; settings.Display.WireframeRGBA.r += 0.5f; file->stl.draw (*this, settings); settings.Display.PolygonRGBA.r -= 0.5f; settings.Display.WireframeRGBA.r -= 0.5f; } else file->stl.draw (*this, settings); glPopMatrix(); } glPopMatrix(); } glPopMatrix(); }
void RFO::draw (Settings &settings, Gtk::TreeModel::iterator &iter) { RFO_File *sel_file; RFO_Object *sel_object; gint index = 1; // pick/select index. matches computation in update_model() get_selected_stl (iter, sel_object, sel_file); glPushMatrix(); glMultMatrixf (&transform3D.transform.array[0]); for (uint i = 0; i < Objects.size(); i++) { RFO_Object *object = &Objects[i]; index++; glPushMatrix(); glMultMatrixf (&object->transform3D.transform.array[0]); for (uint j = 0; j < object->files.size(); j++) { RFO_File *file = &object->files[j]; glLoadName(index); // Load select/pick index index++; glPushMatrix(); glMultMatrixf (&file->transform3D.transform.array[0]); bool is_selected = (sel_file == file || (!sel_file && sel_object == object)); if (is_selected) { // Enable stencil buffer when we draw the selected object. glEnable(GL_STENCIL_TEST); glStencilFunc(GL_ALWAYS, 1, 1); glStencilOp(GL_KEEP, GL_REPLACE, GL_REPLACE); file->stl.draw (*this, settings); if (!settings.Display.DisplayPolygons) { // If not drawing polygons, need to draw the geometry // manually, but invisible, to set up the stencil buffer glEnable(GL_CULL_FACE); glEnable(GL_DEPTH_TEST); glEnable(GL_BLEND); // Set to not draw anything, and not update depth buffer glDepthMask(GL_FALSE); glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE); file->stl.draw_geometry(); glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); glDepthMask(GL_TRUE); } // draw highlight around selected object glColor4f( 1.0f, 1.0f, 1.0f, 1.0f ); glLineWidth(4.0); glEnable(GL_LINE_SMOOTH); glEnable (GL_POLYGON_OFFSET_LINE); glDisable (GL_CULL_FACE); glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP); glStencilFunc(GL_NOTEQUAL, 1, 1); glEnable(GL_DEPTH_TEST); file->stl.draw_geometry(); glEnable (GL_CULL_FACE); glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); glDisable(GL_STENCIL_TEST); glDisable(GL_LINE_SMOOTH); glDisable(GL_POLYGON_OFFSET_LINE); } else { file->stl.draw (*this, settings); } glPopMatrix(); } glPopMatrix(); } glPopMatrix(); }