first working release. since each ptx can contain multiple items and there are lot of variants, there are many options. default values will work with most of the files.

This commit is contained in:
Marco Callieri 2005-12-19 17:58:50 +00:00
parent 738d1e1401
commit 326f12749b
3 changed files with 971 additions and 0 deletions

813
apps/ptx2ply/ptx2ply.cpp Normal file
View File

@ -0,0 +1,813 @@
#pragma warning(disable : 4267)
#include <stdio.h>
#include <vector>
#include<vcg/math/base.h>
#include<vcg/space/point3.h>
#include<vcg/space/point4.h>
#include<vcg/space/color4.h>
#include<vcg/math/matrix44.h>
#include<vcg/simplex/vertex/with/vn.h>
#include<vcg/simplex/vertex/with/vcvn.h>
#include<vcg/simplex/face/with/fn.h>
#include<vcg/simplex/face/pos.h>
#include<vcg/complex/trimesh/base.h>
#include<vcg/complex/trimesh/create/platonic.h>
#include<vcg/complex/trimesh/update/flag.h>
#include<vcg/complex/trimesh/update/normal.h>
#include<vcg/complex/trimesh/update/color.h>
#include<vcg/complex/trimesh/clean.h>
#include<wrap/io_trimesh/import_ply.h>
#include<wrap/io_trimesh/export_ply.h>
using namespace vcg;
using namespace std;
using namespace tri;
class MyEdge;
class MyFace;
class MyEdgeC;
class MyFaceC;
class MyVertexC:public VertexVCVN<float,MyEdgeC,MyFace>{};
class MyFaceC :public FaceFN<MyVertexC,MyEdgeC,MyFaceC>{};
class MyMeshC: public tri::TriMesh< std::vector<MyVertexC>, std::vector<MyFaceC > >{};
class MyVertex:public VertexVN<float,MyEdge,MyFace>{};
class MyFace :public FaceFN<MyVertex,MyEdge,MyFace>{};
class MyMesh: public tri::TriMesh< std::vector<MyVertex>, std::vector<MyFace > >{};
//-------------------------------------------------------
int nummeshes; // number of meshes extracted so far
MyMesh currentmesh; // current mesh, read from stream and saved one completed
MyMeshC currentmeshC; // current mesh, read from stream and saved one completed
Matrix44f currtrasf;
float angle; // angle treshold for face deletion
int singlemap; // single map mode, which map is to be saved. if -1 then all map are saved
int frommap; // skip all maps BEFORE this index
int tomap; // skip all maps AFTER this index
bool savecolor; // if has color, save it on 3dmesh
bool hascolor; // true if the current mesh has color
bool saveall; // all elements are keeped (even invalids)
bool flipfaces; // flip all faces
int todump;
bool dumpit;
bool unpack;
bool onlypoints; // store only points
bool switchside; // inverse triangulation order (swaping row->cols)
// read the current mesh from the stream
int readmesh(FILE* fp)
{
int colnum;
int rownum;
int trinum;
int numtokens;
int rit,cit;
char linebuf[256];
int ii;
float xx,yy,zz; // position
float rr,gg,bb; // color
float rf; // reflectance
MyMesh::FaceIterator fi;
MyMesh::VertexIterator vi;
MyMeshC::FaceIterator fiC;
MyMeshC::VertexIterator viC;
// cleaning mesh
currentmesh.Clear();
currentmeshC.Clear();
// getting mesh size;
fscanf(fp,"%i\n",&colnum);
fscanf(fp,"%i\n",&rownum);
// initial 4 lines [still don't know what is this :) :)]
fscanf(fp,"%f %f %f\n", &xx, &yy, &zz);
fscanf(fp,"%f %f %f\n", &xx, &yy, &zz);
fscanf(fp,"%f %f %f\n", &xx, &yy, &zz);
fscanf(fp,"%f %f %f\n", &xx, &yy, &zz);
// now the transformation matrix
fscanf(fp,"%f %f %f %f\n", &(currtrasf.ElementAt(0,0)), &(currtrasf.ElementAt(0,1)), &(currtrasf.ElementAt(0,2)), &(currtrasf.ElementAt(0,3)));
fscanf(fp,"%f %f %f %f\n", &(currtrasf.ElementAt(1,0)), &(currtrasf.ElementAt(1,1)), &(currtrasf.ElementAt(1,2)), &(currtrasf.ElementAt(1,3)));
fscanf(fp,"%f %f %f %f\n", &(currtrasf.ElementAt(2,0)), &(currtrasf.ElementAt(2,1)), &(currtrasf.ElementAt(2,2)), &(currtrasf.ElementAt(2,3)));
fscanf(fp,"%f %f %f %f\n", &(currtrasf.ElementAt(3,0)), &(currtrasf.ElementAt(3,1)), &(currtrasf.ElementAt(3,2)), &(currtrasf.ElementAt(3,3)));
// now the real data begins
// first line, we should know if the format is
// XX YY ZZ RF
// or it is
// XX YY ZZ RF RR GG BB
// read the entire first line and then count the spaces. it's rude but it works :)
ii=0;
fread(&(linebuf[ii++]),1,1,fp);
while(linebuf[ii-1] != '\n')
fread(&(linebuf[ii++]),1,1,fp);
linebuf[ii-1] = '\0'; // terminate the string
numtokens=1;
for(ii=0; ii<strlen(linebuf); ii++)
{
if(linebuf[ii] == ' ')
numtokens++;
}
if(numtokens == 4)
hascolor = false;
else if(numtokens == 7)
hascolor = true;
else
return -1;
// allocate all points
printf("\n %i x %i \n", rownum, colnum);
printf(" expect V %i F %i",(rownum*colnum),((rownum-1)*(colnum-1)*2));
if(hascolor && savecolor)
{
viC = Allocator<MyMeshC>::AddVertices(currentmeshC,(rownum*colnum));
}
else
{
vi = Allocator<MyMesh>::AddVertices(currentmesh,(rownum*colnum));
}
// parse the first line....
if(hascolor)
{
printf("\n hascolor ");
sscanf(linebuf,"%f %f %f %f %f %f %f", &xx, &yy, &zz, &rf, &rr, &gg, &bb);
}
else
{
printf("\n no color ");
sscanf(linebuf,"%f %f %f %f", &xx, &yy, &zz, &rf);
}
//addthefirstpoint
if(hascolor && savecolor)
{
(*viC).P()[0]=xx;
(*viC).P()[1]=yy;
(*viC).P()[2]=zz;
(*viC).C()[0]=rr;
(*viC).C()[1]=gg;
(*viC).C()[2]=bb;
viC++;
}
else
{
(*vi).P()[0]=xx;
(*vi).P()[1]=yy;
(*vi).P()[2]=zz;
vi++;
}
// now for each line until end of mesh (row*col)-1
for(ii=0; ii<((rownum*colnum)-1); ii++)
{
// read the stream
if(hascolor)
fscanf(fp,"%f %f %f %f %f %f %f", &xx, &yy, &zz, &rf, &rr, &gg, &bb);
else
fscanf(fp,"%f %f %f %f", &xx, &yy, &zz, &rf);
// add the point
if(hascolor && savecolor)
{
(*viC).P()[0]=xx;
(*viC).P()[1]=yy;
(*viC).P()[2]=zz;
(*viC).C()[0]=rr;
(*viC).C()[1]=gg;
(*viC).C()[2]=bb;
viC++;
}
else
{
(*vi).P()[0]=xx;
(*vi).P()[1]=yy;
(*vi).P()[2]=zz;
vi++;
}
}
currentmesh.vn = currentmesh.vert.size();
if(! onlypoints)
{
// now i can triangulate
trinum = (rownum-1) * (colnum-1) * 2;
if(hascolor && savecolor)
{
fiC= Allocator<MyMeshC>::AddFaces(currentmeshC,trinum);
}
else
{
fi= Allocator<MyMesh>::AddFaces(currentmesh,trinum);
}
currentmesh.fn = 0;
currentmeshC.fn = 0;
int v0i,v1i,v2i;
for(rit=0; rit<rownum-1; rit++)
for(cit=0; cit<colnum-1; cit++)
if(hascolor && savecolor)
{
if(!switchside)
{
v0i = (rit ) + ((cit ) * rownum);
v1i = (rit+1) + ((cit ) * rownum);
v2i = (rit ) + ((cit+1) * rownum);
}
else
{
v0i = (cit ) + ((rit ) * colnum);
v1i = (cit+1) + ((rit ) * colnum);
v2i = (cit ) + ((rit+1) * colnum);
}
// upper tri
(*fiC).V(2) = &(currentmeshC.vert[v0i]);
(*fiC).V(1) = &(currentmeshC.vert[v1i]);
(*fiC).V(0) = &(currentmeshC.vert[v2i]);
if(flipfaces)
{
(*fiC).V(2) = &(currentmeshC.vert[v1i]);
(*fiC).V(1) = &(currentmeshC.vert[v0i]);
}
currentmeshC.fn++;
fiC++;
if(!switchside)
{
v0i = (rit+1) + ((cit ) * rownum);
v1i = (rit+1) + ((cit+1) * rownum);
v2i = (rit ) + ((cit+1) * rownum);
}
else
{
v0i = (cit+1) + ((rit ) * colnum);
v1i = (cit+1) + ((rit+1) * colnum);
v2i = (cit ) + ((rit+1) * colnum);
}
// lower tri
(*fiC).V(2) = &(currentmeshC.vert[v0i]);
(*fiC).V(1) = &(currentmeshC.vert[v1i]);
(*fiC).V(0) = &(currentmeshC.vert[v2i]);
if(flipfaces)
{
(*fiC).V(2) = &(currentmeshC.vert[v1i]);
(*fiC).V(1) = &(currentmeshC.vert[v0i]);
}
currentmeshC.fn++;
fiC++;
}
else
{
// upper tri
if(!switchside)
{
v0i = (rit ) + ((cit ) * rownum);
v1i = (rit+1) + ((cit ) * rownum);
v2i = (rit ) + ((cit+1) * rownum);
}
else
{
v0i = (cit ) + ((rit ) * colnum);
v1i = (cit+1) + ((rit ) * colnum);
v2i = (cit ) + ((rit+1) * colnum);
}
(*fi).V(2) = &(currentmesh.vert[v0i]);
(*fi).V(1) = &(currentmesh.vert[v1i]);
(*fi).V(0) = &(currentmesh.vert[v2i]);
if(flipfaces)
{
(*fi).V(2) = &(currentmesh.vert[v1i]);
(*fi).V(1) = &(currentmesh.vert[v0i]);
}
currentmesh.fn++;
fi++;
// lower tri
if(!switchside)
{
v0i = (rit+1) + ((cit ) * rownum);
v1i = (rit+1) + ((cit+1) * rownum);
v2i = (rit ) + ((cit+1) * rownum);
}
else
{
v0i = (cit+1) + ((rit ) * colnum);
v1i = (cit+1) + ((rit+1) * colnum);
v2i = (cit ) + ((rit+1) * colnum);
}
(*fi).V(2) = &(currentmesh.vert[v0i]);
(*fi).V(1) = &(currentmesh.vert[v1i]);
(*fi).V(0) = &(currentmesh.vert[v2i]);
if(flipfaces)
{
(*fi).V(2) = &(currentmesh.vert[v1i]);
(*fi).V(1) = &(currentmesh.vert[v0i]);
}
currentmesh.fn++;
fi++;
}
if(hascolor && savecolor)
printf("\nV: %8i F: %8i \n", currentmeshC.vn, currentmeshC.fn);
else
printf("\nV: %8i F: %8i \n", currentmesh.vn, currentmesh.fn);
}
if(! saveall)
{
printf("deleting unsampled points \n");
// now i delete all points in (0,0,0) that are unsampled points
if(hascolor && savecolor)
for(viC = currentmeshC.vert.begin(); viC != currentmeshC.vert.end(); viC++)
{
if((*viC).P() == Point3f(0.0, 0.0, 0.0))
{
(*viC).SetD();
currentmeshC.vn--;
}
}
else
for(vi = currentmesh.vert.begin(); vi != currentmesh.vert.end(); vi++)
{
if((*vi).P() == Point3f(0.0, 0.0, 0.0))
{
(*vi).SetD();
currentmesh.vn--;
}
}
}
if(! onlypoints)
{
if(! saveall)
{
printf("deleting invalid faces \n");
// and then i delete all faces with null vertices
if(hascolor && savecolor)
for(fiC = currentmeshC.face.begin(); fiC != currentmeshC.face.end(); fiC++)
{
if( ((*fiC).V(0)->IsD()) || ((*fiC).V(1)->IsD()) || ((*fiC).V(2)->IsD()) )
{
(*fiC).SetD();
currentmeshC.fn--;
}
}
else
for(fi = currentmesh.face.begin(); fi != currentmesh.face.end(); fi++)
{
if( ((*fi).V(0)->IsD()) || ((*fi).V(1)->IsD()) || ((*fi).V(2)->IsD()) )
{
(*fi).SetD();
currentmesh.fn--;
}
}
}
if(hascolor && savecolor)
printf("V: %8i F: %8i \n", currentmeshC.vn, currentmeshC.fn);
else
printf("V: %8i F: %8i \n", currentmesh.vn, currentmesh.fn);
// eliminate high angle triangles
if((angle != 90)&&(!saveall))
{
printf(" culling by angle \n");
float limit = cos( angle*3.14159265358979323846/180.0 );
Point3f raggio;
if(hascolor && savecolor)
{
vcg::tri::UpdateNormals<MyMeshC>::PerFaceNormalized(currentmeshC);
for(fiC = currentmeshC.face.begin(); fiC != currentmeshC.face.end(); fiC++)
if(!(*fiC).IsD())
{
raggio = -((*fiC).V(0)->P() + (*fiC).V(1)->P() + (*fiC).V(2)->P()) / 3.0;
raggio.Normalize();
if((raggio * (*fiC).N()) < limit)
{
(*fiC).SetD();
currentmeshC.fn--;
}
}
}
else
{
vcg::tri::UpdateNormals<MyMesh>::PerFaceNormalized(currentmesh);
for(fi = currentmesh.face.begin(); fi != currentmesh.face.end(); fi++)
if(!(*fi).IsD())
{
raggio = -((*fi).V(0)->P() + (*fi).V(1)->P() + (*fi).V(2)->P()) / 3.0;
raggio.Normalize();
if((raggio * (*fi).N()) < limit)
{
(*fi).SetD();
currentmesh.fn--;
}
}
}
}
}
Transpose(currtrasf);
// apply tranformation
if(hascolor && savecolor)
{
for(viC = currentmeshC.vert.begin(); viC != currentmeshC.vert.end(); viC++)
if(!(*viC).IsD())
{
(*viC).P() = currtrasf * (*viC).P();
}
}
else
{
for(vi = currentmesh.vert.begin(); vi != currentmesh.vert.end(); vi++)
if(!(*vi).IsD())
{
(*vi).P() = currtrasf * (*vi).P();
}
}
if(hascolor && savecolor)
{
int dup = tri::Clean<MyMeshC>::RemoveDuplicateVertex(currentmeshC);
if(! onlypoints)
int unref = tri::Clean<MyMeshC>::RemoveUnreferencedVertex(currentmeshC);
}
else
{
int dup = tri::Clean<MyMesh>::RemoveDuplicateVertex(currentmesh);
if(! onlypoints)
int unref = tri::Clean<MyMesh>::RemoveUnreferencedVertex(currentmesh);
}
return 0;
}
// save each mesh in a separate file
dounpack(FILE* fp)
{
FILE* outf;
char namef[128];
int rnum;
char linebuf[256];
int ii;
bool trovato;
rnum=1;
trovato = false;
// search for the first integer
while(!trovato)
{
// read the entire first line and then count the spaces. it's rude but it works :)
ii=0;
fread(&(linebuf[ii++]),1,1,fp);
while(linebuf[ii-1] != '\n')
fread(&(linebuf[ii++]),1,1,fp);
linebuf[ii-1] = '\0'; // terminate the string
//check the string
if(strchr(linebuf,' ') == NULL)
trovato = true;
}
while(!feof(fp))
{
sprintf(namef,".\\range%03i.ptx",rnum++);
outf = fopen(namef,"w");
// write first integer
fprintf(outf,"%s\n",linebuf);
// read and write next int
ii=0;
fread(&(linebuf[ii++]),1,1,fp);
while(linebuf[ii-1] != '\n')
fread(&(linebuf[ii++]),1,1,fp);
linebuf[ii-1] = '\0'; // terminate the string
fprintf(outf,"%s\n",linebuf);
// search for the next integer
while(!trovato)
{
// read the entire first line and then count the spaces. it's rude but it works :)
ii=0;
fread(&(linebuf[ii++]),1,1,fp);
while(linebuf[ii-1] != '\n')
fread(&(linebuf[ii++]),1,1,fp);
linebuf[ii-1] = '\0'; // terminate the string
//if not an integer then write it, otherwise close and remember for next step
if(strchr(linebuf,' ') == NULL)
trovato = true;
else
fprintf(outf,"%s\n",linebuf);
}
fclose(outf);
}
}
// skip a mesh
int skipmesh(FILE* fp)
{
int colnum;
int rownum;
int skiplines;
char linebuf;
if(feof(fp))
return -1;
// getting mesh size;
fscanf(fp,"%i\n",&colnum);
fscanf(fp,"%i\n",&rownum);
printf("\n %i x %i \n", rownum, colnum);
printf(" expect V %i F %i\n",(rownum*colnum),((rownum-1)*(colnum-1)*2));
if(feof(fp))
return -1;
skiplines = (colnum * rownum) + 8; // have to skip (col * row) lines plus 8 lines for the header
for(int ii=0; ii<skiplines; ii++)
{
fread(&linebuf,1,1,fp);
while(linebuf != '\n')
fread(&linebuf,1,1,fp);
}
return 0;
}
void parseparams(int argn, char** argvect)
{
int pit;
for(pit = 2; pit<argn; pit++)
{
if(argvect[pit][0] != '-') // invalid param
{
printf("invalid parameter\n");
}
else // valid param
{
if(argvect[pit][1] == 'a') // angle
{
angle = atof(&(argvect[pit][2]));
printf("cutoff angle = %f \n",angle);
}
if(argvect[pit][1] == 'm') // single map
{
singlemap = atoi(&(argvect[pit][2]));
frommap = 0;
tomap = singlemap;
printf("single map # %i \n",singlemap);
}
if(argvect[pit][1] == 'f') // from map
{
frommap = atoi(&(argvect[pit][2]));
singlemap = -1;
printf("start from map # %i \n",frommap);
}
if(argvect[pit][1] == 't') // from map
{
tomap = atoi(&(argvect[pit][2]));
singlemap = -1;
printf("end with map # %i \n",tomap);
}
if(argvect[pit][1] == 'd') // dump to file
{
todump = atoi(&(argvect[pit][2]));
dumpit = true;
printf("dumping # %i chars\n",todump);
}
if(argvect[pit][1] == 'u') // unpack the file in different
{
unpack = true;
printf("UNPACKING \n");
}
if(argvect[pit][1] == 'c') // save color if present
{
savecolor = true;
printf("saving color \n");
}
if(argvect[pit][1] == 'k') // keep all
{
saveall = true;
printf("keeping all elements \n");
}
if(argvect[pit][1] == 'f') // flip all tris
{
flipfaces = true;
printf("keeping all elements \n");
}
if(argvect[pit][1] == 'p') // points only, do not triangulate
{
onlypoints = true;
printf("points only, do not triangulate \n");
}
if(argvect[pit][1] == 'r') // points only, do not triangulate
{
switchside = true;
printf("swapped triangulation \n");
}
}
}
}
void printhelp()
{
printf("-------------------------------------------------------------\n");
printf("multiple PLY files will be extracted from the PTX \n");
printf("\n");
printf("USAGE: ptx2ply filename.ptx [options]");
printf("\n");
printf("each map contained in the file will be saved in a PLY \n");
printf("\n");
printf("-aAA angle threshold for face elimination, glazing faces with\n");
printf(" angle between normal and viewdirection > AA are removed \n");
printf(" default is no cut. \n");
printf(" beware! this only works for range maps that still need \n");
printf(" to be tranformed in the final reference system \n");
printf(" (in this case the viewpoint is the origin) \n");
printf("\n");
printf("-c save color if present \n");
printf("\n");
printf("-mNN extract just the map NN, skip all the rest of the file \n");
printf("\n");
printf("-fNN extract maps starting FROM index NN \n");
printf("\n");
printf("-tNN extract maps UP TO index NN \n");
printf("\n");
printf("-u unpack the file generating a ptx for each map \n");
printf("\n");
printf("-k keep all elements (no points/tris discarded) \n");
printf(" only useful for debug \n");
printf("\n");
printf("-f flip all faces \n");
printf("\n");
printf("-p store points only \n");
printf("\n");
printf("-r during triangulation, swap rows->columns \n");
printf("\n");
printf("MESH INDICES STARTS FROM 1 \n");
printf("parameters -f and -t can be used together to specify an index\n");
printf("range to be processed. \n");
printf("-------------------------------------------------------------\n");
exit(0);
}
//////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
int main(int argc, char *argv[])
{
FILE *fp;
char filename[256];
char modelname[128];
//---------------------------------------------------------------
printf("PTX to PLY conversion\n");
//---------------------------------------------------------------
//-- init params
nummeshes = 1;
currentmesh.Clear();
angle = 90.0;
singlemap = -1;
frommap = 0;
tomap = 99999;
todump = 1024;
dumpit = false;
unpack = false;
savecolor = false;
saveall = false;
flipfaces = false;
onlypoints = false;
switchside = false;
if(argc < 2)
printhelp();
//--
parseparams(argc, argv);
strcpy(modelname,argv[1]);
modelname[strlen(argv[1])-4] = '\0';
fp = fopen(argv[1],"r");
if(unpack)
dounpack(fp);
while((!feof(fp)) && (nummeshes <= tomap))
{
printf("mesh %3i ",nummeshes);
if((nummeshes >= frommap) && (nummeshes <= tomap) && ((singlemap == -1) || (singlemap == nummeshes)))
{
if(dumpit)
{
FILE* outf;
char cbuf;
outf = fopen(".\\dump.txt","w");
for(int dit=0; dit<todump; dit++)
{
fread(&cbuf,1,1,fp);
fwrite(&cbuf,1,1,outf);
}
fclose(outf);
fclose(fp);
exit(0);
}
printf("reading ");
readmesh(fp);
sprintf(filename,".\\%s_%03i.ply",modelname,nummeshes);
if(!feof(fp))
{
if(hascolor && savecolor)
{
int plyMask=vcg::ply::PLYMask::PM_VERTCOLOR;
tri::io::ExporterPLY<MyMeshC>::Save(currentmeshC,filename, plyMask);
}
else
tri::io::ExporterPLY<MyMesh>::Save(currentmesh,filename);
}
printf("ok! \n");
}
else
{
printf("skipping ");
skipmesh(fp);
printf("ok! \n");
}
nummeshes++;
}
fclose(fp);
return 0;
}

21
apps/ptx2ply/ptx2ply.sln Normal file
View File

@ -0,0 +1,21 @@
Microsoft Visual Studio Solution File, Format Version 8.00
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ptx2ply", "ptx2ply.vcproj", "{80BC3B30-0C1E-4714-9B4A-B8076C935BA0}"
ProjectSection(ProjectDependencies) = postProject
EndProjectSection
EndProject
Global
GlobalSection(SolutionConfiguration) = preSolution
Debug = Debug
Release = Release
EndGlobalSection
GlobalSection(ProjectConfiguration) = postSolution
{80BC3B30-0C1E-4714-9B4A-B8076C935BA0}.Debug.ActiveCfg = Debug|Win32
{80BC3B30-0C1E-4714-9B4A-B8076C935BA0}.Debug.Build.0 = Debug|Win32
{80BC3B30-0C1E-4714-9B4A-B8076C935BA0}.Release.ActiveCfg = Release|Win32
{80BC3B30-0C1E-4714-9B4A-B8076C935BA0}.Release.Build.0 = Release|Win32
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
EndGlobalSection
GlobalSection(ExtensibilityAddIns) = postSolution
EndGlobalSection
EndGlobal

137
apps/ptx2ply/ptx2ply.vcproj Normal file
View File

@ -0,0 +1,137 @@
<?xml version="1.0" encoding="Windows-1252"?>
<VisualStudioProject
ProjectType="Visual C++"
Version="7.10"
Name="ptx2ply"
ProjectGUID="{80BC3B30-0C1E-4714-9B4A-B8076C935BA0}"
Keyword="Win32Proj">
<Platforms>
<Platform
Name="Win32"/>
</Platforms>
<Configurations>
<Configuration
Name="Debug|Win32"
OutputDirectory="Debug"
IntermediateDirectory="Debug"
ConfigurationType="1"
CharacterSet="2">
<Tool
Name="VCCLCompilerTool"
Optimization="0"
AdditionalIncludeDirectories="..\..\..\sf\"
PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE"
MinimalRebuild="TRUE"
BasicRuntimeChecks="3"
RuntimeLibrary="5"
UsePrecompiledHeader="0"
WarningLevel="3"
Detect64BitPortabilityProblems="TRUE"
DebugInformationFormat="4"/>
<Tool
Name="VCCustomBuildTool"/>
<Tool
Name="VCLinkerTool"
OutputFile="$(OutDir)/ptx2ply.exe"
LinkIncremental="2"
GenerateDebugInformation="TRUE"
ProgramDatabaseFile="$(OutDir)/ptx2ply.pdb"
SubSystem="1"
TargetMachine="1"/>
<Tool
Name="VCMIDLTool"/>
<Tool
Name="VCPostBuildEventTool"/>
<Tool
Name="VCPreBuildEventTool"/>
<Tool
Name="VCPreLinkEventTool"/>
<Tool
Name="VCResourceCompilerTool"/>
<Tool
Name="VCWebServiceProxyGeneratorTool"/>
<Tool
Name="VCXMLDataGeneratorTool"/>
<Tool
Name="VCWebDeploymentTool"/>
<Tool
Name="VCManagedWrapperGeneratorTool"/>
<Tool
Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
</Configuration>
<Configuration
Name="Release|Win32"
OutputDirectory="Release"
IntermediateDirectory="Release"
ConfigurationType="1"
CharacterSet="2">
<Tool
Name="VCCLCompilerTool"
AdditionalIncludeDirectories="..\..\..\sf\"
PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE"
RuntimeLibrary="4"
UsePrecompiledHeader="0"
WarningLevel="3"
Detect64BitPortabilityProblems="TRUE"
DebugInformationFormat="3"/>
<Tool
Name="VCCustomBuildTool"/>
<Tool
Name="VCLinkerTool"
OutputFile="$(OutDir)/ptx2ply.exe"
LinkIncremental="1"
GenerateDebugInformation="TRUE"
SubSystem="1"
OptimizeReferences="2"
EnableCOMDATFolding="2"
TargetMachine="1"/>
<Tool
Name="VCMIDLTool"/>
<Tool
Name="VCPostBuildEventTool"/>
<Tool
Name="VCPreBuildEventTool"/>
<Tool
Name="VCPreLinkEventTool"/>
<Tool
Name="VCResourceCompilerTool"/>
<Tool
Name="VCWebServiceProxyGeneratorTool"/>
<Tool
Name="VCXMLDataGeneratorTool"/>
<Tool
Name="VCWebDeploymentTool"/>
<Tool
Name="VCManagedWrapperGeneratorTool"/>
<Tool
Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
</Configuration>
</Configurations>
<References>
</References>
<Files>
<Filter
Name="Source Files"
Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx"
UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}">
<File
RelativePath="..\..\..\sf\wrap\ply\plylib.cpp">
</File>
<File
RelativePath=".\ptx2ply.cpp">
</File>
</Filter>
<Filter
Name="Header Files"
Filter="h;hpp;hxx;hm;inl;inc;xsd"
UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}">
</Filter>
<Filter
Name="Resource Files"
Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx"
UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}">
</Filter>
</Files>
<Globals>
</Globals>
</VisualStudioProject>