mirror of
https://github.com/lucaspalomodevelop/meshlab.git
synced 2026-03-17 01:54:42 +00:00
[ virtual scan ]
- deleted standard filter "filter_virtual_range_scan" - added new edit filter "edit_virtual_scan". now the mesh color is correctly sampled and textures are exploited in the scanning process.
This commit is contained in:
parent
4ff992eabc
commit
8e4c7417ac
22
src/fgt/edit_virtual_scan/edit_virtual_scan.pro
Normal file
22
src/fgt/edit_virtual_scan/edit_virtual_scan.pro
Normal file
@ -0,0 +1,22 @@
|
||||
include( ../../shared.pri )
|
||||
|
||||
QT += opengl
|
||||
|
||||
HEADERS += edit_virtual_scan_factory.h \
|
||||
edit_virtual_scan_plugin.h \
|
||||
edit_vs_widget.h \
|
||||
my_gl_widget.h \
|
||||
vs/povs_generator.h \
|
||||
vs/resources.h \
|
||||
vs/sampler.h \
|
||||
vs/simple_renderer.h \
|
||||
vs/stages.h \
|
||||
vs/utils.h
|
||||
|
||||
SOURCES += edit_virtual_scan_factory.cpp \
|
||||
edit_virtual_scan_plugin.cpp \
|
||||
edit_vs_widget.cpp
|
||||
|
||||
TARGET = edit_virtual_scan
|
||||
|
||||
RESOURCES += edit_virtual_scan.qrc
|
||||
5
src/fgt/edit_virtual_scan/edit_virtual_scan.qrc
Normal file
5
src/fgt/edit_virtual_scan/edit_virtual_scan.qrc
Normal file
@ -0,0 +1,5 @@
|
||||
<RCC>
|
||||
<qresource prefix = "/" >
|
||||
<file>images/icon.png</file>
|
||||
</qresource>
|
||||
</RCC>
|
||||
50
src/fgt/edit_virtual_scan/edit_virtual_scan_factory.cpp
Normal file
50
src/fgt/edit_virtual_scan/edit_virtual_scan_factory.cpp
Normal file
@ -0,0 +1,50 @@
|
||||
#include "edit_virtual_scan_factory.h"
|
||||
#include "edit_virtual_scan_plugin.h"
|
||||
|
||||
EditVirtualScanFactory::EditVirtualScanFactory( void )
|
||||
{
|
||||
editVirtualScan = new QAction( QIcon( ":/images/icon.png" ), "Virtual Scan Sampling", this );
|
||||
|
||||
actionList << editVirtualScan;
|
||||
|
||||
foreach( QAction* editAction, actionList )
|
||||
{
|
||||
editAction->setCheckable( true );
|
||||
}
|
||||
}
|
||||
|
||||
EditVirtualScanFactory::~EditVirtualScanFactory( void )
|
||||
{
|
||||
delete editVirtualScan;
|
||||
}
|
||||
|
||||
QList< QAction* > EditVirtualScanFactory::actions( void ) const
|
||||
{
|
||||
return actionList;
|
||||
}
|
||||
|
||||
MeshEditInterface* EditVirtualScanFactory::getMeshEditInterface( QAction* action )
|
||||
{
|
||||
if( action == editVirtualScan )
|
||||
{
|
||||
return new EditVirtualScanPlugin();
|
||||
}
|
||||
else
|
||||
{
|
||||
assert( 0 );
|
||||
}
|
||||
}
|
||||
|
||||
QString EditVirtualScanFactory::getEditToolDescription( QAction* action )
|
||||
{
|
||||
if( action == editVirtualScan )
|
||||
{
|
||||
return EditVirtualScanPlugin::Info();
|
||||
}
|
||||
else
|
||||
{
|
||||
return tr( "Invalid Operation" );
|
||||
}
|
||||
}
|
||||
|
||||
Q_EXPORT_PLUGIN(EditVirtualScanFactory)
|
||||
31
src/fgt/edit_virtual_scan/edit_virtual_scan_factory.h
Normal file
31
src/fgt/edit_virtual_scan/edit_virtual_scan_factory.h
Normal file
@ -0,0 +1,31 @@
|
||||
#ifndef EDIT_VIRTUAL_SCAN_FACTORY_PLUGIN_H
|
||||
#define EDIT_VIRTUAL_SCAN_FACTORY_PLUGIN_H
|
||||
|
||||
#include <QObject>
|
||||
#include <common/interfaces.h>
|
||||
|
||||
class EditVirtualScanFactory: public QObject, public MeshEditInterfaceFactory
|
||||
{
|
||||
|
||||
Q_OBJECT
|
||||
Q_INTERFACES(MeshEditInterfaceFactory)
|
||||
|
||||
public:
|
||||
|
||||
/* constructor and destructor */
|
||||
EditVirtualScanFactory ( void );
|
||||
virtual ~EditVirtualScanFactory ( void );
|
||||
|
||||
/* MeshEditInterfaceFactory implementation */
|
||||
virtual QList< QAction* > actions ( void ) const;
|
||||
virtual MeshEditInterface* getMeshEditInterface ( QAction* );
|
||||
virtual QString getEditToolDescription ( QAction* );
|
||||
|
||||
private:
|
||||
|
||||
QList< QAction* > actionList;
|
||||
QAction* editVirtualScan;
|
||||
|
||||
};
|
||||
|
||||
#endif
|
||||
230
src/fgt/edit_virtual_scan/edit_virtual_scan_plugin.cpp
Normal file
230
src/fgt/edit_virtual_scan/edit_virtual_scan_plugin.cpp
Normal file
@ -0,0 +1,230 @@
|
||||
#include "edit_virtual_scan_plugin.h"
|
||||
#include "my_gl_widget.h"
|
||||
|
||||
#include <meshlab/glarea.h>
|
||||
|
||||
// #include <GL/glew.h>
|
||||
|
||||
EditVirtualScanPlugin::EditVirtualScanPlugin( void )
|
||||
{
|
||||
dockWidget = 0;
|
||||
editVsWidget = 0;
|
||||
unifyClouds = true;
|
||||
}
|
||||
|
||||
EditVirtualScanPlugin::~EditVirtualScanPlugin( void )
|
||||
{
|
||||
;
|
||||
}
|
||||
|
||||
const QString EditVirtualScanPlugin::Info( void )
|
||||
{
|
||||
return tr( "Virtual Scan Sampling" );
|
||||
}
|
||||
|
||||
bool EditVirtualScanPlugin::StartEdit( MeshModel& m, GLArea* parent )
|
||||
{
|
||||
dockWidget = new QDockWidget( parent->window() );
|
||||
editVsWidget = new EditVsWidget( dockWidget );
|
||||
QPoint p = parent->mapToGlobal( QPoint( 0, 0 ) );
|
||||
|
||||
connectWidgetEvents();
|
||||
|
||||
// get the current rendering mode
|
||||
params.cmDrawMode = parent->rm.drawMode;
|
||||
params.cmColorMode = parent->rm.colorMode;
|
||||
params.cmTextureMode = parent->rm.textureMode;
|
||||
|
||||
// save some useful informations;
|
||||
inputMeshModel = &m;
|
||||
glArea = parent;
|
||||
|
||||
// look for pre-computed povs
|
||||
CMeshO::PerMeshAttributeHandle< std::vector< Pov > > povs_handle;
|
||||
povs_handle = vcg::tri::Allocator< CMeshO >::GetPerMeshAttribute< std::vector< Pov > >( m.cm, "pointofviews" );
|
||||
bool customPovsAvailable = vcg::tri::Allocator< CMeshO >::IsValidHandle( m.cm, povs_handle );
|
||||
if( customPovsAvailable )
|
||||
{
|
||||
params.customPovs = povs_handle();
|
||||
}
|
||||
|
||||
// initialize widgets and indirectly the virtual scanning parameters
|
||||
editVsWidget->initializeWidgets( customPovsAvailable, 25, 0.0f, 1.0f, 0.0f, 360, 6, 200,
|
||||
9, 20, 40, 20, 60, true );
|
||||
|
||||
dockWidget->setAllowedAreas( Qt::LeftDockWidgetArea | Qt::RightDockWidgetArea );
|
||||
dockWidget->setWidget( editVsWidget );
|
||||
dockWidget->setGeometry( 5 + p.x(), p.y() + 5, editVsWidget->width(), parent->height() - 10 );
|
||||
dockWidget->setFloating( true );
|
||||
dockWidget->setVisible( true );
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
void EditVirtualScanPlugin::EndEdit( MeshModel& m, GLArea* parent )
|
||||
{
|
||||
disconnectWidgetEvents();
|
||||
delete editVsWidget;
|
||||
delete dockWidget;
|
||||
}
|
||||
|
||||
void EditVirtualScanPlugin::Decorate( MeshModel& m, GLArea* parent )
|
||||
{
|
||||
;
|
||||
}
|
||||
|
||||
void EditVirtualScanPlugin::mousePressEvent( QMouseEvent* event, MeshModel& m, GLArea* parent )
|
||||
{
|
||||
;
|
||||
}
|
||||
|
||||
void EditVirtualScanPlugin::mouseMoveEvent( QMouseEvent* event, MeshModel& m, GLArea* parent )
|
||||
{
|
||||
;
|
||||
}
|
||||
|
||||
void EditVirtualScanPlugin::mouseReleaseEvent( QMouseEvent* event, MeshModel& m, GLArea* parent )
|
||||
{
|
||||
;
|
||||
}
|
||||
|
||||
void EditVirtualScanPlugin::connectWidgetEvents( void )
|
||||
{
|
||||
QObject::connect ( editVsWidget, SIGNAL(customPovsMode(bool)), this, SLOT(customPovsMode(bool)) );
|
||||
QObject::connect ( editVsWidget, SIGNAL(povsNumberChanged(int)), this, SLOT(povsNumberChanged(int)) );
|
||||
QObject::connect ( editVsWidget, SIGNAL(xAxisChanged(float)), this, SLOT(xAxisChanged(float)) );
|
||||
QObject::connect ( editVsWidget, SIGNAL(yAxisChanged(float)), this, SLOT(yAxisChanged(float)) );
|
||||
QObject::connect ( editVsWidget, SIGNAL(zAxisChanged(float)), this, SLOT(zAxisChanged(float)) );
|
||||
QObject::connect ( editVsWidget, SIGNAL(povConeGapChanged(int)), this, SLOT(povsConeGapChanged(int)) );
|
||||
QObject::connect ( editVsWidget, SIGNAL(uResChanged(int)), this, SLOT(uResChanged(int)) );
|
||||
QObject::connect ( editVsWidget, SIGNAL(uConeGapChanged(int)), this, SLOT(uConeGapChanged(int)) );
|
||||
QObject::connect ( editVsWidget, SIGNAL(fResChanged(int)), this, SLOT(fResChanged(int)) );
|
||||
QObject::connect ( editVsWidget, SIGNAL(bigJumpChanged(float)), this, SLOT(bigJumpChanged(float)) );
|
||||
QObject::connect ( editVsWidget, SIGNAL(borderFGapChanged(int)), this, SLOT(borderFGapChanged(int)) );
|
||||
QObject::connect ( editVsWidget, SIGNAL(smallJumpChanged(float)), this, SLOT(smallJumpChanged(float)) );
|
||||
QObject::connect ( editVsWidget, SIGNAL(normalsAngleChanged(int)), this, SLOT(normalsAngleChanged(int)) );
|
||||
QObject::connect ( editVsWidget, SIGNAL(unifyPointClouds(bool)), this, SLOT(unifyPointClouds(bool)) );
|
||||
QObject::connect ( editVsWidget, SIGNAL(go()), this, SLOT(go()) );
|
||||
}
|
||||
|
||||
void EditVirtualScanPlugin::disconnectWidgetEvents( void )
|
||||
{
|
||||
QObject::disconnect ( editVsWidget, SIGNAL(customPovsMode(bool)), this, SLOT(customPovsMode(bool)) );
|
||||
QObject::disconnect ( editVsWidget, SIGNAL(povsNumberChanged(int)), this, SLOT(povsNumberChanged(int)) );
|
||||
QObject::disconnect ( editVsWidget, SIGNAL(xAxisChanged(float)), this, SLOT(xAxisChanged(float)) );
|
||||
QObject::disconnect ( editVsWidget, SIGNAL(yAxisChanged(float)), this, SLOT(yAxisChanged(float)) );
|
||||
QObject::disconnect ( editVsWidget, SIGNAL(zAxisChanged(float)), this, SLOT(zAxisChanged(float)) );
|
||||
QObject::disconnect ( editVsWidget, SIGNAL(povConeGapChanged(int)), this, SLOT(povsConeGapChanged(int)) );
|
||||
QObject::disconnect ( editVsWidget, SIGNAL(uResChanged(int)), this, SLOT(uResChanged(int)) );
|
||||
QObject::disconnect ( editVsWidget, SIGNAL(uConeGapChanged(int)), this, SLOT(uConeGapChanged(int)) );
|
||||
QObject::disconnect ( editVsWidget, SIGNAL(fResChanged(int)), this, SLOT(fResChanged(int)) );
|
||||
QObject::disconnect ( editVsWidget, SIGNAL(bigJumpChanged(float)), this, SLOT(bigJumpChanged(float)) );
|
||||
QObject::disconnect ( editVsWidget, SIGNAL(borderFGapChanged(int)), this, SLOT(borderFGapChanged(int)) );
|
||||
QObject::disconnect ( editVsWidget, SIGNAL(smallJumpChanged(float)), this, SLOT(smallJumpChanged(float)) );
|
||||
QObject::disconnect ( editVsWidget, SIGNAL(normalsAngleChanged(int)), this, SLOT(normalsAngleChanged(int)) );
|
||||
QObject::disconnect ( editVsWidget, SIGNAL(unifyPointClouds(bool)), this, SLOT(unifyPointClouds(bool)) );
|
||||
QObject::disconnect ( editVsWidget, SIGNAL(go()), this, SLOT(go()) );
|
||||
}
|
||||
|
||||
/* private slots */
|
||||
void EditVirtualScanPlugin::customPovsMode( bool on )
|
||||
{
|
||||
params.useCustomPovs = on;
|
||||
}
|
||||
|
||||
void EditVirtualScanPlugin::povsNumberChanged( int povsNumber )
|
||||
{
|
||||
params.povs = povsNumber;
|
||||
}
|
||||
|
||||
void EditVirtualScanPlugin::xAxisChanged( float newVal )
|
||||
{
|
||||
params.coneAxis[0] = newVal;
|
||||
}
|
||||
|
||||
void EditVirtualScanPlugin::yAxisChanged( float newVal )
|
||||
{
|
||||
params.coneAxis[1] = newVal;
|
||||
}
|
||||
|
||||
void EditVirtualScanPlugin::zAxisChanged( float newVal )
|
||||
{
|
||||
params.coneAxis[2] = newVal;
|
||||
}
|
||||
|
||||
void EditVirtualScanPlugin::povsConeGapChanged( int newGap )
|
||||
{
|
||||
params.coneGap = (float)newGap;
|
||||
}
|
||||
|
||||
void EditVirtualScanPlugin::uResChanged( int newRes )
|
||||
{
|
||||
params.uniformResolution = newRes;
|
||||
}
|
||||
|
||||
void EditVirtualScanPlugin::uConeGapChanged( int newGap )
|
||||
{
|
||||
params.frontFacingConeU = (float)newGap;
|
||||
}
|
||||
|
||||
void EditVirtualScanPlugin::fResChanged( int newRes )
|
||||
{
|
||||
params.featureResolution = newRes;
|
||||
}
|
||||
|
||||
void EditVirtualScanPlugin::bigJumpChanged( float newJump )
|
||||
{
|
||||
params.bigDepthJump = newJump;
|
||||
}
|
||||
|
||||
void EditVirtualScanPlugin::borderFGapChanged( int newGap )
|
||||
{
|
||||
params.frontFacingConeF = newGap;
|
||||
}
|
||||
|
||||
void EditVirtualScanPlugin::smallJumpChanged( float newJump )
|
||||
{
|
||||
params.smallDepthJump = newJump;
|
||||
}
|
||||
|
||||
void EditVirtualScanPlugin::normalsAngleChanged( int newAngle )
|
||||
{
|
||||
params.angleThreshold = newAngle;
|
||||
}
|
||||
|
||||
void EditVirtualScanPlugin::unifyPointClouds( bool unify )
|
||||
{
|
||||
unifyClouds = unify;
|
||||
}
|
||||
|
||||
void EditVirtualScanPlugin::go( void )
|
||||
{
|
||||
assert( glArea && inputMeshModel );
|
||||
CMeshO* firstCloud = 0, *secondCloud = 0;
|
||||
MeshDocument* mDoc = glArea->meshDoc;
|
||||
MeshModel* tmpModel = 0;
|
||||
|
||||
if( unifyClouds )
|
||||
{
|
||||
tmpModel = mDoc->addNewMesh( "VS Point Cloud", 0, false );
|
||||
firstCloud = &( tmpModel->cm );
|
||||
secondCloud = firstCloud;
|
||||
}
|
||||
else
|
||||
{
|
||||
tmpModel = mDoc->addNewMesh( "VS Uniform Samples", 0, false );
|
||||
firstCloud = &( tmpModel->cm );
|
||||
tmpModel = mDoc->addNewMesh( "VS Feature Samples", 0, false );
|
||||
secondCloud = &( tmpModel->cm );
|
||||
}
|
||||
|
||||
MyGLWidget* tmpWidget = new MyGLWidget
|
||||
( ¶ms, inputMeshModel, firstCloud, secondCloud, glArea );
|
||||
bool ok = tmpWidget->result;
|
||||
if( !ok )
|
||||
{
|
||||
QString errorMessage = tmpWidget->errorString;
|
||||
Log( errorMessage.toStdString().c_str() );
|
||||
}
|
||||
delete tmpWidget;
|
||||
}
|
||||
71
src/fgt/edit_virtual_scan/edit_virtual_scan_plugin.h
Normal file
71
src/fgt/edit_virtual_scan/edit_virtual_scan_plugin.h
Normal file
@ -0,0 +1,71 @@
|
||||
#ifndef EDIT_VIRTUAL_SCAN_PLUGIN_H
|
||||
#define EDIT_VIRTUAL_SCAN_PLUGIN_H
|
||||
|
||||
/* Qt includes */
|
||||
#include <QObject>
|
||||
#include <QDockWidget>
|
||||
|
||||
/* meshlab includes */
|
||||
#include <common/interfaces.h>
|
||||
|
||||
/* my includes */
|
||||
#include "edit_vs_widget.h"
|
||||
#include "vs/sampler.h"
|
||||
|
||||
using namespace vs;
|
||||
|
||||
class EditVirtualScanPlugin: public QObject, public MeshEditInterface
|
||||
{
|
||||
|
||||
Q_OBJECT
|
||||
Q_INTERFACES(MeshEditInterface)
|
||||
|
||||
public:
|
||||
|
||||
EditVirtualScanPlugin ( void );
|
||||
virtual ~EditVirtualScanPlugin ( void );
|
||||
|
||||
static const QString Info ( void );
|
||||
|
||||
/* MeshEditInterface implementation */
|
||||
virtual bool StartEdit ( MeshModel& m, GLArea* parent );
|
||||
virtual void EndEdit ( MeshModel& m, GLArea* parent );
|
||||
virtual void Decorate ( MeshModel& m, GLArea* parent );
|
||||
virtual void mousePressEvent ( QMouseEvent* event, MeshModel& m, GLArea* parent );
|
||||
virtual void mouseMoveEvent ( QMouseEvent* event, MeshModel& m, GLArea* parent );
|
||||
virtual void mouseReleaseEvent ( QMouseEvent* event, MeshModel& m, GLArea* parent );
|
||||
|
||||
private:
|
||||
|
||||
VSParameters params;
|
||||
MeshModel* inputMeshModel;
|
||||
bool unifyClouds;
|
||||
GLArea* glArea;
|
||||
|
||||
QDockWidget* dockWidget;
|
||||
EditVsWidget* editVsWidget;
|
||||
|
||||
void connectWidgetEvents ( void );
|
||||
void disconnectWidgetEvents ( void );
|
||||
|
||||
private slots:
|
||||
|
||||
void customPovsMode ( bool on );
|
||||
void povsNumberChanged ( int povsNumber );
|
||||
void xAxisChanged ( float newVal );
|
||||
void yAxisChanged ( float newVal );
|
||||
void zAxisChanged ( float newVal );
|
||||
void povsConeGapChanged ( int newGap );
|
||||
void uResChanged ( int newRes );
|
||||
void uConeGapChanged ( int newGap );
|
||||
void fResChanged ( int newRes );
|
||||
void bigJumpChanged ( float newJump );
|
||||
void borderFGapChanged ( int newGap );
|
||||
void smallJumpChanged ( float newJump );
|
||||
void normalsAngleChanged ( int newAngle );
|
||||
void unifyPointClouds ( bool unify );
|
||||
void go ( void );
|
||||
|
||||
};
|
||||
|
||||
#endif
|
||||
333
src/fgt/edit_virtual_scan/edit_vs_widget.cpp
Normal file
333
src/fgt/edit_virtual_scan/edit_vs_widget.cpp
Normal file
@ -0,0 +1,333 @@
|
||||
#include "edit_vs_widget.h"
|
||||
|
||||
#include <math.h>
|
||||
|
||||
EditVsWidget::EditVsWidget( QWidget* parent, Qt::WindowFlags flags )
|
||||
: QWidget( parent, flags )
|
||||
{
|
||||
this->resize( 300, 200 );
|
||||
|
||||
createWidgets();
|
||||
prepareWidgets();
|
||||
makeEventConnections();
|
||||
}
|
||||
|
||||
EditVsWidget::~EditVsWidget( void )
|
||||
{
|
||||
destroyWidgets();
|
||||
}
|
||||
|
||||
/* widgets management */
|
||||
void EditVsWidget::createWidgets( void )
|
||||
{
|
||||
mainLayout = new QGridLayout( this );
|
||||
|
||||
/* povs group box */
|
||||
povsBox = new QGroupBox( tr( "Povs" ), this );
|
||||
povsBoxLayout = new QGridLayout( povsBox );
|
||||
genPovsRadioBtn = new QRadioButton( tr( "Generate povs within a cone of directions" ), povsBox );
|
||||
savedPovsRadioBtn = new QRadioButton( tr( "Use povs saved in the current mesh" ), povsBox );
|
||||
povsGroup = new QButtonGroup( 0 );
|
||||
povsNumberLabel = new QLabel( tr( "Povs number: " ), povsBox );
|
||||
povsNumberLine = new QLineEdit( povsBox );
|
||||
|
||||
/* cone axis group box */
|
||||
coneAxisBox = new QGroupBox( tr( "Cone Axis" ), povsBox );
|
||||
coneAxisBoxLayout = new QGridLayout( povsBox );
|
||||
xCompLabel = new QLabel( tr( "X component: " ), coneAxisBox );
|
||||
xCompLine = new QLineEdit( coneAxisBox );
|
||||
yCompLabel = new QLabel( tr( "Y component: " ), coneAxisBox );
|
||||
yCompLine = new QLineEdit( coneAxisBox );
|
||||
zCompLabel = new QLabel( tr( "Z component: " ), coneAxisBox );
|
||||
zCompLine = new QLineEdit( coneAxisBox );
|
||||
|
||||
coneAxisBoxLayout->addWidget( xCompLabel, 0, 0, 1, 1 );
|
||||
coneAxisBoxLayout->addWidget( xCompLine, 0, 1, 1, 1 );
|
||||
coneAxisBoxLayout->addWidget( yCompLabel, 1, 0, 1, 1 );
|
||||
coneAxisBoxLayout->addWidget( yCompLine, 1, 1, 1, 1 );
|
||||
coneAxisBoxLayout->addWidget( zCompLabel, 2, 0, 1, 1 );
|
||||
coneAxisBoxLayout->addWidget( zCompLine, 2, 1, 1, 1 );
|
||||
|
||||
coneAxisBox->setLayout( coneAxisBoxLayout );
|
||||
/* ------------------- */
|
||||
|
||||
gapLabel = new QLabel( tr( "Cone gap: " ), povsBox );
|
||||
gapSlider = new QSlider( Qt::Horizontal, povsBox );
|
||||
gapValue = new QLabel( tr( "180°" ), povsBox );
|
||||
|
||||
povsBoxLayout->addWidget( genPovsRadioBtn, 0, 0, 1, 4 );
|
||||
povsBoxLayout->addWidget( povsNumberLabel, 1, 1, 1, 1 );
|
||||
povsBoxLayout->addWidget( povsNumberLine, 1, 2, 1, 2 );
|
||||
povsBoxLayout->addWidget( coneAxisBox, 2, 1, 1, 3 );
|
||||
povsBoxLayout->addWidget( gapLabel, 3, 1, 1, 1 );
|
||||
povsBoxLayout->addWidget( gapSlider, 3, 2, 1, 1 );
|
||||
povsBoxLayout->addWidget( gapValue, 3, 3, 1, 1 );
|
||||
povsBoxLayout->addWidget( savedPovsRadioBtn, 4, 0, 1, 4 );
|
||||
|
||||
povsGroup->addButton( genPovsRadioBtn );
|
||||
povsGroup->addButton( savedPovsRadioBtn );
|
||||
|
||||
povsBox->setLayout( povsBoxLayout );
|
||||
/* ------------------- */
|
||||
|
||||
/* uniform samples group box */
|
||||
uniformBox = new QGroupBox( tr( "Uniform samples" ), this );
|
||||
uniformBoxLayout = new QGridLayout( this );
|
||||
uResLabel = new QLabel( tr( "Viewport side: " ), uniformBox );
|
||||
uResSlider = new QSlider( Qt::Horizontal, uniformBox );
|
||||
uResValue = new QLabel( tr( "64" ), uniformBox );
|
||||
uConeLabel = new QLabel( tr( "Front-facing cone gap: " ), uniformBox );
|
||||
uConeSlider = new QSlider( Qt::Horizontal, uniformBox );
|
||||
uConeValue = new QLabel( tr( "90°" ), uniformBox );
|
||||
|
||||
uniformBoxLayout->addWidget( uResLabel, 0, 0, 1, 1 );
|
||||
uniformBoxLayout->addWidget( uResSlider, 0, 1, 1, 2 );
|
||||
uniformBoxLayout->addWidget( uResValue, 0, 3, 1, 1 );
|
||||
uniformBoxLayout->addWidget( uConeLabel, 1, 0, 1, 1 );
|
||||
uniformBoxLayout->addWidget( uConeSlider, 1, 1, 1, 2 );
|
||||
uniformBoxLayout->addWidget( uConeValue, 1, 3, 1, 1 );
|
||||
|
||||
uniformBox->setLayout( uniformBoxLayout );
|
||||
/* ------------------------- */
|
||||
|
||||
/* feature samples group box */
|
||||
featureBox = new QGroupBox( tr( "Feature samples" ), this );
|
||||
featureBoxLayout = new QGridLayout( this );
|
||||
fResLabel = new QLabel( tr( "Viewport side: " ), featureBox );
|
||||
fResSlider = new QSlider( Qt::Horizontal, featureBox );
|
||||
fResValue = new QLabel( tr( "64" ), featureBox );
|
||||
borderJumpLabel = new QLabel( tr( "Border depth jump: " ), featureBox );
|
||||
borderJumpSlider = new QSlider( Qt::Horizontal, featureBox );
|
||||
borderJumpValue = new QLabel( tr( "20%" ), featureBox );
|
||||
borderFacingLabel = new QLabel( tr( "Facing-border cone gap: " ), featureBox );
|
||||
borderFacingSlider = new QSlider( Qt::Horizontal, featureBox );
|
||||
borderFacingValue = new QLabel( tr( "40°" ), featureBox );
|
||||
patchJumpLabel = new QLabel( tr( "Patch depth jump: " ), featureBox );
|
||||
patchJumpSlider = new QSlider( Qt::Horizontal, featureBox );
|
||||
patchJumpValue = new QLabel( tr( "1%" ), featureBox );
|
||||
normalsAngleLabel = new QLabel( tr( "Normals angle: " ), featureBox );
|
||||
normalsAngleSlider = new QSlider( Qt::Horizontal, featureBox );
|
||||
normalsAngleValue = new QLabel( tr( "40°" ), featureBox );
|
||||
|
||||
featureBoxLayout->addWidget( fResLabel, 0, 0, 1, 1 );
|
||||
featureBoxLayout->addWidget( fResSlider, 0, 1, 1, 2 );
|
||||
featureBoxLayout->addWidget( fResValue, 0, 3, 1, 1 );
|
||||
featureBoxLayout->addWidget( borderJumpLabel, 1, 0, 1, 1 );
|
||||
featureBoxLayout->addWidget( borderJumpSlider, 1, 1, 1, 2 );
|
||||
featureBoxLayout->addWidget( borderJumpValue, 1, 3, 1, 1 );
|
||||
featureBoxLayout->addWidget( borderFacingLabel, 2, 0, 1, 1 );
|
||||
featureBoxLayout->addWidget( borderFacingSlider, 2, 1, 1, 2 );
|
||||
featureBoxLayout->addWidget( borderFacingValue, 2, 3, 1, 1 );
|
||||
featureBoxLayout->addWidget( patchJumpLabel, 3, 0, 1, 1 );
|
||||
featureBoxLayout->addWidget( patchJumpSlider, 3, 1, 1, 2 );
|
||||
featureBoxLayout->addWidget( patchJumpValue, 3, 3, 1, 1 );
|
||||
featureBoxLayout->addWidget( normalsAngleLabel, 4, 0, 1, 1 );
|
||||
featureBoxLayout->addWidget( normalsAngleSlider, 4, 1, 1, 2 );
|
||||
featureBoxLayout->addWidget( normalsAngleValue, 4, 3, 1, 1 );
|
||||
|
||||
featureBox->setLayout( featureBoxLayout );
|
||||
/* ------------------------- */
|
||||
|
||||
unifyCheck = new QCheckBox( tr( "Unify feature and uniform samples" ), this );
|
||||
goBtn = new QPushButton( tr( "Generate samples" ), this );
|
||||
|
||||
mainLayout->addWidget( povsBox, 0, 0, 6, 1 );
|
||||
mainLayout->addWidget( uniformBox, 6, 0, 3, 1 );
|
||||
mainLayout->addWidget( featureBox, 9, 0, 5, 1 );
|
||||
mainLayout->addWidget( unifyCheck, 14, 0, 1, 1 );
|
||||
mainLayout->addWidget( goBtn, 15, 0, 1, 1 );
|
||||
|
||||
this->setLayout( mainLayout );
|
||||
}
|
||||
|
||||
void EditVsWidget::prepareWidgets( void )
|
||||
{
|
||||
povsValidator = new QIntValidator( 1, 9999, this );
|
||||
povsNumberLine->setMaxLength( 4 );
|
||||
povsNumberLine->setValidator( povsValidator );
|
||||
povsNumberLine->setAlignment( Qt::AlignRight );
|
||||
|
||||
axisValidator = new QDoubleValidator( this );
|
||||
QLineEdit* axis[3] = { xCompLine, yCompLine, zCompLine };
|
||||
for( int i=0; i<3; i++ )
|
||||
{
|
||||
axis[i]->setAlignment( Qt::AlignRight );
|
||||
axis[i]->setValidator( axisValidator );
|
||||
}
|
||||
|
||||
gapSlider->setMinimum( 0 );
|
||||
gapSlider->setMaximum( 360 );
|
||||
|
||||
uResSlider->setMinimum( 0 );
|
||||
uResSlider->setMaximum( 13 );
|
||||
|
||||
uConeSlider->setMinimum( 0 );
|
||||
uConeSlider->setMaximum( 200 );
|
||||
|
||||
fResSlider->setMinimum( 0 );
|
||||
fResSlider->setMaximum( 13 );
|
||||
|
||||
borderJumpSlider->setMinimum( 0 );
|
||||
borderJumpSlider->setMaximum( 100 );
|
||||
|
||||
borderFacingSlider->setMinimum( 0 );
|
||||
borderFacingSlider->setMaximum( 200 );
|
||||
|
||||
patchJumpSlider->setMinimum( 0 );
|
||||
patchJumpSlider->setMaximum( 100 );
|
||||
|
||||
normalsAngleSlider->setMinimum( 0 );
|
||||
normalsAngleSlider->setMaximum( 200 );
|
||||
}
|
||||
|
||||
void EditVsWidget::makeEventConnections( void )
|
||||
{
|
||||
QObject::connect( savedPovsRadioBtn, SIGNAL(toggled(bool)), this, SLOT(useSavedPovsRadioToggled(bool)) );
|
||||
QObject::connect( povsNumberLine, SIGNAL(textChanged(QString)), this, SLOT(povsNumberTextChanged(QString)) );
|
||||
QObject::connect( xCompLine, SIGNAL(textChanged(QString)), this, SLOT(xCompTextChanged(QString)) );
|
||||
QObject::connect( yCompLine, SIGNAL(textChanged(QString)), this, SLOT(yCompTextChanged(QString)) );
|
||||
QObject::connect( zCompLine, SIGNAL(textChanged(QString)), this, SLOT(zCompTextChanged(QString)) );
|
||||
QObject::connect( gapSlider, SIGNAL(valueChanged(int)), this, SLOT(gapSliderChanged(int)) );
|
||||
QObject::connect( uResSlider, SIGNAL(valueChanged(int)), this, SLOT(uResSliderChanged(int)) );
|
||||
QObject::connect( uConeSlider, SIGNAL(valueChanged(int)), this, SLOT(uGapSliderChanged(int)) );
|
||||
QObject::connect( fResSlider, SIGNAL(valueChanged(int)), this, SLOT(fResSliderChanged(int)) );
|
||||
QObject::connect( borderJumpSlider, SIGNAL(valueChanged(int)), this, SLOT(borderJumpSliderChanged(int)) );
|
||||
QObject::connect( borderFacingSlider, SIGNAL(valueChanged(int)), this, SLOT(borderFacingSliderChanged(int)) );
|
||||
QObject::connect( patchJumpSlider, SIGNAL(valueChanged(int)), this, SLOT(patchJumpSliderChanged(int)) );
|
||||
QObject::connect( normalsAngleSlider, SIGNAL(valueChanged(int)), this, SLOT(normalsSliderChanged(int)) );
|
||||
QObject::connect( unifyCheck, SIGNAL(toggled(bool)), this, SLOT(unifyCheckToggled(bool)) );
|
||||
QObject::connect( goBtn, SIGNAL(clicked()), this, SLOT(goBtnClicked()) );
|
||||
}
|
||||
|
||||
void EditVsWidget::initializeWidgets( bool useCustomPovs, int povsNumber,
|
||||
float xAxis, float yAxis, float zAxis, int gap,
|
||||
int uRes, int uGap,
|
||||
int fRes, int bigJump, int borderConeGap, int smallJump, int normalsAngle,
|
||||
bool unifyClouds )
|
||||
{
|
||||
savedPovsRadioBtn->setChecked( true ); // little workaround
|
||||
savedPovsRadioBtn->setChecked( useCustomPovs );
|
||||
genPovsRadioBtn->setChecked( !useCustomPovs );
|
||||
povsNumberLine->setText( QString::number( povsNumber ) );
|
||||
xCompLine->setText( QString::number( xAxis ) );
|
||||
yCompLine->setText( QString::number( yAxis ) );
|
||||
zCompLine->setText( QString::number( zAxis ) );
|
||||
gapSlider->setValue( gap );
|
||||
uResSlider->setValue( uRes );
|
||||
uConeSlider->setValue( uGap );
|
||||
fResSlider->setValue( fRes );
|
||||
borderJumpSlider->setValue( bigJump );
|
||||
borderFacingSlider->setValue( borderConeGap );
|
||||
patchJumpSlider->setValue( smallJump );
|
||||
normalsAngleSlider->setValue( normalsAngle );
|
||||
unifyCheck->setChecked( unifyClouds );
|
||||
}
|
||||
|
||||
void EditVsWidget::destroyWidgets( void )
|
||||
{
|
||||
delete genPovsRadioBtn;
|
||||
delete savedPovsRadioBtn;
|
||||
delete povsGroup;
|
||||
delete povsBoxLayout;
|
||||
delete povsBox;
|
||||
delete mainLayout;
|
||||
}
|
||||
|
||||
/* private slots */
|
||||
void EditVsWidget::useSavedPovsRadioToggled( bool toggled )
|
||||
{
|
||||
coneAxisBox->setEnabled( !toggled );
|
||||
povsNumberLabel->setEnabled( !toggled );
|
||||
povsNumberLine->setEnabled( !toggled );
|
||||
gapLabel->setEnabled( !toggled );
|
||||
gapSlider->setEnabled( !toggled );
|
||||
gapValue->setEnabled( !toggled );
|
||||
emit customPovsMode( toggled );
|
||||
}
|
||||
|
||||
void EditVsWidget::povsNumberTextChanged( QString newText )
|
||||
{
|
||||
int val = newText.toInt();
|
||||
emit ( povsNumberChanged( val ) );
|
||||
}
|
||||
|
||||
void EditVsWidget::xCompTextChanged( QString newText )
|
||||
{
|
||||
float comp = newText.toFloat();
|
||||
emit ( xAxisChanged( comp ) );
|
||||
}
|
||||
|
||||
void EditVsWidget::yCompTextChanged( QString newText )
|
||||
{
|
||||
float comp = newText.toFloat();
|
||||
emit ( yAxisChanged( comp ) );
|
||||
}
|
||||
|
||||
void EditVsWidget::zCompTextChanged( QString newText )
|
||||
{
|
||||
float comp = newText.toFloat();
|
||||
emit ( zAxisChanged( comp ) );
|
||||
}
|
||||
|
||||
void EditVsWidget::gapSliderChanged( int val )
|
||||
{
|
||||
gapValue->setText( QString::number( val ) + tr( "°" ) );
|
||||
emit ( povConeGapChanged( val ) );
|
||||
}
|
||||
|
||||
void EditVsWidget::uResSliderChanged( int val )
|
||||
{
|
||||
int resolution = (int)( pow( 2.0, (double)val ) );
|
||||
uResValue->setText( QString::number( resolution ) );
|
||||
emit ( uResChanged( resolution ) );
|
||||
}
|
||||
|
||||
void EditVsWidget::uGapSliderChanged( int val )
|
||||
{
|
||||
uConeValue->setText( QString::number( val ) + tr( "°" ) );
|
||||
emit ( uConeGapChanged( val ) );
|
||||
}
|
||||
|
||||
void EditVsWidget::fResSliderChanged( int val )
|
||||
{
|
||||
int resolution = (int)( pow( 2.0, (double)val ) );
|
||||
fResValue->setText( QString::number( resolution ) );
|
||||
emit ( fResChanged( resolution ) );
|
||||
}
|
||||
|
||||
void EditVsWidget::borderJumpSliderChanged( int val )
|
||||
{
|
||||
borderJumpValue->setText( QString::number( val ) + tr( "%" ) );
|
||||
float jump = val / 100.0f;
|
||||
emit ( bigJumpChanged( jump ) );
|
||||
}
|
||||
|
||||
void EditVsWidget::borderFacingSliderChanged( int val )
|
||||
{
|
||||
borderFacingValue->setText( QString::number( val ) + tr( "°" ) );
|
||||
emit ( borderFGapChanged( val ) );
|
||||
}
|
||||
|
||||
void EditVsWidget::patchJumpSliderChanged( int val )
|
||||
{
|
||||
float jump = ( val / 100.0f ) * 5.0f;
|
||||
patchJumpValue->setText( QString::number( jump ) + tr( "%" ) );
|
||||
float toEmit = jump / 100.0f;
|
||||
emit ( smallJumpChanged( toEmit ) );
|
||||
}
|
||||
|
||||
void EditVsWidget::normalsSliderChanged( int val )
|
||||
{
|
||||
normalsAngleValue->setText( QString::number( val ) + tr( "°" ) );
|
||||
emit ( normalsAngleChanged( val ) );
|
||||
}
|
||||
|
||||
void EditVsWidget::unifyCheckToggled( bool toggled )
|
||||
{
|
||||
emit ( unifyPointClouds( toggled ) );
|
||||
}
|
||||
|
||||
void EditVsWidget::goBtnClicked( void )
|
||||
{
|
||||
emit ( go() );
|
||||
}
|
||||
137
src/fgt/edit_virtual_scan/edit_vs_widget.h
Normal file
137
src/fgt/edit_virtual_scan/edit_vs_widget.h
Normal file
@ -0,0 +1,137 @@
|
||||
#ifndef EDIT_VS_WIDGET_H
|
||||
#define EDIT_VS_WIDGET_H
|
||||
|
||||
/* Qt includes */
|
||||
#include <QWidget>
|
||||
#include <QGridLayout>
|
||||
#include <QGroupBox>
|
||||
#include <QButtonGroup>
|
||||
#include <QRadioButton>
|
||||
#include <QLabel>
|
||||
#include <QLineEdit>
|
||||
#include <QIntValidator>
|
||||
#include <QDoubleValidator>
|
||||
#include <QSlider>
|
||||
#include <QCheckBox>
|
||||
#include <QPushButton>
|
||||
|
||||
class EditVsWidget: public QWidget
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
|
||||
EditVsWidget ( QWidget* parent = 0, Qt::WindowFlags flags = 0 );
|
||||
virtual ~EditVsWidget ( void );
|
||||
|
||||
void initializeWidgets ( bool useCustomPovs, int povsNumber,
|
||||
float xAxis, float yAxis, float zAxis, int gap,
|
||||
int uRes, int uGap,
|
||||
int fRes, int bigJump, int borderConeGap, int smallJump, int normalsAngle,
|
||||
bool unifyClouds );
|
||||
|
||||
signals:
|
||||
|
||||
void customPovsMode ( bool on );
|
||||
void povsNumberChanged ( int povsNumber );
|
||||
void xAxisChanged ( float newComp );
|
||||
void yAxisChanged ( float newComp );
|
||||
void zAxisChanged ( float newComp );
|
||||
void povConeGapChanged ( int newGap );
|
||||
void uResChanged ( int newSide );
|
||||
void uConeGapChanged ( int newGap );
|
||||
void fResChanged ( int newSide );
|
||||
void bigJumpChanged ( float newJump );
|
||||
void borderFGapChanged ( int newGap );
|
||||
void smallJumpChanged ( float newJump );
|
||||
void normalsAngleChanged ( int newAngle );
|
||||
void unifyPointClouds ( bool unify );
|
||||
void go ( void );
|
||||
|
||||
private:
|
||||
|
||||
/* QWidgets-related stuff */
|
||||
QGridLayout* mainLayout;
|
||||
|
||||
QGroupBox* povsBox;
|
||||
QGridLayout* povsBoxLayout;
|
||||
QButtonGroup* povsGroup;
|
||||
QRadioButton* genPovsRadioBtn;
|
||||
QRadioButton* savedPovsRadioBtn;
|
||||
QLabel* povsNumberLabel;
|
||||
QLineEdit* povsNumberLine;
|
||||
|
||||
QGroupBox* coneAxisBox;
|
||||
QGridLayout* coneAxisBoxLayout;
|
||||
QLabel* xCompLabel;
|
||||
QLineEdit* xCompLine;
|
||||
QLabel* yCompLabel;
|
||||
QLineEdit* yCompLine;
|
||||
QLabel* zCompLabel;
|
||||
QLineEdit* zCompLine;
|
||||
|
||||
QLabel* gapLabel;
|
||||
QSlider* gapSlider;
|
||||
QLabel* gapValue;
|
||||
|
||||
QGroupBox* uniformBox;
|
||||
QGridLayout* uniformBoxLayout;
|
||||
QLabel* uResLabel;
|
||||
QSlider* uResSlider;
|
||||
QLabel* uResValue;
|
||||
QLabel* uConeLabel;
|
||||
QSlider* uConeSlider;
|
||||
QLabel* uConeValue;
|
||||
|
||||
QGroupBox* featureBox;
|
||||
QGridLayout* featureBoxLayout;
|
||||
QLabel* fResLabel;
|
||||
QSlider* fResSlider;
|
||||
QLabel* fResValue;
|
||||
QLabel* borderJumpLabel;
|
||||
QSlider* borderJumpSlider;
|
||||
QLabel* borderJumpValue;
|
||||
QLabel* borderFacingLabel;
|
||||
QSlider* borderFacingSlider;
|
||||
QLabel* borderFacingValue;
|
||||
QLabel* patchJumpLabel;
|
||||
QSlider* patchJumpSlider;
|
||||
QLabel* patchJumpValue;
|
||||
QLabel* normalsAngleLabel;
|
||||
QSlider* normalsAngleSlider;
|
||||
QLabel* normalsAngleValue;
|
||||
|
||||
QCheckBox* unifyCheck;
|
||||
QPushButton* goBtn;
|
||||
|
||||
/* other Qt fields */
|
||||
QIntValidator* povsValidator;
|
||||
QDoubleValidator* axisValidator;
|
||||
|
||||
/* private functions */
|
||||
void createWidgets ( void );
|
||||
void destroyWidgets ( void );
|
||||
void prepareWidgets ( void );
|
||||
void makeEventConnections ( void );
|
||||
|
||||
private slots:
|
||||
|
||||
void useSavedPovsRadioToggled ( bool toggled );
|
||||
void povsNumberTextChanged ( QString newText );
|
||||
void xCompTextChanged ( QString newText );
|
||||
void yCompTextChanged ( QString newText );
|
||||
void zCompTextChanged ( QString newText );
|
||||
void gapSliderChanged ( int val );
|
||||
void uResSliderChanged ( int val );
|
||||
void uGapSliderChanged ( int val );
|
||||
void fResSliderChanged ( int val );
|
||||
void borderJumpSliderChanged ( int val );
|
||||
void borderFacingSliderChanged ( int val );
|
||||
void patchJumpSliderChanged ( int val );
|
||||
void normalsSliderChanged ( int val );
|
||||
void unifyCheckToggled ( bool toggled );
|
||||
void goBtnClicked ( void );
|
||||
|
||||
};
|
||||
|
||||
#endif
|
||||
BIN
src/fgt/edit_virtual_scan/images/icon.png
Normal file
BIN
src/fgt/edit_virtual_scan/images/icon.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 3.0 KiB |
@ -1,9 +1,9 @@
|
||||
#ifndef MY_GL_WIDGET_H
|
||||
#define MY_GL_WIDGET_H
|
||||
|
||||
#include "filter_virtual_range_scan.h"
|
||||
#include "vs/sampler.h"
|
||||
|
||||
#include <QGLWidget>
|
||||
#include <QGLWidget>
|
||||
|
||||
using namespace vs;
|
||||
|
||||
@ -14,8 +14,9 @@ public:
|
||||
MyGLWidget( VSParameters* params,
|
||||
MeshModel* inputMeshModel,
|
||||
CMeshO* uniformSamplesMesh,
|
||||
CMeshO* featureSamplesMesh )
|
||||
: QGLWidget( (QWidget*)0 )
|
||||
CMeshO* featureSamplesMesh,
|
||||
QGLWidget* shareWidget )
|
||||
: QGLWidget( (QWidget*)0, shareWidget )
|
||||
{
|
||||
this->params = params;
|
||||
this->inputMeshModel = inputMeshModel;
|
||||
@ -42,9 +42,6 @@ namespace vs
|
||||
|
||||
vector< Pov > customPovs; // custom point-of-views
|
||||
bool useCustomPovs;
|
||||
|
||||
// only for my sandbox
|
||||
vector< vcg::Point3f > computedPovs;
|
||||
};
|
||||
|
||||
/*
|
||||
@ -38,13 +38,6 @@ namespace vs
|
||||
MeshType* featureSamplesMesh,
|
||||
SamplerListener* listener = 0 )
|
||||
{
|
||||
/*
|
||||
QTime alltime;
|
||||
alltime.start();
|
||||
QTime detectionTime;
|
||||
detectionTime.start();
|
||||
*/
|
||||
|
||||
if( listener ){ listener->startingSetup(); }
|
||||
|
||||
// OpenGL initialization
|
||||
@ -85,10 +78,6 @@ namespace vs
|
||||
FeatureDetector detector ( &resources );
|
||||
|
||||
GLint* samplesCount = &( resources.buffers[ "best_position" ]->elements );
|
||||
/*
|
||||
int all_init_time = alltime.restart();
|
||||
qDebug( "init_time: %d msec", all_init_time );
|
||||
*/
|
||||
if( listener ){ listener->setupComplete( resources.params->povs ); }
|
||||
|
||||
// *** sampling ***
|
||||
@ -136,10 +125,6 @@ namespace vs
|
||||
|
||||
// download samples
|
||||
downloadSamples( &resources, (i==0)? uniformSamplesMesh : featureSamplesMesh );
|
||||
/*
|
||||
all_init_time = alltime.restart();
|
||||
qDebug( (i==0)? "uniforms time: %d msec" : "features time: %d msec", all_init_time );
|
||||
*/
|
||||
}
|
||||
|
||||
// ****************
|
||||
@ -199,9 +199,6 @@ namespace vs
|
||||
orthoRadius = ( inputMesh->bbox.Diag() / 2 ) * 1.2;
|
||||
PovsGenerator< ScalarType >::generatePovs( res->params->povs, orthoRadius, meshCenter, coneAxis, coneGap, povs );
|
||||
generateUpVectors( povs, meshCenter, upVectors );
|
||||
|
||||
// only for my sandbox
|
||||
resources->params->computedPovs = this->povs;
|
||||
}
|
||||
}
|
||||
|
||||
@ -1,301 +0,0 @@
|
||||
/****************************************************************************
|
||||
* MeshLab o o *
|
||||
* An extendible mesh processor o o *
|
||||
* _ O _ *
|
||||
* Copyright(C) 2005, 2006 \/)\/ *
|
||||
* Visual Computing Lab /\/| *
|
||||
* ISTI - Italian National Research Council | *
|
||||
* \ *
|
||||
* All rights reserved. *
|
||||
* *
|
||||
* This program is free software; you can redistribute it and/or modify *
|
||||
* it under the terms of the GNU General Public License as published by *
|
||||
* the Free Software Foundation; either version 2 of the License, or *
|
||||
* (at your option) any later version. *
|
||||
* *
|
||||
* This program is distributed in the hope that it will be useful, *
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
|
||||
* GNU General Public License (http://www.gnu.org/licenses/gpl.txt) *
|
||||
* for more details. *
|
||||
* *
|
||||
****************************************************************************/
|
||||
|
||||
#include <Qt>
|
||||
#include <QtGui>
|
||||
|
||||
#include "filter_virtual_range_scan.h"
|
||||
#include "my_gl_widget.h"
|
||||
|
||||
#include <vcg/complex/trimesh/allocate.h>
|
||||
#include <vcg/complex/trimesh/update/position.h>
|
||||
#include <vcg/complex/trimesh/update/normal.h>
|
||||
#include <vcg/complex/trimesh/update/bounding.h>
|
||||
#include <vcg/complex/trimesh/append.h>
|
||||
|
||||
using namespace std;
|
||||
using namespace vcg;
|
||||
using namespace vs;
|
||||
|
||||
// ------- MeshFilterInterface implementation ------------------------
|
||||
FilterVirtualRangeScan::FilterVirtualRangeScan()
|
||||
{
|
||||
typeList << FP_VRS;
|
||||
FilterIDType tt;
|
||||
foreach(tt , types())
|
||||
actionList << new QAction(filterName(tt), this);
|
||||
}
|
||||
|
||||
FilterVirtualRangeScan::~FilterVirtualRangeScan( void )
|
||||
{
|
||||
delete innerContext;
|
||||
}
|
||||
|
||||
QString FilterVirtualRangeScan::filterName(FilterIDType filterId) const
|
||||
{
|
||||
switch (filterId) {
|
||||
case FP_VRS:
|
||||
return QString("Virtual Range Scan");
|
||||
break;
|
||||
}
|
||||
|
||||
return "";
|
||||
}
|
||||
|
||||
QString FilterVirtualRangeScan::filterInfo(FilterIDType filterId) const
|
||||
{
|
||||
QString description = "Performs a virtual range scan onto the current mesh";
|
||||
return description;
|
||||
}
|
||||
|
||||
void FilterVirtualRangeScan::initParameterSet(QAction* filter,MeshDocument &md, RichParameterSet &par)
|
||||
{
|
||||
switch(ID(filter))
|
||||
{
|
||||
case FP_VRS:
|
||||
par.addParam( new RichInt( "povs", 20, "Povs:", "The number of point of views from which the target mesh is observed.") );
|
||||
par.addParam( new RichPoint3f( "coneAxis", vcg::Point3f( 0.0f, 1.0f, 0.0f ), "Looking cone axis",
|
||||
QString( "Povs are generated within a cone of directions, centered at the mesh bounding box center. This parameter specifies the cone axis." ) ) );
|
||||
par.addParam( new RichDynamicFloat( "coneGap", 360.0f, 0.0f, 360.0f, "Cone gap:", "The looking cone gap (in degrees).") );
|
||||
|
||||
QStringList drawModes;
|
||||
drawModes << "Flat" << "Smooth";
|
||||
par.addParam( new RichEnum( "drawMode", 0, drawModes, "Draw mode: ",
|
||||
QString( "This parameter specifies the draw mode to be used by the vcg renderer to generate the color-map for each point of view." ) ) );
|
||||
|
||||
QStringList colorModes;
|
||||
colorModes << "Per-vertex" << "Per-face" << "Per-mesh";
|
||||
par.addParam( new RichEnum( "colorMode", 0, colorModes, "Color mode: ",
|
||||
QString( "This parameter specifies the color mode to be used by the vcg renderer to generate the color-map for each point of view." ) ) );
|
||||
|
||||
QStringList textureModes;
|
||||
textureModes << "None" << "Per-vertex" << "Per-wedge" << "Per-wedge multi";
|
||||
par.addParam( new RichEnum( "textureMode", 0, textureModes, "Texture mode: ",
|
||||
QString( "This parameter specifies the texture mode to be used by the vcg renderer to generate the color-map for each point of view." ) ) );
|
||||
|
||||
par.addParam( new RichBool( "useCustomPovs", false, "Use povs contained in the following layer, ignoring the above parameters", "" ) );
|
||||
par.addParam( new RichMesh( "povsLayer", md.mm(), &md, "Povs layer:", "" ) );
|
||||
|
||||
par.addParam( new RichInt( "uniform_side", 64, "Uniform sampling resolution:",
|
||||
"The mesh will be sampled uniformly from a texture of v x v pixels, where v is the chosen value.") );
|
||||
par.addParam( new RichInt( "features_side", 512, "Feature sampling resolution:",
|
||||
"The filter performs feature detection from a texture of v x v pixels, where v is the chosen value.") );
|
||||
par.addParam( new RichDynamicFloat( "frontFacingConeU", 180.0f, 0.0f, 180.0f,
|
||||
"Front facing cone (uniform):",
|
||||
QString("Pixels whose normal is directed towards the viewer are considered front-facing.<br />") +
|
||||
"To be front-facing, these normals must reside within a given cone of directions, whose angle is set with this parameter.<br />" +
|
||||
"Only the front-facing pixels form the uniform samples cloud" ) );
|
||||
par.addParam( new RichDynamicFloat( "bigJump", 0.1f, 0.0f, 1.0f, "Big depth jump threshold:",
|
||||
QString("The filter detects mesh borders and big offsets within the mesh by testing the depth of neighbours pixels.<br />") +
|
||||
"This parameter controls the (normalized) minimum depth offset for a depth jump to be recognized.") );
|
||||
par.addParam( new RichDynamicFloat( "frontFacingConeF", 40.0f, 0.0f, 180.0f,
|
||||
"Front facing cone (features):",
|
||||
QString("Look at the <i>Front facing cone (uniform)</i> parameter description to understand when a pixel is") +
|
||||
"said <i>front-facing</i>. In the feature sensitive sampling step, border pixels are recognized as features if " +
|
||||
"they are facing the observer within a given cone of direction, whose gap is specified (in degrees) with this parameter." ) );
|
||||
par.addParam( new RichDynamicFloat( "smallJump", 0.01f, 0.001f, 0.1f, "Small depth jump threshold:",
|
||||
QString("To be considered on the same mesh patch, neighbours pixels must be within this depth range.<br />") +
|
||||
"For example, if the max depth value is 0.6 and the min depth value is 0.4, then a value of 0.01 "+
|
||||
"means that the depth offset between neighbours pixels must be "+
|
||||
"less or equal 1/100th of (0.6 - 0.4) = 0.2.") );
|
||||
par.addParam( new RichDynamicFloat( "normalsAngle", 60, 0, 180, "Normals angle threshold:",
|
||||
"The minimum angle between neighbour pixels normals for the center pixel to be considered feature.") );
|
||||
|
||||
par.addParam( new RichBool( "oneMesh", true, "Unify uniform and feature samples",
|
||||
QString("If checked, generates a unique mesh that contains both uniform and feature samples.<br />") +
|
||||
"If not checked, generates two output meshes: the first contains uniform samples and the second contains feature samples.") );
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
bool FilterVirtualRangeScan::applyFilter( QAction* filter,
|
||||
MeshDocument &md,
|
||||
RichParameterSet &par,
|
||||
vcg::CallBackPos* cb )
|
||||
{
|
||||
switch(ID(filter))
|
||||
{
|
||||
case FP_VRS:
|
||||
|
||||
MeshModel* curMeshModel = md.mm();
|
||||
CMeshO* startMesh = &( curMeshModel->cm );
|
||||
|
||||
if( !(startMesh->HasPerVertexNormal()) )
|
||||
{
|
||||
errorMessage = "Cannot apply the virtual scanning filter: the current mesh doesn't have per-vertex normals.";
|
||||
return false;
|
||||
}
|
||||
|
||||
bool useLayerPovs = par.getBool( "useCustomPovs" );
|
||||
if( useLayerPovs )
|
||||
{
|
||||
MeshModel* tmpMesh = par.getMesh( "povsLayer" );
|
||||
assert( tmpMesh );
|
||||
CMeshO::PerMeshAttributeHandle< std::vector<Pov> > povs_handle;
|
||||
povs_handle = vcg::tri::Allocator<CMeshO>::GetPerMeshAttribute<std::vector<Pov> > (tmpMesh->cm,"pointofviews");
|
||||
if (!vcg::tri::Allocator<CMeshO>::IsValidHandle(tmpMesh->cm,povs_handle) )
|
||||
{
|
||||
errorMessage = "Can't apply the filter because the selected layer contains no point of views.";
|
||||
return false;
|
||||
}
|
||||
|
||||
vrsParams.customPovs = povs_handle(); // copies the povs data
|
||||
}
|
||||
else
|
||||
{
|
||||
vrsParams.povs = par.getInt( "povs" );
|
||||
vcg::Point3f coneAxis = par.getPoint3f( "coneAxis" );
|
||||
vrsParams.coneAxis[ 0 ] = coneAxis.X();
|
||||
vrsParams.coneAxis[ 1 ] = coneAxis.Y();
|
||||
vrsParams.coneAxis[ 2 ] = coneAxis.Z();
|
||||
vrsParams.coneGap = par.getDynamicFloat( "coneGap" );
|
||||
}
|
||||
|
||||
vrsParams.uniformResolution = par.getInt( "uniform_side" );
|
||||
vrsParams.featureResolution = par.getInt( "features_side" );
|
||||
vrsParams.frontFacingConeU = par.getDynamicFloat( "frontFacingConeU" );
|
||||
vrsParams.frontFacingConeF = par.getDynamicFloat( "frontFacingConeF" );
|
||||
vrsParams.bigDepthJump = par.getDynamicFloat( "bigJump" );
|
||||
vrsParams.smallDepthJump = par.getDynamicFloat( "smallJump" );
|
||||
vrsParams.angleThreshold = par.getDynamicFloat( "normalsAngle" );
|
||||
|
||||
int choice = par.getEnum( "drawMode" );
|
||||
vrsParams.cmDrawMode = choice? vcg::GLW::DMSmooth : vcg::GLW::DMFlat;
|
||||
|
||||
choice = par.getEnum( "colorMode" );
|
||||
vcg::GLW::ColorMode cMode;
|
||||
|
||||
switch( choice )
|
||||
{
|
||||
case 0:
|
||||
cMode = vcg::GLW::CMPerVert;
|
||||
break;
|
||||
case 1:
|
||||
cMode = vcg::GLW::CMPerFace;
|
||||
break;
|
||||
case 2:
|
||||
cMode = vcg::GLW::CMPerMesh;
|
||||
break;
|
||||
default:
|
||||
cMode = vcg::GLW::CMPerMesh;
|
||||
break;
|
||||
}
|
||||
vrsParams.cmColorMode = cMode;
|
||||
|
||||
choice = par.getEnum( "textureMode" );
|
||||
vcg::GLW::TextureMode tMode;
|
||||
|
||||
switch( choice )
|
||||
{
|
||||
case 0:
|
||||
tMode = vcg::GLW::TMNone;
|
||||
break;
|
||||
case 1:
|
||||
tMode = vcg::GLW::TMPerVert;
|
||||
break;
|
||||
case 2:
|
||||
tMode = vcg::GLW::TMPerWedge;
|
||||
break;
|
||||
case 3:
|
||||
tMode = vcg::GLW::TMPerWedgeMulti;
|
||||
break;
|
||||
default:
|
||||
tMode = vcg::GLW::TMNone;
|
||||
break;
|
||||
}
|
||||
vrsParams.cmTextureMode = tMode;
|
||||
|
||||
vrsParams.useCustomPovs = useLayerPovs;
|
||||
|
||||
bool oneMesh = par.getBool( "oneMesh" );
|
||||
MeshModel* firstMeshModel = 0, *secondMeshModel = 0;
|
||||
CMeshO* firstMesh = 0, *secondMesh = 0;
|
||||
|
||||
if( oneMesh )
|
||||
{
|
||||
firstMeshModel = md.addNewMesh( "VRS Point Cloud" );
|
||||
firstMeshModel->updateDataMask( curMeshModel );
|
||||
firstMesh = &( firstMeshModel->cm );
|
||||
secondMesh = firstMesh;
|
||||
}
|
||||
else
|
||||
{
|
||||
firstMeshModel = md.addNewMesh( "VRS Uniform Samples" );
|
||||
firstMeshModel->updateDataMask( curMeshModel );
|
||||
firstMesh = &( firstMeshModel->cm );
|
||||
secondMeshModel = md.addNewMesh( "VRS Feature Samples" );
|
||||
secondMeshModel->updateDataMask( curMeshModel );
|
||||
secondMesh = &( secondMeshModel->cm );
|
||||
}
|
||||
|
||||
MyGLWidget* tmpWidget = new MyGLWidget( &vrsParams, curMeshModel, firstMesh, secondMesh );
|
||||
bool ok = tmpWidget->result;
|
||||
if( !ok )
|
||||
{
|
||||
errorMessage = tmpWidget->errorString;
|
||||
}
|
||||
delete tmpWidget;
|
||||
|
||||
return ok;
|
||||
break;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
MeshFilterInterface::FilterClass FilterVirtualRangeScan::getClass(QAction* filter)
|
||||
{
|
||||
switch(ID(filter)) {
|
||||
case FP_VRS:
|
||||
return MeshFilterInterface::Sampling;
|
||||
break;
|
||||
default: assert(0);
|
||||
return MeshFilterInterface::Generic;
|
||||
}
|
||||
}
|
||||
|
||||
int FilterVirtualRangeScan::getRequirements(QAction *filter)
|
||||
{
|
||||
switch( ID(filter) )
|
||||
{
|
||||
case FP_VRS:
|
||||
return MeshModel::MM_NONE;
|
||||
break;
|
||||
}
|
||||
|
||||
return MeshModel::MM_NONE;
|
||||
}
|
||||
|
||||
int FilterVirtualRangeScan::postCondition(QAction *filter) const
|
||||
{
|
||||
switch(ID(filter))
|
||||
{
|
||||
case FP_VRS:
|
||||
return MeshModel::MM_NONE;
|
||||
break;
|
||||
}
|
||||
|
||||
return MeshModel::MM_NONE;
|
||||
}
|
||||
// ----------------------------------------------------------------------
|
||||
Q_EXPORT_PLUGIN(FilterVirtualRangeScan)
|
||||
|
||||
@ -1,68 +0,0 @@
|
||||
/****************************************************************************
|
||||
* MeshLab o o *
|
||||
* A versatile mesh processing toolbox o o *
|
||||
* _ O _ *
|
||||
* Copyright(C) 2007 \/)\/ *
|
||||
* Visual Computing Lab /\/| *
|
||||
* ISTI - Italian National Research Council | *
|
||||
* \ *
|
||||
* All rights reserved. *
|
||||
* *
|
||||
* This program is free software; you can redistribute it and/or modify *
|
||||
* it under the terms of the GNU General Public License as published by *
|
||||
* the Free Software Foundation; either version 2 of the License, or *
|
||||
* (at your option) any later version. *
|
||||
* *
|
||||
* This program is distributed in the hope that it will be useful, *
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
|
||||
* GNU General Public License (http://www.gnu.org/licenses/gpl.txt) *
|
||||
* for more details. *
|
||||
* *
|
||||
****************************************************************************/
|
||||
|
||||
#ifndef FILTERVIRTUALRANGESCANPLUGIN_H
|
||||
#define FILTERVIRTUALRANGESCANPLUGIN_H
|
||||
|
||||
#include <QObject>
|
||||
#include <QStringList>
|
||||
#include <QString>
|
||||
|
||||
#include <common/interfaces.h>
|
||||
#include <QGLContext>
|
||||
#include <GL/glew.h>
|
||||
|
||||
#include "vs/sampler.h"
|
||||
|
||||
using namespace vs;
|
||||
|
||||
class FilterVirtualRangeScan : public QObject, public MeshFilterInterface
|
||||
{
|
||||
Q_OBJECT
|
||||
Q_INTERFACES(MeshFilterInterface)
|
||||
|
||||
public:
|
||||
FilterVirtualRangeScan();
|
||||
~FilterVirtualRangeScan();
|
||||
|
||||
virtual QString filterName(FilterIDType filter) const;
|
||||
virtual QString filterInfo(FilterIDType filter) const;
|
||||
|
||||
virtual int getRequirements(QAction *);
|
||||
virtual void initParameterSet(QAction*, MeshModel&, RichParameterSet &){ ;}
|
||||
virtual void initParameterSet(QAction *, MeshDocument &, RichParameterSet &);
|
||||
|
||||
virtual bool applyFilter (QAction* filter, MeshDocument &md, RichParameterSet & par, vcg::CallBackPos *cb);
|
||||
|
||||
virtual int postCondition(QAction *action) const;
|
||||
virtual FilterClass getClass(QAction *);
|
||||
|
||||
private:
|
||||
VSParameters vrsParams;
|
||||
|
||||
enum {FP_VRS};
|
||||
|
||||
QGLContext* innerContext;
|
||||
};
|
||||
|
||||
#endif
|
||||
@ -1,15 +0,0 @@
|
||||
include (../../shared.pri)
|
||||
VCG_PATH = $$VCGDIR
|
||||
TEMPLATE = lib
|
||||
TARGET = filter_virtual_range_scan
|
||||
QT += opengl
|
||||
CONFIG += plugin
|
||||
HEADERS += filter_virtual_range_scan.h \
|
||||
vs/resources.h \
|
||||
vs/sampler.h \
|
||||
vs/stages.h \
|
||||
vs/utils.h \
|
||||
vs/povs_generator.h \
|
||||
my_gl_widget.h \
|
||||
vs/simple_renderer.h
|
||||
SOURCES += filter_virtual_range_scan.cpp
|
||||
Loading…
x
Reference in New Issue
Block a user