ply++.h
上传用户:kellyonhid
上传日期:2013-10-12
资源大小:932k
文件大小:8k
源码类别:

3D图形编程

开发平台:

Visual C++

  1. /*
  2. Header for PLY polygon files.
  3. - Kari Pulli, April 1998
  4. Modified from PLY library by
  5. - Greg Turk, March 1994
  6. A PLY file contains a single polygonal _object_.
  7. An object is composed of lists of _elements_.  
  8. Typical elements are vertices, faces, edges and materials.
  9. Each type of element for a given object has one or more 
  10. _properties_ associated with the element type.  
  11. For instance, a vertex element may have as properties three 
  12. floating-point values x,y,z and three unsigned
  13. chars for red, green and blue.
  14. ---------------------------------------------------------------
  15. Copyright (c) 1998 The Board of Trustees of The Leland Stanford
  16. Junior University.  All rights reserved.   
  17.   
  18. Permission to use, copy, modify and distribute this software and 
  19. its documentation for any purpose is hereby granted without fee, 
  20. provided that the above copyright notice and this permission 
  21. notice appear in all copies of this software and that you do not 
  22. sell the software.   
  23.   
  24. THE SOFTWARE IS PROVIDED "AS IS" AND WITHOUT WARRANTY OF ANY KIND,
  25. EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY   
  26. WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.   
  27. */
  28. #ifndef __PLYPLUSPLUS_H__
  29. #define __PLYPLUSPLUS_H__
  30. #include <stdio.h>
  31. #include <stddef.h>
  32. #include <string.h>
  33. #ifndef WIN32
  34. #include <zlib.h>
  35. #endif
  36. #include <vector.h>
  37. #define PLY_ASCII      1        // ascii PLY file
  38. #define PLY_BINARY_BE  2        // binary PLY file, big endian
  39. #define PLY_BINARY_LE  3        // binary PLY file, little endian
  40. #define PLY_OKAY    0           /* ply routine worked okay */
  41. #define PLY_ERROR  -1           /* error in ply routine */
  42. /* scalar data types supported by PLY format */
  43. #define PLY_START_TYPE 0
  44. #define PLY_CHAR       1
  45. #define PLY_SHORT      2
  46. #define PLY_INT        3
  47. #define PLY_UCHAR      4
  48. #define PLY_USHORT     5
  49. #define PLY_UINT       6
  50. #define PLY_FLOAT      7
  51. #define PLY_DOUBLE     8
  52. #define PLY_END_TYPE   9
  53. #define  PLY_SCALAR  0
  54. #define  PLY_LIST    1
  55. struct PlyProperty {    /* description of a property */
  56.   char *name;                   // property name
  57.   int external_type;            // file's data type
  58.   int internal_type;            // program's data type
  59.   int offset;                   // offset bytes of prop in a struct
  60.   int is_list;                  // 1 = list, 0 = scalar
  61.   int count_external;           // file's count type
  62.   int count_internal;           // program's count type
  63.   int count_offset;             // offset byte for list count
  64.   /*
  65.   PlyProperty(void) {}
  66.   PlyProperty(char *n, int et, int it, int o, int l,
  67.       int ce, int ci, int co)
  68.     {
  69.       name           = strdup(n);
  70.       external_type  = et;
  71.       internal_type  = it;
  72.       offset         = o;
  73.       is_list        = l;
  74.       count_external = ce;
  75.       count_internal = ci;
  76.       count_offset   = co;
  77.     }
  78.   */
  79.   PlyProperty &operator=(const PlyProperty &p)
  80.     {
  81.       name           = strdup(p.name);
  82.       external_type  = p.external_type;
  83.       internal_type  = p.internal_type;
  84.       offset         = p.offset;
  85.       is_list        = p.is_list;
  86.       count_external = p.count_external;
  87.       count_internal = p.count_internal;
  88.       count_offset   = p.count_offset;
  89.       return *this;
  90.     }
  91. };
  92. struct PlyElement {     /* description of an element */
  93.   char *name;                   // element name
  94.   int num;                      // # of elements in this object
  95.   int size;                     // size of element (bytes) 
  96.                                 //  or -1 if variable
  97.   vector<PlyProperty> props;    // list of properties in the file
  98.   vector<int> store_prop;       // flags: property wanted by user?
  99.   int other_offset;             // offset to un-asked-for props, 
  100.                                 //  or -1 if none
  101.   int other_size;               // size of other_props structure
  102.   PlyElement(char *n) : num(0)
  103.     { name = strdup(n); }
  104.   PlyElement() : num (0)
  105. { name = NULL; }
  106. };
  107. struct PlyOtherProp {   /* describes other properties in an element */
  108.   char *name;                   // element name
  109.   int size;                     // size of other_props
  110.   vector<PlyProperty> props;    // list of properties in other_props
  111. };
  112. struct OtherData { /* for storing other_props for an other element */
  113.   void *other_props;
  114. };
  115. struct OtherElem {     /* data for one "other" element */
  116.   char *elem_name;             /* names of other elements */
  117.   vector<OtherData *> other_data;// actual property data for the elements
  118.   PlyOtherProp *other_props;   /* description of the property data */
  119. };
  120. struct PlyOtherElems {  /* "other" elements, not interpreted by user */
  121.   vector<OtherElem> list;
  122. };
  123. class PlyFile {
  124. private:
  125. #ifndef WIN32
  126.   gzFile gzfp;                // file pointer for reading
  127. #endif
  128.   FILE *fp;                   // file pointer for writing
  129.   float m_version;            // version number of file
  130.   int   m_file_type;          // ascii or binary
  131.   vector<PlyElement> elems;   // list of elements
  132.   vector<char *> comments;    // list of comments
  133.   vector<char *> obj_info;    // list of object info items
  134.   PlyElement *which_elem;     // the element we're now writing
  135.   PlyOtherElems *other_elems; // "other" elements from a PLY file
  136.   int  fbuf_size;
  137.   char *fbuf;                 // buffer for reading files in blocks
  138.   char *fb_s, *fb_e;          // start and end pointers to fbuf
  139.   void fbuf_need(int n);
  140.   char           read_char(void);
  141.   unsigned char  read_uchar(void);
  142.   short          read_short_BE(void);
  143.   unsigned short read_ushort_BE(void);
  144.   int            read_int_BE(void);
  145.   unsigned int   read_uint_BE(void);
  146.   float          read_float_BE(void);
  147.   double         read_double_BE(void);
  148.   short          read_short_LE(void);
  149.   unsigned short read_ushort_LE(void);
  150.   int            read_int_LE(void);
  151.   unsigned int   read_uint_LE(void);
  152.   float          read_float_LE(void);
  153.   double         read_double_LE(void);
  154.   int  to_int(char *item, int type);
  155.   void get_and_store_binary_item(int type_ext, 
  156.  int type_int, 
  157.  char *item);
  158.   void get_and_store_binary_list(int type_ext, 
  159.  int type_int, 
  160.  char *item, 
  161.  int n);
  162.   PlyElement *find_element(char *);
  163.   void ascii_get_element(char *elem_ptr, 
  164.  int use_provided_storage);
  165.   void binary_get_element(char *elem_ptr, 
  166.   int use_provided_storage);
  167.   void write_scalar_type (int);
  168.   void write_binary_item_BE(int, unsigned int, double, int);
  169.   void write_binary_item_LE(int, unsigned int, double, int);
  170.   void write_ascii_item(int, unsigned int, double, int);
  171.   void add_element(char **, int);
  172.   void add_property(char **, int);
  173.   void add_comment(char *);
  174.   void add_obj_info(char *);
  175.   double get_item_value(char *, int);
  176.   void get_ascii_item(char *, int, int *, unsigned int *,double *);
  177.   void get_binary_item_BE(int, int *, unsigned int *, double *);
  178.   void get_binary_item_LE(int, int *, unsigned int *, double *);
  179.   char **get_words(int *, char **);
  180.   PlyProperty *find_property(PlyElement *, char *, int *);
  181.   void store_item(char *, int, int, unsigned int, double);
  182.   void get_stored_item(void *, int, int *,unsigned int *,double *);
  183.   void _put_element(void *, int static_strg);
  184. public:
  185.   PlyFile();
  186.   ~PlyFile();
  187.   int  open_for_writing(const char *filename, int nelems, 
  188. char **elem_names, int file_type);
  189.   void describe_element(char *, int, int, PlyProperty *);
  190.   void describe_property(char *, PlyProperty *);
  191.   void describe_other_elements (PlyOtherElems *);
  192.   void describe_other_properties(PlyOtherProp *other, int offset);
  193.   void element_count(char *, int);
  194.   void header_complete(void);
  195.   void put_element_setup(char *);
  196.   void put_element(void *);
  197.   void put_element_static_strg(void *);
  198.   void put_comment(char *);
  199.   void put_obj_info(char *);
  200.   int  open_for_reading(const char *filename, int *nelems, 
  201. char ***elem_names);
  202.   PlyProperty **get_element_description(char *, int*, int*);
  203.   void get_element_setup(char *, int, PlyProperty *);
  204.   void get_property(char *, PlyProperty *);
  205.   PlyOtherProp *get_other_properties(char *, int);
  206.   void get_element(void *);
  207.   void get_element_noalloc(void *);
  208.   char **get_comments(int *);
  209.   char **get_obj_info(int *);
  210.   PlyOtherElems *get_other_element(char *, int);
  211.   void put_other_elements(void);
  212.   int is_valid_property(char *elem_name, char *prop_name);
  213.   void close(void);
  214.   float version(void)   { return m_version; }
  215.   int   file_type(void) { return m_file_type; }
  216. };
  217. void copy_property(PlyProperty *, PlyProperty *);
  218. int equal_strings(char *, char *);
  219. int isPlyFile(char *filename);
  220. #endif    //__PLYPLUSPLUS_H__