1 | #ifndef NAUTILUS_ADJPRIMS_INCLUDED // -*- C++ -*-
|
---|
2 | #define NAUTILUS_ADJPRIMS_INCLUDED
|
---|
3 |
|
---|
4 | /************************************************************************
|
---|
5 |
|
---|
6 | Primitive entities for adjacency models (AdjModel).
|
---|
7 | $Id: AdjPrims.h,v 1.4 1997/03/18 18:39:34 garland Exp $
|
---|
8 |
|
---|
9 | Adapted from:
|
---|
10 | mlab: (Id: primitives.h,v 1.7 1997/02/06 16:30:14 garland Exp)
|
---|
11 | via
|
---|
12 | simplif: (Id: primitives.h,v 1.3 1997/02/18 21:11:29 garland Exp)
|
---|
13 |
|
---|
14 | ************************************************************************/
|
---|
15 |
|
---|
16 | //#include "Nautilus.h"
|
---|
17 | #include "NPrim.h"
|
---|
18 | #include <gfx/tools/Buffer.h>
|
---|
19 | #include <gfx/math/Vec3.h>
|
---|
20 | #include <gfx/math/Vec2.h>
|
---|
21 | #include <gfx/geom/3D.h>
|
---|
22 |
|
---|
23 | namespace simplif
|
---|
24 | {
|
---|
25 | class Vertex;
|
---|
26 | class Edge;
|
---|
27 | class Face;
|
---|
28 |
|
---|
29 | typedef buffer<Vertex *> vert_buffer;
|
---|
30 | typedef buffer<Edge *> edge_buffer;
|
---|
31 | typedef buffer<Face *> face_buffer;
|
---|
32 | typedef buffer<Vec3> vec3_buffer;
|
---|
33 | typedef buffer<Vec2> vec2_buffer;
|
---|
34 |
|
---|
35 | extern void untagFaceLoop(Vertex *v);
|
---|
36 | extern void collectFaceLoop(Vertex *v, face_buffer& faces);
|
---|
37 |
|
---|
38 | #define EDGE_BOGUS 0
|
---|
39 | #define EDGE_BORDER 1
|
---|
40 | #define EDGE_MANIFOLD 2
|
---|
41 | #define EDGE_NONMANIFOLD 3
|
---|
42 | extern int classifyEdge(Edge *);
|
---|
43 |
|
---|
44 | #define VERTEX_INTERIOR 0
|
---|
45 | #define VERTEX_BORDER 1
|
---|
46 | #define VERTEX_BORDER_ONLY 2
|
---|
47 | extern int classifyVertex(Vertex *);
|
---|
48 |
|
---|
49 | ////////////////////////////////////////////////////////////////////////
|
---|
50 | //
|
---|
51 | // The actual class definitions
|
---|
52 | //
|
---|
53 | ////////////////////////////////////////////////////////////////////////
|
---|
54 |
|
---|
55 | class VProp
|
---|
56 | {
|
---|
57 | public:
|
---|
58 | Vec3 color;
|
---|
59 | };
|
---|
60 |
|
---|
61 | class FProp
|
---|
62 | {
|
---|
63 | public:
|
---|
64 | Vec3 color;
|
---|
65 | };
|
---|
66 |
|
---|
67 | class Vertex : public Vec3, public NTaggedPrim
|
---|
68 | {
|
---|
69 | edge_buffer edge_uses;
|
---|
70 |
|
---|
71 | public:
|
---|
72 | #ifdef SUPPORT_VCOLOR
|
---|
73 | VProp *props;
|
---|
74 | #endif
|
---|
75 |
|
---|
76 | Vertex(real x, real y, real z) : Vec3(x, y, z), edge_uses(6) {
|
---|
77 | #ifdef SUPPORT_VCOLOR
|
---|
78 | props = NULL;
|
---|
79 | #endif
|
---|
80 | }
|
---|
81 | //
|
---|
82 | // Standard methods for all objects
|
---|
83 | //
|
---|
84 | void kill();
|
---|
85 | edge_buffer& edgeUses() { return edge_uses; }
|
---|
86 |
|
---|
87 | //
|
---|
88 | // Basic primitives for manipulating model topology
|
---|
89 | //
|
---|
90 | void linkEdge(Edge *);
|
---|
91 | void unlinkEdge(Edge *);
|
---|
92 | void remapTo(Vertex *v);
|
---|
93 |
|
---|
94 | // SUS
|
---|
95 | int vID;
|
---|
96 | };
|
---|
97 |
|
---|
98 | class Edge : public NPrim
|
---|
99 | {
|
---|
100 | private:
|
---|
101 |
|
---|
102 | Vertex *v1;
|
---|
103 |
|
---|
104 | face_buffer *face_uses;
|
---|
105 | Edge *twin;
|
---|
106 |
|
---|
107 | Edge(Edge *twin, Vertex *org); // the twin constructor
|
---|
108 |
|
---|
109 | public:
|
---|
110 |
|
---|
111 | Edge(Vertex *, Vertex *);
|
---|
112 | ~Edge();
|
---|
113 |
|
---|
114 | //
|
---|
115 | // Fundamental Edge accessors
|
---|
116 | //
|
---|
117 | Vertex *org() { return v1; }
|
---|
118 | Vertex *dest() { return twin->v1; }
|
---|
119 | Edge *sym() { return twin; }
|
---|
120 |
|
---|
121 | //
|
---|
122 | // Standard methods for all objects
|
---|
123 | //
|
---|
124 | void kill();
|
---|
125 | face_buffer& faceUses() { return *face_uses; }
|
---|
126 |
|
---|
127 | //
|
---|
128 | // Basic primitives for manipulating model topology
|
---|
129 | //
|
---|
130 | void linkFace(Face *);
|
---|
131 | void unlinkFace(Face *);
|
---|
132 | void remapEndpoint(Vertex *from, Vertex *to);
|
---|
133 | void remapTo(Edge *);
|
---|
134 | };
|
---|
135 |
|
---|
136 | class Face : public Face3, public NTaggedPrim
|
---|
137 | {
|
---|
138 | Edge *edges[3];
|
---|
139 |
|
---|
140 | public:
|
---|
141 | #ifdef SUPPORT_FCOLOR
|
---|
142 | FProp *props;
|
---|
143 | #endif
|
---|
144 |
|
---|
145 | Face(Edge *, Edge *, Edge *);
|
---|
146 |
|
---|
147 | //
|
---|
148 | // Basic Face accessors
|
---|
149 | //
|
---|
150 | const Vec3& vertexPos(int i) const{return *edges[i]->org();}
|
---|
151 |
|
---|
152 | void vertexPos(int, const Vec3&)
|
---|
153 | {
|
---|
154 | fatal_error("Face: can't directly set vertex position.");
|
---|
155 | }
|
---|
156 |
|
---|
157 | Vertex *vertex(int i){return edges[i]->org();}
|
---|
158 | const Vertex *vertex(int i) const{return edges[i]->org();}
|
---|
159 | Edge *edge(int i){return edges[i];}
|
---|
160 |
|
---|
161 | //
|
---|
162 | // Standard methods for all objects
|
---|
163 | //
|
---|
164 | void kill();
|
---|
165 |
|
---|
166 | void remapEdge(Edge *from, Edge *to);
|
---|
167 |
|
---|
168 | int igeo; // SUS
|
---|
169 | Vec3 vertex_normals[3]; // SUS
|
---|
170 | Vec2 vertex_texts[3]; //Carlos
|
---|
171 | int normals[3];
|
---|
172 | int texcoords[3];
|
---|
173 | };
|
---|
174 | }
|
---|
175 |
|
---|
176 | // NAUTILUS_ADJPRIMS_INCLUDED
|
---|
177 | #endif
|
---|
178 |
|
---|