File: io_ply.h

package info (click to toggle)
meshlab 2020.09%2Bdfsg1-1
  • links: PTS, VCS
  • area: main
  • in suites: bullseye
  • size: 45,124 kB
  • sloc: cpp: 400,238; ansic: 31,952; javascript: 1,578; sh: 387; yacc: 238; lex: 139; python: 86; makefile: 29
file content (170 lines) | stat: -rw-r--r-- 7,071 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
/****************************************************************************
* VCGLib                                                            o o     *
* Visual and Computer Graphics Library                            o     o   *
*                                                                _   O  _   *
* Copyright(C) 2004-2016                                           \/)\/    *
* 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.                                                         *
*                                                                           *
****************************************************************************/
/****************************************************************************
  History

$Log: not supported by cvs2svn $
Revision 1.3  2004/05/12 10:19:30  ganovelli
new line added at the end of file

Revision 1.2  2004/03/09 21:26:47  cignoni
cr lf mismatch

Revision 1.1  2004/03/08 09:21:34  cignoni
Initial commit

Revision 1.1  2004/03/03 15:00:51  cignoni
Initial commit

****************************************************************************/
#ifndef __VCGLIB_IOTRIMESH_IO_PLY
#define __VCGLIB_IOTRIMESH_IO_PLY


/**
@name Load and Save in Ply format
*/
//@{
#include<wrap/callback.h>
#include<wrap/ply/plylib.h>

namespace vcg {
namespace tri {
namespace io {



  
/** Additional data needed or useful for parsing a ply mesh.
This class can be passed to the ImporterPLY::Open() function for 
- retrieving additional per-vertex per-face data
- specifying a callback for long ply parsing
- knowing what data is  contained in a ply file
*/
class PlyInfo
{
public:
  typedef ::vcg::ply::PropDescriptor PropDescriptor ;
    
  void AddPerElemFloatAttribute(int elemType, const char *attrName, const char * propName=0)
  {
    static const char *elemStr[2]={"vertex","face"};
    static std::vector<PropDescriptor> *elemDescVec[2]={&(this->VertDescriptorVec), &(this->FaceDescriptorVec)};
    static std::vector<std::string   > *elemNameVec[2]={&(this->VertAttrNameVec),   &(this->FaceAttrNameVec)};
        
    if(propName==0) propName=attrName;
    elemDescVec[elemType]->push_back(PropDescriptor());
    elemNameVec[elemType]->push_back(attrName);
    elemDescVec[elemType]->back().elemname=elemStr[elemType];
    elemDescVec[elemType]->back().propname=strdup(propName);
    elemDescVec[elemType]->back().stotype1 = vcg::ply::T_FLOAT;
    elemDescVec[elemType]->back().memtype1 = vcg::ply::T_FLOAT;
  }
  
  void AddPerVertexFloatAttribute(const char *attrName, const char *propName=0) { 
    AddPerElemFloatAttribute(0,attrName,propName);     
  }
  void AddPerFaceFloatAttribute(const char *attrName, const char *propName=0) { 
    AddPerElemFloatAttribute(1,attrName,propName);     
  }
  
  
  /* Note that saving a per vertex point3 attribute is a mess. 
   * Actually require to allocate 3 float attribute and save them. And they are never deallocated... */
  template<class MeshType>
  void AddPerVertexPoint3fAttribute(MeshType &m, const char *attrName, const char *propName="")
  {
    if(propName==0) propName=attrName;
    
    const char *attrxyz[3] = {
      strdup((std::string(attrName)+std::string("_x")).c_str()),
      strdup((std::string(attrName)+std::string("_y")).c_str()),
      strdup((std::string(attrName)+std::string("_z")).c_str()),
    };
    typename MeshType::template PerVertexAttributeHandle <vcg::Point3f> 
        ht = vcg::tri::Allocator<MeshType>:: template GetPerVertexAttribute <vcg::Point3f> (m,attrName);
    
    typename MeshType::template PerVertexAttributeHandle <float> htt[3];
  
    for(int i=0;i<3;++i)
    { 
      htt[i] = vcg::tri::Allocator<MeshType>:: template GetPerVertexAttribute<float> (m,std::string(attrxyz[i]));
//      ForEachVertex (m, [&](typename MeshType::VertexType &v) {
//        htt[i][v] = ht[v][i];
//      });    
      for(auto vi=m.vert.begin();vi!=m.vert.end();++vi)
        if(!vi->IsD()) 
           htt[i][vi] = ht[vi][i];
      AddPerVertexFloatAttribute(attrxyz[i]);      
    }
  }
  
  
  PlyInfo()
  {
    status=0;
    mask=0;
    cb=0;    
  }
  /// Store the error codes enconutered when parsing a ply
  int status;
  /// It returns a bit mask describing the field preesnt in the ply file
  int mask;  

  /// a Simple callback that can be used for long ply parsing. 
  // it returns the current position, and formats a string with a description of what th efunction is doing (loading vertexes, faces...)
  CallBackPos *cb;

  /// The additional vertex descriptor that a user can specify to load additional per-vertex non-standard data stored in a ply
  std::vector<PropDescriptor> VertDescriptorVec;
  /// AttributeName is an array, externally allocated, containing the names of the attributes to be saved (loaded). 
  /// We assume that AttributeName[], if not empty, is exactly of the same size of VertexdData[]
  /// If AttributeName[i] is not empty we use it to retrieve/store the info instead of the offsetted space in the current vertex
  std::vector<std::string> VertAttrNameVec; 
  
  /// The additional vertex descriptor that a user can specify to load additional per-face non-standard data stored in a ply
  std::vector<PropDescriptor> FaceDescriptorVec;
  std::vector<std::string> FaceAttrNameVec; 

  /// a string containing the current ply header. Useful for showing it to the user.
  std::string header;

enum Error
{
		// Funzioni superiori
	E_NO_VERTEX       = ply::E_MAXPLYERRORS+1,       // 15
	E_NO_FACE         = ply::E_MAXPLYERRORS+2,       // 16
	E_SHORTFILE       = ply::E_MAXPLYERRORS+3,       // 17
	E_NO_3VERTINFACE  = ply::E_MAXPLYERRORS+4,       // 18
	E_BAD_VERT_INDEX  = ply::E_MAXPLYERRORS+5,       // 19
	E_NO_6TCOORD      = ply::E_MAXPLYERRORS+6,		 // 20
	E_DIFFER_COLORS   = ply::E_MAXPLYERRORS+7,	     // 21
	E_BAD_VERT_INDEX_EDGE  = ply::E_MAXPLYERRORS+8,  // 22
	E_MAXPLYINFOERRORS= ply::E_MAXPLYERRORS+9        // 23
};

}; // end class
} // end namespace tri
} // end namespace io
} // end namespace vcg
#endif