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); }
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); }