bool Sculptor::intersect(Array<int, VertexP> * d, const Ray & ray) { if(!d) return false; const int ndst = m_active->vertices->size(); Vector3F pop; float tt; d->begin(); while(!d->end() ) { Vector3F & p = *(d->value()->index->t1); pop = ray.closetPointOnRay(p, &tt); /// select here if(p.distanceTo(pop) < selectRadius()) { VertexP * vert = d->value(); float d = p.distanceTo(ray.m_origin); m_active->updateMinDepth(d); if(d - m_active->minDepth() < 2.f * selectRadius()) { addToStage(vert); addToActive(vert); } } d->next(); } return m_active->vertices->size() > ndst; }
/// mean normal + from center void Sculptor::inflatePoints() { Vector3F nor = m_active->meanNormal; Array<int, VertexP> * vs = m_active->vertices; float wei, round; vs->begin(); while(!vs->end()) { VertexP * l = vs->value(); wei = *l->index->t4; const Vector3F p0(*(l->index->t1)); Vector3F pn = *l->index->t2; /// blow outwards if(pn.dot(nor) < 0.f) pn.reverse(); round = cos(p0.distanceTo(m_active->meanPosition) / selectRadius() * 1.5f ); pn *= round; pn += nor * round; *(l->index->t1) += pn * wei * m_strength * 0.1f; m_tree->displace(l, *(l->index->t1), p0); vs->next(); } smoothPoints(0.4f); }
void Sculptor::selectPoints(const Ray * incident) { m_active->reset(); m_active->incidentRay = *incident; Sequence<Coord3> added; BoundingBox touchedBox; if(!m_march.begin(*incident)) return; while(!m_march.end()) { const std::deque<Vector3F> coords = m_march.touched(selectRadius(), touchedBox); std::deque<Vector3F>::const_iterator it = coords.begin(); for(; it != coords.end(); ++it) { const Coord3 c = m_tree->gridCoord((const float *)&(*it)); /// already tested if(added.find(c)) continue; added.insert(c); Pair<Entity *, Entity> sr = m_tree->findEntity(c); if(sr.index) { Array<int, VertexP> * pl = static_cast<Array<int, VertexP> * >(sr.index); intersect(pl, *incident); } } float tmin, tmax; touchedBox.intersect(*incident, &tmin, &tmax); /// std::cout<<" tmin "<<tmin<<" "<<m_active->meanDepth(); if((tmin - m_active->minDepth() ) > selectRadius() ) { break; } m_march.step(); } m_active->finish(); }
/** reset all dialog items to default values */ void WaypointImpFilterDialog::slotClear() { useAll->setChecked( true ); airfields->setChecked( false ); gliderfields->setChecked( false ); navaids->setChecked( false ); outlandings->setChecked( false ); obstacles->setChecked( false ); landmarks->setChecked( false ); hotspots->setChecked( false ); slotChangeUseAll(); fromLat->setKFLogDegree( 0 ); fromLong->setKFLogDegree( 0 ); toLat->setKFLogDegree( 0 ); toLong->setKFLogDegree( 0 ); centerLat->setKFLogDegree( 0 ); centerLong->setKFLogDegree( 0 ); rb0->setChecked( false ); rb1->setChecked( true ); rb2->setChecked( false ); rb3->setChecked( false ); rbf0->setChecked( true ); rbf1->setChecked( false ); save.usedFilter = WaypointCatalog::Radius; save.radiusIdxPosition = 6; save.radiusIdxHome = 6; save.radiusIdxMap = 6; save.radiusIdxAirfield = 6; save.airfieldRefIdx = 0; radius->setCurrentIndex( 6 ); airfieldRefBox->setCurrentIndex( 0 ); selectRadius(CENTER_HOMESITE); slotFilterChanged( WaypointCatalog::Radius ); }
/** restore all dialog items to the saved values */ void WaypointImpFilterDialog::restoreValues() { useAll->setChecked( save.useAll ); airfields->setChecked( save.airfields ); gliderfields->setChecked( save.gliderfields ); navaids->setChecked( save.navaids ); outlandings->setChecked( save.outlandings ); obstacles->setChecked( save.obstacles ); landmarks->setChecked( save.landmarks ); hotspots->setChecked( save.hotspots ); fromLat->setKFLogDegree( save.fromLat ); fromLong->setKFLogDegree( save.fromLong ); toLat->setKFLogDegree( save.toLat ); toLong->setKFLogDegree( save.toLong ); centerLat->setKFLogDegree( save.centerLat ); centerLong->setKFLogDegree( save.centerLong ); rb0->setChecked( save.rb0 ); rb1->setChecked( save.rb1 ); rb2->setChecked( save.rb2 ); rb3->setChecked( save.rb3 ); rbf0->setChecked( save.rbf0 ); rbf1->setChecked( save.rbf1 ); airfieldRefBox->setCurrentIndex( save.airfieldRefIdx ); loadRadiusValue(); selectRadius(save.centerRef); if( save.rbf1 ) { slotFilterChanged( WaypointCatalog::Area ); } else { slotFilterChanged( WaypointCatalog::Radius ); } }
WaypointImpFilterDialog::WaypointImpFilterDialog( QWidget *parent ) : QDialog(parent), centerRef(CENTER_HOMESITE) { setObjectName( "WaypointImpFilterDialog" ); setWindowTitle(tr("Waypoint Filter")); setModal( true ); save.usedFilter = WaypointCatalog::Radius; save.radiusIdxPosition = 6; save.radiusIdxHome = 6; save.radiusIdxMap = 6; save.radiusIdxAirfield = 6; save.airfieldRefIdx = 0; // create checkboxes useAll = new QCheckBox(tr("Check/Uncheck all")); airfields = new QCheckBox(tr("&Airfields")); gliderfields = new QCheckBox(tr("&Gliderfields")); outlandings = new QCheckBox(tr("Ou&tlandings")); navaids = new QCheckBox(tr("&Navaids")); obstacles = new QCheckBox(tr("O&bstacles")); landmarks = new QCheckBox(tr("&Landmarks")); hotspots = new QCheckBox(tr("&Hotspots")); connect(useAll, SIGNAL(clicked()), this, SLOT(slotChangeUseAll())); QVBoxLayout *typeLayout = new QVBoxLayout; typeLayout->setSpacing( 10 ); typeLayout->addWidget( useAll ); typeLayout->addSpacing( 10 ); typeLayout->addWidget( airfields ); typeLayout->addWidget( gliderfields ); typeLayout->addWidget( outlandings ); typeLayout->addWidget( navaids ); typeLayout->addWidget( obstacles ); typeLayout->addWidget( landmarks ); typeLayout->addWidget( hotspots ); QGroupBox* typeGroup = new QGroupBox( tr("Type") ); typeGroup->setLayout( typeLayout ); //--------------------------------------------------------------------------- rbf0 = new QRadioButton(tr("Radius")); rbf1 = new QRadioButton(tr("Area")); QButtonGroup* filterButtonGroup = new QButtonGroup(this); filterButtonGroup->setExclusive(true); filterButtonGroup->addButton( rbf0, WaypointCatalog::Radius ); filterButtonGroup->addButton( rbf1, WaypointCatalog::Area ); connect( filterButtonGroup, SIGNAL( buttonClicked(int)), this, SLOT(slotFilterChanged(int)) ); QHBoxLayout* filterBox = new QHBoxLayout; filterBox->addWidget( rbf0 ); filterBox->addSpacing( 10 ); filterBox->addWidget( rbf1 ); filterBox->addStretch( 10 ); filterGroup = new QGroupBox( tr("Filter") ); filterGroup->setLayout( filterBox ); //--------------------------------------------------------------------------- fromLat = new LatEdit; fromLong = new LongEdit; QGridLayout* fromGrid = new QGridLayout; fromGrid->setSpacing( 10 ); fromGrid->addWidget( new QLabel(tr("Lat:")), 0 , 0 ); fromGrid->addWidget( fromLat, 0, 1 ); fromGrid->setColumnMinimumWidth( 2, 10 ); fromGrid->addWidget( new QLabel(tr("Lon:")), 0 , 3 ); fromGrid->addWidget( fromLong, 0, 4 ); fromGrid->setColumnStretch( 5, 10 ); fromGroup = new QGroupBox( tr("Area From") ); fromGroup->setLayout( fromGrid ); //--------------------------------------------------------------------------- toLat = new LatEdit; toLong = new LongEdit; QGridLayout* toGrid = new QGridLayout; toGrid->setSpacing( 10 ); toGrid->addWidget( new QLabel(tr("Lat:")), 0 , 0 ); toGrid->addWidget( toLat, 0, 1 ); toGrid->setColumnMinimumWidth( 2, 10 ); toGrid->addWidget( new QLabel(tr("Lon:")), 0 , 3 ); toGrid->addWidget( toLong, 0, 4 ); toGrid->setColumnStretch( 5, 10 ); toGroup = new QGroupBox( tr("Area to") ); toGroup->setLayout( toGrid ); //--------------------------------------------------------------------------- rb0 = new QRadioButton(tr("Position")); rb1 = new QRadioButton(tr("Homesite")); rb2 = new QRadioButton(tr("Center of Map")); rb3 = new QRadioButton(tr("Airfield")); QButtonGroup* radiusButtonGroup = new QButtonGroup(this); radiusButtonGroup->setExclusive(true); radiusButtonGroup->addButton( rb0, CENTER_POS ); radiusButtonGroup->addButton( rb1, CENTER_HOMESITE ); radiusButtonGroup->addButton( rb2, CENTER_MAP ); radiusButtonGroup->addButton( rb3, CENTER_AIRFIELD ); connect( radiusButtonGroup, SIGNAL( buttonClicked(int)), this, SLOT(selectRadius(int)) ); centerLat = new LatEdit; centerLong = new LongEdit; airfieldRefBox = new QComboBox; radiusUnit = new QLabel; connect( airfieldRefBox, SIGNAL(currentIndexChanged(const QString&)), this, SLOT(slotAirfieldRefChanged(const QString&)) ); radius = new QComboBox; radius->setEditable( true ); radius->setValidator( new QIntValidator(1, 10000, this) ); QStringList itemList; itemList << tr("Off") << "10" << "25" << "50" << "100" << "250" << "500" << "750" << "1000" << "1500" << "2000"; radius->addItems( itemList ); radius->setCurrentIndex( 5 ); connect( radius, SIGNAL(currentIndexChanged(int)), SLOT(slotRadiusChanged(int)) ); QGridLayout *radiusGrid = new QGridLayout; radiusGrid->setSpacing(10); radiusGrid->addWidget( rb0, 0, 0 ); radiusGrid->addWidget( new QLabel(tr("Lat:")), 0, 1 ); radiusGrid->addWidget( centerLat, 0, 2); radiusGrid->addWidget( new QLabel(tr("Lon:")), 0, 3 ); radiusGrid->addWidget( centerLong, 0, 4 ); radiusGrid->addWidget( rb1, 1, 0 ); radiusGrid->addWidget( rb2, 2, 0 ); radiusGrid->addWidget( rb3, 3, 0 ); radiusGrid->addWidget( airfieldRefBox, 3, 2 ); radiusGrid->addWidget( radiusUnit, 4, 0 ); radiusGrid->addWidget( radius, 4, 2 ); radiusGrid->setColumnStretch( 5, 10 ); radiusGroup = new QGroupBox( tr("Radius") ); radiusGroup->setLayout( radiusGrid ); //--------------------------------------------------------------------------- QHBoxLayout *buttonBox = new QHBoxLayout; QPushButton *b = new QPushButton(tr("&Clear"), this); connect(b, SIGNAL(clicked()), this, SLOT(slotClear())); buttonBox->addWidget(b); buttonBox->addStretch( 10 ); b = new QPushButton(tr("&Ok"), this); b->setDefault(true); connect(b, SIGNAL(clicked()), this, SLOT(slotOk())); buttonBox->addWidget(b); b = new QPushButton(tr("&Cancel"), this); connect(b, SIGNAL(clicked()), this, SLOT(slotCancel())); buttonBox->addWidget(b); //--------------------------------------------------------------------------- QVBoxLayout *ftrBox = new QVBoxLayout; ftrBox->addWidget( filterGroup ); ftrBox->addWidget( fromGroup ); ftrBox->addWidget( toGroup ); ftrBox->addWidget( radiusGroup ); ftrBox->addStretch( 10 ); QHBoxLayout *hBox = new QHBoxLayout; hBox->addWidget( typeGroup ); hBox->addLayout( ftrBox ); QVBoxLayout *top = new QVBoxLayout; top->addLayout( hBox ); top->addLayout( buttonBox ); setLayout( top ); slotClear(); slotChangeUseAll(); selectRadius(CENTER_HOMESITE); loadRadiusValue(); }
void Sculptor::pushPoints() { movePointsAlong(m_active->meanNormal, -0.04f * selectRadius()); }