예제 #1
0
void Model::add_ball(float x, float y)
{
	// Get logical coordinates
	float logical_x = get_logical_x(x);
	float logical_y = get_logical_y(y);

	// set radius w.r.t nearby walls
	float max_radius = std::min(BASE_RADIUS,
								std::min(std::min(std::abs(1 - logical_x), std::abs(1 + logical_x)),
										 std::min(std::abs(1 - logical_y), std::abs(1 + logical_y))));

	// Randomize dominant color and color mix
	int strong_color = rand() % 3;
	float red = get_random(0.0, 0.3);
	float green = get_random(0.0, 0.3);
	float blue = get_random(0.0, 0.3);

	switch(strong_color % 3)
	{
	case 0:
		red = 0.8;
		break;
	case 1:
		green = 0.8;
		break;
	case 2:
		blue = 0.8;
		break;
	}

	// Prevent new balls inside existing ones
	for (std::vector<Ball>::iterator ball = _balls.begin(); ball != _balls.end(); ++ball)
	{
		glm::vec4 new_center(logical_x, logical_y, 0, 1);
		if (glm::distance(new_center, ball->_position) < ball->_cur_radius)
		{
			return;
		}
	}

	// Create new ball object
	Ball ball(_balls.size(),
			  logical_x,
		      logical_y,
		      get_random(0, 2*M_PI),
		      max_radius,
		      red,
		      green,
		      blue);

	// Set size according to surrounding balls. No need to skip existing balls
	std::set<size_t> skip;
	ball._max_radius = get_new_radius(ball, skip);

	_balls.push_back(ball);
}
예제 #2
0
void flitr::adjustCameraManipulatorHomeForYUp(osgGA::CameraManipulator* m)
{
    m->home(0);
    osg::Vec3d home_eye, home_center, home_up;
    m->getHomePosition(home_eye, home_center, home_up);
    
    // rotate the center to eye vector
    osg::Quat q(osg::DegreesToRadians(90.0),osg::Vec3d(1,0,0));
    osg::Vec3d new_eye = home_center + (q*(home_center-home_eye));
    
    osg::Vec3d new_center(home_center);
    osg::Vec3d new_up(0,1,0);
    
    m->setHomePosition(new_eye, new_center, new_up);
    m->home(0);
}