ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/common/objutil.h
Revision: 2.10
Committed: Fri Feb 12 15:35:07 2021 UTC (3 years, 3 months ago) by greg
Content type: text/plain
Branch: MAIN
Changes since 2.9: +5 -4 lines
Log Message:
feat: Added custom face flag(s)

File Contents

# User Rev Content
1 greg 2.10 /* RCSid $Id: objutil.h,v 2.9 2021/02/12 01:57:49 greg Exp $ */
2 greg 2.1 /*
3     * Declarations for .OBJ file utility
4     *
5     * Include after <stdio.h>
6     *
7     * Created by Greg Ward on Wed Feb 11 2004.
8     */
9    
10     #ifndef _OBJUTIL_H_
11     #define _OBJUTIL_H_
12    
13     #ifndef DUP_CHECK_REVERSE
14     #define DUP_CHECK_REVERSE 1 /* eliminate flipped duplicates */
15     #endif
16     #ifndef POPEN_SUPPORT
17     #define POPEN_SUPPORT 1 /* support "!command" i/o */
18     #endif
19     /* face flags */
20 greg 2.10 #define FACE_DEGENERATE 01
21     #define FACE_DUPLICATE 02
22     #define FACE_SELECTED 04
23     #define FACE_CUSTOM(n) (1<<(2+(n)))
24 greg 2.1
25     struct Face; /* forward declaration */
26    
27 greg 2.6 typedef int VNDX[3]; /* vertex indices (point,map,normal) */
28    
29     /* Structure to hold vertex indices and link back to face list */
30 greg 2.1 typedef struct {
31     int vid; /* vertex id */
32     int tid; /* texture id */
33     int nid; /* normal id */
34     struct Face *fnext; /* next in vertex face list */
35     } VertEnt;
36    
37     /* Structure to hold face and its vertex references */
38     typedef struct Face {
39     struct Face *next; /* next face in main list */
40     short flags; /* face selected, etc */
41     short nv; /* number of vertices */
42     short grp; /* group/object index */
43     short mat; /* material index */
44     /* in cases where the same vertex appears twice, first has link */
45     VertEnt v[3]; /* vertex list (extends struct) */
46     } Face;
47    
48     /* Structure to hold vertex */
49     typedef struct {
50     double p[3]; /* 3-D position */
51     Face *vflist; /* linked face list (no repeats) */
52     } Vertex;
53    
54     /* Structure to hold texture coordinate */
55     typedef struct {
56     float u, v; /* 2-D local texture coordinate */
57     } TexCoord;
58    
59     /* Array to hold surface normal */
60     typedef float Normal[3];
61    
62     /* Structure to hold a loaded .OBJ file */
63     typedef struct {
64     char **descr; /* descriptive comments */
65     int ndescr; /* number of comments */
66     char **grpname; /* object/group name list */
67     int ngrps; /* number of group names */
68     int lastgrp; /* last group seen */
69     char **matname; /* material name list */
70     int nmats; /* number of materials */
71     int lastmat; /* last material seen */
72     Vertex *vert; /* vertex array */
73     int nverts; /* number of vertices */
74     TexCoord *tex; /* texture coordinate array */
75     int ntex; /* number of texture coord's */
76     Normal *norm; /* surface normal array */
77     int nnorms; /* number of surface normals */
78     Face *flist; /* linked face list */
79     int nfaces; /* count of faces */
80     } Scene;
81    
82     #ifdef __cplusplus
83     extern "C" {
84     #endif
85    
86     /* Allocate a new scene holder */
87     Scene * newScene(void);
88    
89     /* Add a .OBJ file to a scene */
90     Scene * loadOBJ(Scene *sc, const char *fspec);
91    
92 greg 2.9 /* Duplicate a scene, optionally selecting faces */
93     Scene * dupScene(const Scene *sc, int flreq, int flexc);
94 greg 2.1
95 greg 2.2 /* Transform entire scene */
96 greg 2.3 int xfScene(Scene *sc, int xac, char *xav[]);
97 greg 2.2 int xfmScene(Scene *sc, const char *xfm);
98    
99 greg 2.1 /* Add a descriptive comment */
100     void addComment(Scene *sc, const char *comment);
101    
102 greg 2.8 /* Find index for comment containing the given string (starting from n) */
103     int findComment(Scene *sc, const char *match, int n);
104    
105 greg 2.1 /* Clear comments */
106     void clearComments(Scene *sc);
107    
108     /* Write a .OBJ file, return # faces written or -1 on error */
109     int toOBJ(Scene *sc, FILE *fp);
110     int writeOBJ(Scene *sc, const char *fspec);
111    
112     /* Convert indicated faces to Radiance, return # written or -1 on error */
113     int toRadiance(Scene *sc, FILE *fp, int flreq, int flexc);
114     int writeRadiance(Scene *sc, const char *fspec,
115     int flreq, int flexc);
116    
117     /* Compute face area (and normal) */
118     double faceArea(const Scene *sc, const Face *f, Normal nrm);
119    
120     /* Eliminate duplicate vertices, return # joined */
121     int coalesceVertices(Scene *sc, double eps);
122    
123     /* Identify duplicate faces */
124     int findDuplicateFaces(Scene *sc);
125    
126     /* Delete indicated faces, return # deleted */
127     int deleteFaces(Scene *sc, int flreq, int flexc);
128    
129     /* Clear face selection */
130     void clearSelection(Scene *sc, int set);
131    
132     /* Invert face selection */
133     void invertSelection(Scene *sc);
134    
135     /* Count number of faces selected */
136     int numberSelected(Scene *sc);
137    
138     /* Select faces by object name (modifies current) */
139     void selectGroup(Scene *sc, const char *gname, int invert);
140    
141     /* Select faces by material name (modifies current) */
142     void selectMaterial(Scene *sc, const char *mname, int invert);
143    
144     /* Execute callback on indicated faces */
145     int foreachFace(Scene *sc, int (*cb)(Scene *, Face *, void *),
146     int flreq, int flexc, void *c_data);
147    
148     /* Remove texture coordinates from the indicated faces */
149     int removeTexture(Scene *sc, int flreq, int flexc);
150    
151     /* Remove surface normals from the indicated faces */
152     int removeNormals(Scene *sc, int flreq, int flexc);
153    
154     /* Change group for the indicated faces */
155     int changeGroup(Scene *sc, const char *gname,
156     int flreq, int flexc);
157    
158     /* Change material for the indicated faces */
159     int changeMaterial(Scene *sc, const char *mname,
160     int flreq, int flexc);
161    
162 greg 2.7 /* Add a vertex to our scene, returning index */
163 greg 2.5 int addVertex(Scene *sc, double x, double y, double z);
164    
165 greg 2.7 /* Add a texture coordinate to our scene, returning index */
166 greg 2.5 int addTexture(Scene *sc, double u, double v);
167    
168 greg 2.7 /* Add a surface normal to our scene, returning index */
169 greg 2.5 int addNormal(Scene *sc, double xn, double yn, double zn);
170    
171 greg 2.7 /* Set current group (sc->lastgrp) to given ID */
172 greg 2.5 void setGroup(Scene *sc, const char *nm);
173    
174 greg 2.7 /* Set current material (sc->lastmat) to given ID */
175 greg 2.5 void setMaterial(Scene *sc, const char *nm);
176    
177 greg 2.7 /* Add a new face to our scene, using current group and material */
178 greg 2.6 Face * addFace(Scene *sc, VNDX vid[], int nv);
179    
180 greg 2.9 /* Delete unreferenced vertices, normals, texture coords */
181     void deleteUnreferenced(Scene *sc);
182    
183 greg 2.1 /* Free a scene */
184     void freeScene(Scene *sc);
185    
186     /* Find an existing name in a list of names */
187     int findName(const char *nm, const char **nmlist, int n);
188    
189     /* Verbose mode global */
190     extern int verbose;
191    
192     extern char *emalloc(unsigned int n);
193     extern char *ecalloc(unsigned int ne, unsigned int n);
194     extern char *erealloc(char *cp, unsigned int n);
195     extern void efree(char *cp);
196    
197     #define CHUNKSIZ 128 /* object allocation chunk size */
198    
199     #define chunk_alloc(typ, arr, nold) \
200     ((nold)%CHUNKSIZ ? (arr) : \
201     (typ *)erealloc((char *)(arr), sizeof(typ)*((nold)+CHUNKSIZ)))
202    
203     #ifdef __cplusplus
204     }
205     #endif
206    
207     #endif /* ! _OBJUTIL_H_ */