12425ded8989bcdec2a8c8dbc25492fb1b831f81
[blender.git] / intern / bsp / test / BSP_GhostTest / ply.h
1 /**
2  * ***** BEGIN GPL LICENSE BLOCK *****
3  *
4  * This program is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU General Public License
6  * as published by the Free Software Foundation; either version 2
7  * of the License, or (at your option) any later version.
8  *
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with this program; if not, write to the Free Software Foundation,
16  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17  *
18  * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
19  * All rights reserved.
20  *
21  * The Original Code is: all of this file.
22  *
23  * Contributor(s): none yet.
24  *
25  * ***** END GPL LICENSE BLOCK *****
26  */
27
28 /*
29
30 Header for PLY polygon files.
31
32 - Greg Turk, March 1994
33
34 A PLY file contains a single polygonal _object_.
35
36 An object is composed of lists of _elements_.  Typical elements are
37 vertices, faces, edges and materials.
38
39 Each type of element for a given object has one or more _properties_
40 associated with the element type.  For instance, a vertex element may
41 have as properties three floating-point values x,y,z and three unsigned
42 chars for red, green and blue.
43
44 ---------------------------------------------------------------
45
46 Copyright (c) 1994 The Board of Trustees of The Leland Stanford
47 Junior University.  All rights reserved.   
48   
49 Permission to use, copy, modify and distribute this software and its   
50 documentation for any purpose is hereby granted without fee, provided   
51 that the above copyright notice and this permission notice appear in   
52 all copies of this software and that you do not sell the software.   
53   
54 THE SOFTWARE IS PROVIDED "AS IS" AND WITHOUT WARRANTY OF ANY KIND,   
55 EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY   
56 WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.   
57
58 */
59
60 #ifndef __PLY_H__
61 #define __PLY_H__
62
63 #ifdef __cplusplus
64 extern "C" {
65 #endif
66
67 #include <stdio.h>
68 #include <stddef.h>
69
70 #define PLY_ASCII      1        /* ascii PLY file */
71 #define PLY_BINARY_BE  2        /* binary PLY file, big endian */
72 #define PLY_BINARY_LE  3        /* binary PLY file, little endian */
73
74 #define PLY_OKAY    0           /* ply routine worked okay */
75 #define PLY_ERROR  -1           /* error in ply routine */
76
77 /* scalar data types supported by PLY format */
78
79 #define PLY_START_TYPE 0
80 #define PLY_CHAR       1
81 #define PLY_SHORT      2
82 #define PLY_INT        3
83 #define PLY_UCHAR      4
84 #define PLY_USHORT     5
85 #define PLY_UINT       6
86 #define PLY_FLOAT      7
87 #define PLY_DOUBLE     8
88 #define PLY_END_TYPE   9
89
90 #define  PLY_SCALAR  0
91 #define  PLY_LIST    1
92
93
94 typedef struct PlyProperty {    /* description of a property */
95
96   char *name;                           /* property name */
97   int external_type;                    /* file's data type */
98   int internal_type;                    /* program's data type */
99   int offset;                           /* offset bytes of prop in a struct */
100
101   int is_list;                          /* 1 = list, 0 = scalar */
102   int count_external;                   /* file's count type */
103   int count_internal;                   /* program's count type */
104   int count_offset;                     /* offset byte for list count */
105
106 } PlyProperty;
107
108 typedef struct PlyElement {     /* description of an element */
109   char *name;                   /* element name */
110   int num;                      /* number of elements in this object */
111   int size;                     /* size of element (bytes) or -1 if variable */
112   int nprops;                   /* number of properties for this element */
113   PlyProperty **props;          /* list of properties in the file */
114   char *store_prop;             /* flags: property wanted by user? */
115   int other_offset;             /* offset to un-asked-for props, or -1 if none*/
116   int other_size;               /* size of other_props structure */
117 } PlyElement;
118
119 typedef struct PlyOtherProp {   /* describes other properties in an element */
120   char *name;                   /* element name */
121   int size;                     /* size of other_props */
122   int nprops;                   /* number of properties in other_props */
123   PlyProperty **props;          /* list of properties in other_props */
124 } PlyOtherProp;
125
126 typedef struct OtherData { /* for storing other_props for an other element */
127   void *other_props;
128 } OtherData;
129
130 typedef struct OtherElem {     /* data for one "other" element */
131   char *elem_name;             /* names of other elements */
132   int elem_count;              /* count of instances of each element */
133   OtherData **other_data;      /* actual property data for the elements */
134   PlyOtherProp *other_props;   /* description of the property data */
135 } OtherElem;
136
137 typedef struct PlyOtherElems {  /* "other" elements, not interpreted by user */
138   int num_elems;                /* number of other elements */
139   OtherElem *other_list;        /* list of data for other elements */
140 } PlyOtherElems;
141
142 typedef struct PlyFile {        /* description of PLY file */
143   FILE *fp;                     /* file pointer */
144   int file_type;                /* ascii or binary */
145   float version;                /* version number of file */
146   int nelems;                   /* number of elements of object */
147   PlyElement **elems;           /* list of elements */
148   int num_comments;             /* number of comments */
149   char **comments;              /* list of comments */
150   int num_obj_info;             /* number of items of object information */
151   char **obj_info;              /* list of object info items */
152   PlyElement *which_elem;       /* which element we're currently writing */
153   PlyOtherElems *other_elems;   /* "other" elements from a PLY file */
154 } PlyFile;
155
156 /* memory allocation */
157 static char *my_alloc();
158 #define myalloc(mem_size) my_alloc((mem_size), __LINE__, __FILE__)
159
160
161 /*** delcaration of routines ***/
162
163 extern PlyFile *ply_write(FILE *, int, char **, int);
164 extern PlyFile *ply_open_for_writing(char *, int, char **, int, float *);
165 extern void ply_describe_element(PlyFile *, char *, int, int, PlyProperty *);
166 extern void ply_describe_property(PlyFile *, char *, PlyProperty *);
167 extern void ply_element_count(PlyFile *, char *, int);
168 extern void ply_header_complete(PlyFile *);
169 extern void ply_put_element_setup(PlyFile *, char *);
170 extern void ply_put_element(PlyFile *, void *);
171 extern void ply_put_comment(PlyFile *, char *);
172 extern void ply_put_obj_info(PlyFile *, char *);
173 extern PlyFile *ply_read(FILE *, int *, char ***);
174 extern PlyFile *ply_open_for_reading( char *, int *, char ***, int *, float *);
175 extern PlyProperty **ply_get_element_description(PlyFile *, char *, int*, int*);
176 extern void ply_get_element_setup( PlyFile *, char *, int, PlyProperty *);
177 extern void ply_get_property(PlyFile *, char *, PlyProperty *);
178 extern PlyOtherProp *ply_get_other_properties(PlyFile *, char *, int);
179 extern void ply_get_element(PlyFile *, void *);
180 extern char **ply_get_comments(PlyFile *, int *);
181 extern char **ply_get_obj_info(PlyFile *, int *);
182 extern void ply_close(PlyFile *);
183 extern void ply_get_info(PlyFile *, float *, int *);
184 extern PlyOtherElems *ply_get_other_element (PlyFile *, char *, int);
185 extern void ply_describe_other_elements ( PlyFile *, PlyOtherElems *);
186 extern void ply_put_other_elements (PlyFile *);
187 extern void ply_free_other_elements (PlyOtherElems *);
188
189 extern int equal_strings(char *, char *);
190
191
192 #ifdef __cplusplus
193 }
194 #endif
195 #endif /* !__PLY_H__ */
196