예제 #1
0
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();
	}
}
예제 #2
0
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;
}