#include "texturegeneratorthread.h"
// #include "half_edge/halfedge.h"
// #include "texture_parameterization/textureparameterization.h"
#include <vtkPointData.h>
#include "utility-3d/objwriter.h"
#include "atlas_generation/halfedgedatabuilder.h"
#include "vtkTriangle.h"
namespace tr
{
TextureGeneratorThread::TextureGeneratorThread()
{
#ifdef TR_WINDOWS
directory_separator = "\\";
#endif
#ifdef TR_UNIX
directory_separator = "/";
#endif
texture_mapper = new TextureMapper();
atlas_generator = new AtlasGenerator();
mesh = vtkPolyData::New();
texture_image_name = "texture.jpg";
#ifdef TR_GUI_MODE
connect( atlas_generator , SIGNAL( percentageCompleted( int ) ) , this , SIGNAL( percentageCompleted( int ) ) );
connect( texture_mapper , SIGNAL( percentageCompleted( int ) ) , this , SIGNAL( percentageCompleted( int ) ) );
#endif
}
void TextureGeneratorThread::load_calibration(Calibration_Info* calib_data)
{
calibration = calib_data;
texture_mapper->load_calibration( calib_data );
}
void TextureGeneratorThread::load_data(vtkPolyData* data)
{
mesh->ShallowCopy( data );
texture_mapper->load_data( mesh );
}
void TextureGeneratorThread::set_working_directory(string directory)
{
working_directory = directory;
}
string TextureGeneratorThread::get_texture_image_name()
{
return texture_image_name;
}
string TextureGeneratorThread::get_texture_image_path()
{
return texture_image_path;
}
void TextureGeneratorThread::set_project_name(string name)
{
project_name = name;
}
void TextureGeneratorThread::get_output(vtkPolyData* output)
{
output->ShallowCopy( mesh );
cout<<mesh->GetNumberOfCells()<<" "<<mesh->GetNumberOfPoints()<<endl;
}
void TextureGeneratorThread::create_texture()
{
// texture_mapper->load_data( mesh );
//
// texture_mapper->remove_invisible_facets();
//
// texture_mapper->get_output( mesh );
HalfEdgeData *_half_edge_mesh = new tr::HalfEdgeData();
/*_half_edge_mesh->load_mesh( mesh );
_half_edge_mesh->build();*/
HalfEdgeData half_edge_data;
HalfEdgeDataBuilder builder( *_half_edge_mesh );
vtkPolyData *data = mesh;
int _num_points = data->GetNumberOfPoints();
int nb_vertices = _num_points ;
int nb_facets = data->GetNumberOfCells() ;
builder.begin_surface() ;
for(int i = 0; i<nb_vertices; i++)
{
double x[ 3 ] ;
// input >> x >> y >> z ;
data->GetPoint( i , x );
builder.add_vertex( Point3d( x[ 0 ] , x[ 1 ] , x[ 2 ] ) ) ;
}
vtkIdList *cell = vtkIdList::New();
for( int i = 0; i < nb_facets; i++)
{
int nb ;
builder.begin_facet() ;
data->GetCellPoints( i , cell );
nb = cell->GetNumberOfIds();
if ( nb == 3 )
{
int v1 = cell->GetId( 0 );
int v2 = cell->GetId( 1 );
int v3 = cell->GetId( 2 );
if ( v1 == v2 || v2 == v3 || v3 == v1 )
{
continue;
}
double pt1[ 3 ] , pt2[ 3 ] , pt3[ 3 ];
data->GetPoint( v1 , pt1 );
data->GetPoint( v2 , pt2 );
data->GetPoint( v3 , pt3 );
double area = vtkTriangle::TriangleArea( pt1 , pt2 , pt3 );
if ( area == 0 )
{
continue;
}
}
else
{
continue;
}
for(int j = 0; j < nb; j++)
{
int p = cell->GetId( j ) ;
builder.add_vertex_to_facet(p) ;
}
builder.end_facet() ;
}
builder.end_surface() ;
emit percentageCompleted(5);
//atlas_generator->set_half_edge_mesh( _half_edge_mesh );
atlas_generator->set_initial_percentage( 0.05 );
// TextureParameterization *_parameterizer = new TextureParameterization();
// _parameterizer->load_data( _half_edge_mesh );
vtkPolyData *_parameterized_mesh = vtkPolyData::New();
// _parameterizer->get_output( _parameterized_mesh );
atlas_generator->set_half_edge_mesh( _half_edge_mesh );
atlas_generator->apply();
std::vector< bool > _is_border_facet;
std::vector< char > _opposite_vertex;
atlas_generator->get_output( _parameterized_mesh , _is_border_facet , _opposite_vertex );
texture_mapper->set_initial_percentage( 0.55 );
texture_mapper->load_data( _parameterized_mesh , _is_border_facet , _opposite_vertex);
// std::string _texture_image_path = working_directory + directory_separator + texture_image_name;
texture_image_path = working_directory + directory_separator + project_name + ".jpg";
std::string obj_file_path = working_directory + directory_separator + project_name + ".obj";
texture_mapper->create_texture_image2( texture_image_path );
texture_mapper->get_output( mesh );
ObjWriter *writer = new ObjWriter();
writer->set_file_name( obj_file_path );
writer->set_input( mesh );
writer->write();
delete writer;
std::cout<<" texture generation completed "<<std::endl;
emit percentageCompleted( 100 );
}
void TextureGeneratorThread::run()
{
emit started();
create_texture();
emit completed();
}
}
#include "texturegeneratorthread.moc"
Bookmarks