ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/common/mesh.h
Revision: 2.8
Committed: Fri Jun 27 06:53:21 2003 UTC (20 years, 10 months ago) by greg
Content type: text/plain
Branch: MAIN
Changes since 2.7: +1 -3 lines
Log Message:
Broke standard.h into rtio.h, rterror.h, rtmath.h, and rtmisc.h

File Contents

# Content
1 /* RCSid $Id: mesh.h,v 2.7 2003/06/26 00:58:09 schorsch Exp $ */
2 /*
3 * Header for compact triangle mesh geometry
4 *
5 * Include after standard.h, object.h and octree.h
6 */
7 #ifndef _RAD_MESH_H_
8 #define _RAD_MESH_H_
9 #ifdef __cplusplus
10 extern "C" {
11 #endif
12
13 #include "lookup.h"
14
15 #ifndef BYTE
16 #define BYTE unsigned char
17 #endif
18
19 /*
20 * Vertex space is minimized without compromising accuracy by using a
21 * 4-byte unsigned int to indicate position in the enclosing octree cube.
22 * The same trick is used for any local (u,v) coordinates, whose limits
23 * are recorded separately in the parent MESH structure. The uvlimit's
24 * in the MESH structure are set such that (0,0) is out of range, so
25 * we use this to indicate an unspecified local coordinate.
26 * A vertex normal, if specified, is stored in a single 4-byte
27 * integer using the codec in dircode.c. The encodedir() function
28 * never generates 0, so we can use this for unspecified normals.
29 *
30 * Vertex ID's are encoded using the bottom 8 bits of a 4-byte integer
31 * to index a vertex in a patch indicated by the 22 bits above (8-29).
32 * For triangle ID's, the top 22 bits (10-31) indicate the patch, and
33 * the bit 9 (0x200) indicates whether the triangle joins patches.
34 * If not, then the bottom 9 bits index into the local PTri array.
35 * If it's a joiner, then the 8th bit indicates whether the triangle joins
36 * two patches, in which case the bottom 8 bits index the PJoin2 array.
37 * Otherwise, the bottom 8 bits index the PJoin1 array.
38 *
39 * These shenanigans minimize vertex reference memory requirements
40 * in compiled mesh structures, where the octree leaves contain sets
41 * of triangle ID's rather than the more usual objects. It seems like
42 * a lot of effort, but it can reduce mesh storage by a factor of 3
43 * or more. This is important, as the whole point is to model very
44 * complicated geometry with this structure, and memory is the main
45 * limitation.
46 */
47
48 /* A triangle mesh patch */
49 typedef struct {
50 uint32 (*xyz)[3]; /* up to 256 patch vertices */
51 int32 *norm; /* vertex normals */
52 uint32 (*uv)[2]; /* vertex local coordinates */
53 struct PTri {
54 BYTE v1, v2, v3; /* local vertices */
55 } *tri; /* local triangles */
56 short solemat; /* sole material */
57 int16 *trimat; /* or local material indices */
58 struct PJoin1 {
59 int32 v1j; /* non-local vertex */
60 int16 mat; /* material index */
61 BYTE v2, v3; /* local vertices */
62 } *j1tri; /* joiner triangles */
63 struct PJoin2 {
64 int32 v1j, v2j; /* non-local vertices */
65 int16 mat; /* material index */
66 BYTE v3; /* local vertex */
67 } *j2tri; /* double joiner triangles */
68 short nverts; /* vertex count */
69 short ntris; /* triangle count */
70 short nj1tris; /* joiner triangle count */
71 short nj2tris; /* double joiner triangle count */
72 } MESHPATCH;
73
74 /* A loaded mesh */
75 typedef struct mesh {
76 char *name; /* mesh file name */
77 int nref; /* reference count */
78 int ldflags; /* what we've loaded */
79 CUBE mcube; /* bounds and octree */
80 RREAL uvlim[2][2]; /* local coordinate extrema */
81 OBJECT mat0; /* base material index */
82 OBJECT nmats; /* number of materials */
83 MESHPATCH *patch; /* mesh patch list */
84 int npatches; /* number of mesh patches */
85 OBJREC *pseudo; /* mesh pseudo objects */
86 LUTAB lut; /* vertex lookup table */
87 struct mesh *next; /* next mesh in list */
88 } MESH;
89
90 /* A mesh instance */
91 typedef struct {
92 FULLXF x; /* forward and backward transforms */
93 MESH *msh; /* mesh object reference */
94 } MESHINST;
95
96 /* vertex flags */
97 #define MT_V 01
98 #define MT_N 02
99 #define MT_UV 04
100 #define MT_ALL 07
101
102 /* A mesh vertex */
103 typedef struct {
104 int fl; /* setting flags */
105 FVECT v; /* vertex location */
106 FVECT n; /* vertex normal */
107 RREAL uv[2]; /* local coordinates */
108 } MESHVERT;
109
110 /* mesh format identifier */
111 #define MESHFMT "Radiance_tmesh"
112 /* magic number for mesh files */
113 #define MESHMAGIC ( 1 *MAXOBJSIZ+311) /* increment first value */
114
115
116 extern MESH *getmesh(char *mname, int flags);
117 extern MESHINST *getmeshinst(OBJREC *o, int flags);
118 extern int getmeshtrivid(int32 tvid[3], OBJECT *mo,
119 MESH *mp, OBJECT ti);
120 extern int getmeshvert(MESHVERT *vp, MESH *mp, int32 vid, int what);
121 extern int getmeshtri(MESHVERT tv[3], OBJECT *mo,
122 MESH *mp, OBJECT ti, int what);
123 extern OBJREC *getmeshpseudo(MESH *mp, OBJECT mo);
124 extern int32 addmeshvert(MESH *mp, MESHVERT *vp);
125 extern OBJECT addmeshtri(MESH *mp, MESHVERT tv[3], OBJECT mo);
126 extern char *checkmesh(MESH *mp);
127 extern void printmeshstats(MESH *ms, FILE *fp);
128 extern void freemesh(MESH *ms);
129 extern void freemeshinst(OBJREC *o);
130 extern void readmesh(MESH *mp, char *path, int flags);
131 extern void writemesh(MESH *mp, FILE *fp);
132
133
134 #ifdef __cplusplus
135 }
136 #endif
137 #endif /* _RAD_MESH_H_ */
138