ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/common/mesh.h
(Generate patch)

Comparing ray/src/common/mesh.h (file contents):
Revision 2.1 by greg, Tue Mar 11 17:08:55 2003 UTC vs.
Revision 2.15 by greg, Tue Nov 6 01:04:23 2012 UTC

# Line 4 | Line 4
4   *
5   *  Include after standard.h, object.h and octree.h
6   */
7 + #ifndef _RAD_MESH_H_
8 + #define _RAD_MESH_H_
9  
10 < #include "copyright.h"
10 > #include "lookup.h"
11  
12 < #ifndef uint4
13 < #define uint4   unsigned int4
12 > #ifdef __cplusplus
13 > extern "C" {
14   #endif
15 < #ifndef BYTE
16 < #define BYTE    unsigned char
15 >
16 > #ifndef uby8
17 > #define uby8    unsigned char
18   #endif
19  
20   /*
# Line 26 | Line 29
29   * never generates 0, so we can use this for unspecified normals.
30   *
31   * Vertex ID's are encoded using the bottom 8 bits of a 4-byte integer
32 < * to index a vertex in a patch indicated by the 20 bits above (9-29).
33 < * For triangle ID's, the top 10 bits (11-31) indicate the patch, and
34 < * the 10th bit indicates whether the triangle joins patches.
32 > * to index a vertex in a patch indicated by the 22 bits above (8-29).
33 > * For triangle ID's, the top 22 bits (10-31) indicate the parent patch,
34 > * and the 10th bit (0x200) indicates whether the triangle joins patches.
35   * If not, then the bottom 9 bits index into the local PTri array.
36   * If it's a joiner, then the 9th bit indicates whether the triangle joins
37   * two patches, in which case the bottom 8 bits index the PJoin2 array.
# Line 40 | Line 43
43   * a lot of effort, but it can reduce mesh storage by a factor of 3
44   * or more.  This is important, as the whole point is to model very
45   * complicated geometry with this structure, and memory is the main
46 < * limitation.  (We also optimize intersection tests for triangles.)
46 > * limitation.  (This representation is so efficient, that the octree
47 > * structure ends up dominating memory for most compiled meshes.)
48   */
49  
50   /* A triangle mesh patch */
51   typedef struct {
52 <        uint4           (*xyz)[3];      /* up to 256 patch vertices */
53 <        int4            *norm;          /* vertex normals */
54 <        uint4           (*uv)[2];       /* vertex local coordinates */
52 >        uint32          (*xyz)[3];      /* up to 256 patch vertices */
53 >        int32           *norm;          /* vertex normals */
54 >        uint32          (*uv)[2];       /* vertex local coordinates */
55          struct PTri {
56 <                BYTE            v1, v2, v3;     /* local vertices */
56 >                uby8            v1, v2, v3;     /* local vertices */
57          }               *tri;           /* local triangles */
58 +        short           solemat;        /* sole material */
59 +        int16           *trimat;        /* or local material indices */
60          struct PJoin1 {
61 <                int4            v1j;            /* non-local vertex */
62 <                BYTE            v2, v3;         /* local vertices */
61 >                int32           v1j;            /* non-local vertex */
62 >                int16           mat;            /* material index */
63 >                uby8            v2, v3;         /* local vertices */
64          }               *j1tri;         /* joiner triangles */
65          struct PJoin2 {
66 <                int4            v1j, v2j;       /* non-local vertices */
67 <                BYTE            v3;             /* local vertex */
66 >                int32           v1j, v2j;       /* non-local vertices */
67 >                int16           mat;            /* material index */
68 >                uby8            v3;             /* local vertex */
69          }               *j2tri;         /* double joiner triangles */
70          short           nverts;         /* vertex count */
71 <        short           ntris;          /* triangle count */
71 >        short           ntris;          /* local triangle count */
72          short           nj1tris;        /* joiner triangle count */
73          short           nj2tris;        /* double joiner triangle count */
74   } MESHPATCH;
# Line 71 | Line 79 | typedef struct mesh {
79          int             nref;           /* reference count */
80          int             ldflags;        /* what we've loaded */
81          CUBE            mcube;          /* bounds and octree */
82 <        FLOAT           uvlim[2][2];    /* local coordinate extrema */
83 <        MESHPATCH       *patch;         /* mesh patch list */
82 >        RREAL           uvlim[2][2];    /* local coordinate extrema */
83 >        OBJECT          mat0;           /* base material index */
84 >        OBJECT          nmats;          /* number of materials */
85 >        MESHPATCH       *patch;         /* allocated mesh patch array */
86          int             npatches;       /* number of mesh patches */
87 <        char            *cdata;         /* opaque client data pointer */
87 >        OBJREC          *pseudo;        /* mesh pseudo objects */
88 >        LUTAB           lut;            /* vertex lookup table */
89          struct mesh     *next;          /* next mesh in list */
90   } MESH;
91  
# Line 95 | Line 106 | typedef struct {
106          int             fl;             /* setting flags */
107          FVECT           v;              /* vertex location */
108          FVECT           n;              /* vertex normal */
109 <        FLOAT           uv[2];          /* local coordinates */
109 >        RREAL           uv[2];          /* local coordinates */
110   } MESHVERT;
111  
112                                  /* mesh format identifier */
113   #define MESHFMT         "Radiance_tmesh"
114                                  /* magic number for mesh files */
115 < #define MESHMAGIC       ( 0 *MAXOBJSIZ+311)     /* increment first value */
115 > #define MESHMAGIC       ( 1 *MAXOBJSIZ+311)     /* increment first value */
116  
106 #ifdef NOPROTO
117  
108 extern MESH     *getmesh();
109 extern INSTANCE *getmeshinst();
110 extern int      getmeshtrivid();
111 extern int      getmeshvert();
112 extern int      getmeshtri();
113 extern int4     addmeshvert();
114 extern OBJECT   addmeshtri();
115 extern void     printmeshstats();
116 extern void     freemesh();
117 extern void     freemeshinst();
118 extern void     readmesh();
119 extern void     writemesh();
120
121 #else
122
118   extern MESH     *getmesh(char *mname, int flags);
119   extern MESHINST *getmeshinst(OBJREC *o, int flags);
120 < extern int      getmeshtrivid(int4 tvid[3], MESH *mp, OBJECT ti);
121 < extern int      getmeshvert(MESHVERT *vp, MESH *mp, int4 vid, int what);
122 < extern int      getmeshtri(MESHVERT tv[3], MESH *mp, OBJECT ti, int what);
123 < extern int4     addmeshvert(MESH *mp, MESHVERT *vp);
124 < extern OBJECT   addmeshtri(MESH *mp, MESHVERT tv[3]);
120 > extern int      nextmeshtri(OBJECT *tip, MESH *mp);
121 > extern int      getmeshtrivid(int32 tvid[3], OBJECT *mo,
122 >                                MESH *mp, OBJECT ti);
123 > extern int      getmeshvert(MESHVERT *vp, MESH *mp, int32 vid, int what);
124 > extern int      getmeshtri(MESHVERT tv[3], OBJECT *mo,
125 >                                MESH *mp, OBJECT ti, int what);
126 > extern OBJREC   *getmeshpseudo(MESH *mp, OBJECT mo);
127 > extern int32    addmeshvert(MESH *mp, MESHVERT *vp);
128 > extern OBJECT   addmeshtri(MESH *mp, MESHVERT tv[3], OBJECT mo);
129 > extern char     *checkmesh(MESH *mp);
130   extern void     printmeshstats(MESH *ms, FILE *fp);
131   extern void     freemesh(MESH *ms);
132   extern void     freemeshinst(OBJREC *o);
133   extern void     readmesh(MESH *mp, char *path, int flags);
134   extern void     writemesh(MESH *mp, FILE *fp);
135  
136 < #endif /* NOPROTO */
136 >
137 > #ifdef __cplusplus
138 > }
139 > #endif
140 > #endif /* _RAD_MESH_H_ */

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines