#4999 Refactoring point target manipulator part manager preparing for fix

This commit is contained in:
Jacob Støren 2019-11-06 10:30:05 +01:00
parent 3aa4e37383
commit 25b97c9cca
2 changed files with 96 additions and 52 deletions

View File

@ -46,7 +46,7 @@
RicPointTangentManipulatorPartMgr::RicPointTangentManipulatorPartMgr() RicPointTangentManipulatorPartMgr::RicPointTangentManipulatorPartMgr()
: m_tangentOnStartManipulation( cvf::Vec3d::UNDEFINED ) : m_tangentOnStartManipulation( cvf::Vec3d::UNDEFINED )
, m_originOnStartManipulation( cvf::Vec3d::UNDEFINED ) , m_originOnStartManipulation( cvf::Vec3d::UNDEFINED )
, m_currentHandleIndex( cvf::UNDEFINED_SIZE_T ) , m_activeHandle( NONE )
, m_handleSize( 1.0 ) , m_handleSize( 1.0 )
{ {
} }
@ -104,7 +104,7 @@ void RicPointTangentManipulatorPartMgr::originAndTangent( cvf::Vec3d* origin, cv
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
bool RicPointTangentManipulatorPartMgr::isManipulatorActive() const bool RicPointTangentManipulatorPartMgr::isManipulatorActive() const
{ {
return m_currentHandleIndex != cvf::UNDEFINED_SIZE_T; return m_activeHandle != NONE;
} }
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
@ -112,14 +112,14 @@ bool RicPointTangentManipulatorPartMgr::isManipulatorActive() const
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
void RicPointTangentManipulatorPartMgr::appendPartsToModel( cvf::ModelBasicList* model ) void RicPointTangentManipulatorPartMgr::appendPartsToModel( cvf::ModelBasicList* model )
{ {
if ( !m_handleParts.size() ) if ( m_handleParts.empty() )
{ {
recreateAllGeometryAndParts(); recreateAllGeometryAndParts();
} }
for ( size_t i = 0; i < m_handleParts.size(); i++ ) for ( auto& idPartIt : m_handleParts )
{ {
model->addPart( m_handleParts.at( i ) ); model->addPart( idPartIt.second.p() );
} }
for ( auto activeModePart : m_activeDragModeParts ) for ( auto activeModePart : m_activeDragModeParts )
@ -142,14 +142,14 @@ void RicPointTangentManipulatorPartMgr::tryToActivateManipulator( const cvf::Hit
if ( !pickedPart ) return; if ( !pickedPart ) return;
for ( size_t i = 0; i < m_handleParts.size(); i++ ) for ( auto& idPartIt : m_handleParts )
{ {
if ( pickedPart == m_handleParts.at( i ) ) if ( pickedPart == idPartIt.second.p() )
{ {
m_initialPickPoint = intersectionPoint; m_initialPickPoint = intersectionPoint;
m_tangentOnStartManipulation = m_tangent; m_tangentOnStartManipulation = m_tangent;
m_originOnStartManipulation = m_origin; m_originOnStartManipulation = m_origin;
m_currentHandleIndex = i; m_activeHandle = idPartIt.first;
} }
} }
} }
@ -162,7 +162,7 @@ void RicPointTangentManipulatorPartMgr::updateManipulatorFromRay( const cvf::Ray
{ {
if ( !isManipulatorActive() ) return; if ( !isManipulatorActive() ) return;
if ( m_handleIds[m_currentHandleIndex] == HORIZONTAL_PLANE ) if ( m_activeHandle == HORIZONTAL_PLANE )
{ {
cvf::Plane plane; cvf::Plane plane;
plane.setFromPointAndNormal( m_origin, cvf::Vec3d::Z_AXIS ); plane.setFromPointAndNormal( m_origin, cvf::Vec3d::Z_AXIS );
@ -173,7 +173,7 @@ void RicPointTangentManipulatorPartMgr::updateManipulatorFromRay( const cvf::Ray
m_origin = newOrigin; m_origin = newOrigin;
} }
else if ( m_handleIds[m_currentHandleIndex] == VERTICAL_AXIS ) else if ( m_activeHandle == VERTICAL_AXIS )
{ {
cvf::Plane plane; cvf::Plane plane;
cvf::Vec3d planeNormal = ( newMouseRay->direction() ^ cvf::Vec3d::Z_AXIS ) ^ cvf::Vec3d::Z_AXIS; cvf::Vec3d planeNormal = ( newMouseRay->direction() ^ cvf::Vec3d::Z_AXIS ) ^ cvf::Vec3d::Z_AXIS;
@ -201,7 +201,7 @@ void RicPointTangentManipulatorPartMgr::updateManipulatorFromRay( const cvf::Ray
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
void RicPointTangentManipulatorPartMgr::endManipulator() void RicPointTangentManipulatorPartMgr::endManipulator()
{ {
m_currentHandleIndex = cvf::UNDEFINED_SIZE_T; m_activeHandle = NONE;
} }
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
@ -209,7 +209,6 @@ void RicPointTangentManipulatorPartMgr::endManipulator()
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
void RicPointTangentManipulatorPartMgr::clearAllGeometryAndParts() void RicPointTangentManipulatorPartMgr::clearAllGeometryAndParts()
{ {
m_handleIds.clear();
m_handleParts.clear(); m_handleParts.clear();
m_activeDragModeParts.clear(); m_activeDragModeParts.clear();
} }
@ -222,6 +221,25 @@ void RicPointTangentManipulatorPartMgr::recreateAllGeometryAndParts()
createAllHandleParts(); createAllHandleParts();
} }
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void RicPointTangentManipulatorPartMgr::clearGeometryOnly()
{
for ( auto& idPartIt : m_handleParts )
{
idPartIt.second->setDrawable( nullptr );
}
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void RicPointTangentManipulatorPartMgr::createGeometryOnly()
{
// m_handleParts[]
}
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
/// ///
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
@ -237,23 +255,8 @@ void RicPointTangentManipulatorPartMgr::createAllHandleParts()
void RicPointTangentManipulatorPartMgr::createHorizontalPlaneHandle() void RicPointTangentManipulatorPartMgr::createHorizontalPlaneHandle()
{ {
using namespace cvf; using namespace cvf;
cvf::ref<cvf::Vec3fArray> vertexArray = new cvf::Vec3fArray( 6 );
vertexArray->set( 0, {-1, -1, 0} ); ref<cvf::DrawableGeo> geo = createHorizontalPlaneGeo();
vertexArray->set( 1, {1, -1, 0} );
vertexArray->set( 2, {1, 1, 0} );
vertexArray->set( 3, {-1, -1, 0} );
vertexArray->set( 4, {1, 1, 0} );
vertexArray->set( 5, {-1, 1, 0} );
Vec3f origin( m_origin );
for ( cvf::Vec3f& vx : *vertexArray )
{
vx *= 0.5 * m_handleSize;
vx += origin;
}
ref<DrawableGeo> geo = createTriangelDrawableGeo( vertexArray.p() );
HandleType handleId = HORIZONTAL_PLANE; HandleType handleId = HORIZONTAL_PLANE;
cvf::Color4f color = cvf::Color4f( 1.0f, 0.0f, 1.0f, 0.5f ); cvf::Color4f color = cvf::Color4f( 1.0f, 0.0f, 1.0f, 0.5f );
@ -262,15 +265,56 @@ void RicPointTangentManipulatorPartMgr::createHorizontalPlaneHandle()
addHandlePart( geo.p(), color, handleId, partName ); addHandlePart( geo.p(), color, handleId, partName );
} }
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
cvf::ref<cvf::DrawableGeo> RicPointTangentManipulatorPartMgr::createHorizontalPlaneGeo()
{
using namespace cvf;
cvf::ref<cvf::Vec3fArray> vertexArray = new cvf::Vec3fArray( 6 );
vertexArray->set( 0, { -1, -1, 0 } );
vertexArray->set( 1, { 1, -1, 0 } );
vertexArray->set( 2, { 1, 1, 0 } );
vertexArray->set( 3, { -1, -1, 0 } );
vertexArray->set( 4, { 1, 1, 0 } );
vertexArray->set( 5, { -1, 1, 0 } );
Vec3f origin( m_origin );
for ( cvf::Vec3f& vx : *vertexArray )
{
vx *= 0.5 * m_handleSize;
vx += origin;
}
return createTriangelDrawableGeo( vertexArray.p() );
}
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
/// ///
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
void RicPointTangentManipulatorPartMgr::createVerticalAxisHandle() void RicPointTangentManipulatorPartMgr::createVerticalAxisHandle()
{
using namespace cvf;
cvf::ref<cvf::DrawableGeo> geo = createVertexAxisGeo();
HandleType handleId = VERTICAL_AXIS;
cvf::Color4f color = cvf::Color4f( 0.0f, 0.2f, 0.8f, 0.5f );
cvf::String partName( "PointTangentManipulator Vertical Axis Handle" );
addHandlePart( geo.p(), color, handleId, partName );
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
cvf::ref<cvf::DrawableGeo> RicPointTangentManipulatorPartMgr::createVertexAxisGeo()
{ {
using namespace cvf; using namespace cvf;
cvf::ref<cvf::GeometryBuilderTriangles> geomBuilder = new cvf::GeometryBuilderTriangles; cvf::ref<cvf::GeometryBuilderTriangles> geomBuilder = new cvf::GeometryBuilderTriangles;
cvf::GeometryUtils::createBox( {-0.3f, -0.3f, -1.0f}, {0.3f, 0.3f, 1.0f}, geomBuilder.p() ); cvf::GeometryUtils::createBox( { -0.3f, -0.3f, -1.0f }, { 0.3f, 0.3f, 1.0f }, geomBuilder.p() );
cvf::ref<cvf::Vec3fArray> vertexArray = geomBuilder->vertices(); cvf::ref<cvf::Vec3fArray> vertexArray = geomBuilder->vertices();
cvf::ref<cvf::UIntArray> indexArray = geomBuilder->triangles(); cvf::ref<cvf::UIntArray> indexArray = geomBuilder->triangles();
@ -282,13 +326,7 @@ void RicPointTangentManipulatorPartMgr::createVerticalAxisHandle()
vx += origin; vx += origin;
} }
ref<DrawableGeo> geo = createIndexedTriangelDrawableGeo( vertexArray.p(), indexArray.p() ); return createIndexedTriangelDrawableGeo( vertexArray.p(), indexArray.p() );
HandleType handleId = VERTICAL_AXIS;
cvf::Color4f color = cvf::Color4f( 0.0f, 0.2f, 0.8f, 0.5f );
cvf::String partName( "PointTangentManipulator Vertical Axis Handle" );
addHandlePart( geo.p(), color, handleId, partName );
} }
#if 0 #if 0
@ -369,9 +407,7 @@ void RicPointTangentManipulatorPartMgr::addHandlePart( cvf::DrawableGeo* geo,
const cvf::String& partName ) const cvf::String& partName )
{ {
cvf::ref<cvf::Part> handlePart = createPart( geo, color, partName ); cvf::ref<cvf::Part> handlePart = createPart( geo, color, partName );
m_handleParts[handleId] = handlePart;
m_handleParts.push_back( handlePart.p() );
m_handleIds.push_back( handleId );
} }
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------

View File

@ -25,6 +25,8 @@
#include "cvfMatrix4.h" #include "cvfMatrix4.h"
#include "cvfVector3.h" #include "cvfVector3.h"
#include <map>
namespace cvf namespace cvf
{ {
class ModelBasicList; class ModelBasicList;
@ -49,7 +51,8 @@ public:
HORIZONTAL_PLANE, HORIZONTAL_PLANE,
VERTICAL_AXIS, VERTICAL_AXIS,
AZIMUTH, AZIMUTH,
INCLINATION INCLINATION,
NONE
}; };
public: public:
@ -69,12 +72,18 @@ public:
void appendPartsToModel( cvf::ModelBasicList* model ); void appendPartsToModel( cvf::ModelBasicList* model );
private: private:
void clearGeometryOnly();
void createGeometryOnly();
void createAllHandleParts(); void createAllHandleParts();
void clearAllGeometryAndParts(); void clearAllGeometryAndParts();
void recreateAllGeometryAndParts(); void recreateAllGeometryAndParts();
void createHorizontalPlaneHandle(); void createHorizontalPlaneHandle();
void createVerticalAxisHandle(); cvf::ref<cvf::DrawableGeo> createHorizontalPlaneGeo();
void createVerticalAxisHandle();
cvf::ref<cvf::DrawableGeo> createVertexAxisGeo();
void addHandlePart( cvf::DrawableGeo* geo, const cvf::Color4f& color, HandleType handleId, const cvf::String& partName ); void addHandlePart( cvf::DrawableGeo* geo, const cvf::Color4f& color, HandleType handleId, const cvf::String& partName );
@ -89,14 +98,13 @@ private:
static cvf::ref<cvf::Part> createPart( cvf::DrawableGeo* geo, const cvf::Color4f& color, const cvf::String& partName ); static cvf::ref<cvf::Part> createPart( cvf::DrawableGeo* geo, const cvf::Color4f& color, const cvf::String& partName );
private: private:
size_t m_currentHandleIndex; HandleType m_activeHandle;
std::vector<HandleType> m_handleIds; // These arrays have the same length std::map<HandleType, cvf::ref<cvf::Part>> m_handleParts; // These arrays have the same length
cvf::Collection<cvf::Part> m_handleParts; // These arrays have the same length cvf::Collection<cvf::Part> m_activeDragModeParts;
cvf::Collection<cvf::Part> m_activeDragModeParts; cvf::Vec3d m_origin;
cvf::Vec3d m_origin; cvf::Vec3d m_tangent;
cvf::Vec3d m_tangent; double m_handleSize;
double m_handleSize; cvf::Vec3d m_initialPickPoint;
cvf::Vec3d m_initialPickPoint; cvf::Vec3d m_tangentOnStartManipulation;
cvf::Vec3d m_tangentOnStartManipulation; cvf::Vec3d m_originOnStartManipulation;
cvf::Vec3d m_originOnStartManipulation;
}; };