Subversion Repositories gelsvn

Rev

Rev 333 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
333 bj 1
/*
2
 
3
Header for PLY polygon files.
4
 
5
- Greg Turk, March 1994
6
 
7
A PLY file contains a single polygonal _object_.
8
 
9
An object is composed of lists of _elements_.  Typical elements are
10
vertices, faces, edges and materials.
11
 
12
Each type of element for a given object has one or more _properties_
13
associated with the element type.  For instance, a vertex element may
14
have as properties three floating-point values x,y,z and three unsigned
15
chars for red, green and blue.
16
 
17
---------------------------------------------------------------
18
 
19
Copyright (c) 1994 The Board of Trustees of The Leland Stanford
20
Junior University.  All rights reserved.   
21
 
22
Permission to use, copy, modify and distribute this software and its   
23
documentation for any purpose is hereby granted without fee, provided   
24
that the above copyright notice and this permission notice appear in   
25
all copies of this software and that you do not sell the software.   
26
 
27
THE SOFTWARE IS PROVIDED "AS IS" AND WITHOUT WARRANTY OF ANY KIND,   
28
EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY   
29
WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.   
30
 
31
*/
32
 
33
#ifndef __PLY_H__
34
#define __PLY_H__
35
 
36
#ifdef __cplusplus
37
extern "C" {
38
#endif
39
 
40
#include <stdio.h>
41
#include <stddef.h>
42
 
43
#ifdef LINUX
44
#include <sys/types.h>
45
#endif
46
 
47
#define PLY_ASCII      1        /* ascii PLY file */
48
#define PLY_BINARY_BE  2        /* binary PLY file, big endian */
49
#define PLY_BINARY_LE  3        /* binary PLY file, little endian */
50
 
51
#define PLY_OKAY    0           /* ply routine worked okay */
52
#define PLY_ERROR  -1           /* error in ply routine */
53
 
54
/* Define BIG/LITTLE_ENDIAN FLAGS if not already */
55
 
56
#ifndef BIG_ENDIAN
57
#define BIG_ENDIAN      4321	/* Flag for native Big Endian machines */
58
#endif
59
#ifndef LITTLE_ENDIAN
60
#define LITTLE_ENDIAN   1234	/* Flag for native Little Endian machines */
61
#endif
62
 
63
  /* Define BYTE_ORDER for big/little endian machines */
64
/* This assumes Linux/Win32 are on PC, all else is SGI... */
65
#ifndef BYTE_ORDER
66
#if defined (LINUX) || defined (WIN32)
67
#define BYTE_ORDER LITTLE_ENDIAN
68
#else
69
#define BYTE_ORDER BIG_ENDIAN
70
#endif
71
#endif
72
 
73
/* scalar data types supported by PLY format */
74
 
75
#define PLY_START_TYPE 0
76
#define PLY_CHAR       1
77
#define PLY_SHORT      2
78
#define PLY_INT        3
79
#define PLY_UCHAR      4
80
#define PLY_USHORT     5
81
#define PLY_UINT       6
82
#define PLY_FLOAT      7
83
#define PLY_DOUBLE     8
84
#define PLY_END_TYPE   9
85
 
86
#define  PLY_SCALAR  0
87
#define  PLY_LIST    1
88
 
89
 
90
typedef struct PlyProperty {    /* description of a property */
91
 
92
  char *name;                           /* property name */
93
  int external_type;                    /* file's data type */
94
  int internal_type;                    /* program's data type */
95
  int offset;                           /* offset bytes of prop in a struct */
96
 
97
  int is_list;                          /* 1 = list, 0 = scalar */
98
  int count_external;                   /* file's count type */
99
  int count_internal;                   /* program's count type */
100
  int count_offset;                     /* offset byte for list count */
101
 
102
} PlyProperty;
103
 
104
typedef struct PlyElement {     /* description of an element */
105
  char *name;                   /* element name */
106
  int num;                      /* number of elements in this object */
107
  int size;                     /* size of element (bytes) or -1 if variable */
108
  int nprops;                   /* number of properties for this element */
109
  PlyProperty **props;          /* list of properties in the file */
110
  char *store_prop;             /* flags: property wanted by user? */
111
  int other_offset;             /* offset to un-asked-for props, or -1 if none*/
112
  int other_size;               /* size of other_props structure */
113
} PlyElement;
114
 
115
typedef struct PlyOtherProp {   /* describes other properties in an element */
116
  char *name;                   /* element name */
117
  int size;                     /* size of other_props */
118
  int nprops;                   /* number of properties in other_props */
119
  PlyProperty **props;          /* list of properties in other_props */
120
} PlyOtherProp;
121
 
122
typedef struct OtherData { /* for storing other_props for an other element */
123
  void *other_props;
124
} OtherData;
125
 
126
typedef struct OtherElem {     /* data for one "other" element */
127
  char *elem_name;             /* names of other elements */
128
  int elem_count;              /* count of instances of each element */
129
  OtherData **other_data;      /* actual property data for the elements */
130
  PlyOtherProp *other_props;   /* description of the property data */
131
} OtherElem;
132
 
133
typedef struct PlyOtherElems {  /* "other" elements, not interpreted by user */
134
  int num_elems;                /* number of other elements */
135
  OtherElem *other_list;        /* list of data for other elements */
136
} PlyOtherElems;
137
 
138
typedef struct PlyFile {        /* description of PLY file */
139
  FILE *fp;                     /* file pointer */
140
  int file_type;                /* ascii or binary */
141
  float version;                /* version number of file */
142
  int nelems;                   /* number of elements of object */
143
  PlyElement **elems;           /* list of elements */
144
  int num_comments;             /* number of comments */
145
  char **comments;              /* list of comments */
146
  int num_obj_info;             /* number of items of object information */
147
  char **obj_info;              /* list of object info items */
148
  PlyElement *which_elem;       /* which element we're currently writing */
149
  PlyOtherElems *other_elems;   /* "other" elements from a PLY file */
150
} PlyFile;
151
 
152
 
153
/*** delcaration of routines ***/
154
 
155
extern PlyFile *ply_write(FILE *, int, char **, int);
156
extern PlyFile *ply_open_for_writing(const char *, int, char **, int, float *);
157
extern void ply_describe_element(PlyFile *, char *, int, int, PlyProperty *);
158
extern void ply_describe_property(PlyFile *, char *, PlyProperty *);
159
extern void ply_element_count(PlyFile *, char *, int);
160
extern void ply_header_complete(PlyFile *);
161
extern void ply_put_element_setup(PlyFile *, char *);
162
extern void ply_put_element(PlyFile *, void *);
163
extern void ply_put_comment(PlyFile *, char *);
164
extern void ply_put_obj_info(PlyFile *, char *);
165
extern PlyFile *ply_read(FILE *, int *, char ***);
166
extern PlyFile *ply_open_for_reading( const char *, int *, char ***, int *, float *);
167
extern PlyProperty **ply_get_element_description(PlyFile *, char *, int*, int*);
168
extern void ply_get_element_setup( PlyFile *, char *, int, PlyProperty *);
169
extern void ply_get_property(PlyFile *, char *, PlyProperty *);
170
extern PlyOtherProp *ply_get_other_properties(PlyFile *, char *, int);
171
extern void ply_get_element(PlyFile *, void *);
172
extern char **ply_get_comments(PlyFile *, int *);
173
extern char **ply_get_obj_info(PlyFile *, int *);
174
extern void ply_close(PlyFile *);
175
extern void ply_get_info(PlyFile *, float *, int *);
176
extern PlyOtherElems *ply_get_other_element (PlyFile *, char *, int);
177
extern void ply_describe_other_properties(
178
    PlyFile *plyfile, PlyOtherProp *other, int offset);
179
extern void ply_describe_other_elements ( PlyFile *, PlyOtherElems *);
180
extern void ply_put_other_elements (PlyFile *);
181
extern void ply_free_other_elements (PlyOtherElems *);
182
extern void copy_property(PlyProperty *, PlyProperty *);
183
extern int equal_strings(char *, char *);
184
extern int ply_is_valid_property(PlyFile *plyfile, 
185
				 char *elem_name, char *prop_name);
186
extern void ply_get_element_noalloc(PlyFile *plyfile, void *elem_ptr);
187
 
188
 
189
/* Define some functions/macros to convert numbers (as character strings) 
190
 * from BYTE_ORDER to BIG or LITTLE ENDIAN. */
191
 
192
/* Reverse order of 2 characters */
193
 
194
#define SWAP2C(str) { char c; \
195
    c = (str)[0]; (str)[0] = (str)[1]; (str)[1] = c; }
196
 
197
/* Reverse order of 4 characters */
198
#define SWAP4C(str) { char c; \
199
  c = (str)[0]; (str)[0] = (str)[3]; (str)[3] = c; \
200
  c = (str)[1]; (str)[1] = (str)[2]; (str)[2] = c; }
201
 
202
/* Reverse order of 8 characters */
203
#define SWAP8C(str) { char c; \
204
  c = (str)[0]; (str)[0] = (str)[7]; (str)[7] = c; \
205
  c = (str)[1]; (str)[1] = (str)[6]; (str)[6] = c; \
206
  c = (str)[2]; (str)[2] = (str)[5]; (str)[5] = c; \
207
  c = (str)[3]; (str)[3] = (str)[4]; (str)[4] = c; }
208
 
209
/* Macros that call the SWAPn function if necessary for this BYTE_ORDER */
210
#if BYTE_ORDER == BIG_ENDIAN
211
#define SWAP_TO_ENDIAN2(str,end) if ((end)==PLY_BINARY_LE) SWAP2C((char*) str)
212
#define SWAP_TO_ENDIAN4(str,end) if ((end)==PLY_BINARY_LE) SWAP4C((char*) str)
213
#define SWAP_TO_ENDIAN8(str,end) if ((end)==PLY_BINARY_LE) SWAP8C((char*) str)
214
#elif BYTE_ORDER == LITTLE_ENDIAN
215
#define SWAP_TO_ENDIAN2(str,end) if ((end)==PLY_BINARY_BE) SWAP2C((char*) str)
216
#define SWAP_TO_ENDIAN4(str,end) if ((end)==PLY_BINARY_BE) SWAP4C((char*) str)
217
#define SWAP_TO_ENDIAN8(str,end) if ((end)==PLY_BINARY_BE) SWAP8C((char*) str)
218
#endif
219
 
220
#ifdef __cplusplus 
221
} 
222
#endif 
223
#endif /* !__PLY_H__ */
224