void MainWindow::keyPressEvent(QKeyEvent *event) { switch(event->key()) { case Qt::Key_S: settingsWidget->show(); settingsWidget->raise(); break; case Qt::Key_G: createDistanceField(); break; case Qt::Key_I: addVertex(); break; case Qt::Key_D: if(mainSpline->getPoints().size() > 3) deleteVertex(); break; default: event->ignore(); } }
int main(int argc, char** argv) { osg::ArgumentParser args(&argc, argv); osgViewer::Viewer viewer(args); osgDB::FilePathList& paths = osgDB::getDataFilePathList(); paths.push_back("../examples/osgcairodistancefield"); paths.push_back("examples/osgcairodistancefield"); paths.push_back("."); std::string vertPath = "shaders/normal-vert.glsl"; std::string fragPath = "shaders/normal-frag.glsl"; while(args.read("--outline")) { fragPath = "shaders/outline-frag.glsl"; } while(args.read("--shifted")) { vertPath = "shaders/shifted-vert.glsl"; fragPath = "shaders/shifted-frag.glsl"; } if(args.argc() != 4) { OSG_FATAL << "usage: osgcairodistancefield <surface_size> <scan_size> <block_size>" << std::endl; return 1; } vertPath = osgDB::findDataFile(vertPath); fragPath = osgDB::findDataFile(fragPath); cairo_surface_t* distanceField = createDistanceField( std::atoi(args[1]), std::atoi(args[2]), std::atoi(args[3]) ); osg::Geode* geode = createDistanceFieldGeode(distanceField); osg::Geode* bg = createBackgroundGeode(WIDTH, HEIGHT); osg::Camera* camera = createOrthoCamera(WIDTH, HEIGHT); osg::Program* program = new osg::Program(); osg::Shader* vert = osg::Shader::readShaderFile(osg::Shader::VERTEX, vertPath); osg::Shader* frag = osg::Shader::readShaderFile(osg::Shader::FRAGMENT, fragPath); float scale = 1.0f; float aMin = std::max(0.0f, 0.5f - 0.07f / scale); float aMax = std::min(0.5f + 0.07f / scale, 1.0f); float radius = 1.0f; float ol = std::max(double(0.2f), double(0.5 - 0.5 / radius)); float oaMax0 = std::max(double(0.0f), ol - 0.07 / scale); float oaMax1 = std::min(ol + 0.07 / scale, double(aMin)); osg::Uniform* color = new osg::Uniform("Color", osg::Vec4(1.0f, 1.0f, 1.0f, 1.0f)); osg::Uniform* styleColor = new osg::Uniform("StyleColor", osg::Vec4(0.0f, 0.0f, 0.0f, 1.0f)); osg::Uniform* alphaMin = new osg::Uniform("AlphaMin", aMin); osg::Uniform* alphaMax = new osg::Uniform("AlphaMax", aMax); osg::Uniform* alphaMax0 = new osg::Uniform("OutlineAlphaMax0", oaMax0); osg::Uniform* alphaMax1 = new osg::Uniform("OutlineAlphaMax1", oaMax1); osg::Uniform* texture = new osg::Uniform(osg::Uniform::SAMPLER_2D, "Texture"); texture->set(0); program->addShader(vert); program->addShader(frag); osg::MatrixTransform* matrix = new osg::MatrixTransform(); matrix->getOrCreateStateSet()->setAttributeAndModes(program); matrix->getOrCreateStateSet()->addUniform(color); matrix->getOrCreateStateSet()->addUniform(styleColor); matrix->getOrCreateStateSet()->addUniform(alphaMin); matrix->getOrCreateStateSet()->addUniform(alphaMax); matrix->getOrCreateStateSet()->addUniform(alphaMax0); matrix->getOrCreateStateSet()->addUniform(alphaMax1); matrix->getOrCreateStateSet()->addUniform(texture); matrix->addChild(geode); camera->addChild(matrix); camera->addChild(bg); viewer.setSceneData(camera); viewer.setUpViewInWindow(50, 50, WIDTH, HEIGHT); viewer.addEventHandler(new ScaleSet()); int r = viewer.run(); cairo_surface_destroy(distanceField); return r; }