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