ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/common/objutil.h
Revision: 2.14
Committed: Wed Apr 7 03:02:00 2021 UTC (3 years, 1 month ago) by greg
Content type: text/plain
Branch: MAIN
Changes since 2.13: +4 -1 lines
Log Message:
feat: created addScene() function to add one scene to another

File Contents

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