コード例 #1
0
ファイル: Sculptor.cpp プロジェクト: spinos/aphid
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;
}
コード例 #2
0
ファイル: Sculptor.cpp プロジェクト: spinos/aphid
/// 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);
}
コード例 #3
0
ファイル: Sculptor.cpp プロジェクト: spinos/aphid
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();
}
コード例 #4
0
/** 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 );
}
コード例 #5
0
/** 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 );
    }
}
コード例 #6
0
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();
}
コード例 #7
0
ファイル: Sculptor.cpp プロジェクト: spinos/aphid
void Sculptor::pushPoints()
{ movePointsAlong(m_active->meanNormal, -0.04f * selectRadius()); }