コード例 #1
0
ファイル: CurveCreateTool.cpp プロジェクト: goofoo/Helium
bool CurveCreateTool::MouseDown( const MouseButtonInput& e )
{
    if ( m_Instance.ReferencesObject() && m_Scene->IsEditable() )
    {
        Math::Vector3 position;
        PickPosition( e.GetPosition().x, e.GetPosition().y, position );

        CurveControlPointPtr point = new CurveControlPoint();
        point->SetOwner( m_Scene );
        point->SetParent( m_Instance );
        point->SetTransient( true );
        point->SetPosition( position );
        m_Scene->AddObject( point );

        m_Instance->Dirty();

        m_Scene->Execute( true );
    }

    return __super::MouseDown( e );
}
コード例 #2
0
void CurveCreateTool::CreateInstance( const Vector3& position )
{
    if (m_Instance.ReferencesObject())
    {
        // remove temp reference
        m_Scene->RemoveObject( m_Instance );
    }

    m_Instance = new Curve();
    m_Instance->SetOwner( m_Scene );
    m_Instance->Initialize();
    m_Instance->SetSelected( true );
    m_Instance->SetTransient( true );
    m_Instance->SetCurveType( (int)s_CurveType );
    m_Scene->AddObject( m_Instance );

    CurveControlPointPtr point = new CurveControlPoint();
    point->SetOwner( m_Scene );
    point->Initialize();
    point->SetParent( m_Instance );
    point->SetPosition( position );
    point->SetTransient( true );
    m_Scene->AddObject( point );

    m_Instance->Evaluate( GraphDirections::Downstream );
}
コード例 #3
0
ファイル: CurveEditTool.cpp プロジェクト: euler0/Helium
bool CurveEditTool::MouseDown( const MouseButtonInput& e )
{
    bool success = true;

    if ( GetEditMode() == CurveEditModes::Modify )
    {
        success = m_ControlPointManipulator->MouseDown( e );
    }
    else
    {
        Curve* curve = NULL;

        {
            FrustumLinePickVisitor pick (m_Scene->GetViewport()->GetCamera(), e.GetPosition().x, e.GetPosition().y);

            m_Scene->Pick( &pick );

            V_PickHitSmartPtr sorted;
            PickHit::Sort(m_Scene->GetViewport()->GetCamera(), pick.GetHits(), sorted, PickSortTypes::Intersection);

            for ( V_PickHitSmartPtr::const_iterator itr = sorted.begin(), end = sorted.end(); itr != end; ++itr )
            {
                if ( curve = Reflect::SafeCast<Curve>( (*itr)->GetHitObject() ) )
                {
                    break;
                }
            }
        }

        if ( !curve || !m_Scene->IsEditable() )
        {
            return false;
        }

        LinePickVisitor pick (m_Scene->GetViewport()->GetCamera(), e.GetPosition().x, e.GetPosition().y);

        switch ( GetEditMode() )
        {
        case CurveEditModes::Insert:
            {
                std::pair<uint32_t, uint32_t> points;
                if ( !curve->ClosestControlPoints( &pick, points ) )
                {
                    return false;
                }

                CurveControlPoint* p0 = curve->GetControlPointByIndex( points.first );
                CurveControlPoint* p1 = curve->GetControlPointByIndex( points.second );

                Vector3 a( p0->GetPosition() );
                Vector3 b( p1->GetPosition() );
                Vector3 p;

                if ( curve->GetCurveType() == CurveType::Linear )
                {
                    float mu;

                    if ( !pick.GetPickSpaceLine().IntersectsSegment( a, b, -1.0f, &mu ) )
                    {
                        return false;
                    }

                    p = a * ( 1.0f - mu ) + b * mu;
                }
                else
                {
                    p = ( a + b ) * 0.5f;
                }

                uint32_t index = points.first > points.second ? points.first : points.second;

                CurveControlPointPtr point = new CurveControlPoint();
                point->SetOwner( curve->GetOwner() );
                point->Initialize();

                curve->GetOwner()->Push( curve->InsertControlPointAtIndex( index, point ) );
                break;
            }

        case CurveEditModes::Remove:
            {
                int32_t index = curve->ClosestControlPoint( &pick );

                if ( index < 0 )
                {
                    return false;
                }

                curve->GetOwner()->Push( curve->RemoveControlPointAtIndex( index ) );
                break;
            }
        }

        curve->Dirty();

        m_Scene->Execute( false );
    }

    return success || Base::MouseDown( e );
}