#include "rply.h"
#include <stdio.h>
#include <QtCore/QCoreApplication>
#include <QtCore/QFile>
#include <QtCore/QTextStream>
#if defined(JAMBUILD)
#else
#include "../../include/Mudbox/mudbox.h"
#endif
MB_PLUGIN(
"PLY Importer",
"PLY file import/export plugin",
"Autodesk",
"http://www.mudbox3d.com", 0 );
{
public:
PLYImporter( void );
~PLYImporter( void );
virtual QString Extension(
void )
const {
return NTR(
"ply"); };
virtual QString Description(
void )
const {
return tr(
"Polygon File"); };
void OnVertexData( float fData );
void OnFaceData( int iIndex, int iFaceSize, int iData );
unsigned int m_iVertexIndex;
unsigned int m_iCornerIndex;
unsigned int m_iTriangleIndex;
};
PLYImporter* g_pImporter = 0;
PLYImporter::PLYImporter( void )
{
Kernel()->Log(
"PLY Import plugin initialized\n" );
m_pMesh = 0;
g_pImporter = this;
m_iVertexIndex = 0;
m_iCornerIndex = 0;
m_iTriangleIndex = 0;
};
PLYImporter::~PLYImporter( void )
{
if( g_pImporter == this )
g_pImporter = 0;
};
void PLYImporter::OnVertexData( float fData )
{
m_vPosition[m_iCornerIndex++] = fData;
if ( m_iCornerIndex == 3 )
{
m_iCornerIndex = 0;
if ( m_iVertexIndex < m_pMesh->VertexCount() )
{
m_pMesh->SetVertexPosition( m_iVertexIndex++, m_vPosition );
Kernel()->Interface()->ProgressSet( m_iVertexIndex );
}
else
};
};
void PLYImporter::OnFaceData( int iIndex, int iFaceSize, int iData )
{
if ( iIndex == -1 )
{
if ( iFaceSize == 3 )
return;
else
MB_ERROR(
"Face with more than 3 vertex found in file (not supported)" );
};
if ( m_iTriangleIndex < m_pMesh->FaceCount() && iIndex < 3 && iIndex >= 0 )
m_pMesh->SetTriangleIndex( m_iTriangleIndex, iIndex, iData );
else
MB_ERROR(
"Vertex index out of range" );
if ( iIndex == 2 )
{
m_iTriangleIndex++;
Kernel()->Interface()->ProgressSet( m_iVertexIndex+m_iTriangleIndex );
};
};
static int vertex_cb(p_ply_argument argument)
{
g_pImporter->OnVertexData( (float)ply_get_argument_value(argument) );
return 1;
};
static int face_cb(p_ply_argument argument)
{
long iLength, iValueIndex;
ply_get_argument_property(argument, 0, &iLength, &iValueIndex);
g_pImporter->OnFaceData( iValueIndex, iLength, (unsigned int)ply_get_argument_value(argument) );
return 1;
};
{
unsigned int iVertexCount, iTriangleCount;
p_ply ply = ply_open(qbaFileName.
constData(), 0);
if ( !ply )
MB_ERROR( tr(
"Invalid file: %1").arg(sFileName) );
if ( !ply_read_header(ply) )
MB_ERROR( tr(
"Invalid file: %1").arg(sFileName) );
iVertexCount = ply_set_read_cb(ply, "vertex", "x", vertex_cb, 0, 0);
ply_set_read_cb(ply, "vertex", "y", vertex_cb, 0, 0);
ply_set_read_cb(ply, "vertex", "z", vertex_cb, 0, 1);
iTriangleCount = ply_set_read_cb(ply, "face", "vertex_indices", face_cb, 0, 0);
Kernel()->Log(
NTRQ(
"\t%1 vertices, %2 triangles.").arg(iVertexCount).arg(iTriangleCount) );
m_pMesh->SetName("PlyMesh");
m_pMesh->SetFaceCount( iTriangleCount );
m_pMesh->SetVertexCount( iVertexCount );
Kernel()->Interface()->ProgressStart(
"importing...", iVertexCount+iTriangleCount );
if (!ply_read(ply))
MB_ERROR( tr(
"Invalid file: %1").arg(sFileName) );
ply_close(ply);
Kernel()->Interface()->ProgressEnd();
AddMesh( m_pMesh );
};
{
public:
QString Extension(
void )
const {
return NTR(
"ply";) };
QString Description(
void )
const {
return tr(
"Polygon file"); };
void SetMeshCount( unsigned int iMeshCount ) { m_aMeshes.SetItemCount( iMeshCount ); };
void SetMesh(
unsigned int iIndex,
const Mesh *pMesh ) { m_aMeshes[iIndex] = pMesh; };
{
m_pStream << sText;
};
{
if ( m_aMeshes.ItemCount() == 0 )
return;
if ( m_aMeshes.ItemCount() > 1 )
MB_ERRORQ( tr(
"Only a single mesh can be exported to PLY file format.") );
m_pFile.setFileName(sFileName);
{
MB_ERRORQ( tr(
"Can't open %1 for writing: %2").arg(sFileName).arg(m_pFile.errorString()) );
}
m_pStream.setDevice(&m_pFile);
m_pStream.setCodec(
NTR(
"UTF-8"));
Write(
NTR(
"format ascii 1.0") );
Write(
NTRQ(
"element vertex %1").arg(m_aMeshes[0]->VertexCount() ) );
Write(
NTR(
"property float x") );
Write(
NTR(
"property float y") );
Write(
NTR(
"property float z") );
Write(
NTRQ(
"element face %1").arg( m_aMeshes[0]->FaceCount() ) );
Write(
NTR(
"property list uchar int vertex_indices") );
Write(
NTR(
"end_header") );
for (
unsigned int v = 0;
v < m_aMeshes[0]->VertexCount();
v++ )
{
Vector p = m_aMeshes[0]->VertexPosition(
v );
Write(
NTRQ(
"%1 %2 %3").arg(p.
x).arg(p.
y).arg(p.
z ) );
};
{
for (
unsigned int f = 0;
f < m_aMeshes[0]->FaceCount();
f++ )
Write(
NTRQ(
"3 %1 %2 %3").arg(m_aMeshes[0]->TriangleIndex(
f, 0 )).arg( m_aMeshes[0]->TriangleIndex(
f, 1 )).arg( m_aMeshes[0]->TriangleIndex(
f, 2 ) ) );
}
else
{
for (
unsigned int f = 0;
f < m_aMeshes[0]->FaceCount();
f++ )
Write(
NTRQ(
"4 %1 %2 %3 %4").arg(m_aMeshes[0]->QuadIndex(
f, 0 )).arg( m_aMeshes[0]->QuadIndex(
f, 1 )).arg( m_aMeshes[0]->QuadIndex(
f, 2 )).arg( m_aMeshes[0]->QuadIndex(
f, 3 ) ) );
};
m_pStream.flush();
m_pFile.close();
};
};