void SaveAuthorController::onStart(){ Controller::onStart(); int rc; while((rc = gtk_dialog_run(GTK_DIALOG(getSceneRoot()))) == GTK_RESPONSE_OK){ string firstName = gtk_entry_get_text(GTK_ENTRY(m_firstNameEntry)); string middleName = gtk_entry_get_text(GTK_ENTRY(m_middleNameEntry)); string lastName = gtk_entry_get_text(GTK_ENTRY(m_lastNameEntry)); if(firstName == "" || lastName == ""){ GtkWidget* dialog = getSceneObj("errorDialog"); gtk_message_dialog_set_markup(GTK_MESSAGE_DIALOG(dialog),"<b>First name and last name cannot be empty.</b>"); gtk_dialog_run(GTK_DIALOG(dialog)); gtk_widget_hide(dialog); } else { m_author->getDirty() ->putExtra("first_name",firstName) ->putExtra("middle_name",middleName) ->putExtra("last_name",lastName); m_author->saveRow(); break; } } finish(); }
/// Override original method since it seems to adjust the clipping planes in a weird manner. /// Maybe using a screen-space projection or whatever. virtual void adjustCameraClippingPlanes() { SoCamera * camera = getCamera(); if (!camera) return; SoGetBoundingBoxAction clipbox_action(getViewportRegion()); clipbox_action.apply(getSceneRoot()); SbBox3f bbox = clipbox_action.getBoundingBox(); if (bbox.isEmpty()) return; SbSphere bSphere; bSphere.circumscribe(bbox); SbVec3f forward; camera->orientation.getValue().multVec(SbVec3f(0,0,-1), forward); float denumerator = forward.length(); float numerator = (bSphere.getCenter() - camera->position.getValue()).dot(forward); float distToCenter = (forward * (numerator / denumerator)).length(); float farplane = distToCenter + bSphere.getRadius(); // if scene is behind the camera, don't change the planes if (farplane < 0) return; float nearplane = distToCenter - bSphere.getRadius(); if (nearplane < (0.001 * farplane)) nearplane = 0.001 * farplane; camera->nearDistance = nearplane; camera->farDistance = farplane; }